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

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

问问大家是否愿意我公开无刷电调程序

[复制链接]
跳转到指定楼层
楼主
发表于 2008-7-8 20:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
以前我发了一个电调启动的视频,可是有一位"高手"说我在炫耀
这次我先征求一下,大家是否愿意我公开这些资料
两个目的:
1帮助其它想知道怎么DIY电调的朋友
2.得到真正的高手的指点
如果大家认为我在炫耀,不受欢迎,那我就不发资料了

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

头像被屏蔽
沙发
发表于 2008-7-8 20:51 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
3
发表于 2008-7-8 20:58 | 只看该作者
最好把好盈的程序公布出来
4
发表于 2008-7-8 21:04 | 只看该作者
好事呀,公布吧!学习!
5
发表于 2008-7-8 21:16 | 只看该作者
公开出来吧~
6
发表于 2008-7-8 21:22 | 只看该作者
这是好事,当然要公布,那些说闲话的人就当他放屁
7
发表于 2008-7-8 21:28 | 只看该作者
这么好的事,怎么会有人反对?一定是厂家的人吧?
8
发表于 2008-7-8 21:36 | 只看该作者
你很烧包啊!要公布就公布啊!着东西不是所有人都懂,说出来学习下可以的!要是拿来骗分就不对了~

       老婆说买酱油不可以太久~拜拜!
9
 楼主| 发表于 2008-7-8 21:47 | 只看该作者

回复 #8 guguaigu 的帖子

我正在传,别骂我呀!


[ 本帖最后由 ququbin 于 2008-7-8 23:01 编辑 ]
10
 楼主| 发表于 2008-7-8 21:59 | 只看该作者
下面是程序,我认为没多大用,可要是不发,好害怕会被大家骂
我先发了
以后慢慢给大家分段解释
11
 楼主| 发表于 2008-7-8 22:06 | 只看该作者
.include"m8def.inc"
.dseg
.org 0x0a0
;换相时间为tf,过零时间tg
zkb:.byte 1    ;占空比
tf1h:.byte 1  ;换相时间1
tf1l:.byte 1
tf2h:.byte 1   ;换相时间2
tf2l:.byte 1
;--------
tfch:.byte 1   ;t1的初值6d,6e
tfcl:.byte 1
t0a:.byte 1
t0b:.byte 1
t0bz:.byte 1
;---------------
t0_ch:.byte 1   ;t0初值
t0_fp:.byte 1   ;t0预分频模式
ys_h:.byte 1    ;延时与记数值
ys_l:.byte 1
js_h:.byte 1
;--------
.org 0x0af
js_l:.byte 1
bzq00:.byte 1
tf3h:.byte 1   
tf3l:.byte 1
jwch:.byte 1
jwcl:.byte 1
jwc01h:.byte 1
jwc01l:.byte 1
;03版;03版
;-------------
;03版
wch:.byte 1
;--------
wcl:.byte 1
wc01h:.byte 1
wc01l:.byte 1
wc001h:.byte 1
wc001l:.byte 1
;--------
jih:.byte 1  
jil:.byte 1
tfc0h:.byte 1
tfc0l:.byte 1
tfcyh:.byte 1
;--------
tfcyl:.byte 1
tfcmh:.byte 1
tfcml:.byte 1
tfcsh:.byte 1
tfcsl:.byte 1
;--------
jsji:.byte 1
jsja:.byte 1
jstz:.byte 1
jsjs:.byte 1
eeah:.byte 1
;----------
eeal:.byte 1
ckz_0h:.byte 1     
ckz_0l:.byte 1      ;占空比低8位
.org 0x0d0
;****************
a001:.byte 1
b001:.byte 1
c001:.byte 1
d001:.byte 1
kongz:.byte 1
zkb01:.byte 1     ;过零前,pinc值
.org 0x60
stack:.byte 0x9f
.cseg
rjmp start  ;----------跳到START段
;输入捕捉中断入口
.org 0x005
.org 0x06
;比较a
rjmp guanb
.org 0x07
;比较匹配b
rjmp dakai
;t1溢出中断入口
.org 0x008
rjmp qzfx
.org 0x09
;T0溢出中断入口
rjmp tdian;-------
.org 0x0b
rjmp tace01
;dyd为启动段
dyd:
sbr r25,0b01000000    ;启动标志,6
sbr r25,0b10000000      ;屏蔽USART,7
ldi r16,0x20
sts zkb,r16
;锁定
suodin:
;允许T1溢出中断和输入捕捉中断,T0溢出 ,ocie2使能
out ocr2,r16
ldi r16,0b01110001;;设置t2,相位修正模式8分频启动t2,,----0输出,1截止       ;11
out tccr2,r16      
sbi portc,2
sbi portb,2    ;ca
rcall dey02
rcall dey03
;*****************
cbi portb,2
sbi portb,5       ;cb
rcall dey03
;*******************
clr r16      ;-t1装入初值
ldi r17,0x02
sts tfch,r17
sts tfcl,r16
rcall gen
rjmp main
gen:            ;8   更新t1初值
lds r16,tfcl    ;2
lds r17,tfch
out tcnt1h,r17  ;1
out tcnt1l,r16
ldi r16,0b10000001    ;1
out tccr1b,r16  ;T1启动
ldi r16,0b00000001    ;为delay传送工作模式和初值
sts t0_fp,r16
ldi r16,0xc0
sts t0_ch,r16
ret             ;4
;通电----------t0中断服务程序
tdian:
;*************
clr r16                  ;1
out tccr0,r16           ;1
;================
lds r16,zkb               ;更新ZKB ;1
;===================
out ocr2,r16                          ;1
ldi r16,0b01110001;;设置t2,相位修正模式8分频启动t2,,----0输出,1截止       ;1
out tccr2,r16                 ;1
rcall soucai
rcall tace02
rcall jsd01
jup01:
sei
reti
;主程序-----------------
start:
ldi r16,0b00100101
out timsk,r16
sei
ldi r16,0xdf
out spl, r16     ;堆栈指针
rcall dey03
rcall dey03
;pb定义
ldi r16,0b00111110
out ddrb,r16
sbi ddrc,1
sbi ddrc,2
rcall gdk    ;关闭复位后,端口输出高电,功率管关闭
clr r25
;-----------------
;赋初值
dyd01:
ldi r22,0x02             ;步进
ldi r23,0x02
ldi r24,0x02
ldi r30,0x80   
ser r16
sts tf3h,r16
;--------------------
ldi r16,0b00111000         ;过零端口上拉
out portc,r16
ldi r16,0b11111110            ;探测端口上拉置位
out portd,r16
out pind,r16
sbi portb,0
clr r16
sts zkb,r16          ;-----占空比
sts zkb01,r16
clr r17
sts kongz,r17
;----看门狗
out wdtcr,r17
;====================
usart:          ;usart设置
cli
; 设置波特率;异步,U2X=0,fosc=8m,urr=1,误差=0.0% ,
ldi r16,0x01
clr r17
out ubrrh,r17
out ubrrl,r16         
; tx使能,9 个数据位
; 设置帧格式: 9 个数据位, 1 个停止位,偶校验
ldi r16, (1<<URSEL)|(1<<upm1)|(3<<UCSZ0)
out UCSRC,r16
sei
tace:
rcall tace02
ldi r16,0xdf
out spl, r16
rjmp tace
main:            ;在此等待
sei
ldi r16,0xdf
out spl, r16     ;重设置堆栈指针,防止溢出
rjmp main
;换相子程序,闭环和开环均需在此进入换相
;断电--关端口(pb124567)--调用子程序换相
fxd:
ldi r16,0xdf
out spl, r16     ;重设置堆栈指针,防止溢出
clr r16
out tccr2,r16   ;关t2      
ldi r16,0b00001000    ;pb各端口赋值,关断各相
out portb,r16
cbi portc,1
cbi portc,2
rcall delay
ldi r31,0x0
ijmp
;换相指令段------------
.org 0x0080
zt01:
sbi portb,1
sbi portb,5   ;2
ldi r30,0x86 ;1
rcall gen
ldi r26,0b00001000     ;3c
rjmp main          ;         ab
zt02:
sbi portb,1          ; ac
sbi portc,1
ldi r30,0x8c
rcall gen
ldi r26,0b00010000    ;4b
rjmp main
zt03:
sbi portb,4          ;bc
sbi portc,1
ldi r30,0x92
rcall gen
ldi r26,0b00100000     ;5a
rjmp main
zt04:
sbi portb,4            ;ba
sbi portb,2
ldi r30,0x98
rcall gen
ldi r26,0b00001000   ;3c
rjmp main
zt05:
sbi portc,2
sbi portb,2
ldi r30,0x9e               ;ca
rcall gen
ldi r26,0b00010000    ;4b
rjmp main
zt06:
sbi portc,2
sbi portb,5
ldi r30,0x80
rcall gen               ;cb
ldi r26,0b00100000   ;5a
rjmp main
;***********
qzfx:
tst r24
brne ysh00
sbr r25,0b00100000 ;标志,5
wdr
ldi r16,(1<<wdce)|(1<<wde)|(1<<wdp2)|(1<<wdp0)
out wdtcr,r16
rjmp fxd
ysh00:
ldi r16,0x30
sts zkb,r16
dec r22
breq ysh
reti
ysh:
mov r22,r24 ;恢复r22的值(无变化
dec r23
breq ysh01         
rjmp fxd
ysh01:
dec r24
mov r23,r24
rjmp fxd
;USART接收**********************
tace01:
in r18,ucsra
in r17,ucsrb
in r16,udr
cbi  ucsrb,rxen
andi r18,(1<<fe)|(1<<dor)|(1<<pe)
breq tace00
reti
tace00:
sbrc r17,1
rjmp tace03
sts kongz,r16
reti
tace03:
mov r17,r16              ;判断01为ZKB
cbr r17,0b00000010
sbr r17,0b00000001
cpse r17,r16
reti
cbr r16,0b00000011      ;6位精度
sts zkb01,r16
reti
genf:
lds r16,zkb01       ;待机状态,直接刷新ZKB
cpi r16,0x20
brsh genf02
sts zkb,r16
ret
genf02:
rjmp qidd
genf01:
sbrs r25,6       ;已经启动则跳过
ret  
sbrc r25,7      ;在启动阶段,此位=1   USART被屏蔽
ret  
;**************************         
lds r16,zkb
lds r17,zkb01
lds r18,kongz
clc
cpi r17,0x0a
brlo genf011
cp r16,r17
brsh genf001
rcall jisd                ;加占空比
ret
genf011:
rjmp wdog
genf001:
rcall jand               ;减占空比  
ret
tace02:
cli
sbrs r25,6             ;6位为0待机
rcall genf
rcall genf01
ldi r16,(1<<rxcie)|(1<<rxen)|(1<<ucsz2)
out ucsrb,r16
;对KONGZ解码
lds r16,kongz
clr r17
sts kongz,r17
ldi r17,0b10110101
cpse r16,r17
rjmp kzi
rjmp qidd
kzi:
ldi r17,0b01011101        ;REST
cpse r16,r17
rjmp kzi01
rjmp wdog
kzi01:
sei
ret
qidd:
sbrc r25,6
ret            ;屏蔽启动键
sbi pind,7      ;跳赋值和定时器启动段dyd
rjmp dyd
jisd:
;加占空比
lds r16,tf3h                  ;限速<0xea
cpi r16,0x0a
brsh jisd00
ret
jisd00:
sbi pind,2
lds r28,zkb
cpi r28,0xe0   ;占空比超过00xf0,则跳
brsh retd
lds r16,ckz_0l
ldi r17,0x04
clc
add r16,r17
sts ckz_0l,r16
brcc retd      ;无进位,返回
inc r28     ;高位加1
sts zkb,r28
rjmp retd
jand:
sbi pind,1
;减占空比
lds r16,tf3h
cpi r16,0xf0          ;限速  >0x30
brlo jand00
sbrc r25,0
ret
jand00:
lds r28,zkb
cpi r28,0x0b
brsh jand01             ;小于,RSET
rjmp wdog
jand01:
lds r16,ckz_0l
ldi r17,0x04
clc
sub r16,r17
sts ckz_0l,r16
brcc retd           ;无进位,返回
dec r28      ;高位减1
sts zkb,r28
retd:
ret
;加速模块,步进加速; 加TFCH(每次加4),tfc为t1初值,控制换相时间
;***************************************
t1_zj:
clc
lds r27,tfch
neg r27         ;取反,速度增加,负载增加,加速度变小
mov r16,r27
lsr r16
lsr r16
lsr r16
lsr r16
lsr r16
lds r17,tfch
add r17,r16
sts tfch,r17
mov r16,r27
cbr r16,0b11100000
;=======================
jus00:
clc
lds r17,tfch
lds r28,tfcl
add r16,r28
sts tfcl,r16
brcc jup
inc r17
sts tfch,r17
jup:
lsr r17
lsr r17
lsr r17
lsr r17
ldi r16,0x30
add r16,r17
sts zkb,r16
sts zkb01,r16
ret
;**********************************************************
;t0延时子程序-------------
delay:
lds r16,t0_ch  
out tcnt0,r16
lds r16,t0_fp  ;T0预分频8
out tccr0,r16
sei
ret
;==================
12
 楼主| 发表于 2008-7-8 22:07 | 只看该作者
jsd01:
cli
sbrs r25,5
ret
;**************
sbrc r25,4         ;判断标志-------闭环状态标志
rjmp jianc01      ;直接进入检测窗口设定模块
;加速模块
lds r16,tfch
cpi r16,0x01  
brlo tban00          ;速度低于0x30则跳过
cpi r16,0xf0        ;0xe0,加速结束
brsh tban01
;***********************
rcall t1_zj         ;0X30以上,开始加速
;=================
sbrc r25,0
rjmp jianc00
tban00:
rjmp hhui01
tban01:
rjmp start
;******************************
;检测窗口设定tfcyh/tfcyl(a匹配)---------tfcmh/tfcml(b匹配)
jianc00:  ;首次采集过零                       
lds r16,tfch
lds r17,tfcl
clc
neg r17
neg r16
mov r20,r16
mov r21,r17
clc
ror r16
ror r17
clc
ror r16
ror r17
clc
ror r16
ror r17                 ;1/8--7.5
lds r18,tfch
lds r19,tfcl
clc
add r19,r17
adc r18,r16
sts tfcmh,r18
sts tfcml,r19
;===================
clc
neg r17
neg r16
sts tfcyh,r16
sts tfcyl,r17
jianc01:
lds r16,tfcmh
lds r17,tfcml
out ocr1bh,r16
out ocr1bl,r17        ;t0b在前 15度 7.5
lds r16,tfcyh
lds r17,tfcyl
out ocr1ah,r16
out ocr1al,r17           ;t0a在后45度
;*************************
ldi r16,0b00111101
out timsk,r16
hhui01:
sei
ret
;过零检测模块
dakai:
;关USART
cbi  ucsrb,rxen
cbi ucsrb,rxcie
;抗干扰
kgr:
clr r16
clr r17
clr r18
kgr00:
in r20,pinc
and r20,r26         ;相应的位与1与运算,屏蔽
breq kgr01
inc r16
cpi r16,0x06
brsh dak00
rjmp kgr00
kgr01:
inc r17
cpi r17,0x06
brsh dak00
rjmp kgr00
;==================多数表决
dak00:       ;6
in r21,pinc          ;1
and r21,r26  ;1
cpse r20,r21         ;1/2/3
rjmp huanh01          ;2
rjmp dak00         ;2
;======================
huanh01:    ;0x44     大约40个指令周期   补偿18*10  =0xbe
;记数       4
inc r18    ;1
cpi r18,0x0a  ;1
brsh dak01     ;1/2
rjmp dak00     ;2
dak01:
wdr
cbr r25,0b10000000      ;解除USART的屏蔽
in r17,tcnt1l                     ;1
in r16,tcnt1h
clc
subi r17,0xbe        
sbci r16,0x0                       ;补偿
;*******************
sts tf3h,r16                    ;2
sts tf3l,r17                     ;2
mov r20,r16                 ;1
mov r21,r17
lds r18,tfch               ;2  取初值
lds r19,tfcl              ;2
clc
sub r17,r19               ;1
sbc r16,r18                ;得到周期
clc
ror r16                  ;1/2+0x10+0x44
ror r17                  ;半周期
clc
ldi r18,0x55            
add r17,r18
brcc huanh02      ;有无进位
inc r16
huanh02:
clc
sub r21,r17
sbc r20,r16
sts tfcmh,r16           ;tfcmh在前
sts tfcml,r17
;==============
in r19,tcnt1l
in r18,tcnt1h
clc
add r19,r17
adc r18,r16   
sts tfcyh,r18
sts tfcyl,r19
;============
clr r16
sts tfch,r16
sts tfcl,r17
sbr r25,0b00010000      ;标记(检测窗设定标志) 4
rjmp fxd
;**********************
eepg:      ;eeprom变址
cli
lds r16,eeah
lds r17,eeal
clz
cpi r16,0x01
breq xgai01
clz
inc r17
brne cru
rjmp xgai
xgai01:
inc r17
cpi r17,0xf0
brlo cru
xgai:
clc
inc r16
cpi r16,0x02
brlo cru
ldi r16,0x0
cru:
sts eeah,r16
sts eeal,r17
sei
ret
;  ;延时模块******************
dey00:
ldi r16,0xff
push r22
dey01:
ldi r22,0xff        ;锁定延时
rcall dey
dec r16
brne dey01
pop r22
ret
dey:    ;4
dec r22         ;1
brne dey       ;1/2
ret           ;1
dey02:
rcall dey00
rcall dey00
rcall dey00
rcall dey00
rcall dey00
rcall dey00
ret
dey03:
rcall dey02
rcall dey02
rcall dey02
ret
;***********
guanb:
guanb00:
rjmp main
eepromw:
cli
lds r19,eeah        ;2
lds r18,eeal     ;2
out eearh,r19      ;1
out eearl,r18  ;1
lds r20,zkb
out eedr,r20;1
clr r20
sbi eecr,eemwe     ;1
sbi eecr,eewe   ;1
sei
ret
;----------
soucai:
sbrc r25,0          ; 判断标志寄存器R25;--------,有标志,返回
ret
lds r16,tfch
cpi r16,0xca
brsh soucai00
ret
;************
soucai00:
sbr r25,0b00000001            ;直接返回了,子程序多余    ,0
ret
wdog:
cli
;===============
clr r16
out tccr2,r16   ;关t2      
ldi r16,0b00001000    ;pb各端口赋值,关断各相
out portb,r16
cbi portc,1
cbi portc,2
;==================
wdog00:
ldi r16,(1<<wdce)|(1<<wde)|(3<<wdp1)
out wdtcr,r16
rjmp wdog00
usart_flush:
sbis ucsrb,rxc
reti
in r16,udr
rjmp usart_flush
gdk:
ldi r16,0b00001000   ;关闭复位后,端口输出高电,功率管关闭
out portb,r16
cbi portc,1
cbi portc,2
ret
13
发表于 2008-7-8 22:09 | 只看该作者
有点深度!慢慢学习,先谢谢!
14
 楼主| 发表于 2008-7-8 23:04 | 只看该作者
启动的视频
第1,2次成功启动,第3次失败,第4次是自动重启成功
15
 楼主| 发表于 2008-7-9 00:14 | 只看该作者
先说启动
启动是整个电调最难的地方
尽管其它的方面(比如MOS管驱动电路,比较器电路)我也做的不好,但我认为并不是很难
我参考的资料是"dsPIC30F 在无传感器BLDC 控制中的应用",各位可以用搜索引擎去找来看
我把启动分两步
第1是锁定,
转子的位置是不确定的,而第1次通电的相是确定的,在进行首次通电前,要让转子到达某个位子
而这个位子的下一个位子就是第一次通电的位置
具体说明:
通电顺序:AB--AC--BC--BA--CA--CB--AB
第1次通电AB
那么AB的上一次是CB,再上一次是CA
于是,让CA通电0.5秒,再让CB通电0.5秒,那么转子这时的位置的下一位置是AB
这个位置的锁定很关键
影响锁定的参数有电流IS,时间TS
设负载不变,当电流IS过大,转子到达位置后有振荡,阻尼不同,电流不同,从振荡到稳定的时间就不一样
具体的值我是靠估计加实验
规律是这样:
惯性越大,通电电流越大,通电时间越短(因为阻尼大,容易稳定)
惯性小,用小的电流,通电时间长
2408电机,KV1300,锂电池11.1V,桨1047
锁定电流大约2A--4A(我没有设备,测不了),在这个范围都行,也许这个范围还能更大
锁定时间大约0.5--1秒,这个时间应该可以更短,用示波器可以看到稳定的时间,可惜我没有这东东
第2步是步进加速,明天再说
16
发表于 2008-7-9 00:39 | 只看该作者
lz辛苦啦。
17
发表于 2008-7-9 08:50 | 只看该作者
好有深度!慢慢看,学习!
18
发表于 2008-7-9 09:51 | 只看该作者
惨了,看不懂汇编了,哈哈
19
发表于 2008-7-9 10:17 | 只看该作者
lz,有没电调的电路啊,一起分享了吧,让俺们学习一下
20
发表于 2008-7-9 18:04 | 只看该作者
现在电调已经不算贵了,一般来说自制电调其实意义不大,主要应该是研究技术。或者有特别的用途。
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

关闭

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

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