STM32控制SG90舵机教程(180度和360度)

数字舵机主要由马达、减速齿轮、控制电路等组成,只需要发送一次PWM信号就能保持在规定的某个位置。

而模拟舵机是相同于传统的舵机,是需要多次发送PWM信号才能够保持在规定的位置上,实现对舵机的控制,按照规定的要求进行的速度进行转动。

数字舵机在反应速度方面与模拟舵机相比是由优势的。因为数字舵机是拥有微处理器。

下面我们介绍的SG90舵机就是模拟舵机。在这里插入图片描述
从下往上依次接 GND,+5V,PWM输出IO口(我选的是PC6)
在这里插入图片描述
我们选用定时器3通道1完全重映像输出。

控制原理及PWM配置

1)180度

模拟舵机的PWM频率为50HZ,对应的时基周期/PWM周期为20ms。我们的高电平脉宽是在0.5ms—2.5ms进行控制的。
在这里插入图片描述
PWM周期为20ms = (7200*200)/72000000=0.02
所以TIM_Period = 199 //自动重装载值
TIM_Prescaler = 7199 //预分频系数

占空比 = t / T 相关参数如下:
t = 0.5ms——————-舵机会转动 0 °
t = 1.0ms——————-舵机会转动 45°
t = 1.5ms——————-舵机会转动 90°
t = 2.0ms——————-舵机会转动 135°
t = 2.5ms——————-舵机会转动180°

比如说舵机旋转90度,对应高电平时间为1.5ms:
在这里插入图片描述
再附上我的参考代码:

#include timer.h
void TIM3_PWM_Init(u16 arr,u16 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//使能定时器3时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC |        RCC_APB2Periph_AFIO,ENABLE);//使能 PC端口 时钟和 AFIO复用功能 时钟

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;				 //PC6

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOC, &GPIO_InitStructure); //根据设定参数初始化GPIOC.6

GPIO_PinRemapConfig(GPIO_FullRemap_TIM3,ENABLE);  //开启定时器3的部分重映射  改变定时器3的 输出通道 引脚 。比如:通道1的输出引脚为PC6

//初始化定时器3
TIM_TimeBaseStructure.TIM_Period=arr; //自动重装载

TIM_TimeBaseStructure.TIM_Prescaler=psc; //预分频系数
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; //没多大关系
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//向上计数
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);

//初始化 输出比较 参数         输出比较:通过比较来进行输出       
TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1; //pwm模式1:小于有效
TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low;     //通道输出极性   TIM3_CCER寄存器的CC2E位   0:低电平有效  1:高电平有效
TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;  //通道1输出使能
TIM_OC1Init(TIM3,&TIM_OCInitStructure);//定时器3通道2输出的初始化       CNT小于比较值CCR   通道1输出低电平

//使能通道1 输出比较 预装载值
TIM_OC1PreloadConfig(TIM3,TIM_OCPreload_Enable);

//使能定时器3
TIM_Cmd(TIM3,ENABLE);

}

#ifndef __TIMER_H
#define __timer_h
#include “sys.h”

void TIM3_PWM_Init(u16 arr,u16 psc);

#endif

#include “sys.h”
#include “delay.h”
#include “timer.h”

int main(void)
{
delay_init();
TIM3_PWM_Init(199,7199);
while(1)
{
delay_ms(100);
TIM_SetCompare1(TIM3, 195);//0度
delay_ms(100);
TIM_SetCompare1(TIM3, 190);//45度
delay_ms(100);
TIM_SetCompare1(TIM3, 185);//90度
delay_ms(100);
TIM_SetCompare1(TIM3, 180);//135度
delay_ms(100);
TIM_SetCompare1(TIM3, 175);//180度
delay_ms(100);
}
}

360度

360度舵机可以360度旋转,因此与180度舵机有相当大的区别,首先360度舵机不能够控制旋转角度,一般的舵机是给一个特定的PWM,舵机会转到相应的角度,而360度舵机是只能够控制方向和旋转转速,所以360度舵机给定一个PWM,会以特定的速度方向转动。
所以有:
0.5ms----------------正向最大转速;
1.5ms----------------速度为0;
2.5ms----------------反向最大转速;

int main(void)
{
delay_init();
TIM3_PWM_Init(199,7199);
while(1)
{
TIM_SetCompare1(TIM3,195);//正向最大转速
delay_ms(500);
TIM_SetCompare1(TIM3,185);//速度为0
delay_ms(500);
TIM_SetCompare1(TIM3,175);//反向最大转速
delay_ms(500);
}
}

到此结束

版权声明:本文为CSDN博主「Blue噜噜噜」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/SHRtuji/article/details/113354315

生成海报
点赞 0

Blue噜噜噜

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

RT-Thread Studio移植LAN8720A驱动

RTT网络协议栈驱动移植(霸天虎) 1、新建工程 ​ 工程路径不含中文路径名,工程名用纯英文不含任何符号。 2、用CubeMx配置板子外设 2.1、配置时钟 ​ 按照自己板子配置相应时钟。

Lin总线通信在STM32作为主机代码以及从机程序

距离上次做资料准备已经过去六天了。最近在学车,上周末就没有开电脑。这周开始进行了Lin通信的代码整理,目前是可以正常通信的了,采用的是增强型校验方式。后期再进一步跟进研究。。。更新一博,留

4路红外循迹模块使用教程

4路红外循迹模块使用教程 个人原创博客:点击浏览模块详细信息: 工作电压:DC 3.3V~5V 工作电流:尽量选择1A以上电源供电 工作温度:-10℃~50℃ 安装孔

HAL库串口中断

一,配置串口初始化 void MX_USART1_UART_Init(void) {huart1.Instance USART1;huart1.Init.BaudRate 115200;huart1.Init.WordLen