Hallo
Ich habe gerade einen wiederholten Puls generiert und diesen erfolgreich
getestet. Für weitere Kanäle habe ich dann das Programm erweitert.
Wenn ich jetzt das Oszilloskop an die jeweiligen Pins anschliesse,
bekomme ich kein Signal heraus. Könnte mir jemand sagen, was ich mit der
Erweiterung des Codes nicht berücksichtigt habe?
Vielen Dank schon mal
Hier ist der Code:
Die Erweiterung betrifft
/* Configure register bits for Channel 2*/
bis
/* Configure register bits for Channel 4*/
Hallo Matthias
Ich habe die Pinkonfiguration schon als Alternativfunktion drin.
Es funktioniert ja für CH1 auch, also muss das schon passen, zumal ich
die Konfiguration über CubeMx gemacht habe.
Aber trotzdem zur Info:
Ich habe den Timer1 CH1-4 als Output Compare drin.
und der Code für die Pinkonfiguration folgendermassen:
(was ich mich allerdings frage ist, warum ich hier die Definitionen für
PinA8, A9, A10 und A11 für die Timer CH1-4 nirgends als alternative
Funktionen sehe??
Kann mir einer erklären warum bzw. wo das geschieht?
Steht in deiner Main im Abschnitt usercode 2 ?
HAL_TIM_OC_Start(&htim1,TIM_CHANNEL_1);
HAL_TIM_OC_Start(&htim1,TIM_CHANNEL_2);
HAL_TIM_OC_Start(&htim1,TIM_CHANNEL_3);
HAL_TIM_OC_Start(&htim1,TIM_CHANNEL_4);
Also ich habe die Erfahrung gemacht, das man alle Kanäle extra starten
muss
also wie angegeben mit der HAL funktion
HAL_TIM_OC_Start(&htim1,TIM_CHANNEL_X);
Oder 2. Möglichkeit
alle Kanäle freigeben
TIM1->CCER |= TIM_CCER_CC1E;
TIM1->CCER |= TIM_CCER_CC2E;
TIM1->CCER |= TIM_CCER_CC3E;
TIM1->CCER |= TIM_CCER_CC4E;
und dann Zähler starten
TIM1->CR1 |= TIM_CR1_CEN;
PWM läuft doch durch da must du nicht dauernd den timer in der while
schleife neu starten ...
Ich sehe jetzt immer noch nicht, wo du die eigentlichen PWM Werte für
die Kanäle setzt, also die Besetzung von TIM1->CCR1 bis TIM1->CCR4. Wenn
da eine null drin steht, kommt da auch nix.
Wohlgemerkt musst du Preload freigeben, wenn du den Wert in CCRn nochmal
ändern willst. Das passiert dann bei einem Update Event.
Den Counter Enable habe ich deshalb in der Schleife, weil ich diesen
immer zum Testen über einen Schalter starten will.
Der Puls wird ja so oft wiederholt wie der Wert im Wiederholregister und
dann wird CEN gestoppt.
@Matthias
Ich hätte jetzt gehofft, dass es das ist, wobei du Recht hast, ich muss
ja die Compare values auch für die anderen Kanäle definieren.
Das habe ich jetzt auch angepasst, aber auch dann tut es nicht..
Ich bin langsam überfragt..
Guten Morgen zusammen
Ich habe das Programm jeweils mit
TIM1->CCR1 = period/2; /* Set the
compare value channel 1*/
erweitert.
Es funktioniert für Kanal 1 weiterhin, aber für die anderen nicht.
Hat keiner eine Idee was am oberen Code nicht stimmen könnte?
PS: Wäre schön, wenn mir das mit dem Preload jemand erklären könnte. Im
Reference Manual ist das für mich nicht so verständlich erklärt. Was tut
der Preload denn genau? Es reicht doch wenn der Wert im CCR1-4 drin
steht.
"Wohlgemerkt musst du Preload freigeben, wenn du den Wert in CCRn
nochmal
ändern willst. Das passiert dann bei einem Update Event."
Schöne Grüsse
Hallo Hans
Super Tipp, danke.
Ich habe jetzt das Problem raus. Ich habe mit dem Befehl
TIM1->CCMR1 |= TIM_OCMODE_PWM2; /* OC1 is high
until CCR1 */
den PWM2 Mode für den Kanal 1 gesetzt. Das fehlt nun für all die übrigen
Kanäle und war im vorigen Code nicht enthalten. Ich hätte mich als ich
im Manual las, mich auch direkt fragen können, warum das nicht variiert
und kanalabhängig ist, aber ich meine wie soll ich das auch sehen wenn
im stm32l4xx_hal_tim.h lediglich die Definition für den Kanal 1 drin
ist?
So bin ich nicht sofort auf die Idee gekommen auch für die anderen
Kanäle den PWM2 Mode zu setzen.
1
/** @defgroup TIM_Output_Compare_and_PWM_modes TIM Output Compare and PWM Modes
Ich hätte jetzt das #define TIM_OCMODE_PWM2 zu #define
TIM_OCMODE_PWM2_CH1 gemacht und die restlichen definiert..
TIM_OCMODE_PWM2_CH2 dann als #define TIM_OCMODE_PWM2_CH2
((uint32_t)TIM_CCMR1_OC2M_2 | TIM_CCMR1_OC2M_1 | TIM_CCMR1_OC2M_0) etc.
defnieren.
Sprich so:
TIM1->CR1&=~(TIM_CR1_DIR|TIM_CR1_CMS);/* Reset bits of CMS (Edge-aligned mode) and DIR generally */
40
TIM1->CR1|=TIM_COUNTERMODE_UP;/* Select the up counter mode */
41
TIM1->CR1&=~TIM_CR1_CKD;/* Erase bits of CKD */
42
TIM1->CR1|=TIM_CLOCKDIVISION_DIV1;/* Set the clock division to 1*/
43
TIM1->PSC=Presc;/* Set the Prescaler value */
44
TIM1->ARR=period-1;/* Set the Auto-reload value*/
45
TIM1->RCR=PulseN-1;/* Set the repetition counter value*/
46
TIM1->EGR=TIM_EGR_UG;/* Generate an update event to reload Prescaler and Repetition counter value immediately*/
47
TIM1->CR1|=TIM_CR1_OPM;/* Activate the one pulse mode*/
48
TIM1->CCER|=TIM_OCPOLARITY_HIGH;/* Set the Output Compare Polarity to High */
49
TIM1->SMCR=RESET;/* Configure the Internal Clock Source*/
50
TIM1->BDTR|=TIM_BDTR_MOE;/* Enable the TIM main Output */
51
52
}
Dann funktionierts, aber bei der nächsten Anpassung mittels einer neuen
Codegeneration würde es mir alles wieder löschen.
Wie würdet ihr das machen? Und in welchem Teil fügt man im main defines
hin. Ich habe das im Moment ja wie man sieht im private variables, aber
das macht ja keinen Sinn.
Schöne Grüsse
Eine eigene Frage?
Dieser Thread ist über 9 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.