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

Использование АЦПатора

Ребята, помогите "чайнику" разобраться со встроенным в этот девайс АЦП. Используются три аналоговых входа, нужно определять три основных значения на каждом - 0 В; 5 В; 2,5 В. Кто имел дело с этим, объясните пожалуйста, на пальцах программную реализацию. :blush:

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


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

Лень почитать дата шит? Там всё понятно написано.

Единственное - не забыть задать направление ножек на ввод и указать, что эти ножки будут принадлежать АЦП.

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


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

Etoja, пасиба за столь подробное объяснение ;)

Кстати, какое максимальное напряжение можно подавать на вход АЦП? Сколько % от питания?

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


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

Etoja, пасиба за столь подробное объяснение ;)

Кстати, какое максимальное напряжение можно подавать на вход АЦП? Сколько % от питания?

 

Да нет, серьёзно, там доходчиво написано!

 

% от питания при наличии делителя напряжения на нужный диапазон — сколько влезет! Я при помощи единственного резистора на 2 МОм например детектор нуля в 220 вольт сети делал. :)

 

Никаких подводных камней. Делаешь по даташиту, всё работает. Ну или задавай более подробные вопросы.

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


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

Вообще-то все есть в примере, что идет с документацией. К тому-же без документации вы не сможете задать матрицу аналоговых входов, да и вообще сконфигурировать блок АЦП. Принцип такой: нужно настроить соответствующие входы, как аналоговые, выбрать референс - в вашем случае, можно выбрать внутренний референс от питания проца. Далее, в зависимости от ваших потребностей сконфигурировать модуль ацп, такие параметры, как например ложить данные, с выравниванием правым или левым (там ведь 2 регистра данных), с какого входа аналоговой матрицы брать, какой опорник частоты использовать и т.д. После этого выставить бит включения ацп, подождать некоторое время и только после этого выставить бит старта преобразования. После чего наблюдать, помойму, за 0 битом, и ждать когда он снимется, или выработается прерывание, если вы его, конечно, разрешите. Когда бит снялся - все, данные готовы. Если время не выжидать, можно получить очень интересные результаты - в доке все написано. Следуйщее преобразование начинается аналогично - сначала выставляете бит включения АЦП, ждете, и только потом ставите бит начала преобразования, после чего опрашиваете соответствующий бит, или, можно навесить прерывание - это уж как вам угодно будет. Если сигналы не сильно быстро меняющиеся, не помешает поставить внешний фильтр на вход ацп и хорошо отфильтровать питание проца. Но, в принципе, для столь грубой оценки, которая вам нужна, можно этот пункт опустить.

Пишу по памяти, подпрограмму ацп писал еще год назад, с тех пор я ее не трогаю - работает себе, жрать не просит ;-) Так что, если что не так, то сильно не пинайте ;-)

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


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

% от питания при наличии делителя напряжения на нужный диапазон — сколько влезет! Я при помощи единственного резистора на 2 МОм например детектор нуля в 220 вольт сети делал. :)

Не, через резистор понятно дело, хоть все 380. А меня интересует без резистора. Напряжение меняется 0-5 В, можно напрямую или делитель? Питание, есеснно, 5-вольтовое. :)

P.S. Сегодня начинаю прогу делать :w00t:

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


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

Вот теперь разобрался, как настраивать и читать АЦП. Напряжение - от Agnd do Vпит. Возник другой вопрос. Предположим, что значение считано и записано в нужный регистр. Как его сравнить с нужными нам значениями? Например, 0...2 В - переход в один режим, 2...3 В - в другой, >3 В - в третий? Как выполнять преобразования?

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


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

Вот теперь разобрался, как настраивать и читать АЦП. Напряжение - от Agnd do Vпит. Возник другой вопрос. Предположим, что значение считано и записано в нужный регистр. Как его сравнить с нужными нам значениями? Например, 0...2 В - переход в один режим, 2...3 В - в другой, >3 В - в третий? Как выполнять преобразования?

У АЦП почти линейная зависимость от входного напряжения. Я бы в вашем случае сделал бы следуйщим образом: настроил АЦП на выдачу данных в следуйщем формате: старшие 8 бит - в ADRESH, а младшие 2 бита - в ADRESL. Младшие 2 бита за ненадобностью отбрасываем, т.е. считываем данные только из ADRESH. Далее ставьте простую сравнялку: если значение меньше, чем 102, - то это меньше 2 В, если между 102 и 153 - это 2..3 вольта, ну, а все, что выше - это 3..5 вольт ;-)

Вот вроде и все, только с этими граничными значениями можете намучаться, когда в силу шумов будут колебания около 2 В и 3 В.

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


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

Ладно, попробую. Благодарю за совет, angir :)

А насчет граничных значений поподробнее, пожалуйста. Откуда берутся шумы? Как с ними не мучиться?..

И откуда вы взяли значения 102 и 153? Как это перевести в вольты и наоборот?

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


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

Ладно, попробую. Благодарю за совет, angir :)

А насчет граничных значений поподробнее, пожалуйста. Откуда берутся шумы? Как с ними не мучиться?..

И откуда вы взяли значения 102 и 153? Как это перевести в вольты и наоборот?

Шумы появляются из-за разных причин. Тепловой шум, наводки, плохая стабилизация питания и т.д. Борятся с ними при помощи во первых, грамотной разводки слоев питания и сигнальных слоев и т.д. а также , при помощи различных фильтров.

Теперь про значения: У АЦП, как я уже говорил, линейная зависимость между напряжением и кодом. У нас 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, т.е. нам надо понижать разрядность методом отбрасывания младших разрядов, но с другой стороны, есть предельная точность преобразования, которая вам нужна. И получается палка о двух концах: с одной стороны надо уменьшить разрядность для борьбы с шумами, с другой стороны надо увеличить разрядность для более точного определения кода. Вообщем, надеюсь, понятно написал.

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


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

Вполне понятно. Спасибо! :cheers:

Еще один вопрос: какие команды используются для того, чтобы определить, в какой промежуток попадает значение? Просмотрел даташит ПИКов, но ничего подобного в явном виде не нашел. :smile3046:

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


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

Вполне понятно. Спасибо! :cheers:

Еще один вопрос: какие команды используются для того, чтобы определить, в какой промежуток попадает значение? Просмотрел даташит ПИКов, но ничего подобного в явном виде не нашел. :smile3046:

;-) Это же легко: пусть у нас в регистре 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.

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


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

Лень почитать дата шит? Там всё понятно написано.

Единственное - не забыть задать направление ножек на ввод и указать, что эти ножки будут принадлежать АЦП.

 

Сорри за глупый вопрос, но где увидеть даташит?

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


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

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

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

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

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

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

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

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

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

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