catluoq 发表于 2010-7-7 21:27:44

用BASCOM自编无刷电调程序

自从去年下半年,开始自己瞎折腾 AVR ,编程环境用BASCOM,一切从零开始,后来一个航模上的 370 电机坏了,又在四轴飞行论坛上看到了别人DIY无刷电调的帖子,觉得用BASCOM写一个好像没什么问题,当时太忙(现炒现卖用单片机做一个温湿度自动记录仪,也是用正在学的BASCOM,用在一个仓储农产品的公司,花了3~4个月),最近才开始重新折腾无刷电调,用洞洞板做了一个实验板,走了一点弯路,特别是什么"带死区的PWM"等,鬼知道网上那篇文章是什么人写的,然后又被 AVR444 坑了一把 ,搞了几天才知道那是给像电毛驴之类低速电机用的,才老老实实用ACI做过零检测,一弄就成了,现在把图片传上来
<center>http://cache.amobbs.com/bbs_upload782111/files_30/ourdev_566470VKP6ZU.JPG
用的MEGA8,MOS管用 60P06 和 60N06,内阻稍高一点,但不太容易烧坏,板上装一个保险座,调试时少烧点管子,那可是花钱买的,能省点就省点,开始为了简化软件,用两片 74HC08 (四与门),只引出一路PWM信号,空出另两个T/C,一方面想到可能要对付堵转,及采集模型遥控器的PPM信号,并降低错误发生率,尽早有结果,后来当然知道是没必要了。
<center>http://cache.amobbs.com/bbs_upload782111/files_30/ourdev_566471EN0CLT.JPG
不怕头晕可以看看洞洞板背面
<center>http://cache.amobbs.com/bbs_upload782111/files_30/ourdev_566472C654EW.JPG
洞洞板电调运行,人太懒,不想用遥控器试验(要找电池,找天线晶体的,麻烦),就用一个电位器调节速度
<center>http://cache.amobbs.com/bbs_upload782111/files_30/ourdev_566473IPPW1X.JPG
试验成了后,做了一块PCB,自己学着用PROTEL99,不停的瞎碰,做出一片奇丑无比的板子,用了一片 MEGA48,MOS管开始想用 FDD6637 和 FDD6635 ,后来发现买来的 FDD6637 绝对不是渠道货,在烧了几只以后,惊奇地发现,这标着 FDD6637 的玩意的真身居然是某种不明型号的 N 管!!!!,被迫用SOP8的FDS6681硬着头皮,飞线焊接,自然没问题了。每个MOS管上故意留的一片铜泊是散热用的。这次直接使用了三个PWM端口,没加与门电路,计时用T0/C0溢出中断,由于管子内阻很低,换相必须提前15度,洞洞板的可以用0提前。
<center>http://cache.amobbs.com/bbs_upload782111/files_30/ourdev_566474PQZXPP.JPG
PCB电调运行,没有用转速调节,直接用PWM值30,因MOS管内阻很低,最高大概只能到100,否则就烧管,在PWM=60时用声卡示波器测了下,算起来转速有9K以上。马达是新西达2208,14极,KV1400,8040桨,电池用非常皮实的磷酸铁锂(原先飞电直,锂聚合电池坏了几组,想想就肉痛),标称9.6V。
这就是我的BASCOM版的电调,BASCOM的使用是很简单的,我自己若干年前,用QUICK BASIC编过一些小软件,一接触 AVR ,差不多是拿来就用,编程环境各有千秋,BASCOM 也是一种比较好的选择,越复杂的软件耗在调试上的时间比例就越长,现在单片机的资源比较充足,比方说这个电调程序,在完成了堵转保护,过流保护,也不过将近2K,编程环境越易用越好。
<center>http://cache.amobbs.com/bbs_upload782111/files_30/ourdev_566484RAN0CM.jpg
这是过零检测的波形,红色为某极采样信号,绿色为参比信号,即三相信号直接加在一起,算平均值吧。
<center>http://cache.amobbs.com/bbs_upload782111/files_30/ourdev_566485ITQR7H.jpg
这是某极单片机PWM输出与某相应MOS管输出的波形,注意,以上两个波形图都是反相的,用声卡示波器软件Eshow11采集的,对如我一般缺钱的兄弟推荐使用。
如有哪位对软件有兴趣,本人可提供功能模块的片段以供切磋。

rei1984 发表于 2010-7-7 21:34:18

lz 还是比较牛b的。


真艰苦,打算搞下去的话,建议弄个 示波器 看看波形什么的。


顶lz一下,学习lz的精神

yuanjingjie 发表于 2010-7-7 21:43:08

支持楼主,支持BASCOM

lijieamd 发表于 2010-7-7 21:43:41

内阻低跟提前换相有什么关系?
内阻低跟烧管子有什么关系?

catluoq 发表于 2010-7-7 21:54:20

回复【3楼】lijieamd
-----------------------------------------------------------------------
大概是电流比较大,换相如果不提前的话,很容易过电流,反正不提前,保险经常烧。

lijieamd 发表于 2010-7-7 22:51:52

电流跟场管内阻没关系

以下假设供电相同
电流跟电机运行状态,占空比(也可以说等效电压),电机特性决定
1.当电机特性相同,占空比相同时,电机运行状态如果发生失步,移步,卡转,则会因为转子(永磁)饱和,绕组电流上升(取决于绕组电阻)
2.当电机特性相同,当运行状态相同(均正常运行),占空比大电流大,占空比小电流小
3.当运行状态相同(均正常运行),占空比相同,大功率电机电流大,小功率电机电流小

你换相必须提前是因为你的反电动势检测做的不够好,有延时,所以你的"提前15度换相"只不过是正常换相
而如果你不提前,则通电顺序滞后于转子位置,显然电机电流是提升的,正如我在第一项中说的

你保险丝的额定电流应该也太小了,所以占空比变大的时候也会烧

liuliu443 发表于 2010-7-7 22:56:46

lz牛呀,我也要加把力气了~~~

hsztc 发表于 2010-7-7 23:09:46

哈哈,刚接触AVR时就是用BASCOM写的,不过BASCOM看不到底层的东西,学完了还不懂AVR

后来用C写AVR,就跟刚接触AVR一样,完全不同了,一边用C写,一边看生成的汇编代码,终于知道AVR是怎么工作的了。

catluoq 发表于 2010-7-8 09:33:07

回复【5楼】lijieamd
-----------------------------------------------------------------------
采样延时确实是存在的,我用的是4.7K,4.7K,及0.1UF,作低通滤波,洞洞板电调同样的占空比,电流就只有PCB板电调的一半,功率也大概是一半,相应转速也低,洞洞板转速最高(PWM约200)9K,PCB板最高转速要高许多,除MOS管外,其它元件参数是一样的,而MOS管的区别主要就是内阻。当然转速高后,采样延时比例相对也更长,提前量要更大,可能最好在程序中加个可变提前量计算。

catluoq 发表于 2010-7-8 09:43:32

回复【6楼】liuliu443 6*
-----------------------------------------------------------------------

使用BASCOM,不可能单纯只用BASCOM里的关键字,许多时候要直接修改寄存器

Adcsrb.6 = 1                                                'Enable ACME

Acsr = &B00001011                                           'ACI rising

Didr1 = &B11                                                '禁止数字输入缓冲

Tccr2a.1 = 1                                                'fast pwm

Tccr1a.1 = 1                                                'fast pwm

Admux = &B01000001
否则要么效率低,要么根本就达不到需要的目的。
这方面,可能C的现成库资源要丰富许多。

fm007 发表于 2010-7-12 20:05:38

回复【5楼】lijieamd
电流跟场管内阻没关系
以下假设供电相同
电流跟电机运行状态,占空比(也可以说等效电压),电机特性决定
1.当电机特性相同,占空比相同时,电机运行状态如果发生失步,移步,卡转,则会因为转子(永磁)饱和,绕组电流上升(取决于绕组电阻)
2.当电机特性相同,当运行状态相同(均正常运行),占空比大电流大,占空比小电流小
3.当运行状态相同(均正常运行),占空比相同,大功率电机电流大,小功率电机电流小
你换相必须提前是因为你的反电动势检测做的不够好,有延时,所以你的"提前15度换相"只不过是正常换相
而如果你不提前,则通电顺序滞后于转子位置,显然电机电流是提升的,正如我在第一项中说的
你保险丝的额定电流应该也太小了,所以占空比变大的时候也会烧

-----------------------------------------------------------------------

说的很好!

yaya001 发表于 2010-7-12 21:17:17

mark一下

支持bascom

highnose 发表于 2010-7-12 21:34:56

这个一定得顶

highnose 发表于 2010-7-12 21:51:31

Bascom 是个好东东!

我一直用的是BAS,尽别人看不起,我可不管,从basic 1.0到 quick basic 到 VB , 从解释型到编译型

几K到百W的 项目都做了,Basic it !!!

坛里还有个 jackling 也是basic的高手


楼主尽快整理哈,分享一下

catluoq 发表于 2010-7-13 18:02:29

回复【5楼】lijieamd
-----------------------------------------------------------------------

7楼说得很对,4.7K 4.7K,0.1UF,采样的延时在上次测试的条件下,刚好是15度,另外加大功率,场管发热的另一个原因找到了,PCB板设计不合理,功率输出干扰了下臂的信号输入,造成下臂不该导通的时候,时不时会瞬间导通,类似短路,问题都已解决。

catluoq 发表于 2010-7-13 18:15:43

回复【13楼】highnose
-----------------------------------------------------------------------

谢谢支持,我根本算不上编程员,几乎只会用BASIC,以前给原来公司弄过点小程序,一般是搭电脑送客户的,最后一次是好几年前给一个单位做了个EXCEL的宏,帮老板赚了几K,已经是多年没再碰,去年才发现了AVR这么好玩的东西,正在入门之中,欢迎指教。

highnose 发表于 2010-7-14 21:17:11

楼主太谦虚了

顶你的杰作

catluoq 发表于 2010-7-17 12:50:25

更新动态(含测试视频):
    最近几天抽空对BASCOM电调PCB版做了一些调整,主要包括重新买到了貌似真货的FDD6637,软件增加了消除采样延时的运算,电路也做了一些优化,已经可以进行实际飞行测试。原先MOS管发热的问题已解决,PWM上不去的原因也找到,属于布线不良,高频干扰,原先PWM值60的时候,实际上是接近200的实际输出,并且存在瞬间多路同时导通的短路,均已排除。2208电机,8040桨转速最高已接近10K,现在最大功率值先限制在PWM210,稳妥一点。并另外做了一片瘦身版的PCB,因为在试验中,就算动力开到最大,并一次把电池用完,实际发热量也很小,砍掉了原PCB板上的散热用覆铜区,以后如需要,封装时再用薄铝片作简单散热即可,多嘴一句,用的是我去年从淘宝上买的二手MEGA8,当时价格仅¥3+,片片可用,确实是合算,我买了不少,包括价格仅 ¥5.5的MEGA32!!!,现在买价格翻了几倍。

下图为实验材料,用电调上的TO-220封装的7805对遥控接收盒供电,接收盒上挂的小舵机仅用来测试遥控是否正常。固定电机的纸盒里装着几片自制的单片机实验板,另有尖嘴钳一把,防止其成为UFO。
http://cache.amobbs.com/bbs_upload782111/files_31/ourdev_568365.JPG
试验器件连接 (原文件名:实验连接.JPG)

电调运行视频,用遥控器控制转速,电调的信号/供电线上加了只磁环防止干扰,我用的是华科尔22E电直的遥控,改过,因其是所谓4合1混控,原来没有方向舵,硬塞了一片 Atmel Tiny13 (从美能达1300W激光打印机粉盒计数芯片上拆下),从接收PPM中引出方向舵信号。
无刷电调测试运行ourdev_568443.AVI视频文件大小:20.95M) (原文件名:无刷测试.AVI)

这是两代PCB板的合影,瘦身不少,管子用的是FDD6637和FDD6635,说明书上大字写着电流55A,别信,小字写着TO-252封装最大电流21A,实际使用条件下电流不要超过15A,SOP-8的MOS不管标称电流有多大,用的时候就当7-8A。
http://cache.amobbs.com/bbs_upload782111/files_31/ourdev_568366.JPG
两代PCB板对比 (原文件名:对比.JPG)
贴子出来后,点击量一直上升,我很得意,感谢所有看贴的同好,更感谢回帖的兄弟,特别是lijieamd,指出了我的不足,我正在入门,以后还有许多需指教之处。

BASCOM电调的地面试验已接近完成,就等试飞(先飞固定翼),但我的生活/工作节奏注定了这是个比较难完成的工作,可能要一段时间才能补帖子,到时候再向各位同好汇报。

我以前编小程序的时候,总是按自己的思路走,并且喜欢抄近道,这次也一样,没读过别人的代码,一方面觉得,既然已离开了学校,没人能逼我抄作业,对AVR,因为喜欢,所以才折磨自己,在这里把自己的主要源代码帖出,代码里主要的地方做了删节,一方面是众所周知的原因,另一方面是不想剥夺大家的乐趣。在这里祝各位 AVR 快乐!


$regfile = "m48def.dat"
$crystal = 8000000
$hwstack = 96
$swstack = 32
$framesize = 48

Config Aci = On , Compare = Off , Trigger = Falling
Config Adc = Single , Prescaler = 2 , Reference = Avcc          '测电池电压
Config Int0 = Rising , Nosave
Config Timer2 = Pwm , Prescale = 1 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down       '
Config Timer1 = Pwm , Prescale = 1 , Pwm = 8 , Compare B Pwm = Clear Down
Config Timer0 = Timer , Prescale = 256                      'PPM 计时


定义各种变量
DIMPwmctl As Byte , Pwmctlppm As Word ,Error as bit ,   .........
...........
...........



设置端口
Ddrb = &B10111100
Ddrd = &B00101000
Ddrc = &B00000000

中断项
Enable Interrupts
Enable Aci
Enable Ovf2                                                 '换相计时
Enable Int0
         
Adcsrb.6 = 1                                                'Enable ACME
Didr1 = &B11                                                '禁止数字输入缓冲

定义过程
Declare Sub Abon                  '各相位执行过程
Declare Sub Acon
Declare Sub Bcon
Declare Sub Baon
Declare Sub Caon
Declare Sub Cbon
Declare Sub Run                   '核心过程

Start Timer0

Pwmctl = 0
Wide = 240


中断入口
On Aci Crosszero             '过零检测及过流检测
On Ovf2 Addtime            '过零延时
On Int0 Checkrcin            '接收遥控接收盒信号

         
程序主体

Do

启动前初始设定,包括等待接收信号值,检测错误次数过多直接停止电调工作,及一些基本参数的复位等
Wait 2                                                   .延时2秒,错误发生后保护MOS管,但有机会恢复动力
Pwmctl = 0
Acsr.0 = 0                                                 'falling
...............
...............


Do

    Call Abon
    if error = 1 then exit do

    Call Acon
    if error = 1 then exit do

    Call Bcon
    if error = 1 then exit do

    Call Baon
    if error = 1 then exit do

    Call Caon
    if error = 1 then exit do

    Call Cbon
    if error = 1 then exit do

Loop

Loop
End


各过程


Sub Abon
.............
各相位运行的设置及操作,其间调用 RUN 过程
............
End Sub

Sub Acon
............
End Sub

............
............



Sub Run
   核心过程,包括换相,遥控信号处理,过流、堵转错误处理等,在可预计的转速范围内,用软件消除了过零检测延时的影响,执行时间不超

过30微秒,以保持运转稳定
End Sub


Addtime:
Incr Time0
Return


Crosszero:
...................
过零,过电流检测
Return

Checkrcin:
.............
INT0和用T/C0采集遥控接收盒PPM信号
Return

wonderfulsf 发表于 2010-7-26 11:16:17

正在学BASCOM,作个记号。楼主能把程序发完整吗?

90999 发表于 2010-7-26 12:35:42

BASIC
VB(WIN32上位机),RB(WIN32,GUN-LINUX,OSX上位机),MB(终端机),BASCOM(终端机 现在少用了),


其他
IAR(少用),KEIL(一般,分析代码用),VPF(报表),JS(网站)



我就会那么多.......BASIC其实可以做很多事。

catluoq 发表于 2010-7-29 23:42:27

回复【18楼】wonderfulsf
-----------------------------------------------------------------------

我和你一样,也是正在学,而学习就需要推动自己弄懂更多的东西,所以也不希望你通过抄作业的方式走捷径,我自己的无刷电调程序结构是很简单的,要点是在BASCOM里打开ACI后,必须手动使能 ACME ,以便检测多个IO端口,具体哪个相位选择哪个IO端口等,用ADMUX设定。堵转,我是用数组形式记录最近几次换相时间,用些算法判断运转是否正常,如不正常,就对PWM采取限制(不至于烧MOS,又可有重新启动的机会)。其它一些算法你自己也可以摸索出来,各人有各人的思路,自己弄出的东西哪怕有什么不足,也比抄来的强。我的电调还有不少缺陷,就算能飞起来,和买来的电调相比,在启动平稳度、最高转速、功能设置等方面还差不少,如有时间,还准备做些改进,也说不定会彻底变更程序结构,想法很多,可是空闲太少。我自己学AVR,从零开始,条件是很差的,但觉得自己在跌跌撞撞摸索的过程中,能学到的东西是最多的。就说这么多了,祝学习 BASCOM 愉快!

wonderfulsf 发表于 2010-8-8 21:51:41

谢谢楼主的回复。电调的确是个相当复杂的东西,需要大量的实验。我主要想用AVR完成一些在航模上的一些检测和应用,用BASCCOM会比较快的实现单一功能,但如果实现多个功能或任务上有交叉时间段,估计要用C了。电调这个应用应该算复杂应用了,因为过零检测和驱动等都有实时要求的,还有油门的反映时间,能用BASIC实现电调,我之前一直认为实现不了,看了你的成果才知道这样也可以哈。

catluoq 发表于 2010-8-10 22:45:24

回复【21楼】wonderfulsf
-----------------------------------------------------------------------
我弄AVR,最先也是从航模开始,如接收PPM解码出各舵面信号,还试图用电直接收盒里拆下的陀螺芯片做个锁尾陀螺仪,给磷酸铁锂电池做的平衡充电器等,后来折腾了几个月的数字电路,I2C,USART等,我自己认为BASIC和C在使用上不会有太大区别。20多年前,BASIC就成为了一种结构化的编译型语言,以前其代码效率不高,可能主要是因为编译库太完整,通常就一个标准库,编译时没用上的东西,都锅碗瓢盆一起加到成品软件里,不像C,要什么就只加什么库,但运行时,速度差别并不是很大,以前用PC上的BASIC(MS QIUCKBASIC7.0)和C(MS QUICK C2.0,与TURBO C2.0相近)对比计算速度,默认状态下,MS BASIC7.0 变量是浮点数,运行比整形数肯定要慢,在都是整形数的条件下,BASIC的速度大约是C的85~95%,在都是浮点数条件下,比如说,计算圆周率PAI,目标精度要求一样时,速度几乎完全相同,曾经在DOS环境下,编过一些小软件,当时实用程序里最大的代码比例实际上是人机操作界面,实际运算的比例很小,程序主体用MS QUICKBASIC 7.0,下拉菜单部分由于较多的图形操作(中文DOS环境下),用BASIC速度达不到要求,就混合了C模块,而汉字输入牵扯到键盘输入中断,用BASIC有时会出现错字,又加上汇编模块来完成这个功能,多种语言混合操作是有些麻烦,好在使用的都是MicroSoft的编程语言,库叠加很方便,但如果当时纯粹用C来编整个软件,恐怕时间根本就没法完成调试,我是不太喜欢守常规的人,只会用最快捷的方式完成工作,所以使用了BASIC。对于AVR的使用,BASCOM本来就是基于硬件基础开发的,也是用很简单的步骤完成对硬件的操作,不管什么语言,都是对寄存器的直接读或写,速度应该没什么差别,它也完全是结构化的编程环境,虽然保留了如GOTO、GOSUB等老BASIC化石遗迹,但我估计现在也没人再用了,可能在结构上的缺点就只有代码效率稍低,也就是多一些锅碗瓢盆,但对其应用范围最大的障碍,应该还是开源代码库资源少,不像C的库,网上一搜一大堆。我玩的是AVR,没觉得是在折腾BASCOM,也没兴趣比较各种编程语言环境的优劣,各人都有自己的喜好,不必强求。这个无刷电调,我觉得最重要的部分是各控制点和算法等,具体运行起来,基于中断的操作,所消耗的时间很少,占用CPU时间较多的是各种条件判断,如IF--THEN等,但还是可以用一些算法避开,提高速度,比如尽量用位操作的方式,如 I.3 = J.5 ,然后对I或J进行特定运算,自然就不太容易会影响运算速度了。我相信,用C能完成的工作,用BASCOM也不会有太大困难。

catluoq 发表于 2010-10-4 21:35:49

自制BASCOM电调试飞了
最近又对电调做了些如下改动:
1.在PCB布线上隔开了BMEF采样和单片机驱动MOS管的信号,运转更稳定。
2.改变了过零检测分析算法,取消了仿照德国四轴飞行电调部分过零检测电路的低通滤波
方式,采样不用电容滤除PWM杂波,从根本上消除了采样延时的问题。
3.改进了启动算法,内部使用数字缓冲逐渐增大输出动力,输入油门值pwm允许从0直接跳到
最大值(设为250),功率的增大幅度符合马达的机电特性,保证了增大动力的同时,电流变化
平稳。
4.用贴片的78L05单独对单片机供电,另用TO-220封装的7805对接收机及舵机供电,避免耦合
干扰。
5.对电路板面用茶色胶带做绝缘,再用铝箔胶带缠绕包扎安装MOS管的半边PCB,作为散热
片,将铝胶带接地,似乎也使干扰问题稍有改善,最后再用热缩膜封装。

改动后的变化是很显著的,与买来的新西达30A电调对比,使用同样的电池、电机、桨,进
行测试,在启动平稳度,最大转速及耗电三个主要参数上,区别已经不大。
主要参数:电池为标称9.6V的磷酸铁锂电池,电机为新西达 2208/14极/KV1450
8060桨转速8570
8040桨转速10800
7035桨转速12670
电流没有办法直接测,所以只是测量电池两极在空载和指定转速下的电压差(基本上只和
电池内阻和电流相关),相同转速下和新西达电调几乎一致。
试飞用入门级的塞斯纳,电机是新西达2212/14极/KV1400 ,动力完全满足要求。

上图:

1.电路板
http://cache.amobbs.com/bbs_upload782111/files_34/ourdev_587678XPMRXF.jpg
电路板 (原文件名:背面.jpg)


2.封装图
http://cache.amobbs.com/bbs_upload782111/files_34/ourdev_587679W5S3NN.jpg
封装图 (原文件名:封装.jpg)

highnose 发表于 2010-10-4 22:33:26

接着顶

catluoq 发表于 2010-10-5 15:06:50

回复【24楼】highnose
-----------------------------------------------------------------------

谢谢支持!

catluoq 发表于 2010-10-6 15:24:59

第二次飞行测试完成
    今天对BASCOM电调进行了第二次飞行测试,机型塞斯纳,新西达2212/KV1400 ,8060桨,两组电池,11.1V 锂聚电池及 9.6V磷酸铁锂电池,滑跑方式起飞,总飞行时间约15分钟,6个起落,整个过程电调的动力表现良好,对接收机及舵机的供电正常,试飞圆满完成。
    上传图片
http://cache.amobbs.com/bbs_upload782111/files_34/ourdev_587944Z139XI.jpg
(原文件名:机上安装图.jpg)
    1.电调安装
http://cache.amobbs.com/bbs_upload782111/files_34/ourdev_587945XSREFA.jpg
(原文件名:塞斯纳自制电调飞行a.jpg)
    2.飞行录像截图

cuikai12345 发表于 2010-10-7 17:22:01

mark

zgfjcc 发表于 2010-10-7 17:48:35

mark

catluoq 发表于 2011-2-12 13:58:36

BASCOM DIY无刷电调终极版完成
趁着春节假期,又对自制电调做了改进,原先的程序最高转速大约是13500 RPM(14级电机),电机无负载空转时,提高PWM占空比时马达转动会有顿挫表现,电流急剧增加,另外因T/C1和T/C2都用在在产生PWM波上,过零延时计时只能用中断方式,单位为约64us,太糙了,遥控油门信号实际分辨率较低,只有大约30级,虽然在直驱桨固定翼航模上的表现还不错,但这些隐含的缺陷一直让我耿耿于怀,不除之心头不快。
改进办法是增加外置16M晶振,并使用中断方式产生软PWM,将电调的PWM频率从16Khz降到8Khz,据说可以降低MOS管的开关损耗,提高总效率,空出16位的T/C1,用于过零延时处理,程序中过零检测方法也做了相应改变,复杂一点,另外软PWM本身也增加了一些运算,但由于CPU时钟提高,整体运行速度提高了,完成改进后,DIY电调的总体性能已经接近买来的商品电调了(当然是中低端的,高端的我没碰过)。
BASCOM DIY无刷电调终极版,芯片用mega48,其运算速度及AD转换速度低于商品电调常用的mega8,已经能满足要求,如用mega8,肯定还会更好一些。
主要性能:
1.最大工作电流20A以下,是根据目前使用的MOS管决定的(FDD6635、FDD6637)。
2.油门分辨率,约60级,足以应付绝大多数使用条件,如用TWI信号代替PPM,既可提高精度还能减少计算油门并转换成PWM值的耗时,可惜从目前的需求看,TWI 控制方法还用不上。
3.换相提前角约12度,适应大部分的外转子固定翼电机,也可降到10以下,飞直升机。
4.单个电周期最短约0.45ms(6相),最大转速 ,相对于 14 极电机,高于19000 RPM,相对于 2 极,似乎应该是 133000 RPM。手头只有KV1450的电机,这是冒险多串一组电池,并提高程序中电流保护值,实测出来的,电机开始抖动时转速约21400,波形图显示(见图),在步长为约0.4ms时,波形开始乱,电机颤动,再加大占空比,电机冒烟,线圈烧毁,最后程序保护功能启动,保护了电调,没烧。
5.保护功能是电流保护,保护值为根据油门值大小的线性动态保护值,做测试时用手握紧桨,在30%油门值(9.6V供电电压)附近就可进入保护状态,商品电调我从不敢这么做。本人认为,这种方法比商品电调限制某一恒定电流值或靠测MOS管温度保护要强,尽管由于计算适当的保护值及AD转换耗时,肯定会降低最大理论转速,而最高19000RPM的转速(14极电机),对于所有我能预计的应用都够了,要更高的实际转速,可以直接使用磁极少的电机。
6.丢失PPM信号处理,简单的使用watchdog(见图),收到PPM信号就喂狗,1秒丢失信号,小狗咬,复位,暂停电调工作。
7.错误恢复,当因过电流或丢PPM信号进入保护状态后,电调短暂休眠,错误条件消除后(放开握桨的手,或重新接收到正确的PPM信号),在油门值为 0 时,电调可重新进入正常状态,滴滴滴响三声后继续工作。
8.开机、保护状态后及低转速状态电池电压检测功能很简单,电路板上也有相应设计,但没能加进程序里,因为我儿子坚决表示,不管他用什么电池,就算是把电池用报废,那是他自己的选择(功课多,压岁钱都没时间花),他只是不希望飞机飞出围墙后,由于电压保护回不来,的确,外面的世界很无奈。

现在看德国四轴飞行器的电调,应该只是一种堪用级的电调,使用了MEGA8的两个计时/计数器,产生16K或32K的硬件PWM波,过零检测采用低通滤波方式去除PWM波形干扰,有延迟(公式为T=R1*R2*C/),极限转速在10K以下,过零换相延时这个功能让采样延迟代劳了,总体技术水平似乎不算很高,实际上,在四轴飞行中,电机的转速基本就在6K上下,足够用了,人家没必要把商品级的程序代码开源,免费的和收费的程序水平肯定不一样,要想做一个好的电调,不能只是研究他们的程序。

用BASCOM弄电调之前,曾认为运算速度可能会比C慢一点,但后来发现,BASCOM的速度并不低,当我试图用嵌入汇编改写部分片段时,发现在通用运算、条件语句方面,汇编并不比现成的BASCOM语句快,用不用汇编最明显的不同,基本只与我头脑发晕程度有关,所以我的电调里,仅在中断现场保护上使用了POP、PUSH汇编语句,选择保护数个有关的通用寄存器,以提高中断进程速度,估计大家用C语言时也是这样处理的。

http://cache.amobbs.com/bbs_upload782111/files_36/ourdev_615596R7ALSD.jpg
(原文件名:三个可飞电调.jpg)
三个可飞电调合影
黄色的实际飞过,mega8版,紫色的是用mega48,两个都采用内部RC振荡器,8M。裸体的是新的,只是简单地将16M直插晶振飞线焊接在MCU上,用胶带纸绑住。三个电路板都是一样的布线,下一步想买几个2*6的圆柱晶振,飞线后粘在板上,三片板都升级成新版。

http://cache.amobbs.com/bbs_upload782111/files_36/ourdev_615742GGTC5X.jpg
(原文件名:实验环境.jpg)
实验环境
发生过几次惊险的类UFO现象后,只敢反转测试,即电机和桨产生向下推力。板上的鳄鱼夹是给声卡示波器采样的。

http://cache.amobbs.com/bbs_upload782111/files_36/ourdev_615598EE3UMT.jpg
(原文件名:WATCHDOG.jpg)
WATCHDOG
好像弄错了,可实际作用差不多,不信一天不喂它试试?

http://cache.amobbs.com/bbs_upload782111/files_36/ourdev_615599GD45X5.jpg
(原文件名:提高电压测试波形图.jpg)
电机经历酷刑时的波形
可以看出两个波(5,16)出现了异常,此时波宽约0.4ms。其它有些波峰有点歪,是正常的,测试时油门约65%,8K的PWM波,其半宽度为62.5us,相对应于此时电调实际的单相周期约67us,肯定会影响波形,所以某些高端电调据称可在16K PWM运行,确实对更高转速平稳运行有好处。声卡示波器表现只能如此,将就看吧。

好了,我的BASCOM电调计划基本结束,在这里告诉想折腾无刷电调的同好:把思维方式放开,弄熟芯片的各种IO寄存器,用自己的方法,也能做出百分百自有知识产权、好用的电调,并且根本没别人说的那么难。

Clinging 发表于 2011-2-12 15:28:12

回复【29楼】catluoq
-----------------------------------------------------------------------

请教下启动过程,怎么处理 兼容性、快速可靠启动的?

catluoq 发表于 2011-2-12 22:13:32

回复【30楼】Clinging 哆拉C梦
-----------------------------------------------------------------------
我没完全弄清楚你想问什么,先按自己的理解来回答了。
    可靠启动和获得更高转速,在过零检测的控制上似乎有点矛盾,要容易启动,必须避开低转速下的杂波干扰,要多放弃几个过零点,而到了高速转动时,一个过零点就行了,我的一个解决办法是,根据转速动态选取适当的换相时机,设立一个变量,如K,比方说,低速(包括启动)时 K 设为 5,即第 5 个实测过零点开始作换相准备,转起来后根据转速提高逐渐减小 K 值,到高速状态 K 降到 1。
    平稳启动最重要的是过零检测的可靠性,过零检测不要用ACI模拟比较中断,可在符合某些条件(如某些IO端口的输入电平值,以及等等......)的情况下,直接读取ACSR.5,即ACO比较结果输出位,这种方法比盲目调用ACI中断要准确得多,直接调用ACI似乎注定将得到一些假信息。这个窍门是我摸索了几天才找到的,应该算是商品电调和业余电调的分界点之一。
    也别理会什么先让电调按逐渐加快的节律硬性转动电机,还要按什么表格时序启动的说法。在等待过零检测的循环中,退出条件除了满足过零实测次数,还要有一个超时自动退出的条件,这个时限为一固定值,如10-20ms,即没有检测到过零,超时也退出循环准备进入下一相位。一旦捕捉到准确的过零点,电机就自己甩开转起来了。

在BASCOM里,这个循环语句是这样的:

do
if 条件1 and 条件n... and ascr.5=1(或0) then
    m=m+1(C语言里是m++)
elseif ......   
    ......
end if
loop until m>=k or timer1(或某个T/C溢出中断的次数)>=t(设定最长等待时限)
               
使用条件语句虽耗时,但准确度较高,几个us,顶多在后面的延时中扣减就行了,影响很小。

catluoq 发表于 2011-6-25 14:07:03

向各位通报一个消息,我儿子高考成绩出来了,本省排名200余名,将到某相关重点大学读航空设计,以后玩的就是真家伙了。我从完全空白到逐渐熟悉单片机的经历,相信对他未来碰到的难题也能作为一种有益的启示。祝大家同喜。

90999 发表于 2011-6-25 14:16:34

回复【33楼】catluoq
向各位通报一个消息,我儿子高考成绩出来了,本省排名200余名,将到某相关重点大学读航空设计,以后玩的就是真家伙了。我从完全空白到逐渐熟悉单片机的经历,相信对他未来碰到的难题也能作为一种有益的启示。祝大家同喜。
-----------------------------------------------------------------------

祝贺。

Clinging 发表于 2011-6-25 14:17:07

恭喜

cqlutao 发表于 2011-7-4 19:23:26

MARK

JAMESKING 发表于 2011-7-4 20:39:07

祝贺楼主,需要新版bascomavr,请参考我发表的帖子。

以前本坛basic和c语言可是打过大仗的,我当时也参与过这场网络战争,虽为口水战,但我却从此认识很多高手,也学到很多东西,在此跟一贴,感谢各位高手的教诲。

个人观点,屠龙刀和倚天剑能杀人,指甲刀也能杀人,看用的人水平如何。

highnose 发表于 2011-7-4 20:58:47

JAMESKING老兄出现

接着顶

catluoq 发表于 2011-7-5 01:06:02

JAMESKING大驾光临,本老菜鸟不胜荣幸,并感谢祝贺(当然也包括已经回帖的各位),正准备下载新款的BASCOM。原先也了解了一些本网站basic和c支持派间的所谓冲突,不过看来,都基本属于讲道理的技术性分歧。本人觉得,不管什么语言,能达到目的就行,语言不同,但结构和算法却是相通的,我最近写了一些小应用,就有一些部分是由 C 源转换而来,也开始琢磨 C 和 ASM ,把原先自己的一些 BASCOM 的程序用 C 重写(包括这个无刷电调),还加上尽可能多的嵌入汇编,因为现在不需要以此谋生(到目前为止,没得到也没想得到报酬),所以感觉很轻松,这也是作为纯业余爱好者的乐趣。

koalababys 发表于 2011-7-5 01:59:24

mark

yanzaihong 发表于 2011-7-8 22:08:33

学习了!好强大!

register_x 发表于 2011-11-28 22:14:23

学习了

aishiqi1992 发表于 2011-12-21 20:53:56

你有用死区保护吗?栅极电阻会不会使边沿缓慢?场效应管栅极的电压够吗?为什么我的总是烧管子呢……晕

catluoq 发表于 2011-12-29 23:05:29

回复【44楼】aishiqi1992 小鸡
我觉得所谓死区不是无刷电调里的概念,只要程序没乱,不会出现同一对MOSFET管上下同时导通的情况,电调是三对管,轮番上下导通,另外只要管子性能大致在正常范围(Rds < 100mΩ ,1V < Vgs < 4V,耐压及电流都足够),后两个问题也不存在。烧管基本可以确定问题要么在程序上,要么在电路上。网站里的电路图不少,管子的选型也可以参考,至于程序里的毛病,就得静下心来慢慢琢磨了。

gale 发表于 2011-12-30 16:31:57

good!

jun427 发表于 2011-12-30 19:31:24

电调

虫虫好 发表于 2013-9-29 23:45:49

lijieamd 发表于 2010-7-7 21:43 static/image/common/back.gif
内阻低跟提前换相有什么关系?
内阻低跟烧管子有什么关系?

lijieamd兄台能否推荐点 资料关于MOSFET 选型的 诸如 VGs=15全 N mos过30A怎么选型,还有 关于你在一篇期刊 写的 短脉冲 也不太理解
页: [1]
查看完整版本: 用BASCOM自编无刷电调程序