Test pwm con profilo a rampa
Untitled
pwmo = P1.0 CS = P1.5
CLK = P1.6
DATA = P1.7
pwmval = 10h adcval = 11h org 8200h
call init
main:
mov r1,#250
ltestpwm:
call lettadc
mov adcval,a
djnz r1,ltestpwm
inc pwmval
jmp main
lettadc:
mov r0,#8
clr CS
loopcv:
mov c,DATA
rlc a
setb CLK
clr CLK
djnz r0,loopcv
setb CS
ret
ser_t0:
push acc
mov th0,#0ffh
jb flon,pwmoff
pwmon:
setb pwmo
mov a,#0ffh
clr c
subb a,pwmval
mov tl0,a
setb flon
pop acc
reti
pwmoff:
clr pwmo
mov tl0,pwmval
clr flon
pop acc
reti
t_mod2 = 1 itv = 0 flon = 20h.0 init:
clr tr0
mov a,tmod
anl a,#0F0h
orl a,#t_mod2
mov tmod,a
mov dptr,#80A4h
mov a,#high(ser_t0)
movx @dptr,a
inc dptr
mov a,#low(ser_t0)
movx @dptr,a
mov th0,#0ffh
mov tl0,#0 setb et0
setb tr0
clr flon
clr pwmo
setb CS
clr CLK
setb DATA
ret
end
|
Regolatore proporzionale
pwmo = P1.0 CS = P1.5
CLK = P1.6
DATA = P1.7
pwmval = 10h adcval = 11h rif = 13h k = 14h nacq = 0F0h bufacq = 9000h org 8200h
call init
call initacq
main:
mov r1,#25
ltestpwm:
call lettadc
mov adcval,a
djnz r1,ltestpwm
call acq call regola jmp main
regola:
mov a,rif
clr c
subb a,adcval
jc zero mov b,k
lmolt:
mul ab
mov r3,a
mov a,b
jz wrpwm mov r3,#0FFh
wrpwm:
mov pwmval,r3
ret
zero:
mov pwmval,#0
ret
acq:
djnz cacq,doacq
mov cacq,#nacq
mov dptr,#bufacq
doacq:
movx @dptr,a
inc dptr
ret
lettadc:
mov r0,#8
clr CS
loopcv:
mov c,DATA
rlc a
setb CLK
clr CLK
djnz r0,loopcv
setb CS
ret
ser_t0:
push acc
push psw
mov th0,#0ffh
jb flon,pwmoff
pwmon:
setb pwmo
mov a,#0ffh
clr c
subb a,pwmval
mov tl0,a
setb flon
pop psw
pop acc
reti
pwmoff:
clr pwmo
mov tl0,pwmval
clr flon
pop psw
pop acc
reti
t_mod1 = 1 itv = 0 flon = 20h.0 init:
clr tr0
mov a,tmod
anl a,#0F0h
orl a,#t_mod1
mov tmod,a
mov dptr,#80A4h
mov a,#high(ser_t0)
movx @dptr,a
inc dptr
mov a,#low(ser_t0)
movx @dptr,a
mov th0,#0ffh
mov tl0,#0 setb et0
setb pt0
setb tr0
clr flon
clr pwmo
setb CS
clr CLK
setb DATA
ret
initacq:
mov cacq,#1
ret
end
|
Regolazione pseudo integrativa (correzione a rampa)
pwmo = P1.0 CS = P1.5
CLK = P1.6
DATA = P1.7
pwmval = 10h adcval = 11h nacq = 0F0h cacq = 12h bufacq = 9000h
rif = 13h org 8200h
call init
call initacq
main:
mov r1,#250
ltestpwm:
call lettadc
mov adcval,a
djnz r1,ltestpwm
call acq
call regola
jmp main
regola:
mov a,rif
clr c
subb a,adcval
jz u_reg
jc decrem
mov a,pwmval
cjne a,#0FFh,increm
jmp u_reg
increm:
inc pwmval
jmp u_reg
decrem:
mov a,pwmval
jz u_reg
dec pwmval
u_reg:
ret
acq:
djnz cacq,doacq
mov cacq,#nacq
mov dptr,#bufacq
doacq:
movx @dptr,a
inc dptr
ret
lettadc:
mov r0,#8
clr CS
loopcv:
mov c,DATA
rlc a
setb CLK
clr CLK
djnz r0,loopcv
setb CS
ret
ser_t0:
push acc
push psw
mov th0,#0ffh
jb flon,pwmoff
pwmon:
setb pwmo
mov a,#0ffh
clr c
subb a,pwmval
mov tl0,a
setb flon
pop psw
pop acc
reti
pwmoff:
clr pwmo
mov tl0,pwmval
clr flon
pop psw
pop acc
reti
t_mod1 = 1 itv = 0 flon = 20h.0 init:
clr tr0
mov a,tmod
anl a,#0F0h
orl a,#t_mod1
mov tmod,a
mov dptr,#80A4h
mov a,#high(ser_t0)
movx @dptr,a
inc dptr
mov a,#low(ser_t0)
movx @dptr,a
mov th0,#0ffh
mov tl0,#0 setb et0
setb pt0
setb tr0
clr flon
clr pwmo
setb CS
clr CLK
setb DATA
ret
initacq:
mov cacq,#1
ret
end
|