Innholdsfortegnelse:

AVR mikrokontroller. Pulsbreddemodulasjon. Kontroller for likestrømsmotor og LED -lysintensitet: 6 trinn
AVR mikrokontroller. Pulsbreddemodulasjon. Kontroller for likestrømsmotor og LED -lysintensitet: 6 trinn

Video: AVR mikrokontroller. Pulsbreddemodulasjon. Kontroller for likestrømsmotor og LED -lysintensitet: 6 trinn

Video: AVR mikrokontroller. Pulsbreddemodulasjon. Kontroller for likestrømsmotor og LED -lysintensitet: 6 trinn
Video: DA5-DC Motor 2024, November
Anonim
Image
Image

Hei alle sammen!

Pulse Width Modulation (PWM) er en veldig vanlig teknikk innen telekommunikasjon og strømstyring. det er vanligvis brukt til å kontrollere strømmen som mates til en elektrisk enhet, enten det er en motor, en LED, høyttalere, etc. Det er i utgangspunktet en modulasjonsteknikk, der bredden på bærerpulsen varieres i henhold til det analoge meldingssignalet.

Vi lager en enkel elektrisk krets for å kontrollere rotasjonshastigheten til likestrømsmotoren i lysintensitet. Vi skal bruke Light Dependent Resistor og AVR -mikrokontrollerfunksjoner som Analog til Digital Conversion for å måle lysintensiteten. Vi kommer også til å bruke Dual H-Bridge Motor Driver Module-L298N. Den brukes vanligvis til å kontrollere motorers hastighet og retning, men kan brukes til andre prosjekter som å drive lysstyrken til visse belysningsprosjekter. Også lagt til en knapp i kretsen vår for å veksle motorens rotasjonsretning.

Trinn 1: Beskrivelse

Beskrivelse
Beskrivelse
Beskrivelse
Beskrivelse

Hver kropp i denne verden har en viss treghet. Motoren roterer når den er slått på. Så snart den er slått av, vil den ha en tendens til å stoppe. Men det stopper ikke umiddelbart, det tar litt tid. Men før den stopper helt, slås den på igjen! Dermed begynner den å bevege seg. Men selv nå tar det litt tid å nå full fart. Men før det skjer, blir det slått av og så videre. Den totale effekten av denne handlingen er således at motoren roterer kontinuerlig, men med lavere hastighet.

Pulse Width Modulation (PWM) er en relativt nylig strømbryterteknikk for å gi mellomliggende mengder elektrisk kraft mellom fullt på og helt av. Vanligvis har digitale pulser samme tidsperiode for av og på, men i noen situasjoner trenger vi den digitale pulsen for å ha mer/mindre tid/tid. I PWM -teknikk lager vi digitale pulser med ulik mengde av og på for å få nødvendige mellomspenningsverdier.

Driftssyklus er definert av prosentandelen av høy spenningstid i en komplett digital puls. Det kan beregnes ved å:

% av driftssyklus = T på /T (periode) x 100

La oss ta en problemstilling. Vi må generere et 50 Hz PWM -signal med 45% driftssyklus.

Frekvens = 50 Hz

Tidsperiode, T = T (på) + T (av) = 1/50 = 0,02 s = 20 ms

Driftssyklus = 45%

Således, ved å løse i henhold til ligningen gitt ovenfor, får vi

T (på) = 9 ms

T (av) = 11 ms

Trinn 2: AVR -tidtakere - PWM -modus

AVR -tidtakere - PWM -modus
AVR -tidtakere - PWM -modus
AVR -tidtakere - PWM -modus
AVR -tidtakere - PWM -modus

For å lage PWM inneholder AVR separat maskinvare! Ved å bruke dette instruerer CPUen maskinvaren om å produsere PWM for en bestemt driftssyklus. ATmega328 har 6 PWM -utganger, 2 er plassert på timer/teller 0 (8bit), 2 er plassert på timer/teller1 (16bit), og 2 er plassert på timer/teller2 (8bit). Timer/Counter0 er den enkleste PWM -enheten på ATmega328. Timer/Counter0 er i stand til å kjøre på 3 moduser:

  • Rask PWM
  • Fase og frekvens korrigert PWM
  • Fasekorrigert PWM

hver av disse modusene kan være inverterte eller ikke-inverterte.

Initialize Timer0 i PWM -modus:

TCCR0A | = (1 << WGM00) | (1 << WGM01) - sett opp WGM: Fast PWM

TCCR0A | = (1 << COM0A1) | (1 << COM0B1) - konfigurer sammenligne utgangsmodus A, B

TCCR0B | = (1 << CS02) - sett opp tidtaker med forhåndsskaler = 256

Trinn 3: Måling av lysintensitet - ADC og LDR

Måling av lysintensitet - ADC og LDR
Måling av lysintensitet - ADC og LDR
Måling av lysintensitet - ADC og LDR
Måling av lysintensitet - ADC og LDR
Måling av lysintensitet - ADC og LDR
Måling av lysintensitet - ADC og LDR

Lysavhengig motstand (LDR) er en transduser som endrer motstanden når lys faller på overflaten endres.

LDR er laget av halvledermaterialer for å gjøre dem i stand til å ha sine lysfølsomme egenskaper. Disse LDR -ene eller FOTOMOTSTANDERNE jobber etter prinsippet om "fotokonduktivitet". Nå er det dette prinsippet sier når lyset faller på overflaten av LDR (i dette tilfellet) øker elementets konduktans eller med andre ord motstanden til LDR synker når lyset faller på overflaten av LDR. Denne egenskapen til reduksjon i motstand for LDR oppnås fordi det er en egenskap for halvledermateriale som brukes på overflaten. LDR brukes oftest for å oppdage tilstedeværelse av lys eller for å måle intensiteten av lys.

For å overføre ekstern kontinuerlig informasjon (analog informasjon) til et digitalt/datasystem, må vi konvertere dem til heltall (digitale) verdier. Denne typen konvertering utføres av Analog to Digital Converter (ADC). Prosessen med å konvertere en analog verdi til digital verdi er kjent som Analog til Digital Conversion. Kort sagt, analoge signaler er virkelige verdenssignaler rundt oss som lyd og lys.

Digitale signaler er analoge ekvivalenter i digitalt eller numerisk format som er godt forstått av digitale systemer som mikrokontrollere. ADC er en slik maskinvare som måler analoge signaler og produserer en digital ekvivalent av det samme signalet. AVR -mikrokontrollere har innebygd ADC -anlegg for å konvertere analog spenning til et heltall. AVR konverterer den til 10-bits antall i området 0 til 1023.

Vi bruker analog til digital konvertering av spenningsnivå fra divider krets med LDR for å måle lysintensiteten.

Initialiser ADC:

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

ADCSRA | = (1 << ADPS2) | (1 << ADPS1) | (1ADPS0) - sett opp ADC -forkalkningsmaskin = 128

ADMUX = (1 << REFS0) - sett opp spenningsreferanse = AVCC; - sett opp Input Channel = ADC0

Se videoen med en detaljert beskrivelse av ADC AVR mikrokontroller: AVR mikrokontroller. Måling av lysintensitet. ADC og LDR

Trinn 4: Kontroller likestrømsmotor og dobbel H-bromotordrivermodul-L298N

Kontroller likestrømsmotor og dobbel H-bromotordrivermodul-L298N
Kontroller likestrømsmotor og dobbel H-bromotordrivermodul-L298N
Kontroller likestrømsmotor og dobbel H-bromotordrivermodul-L298N
Kontroller likestrømsmotor og dobbel H-bromotordrivermodul-L298N
Kontroller likestrømsmotor og dobbel H-bromotordrivermodul-L298N
Kontroller likestrømsmotor og dobbel H-bromotordrivermodul-L298N

Vi bruker likestrømsmotordrivere fordi mikrokontrollere ikke er i stand til å levere strøm som ikke er mer enn 100 milliampere generelt. Mikrokontrollerne er smarte, men ikke sterke; denne modulen vil legge til noen muskler til mikrokontrollere for å drive likestrømsmotorer med høy effekt. Den kan styre 2 likestrømsmotorer samtidig opptil 2 ampere hver eller en trinnmotor. Vi kan kontrollere hastigheten ved hjelp av PWM og også rotasjonsretningen til motorene. Det brukes også til å kjøre lysstyrken til LED -tape.

Pin beskrivelse:

OUT1 og OUT2 port, som er for tilkobling av likestrømsmotor. OUT3 og OUT4 for tilkobling av LED -tape.

ENA og ENB er aktiveringspinner: ved å koble ENA til høy (+5V) aktiverer den porten OUT1 og OUT2.

Hvis du kobler ENA -pinnen til lav (GND), deaktiverer den OUT1 og OUT2. Tilsvarende for ENB og OUT3 og OUT4.

IN1 til IN4 er inngangspinnene som skal kobles til AVR.

Hvis IN1-høy (+5V), IN2-lav (GND), blir OUT1 høy og OUT2 blir lav, og dermed kan vi kjøre motoren.

Hvis IN3-høy (+5V), IN4-lav (GND), blir OUT4 høy og OUT3 blir lav, og dermed lyser LED-båndlyset.

Hvis du vil reversere rotasjonsretningen til motoren, må du bare reversere IN1 og IN2 polaritet, på samme måte for IN3 og IN4.

Ved å bruke PWM -signal til ENA og ENB kan du kontrollere hastigheten til motorene på to forskjellige utgangsporter.

Styret kan akseptere fra 7V til 12V nominelt.

Hoppere: Det er tre jumper pins; Jumper 1: Hvis motoren din trenger mer enn 12V forsyning, må du koble fra Jumper 1 og bruke ønsket spenning (maks 35V) på 12V -terminalen. Ta med en ny 5V -forsyning og inngang på 5V -terminalen. Ja, du må legge inn 5V hvis du trenger å bruke mer enn 12V (når Jumper 1 er fjernet).

5V-inngangen er for riktig funksjon av IC, siden fjerning av jumperen vil deaktivere den innebygde 5V-regulatoren og beskytte mot høyere inngangsspenning fra 12V-terminalen.

5V -terminalen fungerer som utgang hvis strømforsyningen din er mellom 7V til 12V og fungerer som inngang hvis du bruker mer enn 12V og jumperen er fjernet.

Jumper 2 og Jumper 3: Hvis du fjerner disse to hopperne, må du legge inn aktiverings- og deaktiveringssignalet fra mikrokontrolleren, de fleste brukerne foretrekker å fjerne de to hopperne og bruke signalet fra mikrokontrolleren.

Hvis du beholder de to hopperne, vil OUT1 til OUT4 alltid være aktivert. Husk ENA -genser for OUT1 og OUT2. ENB -genser for OUT3 og OUT4.

Trinn 5: Skrive kode for et program i C. Laste opp HEX -fil til mikrokontrollerens flashminne

Skrive og bygge AVR -mikrokontrollerprogrammet i C -kode ved hjelp av den integrerte utviklingsplattformen - Atmel Studio.

#ifndef F_CPU #definere F_CPU 16000000UL // forteller kontrollerkrystallfrekvens (16 MHz AVR ATMega328P) #endif

#include // header for å aktivere dataflytkontroll over pins. Definerer pins, porter, etc. #include // header for å aktivere forsinkelsesfunksjon i programmet

#define BUTTON1 2 // knappbryter koblet til port B pin 2 #definer DEBOUNCE_TIME 25 // tid å vente mens "de-bouncing" -knapp #definer LOCK_INPUT_TIME 300 // tid å vente etter et knappetrykk

// Timer0, PWM Initialization void timer0_init () {// set up timer OC0A, OC0B pin in toggle mode and CTC mode TCCR0A | = (1 << COM0A1) | (1 << COM0B1) | (1 << WGM00) | (1 << WGM01); // sette opp timer med prescaler = 256 TCCR0B | = (1 << CS02); // initialiser teller TCNT0 = 0; // initialiser sammenligningsverdi OCR0A = 0; }

// ADC Initialization void ADC_init () {// Enable ADC, sampling freq = osc_freq/128 set prescaler to max value, 128 ADCSRA | = (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0);

ADMUX = (1 << REFS0); // Velg spenningsreferanse (AVCC)

// Knappbryterstatus usignert char button_state () {

/ * knappen trykkes når BUTTON1 bit er klar */

hvis (! (PINB & (1 <

{

_forsinkelse_ms (DEBOUNCE_TIME);

hvis (! (PINB & (1 <

}

retur 0;

}

// Porter initialisering tomrom port_init () {DDRB = 0b00011011; // PB0-IN1, PB1-IN2, PB3-IN3, PB4-IN4, PB2-KNAPPBRYTERE DIREKTE PORTB = 0b00010110;

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

DDRC = 0b00000000; // PC0-ADC PORTC = 0b00000000; // Sett alle pinnene på PORTC lavt som slår den av. }

// Denne funksjonen leser verdien av analog til digital konvertering. uint16_t get_LightLevel () {_delay_ms (10); // Vent litt til kanalen får valgt ADCSRA | = (1 << ADSC); // Start ADC -konverteringen ved å sette ADSC -bit. Skriv 1 til ADSC

mens (ADCSRA & (1 << ADSC)); // Vent til konverteringen er fullført

// ADSC blir 0 igjen til da, kjør sløyfe kontinuerlig _delay_ms (10); retur (ADC); // Returner 10-bits resultatet

}

// Denne funksjonen Omkart et tall fra ett område (0-1023) til et annet (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 (ugyldig)

{uint16_t i1 = 0;

port_init ();

timer0_init (); ADC_init (); // initialisering ADC

mens (1)

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

OCR0A = i1; // Sett utgang sammenligne registerkanal A OCR0B = 100-i1; // Angi output sammenligne register kanal B (invertert)

if (button_state ()) // Hvis du trykker på knappen, bytt LED -status og forsinkelse i 300 ms (#define LOCK_INPUT_TIME) {PORTB ^= (1 << 0); // bytte gjeldende tilstand for pinnen IN1. PORTB ^= (1 << 1); // bytte gjeldende tilstand for pinnen IN2. Snu motorens rotasjonsretning

PORTB ^= (1 << 3); // bytte gjeldende tilstand for pinnen IN3. PORTB ^= (1 << 4); // bytte gjeldende tilstand for pinnen IN4. LED -båndet er slått av/på. _forsinkelse_ms (LOCK_INPUT_TIME); }}; retur (0); }

Programmeringen er fullført. Deretter bygger og kompilerer du prosjektkode til hex -fil.

Laster opp HEX -fil til mikrokontrollerens flashminne: skriv inn kommandoen DOS -ledetekst:

avrdude –c [navn på programmerer] –p m328p –u –U blits: w: [navn på hex -filen]

I mitt tilfelle er det:

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

Denne kommandoen skriver hex -fil til mikrokontrollerens minne. Se videoen med en detaljert beskrivelse av brenning av mikrokontroller -flashminne: Brenning av mikrokontroller -flashminne …

Ok! Nå fungerer mikrokontrolleren i henhold til instruksjonene i programmet vårt. La oss sjekke det ut!

Trinn 6: Den elektriske kretsen

Den elektriske kretsen
Den elektriske kretsen
Den elektriske kretsen
Den elektriske kretsen

Koble til komponenter i henhold til skjematisk diagram.

Anbefalt: