Sommario:
- Passaggio 1: descrizione
- Passaggio 2: Timer AVR – Modalità PWM
- Passaggio 3: misurazione dell'intensità della luce - ADC e LDR
- Passaggio 4: controller motore CC e modulo driver motore Dual H-Bridge-L298N
- Passaggio 5: scrittura del codice per un programma in C. Caricamento del file HEX nella memoria flash del microcontrollore
- Passaggio 6: il circuito elettrico
Video: Microcontrollore AVR. Modulazione dell'ampiezza dell'impulso. Сcontrollore del motore DC e intensità della luce LED.: 6 passaggi
2024 Autore: John Day | [email protected]. Ultima modifica: 2024-01-30 10:02
Ciao a tutti!
La modulazione a larghezza di impulso (PWM) è una tecnica molto comune nelle telecomunicazioni e nel controllo dell'alimentazione. è comunemente usato per controllare l'alimentazione fornita a un dispositivo elettrico, sia esso un motore, un LED, altoparlanti, ecc. È fondamentalmente una tecnica di modulazione, in cui l'ampiezza dell'impulso portante viene variata in base al segnale del messaggio analogico.
Realizziamo un semplice circuito elettrico per controllare la velocità di rotazione del motore CC in base all'intensità della luce. Utilizzeremo il resistore dipendente dalla luce e le funzionalità del microcontrollore AVR come la conversione da analogico a digitale per misurare l'intensità della luce. Inoltre utilizzeremo il Dual H-Bridge Motor Driver Module-L298N. Viene in genere utilizzato per controllare la velocità e la direzione dei motori, ma può essere utilizzato per altri progetti come la regolazione della luminosità di determinati progetti di illuminazione. Inoltre, abbiamo aggiunto un pulsante al nostro circuito per alternare la direzione di rotazione del motore.
Passaggio 1: descrizione
Ogni corpo in questo mondo ha una certa inerzia. Il motore gira ogni volta che viene acceso. Non appena viene spento, tenderà a fermarsi. Ma non si ferma subito, ci vuole del tempo. Ma prima che si fermi completamente, viene riacceso! Così inizia a muoversi. Ma anche adesso, ci vuole un po' di tempo per raggiungere la sua massima velocità. Ma prima che accada, viene spento e così via. Pertanto, l'effetto complessivo di questa azione è che il motore ruota continuamente, ma a una velocità inferiore.
La modulazione a larghezza di impulso (PWM) è una tecnica di commutazione di potenza relativamente recente per fornire quantità intermedie di energia elettrica tra i livelli completamente acceso e completamente spento. Di solito, gli impulsi digitali hanno lo stesso periodo di attivazione e disattivazione, ma in alcune situazioni è necessario che l'impulso digitale abbia più/meno tempo di attivazione/disattivazione. Nella tecnica PWM, creiamo impulsi digitali con una quantità disuguale di stato on e off per ottenere i valori di tensione intermedi richiesti.
Il ciclo di lavoro è definito dalla percentuale di durata dell'alta tensione in un impulso digitale completo. Può essere calcolato da:
% di Duty cycle = T on /T (periodo) x 100
Prendiamo una dichiarazione di problema. Dobbiamo generare un segnale PWM a 50 Hz con un duty cycle del 45%.
Frequenza = 50 Hz
Periodo di tempo, T = T(acceso) + T(spento) = 1/50 = 0,02 s = 20 ms
Ciclo di lavoro = 45%
Quindi, risolvendo secondo l'equazione data sopra, otteniamo
T(acceso) = 9 ms
T(spento) = 11 ms
Passaggio 2: Timer AVR – Modalità PWM
Per creare PWM, AVR contiene hardware separato! Usando questo, la CPU indica all'hardware di produrre PWM di un particolare ciclo di lavoro. L'ATmega328 ha 6 uscite PWM, 2 si trovano su timer/counter0 (8bit), 2 si trovano su timer/counter1 (16bit) e 2 si trovano su timer/counter2 (8bit). Timer/Counter0 è il dispositivo PWM più semplice sull'ATmega328. Timer/Counter0 è in grado di funzionare in 3 modalità:
- PWM veloce
- PWM con correzione di fase e frequenza
- PWM con correzione di fase
ciascuna di queste modalità può essere invertita o non invertita.
Inizializza Timer0 in modalità PWM:
TCCR0A |=(1 << WGM00)|(1 << WGM01) - imposta WGM: Fast PWM
TCCR0A |= (1 << COM0A1)|(1 << COM0B1) - imposta la modalità di confronto delle uscite A, B
TCCR0B |= (1 << CS02) - imposta timer con prescaler = 256
Passaggio 3: misurazione dell'intensità della luce - ADC e LDR
Il resistore dipendente dalla luce (LDR) è un trasduttore che cambia la sua resistenza quando la luce cade sulla sua superficie cambia.
Gli LDR sono realizzati con materiali semiconduttori per consentire loro di avere le loro proprietà sensibili alla luce. Questi LDR o FOTO RESISTENZE funzionano secondo il principio della “Foto Conduttività”. Ora quello che dice questo principio è che ogni volta che la luce cade sulla superficie dell'LDR (in questo caso) la conduttanza dell'elemento aumenta o in altre parole la resistenza dell'LDR diminuisce quando la luce cade sulla superficie dell'LDR. Questa proprietà della diminuzione della resistenza per l'LDR è ottenuta perché è una proprietà del materiale semiconduttore utilizzato sulla superficie. Gli LDR vengono utilizzati la maggior parte delle volte per rilevare la presenza di luce o per misurare l'intensità della luce.
Per trasferire informazioni continue esterne (informazioni analogiche) in un sistema digitale/calcolo, dobbiamo convertirle in valori interi (digitali). Questo tipo di conversione viene effettuato da Analog to Digital Converter (ADC). Il processo di conversione di un valore analogico in valore digitale è noto come Conversione da analogico a digitale. In breve, i segnali analogici sono segnali del mondo reale intorno a noi come il suono e la luce.
I segnali digitali sono equivalenti analogici in formato digitale o numerico che sono ben compresi dai sistemi digitali come i microcontrollori. L'ADC è uno di questi hardware che misura i segnali analogici e produce un equivalente digitale dello stesso segnale. I microcontrollori AVR hanno una funzione ADC integrata per convertire la tensione analogica in un numero intero. AVR lo converte in un numero a 10 bit nell'intervallo da 0 a 1023.
Usiamo la conversione da analogico a digitale del livello di tensione dal circuito divisore con LDR per misurare l'intensità della luce.
Inizializza ADC:
TADCSRA |= (1<<ADEN) - Abilita ADC
ADCSRA |= (1<<ADPS2)| (1<<ADPS1)| (1ADPS0) - impostare il prescaler ADC = 128
ADMUX = (1 << REFS0) - imposta il riferimento di tensione = AVCC; - impostare Input Channel = ADC0
Guarda il video con una descrizione dettagliata del microcontrollore ADC AVR: Microcontrollore AVR. Misurazione dell'intensità della luce. ADC e LDR
Passaggio 4: controller motore CC e modulo driver motore Dual H-Bridge-L298N
Usiamo driver per motori CC perché i microcontrollori non sono in grado di fornire corrente non superiore a 100 milliampere in generale. I microcontrollori sono intelligenti ma non potenti; questo modulo aggiungerà alcuni muscoli ai microcontrollori per pilotare motori CC ad alta potenza. Può controllare 2 motori DC contemporaneamente fino a 2 amp ciascuno o un motore passo-passo. Possiamo controllare la velocità usando PWM e anche la sua direzione di rotazione dei motori. Inoltre, è utilizzato per guidare la luminosità del nastro LED.
Descrizione del perno:
Porta OUT1 e OUT2, che serve per il collegamento del motore CC. OUT3 e OUT4 per il collegamento del nastro LED.
ENA e ENB sono pin di abilitazione: collegando ENA a high(+5V) si abilita la porta OUT1 e OUT2.
Se colleghi il pin ENA a basso (GND), disabilita OUT1 e OUT2. Allo stesso modo, per ENB e OUT3 e OUT4.
Da IN1 a IN4 sono i pin di ingresso che verranno collegati all'AVR.
Se IN1-high(+5V), IN2-low(GND), OUT1 diventa alto e OUT2 diventa basso, quindi possiamo guidare il motore.
Se IN3-high(+5V), IN4-low(GND), OUT4 diventa alto e OUT3 diventa basso, quindi la luce del nastro LED è accesa.
Se si vuole invertire il senso di rotazione del motore basta invertire la polarità IN1 e IN2, analogamente per IN3 e IN4.
Applicando il segnale PWM a ENA e ENB è possibile controllare la velocità dei motori su due diverse porte di uscita.
La scheda può accettare nominalmente da 7V a 12V.
Ponticelli: ci sono tre pin dei ponticelli; Jumper 1: Se il tuo motore necessita di più di 12V di alimentazione, devi scollegare il Jumper 1 e applicare la tensione desiderata (max 35V) al terminale 12V. Portare un'altra alimentazione a 5V e un ingresso al terminale 5V. Sì, devi inserire 5V se devi applicare più di 12V (quando il Jumper 1 è rimosso).
L'ingresso 5V serve per il corretto funzionamento dell'IC, poiché la rimozione del ponticello disabiliterà il regolatore 5V integrato e proteggerà da una maggiore tensione di ingresso dal terminale 12V.
Il terminale 5V funge da uscita se l'alimentazione è compresa tra 7V e 12V e funge da ingresso se si applicano più di 12V e il ponticello viene rimosso.
Jumper 2 e Jumper 3: se rimuovi questi due jumper devi inserire il segnale di abilitazione e disabilitazione dal microcontrollore, la maggior parte degli utenti preferisce rimuovere i due ponticelli e applicare il segnale dal microcontrollore.
Se mantieni i due ponticelli, l'uscita da OUT1 a OUT4 sarà sempre abilitata. Ricordare il ponticello ENA per OUT1 e OUT2. Ponticello ENB per OUT3 e OUT4.
Passaggio 5: scrittura del codice per un programma in C. Caricamento del file HEX nella memoria flash del microcontrollore
Scrivere e costruire l'applicazione del microcontrollore AVR in codice C utilizzando la piattaforma di sviluppo integrata - Atmel Studio.
#ifndef F_CPU#define F_CPU 16000000UL // indica la frequenza del cristallo del controller (16 MHz AVR ATMega328P) #endif
#include //header per abilitare il controllo del flusso di dati sui pin. Definisce pin, porte, ecc. #include //header per abilitare la funzione di ritardo nel programma
#define BUTTON1 2 // interruttore a pulsante collegato al pin 2 della porta B #define DEBOUNCE_TIME 25 // tempo di attesa durante il pulsante "de-bouncing" #define LOCK_INPUT_TIME 300 // tempo di attesa dopo la pressione di un pulsante
// Timer0, Inizializzazione PWM void timer0_init() { // imposta timer OC0A, pin OC0B in modalità toggle e modalità CTC TCCR0A |= (1 << COM0A1)|(1 << COM0B1)|(1 << WGM00)| (1 << WGM01); // imposta timer con prescaler = 256 TCCR0B |= (1 << CS02); // inizializza il contatore TCNT0 = 0; // inizializza il valore di confronto OCR0A = 0; }
// Inizializzazione ADC void ADC_init() { // Abilita ADC, frequenza di campionamento=osc_freq/128 imposta il prescaler al valore massimo, 128 ADCSRA |= (1<<ADEN) | (1<<ADPS2)| (1<< ADPS1)| (1<<ADPS0);
ADMUX = (1<<REFS0); // Seleziona il riferimento di tensione (AVCC)
// Stato interruttore pulsante unsigned char button_state() {
/* il pulsante viene premuto quando il bit BUTTON1 è azzerato */
if (!(PINB & (1<
{
_delay_ms(DEBOUNCE_TIME);
if (!(PINB & (1<
}
restituisce 0;
}
// Inizializzazione porte void port_init() { DDRB =0b00011011; //PB0-IN1, PB1-IN2, PB3-IN3, PB4-IN4, PB2 - PORTA DIRETTA INTERRUTTORE A PULSANTEB=0b00010110;
DDRD =0b01100000; //PD5-ENB (OC0B), PD6-ENA (OC0A) PORTD=0b00000000;
DDRC =0b00000000; // PC0-ADC PORTC=0b00000000; // Imposta tutti i pin di PORTC bassi che lo disattivano. }
// Questa funzione legge il valore della conversione da analogico a digitale. uint16_t get_LightLevel() { _delay_ms(10); // Attendi un po' che il canale venga selezionato ADCSRA |= (1<<ADSC); // Avvia la conversione ADC impostando il bit ADSC. Scrivi 1 in ADSC
while(ADCSRA & (1<<ADSC)); // Attendi il completamento della conversione
// ADSC diventa di nuovo 0 fino ad allora, esegue il ciclo continuamente _delay_ms(10); ritorno(ADC); // Restituisce il risultato a 10 bit
}
// Questa funzione Rimappa un numero da un intervallo (0-1023) a un altro (0-100). uint32_t map(uint32_t x, uint32_t in_min, uint32_t in_max, uint32_t out_min, uint32_t out_max) { return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; }
int main (vuoto)
{ uint16_t i1=0;
port_init();
timer0_init(); ADC_init(); // inizializzazione ADC
mentre (1)
{ i1=map(get_LightLevel(), 0, 1023, 0, 100);
OCR0A=i1; // Imposta il registro di confronto delle uscite canale A OCR0B=100-i1; // Imposta il canale B del registro di confronto dell'uscita (invertito)
if (button_state()) // Se il pulsante viene premuto, alterna lo stato e il ritardo del LED per 300 ms (#define LOCK_INPUT_TIME) { PORTB ^= (1<<0); // commuta lo stato corrente del pin IN1. PORTB ^= (1<<1); // commuta lo stato corrente del pin IN2. Invertire il senso di rotazione del motore
PORTB ^= (1<<3); // commuta lo stato corrente del pin IN3. PORTB ^= (1<<4); // commuta lo stato corrente del pin IN4. Il nastro LED è spento/acceso. _delay_ms(LOCK_INPUT_TIME); } }; ritorno (0); }
La programmazione è completa. Quindi, costruire e compilare il codice del progetto in un file esadecimale.
Caricamento del file HEX nella memoria flash del microcontrollore: digitare nella finestra del prompt di DOS il comando:
avrdude –c [nome del programmatore] –p m328p –u –U flash:w:[nome del file esadecimale]
Nel mio caso è:
avrdude –c ISPProgv1 –p m328p –u –U flash:w:PWM.hex
Questo comando scrive il file esadecimale nella memoria del microcontrollore. Guarda il video con una descrizione dettagliata della masterizzazione della memoria flash del microcontrollore: Masterizzazione della memoria flash del microcontrollore…
Ok! Ora, il microcontrollore funziona secondo le istruzioni del nostro programma. Controlliamolo!
Passaggio 6: il circuito elettrico
Collegare i componenti secondo il diagramma schematico.
Consigliato:
Visuino Come utilizzare la modulazione di larghezza di impulso (PWM) per modificare la luminosità di un LED: 7 passaggi
Visuino Come utilizzare la modulazione di larghezza di impulso (PWM) per modificare la luminosità di un LED: In questo tutorial utilizzeremo un LED collegato ad Arduino UNO e Visuino per modificare la sua luminosità utilizzando la modulazione di larghezza di impulso (PWM). Guarda un video dimostrativo
Come effettuare la registrazione della temperatura e dell'intensità della luce - Simulazione Proteus - Fritzing - Liono Maker: 5 passaggi
Come effettuare la registrazione della temperatura e dell'intensità della luce | Simulazione Proteus | Fritzing | Liono Maker: Ciao, sono Liono Maker, questo è il mio canale YouTube ufficiale. Questo è un canale YouTube open source. Ecco il link: Canale YouTube di Liono Maker ecco il link del video: Temp & registrazione dell'intensità della luceIn questo tutorial impareremo come creare Temper
RAMPE Visuino per la modulazione dell'ampiezza dell'impulso (PWM) tramite LED: 8 passaggi
Visuino RAMPS for Pulse Width Modulation (PWM) utilizzando LED: in questo tutorial utilizzeremo un LED collegato ad Arduino UNO e Visuino per attenuare il LED utilizzando Pulse Width Modulation (PWM) e il componente Ramps. Guarda un video dimostrativo
Configurazione dei fusibili del microcontrollore AVR. Creazione e caricamento nella memoria flash del microcontrollore del programma di lampeggio dei LED.: 5 passaggi
Configurazione dei fusibili del microcontrollore AVR. Creazione e caricamento nella memoria flash del microcontrollore del LED lampeggiante Program.: In questo caso creeremo un semplice programma in codice C e lo masterizzeremo nella memoria del microcontrollore. Scriveremo il nostro programma e compileremo il file esadecimale, utilizzando Atmel Studio come piattaforma di sviluppo integrata. Configurare il fusibile bi
Torcia LED a modulazione di larghezza di impulso: 8 passaggi
Torcia LED a modulazione di larghezza di impulso: la modulazione di larghezza di impulso (PWM) può essere utilizzata per variare la potenza, la velocità o la luminosità di molti dispositivi. Con i LED, il PWM può essere utilizzato per attenuarli o renderli più luminosi. Li userò per fare una piccola torcia manuale. Un LED può essere oscurato accendendolo rapidamente e