Обсуждаем контроллеры компании Atmel.
Ответить

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

Пн окт 01, 2018 16:22:11

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

Решил поэкспериментировать с китайским клоном 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. Хотелось бы выслушать мнения других.

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

Пн окт 01, 2018 16:31:43

Разве в ATmega328P есть ЦАП? Прежде чем работать с МК, изучите документацию чтобы понимать какие возможность в нем есть. http://ww1.microchip.com/downloads/en/D ... asheet.pdf

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

Пн окт 01, 2018 17:05:50

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

Добавлено 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. Жалко...

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

Пн окт 01, 2018 19:13:19

Чтобы из ШИМ получить аналог, нужно пропустить сигнал через RC цепочку.

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

Пн окт 01, 2018 19:47:14

Это в принципе понятно. Вот только это будет плавающее напряжение, что подходит не во всех случаях.

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

Пн окт 01, 2018 20:19:44

Вот только это будет плавающее напряжение,

Это зависит от компетенции разработчика...

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

Ср окт 10, 2018 15:37:23

Из моих favorites:

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

dosikus, я надеюсь, что примеры будут служить для вашей цели.

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

Ср окт 10, 2018 22:13:14

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