STM32F103 高级定时器的PWM驱动电机注意事项

发布时间 2023-03-22 21:10:44作者: FBshark

此前一直用通用定时器的PWM驱动电机,此次项目采用高级定时器,发现了一些使用上的需要注意的地方,归纳如下:

问题1:初始化输出结构体 OCInitStruct 成员注意加TIM_OCIdleState

今天用TB6612驱动电机, 用TIM1-CH4的PWM ,结果发现设置完毕后电机不转。

    //OCInit Struct
    TIM_OCInitTypeDef OCInitStruct;
    //1. mode
    OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;
    //2. pulse
    OCInitStruct.TIM_Pulse = 50;
    //3. OutputState
    OCInitStruct.TIM_OutputState =TIM_OutputState_Enable;
    //4. polarity
    OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;

    //5. special--for TIM1&TIM8
    //OCInitStruct.TIM_OCIdleState = TIM_OCIdleState_Set;

后来发现问题:TIM1 为高级定时器,还有一个结构体成员(对于F103,该成员只有高级定时器TIM1, TIM8有)

那就是  OCInitStruct.TIM_OCIdleState ,加上这一项之后(取消上面代码的注释)电机正常转了。

 

问题2:PWM 输出需要特定函数

高级定时器需使用以下函数才能激活 PWM 功能(光在初始化结构体中设置 OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1 没有用)。

如果没有激活该函数,则不会产生 PWM 信号,而是单纯的阶跃信号。

TIM_CtrlPWMOutputs(TIM1,ENABLE); //MOE 主输出使能

 使用通用寄存器不需要用该函数。

 

问题3:设置PWM占空比需用专用函数

        TIM_SetCompare1(TIM1, v);
        TIM_SetCompare4(TIM1, v);

我的实验用到TIM1的 CH1 和 CH4,SetCompare1() 用于设置CH1的比较寄存器,对其他通道(CH4)没有影响。

因此如果要控制CH4,就用 TIM_SetCompare4() 函数。