Example code 09

Dependencies:   mbed

Il controllo della velocità di rotazione di un motore in continua

Il controllo della velocità di rotazione di un motore in continua può essere realizzato sostanzialmente in quattro modi:

1) Utilizzando ingranaggi meccanici per raggiungere la velocità desiderata. Questo comporta, a meno di poter variare i rapporti degli ingranaggi, una velocità fissa e ciò generalmente va oltre le possibilità di chi vuole realizzare piccoli manufatti.

2) Variando la tensione applicata al motore disponendo in serie dei resistori. Questo comporta che incrementando il carico del motore aumenta anche la corrente nei resistori e quindi l'energia che andrà dissipata sotto forma di calore (I^2R). Più corrente significa maggiore caduta di tensione sui resistori e quindi meno tensione ai poli del motore.

3) Utilizzando un transistor che continuamente vari la tensione ai poli del motore. Questo meccanismo funziona bene, anche se un sostanzioso ammontare di calore viene dissipato nel transistor.

4) Applicando la piena tensione sotto forma di un treno di impulsi, eliminando cosi cadute di tensione nelle resistenze in serie. Questo treno di impulsi e' chiamato Pulse With Modulation (PWM).

Pulse With Modulation

Si tratta di un metodo molto efficiente di fornire frazioni di potenza elettrica intermedi tra il sempre acceso ed il sempre spento. Il vantaggio principale del PWM rispetto ad un controllo resistivo e' l'efficienza.

Regolando il duty cycle del segnale (modulazione della larghezza dell'impulso, da cui il " PWM " ) ovvero la frazione di tempo in cui è "on", la potenza media può essere variata, e quindi la velocità del motore. Si tratta di una tecnica di controllo in cui l'alimentazione al motore viene accesa e spenta rapidamente, a frequenza abbastanza elevata, tale che gli effetti della commutazione possono essere trascurati. La tensione efficace risultante è quindi la frazione mediata nel tempo in cui il segnale e' on. Questa tecnica è utilizzata anche in molte altre applicazioni.

/media/uploads/perlatecnica/dutycycle50-.png

Nella figura 1 sulla sinistra viene mostrato il segnale PWM con un duty cycle del 50%, mentre sulla destra viene mostrato l'effetto percepito dal motore.

l segnale viene acceso e spento con un dato periodo ed è in stato "on" a tensione VON per una frazione fissa del periodo . Questo tempo viene indicato come il " duty cycle " e viene indicato cone una percentuale, calcolata come :

/media/uploads/perlatecnica/dutycycleformula.png

Modificando il duty cycle di un segnale PWM cambia la media, o il livello di tensione percepito. Per esempio, la regolazione del duty cycle illustrato in figura (2) in modo che sia in stato "on" per l'80 % del periodo, cambierà la percezione come quella mostrata a destra in figura(2). Aumentando il duty cycle al 80 % , la tensione percepita aumenta al 80 % di VON .

/media/uploads/perlatecnica/dutycycle80-.png

Se il segnale PWM è implementato con una frequenza troppo bassa, il risultato sarà un movimento a scatti del motore poiché gli effetti della commutazione non sono più trascurabili. Invece, il risultato desiderato è quello di approssimare il segnale alla "tensione percepita" più fedelmente possibile con un minimo di ripple percepibile. Quando si controlla il magnete permanente di un motore DC con spazzole con PWM, il filtraggio viene eseguito in modo molto efficace dall'inerzia fisica del sistema meccanico. Per applicazioni diverse dal controllare la velocità di un DC, circuiti di filtraggio possono essere utilizzati per rispondere alla richiesta smoothing dell'uscita PWM. Nel caso estremo in cui viene scelto, un periodo molto lungo rispetto alla costante di tempo meccanica, il motore tenderà ad avviarsi ed a fermarsi. Nel caso ad esempio di periodo di PWM pari 2sec (che è una frequenza PWM 0,5 Hz): il motore quasi certamente accelera e decelera sensibilmente durante ogni periodo. Questo è un indesiderabile "ripple di coppia", che diventerà molto meno evidente a frequenze superiori Di solito, per il controllo dei motori DC, le frequenze PWM variano nella gamma di 100Hz a 1000Hz. In generale possiamo dire che frequenze superiori provocano certamente meno ripple, ma che comunque la dinamica del motore non gli consente di seguire le variazioni del segnale di tensione in ingresso.

Committer:
MikGa87
Date:
Mon Nov 21 08:18:36 2016 +0000
Revision:
4:b69c993bb0e7
Parent:
3:aecdaed3e772
Modificato per supporto a chip driver l9119

Who changed what in which revision?

UserRevisionLine numberNew contents of line
perlatecnica 2:5a81778c8f8b 1 /****************************************************
perlatecnica 2:5a81778c8f8b 2 * FAST PROTOTYPING WITH NUCLEO *
perlatecnica 2:5a81778c8f8b 3 * Example Code 09: DC motor control *
perlatecnica 2:5a81778c8f8b 4 * Author: Mauro D'Angelo *
perlatecnica 2:5a81778c8f8b 5 * Organization: Perlatecnica no-profit organization *
perlatecnica 2:5a81778c8f8b 6 *****************************************************/
bcostm 0:4860a91fb495 7 #include "mbed.h"
bcostm 0:4860a91fb495 8
perlatecnica 2:5a81778c8f8b 9 #define PWMB PA_7
perlatecnica 2:5a81778c8f8b 10 #define DIRB PA_5
perlatecnica 2:5a81778c8f8b 11
perlatecnica 2:5a81778c8f8b 12 #define PWMA PB_3
perlatecnica 2:5a81778c8f8b 13 #define DIRA PA_6
bcostm 0:4860a91fb495 14
perlatecnica 2:5a81778c8f8b 15 // Instanzia un oggetto di tipo PwmOut e gli da il nome mypwm
perlatecnica 2:5a81778c8f8b 16 PwmOut mypwm(PWMB);
perlatecnica 2:5a81778c8f8b 17 // Definisce il pin che indica la direzione
MikGa87 4:b69c993bb0e7 18 PwmOut mypwm2(DIRB);
perlatecnica 2:5a81778c8f8b 19
perlatecnica 2:5a81778c8f8b 20 // Instanzia un oggetto di tipo DigitalOut sul pin LED1 e gli da il nome myled
bcostm 0:4860a91fb495 21 DigitalOut myled(LED1);
bcostm 0:4860a91fb495 22
perlatecnica 2:5a81778c8f8b 23 // Instanzia un oggetto di tipo Serial sui pin Tx e Rx della porta USB e gli da il nome pc (trattandosi della porta USB connessa al PC)
perlatecnica 2:5a81778c8f8b 24 Serial pc(USBTX, USBRX);
perlatecnica 2:5a81778c8f8b 25
perlatecnica 2:5a81778c8f8b 26 // Entry point
bcostm 0:4860a91fb495 27 int main() {
MikGa87 4:b69c993bb0e7 28 //motordir = 1;
bcostm 0:4860a91fb495 29
perlatecnica 2:5a81778c8f8b 30 //Set pwm signal period: The period needed to control the motor in the servo datasheet
perlatecnica 2:5a81778c8f8b 31 mypwm.period_ms(10);
perlatecnica 3:aecdaed3e772 32 mypwm.pulsewidth(0.01); // 100%
perlatecnica 2:5a81778c8f8b 33 //mypwm.pulsewidth(0.005); // 50%
perlatecnica 3:aecdaed3e772 34 //mypwm.pulsewidth(0.002); // 20%
bcostm 0:4860a91fb495 35
perlatecnica 2:5a81778c8f8b 36 while(1) {;}
perlatecnica 2:5a81778c8f8b 37 }