Forum: Compiler & IDEs Orange RX mit Atmega8 auslesen


von Marc H. (martrixmarc)


Lesenswert?

Hey Leute, ich habe mir einen Orange RX Fasst 2.4ghz Empfänger gekauft 
und würde gerne diesen mit einem Atmega 8 auslesen, sprich die einzelnen 
Kanäle um dann per PWM verschiedene Motoren anzusteuern.

Am ende soll ein Quadcopter damit gesteuert werden, aber leider 
scheitere ich ja schon beim Einlesen vom Steuersignal.

von Daniel H. (Firma: keine) (commander)


Lesenswert?

Mir fehlt da irgendwo die konkrete Frage.

Wird das wieder so ein "Würmer-aus-der-Nase-zieh"-Thread?

von Marc H. (martrixmarc)


Lesenswert?

Die Konkrete frage ist, wie kann ich das signal nun am Besten auslesen.
Ich hab versucht die Steigende Flanke einzulesen, die Zeit mitzuzählen 
bis die Flanke wieder fällt, aber irgendwas stimmt da nicht.

#define F_CPU 16000000UL

#include <avr/io.h>
#include <avr/interrupt.h>

volatile int flanke=0;
volatile int aktuell_pwm_l=0;
volatile int aktuell_pwm_h=0;

ISR(TIMER1_CAPT_vect)
{
  if (flanke==0)
  {
    TCNT1H = 0;
    TCNT1L = 0;
    TCCR1B&= ~(1<<ICES1);
    flanke=1;
  }
  else
  {
    flanke=0;
    TCCR1B|=(1<<ICES1);
    aktuell_pwm_l=ICR1L;
    aktuell_pwm_h=ICR1H;
  }
}

void init_prozedur(void)
{
  TCCR1B |= (1<<WGM12) | (1<<ICNC1)|(1<<ICES1)|(1<<CS11) | (1<<CS10);
  TIMSK |= (1<<TICIE1);

  sei();
}

int main (void)
{
  init_prozedur();

  DDRB = (1<<PB0);
  TCCR1A = (1<<WGM10)|(1<<COM1A1)|(1<<COM1B1);

  while(1)
  {
    if (aktuell_pwm_l >= 120 && aktuell_pwm_l < 125)
    {
      PORTB = (1<<PB0);
    }
  }
}

von Max H. (hartl192)


Lesenswert?

Ich habe es so gelöst: Mit einem PIC16 die einzelnen Signale zum 
Summensignal zusammengefasst und dieses dann mit dem Input Capture des 
Hauptcontrollers ausgewertet.

von Bussard (Gast)


Lesenswert?

Ist das nun nur so zum Basteln/ Lernen? Dann ist es OK.
Denn fertige, funktionierende Lösungen zur Kopter/Motor-Steuerung gibt 
ja zu Hauf.

von Marc H. (martrixmarc)


Lesenswert?

Es geht darum das ich das ganze als Diplomarbeit mache und im Zuge 
dessen neue Technologien verwenden will.

Ich habe das ganze jetzt zum laufen bekommen und konnte den Motor 
Regeln, vielen dank aber für eure Hilfe :)

von Daniel H. (Firma: keine) (commander)


Lesenswert?

Es wäre nett wenn du die Lösung noch posten würdest, ansonsten kommt in 
zwei Jahren wieder jemand an, der wegen des gleichen Problems deinen 
Thread per Google gefunden hat, und fragt nach der Lösung.

von Max H. (hartl192)


Lesenswert?

Für Quellcode bitte die Formatierung verwenden:
1
[c]C-Code[/c]

von Marc H. (martrixmarc)


Lesenswert?

1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#include <util/delay.h>
4
#include "lcd_routines.h"
5
6
#define F_CPU 3686400UL
7
8
9
10
volatile int flanke=0;
11
volatile int aktuell_pwm_l=0;
12
volatile int aktuell_pwm_h=0;
13
14
ISR(TIMER1_CAPT_vect)
15
{
16
  if (flanke==0)
17
  {
18
    TCNT1H = 0;             //Timer auf null zurück
19
    TCNT1L = 0;
20
    TCCR1B&= ~(1<<ICES1); //ICP-Pin auf fallende Flanke einstellen
21
    flanke=1;
22
  }
23
  else
24
  {
25
    flanke=0;
26
    TCCR1B|=(1<<ICES1);    //ICP auf steigende Flanke wieder aktivieren
27
    aktuell_pwm_l=ICR1L;    //Zählerstand speichern
28
    aktuell_pwm_h=ICR1H;    //zählerstand speichern
29
  }
30
}
31
32
void init_prozedur(void)
33
{
34
  TCCR1B |=  (1<<ICNC1)|(1<<ICES1)|(1<<CS11) | (1<<CS10); //vorteiler 64, Mittelung ON, steigende flanke
35
  TIMSK |= (1<<TICIE1);//INTERRUPT ON
36
37
  sei();
38
}
39
40
int main (void)
41
{
42
  lcd_init();
43
  init_prozedur();
44
  DDRC=0xff;
45
  DDRB=0b11110000;
46
   DDRB |= (1 << DDB3);
47
  while(1)
48
  {
49
    lcd_setcursor(1,0);
50
    lcd_string("ADC=");
51
    lcd_setcursor(1,4);        // Cursor positionieren
52
    lcd_string("    ");    // alte Zahl loeschen
53
54
    lcd_setcursor(1,4);        // Cursor positionieren
55
    lcd_write_zahl(aktuell_pwm_l);
56
57
    TCCR2 |= (1 << COM21);
58
    // set none-inverting mode
59
60
    TCCR2 |= (1 << WGM21) | (1 << WGM20);
61
    // set fast PWM Mode
62
63
    TCCR2 |= (1 << CS21);
64
    // set prescaler to 8 and starts PWM
65
66
    if (aktuell_pwm_l >= 0 && aktuell_pwm_l < 19)
67
    {  
68
      OCR2 = 10;
69
    }
70
    if (aktuell_pwm_l >= 19 && aktuell_pwm_l < 21)
71
    {
72
    OCR2 = 150;
73
    }
74
    if (aktuell_pwm_l >= 21 && aktuell_pwm_l < 23)
75
    {
76
      OCR2 =180;
77
    }
78
    if (aktuell_pwm_l >= 23 && aktuell_pwm_l < 25)
79
    {
80
      OCR2 = 210;
81
    }
82
      if (aktuell_pwm_l >= 25 && aktuell_pwm_l < 28)
83
    {
84
      OCR2 = 235;
85
    }
86
      if (aktuell_pwm_l >= 28 && aktuell_pwm_l < 35)
87
    {
88
      OCR2 = 256;
89
    }
90
91
    
92
    
93
    
94
  }
95
}

Das wart dann mein finaler Code :)

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.