Как правильно настроить ШИМ для управления углом сервопривода в AVR?

Я наткнулся на конфигурацию таймера для управления моим сервоприводом sg-90 и моим Arduino UNO.

Что я сделал:

  1. Установите для предварительного делителя значение 64 и режим быстрого ШИМ 16-битного таймера.
  2. Частота – 50 Гц, поэтому для ICR1 установлено значение 4999.
  3. И теперь я не знаю, что делать дальше, чтобы установить значения OCR1A, не угадывая их.

Насколько я понимаю: Если период теперь установлен на 20 мс, то для сервопривода sg-90:

Из документации: http://www.ee.ic.ac. uk/pcheung/teaching/DE1_EE/stores/sg90_datasheet.pdf

  • Угол 0 должен быть равен 1 мс (1/20 = 0,05), поэтому OCR1A = 4999 * 0,05 ~= 250.
  • Угол 90° должен быть равен 1,5 мс (1,5/20 = 0,075), поэтому OCR1A = 4999 * 0,075 ~= 375
  • Угол 180 должен быть равен 2 мс (2/20 = 0,1), поэтому OCR1A = 4999 * 0,1 ~= 500

Но это так не работает. Я понял, что значения 125, 370, 615 - я нашел эти числа в Интернете (не на английском языке), но это парень не объяснил, как он их получил.

Может ли кто-нибудь объяснить мне, откуда берутся эти цифры или где мои расчеты неверны.

С сервоприводом проблем нет, потому что с сервобиблиотекой Arduino все работает нормально.

Решение:

Документ, который я прикрепил, неверный, диапазон импульсов в миллисекундах не 1-2 мс, а 0,5-2,5 мс, и все подходит правильно.

Ниже мой текущий код:

#define F_CPU 16000000UL

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <stdbool.h>

#define PRESCALER_64 (1 << CS11) | (1 << CS10)
#define FAST_PWM_A (1 << WGM11)
#define FAST_PWM_B (1 << WGM13) | (1 << WGM12)

int main(){

    TCCR1A = FAST_PWM_A | (1 << COM1A1);
    TCCR1B = FAST_PWM_B | PRESCALER_64;
    ICR1 = (F_CPU / 64 / 50) - 1;

    DDRB |= (1 << PB1);

    while(true){
        OCR1A = 125;
        _delay_ms(2000);
         OCR1A = 370;
        _delay_ms(2000);
        OCR1A = 615;
        _delay_ms(2000);
    }

}

, 👍-1

Обсуждение

исследуйте, какие сигналы сервоприводы ожидают получить ... вопрос, не связанный с Arduino, @jsotola

jsotola прав, это вопрос AVR, а не вопрос Arduino, его лучше разместить на StackOverflow. В любом случае, если ваш период таймера составляет 5000 циклов, ваши расчеты кажутся мне правильными. (Я не проверял настройку таймера.) У вас нет осциллографа, чтобы посмотреть сигнал? -- Относительно этого "другого парня": Поскольку любой дурак может постить всякое в "нет", сомневайтесь в любой информации, особенно если она не объяснена. Трудность сегодня состоит в том, чтобы отфильтровать 1% хороших вещей от дерьма., @the busybee

почему бы не использовать библиотеку?, @Juraj

Хорошо, я понял это. Проблема в документе. Ширина импульса находится не в диапазоне 1-2 мс, а в диапазоне 0,5-2,5 мс., @ErnestW


1 ответ


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

0

Хорошо, я понял.

Документ, который я прикрепил, некорректен, диапазон импульсов в миллисекундах не 1-2 мс, а 0,5-2,5 мс, и все подходит правильно.

,