Чтение сигнала pwm используя аппаратные прерывания Arduino

ЧТЕНИЕ СИГНАЛА PWM ИСПОЛЬЗУЯ АППАРАТНЫЕ ПРЕРЫВАНИЯ ARDUINO

PWM сигнал обычно используется для управления устройствами радиомодели или прочей робототехники. Он представляет из себя импульс переменной длинны повторяющийся каждые 22 мс. Позиция сервомашинки или количество оборотов двигателя задается длинной этого импульса. Длинна может изменятся в диапазоне 500 – 1500 мкс. Поскольку у разной аппаратуры могут быть разные временные диапазоны обычно предусматривают регулировку. В случае с сервомашинками обычно можно механически отрегулировать её ход или ход тяги, а в случае с регуляторами оборотов необходимо производить программную регулировку, не пренебрегайте этим.

Чтение сигнала PWM:

Для чтения сигнала воспользуемся аппаратными прерываниями микроконтроллера. Я буду использовать в качестве примера Arduino. При желании можно повторить тоже с другими микроконтроллерами, поддерживающими аппаратное прерывание.

В зависимости от модели Arduino поддерживает разное количество прерываний на разных пинах. Более подробную информацию можете посмотреть в документации.

Код:

volatile int length = 0;
volatile int start_time = 0;

void setup() {
Serial.begin(115200);
// Привязываем к Pin2 прерывание по фронту сигнала
attachInterrupt(0, rising, RISING);
}

void loop() { }

//Обработчик прерывания на возрастание сигнала
void rising() {
// Привязываем к Pin2 прерывание по срезу сигнала
attachInterrupt(0, falling, FALLING);
//сохраняем значение времени начала импульса
start_time = micros();
}

//Обработчик прерывания по срезу сигнала
void falling() {
// Привязываем к Pin2 прерывание по фронту сигнала
attachInterrupt(0, rising, RISING);
//сохраняем значение длительности импульса
length = micros() - start_time;
Serial.println(length);
}

Алгоритм:

  1. При появлении импульса срабатывает прерывание по фронту сигнала(когда он возрастает с 0 до 1).
  2. Сохраняем текущее время и устанавливаем прерывание на срез сигнала(переключение с 1 на 0).
  3. При срабатывании прерывания на срез сохраняем разницу между текущим временем и записанным ранее, таким образом получаем длительность импульса. Переключаем прерывание обратно на фронт. Передаём данные через Arduino.
  4. Остается только преобразовать время в микросекундах к требуемым единицам.

Чтение сигнала pwm используя аппаратные прерывания Arduino: 4 комментария

  1. I really like your writing style, fantastic information, thanks for putting up edeckgedgdfe

  2. можно пожалуйста сделать скетч который будет принимать значения с приёмника RC а на выходе в переменную например val записывалось значение
    от 0 до предположим 1024?

  3. Не перестаю удивляться сколько всего встроили разработчики в Ардуино.

    Спасибо за статью.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *