企图修改电调PWM频率的实验

之前控制电调的PWM频率是50Hz,怀疑可能是这个频率较低,所以导致了四轴飞行器无法平衡。今天特地做了一个小实验,用两个参数:
一个调节油门,用0~200控制油门的高低;
一个调节频率,计划从50Hz实验到450Hz。

我使用的电调是天行者SKYWALKER 20A无刷电调。在实验中差点发生危险,当频率不在50Hz时,调节油门电机完全不动;这时候把频率调回50Hz,因为之前的油门值设置的很大,所以瞬间就升到了很大的转速,一片有裂纹的叶片直接甩断飞出来。可能是震动太大把蓝牙弄松了,所以用手机关闭电源未遂,最后我从后面拔掉了电源线才算完事。
当然目前就说PWM不可改有点武断,可能代码中还有逻辑错误。今晚不打算试了,虎口震的发麻,心有余悸的……

小结:
1. 任何时候,开通电机前都要戴好护目镜;
2. 测试电调和电机时,应该把叶片拆掉;
3. 调节参数时,应该先把一些危险参数还原;

下面是使用的代码,明天拆掉页面继续实验。

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


对 “企图修改电调PWM频率的实验” 的 28 条 评论

  1. SSS_SXS 说:

    动力兄,我一直在想你这问题,觉得也有可能是因为PID程序未调适好
    参见以下官网对于PID的详细描述,我这段时间一直在研究,可惜都是E文,看起来累啊
    http://brettbeauregard.com/blog/category/pid/page/2/

    • 多谢,有空我研究下,呵呵

      • SSS_SXS 说:

        我理解,这篇东西主要是对PID公式的解释,牵涉到一些数学知识,比如ITerm += (ki * error)和ki*iterm+=error不一样。error=setpoint-input,微分的话,应该化解为derror=0-dinput,所以用-dinput才不会有干
        扰,还有就是要对OUTPUT有一个限制,因为PWM有最大范围,0-255,而积分
        出来的数据不做控制就可以任意,超出了PWM范围就使系统失控了。

        可能这些问题,动力兄在之前的,磁悬浮实验中已经了解到了,不过也许问题
        就出在这里,希望有点启示,更希望尽快调试成功,给我们一个参考

        • 嗯,之前磁悬浮也用到了PID,当时也是花了很多时间调试PID参数。但是磁悬浮在屋里测试很方便,半分钟就可以改一组参数实验。
          这个四轴调试有点麻烦,在家里调试很危险,转速太快。出门调试的话,晚上回家吃完饭9点多,天已经黑了。而且北京你知道的,天非常冷,大部分时间还刮大风。
          当时觉得用手机控制方便,现在越来越觉得还是遥控器方便,至少可以戴手套了 :)

  2. 李宙恒 说:

    动力哥,我又在《无线电》上看到你的文章了。。2012年第三期,那个全息照相的。 还有老薛的。。

  3. obK仔 说:

    动哥..其实如果想用更精确PWM..

    会不会把微处理器升级一下也是可以的呢?

    最近上网看到一款Netduino..
    使用32位arm处理器,开源,C#编译环境,还能在线仿真.
    好像看起来功能也挺强的..

    不过实际上也应该是设好电调的脉宽才是王道..呵呵..
    纯粹提一下原来还有arduino的一些衍生好东东..

    • 是啊,处理器升级肯定有帮助,我再做点简单实验,如果不行的话。就准备重头开始另外做一套了,换芯片,换控制板,换电机(原来的摔歪了)

      • obK仔 说:

        不过Netiduino那套板子现在在国内还是卖得太贵..
        需要很长一段时间才能普及啊估计..

    • 对了,obk同学,你说的设置电调脉宽问题。现在的电调支持不同脉宽吗?星期一我企图修改PWM频率,结果差点炸鸡。
      结果一路加班到今天,现在还没下一步实验呢

      • obK仔 说:

        可能我用词表达有误了..
        我的意思是指可以调节电调最大油门与最小油门的脉宽范围..

        引用你之前提供的链接..
        一般电调好像和普通PWM伺服马达一样,只能接收50Hz的方波并且脉宽范围只能在0.9到2.1毫秒之间..更高频率的方波估计电调就用不了了..

        所以拿450Hz也就是arduino原生提供的PWM输出可能就不行..
        只能用servo库里提供的0到180度之间..

        但之前我看了别人的文章..一般电调实际servo库里能用的范围只有50到140度左右..这两天病了..等病好了再好好测试一下..呵呵

  4. 隨風大俠 说:

    動力哥您好:

    因最近也在製作四軸,故想請問您,我的電調只對Servo 95~130有反應,如果減到95以下就完全不動,但加到130(到130都還飛不起來)以上反而使無刷轉速變弱,甚至還有幾個馬達會停掉,不知這是否正常??

    不知我這樣是否是電池的問題??還是程式要設定PWM脈寬範圍?

    而且如果輸入太快(95~130)還會使電壓降到2V(本來11V),如果讓它歸0但不把電池跟馬達拔掉重接都會一值維持2V。

    懇請動力哥解惑

    感激不盡

    • 有几个马达停掉,看上去像是电池电力不足啊,你用的多少C的电池?

      • 隨風大俠 说:

        因為買來時上面也沒寫是多少C(並非航模用電池),它的規格是3.7V 4000mah的鋰鐵電池,我將三個串聯變成11.1V 4000mah,再將兩組並聯(總共6顆)變成11.1V 8000mah。

        我利用三用電表在馬達運轉時測量電流,如果四顆馬達一起轉時,電流到達7,培左右就會開始有馬達慢慢停下來,然後輪流停止(停止順序都固定),最後只剩下一顆馬達使用7安培,但也沒辦法用多久,電流也就慢慢下降。

        一開始我以為是馬達或電變的問題,但後來我分開測試,發現每顆馬達個別使用都可以到達7安培。

        還有電池都只在充完電第一次使用時能到達7安培左右,接下再使用都到3~4安培而已,是不是串並聯有問題導致充電不足,因為每次充到滿都只有12.4V左右,我覺得電壓好像不夠高。(我是用一般變壓器充電,12~15V 1500mA)

        還有我在網路上看到不少人做四軸都用11.1V 2200mah的鋰聚合物電池就能飛12~15分鐘。

        所以想請問動力哥,鋰聚合物跟鋰鐵有差這麼多嗎??有電池的C數是1嗎??是否有辦法計算出c數??還有有辦法提升c數嗎??

        • 我买的锂电池是11.1V,2200mAh,号称是20C的。这样说来,支持的最大电流理论上可以到2.2*20 = 44A
          虽然一般不会在最大功率下飞行,但是瞬间的峰值功率可能会导致电池损坏。这样说来可能确实有点差距吧

        • darkorigin 说:

          非航模电池确实是不标注C的,一般都是很低的。
          建议你换电池吧。
          一般的充电电池内阻高,所以放电电流上不去是必然的。
          另外一般航模电池C大的原因都是有特殊的设计,你用常规充电电池估计是很难跟上的。
          多电池并联或许能解决最大电流问题,但是电池太多自重也上去了。
          并且多电池并联需要一致性很好,如果是几个不同内阻的电池混用效率会低很多

        • darkorigin 说:

          航模的充电也和一般电池充电有区别
          一般是用平衡充, 电源给电池提供的并不是单纯的直流电,而经常是方波,说白了就是PWM脉冲。并且在不同的阶段(开始都是大电流,然后电流变小,最后是恒流慢充)
          用直流电源直接冲伤电池的

  5. 隨風大俠 说:

    謝謝各位前輩指導,想請問航模用電池是如何處理,已至於可以提高最大放電c數。

    我看航模專用電池都有平衡接頭,所謂的平衡充就是將充電氣接到此接頭,然後用3.7v各別充每一顆電池嗎??

    還有一般電池為什麼內阻較高啊?

    謝謝

    • 我猜想应该是从电池生产工艺上就不一样了吧,而不是把普通电池经过外置电路改造成高放电电路。

      平衡充具体原理我不清楚,不过在充电过程中,确实可以看到每块电池的电压和充电电流,应该不是用3.7去充每块电池,而是用不同的电压或电流对每块电池充电。正如darkorigin所说,用PWM方波充电,不同阶段还各不相同

    • darkorigin 说:

      批次都会有波动,使用时间等等因素(比如极板氧化程度,比如电解液的属性啥的)
      就好像CPU都会有体质区分一样(记得AMD5000+有的就能开核,有的就是不行,批次都会不一样)
      一般专业的搞法都是用一批的新电池作成电池组,要么就是用内阻测试装置来测,找出相近的作电池组。

  6. 隨風大俠 说:

    謝謝各位的解達。

    想再請問一個問題:

    如果兩個11.1v 2000mah的鋰聚並聯”實際”使用時間會是原來的兩倍嗎?
    還是兩倍少一點?

    如果兩個11.1v 2000mah的鋰聚”並聯”後要用平衡充電,是否也要將平衡頭都並聯??

    照理來說充電時間就變原來的兩倍吧?

    謝謝 動力哥 和 版上的前輩

    • 只能说理论上是这样的,不过曾经有人建议我不要并联两块电池。
      比如标称是11.1V的电池,其实它的电压并不是真正的11.1V。也许充满的时候有12V多,快用完的时候可能变成10V。
      两块电池并联的时候,如果两个剩余电量不同,就会变成其中一块给另一块充电……
      反正大概意思就是两块电池不同步,并联在一起会有损耗

  7. 隨風大俠 说:

    了解了。

    謝謝

  8. hiker 说:

    动力哥
    最近我也在做Skywalker 20A 这个电调。
    while(true)
    {
    gpio_set_value(io_gpios[1],1);
    ndelay(1000);//motor_delays[1]);
    gpio_set_value(io_gpios[1],0);
    ndelay(19000);
    }
    这样写的信号代码。
    频率也是50HZ 。
    没做别的,电机就是不转。一直滴 滴 滴 。请教一下哪里有什么问题呀?

发表评论

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