Skocz do zawartości

[C] [STM32] STM32F3 Discovery - PWM na TIM1 i TIM8


OldSkull

Pomocna odpowiedź

Witam,
ostatnio znowu bawię się w "procki" - tym razem na płytce STM32F3Discovery. I mam problem: otóż nie mogę uruchomić PWM aby generował mi przebieg. Wycinek programu w Atollic Studio poniżej:

//PWM
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8, ENABLE);
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE);

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;

  GPIO_PinAFConfig(GPIOA, GPIO_PinSource8, GPIO_AF_4);
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_4);
  GPIO_PinAFConfig(GPIOC, GPIO_PinSource8, GPIO_AF_4);
  GPIO_PinAFConfig(GPIOC, GPIO_PinSource9, GPIO_AF_4);


  TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

  TIM_TimeBaseStructure.TIM_Prescaler = 36 - 1; // 36 to 1 MHz
  TIM_TimeBaseStructure.TIM_Period = 512 - 1; //
  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

  TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructure);
  TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);

  Tim_InitStruct.TIM_OCMode = TIM_OCMode_PWM1;
  Tim_InitStruct.TIM_OutputState = TIM_OutputState_Enable;
  Tim_InitStruct.TIM_Pulse = 512 / 2; // 50%
  Tim_InitStruct.TIM_OCPolarity = TIM_OCPolarity_Low;

  GPIO_Init(GPIOA, &GPIO_InitStructure);
  GPIO_Init(GPIOC, &GPIO_InitStructure);

  TIM_OC3Init(TIM8, &Tim_InitStruct);
  TIM_OC4Init(TIM8, &Tim_InitStruct);
  TIM_OC1Init(TIM1, &Tim_InitStruct);
  TIM_OC2Init(TIM1, &Tim_InitStruct);

  TIM_Cmd(TIM1, ENABLE);
  TIM_Cmd(TIM8, ENABLE);

Największy problem mam z:

- GPIO_PinAFConfig - które AF użyć? Biblioteki wskazują, że TIM1 oraz TIM8 są na wielu wartościach. Dokumentacja nie wskazuje jednoznacznie nic.

- TIM_OCMode_PWM1 - jak zrozumiałem to jest tryb z synchronizacją zboczy, zgadza się?

Przykłądu mówią wiele różnych, często sprzecznych rzeczy :/ konfiguruję w sumie 4 piny PWMa. Może ktoś się już spotkał z tym problemem.

[ Dodano: 02-12-2014, 21:54 ]

Pospieszyłem się 🙂, brakowało funkcji:

TIM_CtrlPWMOutputs(TIM8, ENABLE);

TIM_CtrlPWMOutputs(TIM1, ENABLE);

Udało mi się znaleźć jakie mają być AF, jest to w jakiejś dokumentacji, ale nie w manualu, który ma >1000 stron 🙄 , dla potomnych:

//PWM
  /* TIM8 clock enable */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8 | RCC_APB2Periph_TIM1, ENABLE);

  /* GPIOA & GPIOB clock enable*/
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_GPIOB | RCC_AHBPeriph_GPIOC, ENABLE);

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_DOWN;

  GPIO_PinAFConfig(GPIOA, GPIO_PinSource8, GPIO_AF_6);
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_6);
  GPIO_PinAFConfig(GPIOC, GPIO_PinSource8, GPIO_AF_4);
  GPIO_PinAFConfig(GPIOC, GPIO_PinSource9, GPIO_AF_4);
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  GPIO_Init(GPIOC, &GPIO_InitStructure);

  TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

  TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);

  TIM_OCStructInit(&Tim_InitStruct);

  TIM_TimeBaseStructure.TIM_Prescaler = 12 - 1; // 36 to 1 MHz
  TIM_TimeBaseStructure.TIM_Period = 500 - 1; //
  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

  TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructure);
  TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);

  Tim_InitStruct.TIM_OCMode = TIM_OCMode_PWM1;
  Tim_InitStruct.TIM_OutputState = TIM_OutputState_Enable;
  Tim_InitStruct.TIM_Pulse = 500 / 2; // 50%
  Tim_InitStruct.TIM_OCPolarity = TIM_OCPolarity_Low;

  TIM_OC3Init(TIM8, &Tim_InitStruct);
  TIM_OC4Init(TIM8, &Tim_InitStruct);
  TIM_OC1Init(TIM1, &Tim_InitStruct);
  TIM_OC2Init(TIM1, &Tim_InitStruct);

  /* Enable outputs on both TIM1 & TIM8*/
  TIM_CtrlPWMOutputs(TIM8, ENABLE);
  TIM_CtrlPWMOutputs(TIM1, ENABLE);

  TIM_Cmd(TIM1, ENABLE);
  TIM_Cmd(TIM8, ENABLE);
Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.