Телесистемы
 Разработка, производство и продажа радиоэлектронной аппаратуры
На главную   | Карта сайта | Пишите нам | В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс.
e-mail:jobsmp@pochta.ru

Телесистемы | Электроника | Конференция «Микроконтроллеры и их применение»

Текс программы (функции для работы с АЦП)

Отправлено Леонтий 26 августа 2008 г. 21:45
В ответ на: Телепаты в отпуске, так что приводи текст программы в виде [pre] текст [/pre] отправлено MBedder 26 августа 2008 г. 19:51

//ICC-AVR application builder : 18.07.2008
// Target : M640 Crystal: 14.7456Mhz

#include <iom640v.h>
#include <macros.h>

void SpiInit(void);
void SpiWriteByte(unsigned char);
unsigned char SpiReadByte(void);
signed long uzmerenie3(void);
void Init_ADC(void);

//SPI initialize clock rate: 1843198hz
void SpiInit(void)
{
PORTF|=BIT(0); // CS1 установить в 1
PORTF|=BIT(1); // CS2 установить в 1
PORTF|=BIT(2); // CS3 установить в 1
DDRB|=0x07; //Установка SCK=1, MOSI=1, MISO=0, SS=1
PORTB&=~BIT(2); // очистка MOSI
PORTB&=~BIT(1); //очистка SCK
SPCR = 0x51; //установка SPI в режиме ведущий и задание скорости
SPSR = 0x01; //setup SPI
SPCR|=BIT(6);
}

//Функция записи байта в SPI порт
void SpiWriteByte(unsigned char byte)
{
PORTB&=~BIT(2); // очистка MOSI
PORTB&=~BIT(1); //очистка SCK
SPCR|=BIT(6);
SPDR = byte;
while (!(SPSR&0x80)); // ожидание готовности порта, прежде чем считывать
byte = SPDR;
SPCR&=~BIT(6);
}
//Функция чтения байта с SPI порта
unsigned char SpiReadByte(void)
{
unsigned char tmp=0;
PORTB&=~BIT(2); // очистка MOSI
PORTB&=~BIT(1); //очистка SCK
SPCR|=BIT(6);
SPDR = 0x00;
while (!(SPSR&0x80)); // ожидание готовности порта, прежде чем считывать
tmp=SPDR;
SPCR&=~BIT(6);
return tmp;
}

// Функция получения данных от 3-го АЦП
signed long uzmerenie3(void)
{
unsigned char buf;
unsigned int j;
unsigned char store[3];
unsigned int reg;
unsigned long A, B, C;
signed long rez;
double U;
//Чтение регистра ADC Status
PORTF&=~BIT(2); // CS3 установить в 0 - выбор 3 АЦП
SpiWriteByte(0x04+0x40);
reg=SpiReadByte();
PORTF|=BIT(2); // CS3 установить в 1
// Выбор канала готовых данных (аппаратно RDY дает сигнал только о готовности данных,без указания канала
switch (reg)
{
case 0x01:
{
// Установка чтение 0 канала данных
//Устанавливаем регистр для чтения - выходные данные 24 бит - 3 байта
PORTF&=~BIT(2); // CS3 установить в 0 - выбор 3 АЦП
SpiWriteByte(0x08+0x40);
PORTF|=BIT(2); // CS3 установить в 1
buf=0x01;
}
break;
case 0x04:
{
// Установка чтение 1 канала данных
//Устанавливаем регистр для чтения - выходные данные 24 бит - 3 байта
PORTF&=~BIT(2); // CS3 установить в 0 - выбор 3 АЦП
SpiWriteByte(0x0A+0x40);
PORTF|=BIT(2); // CS3 установить в 1
buf=0x04;
}
break;
default: { return (0x00);}
}
//Чтение данных из регистра АЦП
// Читаем и заносим в буфер
for (j=0; j<3; j++)
{
PORTB&=~BIT(2); // очистка MOSI
PORTB&=~BIT(1); //очистка SCK
PORTF&=~BIT(2); // CS3 установить в 0 - выбор 3 АЦП
SPCR|=BIT(6);
SPDR = 0x00;
while (!(SPSR&0x80)); // ожидание готовности порта, прежде чем считывать
store[j]=SPDR; //считать SPDR в массив хранения
SPCR&=~BIT(6);
PORTF|=BIT(2); // CS3 установить в 1
}
//Отправляем на монитор RS232 - для тестирования
rs232_byte(buf);
rs232_byte(store[0]);
rs232_byte(store[1]);
rs232_byte(store[2]);
// Делаем преобразования полученных данных в напряжение микровольтах
A=store[0];
B=store[1];
C=store[2];
// Получаем длиное целое из полученных байт
// с учетом что первым идет старший байт
rez=(C+(B<<8)+(A<<16));
// Далее преобразуем с типу double и Преобразуем к напряжению
U=(((double)(rez))*20)/0xFFFFFF; // Получаем напряжение от 0 до 20 В
// Отнимаем 10 В - для сдига в биполярный сигнал - получаем изменение напряжения от -10 до 10В
U=U-10;
// Преобразуем в микровольты и возращаем результат
rez=(signed long)(U*1000000);
return (rez);
}


// Функция инициализации АЦП
void Init_ADC(void)
{
//Запись команд в АЦП
//Общий сброс АЦП
PORTF&=~BIT(2); // CS3 установить в 0 - выбор 3 АЦП
SpiWriteByte(0x00);
SpiWriteByte(0xFF);
SpiWriteByte(0xFF);
SpiWriteByte(0xFF);
SpiWriteByte(0xFF);
// Записываем в регистры управления АЦП
// Установка режима синхронной работы через вывод SYNC
SpiWriteByte(0x01);// Установка регистра I/O Port=0b00110000
SpiWriteByte(0x30);
// Установка регистра - время преобразования FW=125=0x7D - 200 Гц
SpiWriteByte(0x30);// Установка регистра для 1 канала
SpiWriteByte(0x80+0x7D);
SpiWriteByte(0x32);// Установка регистра для 2 канала
SpiWriteByte(0x80+0x7D);
// Установка режима работы -+10В и разрешение работы АЦП
SpiWriteByte(0x28);// Установка регистра для 1 канала
SpiWriteByte(0x08);
SpiWriteByte(0x2A);// Установка регистра для 2 канала
SpiWriteByte(0x08);
//Установка режима работы - непрерывный, самостоятельный, попеременный - Mode=0b00100010
SpiWriteByte(0x38);// Установка регистра для 1 канала
SpiWriteByte(0x22);
PORTF|=BIT(2); // CS3 установить в 1
//Закрытия выбора 3-х АЦП
}


Составить ответ | Вернуться на конференцию

Ответы


Отправка ответа
Имя*: 
Пароль: 
E-mail: 
Тема*:

Сообщение:

Ссылка на URL: 
URL изображения: 

если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
к трём прибавьте 5:

Перейти к списку ответов | Конференция | Раздел "Электроника" | Главная страница | Карта сайта

Rambler's Top100 Рейтинг@Mail.ru
 
Web telesys.ru