Turinys:

AVR mikrovaldiklis. Impulsų pločio moduliavimas. Nuolatinės srovės variklio ir LED šviesos intensyvumo valdiklis: 6 žingsniai
AVR mikrovaldiklis. Impulsų pločio moduliavimas. Nuolatinės srovės variklio ir LED šviesos intensyvumo valdiklis: 6 žingsniai

Video: AVR mikrovaldiklis. Impulsų pločio moduliavimas. Nuolatinės srovės variklio ir LED šviesos intensyvumo valdiklis: 6 žingsniai

Video: AVR mikrovaldiklis. Impulsų pločio moduliavimas. Nuolatinės srovės variklio ir LED šviesos intensyvumo valdiklis: 6 žingsniai
Video: ESP32 Tutorial 15 - DC Motor Speed Control with ESP32 L293D | SunFounder's ESP32 IoT Learnig kit 2024, Gruodis
Anonim
Image
Image

Sveiki visi!

Impulsų pločio moduliacija (PWM) yra labai paplitusi telekomunikacijų ir galios valdymo technika. jis dažniausiai naudojamas valdyti elektros prietaisui tiekiamą galią, nesvarbu, ar tai būtų variklis, ar šviesos diodas, ar garsiakalbiai, ir tt. Iš esmės tai yra moduliacijos technika, kai nešiklio impulsų plotis keičiamas pagal analoginio pranešimo signalą..

Mes sukuriame paprastą elektros grandinę, skirtą valdyti nuolatinės srovės variklio sukimosi greitį priklausomai nuo šviesos intensyvumo. Šviesos intensyvumui matuoti naudosime nuo šviesos priklausomą rezistorių ir AVR mikrovaldiklio funkcijas, tokias kaip analoginis į skaitmeninį konvertavimą. Taip pat ketiname naudoti dvigubo H tilto variklio tvarkyklės modulį-L298N. Paprastai jis naudojamas valdant variklių greitį ir kryptį, tačiau gali būti naudojamas kitiems projektams, pavyzdžiui, tam tikrų apšvietimo projektų ryškumui didinti. Be to, prie mūsų grandinės pridėtas mygtukas, skirtas perjungti variklio sukimosi kryptį.

1 žingsnis: aprašymas

apibūdinimas
apibūdinimas
apibūdinimas
apibūdinimas

Kiekvienas šio pasaulio kūnas turi tam tikrą inerciją. Variklis sukasi, kai tik įjungiamas. Kai tik jis bus išjungtas, jis sustos. Bet tai nesustoja iš karto, tam reikia šiek tiek laiko. Bet kol jis visiškai nesustoja, jis vėl įjungiamas! Taip jis pradeda judėti. Tačiau net ir dabar reikia šiek tiek laiko, kad pasiektų visą greitį. Bet prieš tai atsitinka, jis išjungiamas ir pan. Taigi bendras šio veiksmo poveikis yra tas, kad variklis sukasi nuolat, bet mažesniu greičiu.

Impulsų pločio moduliacija (PWM) yra palyginti nauja energijos perjungimo technika, skirta tiekti tarpinį elektros energijos kiekį tarp visiškai įjungto ir visiškai išjungto lygio. Paprastai skaitmeniniai impulsai turi tą patį įjungimo ir išjungimo laikotarpį, tačiau kai kuriais atvejais mums reikia, kad skaitmeninis impulsas turėtų daugiau/mažiau laiko/neveikimo laiko. Naudodami PWM techniką, mes sukuriame skaitmeninius impulsus, kurių įjungimo ir išjungimo būsena yra nevienoda, kad gautume reikiamas tarpines įtampos vertes.

Darbo ciklą apibrėžia aukšto įtampos trukmės procentas visu skaitmeniniu impulsu. Jį galima apskaičiuoti taip:

Darbo ciklo % = T įjungta /T (laikotarpis) x 100

Paimkime problemos pareiškimą. Turime generuoti 50 Hz PWM signalą, kurio darbo ciklas yra 45%.

Dažnis = 50 Hz

Laikotarpis, T = T (įjungtas) + T (išjungtas) = 1/50 = 0,02 s = 20 ms

Darbo ciklas = 45%

Taigi, sprendžiant pagal aukščiau pateiktą lygtį, gauname

T (įjungta) = 9 ms

T (išjungta) = 11 ms

2 žingsnis: AVR laikmačiai - PWM režimas

AVR laikmačiai - PWM režimas
AVR laikmačiai - PWM režimas
AVR laikmačiai - PWM režimas
AVR laikmačiai - PWM režimas

Norėdami sukurti PWM, AVR turi atskirą aparatūrą! Naudodamas tai, procesorius nurodo aparatinei įrangai gaminti tam tikro darbo ciklo PWM. „ATmega328“turi 6 PWM išėjimus, 2 yra laikmatyje/skaitiklyje0 (8 bitai), 2 yra laikmatyje/skaitiklyje1 (16 bitų), o 2 yra laikmatyje/skaitiklyje2 (8 bitai). „Timer/Counter0“yra paprasčiausias PWM įrenginys „ATmega328“. Laikmatis/skaitiklis0 gali veikti 3 režimais:

  • Greitas PWM
  • Fazių ir dažnių pataisytas PWM
  • Fazės pataisytas PWM

kiekvienas iš šių režimų gali būti apverstas arba neapverstas.

Inicijuokite „Timer0“PWM režimu:

TCCR0A | = (1 << WGM00) | (1 << WGM01) - nustatyti WGM: greitas PWM

TCCR0A | = (1 << COM0A1) | (1 << COM0B1) - nustatykite palyginimo išvesties režimą A, B

TCCR0B | = (1 << CS02) - nustatykite laikmatį su prescaler = 256

3 žingsnis: šviesos intensyvumo matavimas - ADC ir LDR

Šviesos intensyvumo matavimas - ADC ir LDR
Šviesos intensyvumo matavimas - ADC ir LDR
Šviesos intensyvumo matavimas - ADC ir LDR
Šviesos intensyvumo matavimas - ADC ir LDR
Šviesos intensyvumo matavimas - ADC ir LDR
Šviesos intensyvumo matavimas - ADC ir LDR

Nuo šviesos priklausomas rezistorius (LDR) yra keitiklis, kuris keičia savo atsparumą pasikeitus šviesai ant jo paviršiaus.

LDR yra pagaminti iš puslaidininkinių medžiagų, kad jie turėtų šviesai jautrias savybes. Šie LDR arba FOTO REZISTORIAI veikia „fotolaidumo“principu. Dabar šis principas sako, kad kai šviesa patenka ant LDR paviršiaus (šiuo atveju), elemento laidumas padidėja arba, kitaip tariant, LDR pasipriešinimas sumažėja, kai šviesa patenka ant LDR paviršiaus. Ši LDR atsparumo sumažėjimo savybė pasiekiama, nes ji yra paviršiuje naudojamos puslaidininkinės medžiagos savybė. LDR dažniausiai naudojamas šviesos buvimui aptikti arba šviesos intensyvumui matuoti.

Norėdami perkelti išorinę nepertraukiamą informaciją (analoginę informaciją) į skaitmeninę/skaičiavimo sistemą, turime ją paversti sveiku skaičiumi (skaitmenine). Šio tipo konvertavimą atlieka analoginis skaitmeninis keitiklis (ADC). Analoginės vertės konvertavimo į skaitmeninę vertę procesas vadinamas analoginiu į skaitmeninį konvertavimą. Trumpai tariant, analoginiai signalai yra realaus pasaulio signalai aplink mus, kaip garsas ir šviesa.

Skaitmeniniai signalai yra analoginiai skaitmeninio ar skaitmeninio formato atitikmenys, kuriuos gerai supranta skaitmeninės sistemos, tokios kaip mikrovaldikliai. ADC yra tokia aparatinė įranga, kuri matuoja analoginius signalus ir sukuria to paties signalo skaitmeninį atitikmenį. AVR mikrovaldikliai turi įmontuotą ADC galimybę analoginę įtampą paversti sveiku skaičiumi. AVR konvertuoja jį į 10 bitų skaičių nuo 0 iki 1023.

Šviesos intensyvumui matuoti naudojame įtampos lygio konverterį iš daliklio grandinės su LDR iš analoginio į skaitmeninį.

Inicijuoti ADC:

TADCSRA | = (1 << ADEN) - įjungti ADC

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

ADMUX = (1 << REFS0) - įtampos nustatymas = AVCC; - nustatyti įvesties kanalą = ADC0

Žiūrėkite vaizdo įrašą su išsamiu ADC AVR mikrovaldiklio aprašymu: AVR Microcontroller. Šviesos intensyvumo matavimas. ADC ir LDR

4 veiksmas: valdiklio nuolatinės srovės variklis ir dvigubas H tilto variklio tvarkyklės modulis-L298N

Valdiklio nuolatinės srovės variklis ir dvigubas H tilto variklio tvarkyklės modulis-L298N
Valdiklio nuolatinės srovės variklis ir dvigubas H tilto variklio tvarkyklės modulis-L298N
Valdiklio nuolatinės srovės variklis ir dvigubas H tilto variklio tvarkyklės modulis-L298N
Valdiklio nuolatinės srovės variklis ir dvigubas H tilto variklio tvarkyklės modulis-L298N
Valdiklio nuolatinės srovės variklis ir dvigubas H tilto variklio tvarkyklės modulis-L298N
Valdiklio nuolatinės srovės variklis ir dvigubas H tilto variklio tvarkyklės modulis-L298N

Mes naudojame nuolatinės srovės variklių tvarkykles, nes mikrovaldikliai apskritai negali tiekti srovės, ne didesnės kaip 100 miliamperų. Mikrovaldikliai yra protingi, bet ne stiprūs; šis modulis papildys kai kuriuos raumenis prie mikrovaldiklių, kad galėtų valdyti didelės galios nuolatinės srovės variklius. Jis vienu metu gali valdyti 2 nuolatinės srovės variklius iki 2 amperų arba vieną žingsninį variklį. Mes galime valdyti greitį naudodami PWM ir variklių sukimosi kryptį. Be to, jis naudojamas LED juostos ryškumui didinti.

Smeigtuko aprašymas:

OUT1 ir OUT2 prievadas, skirtas nuolatinės srovės varikliui prijungti. OUT3 ir OUT4, skirti prijungti LED juostą.

ENA ir ENB yra įjungimo kaiščiai: prijungus ENA prie aukštos (+5 V) jungties, įjungiami OUT1 ir OUT2 prievadai.

Jei prijungsite ENA kaištį prie žemo (GND), jis išjungs OUT1 ir OUT2. Panašiai ENB ir OUT3 ir OUT4.

Nuo IN1 iki IN4 yra įvesties kaiščiai, kurie bus prijungti prie AVR.

Jei IN1-aukštas (+5V), IN2-žemas (GND), OUT1 tampa aukštas, o OUT2-žemas, todėl galime valdyti variklį.

Jei IN3-aukštas (+5V), IN4-žemas (GND), OUT4 tampa aukštas, o OUT3-žemas, todėl užsidega LED juostos lemputė.

Jei norite pakeisti variklio sukimosi kryptį, tiesiog pakeiskite IN1 ir IN2 poliškumą, panašiai kaip ir IN3 ir IN4.

Taikydami PWM signalą ENA ir ENB, galite valdyti dviejų skirtingų išėjimų prievadų variklių greitį.

Plokštė gali priimti nuo 7V iki 12V nominaliai.

Džemperiai: Yra trys trumpikliai; 1 trumpiklis: Jei jūsų varikliui reikia daugiau nei 12 V maitinimo šaltinio, turite atjungti 1 jungiklį ir 12 V gnybte įjungti norimą įtampą (maks. 35 V). Atneškite kitą 5 V maitinimą ir įvestį į 5 V terminalą. Taip, turite įvesti 5 V įtampą, jei reikia naudoti daugiau nei 12 V įtampą (kai pašalinamas trumpiklis 1).

5 V įėjimas skirtas tinkamam IC veikimui, nes pašalinus trumpiklį, bus išjungtas įmontuotas 5 V reguliatorius ir apsaugota nuo didesnės įėjimo įtampos iš 12 V gnybto.

5 V gnybtas veikia kaip išėjimas, jei jūsų maitinimas yra nuo 7 V iki 12 V, ir veikia kaip įvestis, jei naudojate daugiau nei 12 V įtampą, o trumpiklis pašalinamas.

2 ir 3 jungiklis: Jei pašalinsite šiuos du trumpiklius, turite įvesti įjungimo ir išjungimo signalą iš mikrovaldiklio, dauguma vartotojų nori pašalinti du trumpiklius ir pritaikyti signalą iš mikrovaldiklio.

Jei išlaikysite du trumpiklius, OUT1 į OUT4 visada bus įjungtas. Prisiminkite ENA trumpiklį OUT1 ir OUT2. ENB trumpiklis OUT3 ir OUT4.

5 veiksmas: programos kodo rašymas C. Įkeliant HEX failą į mikrovaldiklio „Flash“atmintį

AVR mikrovaldiklio programos rašymas ir kūrimas naudojant C kodą naudojant integruotą kūrimo platformą - „Atmel Studio“.

#ifndef F_CPU #define F_CPU 16000000UL // nurodantis valdiklio kristalų dažnį (16 MHz AVR ATMega328P) #endif

#include // antraštė, kad būtų galima valdyti srautų duomenų srautus. Apibrėžia kaiščius, prievadus ir pan. #Include // antraštė, kad programoje būtų įjungta uždelsimo funkcija

#define BUTTON1 2 // mygtuko jungiklis, prijungtas prie B prievado 2 kaiščio #define DEBOUNCE_TIME 25 // laikas laukti, kol bus atšauktas mygtukas

// Timer0, PWM Initialization void timer0_init () {// nustatyti laikmatį OC0A, OC0B kaištis perjungimo režimu ir CTC režimas TCCR0A | = (1 << COM0A1) | (1 << COM0B1) | (1 << WGM00) | (1 << WGM01); // nustatyti laikmatį su prescaler = 256 TCCR0B | = (1 << CS02); // inicijuoti skaitiklį TCNT0 = 0; // inicijuoti palyginimo reikšmę OCR0A = 0; }

// ADC inicializavimo negaliojimas ADC_init () {// Įgalinti ADC, atrankos dažnis = osc_freq/128 nustatyti išankstinį skalę iki didžiausios vertės, 128 ADCSRA | = (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0);

ADMUX = (1 << REFS0); // Pasirinkite įtampos etaloną (AVCC)

// Mygtuko jungiklio būsena neparašyta char button_state () {

/ * mygtukas paspaudžiamas, kai BUTTON1 bitas yra aiškus */

jei (! (PINB & (1 <

{

_delay_ms (DEBOUNCE_TIME);

jei (! (PINB & (1 <

}

grįžti 0;

}

// Uostų inicijavimas void port_init () {DDRB = 0b00011011; // PB0-IN1, PB1-IN2, PB3-IN3, PB4-IN4, PB2-MYGTUKŲ JUNGIKLIS TIESIOGINIS PORTB = 0b00010110;

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

DDRC = 0b00000000; // PC0-ADC PORTC = 0b00000000; // Nustatykite žemus visus PORTC kaiščius, kurie jį išjungia. }

// Ši funkcija nuskaito analogo į skaitmeninį konvertavimą. uint16_t get_LightLevel () {_delay_ms (10); // Palaukite, kol kanalas gaus pasirinktą ADCSRA | = (1 << ADSC); // Pradėkite ADC konvertavimą nustatydami ADSC bitą. Parašykite 1 į ADSC

tuo tarpu (ADCSRA & (1 << ADSC)); // Palaukite, kol konversija bus baigta

// ADSC vėl tampa 0 iki tol, paleisti kilpą nuolat _delay_ms (10); grąžinimas (ADC); // Grąžinkite 10 bitų rezultatą

}

// Ši funkcija perkelia skaičių iš vieno diapazono (0-1023) į kitą (0-100). uint32_t žemėlapis (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 (niekinis)

{uint16_t i1 = 0;

port_init ();

timer0_init (); ADC_init (); // inicializacija ADC

kol (1)

{i1 = žemėlapis (get_LightLevel (), 0, 1023, 0, 100);

OCR0A = i1; // Nustatyti išvesties palyginimo registro kanalą A OCR0B = 100-i1; // Nustatykite išvesties palyginimo registro kanalą B (apverstas)

if (button_state ()) // Jei mygtukas yra paspaustas, perjunkite šviesos diodo būseną ir atidėkite 300 ms (#define LOCK_INPUT_TIME) {PORTB ^= (1 << 0); // perjungti dabartinę kaiščio būseną IN1. PORTB ^= (1 << 1); // perjungti dabartinę kaiščio IN2 būseną. Pakeiskite variklio sukimosi kryptį

PORTB ^= (1 << 3); // perjungti dabartinę kaiščio būseną IN3. PORTB ^= (1 << 4); // perjungti dabartinę kaiščio būseną IN4. LED juosta yra išjungta/įjungta. _delay_ms (LOCK_INPUT_TIME); }}; grįžti (0); }

Programavimas baigtas. Tada sukurkite ir sukompiliuokite projekto kodą į šešioliktainį failą.

Įkeliant HEX failą į mikrovaldiklio „flash“atmintį: įveskite DOS eilutės lange komandą:

avrdude –c [programuotojo vardas] –p m328p –u –U „flash“: w: [jūsų šešiakampio failo pavadinimas]

Mano atveju tai yra:

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

Ši komanda įrašo hex failą į mikrovaldiklio atmintį. Žiūrėkite vaizdo įrašą su išsamiu mikrovaldiklio „flash“atminties įrašymo aprašymu: „Mikrovaldiklio„ flash “atminties įrašymas…

Gerai! Dabar mikrovaldiklis veikia pagal mūsų programos instrukcijas. Patikrinkime!

6 žingsnis: elektros grandinė

Elektros grandinė
Elektros grandinė
Elektros grandinė
Elektros grandinė

Prijunkite komponentus pagal schemą.

Rekomenduojamas: