当前位置:   article > 正文

stm32高级定时器比较输出频率可变pwm波控制步进电机转速_步进电机pwm比较输出

步进电机pwm比较输出

比较输出可以方便的改变输出pwm波的周期,可以方便的驱动步进电机,参考了野火步进电机相关历程。

1.使用stm32cubemx初始化定时器,设置比较周期与分频系数等,输出改为翻转,每次计时完成翻转设定引脚电平

 2.使能中断

3.在输出比较的回调函数中读取当前定时器的值,并且将比较计数器的值加再当前值上,使定时器再继续计数到比较计数器值时再次发生中断改变设定引脚状态,实现频率可变pwm波输出

  1. void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim)
  2. {
  3. uint32_t count;
  4. static int num = 0;
  5. /*获取当前计数*/
  6. count = __HAL_TIM_GET_COUNTER(&TIM_TimeBaseStructure);
  7. /*设置比较数值*/
  8. __HAL_TIM_SET_COMPARE(&TIM_TimeBaseStructure, MOTOR_PUL_CHANNEL_x, count + OC_Pulse_num);
  9. }

4.在定时器初始化后添加如下语句

  1. /* 启动比较输出并使能中断 */
  2. HAL_TIM_OC_Start_IT(&htim8, TIM_CHANNEL_1);
  3. /*使能比较通道*/
  4. TIM_CCxChannelCmd(TIM8, TIM_CHANNEL_1, TIM_CCx_ENABLE);

4.设置电机s启动防止提速太快而滑步,两个标准位位收到启动信号和停止信号时又主函数设置 

  1. void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim)
  2. {
  3. uint32_t count;
  4. static int num = 0;
  5. /*获取当前计数*/
  6. count = __HAL_TIM_GET_COUNTER(&TIM_TimeBaseStructure);
  7. /*设置比较数值*/
  8. __HAL_TIM_SET_COMPARE(&TIM_TimeBaseStructure, MOTOR_PUL_CHANNEL_x, count + OC_Pulse_num);
  9. if(Start_Flag){
  10. if(OC_Pulse_num > 200){
  11. OC_Pulse_num--;
  12. }
  13. else Start_Flag = 0;
  14. }
  15. if(Stop_Flag){
  16. if(OC_Pulse_num < 1200){
  17. num++;
  18. if(num >= 3){
  19. OC_Pulse_num++;
  20. num=0;
  21. }
  22. }
  23. else {
  24. Stop_Flag = 0;
  25. HAL_TIM_PWM_Stop(&TIM_TimeBaseStructure,TIM_CHANNEL_1);
  26. }
  27. }

5.主函数开始电机初始化和pwm输出,相关函数

  1. HAL_TIM_PWM_Start(&TIM_TimeBaseStructure,TIM_CHANNEL_1);//pwm开始输出
  2. HAL_TIM_PWM_Start(&TIM_TimeBaseStructure,TIM_CHANNEL_1);//pwm停止输出

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/535061
推荐阅读
相关标签
  

闽ICP备14008679号