Example Code 11

Dependencies:   mbed

Fork of STMNucleoF401RE_ExampleCode_11_ServoPWM by 20161020-Corso Rapid Prototyping with STM32Nucleo

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/perlatecnica/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/perlatecnica/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/perlatecnica/controlloservo.jpg

I collegamenti

/media/uploads/perlatecnica/collegamentoservosimple.png

Committer:
perlatecnica
Date:
Mon Nov 02 14:06:53 2015 +0000
Revision:
2:5d157cd24ef2
Parent:
0:4860a91fb495
v1.0

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