22.9克舵机
2014-03-06 20:45
155 查看
实验现象:
通过调整电位器来改变舵机旋转的角度。
(有些电脑的USB的驱动能力不足,不能驱动舵机,请适用DC9V的电源适配器给arduino供电。)
理论学习:
标配9g舵机引脚,黄色为信号线,红色为电源,棕色为地线。
舵机是一种位置伺服的驱动器,具有闭环控制系统的机电结构,由小型直流电机、变速齿轮组、可调电位器、控制板等部件组成,由于可以方便地控制舵机旋转的角度(舵角,但是舵角一般不超过180°),因此,舵机在要求角度不断变化的控制系统中得到了广泛的应用。
舵机在工作中,控制器发出脉冲宽度调制(PWM)信号给舵机,获得直流偏置电压。舵机内部有一个基准电路,产生周期为20ms,宽度为1.5ms的基准信号,将获得的直流偏置电压与电位器的电压比较,获得电压差输出到电机驱动芯片,驱动芯片根据电压差的正负控制电机的正反转。
舵机转动的角度是通过调节PWM信号的占空比来实现的,标准PWM信号的周期固定为20ms,理论上脉宽(脉冲的高电平部分)范围在1ms~2ms之间,但实际上脉宽可以在0.5ms~2.5ms之间,脉宽和舵机的转角0°~180°相对应。如以脉宽为0.5ms~2.5ms范围控制舵机的角度转动,转动范围为0°~180°。
小型舵机的工作电压一般为4.8V或6V,转速也不是很快,所以假如更改角度控制脉宽太快时,舵机可能反应不过来。如果需要更快速的反应,就需要更高的转速了。要精确地控制舵机,其实没有那么容易,很多舵机的位置等级有1024个,那么,如果舵机的有效角度范围为180°的话,其控制的角度精度可以达到180/1024≈0.18°,假定脉宽为0.5ms~2.5ms,则要求的脉宽控制精度为(2.5-0.5)ms/1024≈2μs。
舵机分别用0.5ms~2.5ms之间的脉宽来对应0°~180°,而且转动的角度与脉宽呈线性关系,则舵机每转动1°,对应的脉宽为(2.5-0.5)ms/180°,该值除不尽,因此,用一个除不尽的脉冲宽度控制舵机转动,显然转动角度的精度会很难控制,为此,实验中以接近2.5ms且能够整除180的值为脉宽的变化范围,则取脉宽为0.5ms~2.48ms,此时,舵机每转动1°脉宽变化为(2.48-0.5)ms/180=11μs。因此,定义脉宽与转动角度之间的关系为:pulsewidth=(angle*11)+500
根据这个公式可以写出来设置转动角的函数,然后写出第一个例程。
当然还有更简单的办法:调用伺服电机控制lib
程序代码:
通过调整电位器来改变舵机旋转的角度。
(有些电脑的USB的驱动能力不足,不能驱动舵机,请适用DC9V的电源适配器给arduino供电。)
理论学习:
标配9g舵机引脚,黄色为信号线,红色为电源,棕色为地线。
舵机是一种位置伺服的驱动器,具有闭环控制系统的机电结构,由小型直流电机、变速齿轮组、可调电位器、控制板等部件组成,由于可以方便地控制舵机旋转的角度(舵角,但是舵角一般不超过180°),因此,舵机在要求角度不断变化的控制系统中得到了广泛的应用。
舵机在工作中,控制器发出脉冲宽度调制(PWM)信号给舵机,获得直流偏置电压。舵机内部有一个基准电路,产生周期为20ms,宽度为1.5ms的基准信号,将获得的直流偏置电压与电位器的电压比较,获得电压差输出到电机驱动芯片,驱动芯片根据电压差的正负控制电机的正反转。
舵机转动的角度是通过调节PWM信号的占空比来实现的,标准PWM信号的周期固定为20ms,理论上脉宽(脉冲的高电平部分)范围在1ms~2ms之间,但实际上脉宽可以在0.5ms~2.5ms之间,脉宽和舵机的转角0°~180°相对应。如以脉宽为0.5ms~2.5ms范围控制舵机的角度转动,转动范围为0°~180°。
小型舵机的工作电压一般为4.8V或6V,转速也不是很快,所以假如更改角度控制脉宽太快时,舵机可能反应不过来。如果需要更快速的反应,就需要更高的转速了。要精确地控制舵机,其实没有那么容易,很多舵机的位置等级有1024个,那么,如果舵机的有效角度范围为180°的话,其控制的角度精度可以达到180/1024≈0.18°,假定脉宽为0.5ms~2.5ms,则要求的脉宽控制精度为(2.5-0.5)ms/1024≈2μs。
舵机分别用0.5ms~2.5ms之间的脉宽来对应0°~180°,而且转动的角度与脉宽呈线性关系,则舵机每转动1°,对应的脉宽为(2.5-0.5)ms/180°,该值除不尽,因此,用一个除不尽的脉冲宽度控制舵机转动,显然转动角度的精度会很难控制,为此,实验中以接近2.5ms且能够整除180的值为脉宽的变化范围,则取脉宽为0.5ms~2.48ms,此时,舵机每转动1°脉宽变化为(2.48-0.5)ms/180=11μs。因此,定义脉宽与转动角度之间的关系为:pulsewidth=(angle*11)+500
根据这个公式可以写出来设置转动角的函数,然后写出第一个例程。
void pulse(int angle) { pulsewidth=int((angle*11)+500); digitalWrite(PWM_pin,HIGH); delayMicroseconds(pulsewidth); digitalWrite(PWM_pin,LOW); delay(20-pulsewidth/1000); }
当然还有更简单的办法:调用伺服电机控制lib
#include<Servo.h>// 引入lib Servo myservo;// 创建一个伺服电机对象 #define potpin A5 // 设定连接可变电阻的模拟引脚 int val; // 创建变量,储存从模拟端口读取的值(0-1023) void setup() { myservo.attach(9); //9号引脚输出电机控制信号 //仅能使用9、10号引脚 } void loop() { val=analogRead(potpin); //读取来自可变电阻的模拟值(0-1023) val=map(val,0,1023,0,179); //利用“map”函数缩放该值,得到0-180角度 myservo.write(val); //设定伺服电机的位置 delay(15); //等待电机旋转到目标角度 }
程序代码:
/* //2种代码形式 #include <Arduino.h> #define PWM_pin 9 int pulsewidth = 0; //高电平时间 void setup() { pinMode(PWM_pin,OUTPUT); } void loop() { pulse(90); //设置舵机指向90度 } void pulse(int angle) //设置舵机角度为angle { pulsewidth=int ((angle*11)+500); //计算高电平时间 digitalWrite(PWM_pin,HIGH); //设置高电平 delayMicroseconds(pulsewidth); //延时pulsewidth (us) digitalWrite(PWM_pin,LOW); //设置低电平 delay(20-pulsewidth/1000); //延时20-pulsewidth/1000 (ms) } */ #include <Servo.h> //引入lib Servo myservo; // 创建一个伺服电机对象 #define potpin A5 // 设定连接可变电阻的模拟引脚 int val; // 创建变量,储存从模拟端口读取的值(0到1023) void setup() { myservo.attach(9); // 9号引脚输出电机控制信号 //仅能使用9、10号引脚 } void loop() { val = analogRead(potpin); // 读取来自可变电阻的模拟值(0到1023之间) val = map(val, 0, 1023, 0, 179); // 利用“map”函数缩放该值,得到伺服电机需要的角度(0到180之间) myservo.write(val); // 设定伺服电机的位置 delay(15); // 等待电机旋转到目标角度 }
相关文章推荐
- ubuntu下使用Python连接Mysql数据库和Mongodb数据库
- 03.06
- 测试Android的文件读写功能
- 父类构造方法中调用虚方法
- 设置Activity显示和关闭时的动画效果
- iBeacon:苹果变革零售业的新武器
- linux软件包管理
- ZOJ 1924 Frogger
- 苹果新专利:照片可自动生成3D地图街景
- qt使用动态库(DLL)
- jdk环境变量配置问题
- Win7承载网络配置——让你的手机无线上网吧
- Linux软连接和硬链接
- 学习记2
- 使用 c3p0 连接池 改造 jdbcutils工具类
- Matlab 生成图形复制到word
- Logic-算法-分金条/五个好朋友分苹果
- 阵列盘安装操作系统
- 漂亮的正多面体
- C++虚函数和纯虚函数