Столкнулся с такой ситуацией, arduino pro mini Надо померить точное напряжение на одном выходе. На другом выходе померить вывод делителя, чтобы не зависеть от заряда батарели. Т.е. получать относительные и абсолютные значения в одном флаконе. Код (C++): ADCSRA |= (1 << ADEN); // АЦП analogReference(INTERNAL); unsigned int b=analogRead(A1); analogReference(DEFAULT); unsigned int r=analogRead(A0); ADCSRA &= ~(1 << ADEN); // Отключаем АЦП Как оказалось, нельзя переключать Reference на ходу. АЦП просто сходит с ума. Нашёл способ откалибровать АПЦ, прогнать цикл изменений перед выборкой. Код (C++): for(int n=0; n<50; n++) analogRead(A1); Ну ещё кнопка сброса помогает, хотя я не нашёл способа сбрасывать отдельно АПЦ, может у него только аппаратный сброс возможен. Может кто-нибудь знает, менее энергозатратный или более корректный способ разрядить АПЦ перед измерением? Перерыл весь даташит. Рассматривал вариант делать все измерения по INTERNAL и делать расчёт в коде, но по определённым причинам, не устраивает. Нужен разный reference для разных входов.
Плохо рыл, если вот такой фразы не нашёл: "The first ADC conversion result after switching reference voltage source may be inaccurate, and the user is advised to discard this result". А судя по приведённому куску кода - таки не нашёл :-(
Можно. Только потом надо 10 мс ждать. Первое измерение после переключения выбросить. использовать новые МК. AtMega 0-ой и 1-ой серии очень сильно шагнула вперёд по сравнению со старым AVR. В ардурине представлена AtMega4809 (NanoEvery).
А что, нужны предложения? Знаю. Действительно (а не языком по голому заду) прочитать даташит и сделать точно как там написано.
Помогло в таком виде: Код (C++): analogRead(A1); delay(5); int v1 = analogRead(A1); Из расчёта что цикл, 4 мс занимал. Одно чтение и пауза, всё работает. Чтение после паузы не канало.
Не всё. Надо ещё в электрические параметры заглянуть. Честно говоря, по тому, как АЦП в дурине работает катастрофически медленно, мне казалось, что проблема выдержки времени там решена. Оказалось, что нет. ЛОЛ.
эта фраза в ide есть, может где-то уже с перводом, человек вряд ли даже про управление ацп читал, или сами pdf к железу. Мне это как-то помочь должно было? Или ты не видишь, что в фразе некоректное высказывание? а ответ, банальный офтоп. Или не видно
какое в этой фразе некорректное высказывание? - ты может в английском совсем ни гугу- так не стесняйся, я тебе переведу
я думаю, можно было попробовать ноль на один их входов подать, и считать через АЦП, может он быстрее опорное напряжение скинет..
так ты в итоге так и делаешь - выкидываешь первое значение Код (C++): analogRead(A1); delay(5); int v1 = analogRead(A1); только теперь раздуваешься от гордости. что "сам додумался" А достаточно было даташит на МК почитать - там прям так и написано. А-а-а... дошло, ты эту фразу небось гуглем перевел, вот она и вышла "некорректной". Языки учи.
Аналоговая часть АЦП у старых AVR никак не программируется. В даташите написано про 10 мс на переходные процессы - будьте добры эту паузу выдержать. Тоже касается и переключения входов - у старых AVR мультиплексор входы переключает вообще не спеша.
Паравоз, фраза в сообщении #2 - это прямая цитата из даташита на Атмегу328, стр 311. И не надо ничего выдумывать - циклы там всякие, задержки конские. ТС пишет, что "перерыл весь даташит" - а нафига перерывать-то, там оглавление есть
Сова, ты не вывезешь этот разговор, т.к. я реально работал с АЦП на предельных для него скоростях и даже писал об этом. А даташит надо читать весь - от и до, а не только заголовки.
надо сначала подождать 5-10 мс, потом два раза считать ацп. я давно сам до этого дошел, на лыжах не читая даташыт