由于<Servo.h>中使用了定时器,严重影响了其他引脚的信号变化。所以自行写了个简单的驱动程序。
舵机驱动原理如下: 舵机的控制信号为周期是 20ms 的(PWM)信号,其中高电平时间从 0.5ms-2.5ms,相对应舵盘的位置为 0-180 度,呈线性变化。
#define ServoPin 9
void ServoControl(int servoAngle)
{
double thisAngle = map(servoAngle, 0, 180, 500, 2500);//等比例角度值范围转换高电平持续时间范围
unsigned char i = 50;//50Hz 每秒的周期次数(周期/秒) 即1S 50 个周期 每个周期20ms
while (i--)
{
digitalWrite(ServoPin, HIGH);
delayMicroseconds(thisAngle); //高电平时间
digitalWrite(ServoPin, LOW);
delayMicroseconds(20000 - thisAngle);//每个周期20ms减去高电平持续时间
}
}
void setup() {
Serial.begin(115200);
pinMode(ServoPin, OUTPUT);
digitalWrite(ServoPin, LOW);//先保证拉低
}
void loop()
{
for (int i = 0; i <= 180 ; i += 1)
{
delay(500);
Serial.println(i);
ServoControl(i);
}
}
long map(long x,long in_min,long in_max,long out_min,long out_max)
{
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}