Indholdsfortegnelse:

AVR mikrokontroller. Pulsbredde modulering. Controller af DC -motor og LED -lysintensitet .: 6 trin
AVR mikrokontroller. Pulsbredde modulering. Controller af DC -motor og LED -lysintensitet .: 6 trin

Video: AVR mikrokontroller. Pulsbredde modulering. Controller af DC -motor og LED -lysintensitet .: 6 trin

Video: AVR mikrokontroller. Pulsbredde modulering. Controller af DC -motor og LED -lysintensitet .: 6 trin
Video: M#1: Настройка ПЛК Outseal Mega с отладочной платой ATmega128 | Аутсил Дев. ПЛК Мега 2024, November
Anonim
Image
Image

Hej allesammen!

Pulse Width Modulation (PWM) er en meget almindelig teknik inden for telekommunikation og strømstyring. det er almindeligt brugt til at styre strømmen til en elektrisk enhed, uanset om det er en motor, en LED, højttalere osv. Det er dybest set en moduleringsteknik, hvor bredden af bærepulsen varieres i overensstemmelse med det analoge meddelelsessignal.

Vi laver et enkelt elektrisk kredsløb til at styre DC -motorens rotationshastighed i lysintensitetsafhængighed. Vi kommer til at bruge lysafhængig modstand og AVR -mikrokontrollerfunktioner som analog til digital konvertering til at måle lysintensiteten. Vi kommer også til at bruge Dual H-Bridge Motor Driver Module-L298N. Det bruges typisk til at styre motorers hastighed og retning, men kan bruges til andre projekter, såsom at køre lysstyrken i visse belysningsprojekter. Tilføjede også en knap til vores kredsløb for at skifte motorens rotationsretning.

Trin 1: Beskrivelse

Beskrivelse
Beskrivelse
Beskrivelse
Beskrivelse

Hver eneste krop i denne verden har en vis inerti. Motoren roterer, når den er tændt. Så snart den er slukket, vil den have en tendens til at stoppe. Men det stopper ikke med det samme, det tager lidt tid. Men inden den stopper helt, tændes den igen! Således begynder det at bevæge sig. Men selv nu tager det noget tid at nå sin fulde fart. Men inden det sker, slukkes det og så videre. Den samlede effekt af denne handling er således, at motoren roterer kontinuerligt, men med en lavere hastighed.

Pulse Width Modulation (PWM) er en forholdsvis ny strømafbryderteknik til at levere mellemliggende mængder elektrisk strøm mellem fuldt tændt og helt slukket niveau. Normalt har digitale pulser samme periode til og fra, men i nogle situationer har vi brug for, at den digitale puls har mere/mindre til tiden/til tiden. I PWM -teknik skaber vi digitale impulser med ulige mængder til og fra for at få nødvendige mellemspændingsværdier.

Driftscyklus er defineret af procentdelen af højspændingsvarighed i en komplet digital puls. Det kan beregnes ved at:

% af driftscyklus = T on /T (periode) x 100

Lad os tage en problemformulering. Vi skal generere et 50 Hz PWM -signal med 45% driftscyklus.

Frekvens = 50 Hz

Tidsperiode, T = T (tændt) + T (slukket) = 1/50 = 0,02 s = 20 ms

Arbejdscyklus = 45%

Således får vi ved at løse ifølge ligning givet ovenfor

T (tændt) = 9 ms

T (slukket) = 11 ms

Trin 2: AVR -timere - PWM -tilstand

AVR -timere - PWM -tilstand
AVR -timere - PWM -tilstand
AVR -timere - PWM -tilstand
AVR -timere - PWM -tilstand

Til fremstilling af PWM indeholder AVR separat hardware! Ved at bruge dette instruerer CPU'en hardwaren i at producere PWM for en bestemt driftscyklus. ATmega328 har 6 PWM -udgange, 2 er placeret på timer/tæller0 (8bit), 2 er placeret på timer/tæller1 (16bit), og 2 er placeret på timer/tæller2 (8bit). Timer/Counter0 er den enkleste PWM -enhed på ATmega328. Timer/Counter0 kan køre i 3 tilstande:

  • Hurtig PWM
  • Fase og frekvens korrigeret PWM
  • Fasekorrigeret PWM

hver af disse tilstande kan være inverteret eller ikke-inverteret.

Initialiser timer 0 i PWM -tilstand:

TCCR0A | = (1 << WGM00) | (1 << WGM01) - opsæt WGM: Hurtig PWM

TCCR0A | = (1 << COM0A1) | (1 << COM0B1) - opsæt sammenligning af udgangstilstand A, B

TCCR0B | = (1 << CS02) - opsætningstimer med prescaler = 256

Trin 3: Måling af lysintensitet - ADC og LDR

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

Lysafhængig modstand (LDR) er en transducer, der ændrer dens modstand, når lys falder på dens overflade ændres.

LDR'er er fremstillet af halvledermaterialer, så de kan have deres lysfølsomme egenskaber. Disse LDR'er eller FOTO -RESISTORER arbejder efter princippet om "fotokonduktivitet". Det princip siger nu, når lyset falder på overfladen af LDR (i dette tilfælde) elementets konduktans øges, eller med andre ord LDR's modstand falder, når lyset falder på overfladen af LDR. Denne egenskab ved faldet i modstand for LDR opnås, fordi det er en egenskab af halvledermateriale, der bruges på overfladen. LDR bruges oftest til at detektere tilstedeværelse af lys eller til måling af lysets intensitet.

For at overføre ekstern kontinuerlig information (analog information) til et digitalt/computersystem skal vi konvertere dem til heltals (digitale) værdier. Denne type konvertering udføres af Analog to Digital Converter (ADC). Processen med at konvertere en analog værdi til digital værdi er kendt som Analog til Digital Conversion. Kort sagt, analoge signaler er virkelige verdenssignaler omkring os som lyd og lys.

Digitale signaler er analoge ækvivalenter i digitalt eller numerisk format, som godt forstås af digitale systemer som mikrokontrollere. ADC er en sådan hardware, der måler analoge signaler og producerer en digital ækvivalent af det samme signal. AVR -mikrokontrollere har indbygget ADC -facilitet til at konvertere analog spænding til et helt tal. AVR konverterer det til 10-bit antal i området 0 til 1023.

Vi bruger analog til digital konvertering af spændingsniveau fra divider kredsløb med LDR til at måle lysintensiteten.

Initialiser ADC:

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

ADCSRA | = (1 << ADPS2) | (1 << ADPS1) | (1ADPS0) - opsæt ADC prescaler = 128

ADMUX = (1 << REFS0) - opsæt spændingsreferencen = AVCC; - opsætning af inputkanal = ADC0

Se videoen med en detaljeret beskrivelse af ADC AVR mikrokontroller: AVR mikrokontroller. Måling af lysintensitet. ADC & LDR

Trin 4: Controller DC Motor & Dual H-Bridge Motor Driver Module-L298N

Controller DC Motor & Dual H-Bridge Motor Driver Module-L298N
Controller DC Motor & Dual H-Bridge Motor Driver Module-L298N
Controller DC Motor & Dual H-Bridge Motor Driver Module-L298N
Controller DC Motor & Dual H-Bridge Motor Driver Module-L298N
Controller DC Motor & Dual H-Bridge Motor Driver Module-L298N
Controller DC Motor & Dual H-Bridge Motor Driver Module-L298N

Vi bruger jævnstrømsmotordrivere, fordi mikrokontroller ikke er i stand til at levere strøm på ikke mere end 100 milliampere generelt. Mikrokontrollerne er smarte, men ikke stærke; dette modul tilføjer nogle muskler til mikrokontrollere til at drive højeffektive DC -motorer. Det kan styre 2 DC -motorer samtidigt op til 2 ampere hver eller en trinmotor. Vi kan kontrollere hastigheden ved hjælp af PWM og også dens rotationsretning for motorerne. Det bruges også til at køre lysstyrken på LED -bånd.

Pin beskrivelse:

OUT1 og OUT2 port, som er til tilslutning af DC motor. OUT3 og OUT4 til tilslutning af LED -bånd.

ENA og ENB er aktiveringsstifter: ved at slutte ENA til høj (+5V) aktiverer den porten OUT1 og OUT2.

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

IN1 til IN4 er input -benene, som vil blive tilsluttet AVR.

Hvis IN1-høj (+5V), IN2-lav (GND), drejer OUT1 høj og OUT2 lav, så vi kan køre motor.

Hvis IN3-høj (+5V), IN4-lav (GND), bliver OUT4 høj og OUT3 bliver lav, og derfor er LED-båndlyset tændt.

Hvis du vil vende motorens rotationsretning, skal du bare vende IN1 og IN2 polaritet, tilsvarende for IN3 og IN4.

Ved at anvende PWM -signal til ENA og ENB kan du styre motorernes hastighed på to forskellige outputporte.

Bestyrelsen kan acceptere fra 7V til 12V nominelt.

Jumpere: Der er tre jumper pins; Jumper 1: Hvis din motor har brug for mere end 12V forsyning, skal du afbryde Jumper 1 og anvende den ønskede spænding (maks. 35V) på 12V terminalen. Medbring endnu en 5V forsyning og input ved 5V terminal. Ja, du skal indtaste 5V, hvis du skal anvende mere end 12V (når Jumper 1 fjernes).

5V-indgangen er til korrekt funktion af IC, da fjernelse af jumperen deaktiverer den indbyggede 5V-regulator og beskytter mod højere indgangsspænding fra 12V-terminalen.

5V -terminalen fungerer som output, hvis din forsyning er mellem 7V og 12V og fungerer som input, hvis du anvender mere end 12V, og jumperen er fjernet.

Jumper 2 og Jumper 3: Hvis du fjerner disse to jumpere, skal du indtaste aktiverings- og deaktiveringssignalet fra mikrokontrolleren, de fleste brugere foretrækker at fjerne de to jumpere og anvende signalet fra mikrokontrolleren.

Hvis du beholder de to springere, vil OUT1 til OUT4 altid være aktiveret. Husk ENA -jumper til OUT1 og OUT2. ENB -jumper til OUT3 og OUT4.

Trin 5: Skrivning af kode for et program i C. Upload af HEX -fil i mikrokontrollerens flash -hukommelse

Skrivning og opbygning af AVR -mikrokontrollerprogrammet i C -kode ved hjælp af den integrerede udviklingsplatform - Atmel Studio.

#ifndef F_CPU #definere F_CPU 16000000UL // fortæller controller krystalfrekvens (16 MHz AVR ATMega328P) #endif

#include // header for at aktivere dataflowkontrol over pins. Definerer pins, porte osv. #Include // header for at aktivere forsinkelsesfunktion i programmet

#define BUTTON1 2 // knapkontakt tilsluttet port B pin 2 #definer DEBOUNCE_TIME 25 // tid til at vente, mens "de-bouncing" knap #definer LOCK_INPUT_TIME 300 // tid til at vente efter et tryk på en knap

// Timer0, PWM Initialisering ugyldig timer0_init () {// opsætning af timer OC0A, OC0B pin i skiftemodus og CTC -tilstand TCCR0A | = (1 << COM0A1) | (1 << COM0B1) | (1 << WGM00) | (1 << WGM01); // opsætningstimer med prescaler = 256 TCCR0B | = (1 << CS02); // initialiser tælleren TCNT0 = 0; // initialiser sammenligningsværdi OCR0A = 0; }

// ADC Initialization void ADC_init () {// Aktiver ADC, sampling freq = osc_freq/128 indstil prescaler til maks. Værdi, 128 ADCSRA | = (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0);

ADMUX = (1 << REFS0); // Vælg spændingsreference (AVCC)

// Button switch status unsigned char button_state () {

/ * der trykkes på knappen, når BUTTON1 bit er klar */

hvis (! (PINB & (1 <

{

_forsinkelse_ms (DEBOUNCE_TIME);

hvis (! (PINB & (1 <

}

returnere 0;

}

// Porte Initialisering tomrum 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; // Sæt alle stifter i PORTC lavt, hvilket slukker det. }

// Denne funktion læser værdien af den analoge til digitale konvertering. uint16_t get_LightLevel () {_delay_ms (10); // Vent et stykke tid på, at kanalen får den valgte ADCSRA | = (1 << ADSC); // Start ADC -konverteringen ved at indstille ADSC -bit. Skriv 1 til ADSC

mens (ADCSRA & (1 << ADSC)); // Vent på, at konverteringen er fuldført

// ADSC bliver til 0 igen indtil da, kør loop kontinuerligt _delay_ms (10); retur (ADC); // Returner 10-bit resultatet

}

// Denne funktion Kortlægger et tal fra et område (0-1023) til et andet (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 (tomrum)

{uint16_t i1 = 0;

port_init ();

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

mens (1)

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

OCR0A = i1; // Indstil output sammenligne registerkanal A OCR0B = 100-i1; // Indstil output sammenligne register kanal B (omvendt)

hvis (button_state ()) // Hvis der trykkes på knappen, skift LED'ens tilstand og forsinkelse i 300ms (#define LOCK_INPUT_TIME) {PORTB ^= (1 << 0); // skifte den aktuelle tilstand af pin IN1. PORTB ^= (1 << 1); // skifte den aktuelle tilstand af pin IN2. Vend motorens rotationsretning

PORTB ^= (1 << 3); // skifte den aktuelle tilstand af pin IN3. PORTB ^= (1 << 4); // skifte den aktuelle tilstand af pin IN4. LED -bånd er slukket/tændt. _forsinkelse_ms (LOCK_INPUT_TIME); }}; retur (0); }

Programmeringen er fuldført. Dernæst bygger og kompilerer projektkode til hex -fil.

Upload af HEX -fil til mikrokontrollerens flash -hukommelse: Indtast kommandoen i DOS -promptvinduet:

avrdude –c [navn på programmør] –p m328p –u –U flash: w: [navn på din hex -fil]

I mit tilfælde er det:

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

Denne kommando skriver hex -fil til mikrokontrollerens hukommelse. Se videoen med en detaljeret beskrivelse af mikrokontrollerens flashhukommelsesforbrænding: Mikrokontrollerens flashhukommelse brænder …

Okay! Nu fungerer mikrokontrolleren i overensstemmelse med instruktionerne i vores program. Lad os tjekke det ud!

Trin 6: Det elektriske kredsløb

Det elektriske kredsløb
Det elektriske kredsløb
Det elektriske kredsløb
Det elektriske kredsløb

Tilslut komponenter i henhold til skematisk diagram.

Anbefalede: