DMC.25 · Приём управления · ATmega328P
Задача
Из каналов крена и тангажа получить сигналы двух рулевых поверхностей крыла.
Алгоритм
left = pitch + roll, right = pitch - roll, с центрированием 1500 мкс и ограничением 1000..2000.
Исходный код (C, avr-gcc)
#ifndef F_CPU
#define F_CPU 16000000UL
#endif
#include <avr/io.h>
static uint16_t clampus(int16_t v){ if(v<1000)v=1000; if(v>2000)v=2000; return v; }
void elevon(uint16_t roll,uint16_t pitch,uint16_t *left,uint16_t *right){
int16_t r=(int16_t)roll-1500, p=(int16_t)pitch-1500;
*left =clampus(1500 + p + r);
*right=clampus(1500 + p - r);
}
int main(void){
uint16_t l,rr;
elevon(1600,1450,&l,&rr);
(void)l;(void)rr;
for(;;){}
}
Сборка: avr-gcc -mmcu=atmega328p -DF_CPU=16000000UL -Os файл.c -o файл.elf
Пояснения
Знаки подбирают по реакции поверхностей. База для летающего крыла и дельты.