从MikroKopter中的无刷电调程序V0.33发展的修正程序
点击此处下载 ourdev_317282.zip(文件大小:27K) (原文件名:BLDCv033_fix01.zip)不知各位有多少人是自制无刷电调的呢? 又有多少人是用m8的呢? 为了方便一些人, 我打算发布一些我现时使用的电调程序。因为比较懒,暂时没下决心去重写代码, 用MikroKopter的电调代码好像也挺好(虽然有不少的Bug)。因为从v0.35到v0.41版本总是运转不顺, 算了还是自己来修正代码另起炉灶。暂时是把电流检测部分修正了一下。我串入0.5欧的电阻作电流测试,效果还是可以的, 估计如果出现堵转或mos中有管损坏而导致大电流的话, 这个保护应该足够。因为手上有由网友feng_matrix 送的pcb板,所以电流检测和电压检测脚便按他的设计调整。指示灯也作相应调整。除了这两处外,其它便与MikroKopter的无异。如果有网友愿意参与这个小小项目,非常感谢!希望能一起完善好一个不错的电调。 这个代码是可以直接用的吗 feng_matrix的图? 隐约记得mikrokopter上面介绍说,点调程序是根据他们电机的选型进行了优化的, 会不会是这个原因导致楼主的电机运行不顺呢?
mikrokopter用的电机是14极的, 我们一般国内的电机好像多数是12极,不知道这个有没有关系 to : 【楼主位】 (敏感词0386)123
如果用我的PCB板,PPM_DECODE.C/PPM_DECODE.H/UART.C/UART.H,都可以删除,实际使用中根本不需要 是的. 14极与12极区别在哪里呢? 但14极怎么排列呢? 不太懂. 14极说的是转子上的磁极,航模无刷电机定子一般都是3的整数倍 【1楼】 xiangyuan_122
是可以直接用. 我现在就是用它.但是有一点要注意, 你要把通向mos管的地作些修改(因为feng_matrix第一版中,他在覆铜时没注意,让覆铜与mos管处的地也连通了,这样使得在电流检测上会变得复杂,纯技术上意见, 希望feng_matrix不要介意, 你能送我pcb,我已经非常感谢你).
【3楼】 feng_matrix
的确是没什么用, 特别搞笑的是他们弄了串口,但是却没有作rc校准, 真不知他们是怎么用的. 暂时是想提供一个自己测试可用的代码给大家, 日后慢慢完善. 在适当时, 我应该会重写. 始终整个程序的架构都不完善, 虽然程序也能用, 但不觉得是好, 只能给个合格. 【6楼】 (敏感词0386)123
你说的对,那块是我布得第一块板子,地线问题没有仔细考虑清楚 以下视频就是使用楼顶的源码生成的程序+feng_matrix送的板驱动电机的.除了感觉电机有点吵外, 其它都算OK.可能是风大吧.运转一段时间,电机也不会暖,还是冷冷的.
点击此处下载 ourdev_317802.rar(文件大小:3.75M) (原文件名:1avi.rar) 【6楼】 (敏感词0386)123
你说的要注意的问题是针对feng_matrix的PCB板不是原理图吧 标记. 【9楼】 xiangyuan_122是的,而且只限于他的第一版的pcb. 发现了程序可能存在一个严重的bug.为何说可能呢? 哪是因为还未完全确定. 已经导致同一个相的p-mos管损坏, 而其它相却未试过损坏. 而且连电流保护也无用.
当然送120这个值给电调(此时电机是静止的), 电调接收后开始激活启动电机. 电机动了两下后就出现像卡死现像.同时电调板上的一个p-mos管开始冒烟.结果一只管就这样牺牲了. 今天试了两次, 操作同样方式. 但是出现损坏前,使用其它值启动并未出现情况, 而且运转也很正常.看来得查明原因才行.现在最奇怪的是,为何总是同一相中的p-mos管, 而其它的却未试过.很是奇怪. to : 【12楼】 (敏感词0386)123
你如果用德国人的程序,可以把启动限流的的参数再改小些,参数在main.h中
如果用我的第一板PCB板,把板子做个处理,用刻刀把下图红圈中这条线割断:
http://cache.amobbs.com/bbs_upload782111/files_10/ourdev_318624.jpg
成品电调或舵机内都有逻辑控制占空比变化率的,就是步长,因为硬件响应速度很多情况下小于输入信号变化率
这时即便输入信号从0突变120,实际占空比仍然是逐步增加直到目标值,用PID算法就可简单实现这个逻辑
这样的好处就是转速调整或舵机运转更加平稳,坏处是步长太小整体响应速度就降低了
最好情况是软件步长与电机加速度刚好相匹配
做四轴电调为了提高响应速度,输入量都是接收下来就直接修改PWM发生寄存器的
德国人的程序在电机正常运转后,根本不检测电流的,限流逻辑只在启动过程中
因为在电机高速运转时用M8的ADC功能,要切换采样管脚,可能会影响过零检测及换向 电流检测的线路我弄好了. 把地处理好了. 通过串入0.5欧作为电流检测, 也可以实现电流的保护作用. 在程序在, 德国人的程序有一个bug, 使得不能在运转时保护, 这个我已经修正了. 问题出在电流检测的AD值, 它限定最大为200, 而要紧急停车的话, 需要哪个值大于200, 这就使得就算电流再大, 也不会符合条件而起保护作用. 所以我把限定值设为205,这样电流保护紧急停车功能便生效了.这个BUG在v0.41版同样存在. 其实我现在最奇怪的是, 我以各送56 72 168 184的值让电调启动电机, 一点问题都没有, 但偏偏两次同是120就会出现故障. 而且电机的电流保护不起作用.这才是我最奇怪.因为每每都以烧管.未敢乱试.打算把源码看个明明白白再试.因为手上并没有带电流保护的电源, 只能这样了. 为了给其它网友提个醒,所以发上来让大家注意一下. to : 【14楼】 (敏感词0386)123
你改了程序,在运转过程中采样电流吗? 它原本的程序就会. 在比较器中断中. 然后在SetPWM()中进行过流判断, 超过时便停车. 但是它的v0.33版中, 这个停车存在问题.因为它只是关掉pwm输出,但有可能会使输出脚还保持高电平而使得P管处于导通状态. 于是在v0.41版中, 便加入对N管的控制, 把N管关闭,然后再关pwm.这样就保证输出回路断开.我测试过, 这个保护是生效的.测试方式:在地的电流检测上串0.5欧电阻.同时并上一段导线.然后让电机运转到稳定.接着断开导线.这里电机转速立刻降低ROT灯亮, 然后转速一直下降. 到了快停时, ROT灯再次灭,电机开始再加速.但是转速到一定好, ROT灯就亮,然后再降速. 你烧掉的那个MOS是否连接在OC2G管脚上?
关掉计数器2的pwm输出,输出脚状态随机的,强制设置都不行
16位计数器的两路PWM就没有这个问题,估计和M8的硬件设计有关
第一次上电我就在波形中看出这个问题了,因为有一路MOS经常开关波形不对
我用汇编写的电调程序,就直接改了管脚输入输出方向解决之,如同:
MOSP_A_PWM_ON:
ldi main_temp0, 0b00001000 //关T1分频器
out TCCR1B, main_temp0;
ldi main_temp0, 0b01101001 //开T2分频器
out TCCR2, main_temp0;
ldi main_temp0, 0b00001000;
out DDRB, main_temp0;
ret;
MOSP_B_PWM_ON:
ldi main_temp0, 0b00001001 //开T1分频器
out TCCR1B, main_temp0;
ldi main_temp0, 0b01001000 //关T2分频器
out TCCR2, main_temp0;
ldi main_temp0, 0b00001100 //输出T1B通道
out DDRB, main_temp0;
ret; 的确是接在OC2G上.你的意思是, 当关断OC2G的pwm输出同时, 要把相对应的DDRB设为输入.是不是这个意思? 0.5欧取样电阻大了一点,电流小无所谓,但对于十数安电流来说,太大了,发热太厉害;
俺用过一台朋友送的德国GSC电调,用了一片8pin运放,取样电阻只有0.001欧姆,就一段铜导线,据说还是无氧铜的;
说到电调,俺还是中意有相位传感器的无刷,故障率低,性能好过无感的;程序编制也方便; 楼上误解了, 串0.5欧是为了测试.因为我不可能乱来短路电路测试保护, 所以只是把采样电阻加大,并电线作为采样值的切换测试. 事实上, 平时用是使用一段导线作为检测用. TO : 【19楼】 (敏感词0386)123
不是设为输入,是设为输出,你目前用的是那一版程序?是否运行中PMOS较热?
德国人0.31、0.33、0.35、0.36、0.37、0.41版,好象一直在折腾你说的问题
我们到MSN上讨论这个问题,坛子里聊太慢了
feng.matrix@yahoo.com.cn 直接将占空比清零 【22楼】 feng_matrix 好的. 因为今天白天有事, 现在才看到你的帖. 可能今晚才有空, 不好意思! 你今晚有空在线吗?
【23楼】 johu在电流保护处已经把占空比清零了.但是没有用.而且两次都是损坏同一只管.而且如feng_matrix 所说, 是烧坏接在OC2G上的管.还有一点补充是,ROT的led在这里是亮的.也就是说程序已经进入到电流保护了.只是它并未能保护到,清零也无用. 今晚有空,不过要到8点以后儿子睡觉了,我才能上线 呵呵, 没关系,只要你方便就可以了。我上传昨晚改了的程序。昨晚和今天中午试了下,好像输出120的值让它启动也不会损坏。我后来大胆试了几次都没问题。因为我没有示波器,所以看不到波型。
点击此处下载 ourdev_319162.zip(文件大小:27K) (原文件名:V0.33_08_6_20_14.zip)
现在运转起来,p-mos管的确比n-mos管热。可能与经常开关和电阻率大点点有关。
这是新程序的运转视频。程序改了后,启动变得不顺利。但转起来后,噪声好像小了。还有一点要说的是,之前烧管时,启动都像这视频哪样,启动不成功,有个闷响声后管就冒烟了。但现在却不会。昨晚误解,以为开哪个通道就把相应通道DDR设为输出,其它为输入(德国人的程序v0.41就是这样,而v0.33则是把OC2G对应的脚长期设为输出)。
点击此处下载 ourdev_319182.zip(文件大小:2.26M) (原文件名:DSCN0622.zip) to : (敏感词0386)123
不好意思,刚才说了一半宽带断了,打电话到电信说是服务器有问题,晕啊!
等了好久才连上 学习了 没关系。 我也在看德国人的程序。看出一些设置问题。 to :(敏感词0386)123
32khz试验了吗?是否效果更好些?噪音是否减小? 今天忙了一天,还未试。昨晚看了一晚程序。发现在16khz时,timer1 timer2所使用的pwm模式不同。还是搞到明明白白先。始终觉得现在存在比较多的问题。 是不一样的,16位寄存器无论16khz还是32khz改改ICR1里的TOP值频率就变了
同时比较值跟着翻倍就可以了,8位寄存器255已经是上限了,没有办法该TOP的 仔细读了一下程序,发现楼主根据feng_matrix的电路把port以及ROT和GRUEN重新设置了一下,对于portB与ROT主要是过流检测指示灯的操作,但是程序中多次出现(PORTD|=GRUEN)有点不明白,GRUEN设定值为0x20,也就是说对PD5操作,但PD5接C相下桥N-MOS,这样岂不是直接打开N-Mos,始终没明白这句话的意图,还请楼主指教。 谢谢楼上的提点,是我忘了改到PORTB了。真是丑大,犯上这么低级的错误。应该是改成PORTB|=GRUEN; 在得到各位网友帮助,无刷电调程序算是修正了。现在启动和运行都没有问题,电机声音也正常和流畅。特别感谢feng_matrix和wxbr 的提点!现在把新程序上传,并附上运行视频(供电电压为5V,测得功耗为45W,电流大概是8.8A)。个人感觉程序已经无问题了。现在也不烧管,取消了限流电阻(0.5欧),电机动力明显提升。如果有网友试用,有什么疑问或有什么提意,大家可以交流一下。
程序:
点击此处下载 ourdev_331964.zip(文件大小:27K) (原文件名:BLDCv033_fix02.zip)
视频:
点击此处下载 ourdev_331963.zip(文件大小:5.47M) (原文件名:DSCN0705_New.zip) to :【35楼】 (敏感词0386)123
启动电流多大? 这个测不到啊。因为我是用5V 20A的开关电源供电。测最高风速时电流是用电流表测220V端。我手上仪器不多,所以无源测量。 to : (敏感词0386)123
你有没有在电调输入端并联电解电容? (敏感词0386)123 齐来俯卧:
从视频中看到,你是用键盘控制串口发送命令给控制板,再由控制板发送命令给电调
想请教下,如何用PC键盘控制串口? 【38楼】 feng_matrix
没有并啊. 只是在mos管哪里并.
【39楼】 yl3721 亮仔
直接用串口终端(就是一些串口调试软件), 直接发不同键值到控制板而尔. mark 深度膜拜 我想问一下LZ,你修改过的软件能用CVAVR直接编译通过吗? 没试过,如果修改一下肯定行.不过为何要改成cvavr的呢? 问下LZ,德国的原理图PB6,PB7好像是可以通过跳线接地选择什么地址的,但feng_matrix的原理图是接的晶振,看程序里也是有对地址选择的处理,地址处理部分是不是对整个都没什么引响啊 你看看宏的定义,如果你固定了一个地址码,哪它就不会编译哪段地址码了. 也就是去掉这个也可以是吧 还有那个PPM处理的部分
他这里这个MotorAdresse是个什么地址呢 前半段是没有处理 但后面还是赋值为1的哦 我是固定地址的, 其它什么ppm uart就留着, 反正不影响使用.真要好好修整,估计要重写了. BLDCv033_fix02 仔细阅读了代码发现一些问题:
1.main.c中
pwm是 32khz编译的,SetPWM()中,以下的代码是错误的,注释掉的代码才对。
#ifdef _16KHZ
// OCR1A = 2 * (int)tmp_pwm; OCR1B = 2 * (int)tmp_pwm; OCR2 = tmp_pwm;
OCR1A = tmp_pwm; OCR1B = tmp_pwm; OCR2 = tmp_pwm;
#endif
2.blmc。h中
#ifdef _32KHZ
#define PWM_C_ON {TCCR1A = 0xAD; TCCR2 = 0x49;DDRB = 0x3A;}
#define PWM_B_ON {TCCR1A = 0xAD; TCCR2 = 0x49;DDRB = 0x3C;}
#define PWM_A_ON {TCCR1A = 0xAD; TCCR2 = 0x69;DDRB = 0x38;}
#define PWM_OFF {OCR1A = 0; OCR1B = 0; OCR2 = 0;TCCR1A = 0x0D; TCCR2 = 0x49;PORTC &= ~0x0E; PORTB &= ~0x0E; DDRB = 0x38;}
#endif
我在调试德国人的程序时也发现有些变扭,lz改的程序,我感觉有进步,但是还有问题。 TCCR1A = 0xAD ,foc1a=1 foc1b=1,这里为什么需要强制匹配???按道理就是foc1a=0 foc1b=0,还有
PWM_C_ON
PWM_B_ON
PWM_A_ON
为什么不这样写?
#define PWM_C_ON {TCCR1A = 0x81; TCCR2 = 0x49;DDRB = 0x32;}
#define PWM_B_ON {TCCR1A = 0x21; TCCR2 = 0x49;DDRB = 0x34;}
#define PWM_A_ON {TCCR1A = 0x01; TCCR2 = 0x69;DDRB = 0x38;}
COM1A 和COM1B还有COM2不想产生波形就两位清零,然后DDR寄存器设置为输入,管脚应该是高阻态。后级A+ B+ C+的三极管 基级应该无电流,达到关断pmos的目的。
ps:手上也在调试电调程序。不过我是从0.31版本开始调试的,就感觉德国人的程序在这一段宏定义的时候非常不妥,可能是自己还没吃透中间的玄机吧 我試過了,德國人的程序可能是在程序中故意地加了一些BUG,但思路還是對的,把這些BUG稍加改動後還是可以運行的。在調試的過程中MOS管很容易燒,所以用分立元件,並用手頭TO-220的MOS管,更換起來方便。後來燒得太頻繁了,在進行ISP燒錄都會燒掉MOS管,只好又在MOS管供電端加了一個開關。
德國人的程序在自動動行過程中是采用中斷方式進入自動換相的,在中斷的過程中又插進了AD轉換,消耗了大量的時間資源,後來我改成不由中斷進入,而由程序控制進入自動換相。運行得還很平穩。最不方便的是,它的內部比較程序和AD轉換程序相沖突,使用比較器時得把AD轉換功能關掉,使用AD轉換時得把比較器復用功能關掉,相當麻煩,如果要把它改成由電位器來調速的控制,還真不容易,以下為一段運行的視頻。
点击此处下载 ourdev_590204.rar(文件大小:7.43M) (原文件名:MOV0026A.rar)
本贴被 jeoge 编辑过,最后修改时间:2009-01-16,16:13:54. 记号 各位好! 我在程序换向控制中看到ZeitZumAdWandeln 这个变量,没看懂是如何处理的,干什么用的???? 留个记号 做个记号。。 mark 好贴子做个记号! 请问各位,程序中的ADCW是什么? 准备出手了,做个记号。 楼主,小弟准备做直流无感无刷电调,材料已准备妥当,网上查了N多资料,对有些名词还是不得其解。不知楼主大哥能否加我QQ(309035975)指点一二?小弟先谢过! 记号 学习了。 mark 回复一个吧,留着. mark 我做了一下,电机可以转动了,8v以下电压启动不是很好,lz有改进的程序吗,请问pcb板还用吗, 没有装电流保护,试机猛了点吧mos管烧了。 mark 回复【26楼】love12345 齐来俯卧撑
-----------------------------------------------------------------------
请问德国人的开源网站的链接是什么? 关注电调 关注电调 先顶了在看。
页:
[1]