Forum: Mikrocontroller und Digitale Elektronik STM32f05 100kHz TIM_16 nur mit hardware ?


von Juergen G. (jup)


Lesenswert?

Ich versuche ein 100kHz Signal mit dem Timer 16 des STM32f05
nur mit der Hardware zu erzeugen.

Soweit ich das verstanden habe soll das mit dem Output compare und der
Toggle option gehen.

Die Timebase und die OCStructur gelingt mir so zu konfigurieren das der 
Timer mit 100kHz laeuft. Das zu pruefen nehme ich die ISR her und wackle 
an den Pins.

Nur gelingt es mir nicht das der Timer selbst den Pin toggled ohne ISR.

Die Werte fuer die Frequenzen im aktuellen code haben nichts mit den 
100kHz zu tun das ist nur zum probieren.
1
static void setup_Timer16(void) {
2
  TIM_OCInitTypeDef  TIM_OCInitStructure;
3
  TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
4
  GPIO_InitTypeDef GPIO_InitStructure;
5
6
  // clock on Timer 16 enable
7
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM16, ENABLE);
8
9
  // GPIOB clocks enable
10
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
11
12
  // GPIOB Configuration: Pin PB8 AF2 connecting to TIM16 Ch1
13
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
14
  GPIO_InitStructure.GPIO_Mode = /*GPIO_Mode_OUT*/GPIO_Mode_AF;
15
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
16
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
17
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
18
  GPIO_Init(GPIOB, &GPIO_InitStructure);
19
20
  // Connect TIM16 pins to AF2
21
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource8, GPIO_AF_2);
22
23
  TIM_DeInit(TIM16 );
24
  TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
25
26
  /* Time base configuration */
27
  TIM_TimeBaseStructure.TIM_Period = (SystemCoreClock / 50000/*lcd_Contrast*/) - 1;
28
  TIM_TimeBaseStructure.TIM_Prescaler = 0x0;
29
  TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;
30
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
31
32
  TIM_TimeBaseInit(TIM16, &TIM_TimeBaseStructure);
33
34
  // Timer output compare configuration
35
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
36
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
37
  TIM_OCInitStructure.TIM_OCMode = /*TIM_OCMode_Timing*/TIM_OCMode_Toggle;
38
  TIM_OCInitStructure.TIM_Pulse = 500;
39
  TIM_OC1Init(TIM16, &TIM_OCInitStructure);
40
41
/*
42
  NVIC_InitTypeDef nvic;
43
  nvic.NVIC_IRQChannel = TIM16_IRQn;
44
  nvic.NVIC_IRQChannelCmd = ENABLE;
45
  nvic.NVIC_IRQChannelPriority = 3;
46
  NVIC_Init(&nvic);
47
48
49
  TIM_ITConfig(TIM16, TIM_IT_CC1 | TIM_IT_Update, ENABLE);
50
*/
51
52
  /* TIM16 enable counter */
53
  TIM_Cmd(TIM16, ENABLE);
54
55
}

kann mir jemand sagen was da noch fehlt.

Ju

von Schwups (Gast)


Lesenswert?

> (SystemCoreClock / 50000/*lcd_Contrast*/) - 1;

Dieser Ausdruck darf nicht kleiner sein als 500 (weil dein Zähler ja 
sonst gar nicht bis zum Vergleichswert zählt). Dies ist der Fall wenn 
dein Proz. zb. nur mit 24MHz läuft. Wie hoch ist denn dein Clock?

von Schwups (Gast)


Lesenswert?

achso und ich glaube da gehört zum Schluss noch sowas hin:
1
TIM_OC1PreloadConfig(TIM16, TIM_OCPreload_Enable);

von Juergen G. (jup)


Lesenswert?

Wie ich schon geschrieben habe, die Werte fuer die Frequenzen sind nicht 
mein Problem.
Das habe ich schon alles verstanden. Auch das mit dem Autoreload Preload 
etc. habe ich verstanden.

Im Programm selbst kann ich ARR und CCR1 per UART aendern, dazu muss 
aber der Autoreload und preload abgeschaltet sein.

Die Frequenz von 100kHz (mit dem ARR) und unterschiedliche Duty cycles 
(mit dem CCR1) bekomme ich ohne weiteres hin.

Mein Problem ist, wie bekomme ich das auf den PB8 Pin ohne eine ISR zu 
verwenden.

Ju

von Juergen G. (jup)


Lesenswert?

Fuer die Nachwelt,

man muss noch die Ausgaenge einschalten.

Das geht mit

TIM_CtrlPWMOutputs(TIM16, ENABLE);

nach der Timer Aktivierung.

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.