企图修改电调PWM频率的实验
由 动力老男孩 发表于 2012/03/06 22:48:01之前控制电调的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); }
动力兄,我一直在想你这问题,觉得也有可能是因为PID程序未调适好
参见以下官网对于PID的详细描述,我这段时间一直在研究,可惜都是E文,看起来累啊
http://brettbeauregard.com/blog/category/pid/page/2/
多谢,有空我研究下,呵呵
我理解,这篇东西主要是对PID公式的解释,牵涉到一些数学知识,比如ITerm += (ki * error)和ki*iterm+=error不一样。error=setpoint-input,微分的话,应该化解为derror=0-dinput,所以用-dinput才不会有干
扰,还有就是要对OUTPUT有一个限制,因为PWM有最大范围,0-255,而积分
出来的数据不做控制就可以任意,超出了PWM范围就使系统失控了。
可能这些问题,动力兄在之前的,磁悬浮实验中已经了解到了,不过也许问题
就出在这里,希望有点启示,更希望尽快调试成功,给我们一个参考
嗯,之前磁悬浮也用到了PID,当时也是花了很多时间调试PID参数。但是磁悬浮在屋里测试很方便,半分钟就可以改一组参数实验。
这个四轴调试有点麻烦,在家里调试很危险,转速太快。出门调试的话,晚上回家吃完饭9点多,天已经黑了。而且北京你知道的,天非常冷,大部分时间还刮大风。
当时觉得用手机控制方便,现在越来越觉得还是遥控器方便,至少可以戴手套了
动力哥,我又在《无线电》上看到你的文章了。。2012年第三期,那个全息照相的。 还有老薛的。。
恩,我跟风写了篇感想
动哥..其实如果想用更精确PWM..
会不会把微处理器升级一下也是可以的呢?
最近上网看到一款Netduino..
使用32位arm处理器,开源,C#编译环境,还能在线仿真.
好像看起来功能也挺强的..
不过实际上也应该是设好电调的脉宽才是王道..呵呵..
纯粹提一下原来还有arduino的一些衍生好东东..
是啊,处理器升级肯定有帮助,我再做点简单实验,如果不行的话。就准备重头开始另外做一套了,换芯片,换控制板,换电机(原来的摔歪了)
不过Netiduino那套板子现在在国内还是卖得太贵..
需要很长一段时间才能普及啊估计..
对了,obk同学,你说的设置电调脉宽问题。现在的电调支持不同脉宽吗?星期一我企图修改PWM频率,结果差点炸鸡。
结果一路加班到今天,现在还没下一步实验呢
可能我用词表达有误了..
我的意思是指可以调节电调最大油门与最小油门的脉宽范围..
引用你之前提供的链接..
一般电调好像和普通PWM伺服马达一样,只能接收50Hz的方波并且脉宽范围只能在0.9到2.1毫秒之间..更高频率的方波估计电调就用不了了..
所以拿450Hz也就是arduino原生提供的PWM输出可能就不行..
只能用servo库里提供的0到180度之间..
但之前我看了别人的文章..一般电调实际servo库里能用的范围只有50到140度左右..这两天病了..等病好了再好好测试一下..呵呵
我这几天也在准备试新东西,有结果再跟大家分享
好的~~加油!
期待你的结果!估计还要过两天我那个四轴才到试飞的阶段.呵呵
動力哥您好:
因最近也在製作四軸,故想請問您,我的電調只對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
虽然一般不会在最大功率下飞行,但是瞬间的峰值功率可能会导致电池损坏。这样说来可能确实有点差距吧
非航模电池确实是不标注C的,一般都是很低的。
建议你换电池吧。
一般的充电电池内阻高,所以放电电流上不去是必然的。
另外一般航模电池C大的原因都是有特殊的设计,你用常规充电电池估计是很难跟上的。
多电池并联或许能解决最大电流问题,但是电池太多自重也上去了。
并且多电池并联需要一致性很好,如果是几个不同内阻的电池混用效率会低很多
航模的充电也和一般电池充电有区别
一般是用平衡充, 电源给电池提供的并不是单纯的直流电,而经常是方波,说白了就是PWM脉冲。并且在不同的阶段(开始都是大电流,然后电流变小,最后是恒流慢充)
用直流电源直接冲伤电池的
哇,专业!
謝謝各位前輩指導,想請問航模用電池是如何處理,已至於可以提高最大放電c數。
我看航模專用電池都有平衡接頭,所謂的平衡充就是將充電氣接到此接頭,然後用3.7v各別充每一顆電池嗎??
還有一般電池為什麼內阻較高啊?
謝謝
我猜想应该是从电池生产工艺上就不一样了吧,而不是把普通电池经过外置电路改造成高放电电路。
平衡充具体原理我不清楚,不过在充电过程中,确实可以看到每块电池的电压和充电电流,应该不是用3.7去充每块电池,而是用不同的电压或电流对每块电池充电。正如darkorigin所说,用PWM方波充电,不同阶段还各不相同
批次都会有波动,使用时间等等因素(比如极板氧化程度,比如电解液的属性啥的)
就好像CPU都会有体质区分一样(记得AMD5000+有的就能开核,有的就是不行,批次都会不一样)
一般专业的搞法都是用一批的新电池作成电池组,要么就是用内阻测试装置来测,找出相近的作电池组。
謝謝各位的解達。
想再請問一個問題:
如果兩個11.1v 2000mah的鋰聚並聯”實際”使用時間會是原來的兩倍嗎?
還是兩倍少一點?
如果兩個11.1v 2000mah的鋰聚”並聯”後要用平衡充電,是否也要將平衡頭都並聯??
照理來說充電時間就變原來的兩倍吧?
謝謝 動力哥 和 版上的前輩
只能说理论上是这样的,不过曾经有人建议我不要并联两块电池。
比如标称是11.1V的电池,其实它的电压并不是真正的11.1V。也许充满的时候有12V多,快用完的时候可能变成10V。
两块电池并联的时候,如果两个剩余电量不同,就会变成其中一块给另一块充电……
反正大概意思就是两块电池不同步,并联在一起会有损耗
了解了。
謝謝
动力哥
最近我也在做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 。
没做别的,电机就是不转。一直滴 滴 滴 。请教一下哪里有什么问题呀?
你的电调初始化过吗?