Hallo, ich versuche gerade mit einem STM32F107 Controller am Ausgang PA8
ein festgelegtes PWM Signal zu erzeugen. Nur Erzeugt der Ausgang nur ein
High Signal. Habe ich etwas vergessen einzustellen?
Ziel ist es, sobald an PA2 ein High Signal anliegt den Ausgang PA8 mit
einer festen Frequenz und Tastverhältnis anzusteuern. Nur wie gesagt
sobald
PA2 == 1 ist PA8 == 1 ohne PWM.
GPIO_ResetBits(GPIOC,GPIO_Pin_5);// LED Einschalten
15
16
TIM_CtrlPWMOutputs(TIM1,ENABLE)//PA8 Ausgang
17
}
18
else
19
{
20
GPIO_SetBits(GPIOC,GPIO_Pin_5);// LED Abschalten
21
22
TIM_CtrlPWMOutputs(TIM1,DISABLE)//PA8 Ausgang
23
}
24
25
}
In den Funktionen Init GPIO() und Init_LED_Port() werden nur die
Ein/Ausgänge des Steuersignals und der LEDs festgelegt.
Danke schon mal für eure Hilfe.
Hüpfer schrieb:> //Pin PA8 --> Steuersignal für Halbbrücke> GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 ;> GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;> GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;> GPIO_Init(GPIOA, &GPIO_InitStructure);
Achso hier habe ich Open Drain genommen, da am Ausgang ein Optokoppler
sitzt der sobald der Mikrocontroller gegen Masse zieht den Optokoppler
durchschalten lässt. Und so meine Last schaltet.
Ich weiß nicht wie dein Programm strukturiert ist... Aber:
1
while(ProgFunktion==2)
2
{
3
Init_GPIO();
4
Init_funktion2();
5
Init_LED_Port();
Bei jedem Schleifendurchgang werden deine Inits neu ausgeführt. Das
passiert normalerweise nur einmal! Den Timer müsstest du, solltest du
ihn ändern wollen, auch vorher Stoppen. Das passiert in diesem Fall
nicht.
Wo hast du &GPIO_InitStructure, &TIM_TimeBaseStructure und
&TIM_OCInitStructure definiert?
Hüpfer schrieb:> Rene Wie meinst du das mit den Timer stoppen?
Es hätte sein können, das dies so gewollt ist wenn der Timer mehrfach
benutzt wird, das du ihn in dieser Schleife neu setzt. Manche Werte
werden nur bei ausgeschaltetem Timer in das Timer Register übernommen.
Bist du dir sicher das ProgFunktion immer "2" ist? So das die
Hauptschleife nicht verlassen wird?
Ist es möglich PA8 mal als PP du deklarieren? Nicht das das OD da nen
Strich durch die Rechnung macht. Desweiteren denke ich das die
Timer-Init eigentlich passen müsste.
Im Zeifelsfall einfach mal die Main so ändern das ausschließlich der
Timer läuft und mit einem Oszi oder einem Freq-Messer mal den Pin
kontrollieren.
Ja hab mittlerweile alles andere aus der Main rausgenommen, und die
Variable nochmals direkt vor der While Schleife auf ProgFunktion = 2,
gesetzt. Die Schleife wird auch durchlaufen, weil die dort gesetzten
LED´s auch angehen wenn eigentlich das PWM Signal angesteuert wird. Nur
wird nur ein reines High Signal ausgegeben (Oszi angeschlossen). Ausgang
wurde auch auf PP umgeändert, hat aber weiter nix geändert. Ich
vergleich jetzt nochmal eine Standard Libary von ST mit meinem
Programmcode.
Vielen Dank dir trotzdem.
Kann sein, das man das beim F107 nicht braucht. Mein BLDC Drive benutzt
ebenso PP Ausgänge und nicht OD, also folge mal dem Tipp von René.
Offensichtliche Fehler sehe ich auch nicht, es fehlt noch das DTI, wenn
du das brauchst und ich zünde mit TIM1 immer eine ISR, es sollte aber
auch ohne gehen.
Edit: das sieht allerdings merkwürdig aus:
Hüpfer schrieb:> if (steuereingang == 1)
Wie wird dieser 'steuereingang' gesetzt? Das muss bei dir dann per ISR
geschehen, denn in der Schleife passiert das nicht.
Matthias S. schrieb:> Wie wird dieser 'steuereingang' gesetzt? Das muss bei dir dann per ISR> geschehen, denn in der Schleife passiert das nicht.
Hallo Matthias, ja der Eingang löst eine ISR aus, hab diese aber einfach
um Fehler auszuschliessen jetzt durch eine einfache Abfrage des Eingangs
abgeändert.
1
if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_2)==1)
2
{
3
GPIO_ResetBits(GPIOC,GPIO_Pin_5);// LED Einschalten
4
5
TIM_CtrlPWMOutputs(TIM1,ENABLE)//PA8 Ausgang
6
}
Zusätzlich habe ich jetzt noch, die von dir Empfohlene Zeile eingefügt.
Hüpfer schrieb:> Hallo Matthias, ja der Eingang löst eine ISR aus
Ahh.... Infos so Scheibchenweise sind immer doof :-D Wird denn dann der
Interrupt auch wieder zurückgesetzt in / nach der ISR?
Ich weiss, das ich damals auch eine Weile gekämpft habe, ehe das alles
so funktionierte, allerdings benutze ich auch das DTI und 3 PWM Pärchen.
So sieht das bei mir aus:
1
/* Channel 1, 2 and 3 Configuration in PWM mode */
Rene K. schrieb:> Die LED an C5 schaltet aber ein?!
ja die geht an.
Rene K. schrieb:> Übrigens ist TIM_CtrlPWMOutputs für die erweiterten Timer 1 und 8, und> müssen über BDTR initialisiert werden.
das heißt?
Hüpfer schrieb:> Was trage ich für deadTime ein bzw ist hier die Zeit die sich aus der> Off Zeit des Tastverhältnis ergibt nötig?
Du musst die Totzeit nicht aus dem Tastverhältnis ausrechnen. Die
Totzeit ist auch nur dann relevant, wenn du die Low- und Highside aus
dem gleichen CCR mit komplementären Signalen gewinnst.
Bei mir steht da schlicht und einfach eine 26 drin, aber ich hatte da
auch dicke fette Endstufen dran, die etwas Zeit brauchen.
Martin schrieb:> Master Output Enable
Eigentlich 'Main Output Enable'. Sollte beim nächsten Update des Timers
gesetzt werden, wenn 'Automatic Output Enable' gesetzt ist.
Die Registerbeschreibung ist auf Seite 343/1093 im RM0008 Reference
Manual für STM32F0x.
Um dir die Fehlersuche mal ein bisschen zu erleichtern habe ich dir
unten mal ein absolutes Minimalbeispiel angehängt um mit Timer 1 ein
PWM-Signal zu erzeugen. Die einzelnen Registerzugriffe kannst du dann
Stück für Stück durch deine eigenen Init-Funktionen ersetzen, bis es
nicht mehr funktioniert. Dann weißt du zumindest schonmal wo der Fehler
ist.
1
#include<stm32f1xx.h>
2
3
4
/*
5
* This is an example of complementary PWM output with an "advanced timer".
6
* We will use the channel 1 of timer 1 and the pins PA8 for CH1 and PB13 for CH1N.
Rene K. schrieb:> Das ist aber die HAL, nicht die StdPeriph oder?
Weder - noch. Das ist direkte Registerprogrammierung. Kann man auch
machen, wird aber bei komplexen Sachen, äh, komplex :-)
Ich hatte vergessen zu erwähnen, dass der obige Code implizit davon
ausgeht, dass bei Aufruf von main() die PLL schon auf 72MHz eingestellt
ist. Das funktioniert natürlich auch mit 8MHz HSI, nur dann passen die
Zeitangaben in den Kommentaren nicht mehr und alles läuft um den Faktor
neun langsamer. Getestet habe ich das auf einem F103 aber das sollte so
eins zu eins auch auf einem F107 laufen. Man benötigt natürlich noch den
entsprechenden Header, z.B. stm32f103xb.h für den F103CB. Nutzt man die
StdPeriphLib hat man den für gewöhnlich sowieso schon.