Forum: Mikrocontroller und Digitale Elektronik frage zu C2000 F280049C von Ti mit CCS programmieren


von (unknown) (Gast)


Lesenswert?

Hallo Zusammen,

ich bin neuer in c2000 PICCOLO f280049c von Ti, ich brauche euere Hilfe 
um eine Einstellung für die ePWM.
ich habe ein Programm für die ePWM in CCS erstellt, meine ePWM sind von 
ADC abhängig, und jetzt finde ich Schwierigkeiten um die Pulse bei 
AdcResult=0 volt auf null zu setzen, ich habe mal Empfehlungen bekommen 
um die Trip zone zu benutzen, aber ich weiß nicht genau wie kann ich 
dieses Modul von Trip zone mit meinem Adc zu verbinden ?

kann jemand helfen ? Danke
VG
Yt

von Falk B. (falk)


Lesenswert?

Youssef T. schrieb:
> ich habe ein Programm für die ePWM in CCS erstellt, meine ePWM sind von
> ADC abhängig, und jetzt finde ich Schwierigkeiten um die Pulse bei
> AdcResult=0 volt auf null zu setzen,

Kann ich kaum glauben, denn der Wert 0 ist bei der PWM der C2000 CPUs 
nicht anders als jeder andere. Zeig uns mal deinen Quelltext als Anhang.

von (unknown) (Gast)


Angehängte Dateien:

Lesenswert?

Hi,
im Anhang ist mein Programm
Danke

von Falk B. (falk)


Lesenswert?

Youssef T. schrieb:
> Hi,
> im Anhang ist mein Programm
> Danke

Warum eine .txt Datei? Meine Quelltexte enden meistens auf .c Wenn man 
die direkt hochlädt, werden die nämlich auch mit schönem 
Syntax-Highlighting dargestellt.

Nun gut. Du nutzt diese komischen Konfigurationsfunktionen von TI. Die 
waren nie so mein Ding. Aber sie werden schon halbwegs funktionieren. 
Deine Hauptschleife ist sehr komisch.
1
    while(1)
2
            {
3
        EPWM_enableADCTrigger(EPWM8_BASE, EPWM_SOC_A);
4
        EPWM_setTimeBaseCounterMode(EPWM8_BASE, EPWM_COUNTER_MODE_UP);
5
        EPWM_disableADCTrigger(EPWM8_BASE, EPWM_SOC_A);
6
        EPWM_setTimeBaseCounterMode(EPWM8_BASE, EPWM_COUNTER_MODE_STOP_FREEZE);
7
            }

Was soll das? Ist dir klar, daß die CPU wie wahnsinning diese Funktionen 
aufsführt? Das bewirkt im einfachsten Fall nix, im Extremfall kommt was 
durcheinander, weil die Timer immer wieder neu konfiguriert werden. Wenn 
dein Konzept stimmt und der ADC periodisch durch einen Timer getriggert 
wird, ist deine Hauptschleife leer!!

So wird das nix. Du musst eine systematische Fehlersuche starten. Du 
hast bei den Echtzeitdebugger im CCS, da kann man viel machen.

Zuerst muss mal ein gescheites Konzept her, wie die Daten vom ADC in die 
PWM geladen werden. Wo und wie passiert das? Ok du hast eine ISR
1
{
2
      Ud1 = ADC_readResult(ADCARESULT_BASE, ADC_SOC_NUMBER6);   // Messung der ADC
3
      if (Ud1<819)
4
      {
5
          EPWM_setTimeBaseCounterMode(EPWM1_BASE, EPWM_COUNTER_MODE_FREEZE);
6
7
      }
8
      else
9
      {
10
              EPWM_setTimeBaseCounterMode(EPWM1_BASE, EPWM_COUNTER_MODE_STOP_FREEZE);
11
12
              dutyCycle =(Ud1*EPWM_TIMER_TBPRD/4095);             // Formel für die Berechnung von Duty_Cycle
13
              EPWM_setCounterCompareValue(EPWM1_BASE, EPWM_COUNTER_COMPARE_A, dutyCycle); //DutyCycle für ePWM1A
14
              EPWM_setCounterCompareValue(EPWM1_BASE, EPWM_COUNTER_COMPARE_B, (EPWM_TIMER_TBPRD-dutyCycle)); //DutyCycle für ePWM1B
15
              
16
17
      }
18
     
19
20
      ADC_clearInterruptStatus(ADCA_BASE, ADC_INT_NUMBER1);
21
      Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP1);
22
}

Dort wird ein Ergebnis gelesen. OK. Warum hältst du den Counter an? Das 
ist im Normalfall nicht nötig.

Wenn dein ADC immer durch die PWM getriggert wird, paßt das. Man liest 
den ADC und schreibt in die PWM. Fertig.

Test erstmal im CCS Debugger, ob man alle möglichen Werte in die PWM 
geschrieben bekommt. Spricht, tu mal die Zeile

// Ud1 = ADC_readResult

auskommentieren. Dann kannst du mit dem Debugger die Variable Ud1 
beschreiben und die PWM mit dem Oszi anschauen. Da muss von 
0-EPWM_TIMER_TBPRD alles funktionieren.

Die Tripzone braucht man vorerst nicht, die ist ja nur für die 
Abschaltung bei Überstrom da. Es kann aber sein, daß die Konfiguration 
dir da Probleme macht. Diese Module sind schon sehr komplex, und es 
dauert viele Tage bis man da durchsieht. Vielleicht sollte man sie 
zuerst einmal NICHT nutzen und nur einfach die PWM ausgeben. Wenn das 
läuft, geht es weiter.

Viel Erfolg

von (unknown) (Gast)


Lesenswert?

Hallo,

vielen dank für deine Hinweise, ich suche eine Methode um meine ePWM 
auszuschalten wenn Adcresult gleich null ist, gibt es andere Möglichkeit 
außer die Tripzone

von Falk B. (falk)


Lesenswert?

Youssef T. schrieb:
> vielen dank für deine Hinweise, ich suche eine Methode um meine ePWM
> auszuschalten wenn Adcresult gleich null ist,

Warum sollte man das tun? Man kann einfach 0 ins PWM-Register 
reinschreiben und es kommt auch Dauer-LOW raus.

Man kann natürlich auch das IO-Pin im GPIOMUX wieder auf normales GPIO 
umstellen, dann ist die PWM auch inaktiv am Pin, egal was der Timer und 
die PWM intern machen.

von (unknown) (Gast)


Lesenswert?

eigentlich habe ich nicht nur eine ePWM sonder 6 ePWMs und zwei davon 
sind invertiert, und wenn ich einfach 0 ins PWM-Register eingebe, kriege 
ich ja 0% von Dutycycle aber die zwei invertierte ePWMs beginnen immer 
von oben das heißt bei der Initialisierung springen immer die zwei hoch, 
und das genau will ich nicht. sie alle müssen auf Null setzen bei der 
Initialisierung bzw. bei Ud1=0.6V entspricht hier 819 dezimal.

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.