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.
Mir fehlt da irgendwo die konkrete Frage. Wird das wieder so ein "Würmer-aus-der-Nase-zieh"-Thread?
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); } } }
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.
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.
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 :)
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.