Hallo uC-Community, ich habe mit eurer Hilfe ein Programm für eine PWM-Abtastung erstellt. (Topic vom 27.06.11: Beitrag "Erfassung PWM Signal und verarbeiten" ) Das Programm läuft soweit ganz gut,vielen Dank noch mal an alle Helfer ;), nur leider ist jetzt ein weiteres komplexes Problem hinzugekommen. Und zwar habe ich natürlich seit der Entwicklung der Software weitere Softwareteile hinzugefügt. Jetzt habe ich folgendes Problem: Ich habe meine PWM-Abtastung(die PWM 1kHz aus einem Steuergerät) durch den Timer0 realisiert. Dadurch habe ich das Verhaeltnis errechnet dieses wiederum für ein normales PWM-Signal für einen BL-Motor verwendet wird. Nun bin ich an einer fortgeschrittenen Stelle, in der ich mehrere Programmteile zusammengefügt habe. Durch das Gesamtprogramm verändert sich jetzt mein Programmzyklus(oder auch Abtastzeit) meines Programmdurchlaufs. Leider weiß ich nicht warum sich diese Zeit ändert, logisch wäre mir durch die vielen Rechenaufgaben des Gesamtprogramms, dachte aber damit hat der uC keine Probleme verwende einen AtMega644,20Mhz,programmiere in C). "Nachgwiesen" habe ich die Veränderung einfach durch ein Osci. Ohne den "kritischen Programmteil" benötigt mein Programm 7,52us mit dem "kritischen Programmteil" 320us. Kann das Auswirkungen auf meine Timer haben, das die irgendwie nicht zu ende laufen oder mehrere OVF haben ?? ich habe keine Ahnung... Auf jeden Fall bekomme ich dadurch, obwohl ich die PWM am Steuergerät nicht ändere (sagen wir 5%DutyCycle) jeden Zyklus ein anderes PWM-Verhältnis (meist auch über 100% -.-) dadurch wird auch mein Motor extrem belastet, schwingt und quietscht ... So an dieser Stelle brauche ich eure Hilfe habe keinen besonderen Lösungsansatz. Ideen wären: 2 uC verwenden, den einen für die Berechnung des PWM-Signal aus dem Steuergerät, den anderen für die Ausführung des restlichen Programms. Sonst fällt mir nichts mehr ein, danke für eure Hilfe.. So ein langer Text ich hoffe ich konnte das technische Problem einigermaßen gut beschreiben wenn ihr meinen C-Code benötigt einfach posten. dennis
Dennis schrieb: > hier die C-Datei, gute Idee ;-) > > dennis ( gibt es eine möglichkeit den C-Code besser anzeigen zu lassen, habe ihn eigentlich schöner formatiert ? ansonsten sorry, ist blöd anzuschauen -.- )
HI >( gibt es eine möglichkeit den C-Code besser anzeigen zu lassen, habe >ihn eigentlich schöner formatiert ? ansonsten sorry, ist blöd >anzuschauen -.- ) Ja. Finger weg von der Tab-Taste. Am besten du klebst ein paar Reißzwecken mit der Spitze nach oben drauf. MfG Spess
Ho, die ganzen (0 << X) bringen dir übrigens gar nix in Verbindung mit |=, und in = sind sie bestenfalls überflüssig.
1 | TCCR0A |= (0<<COM0A1) | (0<<COM0A0) | (0<<WGM01) | (0<<WGM00); // T/C0 Control Register A: normaler Modus |
Schlimmstenfalls bleiben beriets gesetzte 1er im Register stehen. Zum Löschen von Bits geht
1 | DDRA &= ~(1<<PIN0); |
besser. Also: erst löschen, dann setzen, wenn es um einzelbits geht:
1 | DDRA &= ~(1 << PIN0); |
2 | DDRA |= (1 << PIN1); |
Oder als ganzes setzen (nicht "verwendete" werden ja automatisch zu null:
1 | DDRA = (1 << PIN0) | (1 << PIN1); |
Ansonsten: Im Editor einstellen, dass er TABs durch (2 oder 4) Leerzeichen ersetzen soll. Dann kannst auch wunderbar mit TAB einrücken. Sowas idR in mehrere Zeilen aufteilen:
1 | if (m < 1) { |
2 | TCNT0 = 0x00; i=0; start_algo(); |
3 | }
|
Wegen der deklaration verkürzt sich dieser Ausdruck sogar auf:
1 | volatile unsigned char m = 0; |
2 | ...
|
3 | if (m) { |
4 | TCNT0 = 0x00; i=0; start_algo(); |
5 | }
|
Im ganzen: Muss wirklich alles global deklariert werden? Schaut ja aus wie QBASIC :-) Ich hab mal nen Part auf die schnelle umgeschrieben & formatiert, wie ich es schreiben würde. Dabei hab ich auch die if(a >= x) rausgeworfen. Müsste man mal schauen, was der compiler draus macht, auf nem kleinen AVR bringts ev. was. Nicht perfekt aber ne Anregung :-)
1 | #define MAGIC_NUMBER 0x0f6d // hier latürnich was sinnvolles einbauen *g*
|
2 | |
3 | /*** INTERRUPT TIMER2 ***/
|
4 | ISR(TIMER2_OVF_vect) |
5 | {
|
6 | // ggf., um globales Zeug zu vermeiden, falls nur hier benötigt:
|
7 | // static unsigned int counter = 0, s_algo = 0;
|
8 | |
9 | counter++; // counter zaehlt die OVFs |
10 | s_algo++; |
11 | |
12 | /* Startalgorythmus des BL Motors */
|
13 | if(s_algo > 3) { |
14 | s_algo = 0; |
15 | |
16 | if(n != 1) { |
17 | start = OCR1A; |
18 | OCR1A++; |
19 | }
|
20 | }
|
21 | |
22 | if(start > MAGIC_NUMBER - 1) { |
23 | n = 1; |
24 | OCR1A = MAGIC_NUMBER; |
25 | }
|
26 | }
|
27 | |
28 | // ISR-Recieve Complete
|
29 | ISR( USART0_RX_vect ) |
30 | {
|
31 | char c; |
32 | |
33 | c = uart_getc(); |
34 | |
35 | switch (c) |
36 | {
|
37 | case '1': |
38 | uart_putc(sen_rps); //if(n<=>m){...} |
39 | break; |
40 | |
41 | case '2': |
42 | uart_putc(soll_wert); |
43 | break; |
44 | |
45 | case '3': |
46 | uart_putc(ausgang); |
47 | break; |
48 | |
49 | default:
|
50 | break; |
51 | }
|
52 | }
|
VG, /th.
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.