PPM Signal einlesen

Gast #526639
Lesenswert?

Hallo,
ich will von meinem Modellbauentpfänger mit meinem Mega32 auswerten. 
Dazu hab ich jetzt schon das Summensignal nach außen geführt und per OP 
auf 5V Pegel verstärkt. Dieses Signal habe ich an den ICP-Pin des AVRs 
gehängt.
Jetzt häng ich grad dran, wie ich das jetzt am besten auslese. Habt ihr 
da vielleicht ein paar Tips für mich? Ich brauch keinen Code, nur ein 
paar Denkanstöße, wie ich da jetzt am besten vorgehe!
Danke,
Christoph
Gast #527306
Lesenswert?

Bei dem Besipiel liest du aber nur einen servo kanal ein und nicht alle 
zusammengefasst als Summensignal, oder?
Mein Problem ist, wie ich die acht aufeinander folgenden Pulse mit Hilfe 
des Reset-signals den einzelnen Servor zuordne und zum Beispiel über 
einen Port am µC ausgebe.
Moderator Persönliche Seite #527354
Lesenswert?

Du wolltest doch aber auch noch was selbst tun dabei, oder? ;-)

Du musst dazu lediglich die ,,große'' Lücke entdecken, mit der die
Kanalblöcke voneinander getrennt werden.  Wenn du die zum ersten Mal
hast kannst du beginnen, die eingelesenen Werte auf N Kanäle
(typischerweise in einem Array, dessen Index hochgezählt wird)
abzuspeichern.

Für den ATmega32 kannst du natürlich auf den ganzen Assemblerkram
dabei verzichten und dir die reine C-Lösung, die als Beispiel für
den ATtiny45 drin ist, als Ausgangspunkt nehmen.

Meine Variante ist übrigens P*W*M, nicht P*P*M.  Das musst du also
ggf. anpassen.
Gast #533664
Lesenswert?

Also ich hab da jetzt nen bissl rumprobiert und wollt jetzt mal fragen, 
ob das so in der Richtung richtig ist (eigentlich das erste mal, dass 
ich was mit timern und interrupts mache)...

#include <avr/io.h>
#include <avr/inttypes.h>
#include <avr/delay2.h>
#include <avr/i2cmaster.h>
#include <avr/interrupt.h>

int puls=0, i=0, z=0;
int PPM[8]={0,0,0,0,0,0,0};

ISR(TIMER0_OVF_vect){
z++;
}


ISR(TIMER1_CAPT_vect) {
  puls = ICR1;
  if (puls>=8000) {          //Resetsignal
    i=0;
    TCNT1=0;
    }

  else {
    PPM[i]=puls;
    TCNT1=0;
    i++;
    }
}

int main(void)
{
  DDRA = 0xff;             //Motoren ausgang
  PORTA |= (1<<DDA4);          //enablen
  PORTA |= (1<<DDA5);          //enablen
  sei();               //interrupt ein
  uart_init(UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU));
  TCCR1B = (1<<ICES1)|(1<<CS11);     //steigende Flanke; Prescaler 8 -> 
2000000Hz -> 8 Zähler entspricht 1 Prozent Servoweg (4µs)
  TIMSK = (1<<TICIE1)|(1<<TOIE0);   //capture event interrupt; Timer 
Overflow Interrupt
  TCCR0 = (1<<CS00)|(1<<CS02);     //Timer0; Prescaler 1024

...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren