|
初学者,惯例,大神勿喷。
最近学舵机,用官方的servo.h驱动是很简单了,可是不明白原理啊!
于是就下定决心研究了下纯PWM驱动,学习其中原理。
[mw_shl_code=applescript,true]int servoPin = 9; //定义舵机数据引脚;
int spd = 3; //定义舵机转动速度;主要是根据运行模块后delay的时间控制,最小为1;
int pos = 0; //定义角度
////////////////////////////////////////////////
//舵机的初始化模块
////////////////////////////////////////////////
void gofirst(int servoPin) {
int maxt = 2500; //舵机满舵方波时长;
int mint = 500; //舵机归零方波时长;
for (int i = 180; i >= 0; --i) {
digitalWrite(servoPin, HIGH);//向数据引脚输入高电位;
delayMicroseconds(mint);//停留dltime的时间,制造方波-凸出部分;
digitalWrite(servoPin, LOW);//数据引脚转为低电位,制造方波-凹下部分;
delayMicroseconds(maxt - mint);//!!!这个是关键,完成方波;
}
}
////////////////////////////////////////////////////////
////////////////////////////////////////////////
//舵机的运行模块(需要输入2个参数:需要转动的角度;数据引脚位置)
////////////////////////////////////////////////
void go(int ang, int servoPin) {
int maxt = 2500; //舵机满舵方波时长;
int mint = 500; //舵机归零方波时长;
if (ang >= 0 & ang <= 180) {
//判断输入的角度必须在0-180度的区间,否则置零;
ang = ang;
} else {
ang = 0;
}
if (ang >= pos) {
for (int i = pos; i <= ang; ++i) {
int dltime = map(ang, 0, 180, mint, maxt);//将角度规则化为舵机转动的方波时长;
digitalWrite(servoPin, HIGH);//向数据引脚输入高电位;
delayMicroseconds(dltime);//停留dltime的时间,制造方波-凸出部分;
digitalWrite(servoPin, LOW);//数据引脚转为低电位,制造方波-凹下部分;
delayMicroseconds(maxt - dltime);//!!!这个是关键,完成方波;
delay(spd);
pos = ang;
}
} else if(ang<=pos) {
for (int i = pos; i >= ang; --i) {
int dltime = map(ang, 0, 180, mint, maxt);//将角度规则化为舵机转动的方波时长;
digitalWrite(servoPin, HIGH);//向数据引脚输入高电位;
delayMicroseconds(dltime);//停留dltime的时间,制造方波-凸出部分;
digitalWrite(servoPin, LOW);//数据引脚转为低电位,制造方波-凹下部分;
delayMicroseconds(maxt - dltime);//!!!这个是关键,完成方波;
delay(spd);
pos = ang;
}
}
}
///////////////////////////////////////////
//这个地方我也不能很好的理解,感觉舵机是靠接收不断传来的方波运动的
//在收到某个频率的方波,而一个方波就是一个“凸-凹”才完整;
//开始的时候总以为不断输入一个特定时长的高位电压就可以了,其实不是。
//不知道我的理解有没有错;希望高手指点一下。
/////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
void setup() {
//DDRD = DDRD | B00001000;练习用DDRD控制引脚;可以忽略;
pinMode(servoPin, OUTPUT);
gofirst(servoPin);//初始化,将舵机调至0位;
}
void loop() {
go(180, servoPin);
delay(600);
go(0, servoPin);
delay(600);
}[/mw_shl_code]
高手路过请指导下~
对了,我发现我的舵机满转的时候会在某个角度卡几卡,不知道是哪里坏了?求教
|
|