Cuprins:

Microcontroler AVR. Modulația lățimii pulsului. Controler al intensității luminii cu motor DC și LED: 6 pași
Microcontroler AVR. Modulația lățimii pulsului. Controler al intensității luminii cu motor DC și LED: 6 pași

Video: Microcontroler AVR. Modulația lățimii pulsului. Controler al intensității luminii cu motor DC și LED: 6 pași

Video: Microcontroler AVR. Modulația lățimii pulsului. Controler al intensității luminii cu motor DC și LED: 6 pași
Video: Complete guide to PCA9685 16 channel Servo controller for Arduino with code Version of 5 ( V1) 2024, Decembrie
Anonim
Image
Image

Bună ziua tuturor!

Modularea lățimii pulsului (PWM) este o tehnică foarte comună în telecomunicații și controlul puterii. este folosit în mod obișnuit pentru a controla puterea alimentată către un dispozitiv electric, fie că este un motor, un LED, difuzoare etc. Este practic o tehnică de modulație, în care lățimea impulsului purtătorului variază în conformitate cu semnalul de mesaj analogic.

Realizăm un circuit electric simplu pentru a controla viteza de rotație a motorului DC în funcție de intensitatea luminii. Vom folosi funcții de rezistență dependentă de lumină și microcontroler AVR, cum ar fi Conversia analogică la digitală, pentru a măsura intensitatea luminii. De asemenea, vom folosi Dual H-Bridge Motor Driver Module-L298N. Este de obicei utilizat pentru controlul vitezei și direcției motoarelor, dar poate fi utilizat pentru alte proiecte, cum ar fi conducerea luminozității anumitor proiecte de iluminat. De asemenea, am adăugat un buton la circuitul nostru pentru a comuta direcția de rotație a motorului.

Pasul 1: Descriere

Descriere
Descriere
Descriere
Descriere

Fiecare corp din această lume are o oarecare inerție. Motorul se rotește ori de câte ori este pornit. De îndată ce este oprit, va tinde să se oprească. Dar nu se oprește imediat, durează ceva timp. Dar înainte de a se opri complet, este pornit din nou! Astfel începe să se miște. Dar chiar și acum, este nevoie de ceva timp pentru a atinge viteza maximă. Dar înainte să se întâmple, este oprit și așa mai departe. Astfel, efectul general al acestei acțiuni este acela că motorul se rotește continuu, dar cu o viteză mai mică.

Modularea lățimii pulsului (PWM) este o tehnică de comutare relativ recentă a puterii pentru furnizarea unor cantități intermediare de energie electrică între nivelurile complet pornite și complet oprite. De obicei, impulsurile digitale au aceeași perioadă de timp de pornire și oprire, dar în unele situații avem nevoie de impulsul digital pentru a avea mai mult / mai puțin la timp / oprire. În tehnica PWM, creăm impulsuri digitale cu o cantitate inegală de stare de pornire și oprire pentru a obține valorile de tensiune intermediare necesare.

Ciclul de funcționare este definit de procentul duratei de înaltă tensiune într-un impuls digital complet. Poate fi calculat prin:

% din ciclul de funcționare = T on / T (perioada perioadei) x 100

Să luăm o declarație de problemă. Trebuie să generăm un semnal PWM de 50 Hz cu un ciclu de funcționare de 45%.

Frecvență = 50 Hz

Perioada de timp, T = T (pornit) + T (oprit) = 1/50 = 0,02 s = 20 ms

Ciclul de funcționare = 45%

Astfel, rezolvând conform ecuației date mai sus, obținem

T (pornit) = 9 ms

T (oprit) = 11 ms

Pasul 2: Cronometre AVR - Mod PWM

Timere AVR - Mod PWM
Timere AVR - Mod PWM
Timere AVR - Mod PWM
Timere AVR - Mod PWM

Pentru realizarea PWM, AVR conține hardware separat! Utilizând acest lucru, CPU instruiește hardware-ul să producă PWM pentru un anumit ciclu de funcționare. ATmega328 are 6 ieșiri PWM, 2 sunt localizate pe temporizator / contor0 (8 biți), 2 sunt localizate pe temporizator / contor1 (16 biți), iar 2 sunt localizate pe temporizator / contor2 (8 biți). Timer / Counter0 este cel mai simplu dispozitiv PWM de pe ATmega328. Timer / Counter0 este capabil să ruleze în 3 moduri:

  • PWM rapid
  • PWM corectat în fază și frecvență
  • PWM corectat în fază

fiecare dintre aceste moduri poate fi inversat sau neinversat.

Inițializați Timer0 în modul PWM:

TCCR0A | = (1 << WGM00) | (1 << WGM01) - configurați WGM: PWM rapid

TCCR0A | = (1 << COM0A1) | (1 << COM0B1) - configurați compararea modului de ieșire A, B

TCCR0B | = (1 << CS02) - configurați temporizatorul cu prescaler = 256

Pasul 3: Măsurarea intensității luminii - ADC și LDR

Măsurarea intensității luminii - ADC și LDR
Măsurarea intensității luminii - ADC și LDR
Măsurarea intensității luminii - ADC și LDR
Măsurarea intensității luminii - ADC și LDR
Măsurarea intensității luminii - ADC și LDR
Măsurarea intensității luminii - ADC și LDR

Light Dependent Resistor (LDR) este un traductor care își schimbă rezistența atunci când lumina cade pe suprafața sa.

LDR-urile sunt fabricate din materiale semiconductoare pentru a le permite să aibă proprietățile lor sensibile la lumină. Aceste LDR sau REZISTENTE FOTO funcționează pe principiul „Conductivității fotografice”. Acum, ceea ce spune acest principiu este de fiecare dată când lumina cade pe suprafața LDR (în acest caz), conductanța elementului crește sau, cu alte cuvinte, rezistența LDR scade atunci când lumina cade pe suprafața LDR. Această proprietate a scăderii rezistenței pentru LDR este atinsă deoarece este o proprietate a materialului semiconductor utilizat la suprafață. LDR sunt utilizate de cele mai multe ori pentru a detecta prezența luminii sau pentru măsurarea intensității luminii.

Pentru transferul informațiilor externe continue (informații analogice) într-un sistem digital / de calcul, trebuie să le convertim în valori întregi (digitale). Acest tip de conversie este realizat de convertorul analogic la digital (ADC). Procesul de conversie a unei valori analogice în valoare digitală este cunoscut sub numele de Conversie analogică în digitală. Pe scurt, semnalele analogice sunt semnale din lumea reală din jurul nostru, precum sunetul și lumina.

Semnalele digitale sunt echivalente analogice în format digital sau numeric, care sunt bine înțelese de sistemele digitale, cum ar fi microcontrolerele. ADC este un astfel de hardware care măsoară semnalele analogice și produce un echivalent digital al aceluiași semnal. Microcontrolerele AVR au facilitatea ADC încorporată pentru a converti tensiunea analogică într-un număr întreg. AVR îl convertește în număr de 10 biți din intervalul 0-1023.

Folosim conversia analogică la digitală a nivelului de tensiune din circuitul divizor cu LDR pentru a măsura intensitatea luminii.

Inițializați ADC:

TADCSRA | = (1 << ADEN) - Activați ADC

ADCSRA | = (1 << ADPS2) | (1 << ADPS1) | (1ADPS0) - configurați ADC prescaler = 128

ADMUX = (1 << REFS0) - setare referință tensiune = AVCC; - configurați canalul de intrare = ADC0

Urmăriți videoclipul cu o descriere detaliată a microcontrolerului ADC AVR: microcontrolerul AVR. Măsurarea intensității luminii. ADC și LDR

Pasul 4: Controler DC Motor & Dual H-Bridge Motor Driver Module-L298N

Controler DC Motor & Dual H-Bridge Motor Driver Module-L298N
Controler DC Motor & Dual H-Bridge Motor Driver Module-L298N
Controler DC Motor & Dual H-Bridge Motor Driver Module-L298N
Controler DC Motor & Dual H-Bridge Motor Driver Module-L298N
Controler DC Motor & Dual H-Bridge Motor Driver Module-L298N
Controler DC Motor & Dual H-Bridge Motor Driver Module-L298N

Folosim drivere de motor DC, deoarece microcontrolerele nu sunt capabile să furnizeze curent de cel mult 100 miliamperi în general. Microcontrolerele sunt inteligente, dar nu sunt puternice; acest modul va adăuga niște mușchi microcontrolerelor pentru a conduce motoare de curent continuu de mare putere. Poate controla 2 motoare de curent continuu simultan până la 2 amperi fiecare sau un motor pas cu pas. Putem controla viteza folosind PWM și, de asemenea, direcția de rotație a motoarelor. De asemenea, este folosit pentru a conduce luminozitatea benzii LED.

Descrierea pinului:

Porturile OUT1 și OUT2, care este pentru conectarea motorului de curent continuu. OUT3 și OUT4 pentru conectarea benzii LED.

ENA și ENB sunt pini de activare: prin conectarea ENA la high (+ 5V) permite porturile OUT1 și OUT2.

Dacă conectați pinul ENA la low (GND), acesta dezactivează OUT1 și OUT2. În mod similar, pentru ENB și OUT3 și OUT4.

IN1 la IN4 sunt pinii de intrare care vor fi conectați la AVR.

Dacă IN1-ridicat (+ 5V), IN2-redus (GND), OUT1 devine ridicat și OUT2 devine redus, astfel putem conduce motorul.

Dacă IN3-high (+ 5V), IN4-low (GND), OUT4 devine înalt și OUT3 devine scăzut, astfel lumina cu bandă LED este aprinsă.

Dacă doriți să inversați direcția de rotație a motorului, inversați polaritatea IN1 și IN2, în mod similar pentru IN3 și IN4.

Prin aplicarea semnalului PWM la ENA și ENB puteți controla viteza motoarelor pe două porturi de ieșire diferite.

Placa poate accepta de la 7V la 12V nominal.

Jersee: Există trei știfturi; Jumper 1: Dacă motorul are nevoie de mai mult de 12V alimentare, trebuie să deconectați Jumper 1 și să aplicați tensiunea dorită (maxim 35V) la terminalul de 12V. Aduceți o altă sursă și intrare de 5V la terminalul de 5V. Da, trebuie să introduceți 5V dacă trebuie să aplicați mai mult de 12V (când Jumper 1 este eliminat).

Intrarea de 5V este pentru buna funcționare a IC-ului, deoarece scoaterea jumperului va dezactiva regulatorul încorporat de 5V și va proteja de tensiunea de intrare mai mare de la terminalul de 12V.

Terminalul de 5V acționează ca ieșire dacă alimentarea dvs. este între 7V și 12V și acționează ca intrare dacă aplicați mai mult de 12V și jumperul este îndepărtat.

Jumper 2 și Jumper 3: Dacă eliminați aceste două jumperi, trebuie să introduceți semnalul de activare și dezactivare din microcontroler, majoritatea utilizatorilor preferă să elimine cei doi jumperi și să aplice semnalul din microcontroler.

Dacă păstrați cele două jumperi, OUT1 la OUT4 vor fi întotdeauna activate. Amintiți-vă jumperul ENA pentru OUT1 și OUT2. Jumper ENB pentru OUT3 și OUT4.

Pasul 5: Scrierea codului pentru un program în C. Încărcarea fișierului HEX în memoria flash a microcontrolerului

Scrierea și construirea aplicației de microcontroler AVR în cod C folosind platforma de dezvoltare integrată - Atmel Studio.

#ifndef F_CPU # define F_CPU 16000000UL // indicând frecvența cristalului controlerului (16 MHz AVR ATMega328P) #endif

#include // header pentru a permite controlul fluxului de date peste pini. Definește pini, porturi etc. #include // header pentru a activa funcția de întârziere în program

#define BUTTON1 2 // comutator buton conectat la portul B pin 2 #define DEBOUNCE_TIME 25 // timp de așteptare în timp ce butonul „de-bouncing” #define LOCK_INPUT_TIME 300 // timp de așteptare după apăsarea unui buton

// Timer0, PWM Initialization void timer0_init () {// setează temporizatorul OC0A, pinul OC0B în modul de comutare și modul CTC TCCR0A | = (1 << COM0A1) | (1 << COM0B1) | (1 << WGM00) | (1 << WGM01); // configurați temporizatorul cu prescaler = 256 TCCR0B | = (1 << CS02); // inițializează contorul TCNT0 = 0; // inițializează valoarea de comparare OCR0A = 0; }

// ADC Initialization void ADC_init () {// Activați ADC, eșantionarea frecv = osc_freq / 128 setați prescalerul la valoarea maximă, 128 ADCSRA | = (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0);

ADMUX = (1 << REFS0); // Selectați tensiunea de referință (AVCC)

// Starea comutatorului de buton fără semn char button_state () {

/ * butonul este apăsat când butonul BUTTON1 bit este liber * /

if (! (PINB & (1 <

{

_delay_ms (DEBOUNCE_TIME);

if (! (PINB & (1 <

}

retur 0;

}

// Ports Initialization void port_init () {DDRB = 0b00011011; // PB0-IN1, PB1-IN2, PB3-IN3, PB4-IN4, PB2 - COMUTATOR BUTON DIRECT PORTB = 0b00010110;

DDRD = 0b01100000; // PD5-ENB (OC0B), PD6-ENA (OC0A) PORTD = 0b00000000;

DDRC = 0b00000000; // PC0-ADC PORTC = 0b00000000; // Setați toți pinii PORTC jos, ceea ce îl oprește. }

// Această funcție citește valoarea conversiei analogice în digitale. uint16_t get_LightLevel () {_delay_ms (10); // Așteptați un timp pentru ca canalul să fie selectat ADCSRA | = (1 << ADSC); // Porniți conversia ADC setând bitul ADSC. Scrieți 1 către ADSC

while (ADCSRA & (1 << ADSC)); // Așteptați finalizarea conversiei

// ADSC devine din nou 0 până atunci, rulează bucla continuu _delay_ms (10); returnare (ADC); // Returnează rezultatul de 10 biți

}

// Această funcție Re-mapează un număr dintr-un interval (0-1023) în altul (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 (nul)

{uint16_t i1 = 0;

port_init ();

timer0_init (); ADC_init (); // inițializare ADC

în timp ce (1)

{i1 = hartă (get_LightLevel (), 0, 1023, 0, 100);

OCR0A = i1; // Setați compararea canalului de înregistrare de ieșire A OCR0B = 100-i1; // Setați compararea canalului de înregistrare de ieșire B (inversat)

if (button_state ()) // Dacă butonul este apăsat, comutați starea și întârzierea LED-ului pentru 300ms (#define LOCK_INPUT_TIME) {PORTB ^ = (1 << 0); // comutarea stării curente a pinului IN1. PORTB ^ = (1 << 1); // comutarea stării curente a pinului IN2. Inversați direcția de rotație a motorului

PORTB ^ = (1 << 3); // comutarea stării curente a pinului IN3. PORTB ^ = (1 << 4); // comutarea stării curente a pinului IN4. Banda LED este oprită / pornită. _delay_ms (LOCK_INPUT_TIME); }}; returnare (0); }

Programarea este completă. Apoi, construirea și compilarea codului de proiect într-un fișier hex.

Încărcarea fișierului HEX în memoria flash a microcontrolerului: tastați în fereastra de prompt DOS comanda:

avrdude –c [nume programator] –p m328p –u –U flash: w: [numele fișierului dvs. hex

În cazul meu este:

avrdude –c ISPProgv1 –p m328p –u –U flash: w: PWM.hex

Această comandă scrie un fișier hexagonal în memoria microcontrolerului. Urmăriți videoclipul cu o descriere detaliată a arderii memoriei flash a microcontrolerului: arderea memoriei flash a microcontrolerului …

Bine! Acum, microcontrolerul funcționează în conformitate cu instrucțiunile programului nostru. Hai să verificăm!

Pasul 6: Circuitul electric

Circuitul electric
Circuitul electric
Circuitul electric
Circuitul electric

Conectați componentele în conformitate cu diagrama schematică.

Recomandat: