Jump to content
    

работа с АЦП 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

Edited by 7tudent

Share this post


Link to post
Share on other sites

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

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

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

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

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

Share this post


Link to post
Share on other sites

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

Настраиваешь на контроллере интерфейс 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. Если в контроллере этот интерфейс аппаратно реализован, все происходит автоматически. Если нет, то придется писать его ручками. Вот тогда и будешь думать - как байты разделять

Share this post


Link to post
Share on other sites

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

Настраиваешь на контроллере интерфейс 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 , там же настройки регистров собьются ?

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

Привет всем. Апну тему по 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;

 

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...