PWM驱动简介
STM32CubeMX工程配置
程序编写
————————————————————————————————————————
这里我们使用的是STM32F103RBT6系列,采用幻尔科技的LD-1501MG数字舵机。
还是挺好用的。这里的芯片RBT6 也可以在Cube进行修改,大差不差。
PWM驱动简介
舵机驱动角度和PWM 脉宽范围有关系,根据LD-1501MG数字舵机的具体对应为500--0度 1500--90度 2500--180度,通过STM32的定时器功能输出PWM波来控制舵机进行转动。
工程配置
首先我们的时钟要选择外部高速时钟,下面是RCC(Reset and Clock Control)全局中断是指在嵌入式系统中,与系统的复位和时钟控制相关的中断功能。也可以使能。
然后系统是映射配置。
时钟树设置72HZ的频率,2分配。(可以参考下面的时钟树)
选择定时器3通道1、2、3、4 和定时器4的1、2、3、4为PWM输入模式并且设置先对应的引脚。
由于我们时钟频率为72HZ,所以预分频为72-1=71,设置装载初值为2000-1=199999详情可以看一下下面的参数。
参数 | 作用 |
Prescaler (PSC - 16 bits value) | 预分频,定时器计数的频率。当主频为72Mhz,PSC为71时,计数频率为72/(71+1)=1Mhz,即每个周期1us |
Counter Mode | 递增计数或者递减计数 |
Counter Period (AutoReload Register - 16 bits value ) | 自动重载值,当计数到这个值时,计数器清零,重新计数。计数周期为1us,ARR为19999时,PWM周期为1us*(19999+1)为20ms,就是频率为50HZ |
再来看一下PWM的设置参数
![]() ![]() | 翻转计数值,当计数到达这个值时,电平翻转 |
CH Polarity | 输出极性,即计数到达Pulse前的电平状态 |
然后就可以生成代码啦,注意路径还有格式。
编写代码
TIM_HandleTypeDef htim3; 和 TIM_HandleTypeDef htim4;
这些变量声明了两个TIM_HandleTypeDef类型的变量,即定时器句柄。
这些句柄用于初始化和配置TIM3和TIM4定时器。
Systemclock_Config配置系统时钟,
初始化TIM3和TIM4定时器,
初始化GPIO引脚。
使用了HAL库函数来启动PWM输出。通过调用HAL_TIM_PWM_Start
函数,启动了不同定时器。
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);:启动了TIM3定时器的通道1的PWM输出。
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_2);:启动了TIM3定时器的通道2的PWM输出。
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_3);:启动了TIM3定时器的通道3的PWM输出。
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_4);:启动了TIM3定时器的通道4的PWM输出。
HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_1);:启动了TIM4定时器的通道1的PWM输出。
HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_2);:启动了TIM4定时器的通道2的PWM输出。
HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_3);:启动了TIM4定时器的通道3的PWM输出。
HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_4);:启动了TIM4定时器的通道4的PWM输出。
循环跑:
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_4, 500);设置TIM3定时器的通道4的PWM输出占空比为500,对应0°位置。
HAL_Delay(1000);:延时1秒,即1000毫秒。
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_4, 2500);设置TIM3定时器的通道4的PWM输出占空比为2500,对应180°位置。
HAL_Delay(1000);:再次延时1秒。
以上四个步骤分别设置了TIM3定时器的通道4的PWM输出占空比为500和2500,实现了从0°到180°位置的控制。
接下来的代码段重复了上述相同的步骤,但是分别设置了TIM3定时器的通道3、通道2、通道1,以及TIM4定时器的通道4、通道3、通道2、通道1的PWM输出占空比。每次设置占空比后都有一个1秒的延时。
通过这样的循环,不断地设置不同通道的PWM输出占空比,可以实现电机输出轴在不同位置之间的控制。