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

main.cpp

Committer:
perlatecnica
Date:
2015-11-02
Revision:
2:5d157cd24ef2
Parent:
0:4860a91fb495

File content as of revision 2:5d157cd24ef2:

/****************************************************
*            FAST PROTOTYPING WITH NUCLEO           *
* Example Code 11: Servo pwm                        *
* Author: Mauro D'Angelo                            *
* Organization: Perlatecnica no-profit organization *  
*****************************************************/

#include "mbed.h"

// Instanzia un oggetto di tipo PwmOut sul pin PWM_OUT e gli da il nome mypwm
PwmOut mypwm(PB_3);

// Instanzia un oggetto di tipo DigitalOut sul pin LED1 e gli da il nome myled
DigitalOut myled(LED1);

// 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)
Serial pc(USBTX, USBRX);

// Entry point
int main() {
      
    //Set pwm signal period: The period needed to control the motor in the servo datasheet
    mypwm.period_ms(20);
    
    // In questa funzione l'ampiezza dell'impulso e' passata in secondi e di tipo float
    mypwm.pulsewidth(0);
    wait(0.1);
    mypwm.pulsewidth(0.0005);
    wait(0.1);
    mypwm.pulsewidth(0.001);
    wait(0.1);
    mypwm.pulsewidth(0.0015);
    wait(0.1);
    mypwm.pulsewidth(0.002);
    
    // Print the pwm duty cycle in percentage
    pc.printf("pwm set to %.2f %%\n", mypwm.read() * 100);
    
    // Blink led   
    while(1) {
        // Modifica lo stato del led (toggle)
        myled = !myled;
        wait(0.1);
    }
}

// *** ESPERIMENTI ***
// [1] Modifica il valore passato nel metodo pulsewidth(). Passa valori consentiti e non consentiti secondo il datasheet del motore