|
我在AVR网站也发了帖,可都没有多少人指点我,郁闷:em20: :em20: :em20: :em20:
过零点位置在每个相序的0.58左右,可是按这个数据算出来不行,为什么?:em12: :em12: :em12: :em12:
检测程序如下,谁来指点,先谢了;
1.在断电状态下进入
2,结束时,得到通电相序,重新通电(,这就是闭环的相序,过零点可见的那种)
3,过零检测在另一子程序进行,
4此子程序称为"首次采集",只进行一次
soucai:
sbrc r25,0 ; 判断标志寄存器R25;--------,有标志,返回
ret
lds r16,tfch
cpi r16,0xb0
brsh soucai00
ret
;************
soucai00:
lds r16,js_l
dec r16
breq soucai000
sts js_l,r16
ret
soucai000:
ldi r16,0x05
sts js_h,r16 ;;软滤波4次
cli ;检测不到,允许中断
clr r20
out tcnt1h,r20
out tcnt1l,r20
clz ;首采
in r16,pinc ;读端口
;逻辑与,屏蔽其他端口
andi r16,0b00011100 ; 逻辑与,屏蔽其他端口
soucai01:
mov r18,r16
in r17,pinc
andi r17,0b00011100
eor r18,r17 ;逻辑异或,检验是否相同
breq soucai01 ; 相同结果为0,则z=1,r17=r18,无过零
;判断标志*********
rcall jisuq ;软滤波
sbrs r25,2
rjmp soucai01
;===================
ldi r16,0x05
sts js_h,r16 ;软滤波4次
;*****************
;判断标志*********
sbrc r25,1 ;首次过零,标志0
rjmp soucai03 ;标志1,二次过零
clr r16
out tcnt1h,r16
out tcnt1l,r16
ldi r16,0b10000001 ;1
out tccr1b,r16 ;T1启动
set
bld r25,1 ;标志写1
;r18和r17进行逻辑与,判断方向
mov r19,r18 ;保存数据
clz
and r18,r17
breq soucai02 ;结果为0,z=1
set
bld r20,5 ;上升沿脉冲,1与1=1,z为0,标志记1,否则为0
soucai02:
in r16,pinc
andi r16,0b00011100
rjmp soucai01
;*********************
soucai03:
;写标志*********
set
bld r25,0 ;完成首采,写1
clt
bld r25,1
;********
eor r18,r19 ;异或后,R18的234位为0的是下一过零端口
add r18,r20 ;与r20 相加后,r18的5432位决定了相序和方向
;判断
cpi r18,0b00111000 ;ac 0x85
breq ztai01
cpi r18,0b00110100 ;cb 0x99
breq ztai02
cpi r18,0b00101100 ;ba 0x8f
breq ztai03
cpi r18,0b00011000 ;ca 0x94
breq ztai04
cpi r18,0b00010100 ;bc 0x8a
breq ztai05
cpi r18,0b00010100 ;ab 0x80
breq ztai06
;=============
ztai01:
ldi r30,0x85
rjmp soucai04
ztai02:
ldi r30,0x99
rjmp soucai04
ztai03:
ldi r30,0x8f
rjmp soucai04
ztai04:
ldi r30,0x94
rjmp soucai04
ztai05:
ldi r30,0x8a
rjmp soucai04
ztai06:
ldi r30,0x80
rjmp soucai04
soucai04:
rjmp fxd
;************************
jisuq:
lds r16,js_h
dec r16
breq jisuq00
sts js_h,r16
ret
jisuq00:
set
bld r25,2
ret
在后来的实验中,这段程序被证实是多余的
大家不要被误导
:em19: :em19: :em19: :em19: :em19:
[ 本帖最后由 ququbin 于 2007-12-2 18:01 编辑 ] |
|