Forum: Mikrocontroller und Digitale Elektronik [STM32G0B1RE] PWM per DMA richtige Pulsdauer, falsche Periodendauer


von DMA (Gast)


Angehängte Dateien:

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?

von DMA (Gast)


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 ?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.