AFON // радиотехник affonya@mail.ru
← Все проекты для дронов

Генератор PPM

Формирование суммарного PPM-сигнала из массива каналов.

DMC.22 · Приём управления · ATmega328P

Задача

Сгенерировать PPM-поток из 8 каналов для подачи на полётный контроллер/симулятор.

Алгоритм

Для каждого канала: короткий стартовый импульс + пауза = значению; в конце кадра длинная синхропауза до 22.5мс.

Исходный код (C, avr-gcc)

⇩ Скачать 22-ppm-generate.c

#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

Пояснения

Полярность и длительности подгоняют под приёмник. Здесь программная генерация задержками.