Проблема с аналоговой записью

Я подключил к DRV8835 2 двигателя постоянного тока с блоком питания 11. Ардуино нано.

Когда я зацикливаю for, например, i от 0 до 1024 для AnalogWrite(i,Motor1) для DC Motor1, он ускоряется от 0 до 200 и останавливается. Когда у меня становится 250, он начинает с большей скорости. Когда он становится 500, он снова останавливается. И 550 у нас снова есть сила.

Теперь я попытался запустить AnalogWrite(1000, ***), но это не работает. Когда я меняю значение с 1000 на 1005, оно снова не работает. А вот на 1024 у нас максимальная скорость и она работает?

 #define LEFT_PWM 9
 #define RIGHT_PWM 10
 #define LEFT_DIR 5
 #define RIGHT_DIR 6

void setup() {
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
}

void loop() {
  digitalWrite(LEFT_DIR, HIGH);
  analogWrite(LEFT_PWM, 1000);
}

, 👍1


2 ответа


Лучший ответ:

1

analogWrite имеет следующий прототип

void analogWrite(uint8_t, int);

это означает, что его первый параметр имеет диапазон [0, 256) и следует правилам арифметики по модулю, с 256 по модулю. Если вы указываете аргументы за пределами диапазона [0, 256), они будут интерпретироваться % 256. 1000 совпадает с 232 (1000 % 256 == 232), 500 совпадает с 244, 550 совпадает с 38 и так далее.

Это не полностью согласуется с симптомами, которые вы описываете (если ваше описание является точным), что может означать, что здесь есть какой-то другой фактор. Вы уверены, что используете DRV8835 в режиме PHASE/ENABLE (на контакте 11 высокий уровень)?

,

Pin MOD был настоящей проблемой. Припаял его к VCC проводом и проблема решена. До этого поведение моторов было очень случайным., @Lary


0

"Значение" для analogWrite() должно быть целым числом от 0 до 255.

На веб-сайте arduino.cc можно найти такую информацию: analogWrite(). . Справочник по языку.

,

К сожалению, arduino.cc — очень плохой ресурс. Хороший ресурс мог бы сообщить нам точные типы аргументов analogWrite, то есть полное объявление функции C/C++. arduino.cc нет., @AnT

@AnT — это отличный ресурс для новичков, которые допускают самые элементарные ошибки :), @VE7JRO

.. facepalm.. Я писал код на контроллерах nodemcu и TI, где у нас больше битов. а аналоговая ярость до 4096, @Lary

Аналоговый диапазон @Lary зависит от разрешения вашего АЦП. Ardunio поддерживает АЦП с разрешением 10 бит, что означает 2 ^ 10 бит значения = максимальное значение 4096. Здесь в **analogWrite** используется для генерации ШИМ-сигнала с определенным рабочим циклом. Процент рабочего цикла зависит от значения, которое вы записываете в функцию. 255 означает 100% рабочий цикл., @Vaibhav

@Vaibhav: 2^10 = 1024. А диапазон значений, возвращаемых АЦП, составляет 0–1023., @Edgar Bonet

@EdgarBonet 0-1024 считается 1024 :), @Vaibhav

@Vaibhav: Я умею считать, но не могу понять, что вы пытаетесь сказать своим комментарием., @Edgar Bonet

@EdgarBonet Я просто говорил, что аналоговая запись в Arduino и обычная аналоговая запись и чтение в самой Arduino различаются., @Vaibhav