Arduino AnalogRead() сброс микроконтроллера

Я использую Atmega328 с arduino bootloader. Весь мой код работает нормально. Теперь мне нужно использовать analogRead() для получения значений АЦП, но как только PC увидит analogRead(), он перезапустит микроконтроллер. Вот пример кода.

void setup() {
  Serial.begin(19200);
  while(!Serial);
  Serial.println("Setup finish");
  delay(200);
}

void loop() {
  Serial.println("Reading analong Values");
  uint16_t a = analogRead(A0);
  Serial.println(a);
  delay(1000);
}

Выход,

Setup finish
�Setup finish
�Setup finish
�Setup finish
�Setup finish
�Setup finish
�Setup finish
�Setup finish
�

Я также пытался поставить delay() до и после него, но тщетно. Как это исправить. Спасибо.

Обновление: я пробовал 0 вместо A0, но не напрасно.

Обновление: проблема сводится к voltage selection(3.3 or 5V) включению программатора FTDI. Установка на 5В работает отлично, но при переключении на 3,3В проблема возникает снова.


person Oli    schedule 02.12.2016    source источник
comment
Что у вас есть на входе Analog 0? Я бы предложил добавить Serial.println("n");, где n - это число между всем вашим кодом, чтобы увидеть, где именно он зависает, на случай, если это не аналоговое чтение.   -  person Turk    schedule 02.12.2016
comment
Когда я добавляю analogReference(INTERNAL), ошибка исчезает. но когда я использую analogReference(DEFAULT), проблема появляется снова.   -  person Oli    schedule 02.12.2016
comment
Я распечатываю A0 -- A7 и вывожу 14 -- 21. Согласно техническому описанию, физические аналоговые контакты на Atmega328p-PU имеют номера «23 — 28».   -  person Oli    schedule 02.12.2016
comment
Контакт AREF на моей печатной плате подключен к конденсатору 100nF, а другой конец к ground, как и Arduino Uno Schematic.   -  person Oli    schedule 02.12.2016


Ответы (4)


С сайта Arduino здесь:

ПО УМОЛЧАНИЮ: аналоговое опорное напряжение по умолчанию 5 В (на платах Arduino 5 В) или 3,3 В (на платах Arduino 3,3 В)

ВНУТРЕННИЙ: встроенный источник опорного напряжения, равный 1,1 В для ATmega168 или ATmega328 и 2,56 В для ATmega8 (недоступно для Arduino Mega)

Это ясно показывает, что используемая вами atmega328 требует внутренней ссылки на 1,1 В при считывании аналоговых входов. Скорее всего перезагружается, потому что при использовании analogReference(DEFAULT); atmega328 не умеет правильно декодировать сигнал и вылетает.

person Turk    schedule 02.12.2016
comment
Установка его на 1.1 вольта означает, что мой входной сигнал не может подняться до 3.3 вольта, что на самом деле мне нужно. - person Oli; 02.12.2016
comment
У меня пять плат, из которых 2 работают с analogRefernce(DEFAULT) и три работают только с analogReference(INTERNAL). - person Oli; 02.12.2016
comment
Напряжение, на которое вы ссылаетесь на вывод, не меняет входящего значения. Он просто сообщает микроконтроллеру, как считать значение и ссылаться на это значение. Существуют разные зависимости на разных платах, с которыми вам приходится работать, и все, что связано с аналогом, всегда может быть привередливым. Если вы хотите использовать atmega328, вы должны использовать внутреннюю ссылку. Если вы действительно хотите иметь входной сигнал до 3,3 В, вам придется поменять платы. - person Turk; 02.12.2016
comment
Я узнал виновного. Когда я устанавливаю плату (программатора)FTDI на 5V, она работает нормально, когда я переключаю ее на 3.3V, появляется проблема. Но все же я не знал, почему это не работает для 3.3V. - person Oli; 02.12.2016
comment
это связано с компонентами, которые вы используете. если у вас есть контроллер 3,3 В с подключенным к нему устройством 5 В, Arduino не сможет его прочитать. Логические уровни должны совпадать, за исключением случая, когда устройство 3,3 В отправляет данные на устройство 5 В. По сути, вы не можете читать значения, которые имеют более высокий логический уровень, чем плата, на которой работает ваш код. @YannVernier также делает очень хорошее замечание по поводу A0 против 0, я этого не уловил - person Turk; 02.12.2016
comment
Это должно помочь в понимании логических уровней: learn.sparkfun.com/tutorials/logic-levels - person Turk; 02.12.2016
comment
что, если мой аналоговый вывод не подключен к датчику, analogRead() должен что-то вернуть как в сценариях «5 В», так и в сценариях «3,3 В». - person Oli; 02.12.2016
comment
Что связано с вашим A0? - person Turk; 02.12.2016
comment
простой делитель напряжения. Я удалил его сейчас. Проблема вся сводится к voltage selection(3.3 or 5V) switch на FTDI программаторе. Установка на 5V работает отлично, но при переключении на 3.3V возникает проблема. - person Oli; 02.12.2016
comment
Тогда я в недоумении, похоже, вы не имеете четкого представления о том, как данные передаются, и это вызывает ваше замешательство. Я очень настоятельно рекомендую почитать на странице Arduino об аналоговых данных и о том, как они взаимодействуют с вашей конкретной платой. Как я уже сказал, аналог может быть привередливым, но он работает, если вы знаете, как правильно к нему подойти. Трудно помочь вам определить точную проблему без схемы прямо передо мной. - person Turk; 02.12.2016
comment
Большое спасибо @Turk, теперь я знаю, в чем проблема с этим обсуждением с вами. - person Oli; 02.12.2016
comment
Конечно, надеюсь, ты разберешься. Извините, я не мог больше помочь! - person Turk; 02.12.2016

Поскольку analogRead работает только с аналоговыми входными контактами, он принимает номер канала, а не контакт. количество. Попробуйте передать 0, а не A0. Вероятно, это не удается, потому что A0 имеет более высокий номер (как цифровой контакт), чем количество аналоговых входных каналов, что вызывает ошибку выхода за пределы.

person Yann Vernier    schedule 02.12.2016
comment
Это все то же самое, но когда программатор (FTDI) установлен на 5V, AnalogRead() работает нормально. Проблема появляется как только я переключаю переключатель с FTDI на 3,3В. - person Oli; 02.12.2016
comment
A0 не проблема. Карты analogRead PIN-код к номеру канала. - person gre_gor; 02.12.2016
comment
Это звучит немного странно. Большинство плат Arduino питаются от 5В. Я полагаю, что если бы вы подали высокий уровень на вывод, подключенный к микросхеме с питанием 3,3 В, а питание 3,3 В поддерживало отрицательный ток, а питание 5 В было слабым, вы могли бы снизить мощность до уровня, на котором контроллер выходит за пределы спецификации (AVR часто рассчитан только на 8 МГц при более низком напряжении). Вы можете получить и другие загадочные результаты. - person Yann Vernier; 02.12.2016
comment
@gre_gor: я исправлен. Проверено github.com/arduino /Arduino/blob/master/hardware/arduino/avr/ также может подтвердить, что они делают двойное сопоставление вещей и просто оставили документацию неясной. - person Yann Vernier; 02.12.2016

inductor между контактами 3.3V и AVcc источника питания была проблема analogRead() reset. Назначение этого индуктора указано здесь, назначение индуктора. Но короткое замыкание катушки индуктивности устраняет проблему.

person Oli    schedule 02.12.2016

Я рекомендую вместо того, чтобы писать uint16_t a = analogRead(A0), вы должны объявить ввод A0 как переменную и вызвать его позже в программе. Также в разделе void setup() есть ошибка, которая заключается в том, что вы написали цикл while с условием и завершенным строку с точкой с запятой. Вы должны были написать действия, которые должны быть выполнены, если утверждение истинно между фигурными скобками

person Yusuf Maged    schedule 06.12.2016