使用STM32和计时器

时间:2017-09-06 18:41:11

标签: timer signals stm32

我正在尝试生成方波/正交信号(2个方波,偏移90度)。该板是STM32F103C8 我还没有专注于频率,我只想要一个干净的正交信号。 我的代码目前并不复杂,为了初始化计时器,这里有两个主要功能:

void init_SW()
{
    GPIO_InitTypeDef GPIO_InitStruct;
    // Step 1: Initialize GPIO as input for rotary encoder
    // PB7 (TIM4_CH2) (encoder pin A), PB6 (TIM4_CH1) (encoder pin B)
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_6;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;
    GPIO_Init(GPIOB, &GPIO_InitStruct);
    // Step 2: Setup TIM4 for encoder input

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
        TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
        TIM_TimeBaseStructInit (&TIM_TimeBaseStructure);
        TIM_TimeBaseStructure.TIM_Period = 3;
        TIM_TimeBaseStructure.TIM_Prescaler = 0;
    TIM_Cmd(TIM4, ENABLE);
        TIM_TimeBaseInit (TIM4, &TIM_TimeBaseStructure);
/*  
  TIM4->CCR3=0 ;
        TIM4->CCR4=(TIM4->ARR+1)/2;
        TIM4->CCER;
        */
}

void timer_ccr_init (void)
{
  TIM_OCInitTypeDef  TIM_OCInitStructure;
  /* always initialise local variables before use */
  TIM_OCStructInit (&TIM_OCInitStructure);

  /* Common settings for all channels */
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle;
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;

  /* Channel1 */
  TIM_OCInitStructure.TIM_Pulse = 0;
  TIM_OC1Init (TIM4, &TIM_OCInitStructure);

  /* Channel2 - 90 degres after*/
  TIM_OCInitStructure.TIM_Pulse = 1;
  TIM_OC2Init (TIM4, &TIM_OCInitStructure);
    TIM4->CCER;
}

你知道我搞砸了哪里?

1 个答案:

答案 0 :(得分:1)

我不太熟悉F1系列或标准外设库,但我认为这是错误的

GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;

要将定时器输出信号连接到实际引脚,您可以将它们设置为备用功能模式。

此行位于错误的位置:

TIM_Cmd(TIM4, ENABLE);

在设置所有通道时,在结束时启用计时器。因为您没有使用预分频器,并且周期很短,所以当您还在设置另一个时,一个通道可能会执行几个周期。但是,如果您同时启用通道(这可能在寄存器级别,但STL可能无法执行此操作),这将没有问题,但

TIM4->CCER;
仅在一行上的

没有效果(读取寄存器并丢弃该值)。实际上,您应该在此寄存器中设置一些位以启用某些通道。

/* Channel2 - 90 degres after*/
TIM_OCInitStructure.TIM_Pulse = 1;

因为周期是4个周期(0到3),所以会产生45度的偏移。通道1在周期0中切换,通道2在周期1中切换,在周期2和3中没有任何反应。