Guten Abend zusammen.
Ich arbeite gerade an meinem STM32F4Discovery Board und habe folgendes
Problem. Ich versuche die Pins PA1 und PA8 zu nutzen um ein PWM Signal
auszugeben.
An dem Pin PA8 ist das gar kein Problem. Jedoch für den Pin PA1,
zusammen mit dem Timer 5 Channel 2, funktioniert das nicht. Ich habe
bereits etliche Foren Posts durchgeblättert, doch auch wenn ich den Pin
PA1 identisch wie in diesen Beispielen konfiguriere, geht nichts. Es
kommt kein PWM Signal am Ausgang an, dieser bleibt low.
Servus,
-hier fehlt dein Pin PA1
>GPIO_InitDef.GPIO_Pin = GPIO_Pin_8;
-bei
>TIM_Cmd(TIM1, ENABLE);
fehlt eigentlich: TIM_CtrlPWMOutputs(...) und
-void setPWM(void) ist der Name unglücklich gewählt!
nenne es doch:
void setPWM_Tim5(void) oder so, wobei die Reihenfolge der
Initialisierung interessant wäre.
Wenn nichts klappt, dann poste die ganze .c Datei.
mfg
Hi, wow das ging ja echt fix.
Ok ich habe versucht die Teile zu vereinfachen und nur den Code für
Timer 5 einzufügen.
>-hier fehlt dein Pin PA1
Ist vorhanden, habs jedoch hier im Forumspost raus genommen.
>fehlt eigentlich: TIM_CtrlPWMOutputs(...) und
Hier das gleiche
>-void setPWM(void) ist der Name unglücklich gewählt!
Eigentlich ist es bei mir die Funktion setPWM(int pulse, int chanel),
damit ich mit einer Funktion beide PWM Kanäle setzen kann.
Ich hatte gedacht eine gekürzte Version macht es einfachen, dem scheint
nicht so zu sein.
1
intmain(void)
2
{
3
SystemInit();
4
GPIOinit();
5
Timinit();
6
Analoginit();
7
// CANinit();
8
intcounter;
9
10
inttest;
11
12
test=SysTick_Config(SystemCoreClock/1000);
13
14
GPIO_SetBits(GPIOC,GPIO_Pin_9);
15
GPIO_SetBits(GPIOA,GPIO_Pin_2);
16
GPIO_SetBits(GPIOB,GPIO_Pin_12);
17
18
setPWM(2099,1);
19
setPWM(2099,2);
20
21
/* ErrorStatus check;
22
int32_t ee_wert;
23
24
check=UB_EE_FLASH_Init();
25
*/
26
27
28
while(1)
29
{
30
counter=TIM_GetCounter(TIM5);
31
}
32
}
Hier sind noch einige relikte aus Test, mit
1
counter=TIM_GetCounter(TIM5)
habe ich getestet ob der Timer überhaupt zählt. Das Tut er.
Ich hoffe ich habe keien Verwirrung gestiftet.
Wird der Rest, sprich die ganzen CAN initialisierungsfunktionen und die
ADC/DMA Init funktionen auch zur Fehlersuche gebraucht? Ansonsten ist
das der Code der kompilierbar ist und auf dem STM32F4Discovery Board am
Pin PA8 ein PWM Signal ausgibt.
Mit freundlichen Grüßen
Marcel D. schrieb:> if(channel = 1){> TIM_OC1Init(TIM1, &TIM_OC_InitStructure);> TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);> TIM_CtrlPWMOutputs(TIM1, ENABLE);> }> if(channel = 2){> TIM_OC2Init(TIM5, &TIM_OC_InitStructure);> TIM_OC2PreloadConfig(TIM5, TIM_OCPreload_Enable);
Fehlt hier immernoch in dem hochgeladenen Teil das
1
TIM_CtrlPWMOutputs(TIM5,ENABLE);
?
Ansonsten mal nachprüfen, ob Timer 5 überhaupt läuft, wenn du dein
Programm startest und ob du für PA1 auch noch AF2 eingestellt ist und du
nicht an anderer Stelle den Pin wieder umkonfigurierst (z.B. für UART)
Marcel D. schrieb:> if(channel = 1){
Sowas sollte dir ein 'possibly unwanted assignment' oder sowas ähnliches
geben - sinnvoll ist eher
1
if(channel==1){
2
// etc. pp.
In meinem PWM Init mit TIM4 habe ich noch die folgende spassige Zeile:
1
TIM_ARRPreloadConfig(TIM4,ENABLE);
Wofür das war, blättere ich jetzt nicht nach, hat aber anscheinend einen
Sinn :-P
Dominik B. schrieb:> Fehlt hier immernoch in dem hochgeladenen Teil das> TIM_CtrlPWMOutputs(TIM5, ENABLE);?
Nee, bei den einfachen Timern gibts das nicht.
Danke für die Hilfe.
>if (channel == 1) {
erledigt
>TIM_ARRPreloadConfig(TIM4, ENABLE);
ausprobiert, ändert jedoch nichts
Angehängt sind Oszilloskop sreenchots der Kanäle PA1 und PA8. PA8 ist in
blau und PA1 ist in rot.
Und ich habe den timer Wert in der while Schleife ausgelesen, siehe
drittes Bild im Anhang. Heisst das der Timer läuft?
Gruß Marcel
Den Abschnitt hier hast du gelesen?:
>As the preload registers are transferred to the shadow registers> only when an update event>occurs, before starting the counter, you have to initialize all the>registers by setting the UG bit in the TIMx_EGR register.
Also solltest du ein Update Event erzwingen, wenn ales soweit geladen
ist. Im einfachsten Fall geht das mit:
1
TIM5->EGR|=(1<<TIM_EGR_UG);
Probier das mal nach einen Setzen des OC Registers.
Hi Matthias,
>TIM5->EGR |= (1 << TIM_EGR_UG);
hab ich genauso eingefügt. Es tut sich leider gar nichts.
Mich macht stutzig, dass an dem Pin ja etwas ankommt (siehe Osci Bilder
meines letzten Posts). Es sieht aus als würde ein Kondensator geladen
werden, oder ähnliches. Ich schaue mal ob der Pin des Discovery Boards
noch anderweitig verwendet wird.
Gruß Marcel
Marcel D. schrieb:> Heisst das der Timer läuft?
Jap, sieht ganz so aus, wenn der Wert nicht immer gleich ist zu
verschiedenen Zeiten.
Marcel D. schrieb:>>if (channel == 1) {> erledigt
Hast du das für beide Abfragen korrigiert?
1
if(channel=2)
Ist nämlich nie erfüllt, bei Kanal 1 war das zufälligerweise noch eine
erfüllte Bedinung.
Hätte alles darauf gesetzt, dass das der Fehler gewesen ist.
Marcel D. schrieb:> GPIO_InitDef.GPIO_Pin = GPIO_Pin_8| GPIO_Pin_1;> GPIO_InitDef.GPIO_OType = GPIO_OType_PP;> GPIO_InitDef.GPIO_Mode = GPIO_Mode_AF;> GPIO_InitDef.GPIO_PuPd = GPIO_PuPd_NOPULL;> GPIO_InitDef.GPIO_Speed = GPIO_Speed_100MHz;
zu
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ;
Die Reihenfolge der Initialisierung ist etwas zweifelhaft.
Mach die
TIM_ARRPreloadConfig(TIM5, ENABLE);
Register an und ändere die Periode mit
TIM5->CCR2 = x;
TIM1->CCR1 = y;
>void setPWM(int duty, int channel)
Dafür braucht man keine Funktion! Du könntest auch mit defines arbeiten
Hallo zusammen und vielen Dank für eure Hilfe.
Ich habe den Fehler gefunden. Es lag nicht am Code, sondern an einem
externen Schaltungsrelikt. Ich habe vor einiger Zeit etwas an den Pin
PA1 gelötet und durch diese externe Beschaltung kam kein sauberes PWM
Signal heraus.
Tut mir leid das ich eure Zeit damit verschwendet habe.
>Mach die>TIM_ARRPreloadConfig(TIM5, ENABLE);>Register an und ändere die Periode mit>TIM5->CCR2 = x;>TIM1->CCR1 = y;
Das ist ein super Hinweis! Danke Eiermann.
Falls jemand diesen Post ausgraben sollte, weil er gerade auf
Fehlersuche ist. Der Code aus dem 3.Post hat bei meinem STM32F4Discovery
Board funktioniert.
Mit freundlichen Grüßen
Marcel