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
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.
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
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.