黄工无刷电机学习
直播中

YYXIAO

8年用户 1144经验值
擅长:接口/总线/驱动
私信 关注
[问答]

舵机的转动角度是怎么实现的?

舵机的转动角度是怎么实现的?

回帖(1)

刘翔宇

2021-9-27 10:37:13
连接

舵机接线: 5v pwm (0v)GND



原理
伺服电机是一种位置伺服的驱动器,工作原理是由接收机或者单片机发出信号给舵机,其内部有一个基准威廉希尔官方网站 ,产生周期为20ms,宽度为1.5ms的基准信号,将获得的直流偏置电压与电位器的电压比较,获得电压差输出

经由威廉希尔官方网站 板上的IC判断转动方向,再驱动无核心马达开始转动,透过减速齿将动力传至摆臂,同时由位置检测器送回信号,判断是否达到到达定位。适用于那些需要角度不断变化并可以保持的控制系统,旋转角度一般为0-45-90-180


舵机的转动角度是通过桥接PWM(脉冲宽度调制)信号的占空比实现的,标准PWM信号的周期固定位20ms(50HZ),理论上脉宽分布在1ms到2ms之间,实际为0.5ms到2.5ms之间,脉宽和舵机的转角0-180相对应。


程序
方法一
int servopin=9;//定义数字接口9 连接伺服舵机信号线`
int myangle;//定义角度变量`
int pulsewidth;//定义脉宽变量`
int val;


void servopulse(int servopin,int myangle)//定义一个脉冲函数
{
//500位初始值,0.5ms,2480=500+180*11
pulsewidth=(myangle*11)+500;//将角度转化为500-2480 的脉宽值
digitalWrite(servopin,HIGH);//将舵机接口电平至高
delayMicroseconds(pulsewidth);//延时脉宽值的微秒数
digitalWrite(servopin,LOW);//将舵机接口电平至低
delay(20-pulsewidth/1000); //延迟函数,担心无法转到指定角度
}
void setup()
{
pinMode(servopin,OUTPUT);//设定舵机接口为输出接口
Serial.begin(9600);//连接到串行端口,波特率为9600
Serial.println("servo=o_seral_simple ready");
}
void loop()//将0 到9 的数转化为0 到180 角度,并让LED 闪烁相应数的次数
{
val=Serial.read();//读取串行端口的值
if(val>'0'&&val<='9')
{
val=val-'0';//将特征量转化为数值变量
val=val*(180/9);//将数字转化为角度
Serial.print("moving servo to ");
Serial.print(val,DEC);
Serial.println();
        for(int i=0;i<=50;i++)//给予舵机足够的时间让它转到指定角度
        {
        servopulse(servopin,val);//引用脉冲函数
        }
}
}


方法二
attach(接口)——设定舵机的接口,只有**支持PWM(~)**接口可以利用
write(角度)——用于设定舵机旋转角度的语句,可设定的角度范围是0°到180°。
read()——用于读取舵机角度的语句,可理解为读取最后一条write()命令中的值。
attached()——判断舵机参数是否已发送到舵机所在接口。
detach()——使舵机与其接口分离,该接口可继续被用作PWM 接口。
注:以上语句的书写格式均为“舵机变量名.具体语句()”例如:myservo.attach(9)。仍然将舵机接在数字9 接口上即可。
#include
#include


Servo servo;


void setup ()
{
  servo.attach(13);//PWM引脚设置,与GPIO引脚号对应.
}


void loop ()
{
  // To 0°
  servo.write(0);
  delay(1000);


  // To 90°
  servo.write(90);
  delay(1000);


  // To 180°
  servo.write(180);
  delay(1000);
}
举报

更多回帖

发帖
×
20
完善资料,
赚取积分