写这个博客是为了记录我的学习过程哈哈,有什么出错的地方希望各位大佬可以为我指出,谢谢!!
一、开发平台
1、软件下载
可以参考上一篇博客的下载地址,本篇就不过多赘述了
STM32L431(CubeMX)使用DHT11读取环境温度与湿度并通过串口打印
二、舵机的控制原理
这是我用的sg90舵机
舵机是电机的一种,是一种位置(角度)伺服的驱动器,适用于那些需要角度不断变化并可以保持的控制系统。SG90型号舵机可以在0~180°范围内旋转,如上图所示,SG90舵机有三根线,一根电源线5V(红色),一根GND(棕色)还有一根信号线(橙色)。
SG90的舵机要求控制舵机的 PWM 信号频率在50Hz左右,即周期为 20ms 的 PWM 信号,当该信号的高电平部分在0.5ms - 2.5ms之间时,对应舵机转动的角度。
那么PWM信号是什么?
PWM,英文名Pulse Width Modulation,是脉冲宽度调制缩写,它是通过对一系列脉冲的宽度进行调制,等效出所需要的波形(包含形状以及幅值),对模拟信号电平进行数字编码,也就是说通过调节占空比的变化来调节信号、能量等的变化,占空比就是指在一个周期内,信号处于高电平的时间占据整个信号周期的百分比,例如方波的占空比就是50%.
PWM的信号频率:是指一秒内信号从高电平到低电平的次数
PWM的占空比:是指在一个周期内,信号处于高电平的时间占据整个信号周期的百分比。
高电平脉宽与舵机角度具体对应的情况如下:
高电平脉宽 | 舵机角度 |
---|---|
0.5ms | 0° |
1.0ms | 45° |
1.5ms | 90° |
2.0ms | 135° |
2.5ms | 180° |
也可以参考下图理解
三、CubeMX配置
芯片选择
选择外部高速时钟HSE
接下来配置PWM功能:
这里我选择TIM16定时器来产生PWM,将PB8引脚设置为TIM16_CH1,参照时钟树可知,TIM16内部时钟源是PCLK2=80MHz,50Hz的PWM的公式为:PCLK2/(PSC+1)/(ARR+1),我这里将PSC(预分频系数)设置为79,ARR(自动重载值)设置为19999,所以可得
PWM的频率为:80000000/80/20000=50Hz
其他的设置默认,Pulse设置为0。
时钟树的配置如下
四、keil
生成工程文件后打开keil5
main.c
添加TIM16定时器初始化函数
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_TIM16_Init();
/* USER CODE BEGIN 2 */
设置一个pulse值
/* USER CODE BEGIN 1 */
uint16_t pluse = 500;
/* USER CODE END 1 */
pulse值是指PWM波的高电平时长计数个数,设置为500即是时长为0.5ms。
下面代码可以使得舵机在0~180°之间来回转动
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
HAL_TIM_PWM_Start(&htim16,TIM_CHANNEL_1);
HAL_Delay(1000);
pluse += 500;
if(pluse == 3000)
{
//如果舵机角度大于180°,回零
pluse = 500;
}
__HAL_TIM_SetCompare(&htim16, TIM_CHANNEL_1, (uint16_t)pluse);
}
/* USER CODE END 3 */
实验效果如下:
202204191656