Arduino: странности AnalogRead и AnalogWrite

Обсуждаем контроллеры компании Atmel.
Ответить
Открыл глаза
Сообщения: 77
Зарегистрирован: Сб ноя 04, 2017 19:21:12

Сообщение slyubez »

Приветствую всех.

Решил поэкспериментировать с китайским клоном Arduino Uno. Написал код имитации синусоиды:

Код: Выделить всё

const int analogOutPin = A0;

void setup() {
  // put your setup code here, to run once:
}

void loop() {
  // put your main code here, to run repeatedly:
 int i; 
 for (i=0; i<1024; ++i)
  analogWrite (analogOutPin, i);
 for (i=1023; i>0; --i)
  analogWrite (analogOutPin, i); 
}
Вгрузил код в контроллер. Подключил осциллограф к А0 и ... вижу вместо синуса чистый прямоугольник с длинной фазой единицы и с короткой - нуля.

Этап 2.
Соединил перемычкой выводы А0 и А1. Написал такой код, чтобы посмотреть вывод.

Код: Выделить всё

const int analogOutPin = A0;
const int analogInPin = A1;

void setup() {
 pinMode (analogOutPin, OUTPUT);
 pinMode (analogInPin, INPUT);
 Serial.begin(9600); 
}

void loop() {
  // put your main code here, to run repeatedly:
 int i, j; 
 for (i=0; i<1024; ++i)
   {      
     analogWrite (analogOutPin, i);
     delay (100);
     j = analogRead (analogInPin);
     if (i != j)
       {
        Serial.print("OutLevel = ");
        Serial.print(i);
        Serial.print("\t InLevel = ");
        Serial.println(j);
       } 
   }    
 while (1==1) {}  
}
На считывании входа неожиданно получил всего два уровня, с переходом между ними, как показано ниже:

Код: Выделить всё

OutLevel = 120	 InLevel = 0
OutLevel = 121	 InLevel = 0
OutLevel = 122	 InLevel = 0
OutLevel = 123	 InLevel = 0
OutLevel = 124	 InLevel = 0
OutLevel = 125	 InLevel = 0
OutLevel = 126	 InLevel = 0
OutLevel = 127	 InLevel = 0
OutLevel = 128	 InLevel = 1023
OutLevel = 129	 InLevel = 1023
OutLevel = 130	 InLevel = 1023
OutLevel = 131	 InLevel = 1022
OutLevel = 132	 InLevel = 1023
OutLevel = 133	 InLevel = 1023
OutLevel = 134	 InLevel = 1023
OutLevel = 135	 InLevel = 1023
OutLevel = 136	 InLevel = 1023
Интересно, отчего такое может происходить. Пробовал переводить вход в INPUT_PULLUP - получаю уровни 15 и 1023. Хотелось бы выслушать мнения других.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3385
Зарегистрирован: Пн окт 11, 2010 19:00:08

Сообщение Мурик »

Разве в ATmega328P есть ЦАП? Прежде чем работать с МК, изучите документацию чтобы понимать какие возможность в нем есть. http://ww1.microchip.com/downloads/en/D ... asheet.pdf
Реклама
Открыл глаза
Сообщения: 77
Зарегистрирован: Сб ноя 04, 2017 19:21:12

Сообщение slyubez »

Блин, точно. Да, там только АЦП. Тогда прошу прощения и благодарю. Значит, придется делать внешний ЦАП, получая сигнал через выходы.

Добавлено after 3 minutes 24 seconds:
Или тогда менять Ардуино на другую, в которой есть ЦАП. Полагаю, раз в IDE есть функция analogWrite, такие платы существуют. Буду рыть.

Добавлено after 5 minutes 55 seconds:
Сейчас нашел на сайте Ардуины в описании этой функции такой текст:
On most Arduino boards (those with the ATmega168 or ATmega328P), this function works on pins 3, 5, 6, 9, 10, and 11.

Уже руки чешутся попробовать.

Добавлено after 4 minutes 25 seconds:
Э... это совсем не то. Это не постоянный уровень, а PWM Wave. Жалко...
Друг Кота
Аватара пользователя
Сообщения: 3385
Зарегистрирован: Пн окт 11, 2010 19:00:08

Сообщение Мурик »

Чтобы из ШИМ получить аналог, нужно пропустить сигнал через RC цепочку.
Реклама
Эиком - электронные компоненты и радиодетали
Открыл глаза
Сообщения: 77
Зарегистрирован: Сб ноя 04, 2017 19:21:12

Сообщение slyubez »

Это в принципе понятно. Вот только это будет плавающее напряжение, что подходит не во всех случаях.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

[uquote="slyubez",url="/forum/viewtopic.php?p=3470350#p3470350"]Вот только это будет плавающее напряжение,[/uquote]
Это зависит от компетенции разработчика...
Реклама
Поставщик валерьянки для Кота
Сообщения: 1916
Зарегистрирован: Сб май 05, 2012 20:24:52
Откуда: KN34PC, Болгария

Сообщение veso74 »

Из моих favorites:

Arduino DDS Sinewave Generator
Генератор с регулируемоей частотой на ардуино

dosikus, я надеюсь, что примеры будут служить для вашей цели.
Контактная информация:
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1482
Зарегистрирован: Вс май 13, 2012 00:01:54

Сообщение Ariadna-on-Line »

AnalogWrite дает широтную модуляцию несущей частоты 490 Гц. Поэтому "добротно" получить из нее простым RC-фильтром можно только очень низкие частоты. Раз в 20 ниже. Иначе "конденсаторная экспонента" будет здорово просматриваться. Вместо RC фильтра обычно добавляют аналоговый интегратор на операционнике.
Ответить

Вернуться в «AVR»