DMC.18 · Моторы и ESC · ATmega328P
Задача
Если новый пакет управления не пришёл дольше таймаута — принудительно перевести моторы в стоп.
Алгоритм
Таймер/счётчик времени с последнего валидного кадра; при превышении порога выход газа = 1000 мкс.
Исходный код (C, avr-gcc)
#ifndef F_CPU
#define F_CPU 16000000UL
#endif
#include <avr/io.h>
#include <util/delay.h>
int main(void){
DDRB|=(1<<PB5);
uint16_t since=0; const uint16_t TIMEOUT=50; // 50*10мс = 500мс
volatile uint8_t rc_new=0;
for(;;){
if(rc_new){ since=0; rc_new=0; } else since++;
if(since>=TIMEOUT){ PORTB|=(1<<PB5); /* motor=1000 (стоп) */ }
else PORTB&=~(1<<PB5);
_delay_ms(10);
}
}
Сборка: avr-gcc -mmcu=atmega328p -DF_CPU=16000000UL -Os файл.c -o файл.elf
Пояснения
Здесь моделируется счётчиком в главном цикле; в реальности обновляется по приходу кадра RC.