Forum: Mikrocontroller und Digitale Elektronik Problem mit Interrupt Service Routine


von Max (Gast)


Lesenswert?

Hallo zusammen,

ich benutze einen TI Mikrocontroller (TMS320F28335). Ich benutze drei 
PWM-Ausgänge, um drei phasenversetzte Sinuse zu modellieren (einen 
Drehstrom).

Dazu habe ich eine Sinus Tabelle und eine ISR, in welcher das Problem 
auftritt. In der ISR update ich den duty cycle der PWM und hole mir dazu 
Werte aus der Tabelle.

Jetzt tritt folgendes Problem aus: Verwende ich 2 der 3 Module, 
funktioniert alles so wie ich mir es vorstelle. Der Witz an der Sache 
ist, es ist egal welche der 2 Module ich verwende, es funktioniert 
immer.

Verwende ich jetzt allerdings alle 3 Module, klappt nichts mehr. Die PWM 
ist einfach je nach Kanal 0 oder 1.

Das macht mich ziemlich ratlos - ich habe keine Idee, woran das liegen 
könnte.

Nachfolgend ein Code-Schnippsel, der Ärger macht (Sinus-Tabelle mit 512 
Werten).

So geht's:
1
EPwm1Regs.CMPA.half.CMPA = Sinustab[(int) aktuell];
2
3
//EPwm2Regs.CMPA.half.CMPA = Sinustab[(int) aktuell + 171];
4
5
EPwm3Regs.CMPA.half.CMPA = Sinustab[(int) aktuell + 341];

So geht's nicht:
1
EPwm1Regs.CMPA.half.CMPA = Sinustab[(int) aktuell];
2
3
EPwm2Regs.CMPA.half.CMPA = Sinustab[(int) aktuell + 171];
4
5
EPwm3Regs.CMPA.half.CMPA = Sinustab[(int) aktuell + 341];

von Karl H. (kbuchegg)


Lesenswert?

Das
1
                .....
2
                aktuell + 341

hätte ich da so jetzt nicht erwartet.
In so einem Ausdruck taucht normalerweise die Arraygröße in irgendeiner 
Form auf, sodass sich rechnerisch zu große ergebende Indizes wieder bei 
0 anfangen.

Beispiel:
ist dein Array 8 Elemente gross, dann gibt es die Felder mit den Indizes

   0, 1, 2, 3, 4, 5, 6, 7

angenommen aktuell hätte den Wert 6. Welches ist dann das Element 4 
Indizes weiter?
6 + 4 macht 10. 10 kann aber nicht sein, denn das Array hat nur gültige 
Indizes von 0 bis 7. Die richtige Antwort ist

   ( 6 + 4 ) % 8

also

   10 % 8

oder eben 2.
Das Element mit dem Index 2 ist dasjenige, auf welches man stösst, wenn 
man vom Feld mit dem Index 6 ausgehend 4 Elemente nach rechts kommt 
(wobei man wieder vorne anfängt, wenn man hinten rausfällt)

d.h.
da hätte ich erwartet, so etwas zu sehen
1
                .....
2
            ... [ ( aktuell + 341 ) % Sinustab_Grösse ];

von Max (Gast)


Lesenswert?

Hallo,

danke erstmal. Ich habe dahinter noch eine einfache if-Abfrage, die 
checkt, ob das Ende meines Arrays erreicht wurde. Ggf. beginnt meine 
Variable 'aktuell' wieder am Anfang des Arrays.

von Max (Gast)


Lesenswert?

Jede Idee wäre willkommen :-(

von Wolfgang (Gast)


Lesenswert?

Max schrieb:
> Jede Idee wäre willkommen :-(

Dann ersetze doch mal
1
(int) aktuell + offsetX
 durch
1
((int) aktuell + offsetX) & 0x01ff

Max schrieb:
> Ich habe dahinter noch eine einfache if-Abfrage, die checkt, ob das Ende
> meines Arrays erreicht wurde. Ggf. beginnt meine Variable 'aktuell'
> wieder am Anfang des Arrays.

Da wird das Problem liegen. Wenn 'aktuell + 341' schon größer als 511 
ist, kann 'aktuell' immer noch kleiner sein.
Warum verwendest du eigentlich einen vorzeichenbehafteten Datentyp für 
einen Array-Index?

von Max (Gast)


Lesenswert?

Das wars, besten Dank Wolfgang!

Den (int) verwende ich, weil meine Laufvariable durch die Sinustabelle 
ein double ist. Ich nehme nicht immer sofort den nächsten Wert aus 
meiner Tabelle
1
aktuell += 1;

sondern auch manchmal ein paar Mal den gleichen
1
aktuell += 0.1

von Karl H. (kbuchegg)


Lesenswert?

Max schrieb:
> Das wars, besten Dank Wolfgang!
>
> Den (int) verwende ich, weil meine Laufvariable durch die Sinustabelle
> ein double ist.

Hä?
Was hat das eine mit dem anderen zu tun?



Kopfklatsch.
Nein. das war nicht gemeint.
Der Index in ein Array kann an dieser Stelle nur positiv sein. Da kann 
(zumindest bei dir hier) keine negative Zahl rauskommen.

Daher wäre ein unsigned int angebracht und kein int.

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.