学习记录--定时器PWM输出(控制舵机转任意角度,呼吸灯)

一,理论部分

可参考(11条消息) 【STM32】通用定时器的PWM输出(实例:PWM输出)_Yngz_Miao的博客-CSDN博客

(具体可见中文参考手册,在操作过程中会提)

二,操作步骤:

1,CUBEMX配置:

呼吸灯:

(1)从原理图找到自己板子上LED0对应的IO口(如图为PB5)

(2)将PB5设置为定时器通道

(3)发现是定时器3(由中文参考手册找到TIM3所挂的总线)配好时钟树

(4)看板子的原理图找到LED是低电平亮

配置输出模式:

mode1:在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为有效电平,否则为无效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为无效电平(OC1REF=0),否则为有效电平(OC1REF=1)。

注意:模式只决定何时输出有效电平,而什么是有效电平通过输出极性(Polarity)确定

mode2:与mode1相反

PWM输出控制舵机:

MG996参数:接收的PWM信号频率为50HZ,即周期为20ms。
当高电平的脉宽在0.5ms-2.5ms之间时舵机就可以对应旋转到不同的角度。

2.在main中开启PWM输出:

    HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);
    HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_2);

3.设置角度的函数

/*
每增加1 °,需加高电平时长:(2500-500)÷180 = 11.1us
因此某角度值ang,需要的总高电平时长:(ang*11.1 +500)us
*/
void My_SetServo(float angle)
{
	uint16_t pwmout;
	
	if(angle > 180)
	{
		angle = 180;
	}
	if(angle < 0 )
	{
		angle = 0;
	}
	
	pwmout = (angle*11.1 +500);
	__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, pwmout);
}

4.main函数:

  while (1)
  {
		//呼吸灯:
		while(i < 19000)
		{
			i++;
			__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, i);	
		}
		while(i)
		{
			i--;
			__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, i);
		}
		
		//控制舵机(90°与45°切换)
		/*HAL_Delay(1000);
		My_SetServo(90);
		
		HAL_Delay(1000);
		My_SetServo(45);
		*/

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值