Forum: Mikrocontroller und Digitale Elektronik TI TMS470 HET - 3 PWM, gleiche Freq. unterschiedl. Duty/Cycle - Problem mit begrenzter Auflösung


von Chris B. (cbb)


Lesenswert?

Hi zusammen,

ich möchte, wie im Betreff geschrieben, 3PWM Signale mit gleicher 
Frequenz und unterschiedlichem Puls-Pausen-Verhältnis mit dem 470R1B1M 
Controller erzeugen.

Das klappt soweit auch ganz gut. Ich bin nur mit der Auflösung des 
Puls-Pauses-Verhältnisses nicht zufrieden. Dieses kann ich nur in 66 
Schritten bei einer Frequenz von 50kHz einstellen.

Nun zum Grund, weshalb es nur so grob eingestellt werden kann:

Die Frequenz des Quarzes beträgt 10MHz, mit der PLL wird dann eine 
Taktfrequenz von 40MHz erreicht.

Im HETGCR Register habe ich den LR-Prescaler auf 1 und den HR-Prescaler 
auf 12 eingestellt.
Dies kann nicht verringert werden, da das HET Programm ansonsten nicht 
abgearbeitet werden kann.

Somit komme ich auf 40Mhz/12=ca. 3,3MHz.
Um die Frequenz dann auf 50KHz einzustellen muss ich den Counterwert des 
PWMs auf 66 stellen. (3,3MHz/50000Hz=66)

Hier noch der HET Programmcode:
1
; Implement a counter that uses register A and rolls over at 0x042 (ergibt ca. 50kHz)
2
L00: CNT  {next=L01, reg=A, irq=OFF, max=0x0042, data=0}
3
4
; PWM (20% duty cycle PIN0) Aktuallisierung des Duty/Cycle im Hauptprogramm
5
L01: ECMP {next=L02, reg=A, hr_lr=LOW, en_pin_action=ON, pin=CC0, action=PULSELO,
6
           irq=Off, data=0x000D}         
7
8
; When count reaches 0, trigger interrupt. Now the ISR loads
9
; a new data value into the MOV32 instruction.
10
L02: ECMP {next=L03, reg=A, hr_lr=LOW, en_pin_action=OFF, pin=CC0,
11
           cond_addr=L03, irq=ON, data=0x0 }
12
13
; When count reaches 0x42, load the next ECMP compare value used
14
; for PWM generation.
15
L03: ECMP {next=L04, reg=A, hr_lr=LOW, en_pin_action=OFF, pin=CC0,
16
           cond_addr=L04, irq=OFF, data=0x0042 }
17
18
; Load ECMP data value with the value stored in the MOV32 instruction
19
L04: MOV32 {next=A01, remote=L01, control=OFF, init=OFF, type=IMTOREG&REM,
20
            reg=NONE, data=0x0, hr_data=0x0}
21
22
; PWM (20% duty cycle PIN2) Aktuallisierung des Duty/Cycle im Hauptprogramm
23
A01: ECMP {next=A02, reg=A, hr_lr=LOW, en_pin_action=ON, pin=CC2, action=PULSELO, irq=Off, data=0x000D}
24
           
25
A02: ECMP {next=A03, reg=A, hr_lr=LOW, en_pin_action=OFF, pin=CC2,
26
           cond_addr=A03, irq=ON, data=0x0 }
27
           
28
A03: ECMP {next=A04, reg=A, hr_lr=LOW, en_pin_action=OFF, pin=CC2,
29
           cond_addr=A04, irq=OFF, data=0x0042 }
30
           
31
A04: MOV32 {next=B01, remote=A01, control=OFF, init=OFF, type=IMTOREG&REM,
32
            reg=NONE, data=0x0, hr_data=0x0}
33
            
34
;PWM (20% duty cycle PIN3) Aktuallisierung des Duty/Cycle im Hauptprogramm           
35
B01: ECMP {next=B02, reg=A, hr_lr=LOW, en_pin_action=ON, pin=CC3, action=PULSELO,
36
           irq=Off, data=0x000D} 
37
           
38
B02: ECMP {next=B03, reg=A, hr_lr=LOW, en_pin_action=OFF, pin=CC3,
39
           cond_addr=B03, irq=ON, data=0x0 }
40
           
41
B03: ECMP {next=B04, reg=A, hr_lr=LOW, en_pin_action=OFF, pin=CC3,
42
           cond_addr=B04, irq=OFF, data=0x0042}
43
           
44
B04: MOV32 {next=L00, remote=B01, control=OFF, init=OFF, type=IMTOREG&REM,
45
            reg=NONE, data=0x0, hr_data=0x0}

Im Hauptprogramm verändere ich die Puls-Pausen-Verhältnisse aller 3 
Ausgänge in gewissen Zeitabständen, aber nicht jedes mal, wenn der 
Counter überläuft.

Hat jemand eine Idee, wie ich die Auflösung des 
Puls-Pausen-Verhältnisses verbessern kann? (Durch Codeverbesserungen) 
Eine Auflösung von ca. 200 Schritten wäre wünschenswert.
Besser geht natürlich auch noch. ;)

Ich habe nur die Möglichkeit gefunden den Quarz durch einen anderen zu 
ersetzten um dann dann auf die maximalen 60Mhz zu kommen. Somit hätte 
ich eine Auflösung von 100 Schritten bei 50kHz mit 60MHz Taktfrequenz.
Eine andere Möglichkeit ist die Frequenz von 50kHz auf 40KHz zu 
verringern, allerdings möchte ich diese nicht noch tiefer ansetzen.
Geringer geht nicht!
Ein anderer Controller kommt auch nicht in Frage. ;)

Diese Dokumente von TI habe ich gelesen:

http://www.ti.com/lit/ug/spnu199d/spnu199d.pdf
http://www.ti.com/lit/ug/spnu495a/spnu495a.pdf


Gruß Chris

von Chris B. (cbb)


Lesenswert?

Hi zusammen,

hat wirklich Niemand soetwas schonmal gemacht?

Viele Grüße

Chris

von Matthias (Gast)


Lesenswert?

Nein, aber das werde ich jetzt machen müssen. Verstehen tue ich 
überhaupt nichts. Wie das mit den Registern und überhaupt der komische 
Code Funktioniert.

gruß
Matthias

von Chris B. (cbb)


Lesenswert?

Hi Matthias,

wenn du etwas neues weißt, dann lass es mich bitte wissen.
Ich bin auch noch mit diesem Problem beschäftigt, habe jedoch noch 
andere
Probleme zu Lösen, sodass ich dieses erstmal "aufgeschoben" hatte.

Danke und grüße
Chris

von Matthias (Gast)


Lesenswert?

Hallo Chris,

Es gibt jetzt eine HET IDE, ein Entwicklertool mit Simulation der 
auszugebenden Signale.

http://www.ti.com/tool/het_ide

Gruß
Matthias

von Chris B. (cbb)


Lesenswert?

Hi Matthias,

danke für die Info.
Muss mich mal dadurcharbeiten.
Ich muss von meinem Hauptprogramm die PWM Ausgänge wechseln und die 
Puls-/ Pausenverhältnisse einstellen können...

Grüße Chris

von Matthias (Gast)


Lesenswert?

Was ich bis jetzt nicht hinbekomme ist, dass der HET selbständig läuft.

Das Programm wird in den Speicher geladen und die Register werden auch 
richtig gesetzt aber es will einfach nicht laufen.

Gruß
Matthias

von Matthias (Gast)


Lesenswert?

Es Läuft !

von Chris B. (cbb)


Lesenswert?

Hi,

wie bist du vorgegangen?
Mit dem Tool?
Was hast du mit dem HET realisiert?

grüße

von matthias (Gast)


Lesenswert?

Hallo,

Habe ein PWM Signal mit veränderbaren Duty Cycle, ein Signal das mir 
einmalig fünf mal ein Low Signal macht und das einlesen und erkennen 
Steigender Flanken realisiert.

Zum dem Tool HET-IDE gibt es noch ein PDF Getting Started, darin steht 
wie man alles einstellen muss um in der Simulation (Wave Former) alles 
richtig angezeigt zu bekommen.

Sind Sie mit Ihrem Problem weiter gekommen ?

So wie ich das jetzt verstanden habe, müssen Sie den LRP mindestens auf 
16 einstellen, dabei können Sie den HRP So niedrig wie gewünscht 
setzten. Lasse mich aber gerne eines besseren belehren.

von matthias (Gast)


Lesenswert?

1
  PEnable_B1 =  0x1;    /* enable peripherals (HET) */
2
3
  ClkMaster_B1 = 0x1;    /* Set CLK MASTER/SLAVE register of Master */
4
5
  /* Copy HET code in HET RAM */
6
  memcpy((void *) &e_HETPROGRAM0_UN, (const void *) HET_INIT0_PST, sizeof(HET_INIT0_PST));
7
8
  LRPrescale_B3 = 0x3;   /* Set LRP register*/
9
10
  HRPrescale_B6 = 0x1d;   /* Set PFR register 0x23*/
11
12
  PowerDown_B1 = 0x0;   /* Set Power Down register 0=OFF Power Down is OFF */
13
14
  TurnOn_B1 = 0x1;  /* Set TURN ON/OFF register ON*/

von Chris B. (cbb)


Lesenswert?

Hi,

ich habe bis jetzt mit dem HET nichts mehr gemacht,
da ich an der weiteren Hardware noch zu tun habe/hatte.

Was mneinen Sie mit LRP auf 1 stellen?

Ich brauche bei 40MHz mit meinem aktuellen Code um auf 50kHz PWM 
frequenz zu kommen einen LR-Prescaler von 1 und einen HR-Prescaler
von 12.

Andere Möglichkeit wäre, da immer nur ein PWM Pin aktiviert sein 
muss/kann, nur die PWM Kanäle also auf welchem Pin das Signal kommt, vom 
Hauptprogramm aus zu ändern.
Haben Sie soetwas realisiert, oder wissen wie ich auf den HET zugreife 
vom Hauptprogramm aus um den PWM Ausgangs PIN zu wechseln?
Wir können auch gerne mal Email Adressen austauschen und so weiter
schreiben, wenn sie sich hier anmelden.

Grüße

von Ralph (Gast)


Lesenswert?

Alsoooo,

Der HET kann mit einigen Befehlen und auf einigen Pins auch mit 
Highresolution Ausgeben und Messen.

Welche Pins und welche Befehle das sind hängt von der Prozessorversion 
ab.
Steht im Datenblatt.

LR meint das ist die Zeit zwischen 2 HetProgramm starts.
Also bei "0" startet das Hetprogramm und läuft bis zur letzten 
Instruktion.
Dann wartet der HET bis LR angelaufen ist und startet das Program wieder 
bei "0" + LowResolutionLooptime. usw......

HR ist die Highresolution.
Aus dem ersten Text : 40Mhz/12=ca. 3,3MHz.
==> highresolution ist 200 nsec


50 kHz => 240µsec

Das heißt die PWM kann bei Verwendung der highresolution mit einer 
Auflösung von 240µsec/ 200nsec = 1200 Schritten laufen.

von matthias (Gast)


Lesenswert?

Hallo Ralph,

sprich, wenn ich ein HET Programm mit 13 Instructions hab, muss ich 
meinen
Loop Resolution Prescaler (LRP) auf 16 setzen (im Register 0x4), damit 
das HET Programm abgearbeitet werden kann bevor LR abgelaufen ist, 
stimmt das so?

Den HRP kann man dann so wählen wie man möchte, um so kleiner um so 
höher die Auflösung.
Oder einfacher ausgedrückt: Um so höher kann in der CNT Instruction 
gezählt werden.

Wie kommen Sie bei

40Mhz/12=ca. 3,3MHz.
==> highresolution ist 200 nsec

und

50 kHz => 240µsec

auf die Zeiten.


___________________________________________________________________


Hallo Chris,


Um auf das Control field zuzugreifen:
1
ECMP_INSTRUCTION  HETinst_ecmp;
2
3
4
HETinst_ecmp.memory.control_word  = HET_L02.memory.control_word;  /* Read */
5
HETinst_ecmp.ecmp.en_pin_action = 1;   /* set only the bit en_pin_action*/
6
HET_L02.memory.control_word = HETinst_ecmp.memory.control_word ;   /* Write */

für das Data field von MOV32:
Wird in Shadowregister geladen und MOV32 holt es sich dann von dort.
1
HET_L04_0.memory.data_word = 0xfffff;

von matthias s. (matthias_s80)


Lesenswert?

Bin jetzt übrigens angemeldet.

gruß Matthias

von Chris B. (cbb)


Lesenswert?

Hi,

bei mir handelt es sich um den Mikrocontroller TMS470 R1B1M.
Ich denke ihr werdet mit neueren Controllern zu tun haben?

Ich komme bei 3,3MHz sowie 50kHz auch nicht auf die genannten Zeiten.
Irgenwo hat einer von uns einen Denkfehler.

Ich komme auf ca.: 0,3µS bei 3,3MHz
                   20µS bei 50kHz

--> 20µ/0,3µ = 66 was meine Auflösung ist.

@Matthias, was für einen Controller und Entwicklungsumgebung verwendest 
Du?
Ich denke die Bitdefinitions bzw. Registerbezeichnungen sind 
verschieden, wenn ich das so sehe.

Grüße

von matthias s. (Gast)


Lesenswert?

@Chris

Eigentlich dürften die sehr Gleich sein: TMS470R1x

Für den C-Code nehme ich entweder Eclipse oder Notepad++

Für den HET die HET-IDE. Die gibt es bei TI zum herunterladen.

std_het.h nicht vergessen.

Du müsstest eigentlich wenn du mit dem HET arbeitest dir noch eine
typedef volatile struct anlegen für die HET und das MMC Register 
anlegen.

Beispiel:
1
#define HET_B    0xAdresse
2
3
4
5
typedef volatile struct HET
6
{
7
    union
8
    {
9
         unsigned long Het_Gcr;
10
         {
11
              unsigned             :7;
12
              unsigned PowerDown   :1;
13
              unsigned             :7;
14
              unsigned ClkMaster   :1;
15
              ...
16
              ...
17
         }gcr;
18
     }gcr_un;
19
20
    union
21
    {
22
         unsigned long Het_Pfr;
23
         {
24
               ....
25
26
usw.

von Ralph (Gast)


Lesenswert?

Chris B. schrieb:
> Ich komme bei 3,3MHz sowie 50kHz auch nicht auf die genannten Zeiten.
> Irgenwo hat einer von uns einen Denkfehler.
>
> Ich komme auf ca.: 0,3µS bei 3,3MHz
>                    20µS bei 50kHz
>
> --> 20µ/0,3µ = 66 was meine Auflösung ist.

Ja ich, deine Zahlen sind richtig, frag mich nicht was ich da für einen 
Müll in den Rechner getippt hat.

Hier ist ein Link zum HET datasheet bei Ti.
http://www.ti.com/litv/pdf/spnu199d

Auf Seite 32 ist ein Beispiel wie die Einstellungen berechnet werden 
können.
In dem Beispiel hat der Het eine highresolution von 62,5 nsec bei einer 
Loopresolution von 2 µsec.
also max PWM frequenz wäre 1 / 2µsec bei einer Auflösung von 62,5 nsec
Und du kannst 63 Instructions abarbeiten.
Sysclock ist da 32 MHz.

Sollte also zu deinen Parametern passen.
Du kannst an dem Beispiel aber auch leicht mit deinen Parametern die 
richtigen Werte ausrechnen.

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.