[STM32G0B1RE] PWM per DMA richtige Pulsdauer, falsche Periodendauer

Gast #7271018
Lesenswert?

Hallo zusammen,

was wird benutzt:
Nucleo Board vom STM32G0B1RE;
Interner Sourceclock von 32MHz

Was ist das Ziel:
ein 800kHz PWM-Signal per DMA ausgeben um die WS2812b ansteuern zu 
können.

Was ist eingestellt (siehe Bild "TIM15_Einstellungen.png"):
TIM15 mit PWM Ausgabe am Channel 1 durch DMA;
Prescaler auf 1 -> 32MHz / 2 = 16MHz;
ARR auf 19 -> 16MHz / 20 = 800kHz;
(So zumindest meine Rechnung)

Was bekomme ich:
Eine Pulsdauer die einem 800kHz Signal entspricht mit einer Periode, die 
zu einem 400kHz Signal gehört.
Getestet mit einer Pulsdauer von 50%. (siehe Bild "Signal_Oszi.png")

Ansteuerung (richtige Pulsdauer, falsche Periodenlänge):
1
uint32_t test[20] = {10,10,10,5,5,3,3,7,7,7,10,10,10,9,9,9,1,2,6,8};//10 = 50%; 5 = 20% usw.
2
HAL_TIM_PWM_Start_DMA(&htim15, TIM_CHANNEL_1, (uint32_t *)test, uint16_t)20);
3
/*HAL_TIM_PWM_Start_DMA(TIM_HandleTypeDef * htim, uint32_t Channel, uint32_t *pData, uint16_t Length)*/

Callback (funktioniert)
1
void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef* htim)
2
{
3
   if(htim == &htim15)
4
   {
5
      HAL_TIM_PWM_Stop_DMA(&htim15, TIM_CHANNEL_1);
6
      ready = 1;
7
   }
8
}

Frage:
Woran könnte das liegen und wie kann ich es beseitigen?
Angehängte Dateien:
Gast #7271911
Lesenswert?

Hallo zusammen,

ich habe das Problem gelöst bekommen, es war dieser Teil:
1
uint32_t test[20] = {10,10,10,5,5,3,3,7,7,7,10,10,10,9,9,9,1,2,6,8};

Die Variable mit der Pulsdauer darf keine 32 Bit Variable sein, sondern 
muss eine 16 Bit breite Variable sein, auch wenn die HAL-Funktion eine 
32Bit Variable erwartet.
Wenn ich die 16 Bit Variable auf 32 Bit caste funktioniert es, aber da 
stellt sich mir jetzt die Frage wieso?

Wieso funktioniert es erst, wenn die übergebene Variable eine gecastete 
32 Bit Variable ist ?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren