5iMX宗旨:分享遥控模型兴趣爱好

5iMX.com 我爱模型 玩家论坛 ——专业遥控模型和无人机玩家论坛(玩模型就上我爱模型,创始于2003年)
楼主: yqxyqx
打印 上一主题 下一主题

自己DIY的无刷电机和控制器

[复制链接]
21
发表于 2006-4-14 20:38 | 只看该作者
真有能人啊,佩服佩服!!!

欢迎继续阅读楼主其他信息

主题

  • 没有相关信息
  • 没有相关信息
  • 没有相关信息
22
 楼主| 发表于 2006-4-15 02:45 | 只看该作者

程序来了

;定义各驱动端口
AXZ BIT P3.7   ;P3.7为A线圈接电源正极控制端
;按照本电路的接法,当P3.7为低电位时(P3.7=0),驱动A线圈的三极管TIP42导通,A线圈接到电源正极
;当P3.7为高电位时(P3.7=1),驱动A线圈的三极管TIP42截止
;
AXF BIT P1.0   ;P1.0为A线圈接电源负极极控制端
;当P1.0为低电位时(P1.0=0),驱动A线圈的三极管TIP41导通,A线圈接到电源负极
;
BXZ BIT P1.1   ;P1.1为B线圈接电源正极控制端
;当P1.1为低电位时(P1.1=0),驱动B线圈的三极管TIP42导通,B线圈接到电源正极
;
BXF BIT P1.6   ;P1.6为B线圈接电源负极控制端
;当P1.6为低电位时(P1.6=0),驱动B线圈的三极管TIP41导通,B线圈接到电源负极
;
CXZ BIT P1.5   ;P1.5为C线圈接电源正极控制端
;当P1.5为低电位时(P1.5=0),驱动C线圈的三极管TIP42导通,C线圈接到电源正极
;
CXF BIT P1.7   ;P1.7为C线圈接电源负极极控制端
;当P1.7为低电位时(P1.7=0),驱动C线圈的三极管TIP41导通,C线圈接到电源负极
;
;定义各探测端口
ADUAN BIT P1.2   ;P1.2为A线圈感应电动势检测端
BDUAN BIT P1.3   ;P1.3为B线圈感应电动势检测端
CDUAN BIT P1.4   ;P1.4为C线圈感应电动势检测端
;定义各按键端口
ZZHUAN BIT P3.5  ;P3.5为正转控制端口
FZHUAN BIT P3.4  ;P3.4为反转控制端口
STOP BIT P3.3    ;P3.3为停转控制端口
;以上端口可以根据实际情况自行设置
;********
;
ORG 0
JMP START
;
ORG 0BH
JMP SUBTIMER0
;********
;初始化程序
START:
MOV SP,#65H
MOV TMOD,#1
MOV IE,#10000010B
MOV P1,#0FFH
MOV P3,#0FFH
MOV R6,#0
MOV R7,#0
;********
;按键检测程序
KONGZHI:
SETB AXZ
SETB AXF
SETB BXZ
SETB BXF
SETB CXZ
SETB CXF
;以上指令作用是将各驱动端口拉到高电位,即不驱动各推动管,让所有线圈断电
JNB ZZHUAN,ZZHUAN0  ;如果“正转”按钮被按下,则跳至正转部分程序
JNB FZHUAN,FZQD00   ;如果“反转”按钮被按下,则跳至反转部分程序
JMP KONGZHI         ;如果上述按钮未按下,则返回并重新检测
;********
;下面两条指令起跳板作用。
;JNB指令的跳转范围是前、后128个地址,
;如果超过这个范围,可以先跳到一个较近的地址,
;再由这个地址跳到最终的目的地址。
FZQD00:
JMP FZHUAN0
;********
;正转程序
;正转程序的第一相序
ZZHUAN0:
SETB CXZ
SETB AXF
;以上两条指令的作用是让上一相序的通电的线圈断电
CLR TR0    ;取消上一相序中还未产生的定时中断。为什么用到定时器中断呢?下面再解释
JNB STOP,KONGZHI   ;如果“停止”按钮被按下,则返回按键检测程序,电机停止转动
CLR AXZ    ;将A线圈接到电源的正极
CLR BXF    ;将B线圈接到电源的负极
;给A、B线圈通电,电流方向:从A流到B。到这里本相序才真正开始
MOV TL0,R6  ;将R6寄存器的数值传给TL0寄存器
MOV TH0,R7  ;将R7寄存器的数值传给TH0寄存器
;上面两条指令实际上决定了产生定时中断的时间长短
SETB TR0    ;启动定时器0中断
;采用定时中断的主要目的是为了以后进行调速作准备
;假如再检测到换相之前就让原来的线圈断电,那么电机的转速就要比换相前线圈一直通电要慢。
;而且通电时间越短,转速就越慢。
;因此,适当改变线圈在换相前通电时间的长短,就可以改变电机的转速,这就是无刷调速的原理。
;在定时中断子程序中,关闭了所有的驱动,也就是给所有的线圈都断了电。
;这样,我们只要适当改变R6、R7的数值就可以改变这一相序中线圈在达到换相位置前通电时间的长短,从而达到调速的目的。
;如果想让电机达到最大转速,只要让线圈在换相前一直通电就行了,
;即定时中断的时间大于线圈从通电到换相所需时间就行了。
;比如说我们可以把定时中断的时间设为定时器的最长定时时间,即R6=0,R7=0。
;在本程序开始时,就把R6和R7设为0,后面一直没有改变,因此电机转动稳定后就是最高转速。
;另外,在电机启动时,由于转速很低,也应该把R6和R7设为0。
;如果在换相后,还没产生定时中断,应该取消定时中断,以免对电机正常转动产生影响,
;因此,在每一相序开始时,都应该取消上一相序中还未产生的定时中断。
CALL DELAY   ;调用延时子程序
;DELAY是一个时间很短的延时子程序。
;为什么要延时呢?
;因为线圈在刚通电时,电流从无到有,变化非常大,
;这样会在不通电的线圈,也就是检测感应电动势过零信号用于换相控制的线圈,产生较强的感应电动势,
;这样就会产生错误的换相信号,使电机停传。
;前面的第4、5条指令刚给线圈通电,虽然隔了3条指令,但时间还是太短,
;因此要延时一段时间才能进入下面的检测换相信号的指令。
;但延时的时间也不能太长,不能都过了换相位置了延时还没完,
;因此延时时间比较短。
;
;从以下位置一直到正转程序的第二相序前的几条指令是检测换相信号用的。
;利用感应电动势检测无刷电机换相位置原理:
;举例来说,例如:当A线圈和B线圈通电时,最多能让转子转到一个特定位置,
;在这个位置有一个特点:C线圈中的感应电动势为0,
;转过这个位置后,C线圈中感应电动势跟没转过之前相反。
;如果我们检测到C线圈中的感应电动势方向发生变化,就说明应该换相了。
;利用电压比较器我们可以检测出线圈感应电动势的正或负。
;按照本电路的接法,当线圈中感应电动势为正时输出高电平,感应电动势为负时输出低电平。
;如果比较器输出原来是高电平,那么当它变为低电平时,就应该换相了;
;或者比较器输出原来是低电平,那么当它变为高电平时,就应该换相了。
JB CDUAN,ZZHUAN02   ;如果C线圈的感应电动势为正,则跳转至ZZHUAN02等待感应电动势变为负
ZZHUAN01:
JB CDUAN,ZZHUAN1    ;否则等待C线圈感应电动势变为正就跳到下一相序。
JMP ZZHUAN01        ;感应电动势没有变为正,则跳回上一条指令,继续检测。
ZZHUAN02:
JNB CDUAN,ZZHUAN1   ;等待C线圈感应电动势变为负就跳到下一相序。
JMP ZZHUAN02        ;感应电动势没有变为负,则跳回上一条指令,继续检测。
;第二、第三相序的原理跟第一相序原理相同,只是通电线圈不同而已,这里就不做解释了。
;正转程序的第二相序
ZZHUAN1:
SETB AXZ
SETB BXF
CLR TR0
JNB STOP,KONGZHI
CLR BXZ
CLR CXF
MOV TL0,R6
MOV TH0,R7
SETB TR0
CALL DELAY
JB ADUAN,ZZHUAN12
ZZHUAN11:
JB ADUAN,ZZHUAN2
JMP ZZHUAN11
ZZHUAN12:
JNB ADUAN,ZZHUAN2
JMP ZZHUAN12
;正转程序的第三相序
ZZHUAN2:
SETB BXZ
SETB CXF
JNB STOP,JMPKONGZHI
CLR TR0
CLR CXZ
CLR AXF
MOV TL0,R6
MOV TH0,R7
SETB TR0
CALL DELAY
JB BDUAN,ZZHUAN22
ZZHUAN21:
JB BDUAN,ZZHUANEND
JMP ZZHUAN21
ZZHUAN22:
JNB BDUAN,ZZHUANEND
JMP ZZHUAN22
ZZHUANEND:
JMP ZZHUAN0
;正转程序结束
;********
;下面两条指令也是起跳板作用
JMPKONGZHI:
JMP KONGZHI
;********
;延时子程序
DELAY:
MOV R2,#100
DJNZ R2,$
RET
;********
;反转程序
;反转的原理跟正转的相似,只是相序不同而已,这里也不详细介绍了。
;反转程序的第一相序
FZHUAN0:
SETB BXZ
SETB AXF
CLR TR0
JNB STOP,JMPKONGZHI
CLR AXZ
CLR CXF
MOV TL0,R6
MOV TH0,R7
SETB TR0
FZHUAN00:
CALL DELAY
JB BDUAN,FZHUAN02
FZHUAN01:
JB BDUAN,FZHUAN1
JMP FZHUAN01
FZHUAN02:
JNB BDUAN,FZHUAN1
JMP FZHUAN02
;反转程序的第二相序
FZHUAN1:
SETB AXZ
SETB CXF
CLR TR0
JNB STOP,JMPKONGZHI
CLR CXZ
CLR BXF
MOV TL0,R6
MOV TH0,R7
SETB TR0
CALL DELAY
JB ADUAN,FZHUAN12
FZHUAN11:
JB ADUAN,FZHUAN2
JMP FZHUAN11
FZHUAN12:
JNB ADUAN,FZHUAN2
JMP FZHUAN12
;反转程序的第三相序
FZHUAN2:
SETB CXZ
SETB BXF
CLR TR0
JNB STOP,JMPKONGZHI1
CLR BXZ
CLR AXF
MOV TL0,R6
MOV TH0,R7
SETB TR0
CALL DELAY
JB CDUAN,FZHUAN22
FZHUAN21:
JB CDUAN,FZHUAN0
JMP FZHUAN21
FZHUAN22:
JNB CDUAN,FZHUAN0
JMP FZHUAN22
;********
;
JMPKONGZHI1:
JMP KONGZHI
;********
;定时器中断子程序
SUBTIMER0:
CLR TR0   ;取消定时中断
SETB AXZ
SETB AXF
SETB BXZ
SETB BXF
SETB CXZ
SETB CXF
;上面6条指令的作用是给所有线圈断电
MOV R2,#100
DJNZ R2,$
;上面2条指令起延时作用,
;线圈断电时,同样也会在别的线圈中产生感应电动势,
;所以也要延时再返回。
RETI
;
END
23
 楼主| 发表于 2006-4-15 02:51 | 只看该作者
好辛苦啊,搞到半夜三更才整理完!!!好不容易到了双休日,却不得上网、玩游戏!!@@:em25::em25:
版主是不是考虑一下加精啊。:em15::em15:

[ 本帖最后由 yqxyqx 于 2006-4-15 03:27 编辑 ]

评分

参与人数 1威望 +20 收起 理由
dondon7758521 + 20

查看全部评分

24
 楼主| 发表于 2006-4-15 03:25 | 只看该作者
程序是汇编语言的,加了比较详细的注释。
    为了加这些注释,可把我累坏了,如果能对大家有所帮助的话,那也就值了。
    大家把程序复制下来,粘贴到Keil uVision2里的ASM文件里,再编译就可以形成HEX文件烧录单片机了。
    大家看一下还有什么需要改进的地方,欢迎多提意见,大家共同学习共同进步!
    现在最主要的问题是:
    其实感应电动势过零位置并不是最佳换相位置,因为此时原来通电的线圈对转子磁极的合推力为零,而将要通电的线圈对转子磁极的合推力已经变得比较小,这样一来,电机转动时的扭矩较小。
    如果能将换相的位置提前一些的话,效果就好很多了,原来通电的线圈对转子磁极的合推力还没减少到零,而将要通电的线圈对转子磁极的合推力也比较大,这样电机转动得就更稳定,扭矩也更大。
    如果改用霍尔元件来检测,效果就好得多,霍尔元件检测出来的就是最佳的换相位置。
    比如说,我用普通有刷电机改装的无刷,原来就是用霍尔元件检测换相位置的,在同样的电池,同样的驱动电路的条件下,空载电流只有500多mA,而改用感应电动势过零检测后,空载电流高达接近1A,而转速、扭矩反而小了一些。
    我不知道如何得到最佳的换相位置。
25
 楼主| 发表于 2006-4-15 03:33 | 只看该作者
夜已深,不说什么了,睡觉去!忙了大半天,累死了!!!!
26
发表于 2006-4-15 10:48 | 只看该作者
PIC单片机没有AVR快
虽然都是8位精简指令的
但是AVR的性能要比PIC好的多
ATMEL公司就是照着PIC做的AVR所以
推荐用AVR
尤其是MAGA8
内部集成运算放大器
不用外接339
27
发表于 2006-4-15 11:47 | 只看该作者
辛苦辛苦,佩服佩服!!
对于提前角你可以根据反馈的转速和无刷电机转子和磁极数试着编写以下啊,比如根据现在的转速决定下次换向提前五度看看效果,实验出最佳提前角,不过这是对特定无刷电机的最佳位置。:)
28
发表于 2006-4-15 13:31 | 只看该作者
不远千里赶来拜一下楼主
29
发表于 2006-4-15 18:46 | 只看该作者
楼主厉害,辛苦了,顶起!
30
发表于 2006-4-15 20:34 | 只看该作者

小弟我佩服得五体投地

:em26::em26::em26::em26::em26:
31
 楼主| 发表于 2006-4-15 20:43 | 只看该作者
原帖由 tony7078 于 2006-4-15 10:48 发表
PIC单片机没有AVR快
虽然都是8位精简指令的
但是AVR的性能要比PIC好的多
ATMEL公司就是照着PIC做的AVR所以
推荐用AVR
尤其是MAGA8
内部集成运算放大器
不用外接339

PIC单片机????
89C2051用的是51系列的单片机。
我也知道MAGA8好,但我手头上没有空闲的啊!
我们这里电子元件的价格特别高,特别是AVR的单片机,我去年买了3片MAGA8-8PI,每片18元,一片MAGA48-20PI,用了15元,比广东贵了一倍啊。
再说了,我弄无刷电调不是为了商业目的,完全是兴趣和爱好而已,主要想弄清除原理,弄清原理就行了,并不一定要用上(当然能用上最好)。
现在实验尚处于实验阶段,弄清除原理后再换好的单片机也不迟。
32
发表于 2006-4-15 22:00 | 只看该作者
用示波器检查6个输出控制端的波形时序,是否正确?
33
发表于 2006-4-15 22:44 | 只看该作者
检测感应电动势过零信号在低转速时准确吗?
34
 楼主| 发表于 2006-4-15 23:25 | 只看该作者
原帖由 ouxg55 于 2006-4-15 22:00 发表
用示波器检查6个输出控制端的波形时序,是否正确?


正确
35
发表于 2006-4-15 23:26 | 只看该作者
楼主能不能直接把单片机的程序文件传上来啊!?
36
发表于 2006-4-15 23:48 | 只看该作者
做实验而已,把原理搞通了再换呗,MEGA8我这里8块,贴片的,PLCC44的52还在10块呐,光冲着MEGA8带个AD啥都不说了:em15:
楼主不要把这张好帖沉啊:em26:

[ 本帖最后由 parkming 于 2006-4-15 23:50 编辑 ]
37
 楼主| 发表于 2006-4-16 00:01 | 只看该作者
原帖由 alkkk 于 2006-4-15 22:44 发表
检测感应电动势过零信号在低转速时准确吗?


理论上是准确的,关键在与电压比较器是否能准确地比较信号。
低转速下感应电动势较低,但LM339的开环增益较大,当同相输入和反相输入间的电压差达到0.03V是,比较器的输出端就能进入饱和导通或完全截止状态,因而检测结果还是准确的。
在我的程序里并没有专门的启动程序,电机仍然能够比较顺利启动。有时电机停机时刚好在第一相序的平衡位置,通电时,转子自能在原地振动一下,检测电路都能检测到过零信号。
38
 楼主| 发表于 2006-4-16 00:04 | 只看该作者
原帖由 弄个灯笼 于 2006-4-15 23:26 发表
楼主能不能直接把单片机的程序文件传上来啊!?


我不知道怎么把文件传上来!:em17:
39
发表于 2006-4-16 00:12 | 只看该作者
大家不要再讨论用什么芯片了,无刷电调的关键是驱动程序,其他方面的问题我们都好解决.其中检测感应电动势的过零和电流的换向关系,更是关键中的关键,将影响电机的转矩,功率,效率等性能.希望大家多给些建设性意见.当实验成熟后,楼主将心得和更完善的源程序公布出来,对各位模友今后开发也有帮助啊.到时无刷就要大降价了.
40
 楼主| 发表于 2006-4-16 00:21 | 只看该作者
今天测了一下电机的转速:电源电压4.9V,三极管压降共0.7V,电机空载时转速大约:8000转/分,电流大约1A。
换用买来的50元的无刷电调,把转速调到8000转/分,电流也是大约1A。
说明其实这种电调实际上也没有考虑到提前角问题,或者考虑了但没有多大的效果。
其实我们如果是个人制作,要求不高的话,完全可以不用考虑这个问题,成本低就行。
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

关闭

【站内推荐】上一条 /1 下一条

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