Arduino 不使用舵机库<Servo.h>驱动SG90舵机

由于<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);
  }
}
    附带map函数的实现
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;
}
经验分享 程序员 微信小程序 职场和发展