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

比较输出可以方便的改变输出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停止输出

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值