前言
本文是以STM32F103C8T6作为主控芯片,通过PB6端口输出PWM,实现控制180°舵机。
一、舵机控制原理
(一)概述
舵机是一种位置伺服驱动器器,是一种带有输出轴的小装置。当我们向伺服器发送一个控制信号时,输出轴就可以转到特定的位置。只在控制信号持续不变,伺服机构就会保持相对的角度位置不变。如果控制信号发生变化,输出轴的位置也会相应发生变化。舵机的控制大部分都是通过PWM信号控制的。
注:舵机按角度分为90°、180°、270°、360°舵机,其中360°舵机只能控制旋转速度不能固定在某一角度上。
(二)PWM
PWM,英文名Pulse Width Modulation,是脉冲宽度调制缩写,它是通过对一系列脉冲的宽度进行调制,等效出所需要的波形(包含形状及幅值),对模拟信号电平进行数字编码,也就是说通过调节占空比的变化来调节信号、能量等的变化,占空比就是指在一个周期内,信号处于高电平的时间占整个信号周期的百分比。如下图
(三)控制原理
通过向舵机的信号线发送PWM信号控制舵机的输出量,一般来说,PWM的周期及占空比,可通过程序控制的。
当我们向舵机发送脉冲宽度为1.5ms时,舵机的输出轴将移至中间位置0°;
当脉冲宽度为1ms时,舵机的输出轴将移至中间位置-45°;
脉冲宽度为2ms时,舵机的输出轴将移至中间位置45°。
注:不同类型和品牌的伺服电机之间最大位置和最小位置的角度可能会不同。许多伺服器仅旋转约170度(或者只有90度),但宽度为1.5 ms的伺服脉冲通常会将伺服设置为中间位置(通常是指定全范围的一半);具体参考下图
占空比 = t / T 相关参数如下:
t = 0.5ms —————— 舵机会转到 -90 °
t = 1.0ms —————— 舵机会转到 -45°
t = 1.5ms —————— 舵机会转到 0°
t = 2.0ms —————— 舵机会转到 45°
t = 2.5ms —————— 舵机会转到 90°
PWM周期为20ms = (2000*720)/72000000 = 0.2,通过程序设置的TIM_Period = 719,TIM_Prescaler = 1999(本文程序)
二、硬件连接
(一)舵机线说明
(二)引脚连接
主控 | 舵机 |
5V | +5V |
GND | GND |
PB6 | PWM |
三、参考代码
1、初始化
void TIM4_CH1_PWM_Init(u16 arr,u16 psc)
{
GPIO_InitTypeDef GPIO_InitStruct;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct;
TIM_OCInitTypeDef TIM_OCInitTypeStruct;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);
//要开启复用功能的时钟才能重映射
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB ,ENABLE);
//TIM3部分重映射
/*
*查看数据手册,引脚的定时器通道是完全映射,还是部分映射
*二者调用参数不相同
*完全映射 :GPIO_FullRemap_TIM4
*部分映射 :GPIO_PartialRemap_TIM4
*/
//设置该引脚为复用输出功能
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStruct);
//初始化TIM4
TIM_TimeBaseStruct.TIM_Period = arr;//重装载值
TIM_TimeBaseStruct.TIM_Prescaler = psc;//预分频值
TIM_TimeBaseStruct.TIM_ClockDivision = 0; //时钟分频1、2、4分频
TIM_TimeBaseStruct.TIM_CounterMode = TIM_CounterMode_Up;//设置计数模式
TIM_TimeBaseInit(TIM4,&TIM_TimeBaseStruct);
//初始化输出比较参数
TIM_OCInitTypeStruct.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式
TIM_OCInitTypeStruct.TIM_OutputState = TIM_OutputState_Enable;//比较输出使能
TIM_OCInitTypeStruct.TIM_OCPolarity = TIM_OCPolarity_High;//输出极性
TIM_OC1Init(TIM4,&TIM_OCInitTypeStruct); //选择定时器输出通道 TIM4_CH1
//使能预装载寄存器
TIM_OC1PreloadConfig(TIM4,TIM_OCPreload_Enable);
//使能定时器
TIM_Cmd(TIM4,ENABLE);
}
2、主函数
int main(void)
{
TIM4_CH1_PWM_Init(1999,719);//PWM频率=72000000/(719+1)/(1999+1)=50hz=20ms
while(1)
{
//-90度
TIM_SetCompare1(TIM4,1750);//占空比(2000-1750)/2000*20ms=2.5ms
//45度
//TIM_SetCompare1(TIM4,1800);//占空比(2000-1800)/2000*20ms=2ms
//0度
//TIM_SetCompare1(TIM4,1850);//占空比(2000-1850)/2000*20ms=1.5ms
//-45度
//TIM_SetCompare1(TIM4,1900);//占空比(2000-1900)/2000*20ms=1ms
//-90度
//TIM_SetCompare1(TIM4,1945);//占空比(2000-1945)/2000*20ms=0.5ms
}
}
相关代码,有需要可以自行下载(实现了能过串只发送控制旋转)
网盘链接:
链接:https://pan.baidu.com/s/1p-lAXJ4pS6-Tw3DFqxdQhQ
提取码:ml04
如有什么问题欢迎指出来,有什么模块可以联系博主,博主会查询资料分享出来。
版权声明:本文为CSDN博主「Me-Space」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_45419341/article/details/123020872
前言
本文是以STM32F103C8T6作为主控芯片,通过PB6端口输出PWM,实现控制180°舵机。
一、舵机控制原理
(一)概述
舵机是一种位置伺服驱动器器,是一种带有输出轴的小装置。当我们向伺服器发送一个控制信号时,输出轴就可以转到特定的位置。只在控制信号持续不变,伺服机构就会保持相对的角度位置不变。如果控制信号发生变化,输出轴的位置也会相应发生变化。舵机的控制大部分都是通过PWM信号控制的。
注:舵机按角度分为90°、180°、270°、360°舵机,其中360°舵机只能控制旋转速度不能固定在某一角度上。
(二)PWM
PWM,英文名Pulse Width Modulation,是脉冲宽度调制缩写,它是通过对一系列脉冲的宽度进行调制,等效出所需要的波形(包含形状及幅值),对模拟信号电平进行数字编码,也就是说通过调节占空比的变化来调节信号、能量等的变化,占空比就是指在一个周期内,信号处于高电平的时间占整个信号周期的百分比。如下图
(三)控制原理
通过向舵机的信号线发送PWM信号控制舵机的输出量,一般来说,PWM的周期及占空比,可通过程序控制的。
当我们向舵机发送脉冲宽度为1.5ms时,舵机的输出轴将移至中间位置0°;
当脉冲宽度为1ms时,舵机的输出轴将移至中间位置-45°;
脉冲宽度为2ms时,舵机的输出轴将移至中间位置45°。
注:不同类型和品牌的伺服电机之间最大位置和最小位置的角度可能会不同。许多伺服器仅旋转约170度(或者只有90度),但宽度为1.5 ms的伺服脉冲通常会将伺服设置为中间位置(通常是指定全范围的一半);具体参考下图
占空比 = t / T 相关参数如下:
t = 0.5ms —————— 舵机会转到 -90 °
t = 1.0ms —————— 舵机会转到 -45°
t = 1.5ms —————— 舵机会转到 0°
t = 2.0ms —————— 舵机会转到 45°
t = 2.5ms —————— 舵机会转到 90°
PWM周期为20ms = (2000*720)/72000000 = 0.2,通过程序设置的TIM_Period = 719,TIM_Prescaler = 1999(本文程序)
二、硬件连接
(一)舵机线说明
(二)引脚连接
主控 | 舵机 |
5V | +5V |
GND | GND |
PB6 | PWM |
三、参考代码
1、初始化
void TIM4_CH1_PWM_Init(u16 arr,u16 psc)
{
GPIO_InitTypeDef GPIO_InitStruct;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct;
TIM_OCInitTypeDef TIM_OCInitTypeStruct;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);
//要开启复用功能的时钟才能重映射
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB ,ENABLE);
//TIM3部分重映射
/*
*查看数据手册,引脚的定时器通道是完全映射,还是部分映射
*二者调用参数不相同
*完全映射 :GPIO_FullRemap_TIM4
*部分映射 :GPIO_PartialRemap_TIM4
*/
//设置该引脚为复用输出功能
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStruct);
//初始化TIM4
TIM_TimeBaseStruct.TIM_Period = arr;//重装载值
TIM_TimeBaseStruct.TIM_Prescaler = psc;//预分频值
TIM_TimeBaseStruct.TIM_ClockDivision = 0; //时钟分频1、2、4分频
TIM_TimeBaseStruct.TIM_CounterMode = TIM_CounterMode_Up;//设置计数模式
TIM_TimeBaseInit(TIM4,&TIM_TimeBaseStruct);
//初始化输出比较参数
TIM_OCInitTypeStruct.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式
TIM_OCInitTypeStruct.TIM_OutputState = TIM_OutputState_Enable;//比较输出使能
TIM_OCInitTypeStruct.TIM_OCPolarity = TIM_OCPolarity_High;//输出极性
TIM_OC1Init(TIM4,&TIM_OCInitTypeStruct); //选择定时器输出通道 TIM4_CH1
//使能预装载寄存器
TIM_OC1PreloadConfig(TIM4,TIM_OCPreload_Enable);
//使能定时器
TIM_Cmd(TIM4,ENABLE);
}
2、主函数
int main(void)
{
TIM4_CH1_PWM_Init(1999,719);//PWM频率=72000000/(719+1)/(1999+1)=50hz=20ms
while(1)
{
//-90度
TIM_SetCompare1(TIM4,1750);//占空比(2000-1750)/2000*20ms=2.5ms
//45度
//TIM_SetCompare1(TIM4,1800);//占空比(2000-1800)/2000*20ms=2ms
//0度
//TIM_SetCompare1(TIM4,1850);//占空比(2000-1850)/2000*20ms=1.5ms
//-45度
//TIM_SetCompare1(TIM4,1900);//占空比(2000-1900)/2000*20ms=1ms
//-90度
//TIM_SetCompare1(TIM4,1945);//占空比(2000-1945)/2000*20ms=0.5ms
}
}
相关代码,有需要可以自行下载(实现了能过串只发送控制旋转)
网盘链接:
链接:https://pan.baidu.com/s/1p-lAXJ4pS6-Tw3DFqxdQhQ
提取码:ml04
如有什么问题欢迎指出来,有什么模块可以联系博主,博主会查询资料分享出来。
版权声明:本文为CSDN博主「Me-Space」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_45419341/article/details/123020872
暂无评论