- Cos'è PWM (Pulse with Modulation)?
- PWM in STM32
- Componenti richiesti
- Dettagli pin di STM32
- Schema elettrico e collegamenti
- Programmazione STM32
Nell'articolo precedente abbiamo visto la conversione di ADC utilizzando STM32. In questo tutorial, impareremo a conoscere PWM (Pulse Width Modulation) in STM32 e come possiamo controllare la luminosità del LED o la velocità della ventola DC utilizzando la tecnica PWM.
Sappiamo che esistono due tipi di segnale: analogico e digitale. I segnali analogici hanno tensioni come (3V, 1V… ecc.) E i segnali digitali hanno (1 'e 0). Le uscite dei sensori sono di segnali analogici e questi segnali analogici vengono convertiti in digitali utilizzando ADC, poiché i microcontrollori comprendono solo il digitale. Dopo aver elaborato quei valori ADC, ancora una volta l'uscita deve essere convertita in forma analogica per pilotare i dispositivi analogici. Per questo utilizziamo alcuni metodi come PWM, convertitori da digitale ad analogico (DAC) ecc.
Cos'è PWM (Pulse with Modulation)?
PWM è un modo per controllare i dispositivi analogici utilizzando valori digitali come controllare la velocità del motore, la luminosità di un led, ecc. Sappiamo che il motore e il led funzionano su segnale analogico. Ma il PWM non fornisce un'uscita analogica pura, il PWM sembra un segnale analogico prodotto da impulsi brevi, fornito dal ciclo di lavoro.
Ciclo di lavoro del PWM
La percentuale di tempo in cui il segnale PWM rimane ALTO (tempo di attivazione) viene chiamata duty cycle. Se il segnale è sempre ON è nel duty cycle del 100% e se è sempre spento è nel duty cycle dello 0%.
Ciclo di lavoro = Tempo di accensione / (Tempo di accensione + Tempo di spegnimento)
PWM in STM32
STM32F103C8 ha 15 pin PWM e 10 pin ADC. Ci sono 7 timer e ogni uscita PWM è fornita da un canale collegato a 4 timer. Ha una risoluzione PWM a 16 bit (2 16), ovvero i contatori e le variabili possono arrivare fino a 65535. Con una frequenza di clock di 72 MHz, un'uscita PWM può avere un periodo massimo di circa un millisecondo.
- Quindi il valore di 65535 fornisce la PIENA LUMINOSITÀ del LED E LA PIENA VELOCITÀ della ventola CC (ciclo di lavoro 100%)
- Allo stesso modo il valore di 32767 fornisce MEZZA LUMINOSITÀ del LED E MEZZA VELOCITÀ della ventola CC (ciclo di lavoro 50%)
- E il valore di 13107 fornisce (20%) LUMINOSITÀ E (20%) VELOCITÀ (20% Duty Cycle)
In questo tutorial, stiamo usando il potenziometro e l'STM32 per variare la luminosità del LED e la velocità di una ventola DC con la tecnica PWM. Un LCD 16x2 viene utilizzato per visualizzare il valore ADC (0-4095) e la variabile modificata (valore PWM) che viene emessa (0-65535).
Ecco alcuni esempi PWM con altri microcontrollori:
- Generazione di PWM utilizzando il microcontrollore PIC con MPLAB e XC8
- Controllo servomotore con Raspberry Pi
- Dimmer LED basato su Arduino con PWM
- Modulazione di larghezza di impulso (PWM) utilizzando MSP430G2
Controlla tutti i progetti relativi al PWM qui.
Componenti richiesti
- STM32F103C8
- Ventilatore DC
- IC driver motore ULN2003
- LED (ROSSO)
- LCD (16x2)
- Potenziometro
- Breadboard
- Batteria 9V
- Cavi per ponticelli
Ventola CC: la ventola CC utilizzata qui è una ventola BLDC di un vecchio PC. Richiede un'alimentazione esterna, quindi utilizziamo una batteria da 9 V CC.
ULN2003 Motor Driver IC: viene utilizzato per azionare il motore in una direzione poiché il motore è unidirezionale e anche l'alimentazione esterna è richiesta per la ventola. Ulteriori informazioni sul circuito del driver del motore basato su ULN2003 qui. Di seguito è riportato il diagramma pic di ULN2003:
I pin (da IN1 a IN7) sono pin di ingresso e (da OUT 1 a OUT 7) sono pin di uscita corrispondenti. COM viene fornito Tensione sorgente positiva richiesta per i dispositivi di uscita.
LED: viene utilizzato un led di colore ROSSO che emette luce ROSSA. È possibile utilizzare qualsiasi colore.
Potenziometri: vengono utilizzati due potenziometri, uno per il partitore di tensione per l'ingresso analogico all'ADC e un altro per il controllo della luminosità del led.
Dettagli pin di STM32
Come possiamo vedere i pin PWM sono indicati in formato wave (~), ci sono 15 pin di questo tipo, i pin ADC sono rappresentati in colore verde, ci sono 10 pin ADC che sono usati per gli ingressi analogici.
Schema elettrico e collegamenti
I collegamenti di STM32 con vari componenti sono spiegati di seguito:
STM32 con ingresso analogico (ADC)
Il potenziometro presente sul lato sinistro del circuito viene utilizzato come regolatore di tensione che regola la tensione dal pin 3.3V. L'uscita dal potenziometro, ovvero il pin centrale del potenziometro, è collegata al pin ADC (PA4) di STM32.
STM32 con LED
Il pin di uscita PWM STM32 (PA9) è collegato al pin positivo del LED tramite un resistore in serie e un condensatore.
LED con resistenza e condensatore
Un resistore in serie e un condensatore in parallelo sono collegati al LED per generare un'onda analogica corretta dall'uscita PWM poiché l'uscita analogica non è pura da quando viene generata direttamente dal pin PWM.
STM32 con ULN2003 e ULN2003 con ventola
Il pin di uscita PWM STM32 (PA8) è collegato al pin di ingresso (IN1) di ULN2003 IC e il pin di uscita corrispondente (OUT1) di ULN2003 è collegato al filo negativo della VENTOLA CC.
Il pin positivo della ventola CC è collegato al pin COM dell'IC ULN2003 e anche la batteria esterna (9 V CC) è collegata allo stesso pin COM dell'IC ULN2003. Il pin GND di ULN2003 è collegato al pin GND di STM32 e il negativo della batteria è collegato allo stesso pin GND.
STM32 con LCD (16x2)
N. pin LCD |
Nome pin LCD |
Nome pin STM32 |
1 |
Terra (Gnd) |
Terra (G) |
2 |
VCC |
5V |
3 |
VEE |
Pin dal centro del potenziometro |
4 |
Seleziona registro (RS) |
PB11 |
5 |
Lettura / scrittura (RW) |
Terra (G) |
6 |
Abilita (EN) |
PB10 |
7 |
Bit di dati 0 (DB0) |
Nessuna connessione (NC) |
8 |
Bit di dati 1 (DB1) |
Nessuna connessione (NC) |
9 |
Bit di dati 2 (DB2) |
Nessuna connessione (NC) |
10 |
Bit di dati 3 (DB3) |
Nessuna connessione (NC) |
11 |
Bit di dati 4 (DB4) |
PB0 |
12 |
Bit di dati 5 (DB5) |
PB1 |
13 |
Bit di dati 6 (DB6) |
PC13 |
14 |
Bit di dati 7 (DB7) |
PC14 |
15 |
LED positivo |
5V |
16 |
LED negativo |
Terra (G) |
Un potenziometro sul lato destro viene utilizzato per controllare il contrasto del display LCD. La tabella sopra mostra il collegamento tra LCD e STM32.
Programmazione STM32
Come il tutorial precedente, abbiamo programmato STM32F103C8 con Arduino IDE tramite porta USB senza utilizzare il programmatore FTDI. Per conoscere la programmazione di STM32 con Arduino IDE segui il link. Possiamo procedere alla programmazione come in Arduino. Alla fine viene fornito il codice completo.
In questa codifica prenderemo un valore analogico di ingresso dal pin ADC (PA4) che è collegato al pin centrale del potenziometro sinistro e quindi convertiremo il valore analogico (0-3,3 V) in formato digitale o intero (0-4095). Questo valore digitale è inoltre fornito come uscita PWM per controllare la luminosità del LED e la velocità della ventola CC. Un LCD 16x2 viene utilizzato per visualizzare l'ADC e il valore mappato (valore di uscita PWM).
Per prima cosa dobbiamo includere il file di intestazione LCD, dichiarare i pin LCD e inizializzarli utilizzando il codice sottostante. Ulteriori informazioni sull'interfacciamento dell'LCD con STM32 qui.
#includere
Quindi dichiarare e definire i nomi dei pin utilizzando il pin di STM32
const int analoginput = PA4; // Ingresso da potenziometro const int led = PA9; // LED output const int fan = PA8; // uscita della ventola
Ora all'interno di setup () , dobbiamo visualizzare alcuni messaggi e cancellarli dopo pochi secondi e specificare il pin INPUT e i pin di uscita PWM
lcd.begin (16,2); // Preparare LCD lcd.clear (); // Cancella LCD lcd.setCursor (0,0); // Imposta il cursore su riga0 e colonna0 lcd.print ("CIRCUIT DIGEST"); // Visualizza Circuit Digest lcd.setCursor (0,1); // Imposta il cursore in colonna0 e riga1 lcd.print ("PWM USING STM32"); // Visualizza PWM utilizzando il ritardo STM32 (2000); // Tempo di ritardo lcd.clear (); // Cancella LCD pinMode (analoginput, INPUT); // imposta la modalità pin analoginput come INPUT pinMode (led, PWM); // imposta il led della modalità pin come uscita PWM pinMode (fan, PWM); // imposta la ventola in modalità pin come uscita PWM
Il pin di ingresso analogico (PA4) è impostato come INPUT da pinMode (analoginput, INPUT), il pin LED è impostato come uscita PWM da pinMode (led, PWM) e il pin della ventola è impostato come uscita PWM da pinMode (fan, PWM) . Qui i pin di uscita PWM sono collegati al LED (PA9) e alla ventola (PA8).
Successivamente nella funzione void loop () , leggiamo il segnale analogico dal pin ADC (PA4) e lo memorizziamo in una variabile intera che converte la tensione analogica in valori interi digitali (0-4095) utilizzando il codice sottostante int valueeadc = analogRead (analoginput);
La cosa importante da notare qui è che i pin PWM che sono i canali di STM32 hanno una risoluzione a 16 bit (0-65535), quindi dobbiamo mapparlo con valori analogici utilizzando la funzione mappa come di seguito
int risultato = mappa (valoreeadc, 0, 4095, 0, 65535).
Se la mappatura non viene utilizzata, non otterremo la piena velocità della ventola o la piena luminosità del LED variando il potenziometro.
Quindi scriviamo l'uscita PWM sul LED utilizzando pwmWrite (led, risultato) e l'uscita PWM sulla ventola utilizzando le funzioni pwmWrite (ventola, risultato ).
Infine visualizziamo il valore di ingresso analogico (valore ADC) e i valori di uscita (valori PWM) sul display LCD utilizzando i seguenti comandi
lcd.setCursor (0,0); // Imposta il cursore su riga0 e colonna0 lcd.print ("ADC value ="); // stampa le parole "" lcd.print (valueadc); // visualizza valueeadc lcd.setCursor (0,1); // Imposta il cursore in colonna0 e riga1 lcd.print ("Output ="); // stampa le parole in "" lcd.print (risultato); // visualizza il risultato del valore
Di seguito viene fornito il codice completo con un video dimostrativo.