da się, da.
choć na AT89C2051 to nie najlepiej działa (i zresztą wszystkich 51 bez PWM), ale ja (kiedyś) napisałem procedurki które pozwalają na płynną regulację silnika SPS:
W C:
unsigned char licz,predkosc;
#define silnik P10
#define wlacz 1
#define wylacz 0
void pwm (void) interrupt 1
{
if (licz<predkosc) silnik=wlacz;
else silnik=wylacz;
if (++licz>64) licz=0;
}
void main (void)
{
TMOD=2;
TCON=16;
TH0=100;
TL0=100; // przerw. co 156 cykli * 64 (6bit) ~~100Hz
ET0=0;
EAL=1;
predkosc=0;
licz=0;
...
w asm:
org 2000h ;przerwanie RESET
ljmp 2300h
org 200Bh ;przerwanie TIMER0
ljmp 2100h
org 2100h ;program przerwania timer0:
cpl p3.2
inc R6 ;w R6 - ilosc cykli do odmierzenia pelnego PWMa
cjne r6,#16,dalej ; PWM 4 bitowy
mov r6,#0 ;jezeli R6=16 to R6=0
dalej: mov a,r6
cjne a,05,przel ;porownanie R6 z R5 - wsp wypelnienia - od 0 do 15
przel: jc zmien ;R6<R5 - na wyjsciu zero logiczne
setb p3.5 ;R6>R5 - na p3.5 "1"
sjmp nast
zmien: clr p3.5
nast: mov TL0,r7 ;w R7 - predkosc 0 ~ 3900Hz
mov TH0,#255
clr TF0
reti
org 2300h
mov TMOD,#01 ;ustawienie licznika T0
mov TCON,#00010000B
mov TL0,#0
mov TH0,#255
;ustawienia poczatkowe
mov r7,#242 ; R7 - czestotliwosc nosna=czestotliwosc przerwan/16 (0 - 3,9kHz ; np dla 225 - 32kHz - przerwanie trwa 30 cykli a program 22 cykle - zostaje 8 cykli na wykonanie glownego programu.)
mov r6,#0 ; R6 - licznik (wartosc poczatkowa 0)
mov r5,#2 //R5 - wsp wypelnienia - od 0 do 15 (0 - 100%)
setb EA ;wlaczenie przerwan
setb ET0
pocz: mov r5,#.... ; wpis do r5 wartosci PWM
sjmp pocz
end
/*
f nosna = f przerwan / 2^(ilosc bitów pwm)
dla 4 bit (16 poziomow sygnalu)
R7 = 0 <- czestotliwosc przerwan= 3,9kHz , f nosna = 244Hz
R7 = 16 <- -''- = 4,2kHz , f nosna = 260Hz
R7 = 32 <- -''- = 4,4 , -''- = 280
R7 = 64 <- -''- = 5,2 , -''- = 325
R7 = 100 <- -''- = 6,4 , -''- = 400
R7 = 128 <- -''- = 7,8 , -''- = 488
R7 = 160 <- -''- =10,4 , -''- = 651
R7 = 180 <- -''- =13,1 , -''- = 822
R7 = 200 <- -''- =17,8 , -''- =1116
R7 = 210 <- -''- =21,7 , -''- =1358
R7 = 220 <- -''- =27,8 , -''- =1736
*/
ten długi komentaż - jeśli nic mi się nie pomyliło - to tak powinno działać
a obciążenie procka przerwaniami nie jest wcale takie wielkie....
6 bit zakres regulacji pewnie wystarczy
Program nie jest pięknie napisany, ale działa.