Réalisation de la partie générant le signal PWM :
Génération du signal PWM se fait selon l’organigramme suivant :
Ce petit bout de programme se trouvera dans une interruption qui s’execute réguliairement. Cette interruption est executée par le compteur OC2 à chaque fois qu’il atteind la valeur déterminée par la variable time.
Dans notre cas, time = 650 , étant donné que le µC 68hc11 execute une incrémentation du compteur toutes les 0.5 µs, alors t = 0.5 µ x 650 = 325 µs.
La variable de subdivision de t determine la période du signal PWM, tel que
si subdiv = 15, alors tpwm = 15 x t = 4.875 ms.
La variable de rapport cyclique quand à elle determine pendant combien de cycles sur les 15 (fixés par subdiv) le signal PWM sera à un. C’est à dire que si rpcycl = 4, alors le rapport cyclique du PWM sera égal à (4 x 100) / 15 = 26.6 %. Pour avoir 100% de rapport cyclique, il faudrait que rpcycl = subdiv = 15.
Le fonctionnement peut donc être illustré par le schéma suivant :
interruption |
1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 |
|
11 |
|
12 |
|
13 |
|
14 |
|
15 |
|
16 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
PWM |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
(rpcycl = 5) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
temps |
<time> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
<----------- rpcycl -----------------------> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||
|
<-------------------------------------------------- subdiv ----------------------------------------------------------------------------> |
|
|
|
On peut alors changer la plage de vitesse de fonctionnement du moteur en modifiant la valeur de subdiv, ainsi si on veut que les vitesses aillent de 0% à 100%, il suffit de mettre subdiv = 5. Alors on aura v1 = 20 % , v2 = 40 %, v3 = 60 %, v4 = 80 % et v5 = 100 %.
Le code source en assembleur est alors le suivant :
(pour les initialisations des variables, voir annexe 3)
;debut du pwm ****************************
int_b5:
ldd toc2 ;*
addd time ;* ajoute OC2 = OC2 + time
std toc2 ;* enregistre la nouvelle valeur de OC2
ldaa rpcycl ;* test
cmpa #$00 ;* si rpcycl = 0
beq retour ;* branche en retour
dec subdiv ;* decremente subdiv
beq haut ;* branche en haut si subdiv = 0
dec rpcycl ;* decremente rpcycl
beq bas ;* branche en bas si rpcycl = 0
retour:
ldaa portc ;* verifie temperature flag
anda #$01 ;*
cmpa #$00 ;*
beq int_b6 ;* branche en in_b6 si flag actif
ldaa svtptemp ;* reinit tptemp = svtptemp
staa tptemp ;*
bra finrti ;* retour au program
haut:
ldaa #$40 ;* init pwm = 1
staa porta ;*
ldaa svsubdiv ;* reinit subdiv = svsubdiv
staa subdiv ;*
ldaa svrpcycl ;* reinit rpcycl = svrpcycl
staa rpcycl ;*
bra retour ;* branche en retour
bas:
ldaa #$00 ;* init pwm = 0
staa porta ;*
ldaa svrpcycl ;* reinit rpcycl = svrpcycl
staa rpcycl ;*
bra retour ;* branche en retour
*****************************************************
******************************************************