|
![](static/image/common/ico_lz.png)
楼主 |
发表于 2009-6-10 21:35:09
|
显示全部楼层
终于能动了,驱动硬盘电机。只写了同步起动和运行程序。但电机好像慢了点,电源电压12V,电流0.17A.转速才1813转/分钟(用示波器测其中一相的反向电动势为544HZ,除以6步(每个循环),因硬盘电机是9极定子是3的3倍所以再除以3再乘以60秒得1813转,不知这样算对不对)。
测量驱动MOS管的I/O口输出的占空比只有4个是33.3%,其他两个分别是16%左右和40%左右。(同步运行时6个都是33.3%的)
因刚学AVR,边学边写。无奈网上能找到的汇编参考程序太少了,写起来有种想哭的感觉 。不知这样写对不对,有没有更好的写法呢?
.include"m48def.inc"
.org 0
rjmp Start
Start:
ldi r30,0b00011111
out ddrb,r30
ldi r30,0b00100000
out ddrc,r30
ldi r30,0b00100111
out ddrd,r30
ldi r30,0b00000011
sts didr1,r30
ldi r30,0b01000000
sts adcsrb,r30
ldi r30,0b00000000
sts acsr,r30
ldi r30,0b00000000
sts adcsra,r30
clr r30
out portb,r30
out portd,r30
clr r30
ldi r25,254
moto:
rcall t0 ;开机延时
inc r30
tst r30
brne moto
moto1: ;同步起动
ldi r30,0b00000011
out portb,r30
ldi r30,0b00000000
out portd,r30
rcall t0
ldi r30,0b00000101
out portb,r30
ldi r30,0b00000000
out portd,r30
rcall t0
ldi r30,0b00001100
out portb,r30
ldi r30,0b00000000
out portd,r30
rcall t0
ldi r30,0b00001000
out portb,r30
ldi r30,0b00100000
out portd,r30
rcall t0
ldi r30,0b00010000
out portb,r30
ldi r30,0b00100000
out portd,r30
rcall t0
ldi r30,0b00010010
out portb,r30
ldi r30,0b00000000
out portd,r30
lop: ;检测反向电动势
ldi r30,0b00000010;a
sts admux,r30
in r30,acsr
sbrs r30,5
rjmp a0 ;0
rjmp a1 ;1
a0:
ldi r30,0b00000011;b
sts admux,r30
in r30,acsr
sbrs r30,5
rjmp a0b0 ;0
rjmp a0b1 ;1
a1:
ldi r30,0b00000011;b
sts admux,r30
in r30,acsr
sbrs r30,5
rjmp a1b0 ;0
rjmp a1b1 ;1
a0b0:
ldi r30,0b00000100;c
sts admux,r30
in r30,acsr
sbrs r30,5
rjmp a0b0c0 ;0
rjmp a0b0c1 ;1
a0b1:
ldi r30,0b00000100;c
sts admux,r30
in r30,acsr
sbrs r30,5
rjmp a0b1c0 ;0
rjmp a0b1c1 ;1
a1b0:
ldi r30,0b00000100;c
sts admux,r30
in r30,acsr
sbrs r30,5
rjmp a1b0c0 ;0
rjmp a1b0c1 ;1
a1b1:
ldi r30,0b00000100;c
sts admux,r30
in r30,acsr
sbrs r30,5
rjmp a1b1c0 ;0
rjmp a1b1c1 ;1
a0b0c0: ;输出
rjmp lop
a0b0c1:
ldi r30,0b00000011
out portb,r30
ldi r30,0b00000000
out portd,r30
rjmp lop
a0b1c0:
ldi r30,0b00001100
out portb,r30
ldi r30,0b00000000
out portd,r30
rjmp lop
a0b1c1:
ldi r30,0b00000101
out portb,r30
ldi r30,0b00000000
out portd,r30
rjmp lop
a1b0c0:
ldi r30,0b00010000
out portb,r30
ldi r30,0b00100000
out portd,r30
rjmp lop
a1b0c1:
ldi r30,0b00010001
out portb,r30
ldi r30,0b00000000
out portd,r30
rjmp lop
a1b1c0:
ldi r30,0b00001000
out portb,r30
ldi r30,0b00100000
out portd,r30
rjmp lop
a1b1c1:
rjmp lop
t0:
ldi r29,170
t1:
ldi r28,170
t2:
inc r28
tst r28
brne t2
t3:
inc r29
tst r29
brne t1
ret
.exit |
|