5iMX宗旨:分享遥控模型兴趣爱好

5iMX.com 我爱模型 玩家论坛 ——专业遥控模型和无人机玩家论坛(玩模型就上我爱模型,创始于2003年)
查看: 2595|回复: 14
打印 上一主题 下一主题

舵机内部控制程序

[复制链接]
跳转到指定楼层
楼主
发表于 2017-2-10 09:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
着急先看测试视频




要写舵机内部控制程序,必须了解构成舵机的器件

电位计,测量轴转动的角度 (一般3K-5K)
(图片涉及外部联系方式予以删除版主留)


减速齿轮, 把小直流电机的转动力量转化为大力矩



电机驱动 4个三级管/mos管构成的H桥,控制电机正反转


控制芯片:读取pwm值,电位计的值,比较差异,驱动H桥使电机转动



舵机 = 减速直流电机 + H桥+电位计+程序 + PWM读取


在arduino  nano/pro_mini 实现的程序如下
  1. /* by Payne.Pan 2017.2 */
  2. /* only for study      */
  3. #define A   5
  4. #define B   6
  5. #define Delta 5

  6. long prev_time=0;
  7. long pwm=0;


  8. void rising() {
  9.   prev_time = micros();
  10.   attachInterrupt(0, falling, FALLING);
  11. }


  12. void falling() {
  13.   pwm = micros()-prev_time;
  14.   attachInterrupt(0,rising, RISING);
  15. }

  16. void runMotor(int dir) {
  17.   if (dir == 0) {
  18.     digitalWrite(A,LOW);
  19.     digitalWrite(B,LOW);
  20.   }else if (dir > 0) {
  21.     digitalWrite(A,HIGH);
  22.     digitalWrite(B,LOW);
  23.   } else {
  24.     digitalWrite(A,LOW);
  25.     digitalWrite(B,HIGH);
  26.   }
  27. }

  28. void setup() {
  29.   pinMode(2,INPUT);
  30.   pinMode(A,OUTPUT);
  31.   pinMode(B,OUTPUT);
  32.   pinMode(A0,INPUT);
  33.   attachInterrupt(0,rising, RISING);
  34. }

  35. void loop() {
  36.   int a = analogRead(A0);
  37.   a = map(a,0,1023,500,2500);
  38.   if (pwm-a > Delta) {
  39.     runMotor(1);
  40.   } else if (pwm-a < -Delta) {
  41.     runMotor(-1);
  42.   } else {
  43.     runMotor(0);
  44.   }
  45. }
复制代码


更完整的内容参见:http://bbs.5imx.com/forum.php?mod=viewthread&tid=1253266&page=1&extra=#pid19306380




欢迎继续阅读楼主其他信息

沙发
发表于 2017-2-10 14:29 | 只看该作者
顶,科普类的越多越好。
3
发表于 2017-2-24 01:48 | 只看该作者
这个程序好用吗?只能说是原理验证吧。
4
 楼主| 发表于 2017-2-24 07:16 | 只看该作者
本帖最后由 payne_pan 于 2017-2-24 07:24 编辑
huhuzz 发表于 2017-2-24 01:48
这个程序好用吗?只能说是原理验证吧。

好不好用,自己试验一下就知道了。如果你觉得有问题,那问题在哪里? 我们来交流。



5
发表于 2017-2-24 23:50 | 只看该作者
payne_pan 发表于 2017-2-24 07:16
好不好用,自己试验一下就知道了。如果你觉得有问题,那问题在哪里? 我们来交流。

先是舵角,它是按电位器的全行程来动作,按照300度的电位器角度,对应到1ms到2ms的脉宽,就是150度的舵角,几乎翻倍了。
然后是精度,micro()函数大约4微秒精度,再加上设置的5微秒死区,就是大约正负9微秒精度,对应到1ms到2ms的脉宽,大约1.8%精度,觉得大了点。
再有电机的驱动没有调速,任何情况都是全力驱动电机动作,觉得会抖舵。
另外有个隐患就是micro()函数每71分钟会产生一次溢出,有可能造成舵机抽疯一下。不过这种情况很难发生,很少有续航时间那么长的模型。

6
 楼主| 发表于 2017-2-25 08:51 | 只看该作者
本帖最后由 payne_pan 于 2017-2-25 08:53 编辑

好,一起探讨
1)舵角跟脉宽无关   180电位计 90度 = 360度电位计 180度
2)  这个问题我没办法解决 (我能想到换 stm32,高精度电位计, 你有什么办法?)
3)根据需要调整幅度,用ananlogwrite 调速
4)  溢出不是问题(试验下两个 unsgined 相减),   不要意思,我居然用的 signed

7
发表于 2017-2-25 21:25 | 只看该作者
两位大神
8
发表于 2017-2-26 11:05 | 只看该作者
可以试试换个mcu,analogread()读一次居然要100微秒。
电机调速可以用pwm,da输出还要加模拟电路。
9
 楼主| 发表于 2017-2-26 12:16 | 只看该作者
huhuzz 发表于 2017-2-26 11:05
可以试试换个mcu,analogread()读一次居然要100微秒。
电机调速可以用pwm,da输出还要加模拟电路。

你做什么呀?
遥控器输出 50 hz, 就算200hz 5ms时间还不够用呀?

10
发表于 2017-2-27 10:08 | 只看该作者
payne_pan 发表于 2017-2-26 12:16
你做什么呀?
遥控器输出 50 hz, 就算200hz 5ms时间还不够用呀?

数码舵机嘛,不是测过最高支持500Hz的信号吗

11
 楼主| 发表于 2017-2-27 12:12 | 只看该作者
huhuzz 发表于 2017-2-27 10:08
数码舵机嘛,不是测过最高支持500Hz的信号吗

交流不是抬杠!   难道不支持读取500hz吗?

之前你提问,我给解答,现在该我提问了。
换三相交流电机,你该如何办?
如果让你把pid算法融入进去,你如何搞?





12
 楼主| 发表于 2017-2-27 12:23 | 只看该作者
谁能发个帖子,叫emax 公布他们舵机角度误差,输入输出响应延迟,那就非常有趣了!

13
发表于 2017-2-28 12:07 | 只看该作者
payne_pan 发表于 2017-2-27 12:12
交流不是抬杠!   难道不支持读取500hz吗?

之前你提问,我给解答,现在该我提问了。

无刷舵机?做云台用?

14
 楼主| 发表于 2017-2-28 15:36 | 只看该作者
huhuzz 发表于 2017-2-28 12:07
无刷舵机?做云台用?

高档舵机内部是无刷电机
给你提的问也是我正思考的问题。

15
发表于 2019-1-2 18:11 | 只看该作者
支持                    
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

关闭

【站内推荐】上一条 /1 下一条

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