13833浏览
查看: 13833|回复: 4

[讨论] Arduino 舵机驱动调速

[复制链接]
本帖最后由 xia_jason27 于 2015-6-5 16:16 编辑

关于舵机调速的一些想法和不理解的地方
关于180°数字舵机的驱动方式,自己在网上也有查过资料,基本上是通过脉冲信号的高低电平的时间来控制位置,但是一般实际应用的话舵机速度都会偏快,下面是一些我实际的一些尝试。


舵机资料:


JX Servo/PDI-5521MG/20KG大扭力/矩金属齿轮数字标准舵机
http://gd4.alicdn.com/bao/uploaded/i4/T1hS1xFLhdXXXXXXXX_!!0-item_pic.jpg_400x400.jpg


死区: 2μs
最大脉宽:500-2500us(适合单片机控制板)
角度范围:实际角度172±2°
电机:铁芯
工作电压:  DC4.8~6.0 V
速度 (4.8V): 0.18sec/85°
速度 (6V): 0.16 sec/85°
扭力 (4.8V): 17.25kg.cm (239.55oz/in)
扭力 (6.0V):  20.32 kg.cm (281.89 oz/in)
尺寸: 40.5X20.2X44.2mm /1.59 X0.80X1.74 in
重量:  55.6 g (1.96oz)
连接线: JR  265 mm (10.43in)
输出齿:25T(Futaba通用)


舵机控制方法:


1. 由于电机是133MHZ工作频率,所以这边每个脉冲周期为3030us.  目标是控制电机旋转90°,并可以通过改变delay()里的数值改变速度。
将90°的行程分为a份,在每一份后面插入一个延时。因为舵机的死区为2us,不知道是不是每次增加的高电平时间不能超过2us。


部分代码如下:


for(a = duration;a>=0;a--){
   digitalWrite(sp1,HIGH);
  delayMicroseconds(1090 + interval*a);
  digitalWrite(sp1,LOW);
  delayMicroseconds(3030 - 1090 - interval*a);


    delay(39);}
  
delay(2000);
}




void servorun() {

   digitalWrite(sp1,HIGH);
  delayMicroseconds(510 + a*interval);
  digitalWrite(sp1,LOW);
  delayMicroseconds(3000 - 510 - interval*a);
  delayMicroseconds(interval);
}



实验结果:
速度可以得到控制,但是会出现抖舵现象。个人觉得可能是插入delay时间太长,电机动作不连续。




2. 希望能达到舵机起步时速度逐渐加快,中间部分舵机速度为峰值,快到达90°时逐渐减慢,大致为正弦0-180°变化。
主要的控制方式为对高电平时间增量采用正弦变化。代码如下:


for(a = 0; a<=100; a++){
    interval = map(a,0,100,0,90);
    float delaytime = cos(interval*(3.1412/180));
    digitalWrite(sp1, HIGH);
    delayMicroseconds(startangle+2*a);
    digitalWrite(sp1,LOW);
    delayMicroseconds(3030-startangle-2*a);
    delay(7*delaytime);
   
    }
  for(a = 101; a<=400; a++){
    digitalWrite(sp1, HIGH);
    delayMicroseconds(startangle+2*a);
    digitalWrite(sp1,LOW);
    delayMicroseconds(3030-startangle-2*a);
    int delta;
    interval = map(a,201,400,0,180);
    delta = 3*sin(interval*(3.1412/180));
    a = a+delta;
   
    }
  for(a = 401; a<=duration/2; a++){
    interval = map(a,401,duration/2,0,90);
    float delaytime = sin(interval*(3.1412/180));
    digitalWrite(sp1, HIGH);
    delayMicroseconds(startangle+2*a);
    digitalWrite(sp1,LOW);
    delayMicroseconds(3030-startangle-2*a);
    delay(7*delaytime);
    }



实验结果:
在SG90微型舵机上工作正常(周期换成20ms),但是用在大功率舵机上时舵机内部会有异响,并有抖舵现象发生。



这边还想请教一下各位资深玩家,如果想控制舵机速度达到类似正弦曲线的效果,应该如何控制啊?还有这样控制出现抖舵现象,是因为开关电源电流不够引起的吗?


本人刚刚接触Arduino,还有很多地方不懂,望指教。。

Cain  初级技匠

发表于 2015-6-5 16:58:49

抖动的话应该是电流不够,怎么供的电?
回复

使用道具 举报

丄帝De咗臂  高级技匠

发表于 2015-6-5 19:43:38

研究的很深入
回复

使用道具 举报

xia_jason27  见习技师
 楼主|

发表于 2015-6-9 15:54:52

应该不会是电流原因吧, 供电的时候是4A开关电源, 而且只是对舵机供电。 之前有看到有人编写过舵机调速的库文件,但是还是实现不了对舵机进行S型加减速控制。
回复

使用道具 举报

Cain  初级技匠

发表于 2015-6-9 17:24:19

xia_jason27 发表于 2015-6-9 15:54
应该不会是电流原因吧, 供电的时候是4A开关电源, 而且只是对舵机供电。 之前有看到有人编写过舵机调速的 ...

可不可能是pwm速率不够快呢?试试a/d转换呢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail