STM32CubeMX笔记(9)--定时器生成PWM特定波形,控制舵机转动


1、舵机相关知识

1.1 相关舵机的知识点:

  • 舵机的分类
    按照旋转角度
    180°舵机:能给定角度、固定转速。 只能在0度到180度之间运动,超过范围,舵机轻则齿轮打坏,重则烧坏内部电路.
    360°舵机:能360度转动, 能控制转速。但不能调节转动的角度
    按照控制信号
    模拟舵机:要持续提供PWM信号才能固定角度。优点:便宜。
    数字舵机:只要给一次PWM信号就能固定角度。优点:高精度,响就快,抖动小,更大的角度固定力。

  • 几个重要参数
    最大扭矩
    如MG996, 最大扭矩: 13KG/cm. 这个是在舵机堵转时测得的, 其时距离轴中心1cm处能挂起的重量.
    工作电压
    如常用的3.0V~7.2V, 接入电压不同, 所能产生的工作扭矩自然不同. 直接影响角度固定力。

  • 引脚说明
    红色:供电;电流比较大,除非测试, 真不建议在开发板上取电;
    粽色:地线;必须与控制器, 如SMT32芯片共地;
    橙色:PWM信号线;接芯片的TIMx外设的CHx脚;

在这里插入图片描述

1.2 舵机的控制:

  • 原理简介
    舵机接收的是PWM信号,能使舵机内部电路产生一个偏置电压,触发电机通过减速齿轮带动电位器移动,当电压差为零时,电机停转,从而达到伺服的效果。
    即,给舵机提供一个特定的PWM信号,舵机就可以旋转到指定的位置。

  • PWM信号、角度
    舵机接收的PWM信号频率为50HZ,即周期为20ms。当高电平的脉宽在0.5ms-2.5ms之间时舵机就可以对应旋转到不同的角度。
    在这里插入图片描述

为了更好地理解其信号,和编写代码,把PWM关键点转换如下:

PWM信号周期: 20000us
0度时,高电平时长: 500us
180度时, 高电平时长:2500us
每增加1 °,需增加高电平时长:(2500-500)÷180 = 11.1us
某角度值A,需要的总高电平时长:(A x11.1 +500)us


故在设置定时器参数时
预分频(PSC):72-1;
计数值(Counter):20000-1;(计数从0开始,所以要减1)

设置计数值为20000对应PWM信号周期:20000us;
控制对应的为对应通道的CCR设置为:500-2500;

重点解释一下:PSC, ARR, CCR, CNT
PSC:TIM时钟的分频系数:72;内部时钟经PSC值分频后, 传给CNT计数器使用;
CNT:计数器,CNT每计数一次的脉冲时长为:1÷(CLK÷PSC) = 1÷(72000000÷72) = 0.000001s/次 = 1us/次;
ARR:自动重装载值:20000,AutoReload Register也称为Counter Period,CNT计数器经过多少次脉冲就重新开始计数。用这个值可控制需要的PWM信号周期:1us x 20 000次 = 20 000us = 20ms
CCR:用于控制周期内高电平时长, 当CNT<CCR时, 为有效电平. 而有效电平的高低, 则是通过CCER寄存器设置的, 默认的有效电平为高电平.

特别地说明: 把所有ms值, 转换为us值, 是为了方便代码的编写和理解


2、STM32CubeMX引脚设置和代码生成

2.1 相关STM32CubeMX生成代码配置如下:

相关外部晶振的设置参考:STM32CubeMX笔记(5)–定时器中断

1、在STM32CubeMX软件右侧:
选择Times定时器设置项,根据下图进行配置相对应的定时器相关参数的设置。
(选择内部时钟源、设置通道的模式、设置预分频、计数值)

定时器频率=时钟频率/(预分频*计数值)

T i m e s ( H z ) = I n t e r n e l C l o c k ( M H z ) P S C ∗ C o u n t e r . Times(Hz) = \frac{InternelClock(MHz)}{PSC*Counter}. Times(Hz)=PSCCounterInternelClock(MHz).

下面图中设置的舵机的频率为50Hz,使用定时器8生成PWM波

其中内部时钟频率为APB1(InternelClock)频率为72MHz(根据时钟树看出)

预分频(PSC):72-1; 计数值(Counter):20000-1;(计数从0开始,所以要减1)
设置计数值为20000对应PWM信号周期:20000us;
控制对应的为对应通道的CCR设置为:500-2500;

设 置 生 成 的 频 率 = 72000000 72 ∗ 20000 = 50 H z 设置生成的频率= \frac{72000000}{72*20000}=50Hz =722000072000000=50Hz

2、在STM32CubeMX软件右上角,点击GEBERATE CODE项,生成代码。


相关定时器的参数设置:(定时器8为例)
在这里插入图片描述


3、编写相关的C函数文件

3.1、相关PWM函数开启:

1)添加定时器8的通道1和通道2的PWM生成开启使能函数,放置于到main.c中的用户代码区

/* USER CODE BEGIN 2 */
	HAL_TIM_PWM_Start(&htim8,TIM_CHANNEL_1);
	HAL_TIM_PWM_Start(&htim8,TIM_CHANNEL_2);
/* USER CODE END 2 */

3.2、相关PWM占空比设置:

2)通过类似如下的设置,即可设置定时器8的通道1和通道2的相关占空比寄存器,直接控制PWM的占空比输出

	TIM8->CCR1 = 800; 
	TIM8->CCR2 = 1800; 

3.3、相关PWM占空比设置函数改进:

3)将上述寄存器进行改进,整合出相关的函数文件

/**************************************************************************
函数功能:定时器TIMx的PWM输出占空比CCRx设置函数
入口参数:[TIMx]:TIM1~8、[CHx]:TIM_CHANNEL_1~4、[CCR]:0~65535(舵机控制时:0~2500)
返回  值:无
说    明:通过设置TIMx寄存器CCRx的值设置输出通道的占空比
**************************************************************************/
void TIM_SetCCR(TIM_TypeDef *TIMx, uint32_t CHx, uint16_t CCR) 
{
    
        
		if(CHx==TIM_CHANNEL_1)    TIMx->CCR1 = CCR;
		if(CHx==TIM_CHANNEL_2)    TIMx->CCR2 = CCR;
		if(CHx==TIM_CHANNEL_3)    TIMx->CCR3 = CCR;
		if(CHx==TIM_CHANNEL_4)    TIMx->CCR4 = CCR;
} 

函数的引用效果如下:

以下两个代码片段的使用效果相同,如下。
设置通道1占空比为50hz,高电平时间800us
设置通道2占空比为50hz,高电平时间1800us

	TIM_SetCCR(TIM8,TIM_CHANNEL_1,800);
	TIM_SetCCR(TIM8,TIM_CHANNEL_2,1800);
	TIM8->CCR1 = 800; 
	TIM8->CCR2 = 1800; 

进一步测试,将以下代码复制到主函数的循环中:

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    
    
		TIM_SetCCR(TIM8,TIM_CHANNEL_1,800);
		TIM_SetCCR(TIM8,TIM_CHANNEL_2,1800);
		HAL_Delay(1000);
		
		TIM_SetCCR(TIM8,TIM_CHANNEL_1,1800);
		TIM_SetCCR(TIM8,TIM_CHANNEL_2,800);
		HAL_Delay(1000);

    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */

4、编译工程文件,使用ST-Link烧录,测试定时器中断

将对应的通道输出接口连接上舵机的PWM控制线,进行相关转角的测试。
对应舵机来回旋转。


猜你喜欢

转载自blog.csdn.net/weixin_44444810/article/details/120675567