Satura rādītājs:

AVR mikrokontrolleris. Pulsa platuma modulācija. Līdzstrāvas motora un LED gaismas intensitātes kontrolieris: 6 soļi
AVR mikrokontrolleris. Pulsa platuma modulācija. Līdzstrāvas motora un LED gaismas intensitātes kontrolieris: 6 soļi

Video: AVR mikrokontrolleris. Pulsa platuma modulācija. Līdzstrāvas motora un LED gaismas intensitātes kontrolieris: 6 soļi

Video: AVR mikrokontrolleris. Pulsa platuma modulācija. Līdzstrāvas motora un LED gaismas intensitātes kontrolieris: 6 soļi
Video: ESP32 Tutorial 15 - DC Motor Speed Control with ESP32 L293D | SunFounder's ESP32 IoT Learnig kit 2024, Novembris
Anonim
Image
Image

Sveiki visiem!

Pulsa platuma modulācija (PWM) ir ļoti izplatīta tehnika telekomunikāciju un jaudas kontroles jomā. to parasti izmanto, lai kontrolētu elektroierīcei piegādāto jaudu, neatkarīgi no tā, vai tas ir motors, LED, skaļruņi utt. Būtībā tā ir modulācijas tehnika, kurā nesēja impulsa platums tiek mainīts atbilstoši analogā ziņojuma signālam.

Mēs izgatavojam vienkāršu elektrisko ķēdi, lai kontrolētu līdzstrāvas motora rotācijas ātrumu atkarībā no gaismas intensitātes. Gaismas intensitātes mērīšanai mēs izmantosim no gaismas atkarīgu rezistoru un AVR mikrokontrollera funkcijas, piemēram, analogo ciparu pārveidošanu. Mēs arī izmantosim Dual H-Bridge motora vadītāja moduli-L298N. To parasti izmanto, lai kontrolētu motora ātrumu un virzienu, bet to var izmantot citiem projektiem, piemēram, noteiktu apgaismojuma projektu spilgtuma palielināšanai. Turklāt mūsu ķēdei pievienoja pogu, lai pārslēgtu dzinēja rotācijas virzienu.

1. darbība. Apraksts

Apraksts
Apraksts
Apraksts
Apraksts

Katram ķermenim šajā pasaulē ir zināma inerce. Motors griežas ikreiz, kad tas tiek ieslēgts. Tiklīdz tas tiek izslēgts, tam ir tendence apstāties. Bet tas neapstājas uzreiz, tas prasa kādu laiku. Bet pirms tā pilnībā apstājas, tā tiek atkal ieslēgta! Tādējādi tas sāk kustēties. Bet pat tagad ir vajadzīgs zināms laiks, lai sasniegtu pilnu ātrumu. Bet pirms tas notiek, tas tiek izslēgts utt. Tādējādi šīs darbības kopējais efekts ir tāds, ka motors rotē nepārtraukti, bet ar mazāku ātrumu.

Pulsa platuma modulācija (PWM) ir salīdzinoši nesena jaudas pārslēgšanas tehnika, kas nodrošina starpposma elektroenerģijas daudzumu starp pilnībā ieslēgtu un pilnībā izslēgtu līmeni. Parasti digitālajiem impulsiem ir vienāds ieslēgšanās un izslēgšanas periods, bet dažās situācijās mums ir nepieciešams, lai digitālais impulss būtu vairāk/mazāk laika/izslēgšanas laikā. PWM tehnikā mēs izveidojam digitālos impulsus ar nevienādu ieslēgšanas un izslēgšanas stāvokli, lai iegūtu nepieciešamās starpposma sprieguma vērtības.

Darba ciklu nosaka augstsprieguma ilguma procentuālā daļa pilnā digitālā impulsā. To var aprēķināt pēc:

% no darba cikla = T ieslēgts /T (perioda laiks) x 100

Pieņemsim paziņojumu par problēmu. Mums jāģenerē 50 Hz PWM signāls ar 45% darba ciklu.

Frekvence = 50 Hz

Laika periods, T = T (ieslēgts) + T (izslēgts) = 1/50 = 0,02 s = 20 ms

Darba cikls = 45%

Tādējādi, atrisinot saskaņā ar iepriekš sniegto vienādojumu, mēs iegūstam

T (ieslēgts) = 9 ms

T (izslēgts) = 11 ms

2. darbība: AVR taimeri - PWM režīms

AVR taimeri - PWM režīms
AVR taimeri - PWM režīms
AVR taimeri - PWM režīms
AVR taimeri - PWM režīms

PWM izgatavošanai AVR satur atsevišķu aparatūru! Izmantojot to, CPU uzdod aparatūrai ražot noteikta darba cikla PWM. ATmega328 ir 6 PWM izejas, 2 atrodas uz taimera/skaitītāja0 (8 biti), 2 atrodas uz taimera/skaitītāja1 (16 biti), un 2 atrodas uz taimera/skaitītāja2 (8 biti). Taimeris/skaitītājs0 ir vienkāršākā PWM ierīce ATmega328. Taimeris/skaitītājs0 spēj darboties 3 režīmos:

  • Ātra PWM
  • Fāzes un frekvences koriģēts PWM
  • Phase Labots PWM

katrs no šiem režīmiem var būt apgriezts vai neapgriezts.

Inicializēt taimeri0 PWM režīmā:

TCCR0A | = (1 << WGM00) | (1 << WGM01) - iestatiet WGM: ātrs PWM

TCCR0A | = (1 << COM0A1) | (1 << COM0B1) - iestatiet salīdzināšanas izvades režīmu A, B

TCCR0B | = (1 << CS02) - iestatiet taimeri ar prescaler = 256

3. solis: gaismas intensitātes mērīšana - ADC un LDR

Gaismas intensitātes mērīšana - ADC un LDR
Gaismas intensitātes mērīšana - ADC un LDR
Gaismas intensitātes mērīšana - ADC un LDR
Gaismas intensitātes mērīšana - ADC un LDR
Gaismas intensitātes mērīšana - ADC un LDR
Gaismas intensitātes mērīšana - ADC un LDR

Gaismas atkarīgais rezistors (LDR) ir devējs, kas maina pretestību, mainoties gaismai uz virsmas.

LDR ir izgatavoti no pusvadītāju materiāliem, lai tiem būtu gaismas jutīgas īpašības. Šie LDR vai FOTORESISTORI darbojas pēc “foto vadītspējas” principa. Tagad šis princips saka, ka ikreiz, kad gaisma nokrīt uz LDR virsmas (šajā gadījumā), elementa vadītspēja palielinās vai, citiem vārdiem sakot, LDR pretestība samazinās, kad gaisma nokrīt uz LDR virsmas. Šī LDR pretestības samazināšanās īpašība tiek sasniegta, jo tā ir uz virsmas izmantota pusvadītāju materiāla īpašība. LDR visbiežāk izmanto gaismas klātbūtnes noteikšanai vai gaismas intensitātes mērīšanai.

Lai nepārtrauktu ārējo informāciju (analogo informāciju) pārnestu uz ciparu/skaitļošanas sistēmu, mums tā ir jāpārvērš veselās (digitālās) vērtībās. Šāda veida pārveidošanu veic analogo ciparu pārveidotājs (ADC). Analogās vērtības pārvēršanas par digitālo vērtību process ir pazīstams kā analogs digitālai konversijai. Īsi sakot, analogie signāli ir reālās pasaules signāli ap mums, piemēram, skaņa un gaisma.

Digitālie signāli ir analogie ciparu vai ciparu formāta ekvivalenti, kurus labi saprot digitālās sistēmas, piemēram, mikrokontrolleri. ADC ir viena no šādām aparatūrām, kas mēra analogos signālus un rada tā paša signāla digitālo ekvivalentu. AVR mikrokontrolleros ir iebūvēta ADC iespēja analogā sprieguma pārveidošanai par veselu skaitli. AVR pārveido to par 10 bitu skaitu diapazonā no 0 līdz 1023.

Gaismas intensitātes mērīšanai mēs izmantojam sprieguma līmeņa pārveidotāju no dalītāja ķēdes ar LDR no analogā uz digitālo.

Inicializēt ADC:

TADCSRA | = (1 << ADEN) - Iespējot ADC

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

ADMUX = (1 << REFS0) - iestatīt sprieguma atsauci = AVCC; - iestatīt ievades kanālu = ADC0

Noskatieties video ar detalizētu ADC AVR mikrokontrollera aprakstu: AVR Microcontroller. Gaismas intensitātes mērīšana. ADC un LDR

4. solis: Kontroliera līdzstrāvas motors un divu H-tilta motora draivera modulis-L298N

Kontroliera līdzstrāvas motors un divu H-tilta motora draivera modulis-L298N
Kontroliera līdzstrāvas motors un divu H-tilta motora draivera modulis-L298N
Kontroliera līdzstrāvas motors un divu H-tilta motora draivera modulis-L298N
Kontroliera līdzstrāvas motors un divu H-tilta motora draivera modulis-L298N
Kontroliera līdzstrāvas motors un divu H-tilta motora draivera modulis-L298N
Kontroliera līdzstrāvas motors un divu H-tilta motora draivera modulis-L298N

Mēs izmantojam līdzstrāvas motoru draiverus, jo mikrokontrolleri kopumā nespēj nodrošināt strāvu, kas nepārsniedz 100 miliamperus. Mikrokontrolleri ir gudri, bet nav spēcīgi; šis modulis pievienos dažus muskuļus mikrokontrolleriem, lai darbinātu lieljaudas līdzstrāvas motorus. Tas var vienlaikus kontrolēt 2 līdzstrāvas motorus līdz 2 ampēriem vai vienu pakāpju motoru. Mēs varam kontrolēt ātrumu, izmantojot PWM, kā arī motora rotācijas virzienu. To izmantoja arī LED lentes spilgtuma palielināšanai.

Piespraudes apraksts:

OUT1 un OUT2 ports, kas paredzēts līdzstrāvas motora savienošanai. OUT3 un OUT4 LED lentes pievienošanai.

ENA un ENB ir iespējošanas tapas: savienojot ENA ar augstu (+5 V), tas nodrošina portu OUT1 un OUT2.

Ja pievienojat ENA tapu zemam (GND), tas atspējo OUT1 un OUT2. Līdzīgi ENB un OUT3 un OUT4.

IN1 līdz IN4 ir ieejas tapas, kas tiks savienotas ar AVR.

Ja IN1-augsts (+5V), IN2-zems (GND), OUT1 kļūst augsts un OUT2 kļūst zems, tādējādi mēs varam vadīt motoru.

Ja IN3-augsts (+5V), IN4-zems (GND), OUT4 kļūst augsts un OUT3 kļūst zems, tādējādi iedegas LED lentes gaisma.

Ja vēlaties mainīt motora rotācijas virzienu, mainiet IN1 un IN2 polaritāti, līdzīgi kā IN3 un IN4.

Pielietojot PWM signālu ENA un ENB, jūs varat kontrolēt motoru ātrumu divos dažādos izejas portos.

Valde nomināli var pieņemt no 7V līdz 12V.

Džemperi: Ir trīs džemperu tapas; 1. džemperis: ja jūsu motoram nepieciešama vairāk nekā 12 V barošana, jums ir jāatvieno 1. džemperis un jāpievieno vēlamais spriegums (maks. 35 V) 12 V spailei. Paņemiet vēl 5V barošanu un ieeju 5V terminālī. Jā, jums ir jāievada 5 V, ja jums jāpielieto vairāk nekā 12 V (kad tiek noņemts 1. džemperis).

5 V ieeja ir paredzēta pareizai IC darbībai, jo, noņemot džemperi, tiks atspējots iebūvētais 5 V regulators un pasargāta no augstāka ieejas sprieguma no 12 V spailes.

5 V terminālis darbojas kā izeja, ja jūsu barošanas avots ir no 7 V līdz 12 V, un darbojas kā ieeja, ja izmantojat vairāk nekā 12 V un džemperis ir noņemts.

Džemperis 2 un džemperis 3: ja noņemat šos divus džemperus, jums jāievada ieslēgšanas un izslēgšanas signāls no mikrokontrollera, lielākā daļa lietotāju dod priekšroku divu džemperu noņemšanai un signāla pielietošanai no mikrokontrollera.

Ja paturēsit abus džemperus, OUT1 līdz OUT4 vienmēr būs iespējots. Atcerieties ENA džemperi OUT1 un OUT2. ENB džemperis OUT3 un OUT4.

5. darbība. Programmas koda ierakstīšana C. Augšupielādējiet HEX failu mikrokontrollera zibatmiņā

AVR mikrokontrollera lietojumprogrammas rakstīšana un veidošana C kodā, izmantojot integrēto attīstības platformu - Atmel Studio.

#ifndef F_CPU #define F_CPU 16000000UL // norādot kontroliera kristāla frekvenci (16 MHz AVR ATMega328P) #endif

#include // galvene, lai iespējotu datu plūsmas kontroli pār tapām. Definē tapas, ostas utt. #Include // header, lai programmā iespējotu aizkaves funkciju

#definēt BUTTON1 2 // pogas slēdzis, kas savienots ar portu B 2. taustiņš #define DEBOUNCE_TIME 25 // laiks gaidīt, kamēr poga "atlekšana" #define LOCK_INPUT_TIME 300 // laiks jāgaida pēc pogas nospiešanas

// Taimeris0, PWM inicializācija void timer0_init () {// iestatiet taimeri OC0A, OC0B tapu pārslēgšanas režīmā un CTC režīmu TCCR0A | = (1 << COM0A1) | (1 << COM0B1) | (1 << WGM00) | (1 << WGM01); // iestatīt taimeri ar prescaler = 256 TCCR0B | = (1 << CS02); // inicializēt skaitītāju TCNT0 = 0; // inicializēt salīdzināt vērtību OCR0A = 0; }

// ADC inicializācijas void ADC_init () {// Iespējot ADC, paraugu ņemšanas biežums = osc_freq/128 iestatīt prescaler uz maksimālo vērtību, 128 ADCSRA | = (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0);

ADMUX = (1 << REFS0); // Atlasiet sprieguma atskaiti (AVCC)

// Pogas slēdža statuss neparakstīts char button_state () {

/ * poga tiek nospiesta, ja BUTTON1 bits ir dzidrs */

ja (! (PINB & (1 <

{

_delay_ms (DEBOUNCE_TIME);

ja (! (PINB & (1 <

}

atgriezties 0;

}

// Ostu inicializācijas void port_init () {DDRB = 0b00011011; // PB0-IN1, PB1-IN2, PB3-IN3, PB4-IN4, PB2-POGU PĀRSLĒGŠANAS TIEŠAIS PORTBB = 0b00010110;

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

DDRC = 0b00000000; // PC0-ADC PORTC = 0b00000000; // Iestatiet zemas visas PORTC tapas, kas to izslēdz. }

// Šī funkcija nolasa analogā pārveidotāja digitālo vērtību. uint16_t get_LightLevel () {_delay_ms (10); // Pagaidiet kādu laiku, līdz kanāls iegūst izvēlēto ADCSRA | = (1 << ADSC); // Sāciet ADC konvertēšanu, iestatot ADSC bitu. Uzrakstiet 1 uz ADSC

kamēr (ADCSRA & (1 << ADSC)); // Pagaidiet, līdz konversija tiks pabeigta

// ADSC līdz tam atkal kļūst par 0, nepārtraukti palaist cilpu _delay_ms (10); atgriešanās (ADC); // Atgriež 10 bitu rezultātu

}

// Šī funkcija atkārtoti kartē skaitli no viena diapazona (0-1023) uz citu (0-100). uint32_t karte (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 (anulēts)

{uint16_t i1 = 0;

port_init ();

taimeris0_init (); ADC_init (); // inicializācija ADC

kamēr (1)

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

OCR0A = i1; // Iestatīt izvades salīdzināšanas reģistra kanālu A OCR0B = 100-i1; // Iestatīt izvades salīdzināšanas reģistra kanālu B (apgriezts)

if (button_state ()) // Ja poga ir nospiesta, pārslēdziet gaismas diodes stāvokli un aizkavējiet 300 ms (#define LOCK_INPUT_TIME) {PORTB ^= (1 << 0); // pārslēdzot tapu IN1 pašreizējo stāvokli. PORTB ^= (1 << 1); // pārslēdzot tapu IN2 pašreizējo stāvokli. Mainiet motora rotācijas virzienu

PORTB ^= (1 << 3); // pārslēdzot tapu IN3 pašreizējo stāvokli. PORTB ^= (1 << 4); // pārslēdzot tapas pašreizējo stāvokli IN4. LED lente ir izslēgta/ieslēgta. _delay_ms (LOCK_INPUT_TIME); }}; atgriešanās (0); }

Programmēšana ir pabeigta. Tālāk projekta koda izveide un apkopošana hex failā.

HEX faila augšupielāde mikrokontrollera zibatmiņā: DOS uzvednes logā ierakstiet komandu:

avrdude –c [programmētāja vārds] –p m328p –u –U flash: w: [jūsu hex faila nosaukums]

Manā gadījumā tas ir:

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

Šī komanda ieraksta hex failu mikrokontrollera atmiņā. Noskatieties video ar detalizētu mikrokontrollera zibatmiņas ierakstīšanas aprakstu: Mikrokontrollera zibatmiņas ierakstīšana…

Labi! Tagad mikrokontrolleris darbojas saskaņā ar mūsu programmas norādījumiem. Pārbaudīsim!

6. darbība: elektriskā ķēde

Elektriskā ķēde
Elektriskā ķēde
Elektriskā ķēde
Elektriskā ķēde

Savienojiet komponentus saskaņā ar shēmu.

Ieteicams: