Как правильно настроить ШИМ для управления углом сервопривода в AVR?
Я наткнулся на конфигурацию таймера для управления моим сервоприводом sg-90 и моим Arduino UNO.
Что я сделал:
- Установите для предварительного делителя значение 64 и режим быстрого ШИМ 16-битного таймера.
- Частота – 50 Гц, поэтому для ICR1 установлено значение 4999.
- И теперь я не знаю, что делать дальше, чтобы установить значения 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);
}
}
@ErnestW, 👍-1
Обсуждение1 ответ
Лучший ответ:
Хорошо, я понял.
Документ, который я прикрепил, некорректен, диапазон импульсов в миллисекундах не 1-2 мс, а 0,5-2,5 мс, и все подходит правильно.
- Справка - Atmega328p, преобразование ШИМ-сервокода из pin9 в pin6
- Проблемы с пониманием минимальных и максимальных параметров серводвигателя
- Как Arduino Uno может поддерживать до 12 сервоприводов, если у него всего 6 цифровых выводов ШИМ?
- Управление сервоприводом без библиотеки сервоприводов
- Как изменить скорость нескольких сервоприводов, работающих одновременно с модулем PCA9685?
- Контакты ШИМ серводвигателей, Arduino Uno
- Управление сервоприводом с помощью ATtiny13A
- О UART один передатчик несколько приемников
исследуйте, какие сигналы сервоприводы ожидают получить ... вопрос, не связанный с Arduino, @jsotola
jsotola прав, это вопрос AVR, а не вопрос Arduino, его лучше разместить на StackOverflow. В любом случае, если ваш период таймера составляет 5000 циклов, ваши расчеты кажутся мне правильными. (Я не проверял настройку таймера.) У вас нет осциллографа, чтобы посмотреть сигнал? -- Относительно этого "другого парня": Поскольку любой дурак может постить всякое в "нет", сомневайтесь в любой информации, особенно если она не объяснена. Трудность сегодня состоит в том, чтобы отфильтровать 1% хороших вещей от дерьма., @the busybee
почему бы не использовать библиотеку?, @Juraj
Хорошо, я понял это. Проблема в документе. Ширина импульса находится не в диапазоне 1-2 мс, а в диапазоне 0,5-2,5 мс., @ErnestW