It shows how to control the rotation of a servo motor

Dependencies:   mbed

Il controllo di un servo motore

Il servo motore, e' un motore in grado di ruotare di un certo numero di gradi oppure di compiere in certi casi rotazioni complete. Tipicamente e' alloggiato in un contenitore dove troviamo oltre ad un classico motore DC il sistema di controllo a retroazione costituito da un potenziometro che ruota in maniera solidale all'asse del motore per fornire all'elettronica la posizione del motore proporzionale al valore della resistenza offerta ai capi del potenziometro.

/media/uploads/StefanoArrigoni/servomotore.jpg

Il servo motore presenta tre fili. Due, tipicamente nero e rosso, sono i due cavi di alimentazione, il terzo e' quello del segnale di controllo.

/media/uploads/StefanoArrigoni/servo1.jpg

Il segnale di controllo

Anche in questo caso si utilizza un segnale PWM con delle caratteristiche particolari, ossi un treno di impulsi di durata e periodo fissati. Parliamo di un segnale PWM ma e' importante sottolineare che si tratta di un caso particolare, perché in questo caso il periodo del segnale PWM non e' fisso, ma legato alla durata dell'impulso essendo la distanza tra due impulsi fissata. La durata del singolo impulso, che potrà variare tra 1ms e 2ms, farà ruotare il perno del motore solidale con il potenziometro, fino a raggiungere l'angolo di rotazione corrispondente. La durata minima e massima del singolo impulso corrispondono ai due limiti di rotazione dell'asse del motore. La durata dell'intervallo tra un impulso ed il successivo, deve essere compresa tra un minimo di 10ms ed un massimo di 40ms. La durata tipica e' di 20ms corrispondenti ad una frequenza di 50Hz.

/media/uploads/StefanoArrigoni/controlloservo.jpg

I collegamenti

/media/uploads/StefanoArrigoni/collegamentoservosimple.png

Committer:
StefanoArrigoni
Date:
Fri Nov 09 10:41:20 2018 +0000
Revision:
3:31af2c309957
Parent:
2:5d157cd24ef2
The comment "Organization: Perlatecnica no-profit organization" has been removed

Who changed what in which revision?

UserRevisionLine numberNew contents of line
perlatecnica 2:5d157cd24ef2 1 /****************************************************
perlatecnica 2:5d157cd24ef2 2 * FAST PROTOTYPING WITH NUCLEO *
perlatecnica 2:5d157cd24ef2 3 * Example Code 11: Servo pwm *
perlatecnica 2:5d157cd24ef2 4 * Author: Mauro D'Angelo *
perlatecnica 2:5d157cd24ef2 5 *****************************************************/
perlatecnica 2:5d157cd24ef2 6
bcostm 0:4860a91fb495 7 #include "mbed.h"
bcostm 0:4860a91fb495 8
perlatecnica 2:5d157cd24ef2 9 // Instanzia un oggetto di tipo PwmOut sul pin PWM_OUT e gli da il nome mypwm
perlatecnica 2:5d157cd24ef2 10 PwmOut mypwm(PB_3);
bcostm 0:4860a91fb495 11
perlatecnica 2:5d157cd24ef2 12 // Instanzia un oggetto di tipo DigitalOut sul pin LED1 e gli da il nome myled
bcostm 0:4860a91fb495 13 DigitalOut myled(LED1);
bcostm 0:4860a91fb495 14
perlatecnica 2:5d157cd24ef2 15 // 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:5d157cd24ef2 16 Serial pc(USBTX, USBRX);
perlatecnica 2:5d157cd24ef2 17
perlatecnica 2:5d157cd24ef2 18 // Entry point
bcostm 0:4860a91fb495 19 int main() {
perlatecnica 2:5d157cd24ef2 20
perlatecnica 2:5d157cd24ef2 21 //Set pwm signal period: The period needed to control the motor in the servo datasheet
perlatecnica 2:5d157cd24ef2 22 mypwm.period_ms(20);
bcostm 0:4860a91fb495 23
perlatecnica 2:5d157cd24ef2 24 // In questa funzione l'ampiezza dell'impulso e' passata in secondi e di tipo float
perlatecnica 2:5d157cd24ef2 25 mypwm.pulsewidth(0);
perlatecnica 2:5d157cd24ef2 26 wait(0.1);
perlatecnica 2:5d157cd24ef2 27 mypwm.pulsewidth(0.0005);
perlatecnica 2:5d157cd24ef2 28 wait(0.1);
perlatecnica 2:5d157cd24ef2 29 mypwm.pulsewidth(0.001);
perlatecnica 2:5d157cd24ef2 30 wait(0.1);
perlatecnica 2:5d157cd24ef2 31 mypwm.pulsewidth(0.0015);
perlatecnica 2:5d157cd24ef2 32 wait(0.1);
perlatecnica 2:5d157cd24ef2 33 mypwm.pulsewidth(0.002);
bcostm 0:4860a91fb495 34
perlatecnica 2:5d157cd24ef2 35 // Print the pwm duty cycle in percentage
perlatecnica 2:5d157cd24ef2 36 pc.printf("pwm set to %.2f %%\n", mypwm.read() * 100);
perlatecnica 2:5d157cd24ef2 37
perlatecnica 2:5d157cd24ef2 38 // Blink led
bcostm 0:4860a91fb495 39 while(1) {
perlatecnica 2:5d157cd24ef2 40 // Modifica lo stato del led (toggle)
bcostm 0:4860a91fb495 41 myled = !myled;
perlatecnica 2:5d157cd24ef2 42 wait(0.1);
bcostm 0:4860a91fb495 43 }
bcostm 0:4860a91fb495 44 }
perlatecnica 2:5d157cd24ef2 45
perlatecnica 2:5d157cd24ef2 46 // *** ESPERIMENTI ***
perlatecnica 2:5d157cd24ef2 47 // [1] Modifica il valore passato nel metodo pulsewidth(). Passa valori consentiti e non consentiti secondo il datasheet del motore