Gast
#3308245
Ho, Männer! Ich habe ein Problem bei meiner Motorsteuerung mittels ATmega32. Zunächst vermochte die Software so zu laufen wie ich es haben wollte! Jedoch habe ich anschließend die PWM-Frequenz geändert von 25Hz (alles prima!) auf 10kHz, da die bürstenbehafteten Motoren sonst sehr ruckelig liefen. PLÖTZLICH muss ich feststellen, dass der Timer Overflow Interrupt nicht mehr kommt, dies schließe ich daraus, dass ich die Impulse des Drehencoders am Motor1 nicht mehr per 'hterm' über die USART auslesen konnte (immer 0). Von vorne: • mittels Timer1 wird eine PWM generiert & an OCR1 (vorerst 25Hz, nun 10 kHz) [timer_init (); • über den ADC0 [adc_init ();] wird die zu fahrende Anzahl der Umdrehungen pro Richtungswechsel (rechts - links) mittels Drehschalter zehnmal über eine Einzelwandlung eingelesen [ADC_10_Messung ();], ein Mittelwert aus den Messungen gebildet [ADC_Mittelwert ();] und die Werte für die Anzahl der Umdrehungen gesetzt [Umdrehungszahl ();] und in ‚Umdrehungen‘ geschrieben • ‚Umdrehungen‘ lasse ich mit über die USART [usart_init ();] auf dem PC ausgeben[UDZ_zu_USART ();], bisher reibungslos! Was mich nun wundert ist folgendes: • ich berechne die Drehzahl (PWM des Timer1 – OCR1A/B) aus der analogen Spannung am ADC1 [Drehzahl_R ();], das klappt & deshalb wundert mich, dass der Timer1 dennoch seinen Capture Interrupt auslöst, jedoch (anscheinend) nicht den Overflow Interrupt, denn folgender Programmteil läuft nicht (mehr): t_Drehzahl (); // Drehzahl für eine bestimmte Zeit messen M1_zu_USART (); // Ausgabe der gemessenen Impulse von M1 an USART Zu t_Drehzahl (); gehört der folgende Code:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 | |
36 | |
37 | |
38 | |
39 | |
40 | |
41 | |
42 | |
43 | |
44 | |
45 | |
46 | |
Wäre nett, wenn mir damit jemand helfen kann. Die ISRs habe ich miteinander verschachtelt wie man unschwer erkennen kann (if-Abfragen). Vielleicht kann jemand noch einen Hinweis für einen charmanteren Lösungsweg geben. M1_zu_USART(); ist langweilig und sollte funktionieren, da ich die Umdrehungen nach dem gleichen Prinzip ausgebe. Den kompletten Quellcode habe ich dem Beitrag beigefügt. Habt Dank für jede Hilfe. Gruß