电调的特性实验

最近收到了好多朋友的帮助,在此表示感谢。wnq同学送了很多好东西,并且帮我挑选了一款好用的航模专用遥控器,终于让我下定决定再重新做一个新的四轴。很多快递都还在路上,这几天继续研究老四轴的问题。

今天有位年仅14岁的年轻朋友ENIAC留了言:“对于我开始的商品电调,由于里面自带的 PID 控制器。严重影响了转速的快速反应。这就造成了对于四轴稳定性之一的“自动悬停”基本无法做到了。由于自动悬停的首要要求就是在四轴倾斜时能够在最短时间内自动回到水平位置, 这就要求马达转速在四轴有倾斜时需要加快,而到快回到平衡位置时需要降下来。商品电调里的 PID 恰好阻止了这个的发生。转速上去可以,想要马上降下来?没门!我试验的结果就是一旦转速上去了,想要降下来,等 0.2秒吧。即使这段时间里通知电调降低转速也没效果。带来的后果就是四轴一旦倾斜后就会不可控地晃来晃去,好像抬轿子。

这段文字是ENIAC在无线电上看到的,不得不佩服现在的孩子们,14岁已经开始看这种专业的书籍了。回想我这么大的时候,干的事情基本都是从楼上尿尿,往厕所里扔鞭炮之类的。闲话不多说,我在网上也很容易搜到了相关的讨论。刚看到它的时候,我确实是心头一惊,如果有0.2秒的下降延时,那么我的350Hz的采样,50Hz的控制全白瞎了。但是转念一想,不对啊,现在很多飞的很好(包括悬停动作)的飞控,配套的也是普通的电调啊。

再后来看到一名叫做gale的网友评论:“误区啊。。。 1500元以下的商品电调,根本没有PID。。。连P都没有,何谈ID? 我的经验是商品电调使用挺好的,PPM的信号控制速度也挺快的,目前最低档的KK飞控,也达到了300HZ的控制频率,其所谓的时延问题最主要还是在电机和桨的惯性上。I2C没有看出有明显的必要。” 原文看这里

从这篇讨论贴中的视频看,确实有人用KK飞控+普通电调实现了较为稳定的控制,这样说来我就放心点儿了。另外一个有用的信息是其中提到的300Hz的频率,前几天我刚做了一个实验(企图修改电调PWM频率的实验),当时的结论是电调的频率不可修改。今天突然意识到一个错误的理解:我假定电调是按高电平的占空比来控制电机的,事实上,电调也可能不看占空比,而是只计算高电平的脉宽来控制转速。

加大电调控制频率的方式

加大电调控制频率的方式

上面这幅图表示了从50Hz的控制变成100Hz控制的方式,其中中间那部分是我之前的错误理解,以为高电平的脉宽应该减半,事实上应该是下面那种方式。

为了验证这个想法,特地又做了一个小实验,代码如下:

void loop()
{
  long t0 = micros(); //记录进入loop的时间
  while(Serial.available()) {
    // 这里是获取控制指令
    pushData(Serial.read());
  }
  double frequency = P_Control * 1.5 + 50;  //(0~200对应50到350)
  double T = 1000000 / frequency; // 一个周期的微秒值
  double len = 900 + ctrlPower * 5;  //(0~200对应总周期0.9ms~1.9ms)
  for(int i = 0; i < 4; i++) digitalWrite(motorPins[i], HIGH);
  delayMicroseconds(len);
  for(int i = 0; i < 4; i++) digitalWrite(motorPins[i], LOW);
  int leftMs = (int) (t0 + T - micros());
  if(leftMs < 1 ) leftMs = 1;
  if(leftMs > 2000) {
    int ms = leftMs >> 10 - 1;
    delay(ms);
    delayMicroseconds(leftMs - ms<<10);
  } else {
    delayMicroseconds(leftMs);
  }

其中P_Control和ctrlPower是我从手机遥控器传入的参数,偷了个懒保留了P_Control的变量名,其实它在这里是用来调节PWM周期的。

手机端截图

手机端截图

其中ctrlPower就是图中那个油门值了。这个实验表明,普通商品电调的控制频率确实可以修改的!
我之前的控制频率是50Hz,确实有点少了,反应比较慢,如果推理正确的话,也许可以加到到300Hz左右。

今天有点生病了,做完这个实验,有点头痛欲裂的感觉。把接下来打算做的事情整理一下,然后去睡觉啦:
1. 修改电调的控制频率,看看是否能让飞行器更平稳
2. 四个电机轴都已经有点歪了,买了几个新电机,也买了几根新的电机轴,看看能不能自己修好
3. 给老四轴加上螺旋桨保护罩,前几天听说有人玩航模砸死了过路人,罪过啊,大家也一定要多加小心!
4. 用wnq朋友的飞控和机架组装一套新四轴,改为用遥控器控制
5. SSS_SXS朋友提到了Arduino自带的PID库,这个可以考虑替换掉自己的PID



对 “电调的特性实验” 的 42 条 评论

  1. obvioused 说:

    沙发个,大一太忙了。

  2. 猪头 说:

    板凳个……大二也很忙………

  3. boboking 说:

    进展不错,开心!
    动力将源代码开源了,最好将电路图也简单画一份,方便初学的朋友们。
    我的姿态传感器也到了,做了个WPF的监控器,打算先计算出姿态。

  4. obK仔 说:

    那其实是不是一定需要PWM的频率去到300Hz会比较好做控制呢??

    像动哥你文中提到..现在成熟一点(像KK)的飞控都是用300Hz的吗??
    只用50Hz会不会很大影响呢..如果确实很大影响..我想尝试改改arduino默认的Servo库的寄存器让它能到300Hz..

    因为我有点觉得配置寄存器生成出来的PWM会对程序其他的影响最小..例如影响传感器采集,影响中断程序等等..
    有点纠结了..呵呵

    • 听说KK的控制频率大概是400Hz左右
      用50Hz的影响到底有多大我还不能确定,但是20ms飞机的倾角已经可以达到几度的变换了;如果两三个周期没调好,就歪出去10度了……
      之前的磁悬浮,就是通过修改寄存器来重新设置PWM频率,超过1000Hz,所以悬浮物看上去非常平稳,而且确实像你说的,不影响其他程序,好处很多。
      我现在的问题是扩展板已经焊好了,修改寄存器产生的PWM,只有部分管脚有效,不是所有都可以的。我悲剧的连到DIGITAL_WRITE那边,连PWM输出都不是。重新改板子工程比较浩大,只能继续自己输出了,好在代码不算多。

      这个主要还是因为我前期调研的不够(当然那时候想不到这么多)否则的话修改Servo库还是非常靠谱的

    • 又看了下文档,我的理解好像还是有误,貌似所有的输出口都可以用。
      看来需要对Servo库专门做个小试验了

      • obK仔 说:

        呵呵..动哥今天不用上班吗..回得很快啊:)

        刚才再认真看了一下自带的Servo库..
        发现原来PWM的周期是可以改变的!

        在Servo.h文件下面有个宏定义
        #define REFRESH_INTERVAL 20000
        这个表明周期时间是20000us即20ms
        如果将20000改成5000的就可以改变周期到5000us了

        然后我用pulseIn试了一下,周期成功变成5000us.
        而且不影响高电平时间.那么这样就可以做到400Hz的PWM.

        晚上回来再用示波器验证一下.暂时我同时改变4个通道的值都可以奏效

      • obK仔 说:

        不过我读了一下Servo.cpp里面的寄存器设置..
        暂时觉得arduino没有使用AVR自带PWM生成模式.
        还是用定时器触发中断来改变高低电平的时间的.

        有可能是因为AVR片上资源不足.没有这么多条PWM硬件通道.
        用定时器做还是比较节省资源和精准的

        动哥也试试改REFRESH_INTERVAL来改变PWM周期观察观察吧!

        • 这样做可能是有道理的。AVR自带的PWM频率不能随意设置,好像只能是时钟周期的2^n比例。
          另外,如果修改了默认的PWM频率,所有代码里面的delay等参数都会受到影响 :)

          你说的这几点都太好了,我的代码应该可以精简很多。
          手头没有示波器,如果能验证的话,麻烦也告诉我一声,多谢多谢!

        • 晚上实验了下,servo库貌似果然好用!太好了,继续优化代码,呵呵

          • obK仔 说:

            哈哈~~~是啊..简化很多的逻辑..虽然生成的代码肯定多:)

            不过能够做400Hz的话,Servo库肯定比自己生成要好用~

            我要明天才会实验室..到时示波器看看信号再告诉你到底精准不.

  5. js200300953 说:

    到这个程度,Arduino已经不能完全发挥AVR的性能了。

  6. 小鸡。 说:

    我也在做无刷电调呦。。参考了MK的。

    你的安卓程序好酷啊!!不知道难不难

  7. daifei58 说:

    动力老男孩兄,看你手机端得截图,难道你已经开发出了用手机wifi控制四轴飞行器的功能了吗?怎样实现的啊?

  8. daifei58 说:

    动力兄,能不能把你的蓝牙控制程序发一份给我啊,还有买的什么飞控板呢?怎样把蓝牙加进去的?谢谢!daifei58@gmail.com

    • 没有买飞控版,是用Arduino开发的,手机上的蓝牙程序是基于Android系统的,暂时还比较乱。如果能飞好的话,我会都贴出来

  9. daifei58 说:

    天天来关注动力老男孩的四轴制作历程,见证wifi四轴的诞生!!!

  10. 自由飞翔的驴 说:

    动力童鞋,我看了你的博客,买了与你一样的东西,碰到了与你同样的问题。能飞,但不能自动旋停。炸过两次,坏过8个电机。打过一次手。也怀疑是电调频率过低的原因。今天查MULTIWII FAQ。发现正是问题所在。这现在的问题是,好盈20A的电调能改频率吗?能刷固件吗?有什么方法吗?Be sure your ESC can support PPM with 490Hz refresh rate
    For the MultiWii we need a fast update rate & ESC’s which can handle that.
    There are a number of standard ESCs than can handle update rates of about 490 Hz, namely Turnigy Plush, Mystery Blue, HK SS and a few others.
    The 490Hz basically means that the ESC gets 490 times per second an update.
    A standard servo for example works at 50hz or is updated 50 times per second.

    Here is a diagram with the different frequencies used in the MultiWii project

  11. 自由飞翔的驴 说:

    我用一个简单的程序测试了一下好盈 skywalker 20A电调,它能达到500Hz。现在的问题是怎样修改 MULTIWII 的程序了。
    int PotPin = 0; //用5K电位器控制脉宽,0是A0
    int servopin =9; //脉冲输出口

    void servopulse(int PotValue)

    {
    int pulsewidth=(PotValue)+1000; //potValue从0-1024,脉宽,单位微秒
    digitalWrite(servopin,HIGH);
    delayMicroseconds(pulsewidth);
    digitalWrite(servopin,LOW);
    delayMicroseconds(2000-pulsewidth);

    }

    void setup()
    {
    pinMode(servopin,OUTPUT);
    Serial.begin(9600); //用arduino 的串口监视器查看电位器的值

    }

    void loop()
    {
    int PotValue = analogRead(PotPin); //从A0读入电位器的值

    Serial.println(angle,DEC); //在arduino 的串口监视器查看电位器的值
    for (int i = 0; i< 500; i ++) //每秒钟循环500次。
    {
    servopulse(PotValue);

    }

    }

    • 对,电调的频率是可以修改的。我最后用的是2500微秒作为一个周期,也就是控制频率400Hz。主要原因是读数+计算已经到2.2毫秒了,留点富裕之后按2.5毫秒一个周期。

      按说400Hz已经够高了,但是我的现在还是飞不稳。比较让我头疼的是现在有好多个参数需要试,PID中需要两个参数,平衡点可能需要两个参数。我现在不确定是代码有问题不能飞,还是参数没调好 :(

      你是基于multiWii的代码修改的吗?我也是摔了很多次了,碎掉的桨有几十个,哈哈

      • 自由飞翔的驴 说:

        对,我是用multiwii的代码,桨也摔坏16只了……。现在的想法是,从头来,从电机开始,一级一级的试,看看是那一级造成的问题。今天想做几个频率计,分别监视各个电机的频率(先不用飞控板,用电位器控制电机转速),如果没有问题再从电调查…外面全都排除了最后再弄板子里的事儿。

  12. 自由飞翔的驴 说:

    其实我是想从桨开始,是不是桨的推力或拉力不平均,但电子秤还没到,就先弄电机了。我还是没有办法测转速,只能从测电机输入电流的频率开始。另,我的电机摔坏了8个,修好了6个,其中头两个不知道还能换轴给扔了,但电机修好后听声音有差异,所以想先从电机测起。

    • 哇,你真敬业!
      我也曾想这么一级级查,但是觉得有点麻烦,想起来就头大。
      看来这种事情不能偷懒,向你致敬并学习!

      • 自由飞翔的驴 说:

        你好,动力童鞋,分级测试完成,不知道如何发照片和视频,如果感兴趣,留下QQ,我发你QQ邮箱。结论,1,电调差异在2%左右,两个方向不一样,差1%。2,电机几乎无差异,0.00几的量级上。3,桨,差异极大,同样条件(输入电压11.1V,电源电流5.0A,电调输出电压交流电压3.835V)最小的推力72克,最大的推力283,差几倍了。看样子得先挑好桨再开始调程序

        • 你用的什么桨,怎么测的推力?这个比例也太夸张了,如果这样的话,我的很多参数假设估计全白瞎了 :)
          另外,你说的电机差异指的是什么,其实我在推油门的时候,四个电机是陆陆续续转起来的,启动时间不太一样,我感觉转速也有差别吧?

  13. 自由飞翔的驴 说:

    另,当油门推到头的时候,一个电机,一个电调最大电流到18.32A,看样子我们的电调弄小了。

    • 我最大油门设置的值是200,推倒80的时候就已经拔地而起了,所以不一定需要推到最大电流。
      对了,我不用QQ的,你可以给我发gmail邮箱。博客这种方式有点不太方便,有空了打算做一个技术讨论的小社区,不知道大家有没有兴趣上去讨论分享。

      • 自由飞翔的驴 说:

        那天的结论可能是测了不同店的桨,没有牌子。今天又测了24个桨,是同一个店的,汕头一个店的,也没有牌子。差异没那么大了,也许那天用的是不用的店买的桨,才有了那么大的差异。今天测的推力平均值是230g,正负20g,看样子还可以。我的EMAIL:fanjiebin2009@gmail.com.你给发一封信,我把测试的照片传给你。我想绝对推力可能不准,(地面效应什么的),但相对可能还可以,因为大家都在同一条件下。

        • darkorigin 说:

          如何测试推力? 难道你是用架子架在电子称上然后用电机头向下?看读数?

          • 楼上的兄弟给我发了照片,是用架子固定在锤子上,整个放在电子秤上然后向下吹。
            当然这样测绝对升力不准确,因为一部分风也吹在了秤上,实际上的升力比测量值大。不过他的实验主要是为了测不同桨的差异,所以可以大致反映情况 :)

  14. 自由飞翔的驴 说:

    电机差异;我用同一电调,同一桨,不同电机,输入电压,电流相同情况下,推力的差异。

  15. taorui 说:

    动力哥,有来请教下你。

    关于电调:
    我用的是好盈4合1. 现在问题出在 我用软件模拟输出PWM信号(20ms),占空比在0.9ms-2.1ms,但是电调没有反应,电机不转。

    我以为是解锁问题。所以在程序前面加了 4个电机 HIGH 信号 delay 2s,然后 LOW 信号 delay 1.5s // 网上说这样解锁

    但是电机依然没有反应。

    我现在疑问是: 电调解锁 是怎么解锁?

    谢谢拉。

    taorui

    • zhikuanlifan 说:

      新电调要确定 最低的油门,也就是最小占空比。然后才能正常飞,另外不能一下提高占空比,电调好像会过滤掉

  16. ccen3020 说:

    看到博主开了四轴的坑很高兴,想自己做四轴正苦于没有入手头绪

    有些入门问题想请教一下:
    请问一个电调的内部结构是什么样子的?从PWM转换为三相输出,输出的是正弦波还是方波?
    一个无刷电机的实际负载电流是多少?为什么都需要几十A的电调?能否使用10A以下的电机?一个基本的四轴完成之后重量大约是多少?
    看到拆解,无刷电机好像和一个永磁同步机差不多?那为什么是电压而不是频率来控制转速?
    因为能够申请到TI公司的集成无刷电机驱动器,并且是所学专业的东西,想尝试自己做一个电调

    另,想自己做一个四轴的话,需要学习哪些预备知识(除编程)?能否推荐一些中文的资料和网站?
    看到淘宝有卖一体式的传感器(陀螺仪+加速度+磁力+气压),成本低很多,这个和分立式的相比,精度有差别吗?

    • 电调的结构我没有研究,帮不上你了。
      那种一体式的传感器精度没什么差别,按我的理解,应该是集成度更高一些,很多周边的电路是可以共用的,所以比独立买4片要便宜

  17. 阿翔 说:

    请问一下你的app上下左右的数值和油门数值是同时输出吗
    要怎么同时输出上下左右的指令+油门数值?

发表评论

可以使用下列 XHTML 标签:<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>