Михалыч 0 23 февраля, 2005 Опубликовано 23 февраля, 2005 · Жалоба Ребята, помогите "чайнику" разобраться со встроенным в этот девайс АЦП. Используются три аналоговых входа, нужно определять три основных значения на каждом - 0 В; 5 В; 2,5 В. Кто имел дело с этим, объясните пожалуйста, на пальцах программную реализацию. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
etoja 0 24 февраля, 2005 Опубликовано 24 февраля, 2005 · Жалоба Лень почитать дата шит? Там всё понятно написано. Единственное - не забыть задать направление ножек на ввод и указать, что эти ножки будут принадлежать АЦП. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Михалыч 0 24 февраля, 2005 Опубликовано 24 февраля, 2005 · Жалоба Etoja, пасиба за столь подробное объяснение ;) Кстати, какое максимальное напряжение можно подавать на вход АЦП? Сколько % от питания? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sK0T 0 24 февраля, 2005 Опубликовано 24 февраля, 2005 · Жалоба Etoja, пасиба за столь подробное объяснение ;) Кстати, какое максимальное напряжение можно подавать на вход АЦП? Сколько % от питания? <{POST_SNAPBACK}> Да нет, серьёзно, там доходчиво написано! % от питания при наличии делителя напряжения на нужный диапазон — сколько влезет! Я при помощи единственного резистора на 2 МОм например детектор нуля в 220 вольт сети делал. :) Никаких подводных камней. Делаешь по даташиту, всё работает. Ну или задавай более подробные вопросы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
angir 0 24 февраля, 2005 Опубликовано 24 февраля, 2005 · Жалоба Вообще-то все есть в примере, что идет с документацией. К тому-же без документации вы не сможете задать матрицу аналоговых входов, да и вообще сконфигурировать блок АЦП. Принцип такой: нужно настроить соответствующие входы, как аналоговые, выбрать референс - в вашем случае, можно выбрать внутренний референс от питания проца. Далее, в зависимости от ваших потребностей сконфигурировать модуль ацп, такие параметры, как например ложить данные, с выравниванием правым или левым (там ведь 2 регистра данных), с какого входа аналоговой матрицы брать, какой опорник частоты использовать и т.д. После этого выставить бит включения ацп, подождать некоторое время и только после этого выставить бит старта преобразования. После чего наблюдать, помойму, за 0 битом, и ждать когда он снимется, или выработается прерывание, если вы его, конечно, разрешите. Когда бит снялся - все, данные готовы. Если время не выжидать, можно получить очень интересные результаты - в доке все написано. Следуйщее преобразование начинается аналогично - сначала выставляете бит включения АЦП, ждете, и только потом ставите бит начала преобразования, после чего опрашиваете соответствующий бит, или, можно навесить прерывание - это уж как вам угодно будет. Если сигналы не сильно быстро меняющиеся, не помешает поставить внешний фильтр на вход ацп и хорошо отфильтровать питание проца. Но, в принципе, для столь грубой оценки, которая вам нужна, можно этот пункт опустить. Пишу по памяти, подпрограмму ацп писал еще год назад, с тех пор я ее не трогаю - работает себе, жрать не просит ;-) Так что, если что не так, то сильно не пинайте ;-) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Михалыч 0 28 февраля, 2005 Опубликовано 28 февраля, 2005 · Жалоба % от питания при наличии делителя напряжения на нужный диапазон — сколько влезет! Я при помощи единственного резистора на 2 МОм например детектор нуля в 220 вольт сети делал. :) Не, через резистор понятно дело, хоть все 380. А меня интересует без резистора. Напряжение меняется 0-5 В, можно напрямую или делитель? Питание, есеснно, 5-вольтовое. :) P.S. Сегодня начинаю прогу делать :w00t: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Михалыч 0 28 февраля, 2005 Опубликовано 28 февраля, 2005 · Жалоба Вот теперь разобрался, как настраивать и читать АЦП. Напряжение - от Agnd do Vпит. Возник другой вопрос. Предположим, что значение считано и записано в нужный регистр. Как его сравнить с нужными нам значениями? Например, 0...2 В - переход в один режим, 2...3 В - в другой, >3 В - в третий? Как выполнять преобразования? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
angir 0 28 февраля, 2005 Опубликовано 28 февраля, 2005 · Жалоба Вот теперь разобрался, как настраивать и читать АЦП. Напряжение - от Agnd do Vпит. Возник другой вопрос. Предположим, что значение считано и записано в нужный регистр. Как его сравнить с нужными нам значениями? Например, 0...2 В - переход в один режим, 2...3 В - в другой, >3 В - в третий? Как выполнять преобразования? <{POST_SNAPBACK}> У АЦП почти линейная зависимость от входного напряжения. Я бы в вашем случае сделал бы следуйщим образом: настроил АЦП на выдачу данных в следуйщем формате: старшие 8 бит - в ADRESH, а младшие 2 бита - в ADRESL. Младшие 2 бита за ненадобностью отбрасываем, т.е. считываем данные только из ADRESH. Далее ставьте простую сравнялку: если значение меньше, чем 102, - то это меньше 2 В, если между 102 и 153 - это 2..3 вольта, ну, а все, что выше - это 3..5 вольт ;-) Вот вроде и все, только с этими граничными значениями можете намучаться, когда в силу шумов будут колебания около 2 В и 3 В. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Михалыч 0 1 марта, 2005 Опубликовано 1 марта, 2005 · Жалоба Ладно, попробую. Благодарю за совет, angir :) А насчет граничных значений поподробнее, пожалуйста. Откуда берутся шумы? Как с ними не мучиться?.. И откуда вы взяли значения 102 и 153? Как это перевести в вольты и наоборот? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
angir 0 1 марта, 2005 Опубликовано 1 марта, 2005 · Жалоба Ладно, попробую. Благодарю за совет, angir :) А насчет граничных значений поподробнее, пожалуйста. Откуда берутся шумы? Как с ними не мучиться?.. И откуда вы взяли значения 102 и 153? Как это перевести в вольты и наоборот? <{POST_SNAPBACK}> Шумы появляются из-за разных причин. Тепловой шум, наводки, плохая стабилизация питания и т.д. Борятся с ними при помощи во первых, грамотной разводки слоев питания и сигнальных слоев и т.д. а также , при помощи различных фильтров. Теперь про значения: У АЦП, как я уже говорил, линейная зависимость между напряжением и кодом. У нас 10-битный АЦП, то есть, 0 В - это 0 код, 5В - это 1023 (2^10-1). Далее, т.к. младшие 2 бита мы откидываем и не рассматриваем, у нас получается как-бы 8-битный АЦП, т.е. 5В - это 255, 0В - это 0. Т.к. зависимость почти линейная, то справедлива следующая формула : код= Uвхода*255/Uadc. Uadc у вас = напряжению питания процессора, которое, судя по всему, у вас 5 вольт. формула перевода наоборот: Uвхода=код*Uadc/255. Если вы хотите все-таки использовать все 10 бит, то везде в выше преведенных формулах замените 255 на 1023. Да, и еще, когда на входе будет например 2В, будут колебания как в сторону 2+0, так и в сторону 2-0, т.е. код всегда четко не будет = 102, а будут небольшие колебания как в одну сторону, так и в другую. Тоже самое и с +3 В. Как одним из методов борьбы для вас, я бы предложил следуйщую схему: Проверить осциллографом уровень шумов на входе АЦП. Далее, нужно брать столько бит с АЦП, чтобы как минимум шумы помещались в один "новый" разряд, а лучше чтобы они были меньше половины него, т.е. например у вас на входе шум 50 мВ, это породит постоянные колебания кода на +-5 в случае использования всех 10 бит, если мы используем 8 бит, это уже будет составлять колебания на +-2, т.е. нам надо понижать разрядность методом отбрасывания младших разрядов, но с другой стороны, есть предельная точность преобразования, которая вам нужна. И получается палка о двух концах: с одной стороны надо уменьшить разрядность для борьбы с шумами, с другой стороны надо увеличить разрядность для более точного определения кода. Вообщем, надеюсь, понятно написал. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Михалыч 0 2 марта, 2005 Опубликовано 2 марта, 2005 · Жалоба Вполне понятно. Спасибо! :cheers: Еще один вопрос: какие команды используются для того, чтобы определить, в какой промежуток попадает значение? Просмотрел даташит ПИКов, но ничего подобного в явном виде не нашел. :smile3046: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
angir 0 2 марта, 2005 Опубликовано 2 марта, 2005 · Жалоба Вполне понятно. Спасибо! :cheers: Еще один вопрос: какие команды используются для того, чтобы определить, в какой промежуток попадает значение? Просмотрел даташит ПИКов, но ничего подобного в явном виде не нашел. :smile3046: <{POST_SNAPBACK}> ;-) Это же легко: пусть у нас в регистре ADC находятся данные с АЦП. Далее пишем следующий код: MOVLW 0x98; это 152 в десятичной, загружаем в W SUBWF ADC,0; это ADC-W, W=152, результат вычитания - в W. BTFSS STATUS,0; проверка, установлен ли 0 бит регистра статус, goto label1; описание на регистр смотри в datasheet, если он goto label2; установлен, то команда goto label1 - пропускается и выполняется сразу команда goto label2. Если сброшен, то выполняется goto label1 и естественно, до команды goto label2 просто дело не доходит. Суть в том, что если ты вычитаешь, то 0-й бит регистра статус установлен, если результат вычитания положителен, если отрицателен - он сброшен. Следовательно, твоя программа перейдет на label1, если результат вычитания отрицателен -> ADC<W и на label 2, если результат положителен или ADC>=W. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Михалыч 0 3 марта, 2005 Опубликовано 3 марта, 2005 · Жалоба :) :cheers: :laugh: :rolleyes: :tongue: :w00t: B) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golded 0 15 апреля, 2005 Опубликовано 15 апреля, 2005 · Жалоба Лень почитать дата шит? Там всё понятно написано. Единственное - не забыть задать направление ножек на ввод и указать, что эти ножки будут принадлежать АЦП. <{POST_SNAPBACK}> Сорри за глупый вопрос, но где увидеть даташит? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sK0T 0 17 апреля, 2005 Опубликовано 17 апреля, 2005 · Жалоба Сорри за глупый вопрос, но где увидеть даташит? <{POST_SNAPBACK}> На русском. Или оригиналы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться