udineze 0 May 19, 2012 Posted May 19, 2012 (edited) · Report post впервые встречаюсь с ацп, с английским тоже не гуд, задали разобраться... интересует обмен данными с МК как я понял в общем случае (судя по алгоритму в даташите на стр 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 May 19, 2012 by 7tudent Quote Share this post Link to post Share on other sites More sharing options...
Семин 0 May 19, 2012 Posted May 19, 2012 · Report post CS - Чип Селект. 0 - активирует МС. DRDY - Низкий уровень (0) говорит что очередная порция данных готова для скачивания, можешь забирать. Пунктиром обозначен путь к альтернативной ветке, зависит от того что считываешь, адреса там указаны. До пунктира действия одинаковы в обоих случаях, потом отличаются. Quote Share this post Link to post Share on other sites More sharing options...
udineze 0 May 19, 2012 Posted May 19, 2012 · Report post CS - Чип Селект. 0 - активирует МС. DRDY - Низкий уровень (0) говорит что очередная порция данных готова для скачивания, можешь забирать. Пунктиром обозначен путь к альтернативной ветке, зависит от того что считываешь, адреса там указаны. До пунктира действия одинаковы в обоих случаях, потом отличаются. СS все время работы 0 ? а как же коды на DIN разделяются ? Quote Share this post Link to post Share on other sites More sharing options...
KykyryzzZ 0 May 19, 2012 Posted May 19, 2012 · Report post В кратце алгоритм работы таков: Настраиваешь на контроллере интерфейс 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. Если в контроллере этот интерфейс аппаратно реализован, все происходит автоматически. Если нет, то придется писать его ручками. Вот тогда и будешь думать - как байты разделять Quote Share this post Link to post Share on other sites More sharing options...
udineze 0 May 20, 2012 Posted May 20, 2012 · Report post В кратце алгоритм работы таков: Настраиваешь на контроллере интерфейс 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 , там же настройки регистров собьются ? Quote Share this post Link to post Share on other sites More sharing options...
KykyryzzZ 0 May 20, 2012 Posted May 20, 2012 · Report post дело в том что преподаватель которому надо эту лабу сдавать будет преподавать у нас интерфейсы, поэтому разделение байтов важный вопрос еще не совсем понял зачем посылать 2 нулевых байта на DIN , там же настройки регистров собьются ? Контроллер АЦП сам переключает регистры в зависимости от присланной команды. Пересылка двух нулевых байт нужна для генерации тактового сигнала по которому АЦП обратно передает данные. Вообще чтобы разобраться с этим АЦП, следует сначала разобраться с SPI интерфейсом, а уж по нему в интернете полно материала и примеров реализации для разных контроллеров. Quote Share this post Link to post Share on other sites More sharing options...
udineze 0 May 20, 2012 Posted May 20, 2012 · Report post Контроллер АЦП сам переключает регистры в зависимости от присланной команды. Пересылка двух нулевых байт нужна для генерации тактового сигнала по которому АЦП обратно передает данные. Вообще чтобы разобраться с этим АЦП, следует сначала разобраться с SPI интерфейсом, а уж по нему в интернете полно материала и примеров реализации для разных контроллеров. понял, большое спасибо Quote Share this post Link to post Share on other sites More sharing options...
slavokhire5 0 December 20, 2015 Posted December 20, 2015 · Report post Привет всем. Апну тему по 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; Возможно кто=то даст хороший совет по калибровке или исправит ошибки в моем коде? :) Quote Share this post Link to post Share on other sites More sharing options...