# PWM zu PPM wandeln

Hallo ich habe mich mal wieder an meinen Wandler gsetzt un komme nicht weiter.
Er funktioniert erstmal.

Funktion ist simpel A0-5 dienen als Input von den PWM signalen und PIN10 als Output.
Dass Problem liegt darin das die PPM Signale um 40 Einheiten Pendeln.
Beispiel ein Signal von 1500 ist mal 1480 oder mal 1520.

Zurzeit benutze ich einen Arduino Nano.

``````//this programm will put out a PPM signal

//////////////////////CONFIGURATION///////////////////////////////
#define chanel_number 6  //set the number of chanels
#define default_servo_value 1500  //set the default servo value
#define PPM_FrLen 22500  //set the PPM frame length in microseconds (1ms = 1000µs)
#define PPM_PulseLen 300  //set the pulse length
#define onState 1  //set polarity of the pulses: 1 is positive, 0 is negative
#define sigPin 10  //set PPM signal output pin on the arduino
//////////////////////////////////////////////////////////////////

/*this array holds the servo values for the ppm signal
change theese values in your code (usually servo values move between 1000 and 2000)*/
int ppm[chanel_number];

void setup(){
//initiallize default ppm values
for(int i=0; i<chanel_number; i++){
ppm[i]= default_servo_value;
}

pinMode(sigPin, OUTPUT);
digitalWrite(sigPin, !onState);  //set the PPM signal pin to the default state (off)

cli();
TCCR1A = 0; // set entire TCCR1 register to 0
TCCR1B = 0;

OCR1A = 100;  // compare match register, change this
TCCR1B |= (1 << WGM12);  // turn on CTC mode
TCCR1B |= (1 << CS11);  // 8 prescaler: 0,5 microseconds at 16mhz
TIMSK1 |= (1 << OCIE1A); // enable timer compare interrupt
sei();
}

void loop(){

ppm[0] = pulseIn(A0, HIGH, 30000);
ppm[1] = pulseIn(A1, HIGH, 30000);
ppm[2] = pulseIn(A2, HIGH, 30000);
ppm[3] = pulseIn(A3, HIGH, 30000);
ppm[4] = pulseIn(A4, HIGH, 30000);
ppm[5] = pulseIn(A5, HIGH, 30000);

delay(10);
}

ISR(TIMER1_COMPA_vect){  //leave this alone
static boolean state = true;

TCNT1 = 0;

if(state) {  //start pulse
digitalWrite(sigPin, onState);
OCR1A = PPM_PulseLen * 2;
state = false;
}
else{  //end pulse and calculate when to start the next pulse
static byte cur_chan_numb;
static unsigned int calc_rest;

digitalWrite(sigPin, !onState);
state = true;

if(cur_chan_numb >= chanel_number){
cur_chan_numb = 0;
calc_rest = calc_rest + PPM_PulseLen;//
OCR1A = (PPM_FrLen - calc_rest) * 2;
calc_rest = 0;
}
else{
OCR1A = (ppm[cur_chan_numb] - PPM_PulseLen) * 2;
calc_rest = calc_rest + ppm[cur_chan_numb];
cur_chan_numb++;
}
}
}
``````

Dieser Code ist nur von mir angepasst nicht selbstgeschrieben

Die PWM-Signale sind gut?

Ohne den Code jetzt genau verstanden zu haben, denke ich auf jeden Fall, dass die Verwendung von pulseIn suboptimal ist, da blockierend

Ja das ist auch das Problem den vorher ohne pulsin ging es auch.

Aber irgendwie muss ich ja das PWM signal auslesen

Da gibt es ne Lib für, die macht das mit irq. Rclib oder so.