关于舵机的研究笔记,使用PWM方波驱动-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 10470|回复: 2

关于舵机的研究笔记,使用PWM方波驱动

[复制链接]
发表于 2016-10-1 00:58 | 显示全部楼层 |阅读模式
初学者,惯例,大神勿喷。

最近学舵机,用官方的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]


高手路过请指导下~

对了,我发现我的舵机满转的时候会在某个角度卡几卡,不知道是哪里坏了?求教
发表于 2016-11-21 17:44 | 显示全部楼层
你接上示波器看  频率不会是稳定的,会跳 这种产生PWM的方法很占用CPU 导致若有其他计算的时候 PWM输出会受影响 PWM输出不稳定
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 04:42 , Processed in 0.072735 second(s), 16 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表