udineze 0 19 мая, 2012 Опубликовано 19 мая, 2012 (изменено) · Жалоба впервые встречаюсь с ацп, с английским тоже не гуд, задали разобраться... интересует обмен данными с МК как я понял в общем случае (судя по алгоритму в даташите на стр 25) процесс идет так: CS переходит из единицы в ноль, на ножку DIN подается сигнал 20h (00100000), далее CS в 1 задержка, CS в 0, на DIN подается 0Сh (00001100), дальше также 10h и 40h, далее DRDY переходит в 0 и судя по алгоритму сначала надо подать на DIN 38h , а потом идет чтение 16 бит данных с DOUT, но временные диаграммы говорят о том что чтение начинается по спаду DRDY - первый непонятный момент второй непонятный момент - зачем пунктирная ветка алгоритма уходящая вправо ? AD7705.pdf Изменено 19 мая, 2012 пользователем 7tudent Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Семин 0 19 мая, 2012 Опубликовано 19 мая, 2012 · Жалоба CS - Чип Селект. 0 - активирует МС. DRDY - Низкий уровень (0) говорит что очередная порция данных готова для скачивания, можешь забирать. Пунктиром обозначен путь к альтернативной ветке, зависит от того что считываешь, адреса там указаны. До пунктира действия одинаковы в обоих случаях, потом отличаются. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
udineze 0 19 мая, 2012 Опубликовано 19 мая, 2012 · Жалоба CS - Чип Селект. 0 - активирует МС. DRDY - Низкий уровень (0) говорит что очередная порция данных готова для скачивания, можешь забирать. Пунктиром обозначен путь к альтернативной ветке, зависит от того что считываешь, адреса там указаны. До пунктира действия одинаковы в обоих случаях, потом отличаются. СS все время работы 0 ? а как же коды на DIN разделяются ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KykyryzzZ 0 19 мая, 2012 Опубликовано 19 мая, 2012 · Жалоба В кратце алгоритм работы таков: Настраиваешь на контроллере интерфейс 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. Если в контроллере этот интерфейс аппаратно реализован, все происходит автоматически. Если нет, то придется писать его ручками. Вот тогда и будешь думать - как байты разделять Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
udineze 0 20 мая, 2012 Опубликовано 20 мая, 2012 · Жалоба В кратце алгоритм работы таков: Настраиваешь на контроллере интерфейс 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 , там же настройки регистров собьются ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KykyryzzZ 0 20 мая, 2012 Опубликовано 20 мая, 2012 · Жалоба дело в том что преподаватель которому надо эту лабу сдавать будет преподавать у нас интерфейсы, поэтому разделение байтов важный вопрос еще не совсем понял зачем посылать 2 нулевых байта на DIN , там же настройки регистров собьются ? Контроллер АЦП сам переключает регистры в зависимости от присланной команды. Пересылка двух нулевых байт нужна для генерации тактового сигнала по которому АЦП обратно передает данные. Вообще чтобы разобраться с этим АЦП, следует сначала разобраться с SPI интерфейсом, а уж по нему в интернете полно материала и примеров реализации для разных контроллеров. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
udineze 0 20 мая, 2012 Опубликовано 20 мая, 2012 · Жалоба Контроллер АЦП сам переключает регистры в зависимости от присланной команды. Пересылка двух нулевых байт нужна для генерации тактового сигнала по которому АЦП обратно передает данные. Вообще чтобы разобраться с этим АЦП, следует сначала разобраться с SPI интерфейсом, а уж по нему в интернете полно материала и примеров реализации для разных контроллеров. понял, большое спасибо Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
slavokhire5 0 20 декабря, 2015 Опубликовано 20 декабря, 2015 · Жалоба Привет всем. Апну тему по 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; Возможно кто=то даст хороший совет по калибровке или исправит ошибки в моем коде? :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться