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