Forum: Mikrocontroller und Digitale Elektronik STM32F4: Timer mit Break-Funktion, Timingprobleme


von Aljo E. (alrue)


Angehängte Dateien:

Lesenswert?

Werte Mitmenschen,
für die Ansteuerung eines ICs, brauche ich 5 ms lange bursts von Pulsen 
mit einer Frequenz von 100 kHz.
Dafür habe ich Timer1 so konfiguriert, dass dieser die gewünschten Pulse 
mit einer Frequenz von 100 kHz erzeugt. Außerdem wurde bei Timer1 die 
Break-Funktion eingeschaltet. Das bedeutet, dass der Output von Timer1 
nur so lange die Pulse ausgibt, wie der Ausgang von Timer 3 high ist.
Das ist in Soll.jpeg zu sehen.

Mein Problem besteht darin, dass wenn ich auf Timer3 Trigger, die Bursts 
mir langsam davon laufen und ich keine Ahnung habe, woran das liegen 
könnte (zu sehen in Lauf.jpeg).

Außerdem ist es zur Zeit so, dass mein Timer1-Signal HIGH ist, solange 
keine Bursts erscheinen. Ich brauche es aber so, dass das Signal LOW 
ist. Wie kriege ich das hin?

Ich bin über alle Anregungen erfreut und bedanke mich schonmal im 
Voraus!

Hier mein Code zur Einstellung der Timer
1
void TIM1_Configuration(void)
2
{
3
  TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
4
  TIM_OCInitTypeDef  TIM_OCInitStructure;
5
  TIM_BDTRInitTypeDef TIM_BDTRInitStructure;
6
7
  // TIM3 Configuration //
8
9
  TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
10
  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV2;
11
  TIM_TimeBaseStructure.TIM_Period = 0xAFFF;
12
  TIM_TimeBaseStructure.TIM_Prescaler = 0x00FF;
13
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
14
  TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
15
16
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
17
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
18
  TIM_OCInitStructure.TIM_Pulse = 1750; //1750
19
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
20
  TIM_OC3Init(TIM3, &TIM_OCInitStructure);
21
22
  TIM_SelectOutputTrigger(TIM3, TIM_TRGOSource_Update);
23
24
  // TIM1 Configuration // 100 kHz
25
  
26
  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV2; // 180MHz/2 = 90MHz
27
  TIM_TimeBaseStructure.TIM_Period = 89; // 90MHz/(89+1) = 1 MHz
28
  TIM_TimeBaseStructure.TIM_Prescaler = 19;
29
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
30
  TIM_TimeBaseStructure.TIM_RepetitionCounter = 0x0F;
31
  TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
32
33
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
34
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
35
  TIM_OCInitStructure.TIM_Pulse = 5;
36
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
37
  TIM_OC1Init(TIM1, &TIM_OCInitStructure);
38
39
  TIM_BDTRStructInit(&TIM_BDTRInitStructure);
40
  TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Disable;
41
  TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_OFF;
42
  TIM_BDTRInitStructure.TIM_DeadTime = 0;
43
  TIM_BDTRInitStructure.TIM_Break = TIM_Break_Enable;
44
  TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_Low;
45
  TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;
46
  TIM_BDTRConfig(TIM1, &TIM_BDTRInitStructure);
47
48
  TIM_Cmd(TIM1, DISABLE);
49
  TIM_Cmd(TIM3, ENABLE);
50
51
  TIM_CtrlPWMOutputs(TIM1, ENABLE);
52
  TIM_CtrlPWMOutputs(TIM3, ENABLE);
53
}

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.