amoBBS 阿莫电子论坛

 找回密码
 注册
搜索
bottom↓
查看: 128521|回复: 930

写给四轴新人:无感无刷直流电机之电调设计全攻略

  [复制链接]
发表于 2010-7-21 21:27:44 | 显示全部楼层 |阅读模式
关注开源四轴项目也有近一年了,前期都以潜水为主,业余时间主要是在啃那些控制和导航的理论书籍。最近开始动手做了,打算先从电调开始,发现真要做起来问题还真是一大堆。所幸有论坛这么好一个交流平台,很多问题其实前人都已经碰到过了,参考前人的经验,让我少走了很多弯路。在此要感谢论坛各位前辈大侠和阿莫的ourdev。:-)

    前人种树、后人乘凉,既然受惠于前人,怎好意思独享,当然也应该帮助一下新入门的开发者。由于四轴分论坛的帖子数量已经很多了,光搜一下无刷电机和电调也有近百来篇帖子,次序和深浅程度不一,想要看完并完全理解这些帖子对新人来说不啻是一个艰巨的任务。而且很多帖子的发帖时间都比较久远了,回帖提问也未必能得到原作者的回答。我写这篇文档的目的,就在于做一个整理和汇编,把很多零散的、前人已解答过的问题分门别类整理出来,并添加一些自己制作电调时的经验和总结。

    在参考一些关于无刷电机驱动的书籍和帖子的时候,发现高手或是大师好像都比较惜字如金,一些问题往往点到为止或者一笔带过,有些看似简单的问题会让像我这样的电调DIYer困惑很久。所以在本文行文时,笔者力图把问题以大白话的形式说明白,如果各位有觉得哪里看得不明不白的,可以回帖提出(时限一个月,呵呵),我会修改文档以试图将问题讲清楚。如果有些问题我无法回答,我会老老实实跟你说我也没搞清楚,还要请高手来解惑啊。如果发现我哪些内容讲错了,也请不吝指正。

    最后还将附上德国MK项目电调代码(V0.41版本)的全代码分析,这件事可能以前没人做过吧,我就来揭晓一下答案好了^ ^。同时我也参照他的程序,自己写了一个可供mega8和mega32使用的电调驱动程序,将一些结构作了优化,所有变量名都从德语改成了英语,添加了比较完备的中文注释,通讯规约也做了一些整理和改动,并附带上位机调试程序。也希望大家能多多把自己的一些心得体会和经验拿出来,建立好一个基础的知识平台后,可以让后来的开发者少走很多初期摸索的弯路,而专心于攻克我们未能解决的难点。衷心希望后来的开发者能站在我们的肩膀上,走得比我们更远。


点击此处下载 ourdev_570001.pdf(文件大小:4.58M) (原文件名:无感无刷直流电机之电调设计全攻略.pdf)


下面是我自编并经过测试的电调程序,因为比较忙,目前只支持MEGA32,支持MEGA8的版本会以后补上。原理图基本同V1.2版本,只有两个LED的管脚和V1.2稍有不同,这个在程序里很容易就可以看出。
点击此处下载 ourdev_569787.rar(文件大小:60K) (原文件名:test_mega32.rar)

下面是VB6编写的上位机调试程序
点击此处下载 ourdev_569826.rar(文件大小:7K) (原文件名:MotorControl.rar)

文档目录:
前 言        1
1. 无刷直流电机基础知识        2
  1.1 三个基本定则        2
    1. 左手定则        2
    2. 右手定则(安培定则一)        3
    3. 右手螺旋定则(安培定则二)        3
  1.2 内转子无刷直流电机的工作原理        3
    1.        磁回路分析法        4
    2. 三相二极内转子电机结构        5
    3. 三相多绕组多极内转子电机的结构        7
  1.3外转子无刷直流电机的工作原理        8
    1. 一般外转子无刷直流电机的结构        8
    2. 新西达2212外转子电机的结构        8
  1.4 无刷直流电机转矩的理论分析        14
    1. 传统的无刷电机绕组结构        14
    2. 转子磁场的分布情况        15
    3. 转子的受力分析        16
    4. 一种近似分析模型        18
  1.5 换相与调速        19
    1. 换相基本原理        19
    2. 新西达2212电机的换相分析        24
    3. 调速        28
2. 无感无刷电调的驱动电路设计        30
  2.1 电池电压监测电路        30
  2.2 换相控制电路        30
    1. 六臂全桥驱动电路原理        31
    2. 功率场效应管的选择        33
  2.3 电流检测电路        45
  2.4 反电势过零检测电路        49
  2.5 制作你自己的电调线路板        50
3. 无感无刷电调的软件设计        52
  3.1 电流检测        52
  3.2 定时器延时与PWM信号        53
    1. 定时器初始化        54
    2. 定时器T0的溢出中断服务程序        54
    3. 利用T0延时(毫秒极)        54
    4. 利用T0延时(微秒极)        55
    5.        PWM信号的产生        55
  3.3 过零事件检测与电机换相        56
    1.        BLMC.h中定义的宏        56
    2.        过零检测与换相代码分析        59
  3.4 启动算法        63
    1. 函数Anwerfen启动流程分析        63
    2. 启动算法机理探究        65
  3.5 上电时的MOSFET自检        68
    1. 函数Delay和DelayM        68
    2. 函数MotorTon自检流程分析        68
  3.6 让你的电机演奏音乐        70
  3.7 通信模块        72
    1. PPM解码        72
    2. TWI总线通信        74
    3. 串口通信        74
    4. 指令的收入函数SollwertErmittlung        75
4. 德国MicroKopter项目BL-Ctrl电调程序主程序代码流程分析(V0.41版本)        77
  5.1 全局变量列表        78
  5.2 main主函数流程分析        80
    1. 进入while(1)前的准备工作        80
    2. while(1)主循环内容分析        81
5. 高级话题        86
  5.1 电机的控制模型        86
  5.2 四轴上的校正策略        87


文档封面与内容截图:

(原文件名:J01.JPG)

(原文件名:N08.JPG)

(原文件名:N09.JPG)

(原文件名:N10.JPG)
发表于 2010-7-21 21:36:11 | 显示全部楼层
很好,请问楼主做好了么?
发表于 2010-7-21 22:27:56 | 显示全部楼层
终于出来了 顶~~~~~
发表于 2010-7-21 22:37:41 | 显示全部楼层
好人,好贴
发表于 2010-7-21 22:38:28 | 显示全部楼层
下了。感谢楼主贡献
发表于 2010-7-21 22:39:11 | 显示全部楼层
对有心人的回帖也该用心。先下载文档,仔细看过再做评论。谢谢楼主。
发表于 2010-7-21 22:48:09 | 显示全部楼层
用成品电调吧,XXD30A的才40元.电调本身就算个较复杂的项目的了,把精力花在四轴上哈!先排除电调这个难点哈.
发表于 2010-7-21 22:50:44 | 显示全部楼层
顶,谢谢楼主分享
发表于 2010-7-21 22:56:05 | 显示全部楼层
谢,楼主。
发表于 2010-7-21 23:28:13 | 显示全部楼层
标记下,谢谢楼主,明天学习。
发表于 2010-7-22 00:34:17 | 显示全部楼层
第一遍看完。
感觉全部认真看完的话,如果还不会做无刷电调就是个人能力的问题了。好多以前没人提到的地方,这里确确实实的提到了,讲解了。楼主这个主要还是围绕MK电调在讲,如果做大功率电调至少电路需要再研究。

看到一个地方字序颠倒了,是文档下标69页。“并一下测电流”。其他没了。
我感觉楼主很技术高,各方面。我学到好多。
阿莫,赶紧给酷。
发表于 2010-7-22 01:28:53 | 显示全部楼层
mark
发表于 2010-7-22 08:39:33 | 显示全部楼层
cool
发表于 2010-7-22 08:42:24 | 显示全部楼层
mark
发表于 2010-7-22 08:56:19 | 显示全部楼层
谢谢楼主,对电机控制很感兴趣.
粗略看了下,楼主的教程_真是巨细靡遗,支持置酷.
发表于 2010-7-22 09:09:33 | 显示全部楼层
谢谢楼主的无私分享!!!!!!!!
发表于 2010-7-22 09:10:44 | 显示全部楼层
谢谢楼主分享
发表于 2010-7-22 09:38:00 | 显示全部楼层
好贴不得不顶
发表于 2010-7-22 10:22:49 | 显示全部楼层
先顶再下
发表于 2010-7-22 10:42:07 | 显示全部楼层
奇怪,第一个PDF文件好像下不了
发表于 2010-7-22 10:55:24 | 显示全部楼层
多谢楼主这等无私奉献之人
发表于 2010-7-22 11:51:17 | 显示全部楼层
好贴
发表于 2010-7-22 11:54:30 | 显示全部楼层
谢谢
发表于 2010-7-22 12:03:46 | 显示全部楼层
此贴应该置酷啊!
发表于 2010-7-22 12:10:22 | 显示全部楼层
认真阅读楼主总结的精华内容
发表于 2010-7-22 12:31:51 | 显示全部楼层
mark
发表于 2010-7-22 16:07:49 | 显示全部楼层
正需要呢,太感谢LZ了
发表于 2010-7-22 18:02:38 | 显示全部楼层
好东西
发表于 2010-7-22 18:22:01 | 显示全部楼层
mark
 楼主| 发表于 2010-7-22 20:11:40 | 显示全部楼层
回复【10楼】flyunlimit  飞行无极限
-----------------------------------------------------------------------

多谢指正,已经改了。
发表于 2010-7-22 20:42:36 | 显示全部楼层
看到这么仔细认真的一位楼主,我终于又感到了本坛交流氛围的生机
我也发过电调的帖子,我敢说我能体会楼主的心情,楼主花这么大精力写一篇帖子,引经据典,字字斟酌,唯恐一错而引千夫指
为的是什么?我想绝对不会是"cool","mark""谢谢",而是[交流],没做过电调的可以靠这帖子入门,做过电调的可以跟大家讨论
没做过的可以提问,做过的可以发问,甚至可以挑错,找茬,我相信楼主也是会感到很欣慰的

我浏览了一遍PDF,觉得最让人欢欣鼓舞的就是楼主花费了大量篇幅介绍电机结构和电机理论,当我们有一定的动手能力的时候,我们最需要的就是理论知识,我们甚至要花上90%的时间研究理论,10%的时间动手,而不是一开始就胡乱调试
甚至有人还不知道无刷的结构,就嚷着要换相了.还没弄清楚三相电桥结构和工作过程,就叫着要检测反电动势了,是的,也许你可以弄出来
可以转起来,但是你就会发现"创新"这两个字从你的字典里消失了

我只能说,楼主是无私的(相对于我这个不够无私的人来说(当然可能还有更无私的)),将这么多的细节和原理结合成一个PDF,共享出来,比国外的"假开源"要好的多的多
这不是用来"mark"和"顶"的,要学习要交流

我的下一步计划就是仔细看一遍PDF,然后找茬,然后交流
发表于 2010-7-22 21:12:38 | 显示全部楼层
强烈支持!就这种态度都够了!
 楼主| 发表于 2010-7-22 21:39:20 | 显示全部楼层
回复【30楼】lijieamd  
-----------------------------------------------------------------------

好呀,欢迎交流! 你的那个导航算法搞得怎么样了?我打算下一步先搞控制,再下下步搞导航算法。
发表于 2010-7-22 21:44:00 | 显示全部楼层
我没有搞导航算法,呵呵,还没到那层次,只是在弄姿态估计
我认为应该先弄姿态估计,毕竟控制算法是需要用到姿态的
发表于 2010-7-22 23:08:32 | 显示全部楼层
mark
 楼主| 发表于 2010-7-23 09:48:31 | 显示全部楼层
回复【33楼】lijieamd
-----------------------------------------------------------------------

我觉得姿态估计比纯控制应该更难,不只是三轴陀螺仪就够了,三个加速度计的输出也要添加进去作修正(秦永元那本《惯性导航》我看完了,觉得写得相当不错,特别是后面捷联惯导部分),而且还要考虑到测量器件本身的误差等,徒增变数。 而且根据控制理论,反馈环节造成的误差对灵敏度的影响最大,而且是不可校正的。

所以我打算先绕开这一步,将四轴固定在轴承架上,用工业用的角度传感器直接测量姿态,这样至少反馈环节的精度没有问题了,然后用经典的控制理论去建模,等到四轴可以在支架上平衡,控制都没问题了,最后再上姿态估计系统。
发表于 2010-7-23 13:28:03 | 显示全部楼层
自学强人,学习。
发表于 2010-7-23 13:39:13 | 显示全部楼层
楼主用心了
发表于 2010-7-23 14:09:12 | 显示全部楼层
好贴
发表于 2010-7-23 14:43:46 | 显示全部楼层
非常赞赏,楼主无私的精神!感谢楼主的奉献!
希望AM置酷!不仅是对楼主工作的认可,也方便给更多人看到,让本文章发挥出它的价值!
发表于 2010-7-23 15:49:31 | 显示全部楼层
这个非常的好!谢谢!仔细学习!
发表于 2010-7-23 16:48:22 | 显示全部楼层
裤子前留名~
发表于 2010-7-23 23:10:32 | 显示全部楼层
好帖,拜读了
发表于 2010-7-23 23:17:29 | 显示全部楼层
神人
发表于 2010-7-23 23:34:56 | 显示全部楼层
mark
发表于 2010-7-24 10:15:13 | 显示全部楼层
楼主很厉害
发表于 2010-7-24 18:08:58 | 显示全部楼层
谢谢
发表于 2010-7-24 22:49:03 | 显示全部楼层
写的非常好,总结了很多内容。十分有帮助。
发表于 2010-7-24 22:56:23 | 显示全部楼层
我挑一个不是问题的问题,楼主在图2-2的六路桥中,下桥管子的顺序不太符合通常约定的顺序
发表于 2010-7-25 02:41:46 | 显示全部楼层
mark
发表于 2010-7-25 10:12:38 | 显示全部楼层
先顶贴  后下载~
楼主很用心啊!
发表于 2010-7-25 10:19:51 | 显示全部楼层
mark热心的人
发表于 2010-7-25 11:53:00 | 显示全部楼层
做个记号
 楼主| 发表于 2010-7-25 12:53:43 | 显示全部楼层
回复【48楼】showgu  
-----------------------------------------------------------------------

嗯,是不太符合通常从左到右的习惯,不过后面各管打开顺序的文字描述应该没错。谢谢指出!
发表于 2010-7-25 14:49:12 | 显示全部楼层
dddd
发表于 2010-7-27 13:26:29 | 显示全部楼层
太酷了!顶!
发表于 2010-7-27 13:30:29 | 显示全部楼层
学习
发表于 2010-7-27 14:18:59 | 显示全部楼层
mark!电调!楼主辛苦了@!谢谢!
发表于 2010-7-27 19:21:12 | 显示全部楼层
lz真是好人啊,像我这种新手最需要这种在详细的指点了,十分感谢!!
发表于 2010-7-28 02:57:27 | 显示全部楼层
非常感谢timegate 墨鸢无私的奉献!
发表于 2010-7-28 12:51:22 | 显示全部楼层
阿莫咋不给加酷?没有功劳也有苦劳啊!
发表于 2010-7-28 13:19:26 | 显示全部楼层
是的,强烈建议加酷,楼主辛苦整理,为了让更多人受益,也该加酷。而且做的非常不错。
发表于 2010-7-28 20:14:21 | 显示全部楼层
非常感谢楼主
发表于 2010-8-4 22:56:07 | 显示全部楼层
mark
发表于 2010-8-6 09:51:26 | 显示全部楼层
MARK  
刚刚开始准备  
做的这么用心  谢谢啊
发表于 2010-8-9 10:27:35 | 显示全部楼层
樓主做事用心, 深受感動, 有機會要向樓主請教.
发表于 2010-8-9 10:59:39 | 显示全部楼层
good
发表于 2010-8-9 13:24:38 | 显示全部楼层
l路过。踏破铁鞋无觅处得来全不费工夫,我要好好消化一下,在汇报一下读后感~
发表于 2010-8-9 13:44:05 | 显示全部楼层
ding
发表于 2010-8-9 14:17:51 | 显示全部楼层
弄这种东东很是费心血,顶一下支持楼主
发表于 2010-8-9 23:13:55 | 显示全部楼层
这个都没库?不可能把
发表于 2010-8-10 22:36:56 | 显示全部楼层
这个应该置酷
发表于 2010-8-11 00:57:33 | 显示全部楼层
mark
发表于 2010-8-13 20:07:33 | 显示全部楼层
樓主做事用心, 深受感動, 有機會要向樓主請教.
发表于 2010-8-17 17:03:33 | 显示全部楼层
你的下位机为什么运行吥了?能解释下吗
需要安装其他软件做支撑吗
发表于 2010-8-17 21:26:33 | 显示全部楼层
mark
 楼主| 发表于 2010-8-18 08:35:40 | 显示全部楼层
回复【74楼】tramp1986  
-----------------------------------------------------------------------

下位机程序只要烧入到MEGA32就可以运行啊,不需要安装其他软件。


上位机可能需要安装VB6.0,或手动安装MSCOMM通讯模块的OCX文件。
发表于 2010-8-18 14:57:13 | 显示全部楼层
学习了,楼主历害
发表于 2010-8-18 15:07:50 | 显示全部楼层
有几个问题请教:
1. 关于“消磁事件”(见你的PDF 63页,以AB->AC举例,你测试的波形应该是空载,如果带载B相的消磁时间会加长),这个应该跟驱动电流成正比。理论上的处理方法应该在换相后加 15(考虑突然负载变轻可以调整到 7.5) 度换向延时,再去判断。
2. 原理性东西,我直接用比较器在中点与每一相比较(调制不在100%),比较出来的怎么是脉冲信号。我一直以为要在PWM加电瞬间去判断,看了源码好像不用。
3. 挑一个小问题:第71页,函数MotorTon的2点短路特性,原文第334~346应改为334~376 !
 楼主| 发表于 2010-8-18 21:15:50 | 显示全部楼层
1. MK电调的代码是不延时直接换相的,是不是延时后效果更好我还需要进一步实验,目前还不知道。

2. 比较器的中位点是动态的,会随着PWM波形的上下而动态变化,所以不用专门在PWM信号的高电平期间才比较。

3. 谢谢指正,已经改正了,改日上传 :)
发表于 2010-8-18 22:19:20 | 显示全部楼层
楼主真厉害,每个行业如果有一个楼主这样的人,不仅仅技术实践理论能力强,而且有真正为人师表的大师级风范。那就太好了!!!
发表于 2010-8-18 23:32:09 | 显示全部楼层
good
发表于 2010-8-18 23:34:58 | 显示全部楼层
mark
发表于 2010-8-18 23:53:55 | 显示全部楼层
以后做能用到,谢谢!
发表于 2010-8-19 00:32:35 | 显示全部楼层
LZ,牛人!

拜读
发表于 2010-8-19 08:43:41 | 显示全部楼层
好帖子,正在研究四轴
发表于 2010-8-19 09:39:45 | 显示全部楼层
tks
发表于 2010-8-19 09:47:21 | 显示全部楼层
mark
发表于 2010-8-19 22:03:33 | 显示全部楼层
等拜读完LZ的大作后再和LZ一起交流!
发表于 2010-8-20 04:15:27 | 显示全部楼层
mark
发表于 2010-8-20 06:53:49 | 显示全部楼层
好东西 收了
发表于 2010-8-20 09:23:41 | 显示全部楼层
非常好的帖子
发表于 2010-8-21 11:28:34 | 显示全部楼层
回复【79楼】timegate 墨鸢
-----------------------------------------------------------------------
2. 比较器的中位点是动态的,会随着PWM波形的上下而动态变化,所以不用专门在PWM信号的高电平期间才比较。
-----------------------------------------------------------------------
关于你所说的这第二点,理解有偏颇,因为悬浮相电压不仅仅随pwm波动,还会因pwm关断的续流方式,电压也有有不同的体现,具体要根据pwm调制方式来分析(上PWM,下PWM,上下PWM,互补PWM)
发表于 2010-8-21 13:14:17 | 显示全部楼层
对LZ的景仰犹如滔滔江水连绵不绝又如黄河泛滥一发不可收拾
LZ好文。已经不是一般的cool可以标注。

有个问题,请教LZ。
-----------------------------------------------------------------------------------------------------------------
如果要进行毫秒极的延时,主要是利用uint SetDelay(uint t)和char CheckDelay(uint t)这两个函数来完成,分别在timer0.c的第44行和第49行。具体要怎么做呢,下面我们来看一个情景分析。假设我现在要延时100ms,就应该这么写:
unsigned int a;
a = SetDelay(100);
while (!CheckDelay(a));
当前的全局变量CountMillseconds有可能为任意值,我们就假设当前的CountMillseconds =12345好了。先调用SetDelay(100),返回12345+100-1到a中,a的值就为123444。然后再在while中反复调用CheckDelay(a),返回值为(12444- CountMillseconds) & 0x8000 >> 8,现在CountMillerseconds=12345,故返回值为0,继续在while里循环。当时间渐渐过去,CountMillseconds会渐渐变大,到过了100ms后,CountMillseconds的值会走到12445,由于无符号整形数减法的特性,(12444- CountMillseconds)会借位而产生一个非常大的数,然后这时候就会返回非零,退出while循环。而且由于无符号数加法的特性,即便在调用SetDelay时CountMillseconds已接近65535了也没有关系,读者可自行理解。第54行的void Delay_ms(unsigned int w)函数帮你把这三句话都集成到一个函数中了。
------------------------------------------------------------------------------------------------------------------
w 为 uint, 则最大可为65535。如CountMillerseconds=0,则t=0+65535-1=65534,根据(((t - CountMilliseconds) & 0x8000) >> 8);有(0b1111111111111110&0b1000000000000000)  >> 8 = 0x80,此时不等于0,根据 while (!CheckDelay(akt));于是延时结束。这样并不能实现延时65535ms。根据代码,有一个前提应是要求延时时间应小于或等于0x800000000方可。

以上为我个人理解,可能考虑不周有误,请LZ和各位网友多多指正。

如果以上理解正确,则在V0.41版本BL-CTRL中的main.c文件第140行的void Wait(uchar dauer)函数完成微秒级(原文处误拼成了”极“延时,不是挑刺,只是为了这样一篇好文章更完美)的延时时间输入参数也同理应为小于或等于8位char的一半,即128.

不知以上对否?

还有56页,第10行中间“若一切都每哟问题,则运行第102行”中“没有”拼成了“每哟”。没有其他意思,只是觉得文章写得太好了。不忍心看到一点瑕疵。
发表于 2010-8-21 16:42:50 | 显示全部楼层
收藏了,谢谢分享~~
发表于 2010-8-21 18:05:11 | 显示全部楼层
强帖,当然要顶起来!
发表于 2010-8-21 21:57:28 | 显示全部楼层
MARK!
发表于 2010-8-21 22:38:18 | 显示全部楼层
mark
 楼主| 发表于 2010-8-22 07:44:47 | 显示全部楼层
回复【92楼】lijieamd  
-----------------------------------------------------------------------

是,我觉得我的理解跟你的不矛盾。中点悬浮相确实随着PWM波形的上下变换和续流等情况不断在动态变化中,过零检测相的电压总是叠加在中点悬浮相之上的,所以不管中点电压如何变化,他们的差模电压应该是可以随时比较的,而分压电路又是这两相电压的忠实按比例再现,所以比较器应该是可以一直开着的。
发表于 2010-8-22 08:51:28 | 显示全部楼层
回复【楼主位】timegate 墨鸢
-----------------------------------------------------------------------
拜读
友情提示:标题不合格、重复发帖,将会被封锁ID。详情请参考:论坛通告:封锁ID、获得注册邀请码、恢复被封ID、投诉必读
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|阿莫电子论坛(原ourAVR/ourDEV) ( 粤ICP备09047143号 )

GMT+8, 2017-11-20 23:15

阿莫电子论坛, 原"中国电子开发网"

© 2004-2016 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表