INHOUDSOPGAWE:

AVR -mikrobeheerder. Pulswydte modulasie. Beheerder van DC -motor en LED -ligintensiteit: 6 stappe
AVR -mikrobeheerder. Pulswydte modulasie. Beheerder van DC -motor en LED -ligintensiteit: 6 stappe

Video: AVR -mikrobeheerder. Pulswydte modulasie. Beheerder van DC -motor en LED -ligintensiteit: 6 stappe

Video: AVR -mikrobeheerder. Pulswydte modulasie. Beheerder van DC -motor en LED -ligintensiteit: 6 stappe
Video: Lesson 49: Introduction to L293D Motor driver and speed control | Arduino Step By Step Course 2024, Desember
Anonim
Image
Image

Hallo almal!

Pulse Width Modulation (PWM) is 'n baie algemene tegniek in telekommunikasie en kragbeheer. dit word algemeen gebruik om die krag wat aan 'n elektriese toestel toegedien word, te beheer, of dit nou 'n motor, 'n LED, luidsprekers, ens..

Ons maak 'n eenvoudige elektriese stroombaan om die rotasiesnelheid van die GS -motor in ligintensiteitsafhanklikheid te beheer. Ons gaan ligafhanklike weerstand- en AVR -mikrobeheerderfunksies soos analoog na digitale omskakeling gebruik om die ligintensiteit te meet. Ons gaan ook die Dual H-Bridge Motor Driver Module-L298N gebruik. Dit word tipies gebruik om motorsnelheid en rigting te beheer, maar kan gebruik word vir ander projekte, soos om die helderheid van sekere beligtingsprojekte te bestuur. Ons het ook 'n knoppie by ons kring gevoeg om die draairigting van die enjin te verander.

Stap 1: Beskrywing

Beskrywing
Beskrywing
Beskrywing
Beskrywing

Elke liggaam in hierdie wêreld het 'n mate van traagheid. Die motor draai elke keer as dit aangeskakel word. Sodra dit afgeskakel word, is dit geneig om te stop. Maar dit stop nie onmiddellik nie, dit neem tyd. Maar voordat dit heeltemal stop, word dit weer aangeskakel! So begin dit beweeg. Maar selfs nou neem dit tyd om sy volle spoed te bereik. Maar voordat dit gebeur, word dit afgeskakel, ens. Die algemene effek van hierdie aksie is dus dat die motor aanhoudend draai, maar teen 'n laer snelheid.

Pulswydte -modulasie (PWM) is 'n relatief onlangse kragskakeltegniek om intermediêre hoeveelhede elektriese krag tussen vlakke wat heeltemal aan en heeltemal uit is, te verskaf. Gewoonlik het digitale pulse dieselfde tyd aan en af, maar in sommige situasies benodig ons die digitale pols meer/minder betyds/betyds. In PWM -tegniek skep ons digitale pulse met 'n ongelyke hoeveelheid aan en af toestand om die vereiste tussenspanningswaardes te kry.

Inskakel siklus word gedefinieer deur die persentasie van hoogspanning duur in 'n volledige digitale puls. Dit kan bereken word deur:

% van dienssiklus = T aan /T (periode) x 100

Kom ons neem 'n probleemstelling. Ons moet 'n 50 Hz PWM -sein genereer met 'n 45% -siklus.

Frekwensie = 50 Hz

Tydsperiode, T = T (aan) + T (af) = 1/50 = 0,02 s = 20 ms

Dienssiklus = 45%

As ons dus oplos volgens die vergelyking hierbo, kry ons

T (aan) = 9 ms

T (af) = 11 ms

Stap 2: AVR -timers - PWM -modus

AVR -timers - PWM -modus
AVR -timers - PWM -modus
AVR -timers - PWM -modus
AVR -timers - PWM -modus

AVR bevat afsonderlike hardeware vir die vervaardiging van PWM! Deur dit te gebruik, gee die SVE die hardeware die opdrag om PWM van 'n spesifieke werksiklus te produseer. Die ATmega328 het 6 PWM -uitsette, 2 is geleë op timer/teller 0 (8bit), 2 is op timer/teller1 (16bit) en 2 is op timer/teller2 (8bit). Timer/Counter0 is die eenvoudigste PWM -toestel op die ATmega328. Timer/Counter0 kan op drie modusse uitgevoer word:

  • Vinnige PWM
  • Fase en frekwensie gekorrigeer PWM
  • Fase gekorrigeer PWM

elk van hierdie modusse kan omgekeerd of nie-omgekeerd wees.

Initialiseer Timer0 in PWM -modus:

TCCR0A | = (1 << WGM00) | (1 << WGM01) - stel WGM op: Fast PWM

TCCR0A | = (1 << COM0A1) | (1 << COM0B1) - stel vergelyking uitvoer modus A, B op

TCCR0B | = (1 << CS02) - instel timer met voorcalculator = 256

Stap 3: Meting van ligintensiteit - ADC en LDR

Meting van ligintensiteit - ADC en LDR
Meting van ligintensiteit - ADC en LDR
Meting van ligintensiteit - ADC en LDR
Meting van ligintensiteit - ADC en LDR
Meting van ligintensiteit - ADC en LDR
Meting van ligintensiteit - ADC en LDR

Ligafhanklike weerstand (LDR) is 'n transducer wat sy weerstand verander wanneer lig op die oppervlak val.

LDR's is gemaak van halfgeleiermateriaal sodat hulle hul ligsensitiewe eienskappe kan hê. Hierdie LDR's of FOTO -WEERSTANDERS werk volgens die beginsel van "Fotogeleiding". Wat hierdie beginsel nou sê, is wanneer lig op die oppervlak van die LDR val (in hierdie geval) die geleiding van die element toeneem of met ander woorde die weerstand van die LDR neem af wanneer die lig op die oppervlak van die LDR val. Hierdie eienskap van die afname in weerstand vir die LDR word bereik omdat dit 'n eienskap is van halfgeleiermateriaal wat op die oppervlak gebruik word. LDR word die meeste kere gebruik om ligte op te spoor of om die intensiteit van lig te meet.

Om eksterne deurlopende inligting (analoog inligting) na 'n digitale/rekenaarstelsel oor te dra, moet ons dit omskakel in heelgetalle (digitale) waardes. Hierdie tipe omskakeling word uitgevoer deur Analog to Digital Converter (ADC). Die proses om 'n analoog waarde in digitale waarde om te skakel, staan bekend as Analoog na digitale omskakeling. Kortom, analoog seine is werklike seine rondom ons, soos klank en lig.

Digitale seine is analoog ekwivalente in digitale of numeriese formaat wat goed verstaan word deur digitale stelsels soos mikrobeheerders. ADC is een van die hardeware wat analoog seine meet en 'n digitale ekwivalent van dieselfde sein produseer. AVR -mikrobeheerders het 'n ingeboude ADC -fasiliteit om analoog spanning in 'n heelgetal om te skakel. AVR skakel dit om in 'n 10-bis aantal getal 0 tot 1023.

Ons gebruik 'n analoog na 'n digitale omskakeling van die spanningsvlak van die verdelerkring met LDR om die ligintensiteit te meet.

Initialiseer ADC:

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

ADCSRA | = (1 << ADPS2) | (1 << ADPS1) | (1ADPS0) - stel ADC -voorverkoeler op = 128

ADMUX = (1 << REFS0) - stel spanningverwysing op = AVCC; - Opstel Invoerkanaal = ADC0

Kyk na die video met 'n gedetailleerde beskrywing van die ADC AVR -mikrobeheerder: AVR -mikrobeheerder. Meting van ligte intensiteit. ADC en LDR

Stap 4: DC-motor met kontroleerder en dubbele H-brug-motorbestuurder-module-L298N

Beheerder DC-motor en dubbele H-brug-motorbestuurdermodule-L298N
Beheerder DC-motor en dubbele H-brug-motorbestuurdermodule-L298N
Beheerder DC-motor en dubbele H-brug-motorbestuurdermodule-L298N
Beheerder DC-motor en dubbele H-brug-motorbestuurdermodule-L298N
Beheerder DC-motor en dubbele H-brug-motorbestuurdermodule-L298N
Beheerder DC-motor en dubbele H-brug-motorbestuurdermodule-L298N

Ons gebruik DC -motorbestuurders omdat mikrobeheerders in die algemeen nie meer as 100 miljard ampère kan lewer nie. Die mikrobeheerders is slim, maar nie sterk nie; hierdie module sal 'n paar spiere by mikrobeheerders voeg om hoë krag GS -motors aan te dryf. Dit kan 2 GS -motors gelyktydig beheer tot 2 ampère elk of een stapmotor. Ons kan die snelheid beheer met behulp van PWM en ook die rotasie rigting van die motors. Dit word ook gebruik om die helderheid van LED -band te bestuur.

Pin beskrywing:

OUT1- en OUT2 -poort, wat bedoel is om 'n GS -motor aan te sluit. OUT3 en OUT4 vir die aansluiting van LED -band.

ENA en ENB is aktiveerpenne: deur ENA aan hoë (+5V) te koppel, maak dit die poort OUT1 en OUT2 moontlik.

As u die ENA -pen aan laag (GND) koppel, skakel die OUT1 en OUT2 uit. Net so vir ENB en OUT3 en OUT4.

IN1 tot IN4 is die invoerpenne wat aan AVR gekoppel sal word.

As IN1-hoog (+5V), IN2-laag (GND), draai die OUT1 hoog en OUT2 laag, sodat ons die motor kan bestuur.

As IN3-hoog (+5V), IN4-laag (GND), word die OUT4 hoog en OUT3 laag, dus is die LED-bandlig aan.

As u die draairigting van die motor wil omkeer, moet u slegs die polariteit van IN1 en IN2 omkeer, net so vir IN3 en IN4.

Deur die PWM -sein op ENA en ENB toe te pas, kan u die motorsnelheid op twee verskillende uitsetpoorte beheer.

Die raad kan nominaal van 7V tot 12V aanvaar.

Springers: Daar is drie springpenne; Jumper 1: As u motor meer as 12V benodig, moet u die Jumper 1 ontkoppel en die gewenste spanning (maks. 35V) by die 12V -aansluiting toepas. Bring nog 'n 5V -toevoer en insette by die 5V -terminale. Ja, u moet 5V invoer as u meer as 12V moet toepas (as Jumper 1 verwyder word).

Die 5V-ingang is vir 'n behoorlike werking van die IC, aangesien die verwydering van die jumper die ingeboude 5V-reguleerder sal deaktiveer en beskerm teen 'n hoër ingangsspanning vanaf die 12V-aansluiting.

Die 5V -aansluiting dien as uitset as u toevoer tussen 7V en 12V is, en dien as inset as u meer as 12V toepas en die jumper verwyder word.

Jumper 2 en Jumper 3: As u hierdie twee springers verwyder, moet u die in- en uitskakelsein van die mikrobeheerder invoer, die meeste gebruikers verkies om die twee springers te verwyder en die sein van die mikrobeheerder toe te pas.

As u die twee springers behou, sal die OUT1 tot OUT4 altyd aangeskakel wees. Onthou die ENA -trui vir OUT1 en OUT2. ENB -trui vir OUT3 en OUT4.

Stap 5: Skryf kode vir 'n program in C. Laai HEX -lêer op na die mikrobeheerder se flitsgeheue

Skryf en bou van die AVR -mikrobeheertoepassing in C -kode met behulp van die Integrated Development Platform - Atmel Studio.

#ifndef F_CPU #definieer F_CPU 16000000UL // vertel die kristalfrekwensie van die beheerder (16 MHz AVR ATMega328P) #endif

#include // header om die datavloeibeheer oor penne moontlik te maak. Definieer penne, poorte, ens. #Include // header om die vertragingsfunksie in die program moontlik te maak

#define BUTTON1 2 // knoppie skakelaar gekoppel aan poort B pen 2 #definieer DEBOUNCE_TIME 25 // tyd om te wag terwyl die "de-bouncing" knoppie #definieer LOCK_INPUT_TIME 300 // tyd om te wag na 'n druk op die knoppie

// Timer0, PWM Initialization void timer0_init () {// stel timer OC0A, OC0B -pin in skakelmodus en CTC -modus TCCR0A | = (1 << COM0A1) | (1 << COM0B1) | (1 << WGM00) | (1 << WGM01); // instel timer met prescaler = 256 TCCR0B | = (1 << CS02); // initialiseer teller TCNT0 = 0; // initialiseer vergelyk waarde OCR0A = 0; }

// ADC Initialization void ADC_init () {// Aktiveer ADC, monsterneming freq = osc_freq/128 stel prescaler op maksimum waarde, 128 ADCSRA | = (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0);

ADMUX = (1 << REFS0); // Kies Spanningsverwysing (AVCC)

// Knoppieskakelaarstatus ongetekende char button_state () {

/ * die knoppie word ingedruk as BUTTON1 bit duidelik is */

as (! (PINB & (1 <

{

_vertraag_ms (DEBOUNCE_TIME);

as (! (PINB & (1 <

}

terugkeer 0;

}

// Poortinitialisering leemte port_init () {DDRB = 0b00011011; // PB0-IN1, PB1-IN2, PB3-IN3, PB4-IN4, PB2-BUTTON SWITCH DIRECT PORTB = 0b00010110;

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

DDRC = 0b00000000; // PC0-ADC PORTC = 0b00000000; // Stel alle penne van PORTC laag, wat dit uitskakel. }

// Hierdie funksie lees die waarde van die analoog na digitale omskakelaar. uint16_t get_LightLevel () {_delay_ms (10); // Wag 'n rukkie totdat die kanaal die gekose ADCSRA | = (1 << ADSC) kry; // Begin die ADC -omskakeling deur die ADSC -bit in te stel. Skryf 1 aan ADSC

terwyl (ADCSRA & (1 << ADSC)); // Wag totdat die omskakeling voltooi is

// ADSC word weer 0 tot dan, loop lus deurlopend _delay_ms (10); terugkeer (ADC); // Wys die 10-bis-resultaat terug

}

// Hierdie funksie herkaart 'n getal van een reeks (0-1023) na 'n ander (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 (leeg)

{uint16_t i1 = 0;

port_init ();

timer0_init (); ADC_init (); // inisialisering ADC

terwyl (1)

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

OCR0A = i1; // Stel uitset vergelyk registerkanaal A OCR0B = 100-i1; // Stel uitvoer vergelyk registerkanaal B (omgekeerd)

if (button_state ()) // As die knoppie ingedruk word, verander die toestand van die LED en vertraag dit vir 300ms (#define LOCK_INPUT_TIME) {PORTB ^= (1 << 0); // die huidige toestand van die pen IN1 verander. PORTB ^= (1 << 1); // die huidige toestand van die pen IN2 verander. Draai die rotasie rigting van die motor om

PORTB ^= (1 << 3); // die huidige toestand van die pen IN3 verander. PORTB ^= (1 << 4); // die huidige toestand van die pen IN4 verander. LED -band is aan/uit. _vertraag_ms (LOCK_INPUT_TIME); }}; terugkeer (0); }

Die programmering is voltooi. Vervolgens bou en opstel van projekkode in hex -lêer.

Laai HEX -lêer op na die geheue van die mikrobeheerder: tik die opdrag in die DOS -promptvenster in:

avrdude –c [naam van programmeerder] –p m328p –u –U flits: w: [naam van u hex -lêer]

In my geval is dit:

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

Hierdie opdrag skryf heks -lêer na die geheue van die mikrobeheerder. Kyk na die video met 'n gedetailleerde beskrywing van die verbranding van die flitsgeheue van die mikrobeheerder: die flitsgeheue van die mikrobeheerder …

Ok! Die mikrobeheerder werk nou volgens die instruksies van ons program. Kom ons kyk!

Stap 6: Die elektriese stroombaan

Die elektriese stroombaan
Die elektriese stroombaan
Die elektriese stroombaan
Die elektriese stroombaan

Verbind komponente volgens die skematiese diagram.

Aanbeveel: