Sisukord:

AVR mikrokontroller. Impulsi laiuse modulatsioon. Alalisvoolumootori ja LED -valgustugevuse regulaator: 6 sammu
AVR mikrokontroller. Impulsi laiuse modulatsioon. Alalisvoolumootori ja LED -valgustugevuse regulaator: 6 sammu

Video: AVR mikrokontroller. Impulsi laiuse modulatsioon. Alalisvoolumootori ja LED -valgustugevuse regulaator: 6 sammu

Video: AVR mikrokontroller. Impulsi laiuse modulatsioon. Alalisvoolumootori ja LED -valgustugevuse regulaator: 6 sammu
Video: M#2: Atmega128 Development Board Pin Mapping | Outseal Dev. PLC Mega 2024, November
Anonim
Image
Image

Tere kõigile!

Pulse Width Modulation (PWM) on telekommunikatsiooni ja võimsuse juhtimisel väga levinud tehnika. seda kasutatakse tavaliselt elektriseadme toiteallika juhtimiseks, olgu see siis mootor, valgusdiood, kõlarid jne. Põhimõtteliselt on see modulatsioonitehnika, mille puhul kandjaimpulsi laiust varieeritakse vastavalt analoogsõnumi signaalile.

Teeme lihtsa elektriahela alalisvoolumootori pöörlemiskiiruse juhtimiseks valguse intensiivsusest sõltuvalt. Valguse intensiivsuse mõõtmiseks kasutame valgusest sõltuvat takisti ja AVR -i mikrokontrolleri funktsioone, nagu analoog -digitaalne teisendus. Samuti kasutame kahekordse H-silla mootoriga draiverimoodulit L298N. Seda kasutatakse tavaliselt mootorite kiiruse ja suuna juhtimiseks, kuid seda saab kasutada ka muude projektide jaoks, näiteks teatud valgustusprojektide heleduse suurendamiseks. Samuti lisati meie vooluringile nupp mootori pöörlemissuuna muutmiseks.

Samm: kirjeldus

Kirjeldus
Kirjeldus
Kirjeldus
Kirjeldus

Igas kehas siin maailmas on mingi inerts. Mootor pöörleb alati, kui see sisse lülitatakse. Niipea kui see välja lülitatakse, kipub see peatuma. Kuid see ei lõpe kohe, see võtab aega. Kuid enne täielikku peatumist lülitatakse see uuesti sisse! Nii hakkab see liikuma. Kuid isegi praegu võtab oma täie kiiruse saavutamiseks aega. Aga enne kui see juhtub, lülitatakse see välja ja nii edasi. Seega on selle tegevuse üldine mõju see, et mootor pöörleb pidevalt, kuid väiksema kiirusega.

Impulsi laiuse modulatsioon (PWM) on suhteliselt uus toite lülitamise tehnika, mis tagab vahepealse koguse elektrienergiat täielikult sisse ja välja lülitatud tasemete vahel. Tavaliselt on digitaalsetel impulssidel sama sisse- ja väljalülitusperiood, kuid mõnel juhul vajame, et digitaalsel impulssil oleks rohkem/vähem aega/väljalülitust. PWM -tehnikas loome nõutud vahepinge väärtuste saamiseks digitaalseid impulsse, mille sisse- ja väljalülitatud olek on ebavõrdne.

Töötsükkel on määratletud kõrgepinge kestuse protsendina täielikus digitaalses impulsis. Seda saab arvutada järgmiselt:

Töötsükli % = T sisse /T (perioodi aeg) x 100

Võtame probleemi avalduse. Peame genereerima 50 Hz PWM -signaali, mille töötsükkel on 45%.

Sagedus = 50 Hz

Ajavahemik, T = T (sees) + T (väljas) = 1/50 = 0,02 s = 20 ms

Töötsükkel = 45%

Seega, lahendades vastavalt ülaltoodud võrrandile, saame

T (sisse lülitatud) = 9 ms

T (väljas) = 11 ms

2. samm: AVR -taimerid - PWM -režiim

AVR -taimerid - PWM -režiim
AVR -taimerid - PWM -režiim
AVR -taimerid - PWM -režiim
AVR -taimerid - PWM -režiim

PWM -i tegemiseks sisaldab AVR eraldi riistvara! Seda kasutades juhendab CPU riistvara tootma konkreetse töötsükli PWM -i. ATmega328 -l on 6 PWM -väljundit, 2 asuvad taimeril/loenduril 0 (8bit), 2 asuvad taimeril/loenduril1 (16bit) ja 2 asuvad taimeril/loenduril 2 (8bit). Taimer/loendur0 on ATmega328 lihtsaim PWM -seade. Taimer/loendur0 on võimeline töötama 3 režiimis:

  • Kiire PWM
  • Faasi ja sagedusega korrigeeritud PWM
  • Faasi korrigeeritud PWM

kõiki neid režiime saab pöörata või mitte.

Taimer0 initsialiseerimine PWM -režiimis:

TCCR0A | = (1 << WGM00) | (1 << WGM01) - seadistage WGM: kiire PWM

TCCR0A | = (1 << COM0A1) | (1 << COM0B1) - seadistage väljundrežiimi A, B võrdlus

TCCR0B | = (1 << CS02) - seadistage taimer eelskaleriga = 256

3. samm: valguse intensiivsuse mõõtmine - ADC ja LDR

Valguse intensiivsuse mõõtmine - ADC ja LDR
Valguse intensiivsuse mõõtmine - ADC ja LDR
Valguse intensiivsuse mõõtmine - ADC ja LDR
Valguse intensiivsuse mõõtmine - ADC ja LDR
Valgustugevuse mõõtmine - ADC ja LDR
Valgustugevuse mõõtmine - ADC ja LDR

Valgusõltuv takisti (LDR) on andur, mis muudab oma takistust, kui selle pinnale langeb valgus.

LDR -id on valmistatud pooljuhtmaterjalidest, et võimaldada neil oma valgustundlikke omadusi. Need LDR -id või fototakistid töötavad fotojuhtivuse põhimõttel. Nüüd ütleb see põhimõte, et kui valgus langeb LDR -i pinnale (antud juhul), suureneb elemendi juhtivus või teisisõnu LDR -i takistus väheneb, kui valgus langeb LDR -i pinnale. See LDR -i takistuse vähenemise omadus saavutatakse, kuna see on pinnal kasutatud pooljuhtmaterjali omadus. LDR -i kasutatakse enamasti valguse olemasolu tuvastamiseks või valguse intensiivsuse mõõtmiseks.

Pideva välisteabe (analoogteabe) digitaalsesse/arvutisüsteemi ülekandmiseks peame need teisendama täisarvulisteks (digitaalseteks) väärtusteks. Seda tüüpi teisendusi teostab analoog -digitaalmuundur (ADC). Analoogväärtuse digitaalseks väärtuseks muundamise protsessi nimetatakse analoogiks digitaalseks teisendamiseks. Lühidalt öeldes on analoogsignaalid reaalse maailma signaalid meie ümber nagu heli ja valgus.

Digitaalsignaalid on digitaalses või numbrilises vormingus analoogsed ekvivalendid, mida digisüsteemid, nagu mikrokontrollerid, hästi mõistavad. ADC on üks selline riistvara, mis mõõdab analoogsignaale ja toodab sama signaali digitaalset ekvivalenti. AVR -i mikrokontrolleritel on sisseehitatud ADC -seade analoogpinge teisendamiseks täisarvuks. AVR teisendab selle 10-bitiseks arvuks vahemikus 0 kuni 1023.

Valguse intensiivsuse mõõtmiseks kasutame LDR -ga jaotusahelast pingetaseme analoog -digitaalmuundurit.

ADC initsialiseerimine:

TADCSRA | = (1 << ADEN) - lubage ADC

ADCSRA | = (1 << ADPS2) | (1 << ADPS1) | (1ADPS0) - seadistage ADC prescaler = 128

ADMUX = (1 << REFS0) - seadistage pinge ülekandmine = AVCC; - seadistage sisendkanal = ADC0

Vaadake videot ADC AVR mikrokontrolleri üksikasjaliku kirjeldusega: AVR Microcontroller. Valguse intensiivsuse mõõtmine. ADC ja LDR

Samm 4: Kontrolleri alalisvoolumootor ja kahe H-sillaga mootori draiverimoodul-L298N

Kontroller alalisvoolumootor ja kahekordse H-silla mootorimootori moodul-L298N
Kontroller alalisvoolumootor ja kahekordse H-silla mootorimootori moodul-L298N
Kontroller alalisvoolumootor ja kahekordse H-silla mootorimootori moodul-L298N
Kontroller alalisvoolumootor ja kahekordse H-silla mootorimootori moodul-L298N
Kontroller alalisvoolumootor ja kahekordse H-silla mootorimootori moodul-L298N
Kontroller alalisvoolumootor ja kahekordse H-silla mootorimootori moodul-L298N

Me kasutame alalisvoolumootori draivereid, kuna mikrokontrollerid ei suuda üldiselt üle 100 milliampi voolu edastada. Mikrokontrollerid on nutikad, kuid mitte tugevad; see moodul lisab mikrokontrolleritele mõningaid lihaseid suure võimsusega alalisvoolumootorite juhtimiseks. See võib juhtida samaaegselt kahte alalisvoolumootorit kuni iga 2 amprit või ühte samm -mootorit. Kiirust saame juhtida PWM abil ja ka mootorite pöörlemissuunda. Samuti kasutati seda LED -lindi heleduse suurendamiseks.

Tihvti kirjeldus:

OUT1 ja OUT2 port, mis on mõeldud alalisvoolumootori ühendamiseks. OUT3 ja OUT4 LED -lindi ühendamiseks.

ENA ja ENB on lubavad tihvtid: ühendades ENA kõrge (+5V), võimaldab see porti OUT1 ja OUT2.

Kui ühendate ENA tihvti madalale (GND), lülitab see OUT1 ja OUT2 välja. Sarnaselt ENB ja OUT3 ja OUT4 jaoks.

IN1 kuni IN4 on sisendpoldid, mis ühendatakse AVR -iga.

Kui IN1-kõrge (+5V), IN2-madal (GND), muutub OUT1 kõrgeks ja OUT2 madalaks, seega saame mootorit juhtida.

Kui IN3-kõrge (+5V), IN4-madal (GND), muutub OUT4 kõrgeks ja OUT3 madalaks, seega põleb LED-lindi tuli.

Kui soovite mootori pöörlemissuunda ümber pöörata, pöörake lihtsalt IN1 ja IN2 polaarsust, sarnaselt IN3 ja IN4.

Rakendades ENA ja ENB PWM -signaali, saate juhtida mootorite kiirust kahel erineval väljundpordil.

Tahvel võib aktsepteerida nominaalselt 7V kuni 12V.

Džemprid: on kolm hüppajanõela; Jumper 1: Kui teie mootor vajab rohkem kui 12 V toite, peate lüliti 1 lahti ühendama ja rakendama 12 V klemmile soovitud pinge (max 35 V). Tooge veel 5V toide ja sisend 5V terminali. Jah, peate sisestama 5 V, kui peate rakendama rohkem kui 12 V (kui hüppaja 1 eemaldatakse).

5 V sisend on IC nõuetekohaseks toimimiseks, kuna hüppaja eemaldamine lülitab sisseehitatud 5 V regulaatori välja ja kaitseb kõrgema sisendpinge eest 12 V klemmilt.

5 V klemm toimib väljundina, kui teie toide on vahemikus 7 V kuni 12 V, ja sisendina, kui kasutate rohkem kui 12 V pinget ja hüppaja eemaldatakse.

Jumper 2 ja Jumper 3: Kui eemaldate need kaks hüppajat, peate sisestama mikrokontrolleri lubamise ja keelamise signaali, enamik kasutajaid eelistab kahe hüppaja eemaldamist ja mikrokontrolleri signaali rakendamist.

Kui hoiate kaks džemprit, on OUT1 kuni OUT4 alati lubatud. Pidage meeles ENA hüppajaid OUT1 ja OUT2 jaoks. ENB hüppaja OUT3 ja OUT4 jaoks.

Samm: programmi koodi kirjutamine C -s. HEX -faili üleslaadimine mikrokontrolleri välkmällu

AVR -i mikrokontrolleri rakenduse kirjutamine ja ehitamine C -koodis, kasutades integreeritud arendusplatvormi - Atmel Studio.

#ifndef F_CPU #define F_CPU 16000000UL // teatades kontrolleri kristallisagedusele (16 MHz AVR ATMega328P) #endif

#include // päis, et võimaldada andmevoo juhtimist nööpnõelte üle. Määrab tihvtid, pordid jne. #Include // päis, et lubada programmi viivitusfunktsioon

#define BUTTON1 2 // nupu lüliti, mis on ühendatud pordiga B tihvt 2 #define DEBOUNCE_TIME 25 // aeg oodata, kuni nupp "tagasilöök" #define LOCK_INPUT_TIME 300 // aeg oodata pärast nupuvajutust

// Taimer0, PWM -i initsialiseerimine void timer0_init () {// seadistage taimer OC0A, OC0B pin lülitusrežiimis ja CTC -režiim TCCR0A | = (1 << COM0A1) | (1 << COM0B1) | (1 << WGM00) | (1 << WGM01); // seadistage taimer eelskaleriga = 256 TCCR0B | = (1 << CS02); // lähtestada loendur TCNT0 = 0; // initsialiseeri võrdlusväärtus OCR0A = 0; }

// ADC initsialiseerimine tühine ADC_init () {// Luba ADC, diskreetimissagedus = osc_freq/128 seadista eelpinge maksimumväärtuseks, 128 ADCSRA | = (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0);

ADMUX = (1 << REFS0); // Valige pinge viide (AVCC)

// Nupulüliti olek allkirjastamata char button_state () {

/ * nuppu vajutatakse, kui BUTTON1 bit on selge */

kui (! (PINB & (1 <

{

_delay_ms (DEBOUNCE_TIME);

kui (! (PINB & (1 <

}

tagasitulek 0;

}

// Portide initsialiseerimine tühine port_init () {DDRB = 0b00011011; // PB0-IN1, PB1-IN2, PB3-IN3, PB4-IN4, PB2-NUPPLÜLITI OTSE PORTB = 0b00010110;

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

DDRC = 0b00000000; // PC0-ADC PORTC = 0b00000000; // Seadke kõik PORTC tihvtid madalaks, mis selle välja lülitab. }

// See funktsioon loeb analoog -digitaalmuunduri väärtust. uint16_t get_LightLevel () {_delay_ms (10); // Oota mõnda aega, kuni kanal saab valitud ADCSRA | = (1 << ADSC); // Alustage ADC teisendamist, määrates ADSC bit. Kirjutage ADSC -le 1

samas (ADCSRA & (1 << ADSC)); // Oodake konversiooni lõpuleviimist

// ADSC muutub seni 0 -ks, jookse tsüklit pidevalt _delay_ms (10); tagasipöördumine (ADC); // Tagastab 10-bitise tulemuse

}

// See funktsioon kaardistab arvu ühest vahemikust (0-1023) teise (0-100). uint32_t kaart (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 (tühine)

{uint16_t i1 = 0;

port_init ();

timer0_init (); ADC_init (); // initsialiseerimine ADC

samas (1)

{i1 = kaart (get_LightLevel (), 0, 1023, 0, 100);

OCR0A = i1; // Määra väljundi võrdlusregistri kanal A OCR0B = 100-i1; // Määra väljundi võrdlusregistri kanal B (ümberpööratud)

if (button_state ()) // Kui nuppu vajutatakse, lülitage LED -i olekut ja viivitust 300 ms (#define LOCK_INPUT_TIME) {PORTB ^= (1 << 0); // nööpnõela hetkeoleku vahetamine IN1. PORTB ^= (1 << 1); // nööpnõela IN2 hetkeoleku vahetamine. Pöörake mootori pöörlemissuunda

PORTB ^= (1 << 3); // tihvti IN3 hetkeoleku vahetamine. PORTB ^= (1 << 4); // tihvti hetkeoleku vahetamine IN4. LED -lint on välja/välja lülitatud. _delay_ms (LOCK_INPUT_TIME); }}; tagasitulek (0); }

Programmeerimine on lõpetatud. Järgmisena projekti koodi koostamine ja kompileerimine hex -failiks.

HEX -faili üleslaadimine mikrokontrolleri välkmällu: tippige DOS -i viipaknasse käsk:

avrdude –c [programmeerija nimi] –p m328p –u –U flash: w: [teie hex -faili nimi]

Minu puhul on see:

avrdude –c ISPProgv1 –p m328p –u –U välk: w: PWM.hex

See käsk kirjutab hex -faili mikrokontrolleri mällu. Vaadake videot mikrokontrolleri välkmälu põletamise üksikasjaliku kirjeldusega: Mikrokontrolleri välkmälu põletamine…

Okei! Nüüd töötab mikrokontroller vastavalt meie programmi juhistele. Vaatame üle!

6. samm: elektriline vooluahel

Elektriahel
Elektriahel
Elektriahel
Elektriahel

Ühendage komponendid vastavalt skemaatilisele skeemile.

Soovitan: