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

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

(+)

Отправлено zlogic 13 июля 2007 г. 08:00
В ответ на: Помогите советом: АЦП AD7799 и ADUM120xС. Не удаётся запустить преобразование. ID читается, читается регистр состояния, но при попытке запустить, к примеру, калибровку, читаться перестают все регистры... отправлено <font color=gray>AU__</font> 12 июля 2007 г. 22:36

1. После включения АЦП всегда, если работоспособен, выдаёт импульсы на DOUT/RDY. По умолчанию используя установки регистров. Проверьте.
Если идут, то АЦП рабочий.
2. См. мою инициализацию АЦП.

void InitADC(unsigned char inputRange, unsigned char signalType)
{
// Инициализация АЦП

// Сброс последовательного интерфейса
WrADC(0xff);
WrADC(0xff);
WrADC(0xff);
WrADC(0xff);

// Запись в CONFIGURATION REGISTER (0х10)
// WEN - 0
// R/W - 0
// RS2 - 0
// RS1 - 1
// RS0 - 0
// CREAD - 0
// 0 - 0
// 0 - 0

WrADC(0x10);

// Записать в регистр
//
// 0 - 0
// 0 - 0
// BO - 0
// U/B - 0
// 0 - 0
// G2 - 0
// G1 - 0
// G0 - 0
//
// 0 - 0
// 0 - 0
// REF_DET - 0
// BUF - 0
// 0 - 0
// CH2 - 0
// CH1 - 0
// CH0 - 0

WrADC(0x00 | inputRange | signalType);
WrADC(0x00);

// Калибровка канала 0

// Калибровка нуля

// Запись в MODE REGISTER (0х08)
// WEN - 0
// R/W - 0
// RS2 - 0
// RS1 - 0
// RS0 - 1
// CREAD - 0
// 0 - 0
// 0 - 0

WrADC(0x08);

// Записать в регистр
// MD2 - 1
// MD1 - 0
// MD0 - 0
// PSW0 - 0
// 0 - 0
// 0 - 0
// 0 - 0
// 0 - 0
//
// 0 - 0
// 0 - 0
// 0 - 0
// 0 - 0
// FS3 - 1
// FS2 - 1
// FS1 - 1
// FS0 - 1

WrADC(0x80);
WrADC(0x0f);
// Ждать окончания преобразования
while(DOUT) {};

// Калибровка полной шкалы

WrADC(0x08);
WrADC(0xa0);
WrADC(0x0f);
while(DOUT) {};

// Калибровка канала 1

WrADC(0x10);
WrADC(0x00 | inputRange | signalType);
WrADC(0x01);

WrADC(0x08);
WrADC(0x80);
WrADC(0x0f);
while(DOUT) {};

WrADC(0x08);
WrADC(0xa0);
WrADC(0x0f);
while(DOUT) {};

// Калибровка канала 2

WrADC(0x10);
WrADC(0x00 | inputRange | signalType);
WrADC(0x02);

WrADC(0x08);
WrADC(0x80);
WrADC(0x0f);
while(DOUT) {};

WrADC(0x08);
WrADC(0xa0);
WrADC(0x0f);
while(DOUT) {};
}

void WrADC(unsigned char byte)
{
unsigned char data i;

for (i = 0; i < 8; i++)
{
SCLK = 0;
// Сдвинуть байт
byte <<= 1;
// Поместить бит данных в DIN
DIN = CY;
// Сформировать фронт записи на SCLK
SCLK = 1;
}
DIN = 1;
}

unsigned char RdADC(void)
{
unsigned char data byte, i;

for (i = 0; i < 8; i++)
{
// Выдать низкий уровень на SCLK перед чтением бита данных
SCLK = 0;
// Сдвинуть байт и подготовить его младший бит для приема бита данных АЦП
byte <<= 1;
// Поместить бит данных АЦП в младший бит байта
byte |= DOUT;
SCLK = 1;
}
DOUT = 1;
return byte;
}

Работа с АЦП собственно:

// Выбрать канал 1
WrADC(0x10);
WrADC(0x00 | inputRange | signalType);
WrADC(0x01);

// Сделать единичное преобразование
WrADC(0x08);
WrADC(0x20);
WrADC(updateRate);
// Ожидать конца преобразования
while(DOUT) {};

// Прочитать регистр данных
// WEN - 0
// R/W - 1
// RS2 - 0
// RS1 - 1
// RS0 - 1
// CREAD - 0
// 0 - 0
// 0 - 0

WrADC(0x58);

// Прочитать три байта результата
b0 = RdADC();
b1 = RdADC();
b2 = RdADC();



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

Ответы


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

Сообщение:

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

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

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

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