Перейти к содержанию
    

работа с АЦП AD7705

впервые встречаюсь с ацп, с английским тоже не гуд, задали разобраться...

интересует обмен данными с МК

как я понял в общем случае (судя по алгоритму в даташите на стр 25) процесс идет так: CS переходит из единицы в ноль, на ножку DIN подается сигнал 20h (00100000), далее CS в 1 задержка, CS в 0, на DIN подается 0Сh (00001100), дальше также 10h и 40h, далее DRDY переходит в 0 и судя по алгоритму сначала надо подать на DIN 38h , а потом идет чтение 16 бит данных с DOUT, но временные диаграммы говорят о том что чтение начинается по спаду DRDY - первый непонятный момент

второй непонятный момент - зачем пунктирная ветка алгоритма уходящая вправо ?

AD7705.pdf

Изменено пользователем 7tudent

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

CS - Чип Селект. 0 - активирует МС. DRDY - Низкий уровень (0) говорит

что очередная порция данных готова для скачивания, можешь забирать.

Пунктиром обозначен путь к альтернативной ветке, зависит от того что

считываешь, адреса там указаны. До пунктира действия одинаковы

в обоих случаях, потом отличаются.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

CS - Чип Селект. 0 - активирует МС. DRDY - Низкий уровень (0) говорит

что очередная порция данных готова для скачивания, можешь забирать.

Пунктиром обозначен путь к альтернативной ветке, зависит от того что

считываешь, адреса там указаны. До пунктира действия одинаковы

в обоих случаях, потом отличаются.

СS все время работы 0 ? а как же коды на DIN разделяются ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В кратце алгоритм работы таков:

Настраиваешь на контроллере интерфейс SPI.

Выставляешь сигнал CS в 0.

Отправляешь по SPI четыре байта настройки (настраиваешь регистры по описанию с 10 по 14 стр)

Ждешь пока DRDY не станет 0. Как только DRDY = 0, АЦП настроен. С этого момента DRDY будет меняться то в 1 то в 0. Можешь переводить CS в 1.

Если хочешь считать данные, то слушаешь DRDY.

Как только DRDY = 0, выставляешь сигнал CS в 0.

Отправляешь по SPI байт 0х38. (перед отправкой 0х38 скорее всего придется подобрать задержку).

Затем посылаешь два нулевых байта, чтоб под этот клок АЦП тебе переслал данные.

Данные в регистре SPI.

Выставляешь сигнал CS в 1.

 

 

... как же коды на DIN разделяются ?

Сигналы DIN, DOUT, SCLK - сигналы интерфейса SPI. Если в контроллере этот интерфейс аппаратно реализован, все происходит автоматически. Если нет, то придется писать его ручками. Вот тогда и будешь думать - как байты разделять

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В кратце алгоритм работы таков:

Настраиваешь на контроллере интерфейс SPI.

Выставляешь сигнал CS в 0.

Отправляешь по SPI четыре байта настройки (настраиваешь регистры по описанию с 10 по 14 стр)

Ждешь пока DRDY не станет 0. Как только DRDY = 0, АЦП настроен. С этого момента DRDY будет меняться то в 1 то в 0. Можешь переводить CS в 1.

Если хочешь считать данные, то слушаешь DRDY.

Как только DRDY = 0, выставляешь сигнал CS в 0.

Отправляешь по SPI байт 0х38. (перед отправкой 0х38 скорее всего придется подобрать задержку).

Затем посылаешь два нулевых байта, чтоб под этот клок АЦП тебе переслал данные.

Данные в регистре SPI.

Выставляешь сигнал CS в 1.

 

 

 

Сигналы DIN, DOUT, SCLK - сигналы интерфейса SPI. Если в контроллере этот интерфейс аппаратно реализован, все происходит автоматически. Если нет, то придется писать его ручками. Вот тогда и будешь думать - как байты разделять

дело в том что преподаватель которому надо эту лабу сдавать будет преподавать у нас интерфейсы, поэтому разделение байтов важный вопрос

еще не совсем понял зачем посылать 2 нулевых байта на DIN , там же настройки регистров собьются ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

дело в том что преподаватель которому надо эту лабу сдавать будет преподавать у нас интерфейсы, поэтому разделение байтов важный вопрос

еще не совсем понял зачем посылать 2 нулевых байта на DIN , там же настройки регистров собьются ?

Контроллер АЦП сам переключает регистры в зависимости от присланной команды. Пересылка двух нулевых байт нужна для генерации тактового сигнала по которому АЦП обратно передает данные. Вообще чтобы разобраться с этим АЦП, следует сначала разобраться с SPI интерфейсом, а уж по нему в интернете полно материала и примеров реализации для разных контроллеров.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Контроллер АЦП сам переключает регистры в зависимости от присланной команды. Пересылка двух нулевых байт нужна для генерации тактового сигнала по которому АЦП обратно передает данные. Вообще чтобы разобраться с этим АЦП, следует сначала разобраться с SPI интерфейсом, а уж по нему в интернете полно материала и примеров реализации для разных контроллеров.

понял, большое спасибо

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Привет всем. Апну тему по AD7705

Раньше по старту проводил zero-калибровку (AIN+ и AIN- соединялись на это время полевиком).

Сейчас это решение не подходит. При self калибровке АЦП начинает работать нелинейно. Без калибровки по старту вообще все время выдает нули. Пробовал стартовать с zero-калибровкой, но после этого в Offset register писать результаты "домашней" калибровки. Значение в offset регистре меняется на "домашнее", но АЦП работает так, как будто я в offset ничего не писал. Думаю, я как-то неправильно работаю с АЦП. Частота SPI == 4 МГц. Контроллер - mega88pa. Вот мой код:

 

    void init_SD_ADC(uint8_t channel, uint8_t cal_mode)
{
    PORTB |= (1 << PB6);            // reset в высокий    
    PORTB &= ~0x04;                // CS ADC
    _delay_us(10);
            
    ADC_Write(0x20 | channel);            // Active Channel select, next operation as write to the clock register
    ADC_Write(0x04);                    // master clock enabled, 2.4576MHz Clock, set output rate to 50Hz
    ADC_Write(0x10 | channel);            // Active Channel select, next operation as write to the setup register
    ADC_Write(0x24 | cal_mode << 6);    // gain = 16, unipolar mode, buffer off, clear FSYNC

    _delay_us(10);
    PORTB |= 0x04;
}

// опрос результатов измерения:
PORTB &= ~0x04;
_delay_us(10);
    
ADC_Write(0x38 | SD_ADC_Channel);
        
data =    SPI_ADC_tx(0) << 8;
data +=    SPI_ADC_tx(0);
                
_delay_us(10);
PORTB |= 0x04;

 

Возможно кто=то даст хороший совет по калибровке или исправит ошибки в моем коде? :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...