舵机-MG90S

舵机-MG90S

1.舵机

舵机是一种位置(角度)伺服的驱动器,适用于那些需要角度不断变化并可以保持的控制系统。目前在高档遥控玩具,如航模,包括飞机模型,潜艇模型;遥控机器人中已经使用得比较普遍。舵机是一种俗称,其实是一种伺服马达。

小型的舵机与大型的舵机控制原理几乎大同小异,常见的小型舵机型号为“9g舵机”,外观大体如下

工作原理

控制信号由接收机的通道进入信号调制芯片,获得直流偏置电压。它内部有一个基准电路,产生周期为20ms,宽度为1.5ms的基准信号,将获得的直流偏置电压与电位器的电压比较,获得电压差输出。最后,电压差的正负输出到电机驱动芯片决定电机的正反转。当电机转速一定时,通过级联减速齿轮带动电位器旋转,使得电压差为0,电机停止转动。当然我们可以不用去了解它的具体工作原理,知道它的控制原理就够了。就象我们使用晶体管一样,知道可以拿它来做开关管或放大管就行了,至于管内的电子具体怎么流动是可以完全不用去考虑的。

2.舵机控制原理

本教程使用的舵机为9g尺寸,型号为“MG90S”作为示例模块。

舵机有三根线,除了供电的两根电源线还有一根信号线,因为我们使用的是5V电压功率的舵机,所以其电源线可以直接接到单片机的+5V和GND上,信号线的话就接到单片机的一个IO端口上,这个IO端口通过输出PWM控制舵机桨的角度在任意位置上固定停留。

这个PWM的周期为20ms,50hz,高电平的时间在0.5ms~2.5ms之间可以控制舵机桨角度的停留位置。

0.5ms---------0度。

1.0ms---------45度。

1.5ms---------90度。

2.0ms---------135度。

2.5ms---------180度。

我们只需要知道我们要操作舵机,那么就给它频率为50Hz,占空比大于等于2.5%并且小于等于12.5%的PWM就可以控制舵机旋转角度了。占空比越大旋转的角度越大。

3.代码

#include "stm32f10x.h" // Device header
#include "Delay.h"

int main(void){
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE); //打开TIM2的外设时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitTypeDef gitd;
gitd.GPIO_Mode=GPIO_Mode_AF_PP; //配置为复用推挽输出
gitd.GPIO_Pin=GPIO_Pin_0;
gitd.GPIO_Speed=GPIO_Speed_2MHz;
GPIO_Init(GPIOA,&gitd);

TIM_InternalClockConfig(TIM2); //选择内部时钟(72MHz)作为时钟源
TIM_TimeBaseInitTypeDef itd;
itd.TIM_ClockDivision=TIM_CKD_DIV1; //时钟1分频
itd.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
itd.TIM_Period=1000-1; //设置自动重装器的值
itd.TIM_Prescaler=1440-1; //设置预分频器的值
itd.TIM_RepetitionCounter=0; //重复计数器的值,但是仅高级定时器有效
TIM_TimeBaseInit(TIM2,&itd);

TIM_OCInitTypeDef itd1;
itd1.TIM_OCMode = TIM_OCMode_PWM1; //比较输出模式为PWM1
itd1.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性为高电平
itd1.TIM_OutputState=TIM_OutputState_Enable; //使能
itd1.TIM_Pulse=0; //初始化输出比较的阈值
TIM_OC1Init(TIM2,&itd1);

TIM_Cmd(TIM2,ENABLE); //使能定时器
while(1){

TIM_SetCompare1(TIM2,25); //占空比为2.5%;角度为0
Delay_s(1);
TIM_SetCompare1(TIM2,50); //占空比为5%;角度为45
Delay_s(1);
TIM_SetCompare1(TIM2,75); //占空比为7.5%;角度为90
Delay_s(1);
TIM_SetCompare1(TIM2,100); //占空比为10%;角度为135
Delay_s(1);
TIM_SetCompare1(TIM2,125); //占空比为12.5%;角度为180
Delay_s(1);
TIM_SetCompare1(TIM2,150); //占空比为15%;角度还是180,做测试是否真的只能转180度用的.
Delay_s(1);
}

}

posted @ 2025-11-05 15:23  张大帅哥  阅读(49)  评论(0)    收藏  举报