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

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

Кто работал с АЦП AD7732 -непрерывный режим оцифровки данных?

Отправлено Леонтий 25 августа 2008 г. 14:10


При применении АЦП фирмы Analog Device AD7732 возникли проблемы. В соответствии с даташитом на АЦП – у нее есть режим непрерывного преобразования входных сигналов по обоим каналам (по очередно) – т.е. мы должны получить в соответствии с рис. 24 на стр. 32 даташита возможность непрерывной оцифровки сигнала по обоим каналам, чем мы и воспользовались при проектировании нашего прибора (схема прилагается) - в котором мы измерительный сигнал после фильтра 6 порядка подаем (после преобразования биполярного в дифференциальный и каскада повторителей) на оба входа АЦП. Также в соответствии с руководством на АЦП написаны алгоритмы на языке «С» для микроконтроллера ATmega640: функция инициализации АЦП и задания параметров, функция приема данных от АЦП, применяется стандартный порт SPI микроконтроллеров.
Сами функции: (привожу только для одного АЦП)

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

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

Проблема заключается в следующем: в соответствии с описание значение битов RDY0 и RDY1 должны по переменного изменятся т.е. ADC Status=0b00000001=0x01 или 0b00000100=0x04 – на основе которых мы определяем в котором канале готовы данные, на практике имеем что регистр ADC Status=0b00000101=0x05, при итом по физической линии RDY - видем изменение ее состояния (заведена на вход внешнего прерывания микроконтролера). При попытке считывания с регистра данных - результат всегда равен 16777215=0xFFFFFF при любом значении входного напряжения.

(Запись и считывание регистров проходит правильно, провожу значения регистров, которые получаются после инициализации АЦП:
I/O Port = 0x71= 0b01110001
ADC Status = 0x05=0b00000101
Channel Status (1 канал – адрес 0x20) – 0x08=0b00001000
Channel Status (2 канал – адрес 0x22) – 0x48=0b01001000
Channel Setup (1 канал – адрес 0x28) – 0x08=0b00001000
Channel Setup (2 канал – адрес 0x2A) – 0x08=0b00001000
Channel Conversion Time (1 канал – адрес 0x30) – 0xFD=0b11111101
Channel Conversion Time (2 канал – адрес 0x32) – 0xFD=0b11111101
Mode (1 канал в соответствии со сноской 2 –адрес 0x38) - 0x22=0b00100010

В чем может быть ошибка? Что можете посоветовать?


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

Ответы


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

Сообщение:

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

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

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

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