DMC.11 · Моторы и ESC · ATmega328P
Задача
Плавно менять газ мотора, подавая на ESC импульс 1000..2000 мкс.
Алгоритм
Тот же Timer1 Fast PWM 50 Гц. Значение OCR1A наращивается от 1мс (стоп) к 2мс (полный газ).
Исходный код (C, avr-gcc)
#ifndef F_CPU
#define F_CPU 16000000UL
#endif
#include <avr/io.h>
#include <util/delay.h>
static void esc_us(uint16_t us){ OCR1A=us*2; }
int main(void){
DDRB|=(1<<PB1);
TCCR1A=(1<<COM1A1)|(1<<WGM11);
TCCR1B=(1<<WGM13)|(1<<WGM12)|(1<<CS11);
ICR1=39999;
esc_us(1000); _delay_ms(3000); // арминг
for(;;){
for(uint16_t us=1000; us<=2000; us+=10){ esc_us(us); _delay_ms(30); }
for(uint16_t us=2000; us>1000; us-=10){ esc_us(us); _delay_ms(30); }
}
}
Сборка: avr-gcc -mmcu=atmega328p -DF_CPU=16000000UL -Os файл.c -o файл.elf
Пояснения
ВНИМАНИЕ: снимайте винты при тестах! Многие ESC требуют старта с 1000 мкс (арминг).