本章将介绍使用stm32Cubemx软件配置PWM来控制SG90舵机角度。
一、SG90角度与PWM转换关系
舵机参数:f=50hz,t=20ms 根据选用的SG90参数,我们需要给出周期为20ms,其中高电平时间为 0.5ms-2.5ms的信号 0.5ms-------------0度; 2.5%
1.0ms------------45度; 5.0%
1.5ms------------90度; 7.5%
2.0ms-----------135度; 10.0%
2.5ms-----------180度; 12.5%
二、Cubemx参数配置
1、时钟配置
2、定时器配置PWM输出设置
根据SG90的参数,我们需要设置PWM输出一个周期时间为20ms,初始值为0.5ms高电平的信号。
计算方法:Timer定时器时钟我们设置为240Mhz,这里我们将预分频设置为239,则一个周期为240Mhz/(239+1)=1Mhz(即1us),所以20ms的周期我们需要计数20000-1=19999个填入Counter Period参数中。
另外,我们还需要一个默认脉冲宽度为0.5ms的,0.5/20*20000=500
其他设置如下图所示:
三、MDK代码修改与运行
1.PWM与SG90转换角度转换函数
方便实验我们将所需要的角度与PWM计数值对应关系封装成一个函数。只需要输入我们所需要的角度和相关定时器参数即可。
代码如下(示例):
//设置SG90为参数范围内(0~180°)任意度数
/*
* htim:要设置的定时器句柄
* Channel:PWM输出通道
* countPeriod:pWM一个周期计数值,这里为20000
* CycleTime:一个周期多少ms,这里为20
*
*/
void Set_SG90_angle(TIM_HandleTypeDef * htim,uint32_t Channel,uint8_t angle,uint32_t countPeriod,uint32_t CycleTime)
{
uint16_t compare_value=0;
if(angle<=180)
{
//角度转化为数值
compare_value=0.5*countPeriod/CycleTime+angle*countPeriod/CycleTime/90;
__HAL_TIM_SET_COMPARE(htim, Channel, compare_value);
}
}
2.实验现象
这里在主函数增加了按键扫描通过按键控制SG90正反转180°。
另外还增加了串口printf函数,打印SG90旋转时的角度变化。
代码如下(示例):
key=KEYPRESS(); //按键
if(key==1)//按键1按下SG90从0°旋转到180°
{
for(u8 i=0;i<180;i++)//从0到180°递增
{
Set_SG90_angle(&htim5,TIM_CHANNEL_1,i,20000,20);
printf("SG90角度:%d°",i);
HAL_Delay(5);
}
}
if(key==2)//按键2按下SG90从180°旋转到0°
{
for(u8 j=180;j>0;j--)//从180°到0°递减
{
Set_SG90_angle(&htim5,TIM_CHANNEL_1,j,20000,20);
printf("SG90角度:%d°",j);
HAL_Delay(5);
}
}
可以看到按键按下SG90按照我们预期的动作变化。实验成功。
本章将介绍使用stm32Cubemx软件配置PWM来控制SG90舵机角度。
一、SG90角度与PWM转换关系
舵机参数:f=50hz,t=20ms 根据选用的SG90参数,我们需要给出周期为20ms,其中高电平时间为 0.5ms-2.5ms的信号 0.5ms-------------0度; 2.5%
1.0ms------------45度; 5.0%
1.5ms------------90度; 7.5%
2.0ms-----------135度; 10.0%
2.5ms-----------180度; 12.5%
二、Cubemx参数配置
1、时钟配置
2、定时器配置PWM输出设置
根据SG90的参数,我们需要设置PWM输出一个周期时间为20ms,初始值为0.5ms高电平的信号。
计算方法:Timer定时器时钟我们设置为240Mhz,这里我们将预分频设置为239,则一个周期为240Mhz/(239+1)=1Mhz(即1us),所以20ms的周期我们需要计数20000-1=19999个填入Counter Period参数中。
另外,我们还需要一个默认脉冲宽度为0.5ms的,0.5/20*20000=500
其他设置如下图所示:
三、MDK代码修改与运行
1.PWM与SG90转换角度转换函数
方便实验我们将所需要的角度与PWM计数值对应关系封装成一个函数。只需要输入我们所需要的角度和相关定时器参数即可。
代码如下(示例):
//设置SG90为参数范围内(0~180°)任意度数
/*
* htim:要设置的定时器句柄
* Channel:PWM输出通道
* countPeriod:pWM一个周期计数值,这里为20000
* CycleTime:一个周期多少ms,这里为20
*
*/
void Set_SG90_angle(TIM_HandleTypeDef * htim,uint32_t Channel,uint8_t angle,uint32_t countPeriod,uint32_t CycleTime)
{
uint16_t compare_value=0;
if(angle<=180)
{
//角度转化为数值
compare_value=0.5*countPeriod/CycleTime+angle*countPeriod/CycleTime/90;
__HAL_TIM_SET_COMPARE(htim, Channel, compare_value);
}
}
2.实验现象
这里在主函数增加了按键扫描通过按键控制SG90正反转180°。
另外还增加了串口printf函数,打印SG90旋转时的角度变化。
代码如下(示例):
key=KEYPRESS(); //按键
if(key==1)//按键1按下SG90从0°旋转到180°
{
for(u8 i=0;i<180;i++)//从0到180°递增
{
Set_SG90_angle(&htim5,TIM_CHANNEL_1,i,20000,20);
printf("SG90角度:%d°",i);
HAL_Delay(5);
}
}
if(key==2)//按键2按下SG90从180°旋转到0°
{
for(u8 j=180;j>0;j--)//从180°到0°递减
{
Set_SG90_angle(&htim5,TIM_CHANNEL_1,j,20000,20);
printf("SG90角度:%d°",j);
HAL_Delay(5);
}
}
可以看到按键按下SG90按照我们预期的动作变化。实验成功。
举报