Il circuito proposto qui sotto permette di controllare la velocità di rotazione di un motore in corrente continua tramite un potenziometro.

Il valore di tensione ai capi del potenziometro viene convertito in un numero compreso tra 0 e 1023. Questo valore diventa il duty cycle del segnale PWM. il valore 0 corrisponde ad un duty cycle d=0, il valore 1023 a un duty cycle d=1. La proporzione da utilizzare per trovare il duty cycle quando il potenziometro è in una posizione intermedia è:

valore_potenziometro : 1024 = d : 1

quindi:

d = valore_potenziometro / 1024 

Un duty cycle pari a 1 corrisponde ad un valore passato alla funzione analogWrite di 255 e quindi se in ingresso al convertitore analogico digitale viene letto zero il valore da passare ad analogWrite è 0, viceversa se il valore letto è 1023 (corrispondente ad un duty cycle d = 1) il valore da passare ad analogWrite è 255. Per i valori intermedi la proporzione da utilizzare sarà quindi:

valore_potenziometro : 1024 = valore_analogWrite : 255

e quindi il valore da passare ad analogWrite è:

valore_analogWrite = valore_potenziometro * 255 / 1024

Poiché l'assorbimento dal motore è elevato, nel circuito proposto si è deciso di alimetarlo tramite una batteria a 9V. Il pilotaggio ovviamente non può essere fatto direttamente con un uscita PWM di Arduino e si è utilizzato un comune transistor NPN (in configurazione ON-OFF) per modulare la corrente del motore.

Per visualizzare correttamente la forma d'onda nell'oscilloscopio è conveniente settare l'asse dei tempi con una scala di 1ms/divisione.

Lo sketch che implementa quanto detto è riportato qui sotto:

#define PWM_pin 9
#define control_pin A0

int power;   
int val_analogico;
 
void setup()  {
  Serial.begin(9600);
  pinMode(PWM_pin, OUTPUT);
}
 
void loop()  {
  val_analogico = analogRead(control_pin);
  // Proporzione-> val_analogico:1024 = power:255
 
  power = (int) val_analogico*(255.0/1024.0);
  analogWrite(PWM_pin, power);  

  float duty_cycle = power/255.0*100.0;
  Serial.println(duty_cycle);

  delay(100);
}
Last modified: Wednesday, 10 January 2024, 7:07 PM