DMC.22 · Приём управления · ATmega328P
Задача
Сгенерировать PPM-поток из 8 каналов для подачи на полётный контроллер/симулятор.
Алгоритм
Для каждого канала: короткий стартовый импульс + пауза = значению; в конце кадра длинная синхропауза до 22.5мс.
Исходный код (C, avr-gcc)
#ifndef F_CPU
#define F_CPU 16000000UL
#endif
#include <avr/io.h>
#include <util/delay.h>
#define NCH 8
uint16_t ch[NCH]={1500,1500,1000,1500,1000,1000,1000,1000};
static void pulse(void){ PORTB|=(1<<PB1); _delay_us(300); PORTB&=~(1<<PB1); }
int main(void){
DDRB|=(1<<PB1);
for(;;){
uint16_t frame=0;
for(uint8_t i=0;i<NCH;i++){
pulse();
_delay_us(1); // компенсация
for(uint16_t k=0;k<ch[i]-300;k++) _delay_us(1);
frame+=ch[i];
}
pulse();
while(frame<22500){ _delay_us(10); frame+=10; } // синхропауза до 22.5мс
}
}
Сборка: avr-gcc -mmcu=atmega328p -DF_CPU=16000000UL -Os файл.c -o файл.elf
Пояснения
Полярность и длительности подгоняют под приёмник. Здесь программная генерация задержками.