赞
踩
比较输出可以方便的改变输出pwm波的周期,可以方便的驱动步进电机,参考了野火步进电机相关历程。
1.使用stm32cubemx初始化定时器,设置比较周期与分频系数等,输出改为翻转,每次计时完成翻转设定引脚电平
2.使能中断
3.在输出比较的回调函数中读取当前定时器的值,并且将比较计数器的值加再当前值上,使定时器再继续计数到比较计数器值时再次发生中断改变设定引脚状态,实现频率可变pwm波输出
- void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim)
- {
- uint32_t count;
- static int num = 0;
-
- /*获取当前计数*/
- count = __HAL_TIM_GET_COUNTER(&TIM_TimeBaseStructure);
-
- /*设置比较数值*/
- __HAL_TIM_SET_COMPARE(&TIM_TimeBaseStructure, MOTOR_PUL_CHANNEL_x, count + OC_Pulse_num);
- }
4.在定时器初始化后添加如下语句
-
- /* 启动比较输出并使能中断 */
- HAL_TIM_OC_Start_IT(&htim8, TIM_CHANNEL_1);
- /*使能比较通道*/
- TIM_CCxChannelCmd(TIM8, TIM_CHANNEL_1, TIM_CCx_ENABLE);
4.设置电机s启动防止提速太快而滑步,两个标准位位收到启动信号和停止信号时又主函数设置
- void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim)
- {
- uint32_t count;
- static int num = 0;
-
- /*获取当前计数*/
- count = __HAL_TIM_GET_COUNTER(&TIM_TimeBaseStructure);
-
- /*设置比较数值*/
- __HAL_TIM_SET_COMPARE(&TIM_TimeBaseStructure, MOTOR_PUL_CHANNEL_x, count + OC_Pulse_num);
- if(Start_Flag){
- if(OC_Pulse_num > 200){
- OC_Pulse_num--;
- }
- else Start_Flag = 0;
- }
- if(Stop_Flag){
- if(OC_Pulse_num < 1200){
- num++;
- if(num >= 3){
- OC_Pulse_num++;
- num=0;
- }
- }
- else {
- Stop_Flag = 0;
- HAL_TIM_PWM_Stop(&TIM_TimeBaseStructure,TIM_CHANNEL_1);
-
- }
- }

5.主函数开始电机初始化和pwm输出,相关函数
- HAL_TIM_PWM_Start(&TIM_TimeBaseStructure,TIM_CHANNEL_1);//pwm开始输出
- HAL_TIM_PWM_Start(&TIM_TimeBaseStructure,TIM_CHANNEL_1);//pwm停止输出
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。