目录
以180°SG90舵机为例学习舵机
舵机简介
SG90舵机是一种位置(角度)伺服的驱动器,适用于那些需要角度不断变化并可以保持的控制系统。
伺服(Servo)是ServoMechanism一词的简写,来源于希腊,其含义是奴隶,顾名思义,就是指系统跟随外部指令进行人们所期望的运动,而其中的运动要素包括位置、速度和力矩等物理量。
常见舵机有数字舵机和模拟舵机:
数字舵机主要由马达、减速齿轮、控制电路等组成,只需要发送一次PWM信号就能保持在规定的某个位置。
模拟舵机是相对于传统的舵机,是需要多次发送PWM信号才能够保持在规定的位置上,实现对舵机的控制,按照规定的要求进行的速度进行转动。
SG90参数
工作电压建议:5V
工作原理
舵机内部有一个基准电压,微处理器产生的PWM信号通过信号线进入舵机产生直流偏置电压,与舵机内部的基准电压作比较,获得电压差输出。电压差的正负输出到电机驱动芯片上,从而决定正反转。当舵机开始旋转的时候,舵机内部通过级联减速齿轮带动电位器旋转,使得电压差为零,电机停止转动。
了解即可
舵机接线
棕色(图中黑色)接GND,红色接5V,橙色(图中黄色)接单片机IO口
驱动方式
舵机的控制信号为周期是 20ms的脉宽调制(PWM)信号,其中脉冲宽度从 0.5ms-2.5ms,相对应舵盘的位置为0-180 度,呈线性变化。也就是说,给它提供一定的脉宽,它的输出轴就会保持在一个相对应的角度上,无论外界转矩怎样改变,直到给它提供一个另外宽度的脉冲信号,它才会改变输出角度到新的对应的位置上。舵机内部有一个基准电路,产生周期 20ms,宽度 1.5ms 的基准信号,有一个比较器,将外加信号与基准信号相比较,判断出方向和大小,从而产生电机的转动信号
注意:运转时,舵机转到你指定的角度需要一定的时间,转动的角度越大,需要的时间越久,所以你可能需要等待一定的时间。如果你刚刚给舵机发送指令转到180度,紧接着又发送指令转到90度,舵机会不转到180度再转到90度,而是在接受到信号时直接在当前的角度直接转到90度去。
将-90°定义为0度,则图中角度都加90度
高电平持续时间/ms | 舵机角度/° |
---|---|
0.5 | 0 |
1.0 | 45 |
1.5 | 90 |
2.0 | 135 |
2.5 | 180 |
代码示例
定时器的输出比较产生周期20ms的PWM,然后根据角度找到对应的高电平时间,然后通过Servo_SetAngle()函数映射到对应占空比。
void Servo_SetAngle(float Angle)
{
TIM_SetCompare1(TIM2,Angle / 180 * 2000 + 500);
}
Servo.h
#ifndef _SERVO_H_
#define _SERVO_H_
void Servo_Init(void);
void Servo_SetAngle(float Angle);
#endif
Servo.c
#include "stm32f10x.h" // Device header
void Servo_Init(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
TIM_InternalClockConfig(TIM2);
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInitStructure.TIM_Period = 20000 - 1; //ARR
TIM_TimeBaseInitStructure.TIM_Prescaler = 72 - 1; //PSC
TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_OCStructInit(&TIM_OCInitStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 0; //CCR
TIM_OC1Init(TIM2, &TIM_OCInitStructure);
TIM_Cmd(TIM2, ENABLE);
}
void Servo_SetAngle(float Angle)
{
TIM_SetCompare1(TIM2,Angle / 180 * 2000 + 500);
}
main.c
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "OLED.h"
#include "Servo.h"
float angle;
int main(void)
{
OLED_Init();
Servo_Init();
while (1)
{
OLED_ShowNum(1,1,angle,3);
Servo_SetAngle(angle);
angle+=30;
if(angle>180)
{
angle=0;
}
Delay_ms(500);
}
}
360°舵机PWM控制
除了上面介绍的180°舵机之外,还有一种360°舵机。与180°舵机不同的是,360°舵机是无法控制角度的,它只能控制旋转方向和旋转速度。360°的舵机也是由脉冲宽度为20ms的PWM控制。高电平持续时间与舵机转向和转速的对应关系如下
高电平持续时间/ms | 舵机转向和转速 |
---|---|
0.5~1.5 | 正转,速度越来越慢 |
1.5 | 停止 |
1.5~2.5 | 反转,速度越来越快 |
参考博客:
标签:Servo,舵机,TIM,180,GPIO,PWM,SG90 From: https://blog.csdn.net/m0_75090944/article/details/140412467