【平衡小车专栏】STM32F103 高级定时器的PWM驱动电机注意事项
此前一直用通用定时器的PWM驱动电机,此次项目采用高级定时器,发现了一些使用上的需要注意的地方,归纳如下:
问题1:初始化输出结构体 OCInitStruct 成员要完整补全
今天用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 ,加上这一项之后(取消上面代码的注释)电机正常转了。
补充:
另外需要注意的是,如果使能两路TIM 频道,无论是否使用OCN,都要初始化所有结构体成员,还包括以下结构体成员。
否则有机率会出现两路PWM不同步的现象。(例如我遇到的 TIM1 CH1 和 CH4使能后,采用相同初始化方式(少了一些成员),但输出的PWM波形不一致)
//special--for TIM1&TIM8 OCInitStruct.TIM_OCIdleState = TIM_OCIdleState_Set; OCInitStruct.TIM_OCNIdleState = TIM_OCNIdleState_Reset; OCInitStruct.TIM_OCNPolarity = TIM_OCNPolarity_Low; OCInitStruct.TIM_OutputNState = TIM_OutputNState_Disable;
问题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() 函数。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
2019-03-21 HeadFirst Ruby 第十章总结 Comparable & Enumerable