Innehållsförteckning:

AVR -mikrokontroller. Pulsbreddsmodulering. Kontroll av DC -motor och LED -ljusintensitet: 6 steg
AVR -mikrokontroller. Pulsbreddsmodulering. Kontroll av DC -motor och LED -ljusintensitet: 6 steg

Video: AVR -mikrokontroller. Pulsbreddsmodulering. Kontroll av DC -motor och LED -ljusintensitet: 6 steg

Video: AVR -mikrokontroller. Pulsbreddsmodulering. Kontroll av DC -motor och LED -ljusintensitet: 6 steg
Video: #ArduBlock 2.0 - Кнопочный диммер на Arduino c сохранением яркости!! 2024, December
Anonim
Image
Image

Hej alla!

Pulse Width Modulation (PWM) är en mycket vanlig teknik inom telekommunikation och strömstyrning. det används vanligtvis för att styra effekten som matas till en elektrisk enhet, oavsett om det är en motor, en LED, högtalare etc. Det är i grunden en moduleringsteknik, där bredden på bärarpulsen varieras i enlighet med den analoga meddelandesignalen.

Vi gör en enkel elektrisk krets för att styra DC -motorns rotationshastighet i ljusintensitetsberoende. Vi kommer att använda ljusberoende motstånd och AVR -mikrokontrollerfunktioner som analog till digital konvertering för att mäta ljusintensiteten. Vi kommer också att använda Dual H-Bridge Motor Driver Module-L298N. Det används vanligtvis för att styra motorns hastighet och riktning, men kan användas för andra projekt som att driva ljusstyrkan hos vissa belysningsprojekt. Dessutom lade vi till en knapp i vår krets för att växla motorns rotationsriktning.

Steg 1: Beskrivning

Beskrivning
Beskrivning
Beskrivning
Beskrivning

Varje kropp i denna värld har viss tröghet. Motorn roterar när den är påslagen. Så snart den stängs av tenderar den att stanna. Men det slutar inte direkt, det tar lite tid. Men innan det stannar helt slås det på igen! Således börjar det röra på sig. Men även nu tar det lite tid att nå sin fulla fart. Men innan det händer stängs det av och så vidare. Den totala effekten av denna åtgärd är således att motorn roterar kontinuerligt, men med lägre varvtal.

Pulsbreddsmodulering (PWM) är en relativt ny strömbrytarteknik för att ge mellanliggande mängder elektrisk kraft mellan helt på och helt av. Vanligtvis har digitala pulser samma på och av -tidsperiod, men i vissa situationer behöver vi den digitala pulsen för att ha mer/mindre tid/tid. I PWM -teknik skapar vi digitala pulser med ojämlik mängd på och av -tillstånd för att få erforderliga mellanspänningsvärden.

Driftcykeln definieras av procentandelen högspänningstid i en komplett digital puls. Det kan beräknas med:

% av driftcykeln = T på /T (periodtid) x 100

Låt oss ta ett problemmeddelande. Vi måste generera en 50 Hz PWM -signal med 45% driftscykel.

Frekvens = 50 Hz

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

Driftcykel = 45%

Således får vi lösningen enligt ekvationen ovan

T (på) = 9 ms

T (av) = 11 ms

Steg 2: AVR -timer - PWM -läge

AVR -timer - PWM -läge
AVR -timer - PWM -läge
AVR -timer - PWM -läge
AVR -timer - PWM -läge

För tillverkning av PWM innehåller AVR separat hårdvara! Genom att använda detta instruerar CPU: n hårdvaran att producera PWM för en viss driftscykel. ATmega328 har 6 PWM -utgångar, 2 är placerade på timern/räknaren 0 (8bit), 2 är placerade på timern/räknaren1 (16bit) och 2 är placerade på timern/räknaren2 (8bit). Timer/Counter0 är den enklaste PWM -enheten på ATmega328. Timer/Counter0 kan köras på 3 lägen:

  • Snabb PWM
  • Fas- och frekvenskorrigerad PWM
  • Faskorrigerad PWM

var och en av dessa lägen kan vara inverterade eller icke-inverterade.

Initiera timer 0 i PWM -läge:

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

TCCR0A | = (1 << COM0A1) | (1 << COM0B1) - konfigurera jämför utgångsläge A, B

TCCR0B | = (1 << CS02) - ställ in timer med förkalkning = 256

Steg 3: Ljusintensitetsmätning - ADC och LDR

Ljusintensitetsmätning - ADC och LDR
Ljusintensitetsmätning - ADC och LDR
Ljusintensitetsmätning - ADC och LDR
Ljusintensitetsmätning - ADC och LDR
Ljusintensitetsmätning - ADC och LDR
Ljusintensitetsmätning - ADC och LDR

Ljusberoende motstånd (LDR) är en givare som ändrar dess motstånd när ljus faller på dess yta ändras.

LDR är tillverkade av halvledarmaterial för att de ska kunna ha sina ljuskänsliga egenskaper. Dessa LDR eller FOTORESISTORER arbetar efter principen "fotokonduktivitet". Vad denna princip säger är när ljus faller på ytan av LDR (i detta fall) elementets konduktans ökar eller med andra ord minskar motståndet för LDR när ljuset faller på ytan av LDR. Denna egenskap hos minskningen av motstånd för LDR uppnås eftersom det är en egenskap hos halvledarmaterial som används på ytan. LDR används oftast för att detektera närvaro av ljus eller för att mäta ljusets intensitet.

För att överföra extern kontinuerlig information (analog information) till ett digitalt/datorsystem måste vi konvertera dem till heltal (digitala) värden. Denna typ av konvertering utförs av Analog to Digital Converter (ADC). Processen att konvertera ett analogt värde till digitalt värde kallas Analog till Digital Conversion. Kort sagt, analoga signaler är verkliga världssignaler runt oss som ljud och ljus.

Digitala signaler är analoga ekvivalenter i digitalt eller numeriskt format som är väl förstådda av digitala system som mikrokontroller. ADC är en sådan hårdvara som mäter analoga signaler och producerar en digital ekvivalent av samma signal. AVR -mikrokontroller har inbyggd ADC -anläggning för att konvertera analog spänning till ett heltal. AVR konverterar den till 10-bitars antal i intervallet 0 till 1023.

Vi använder analog till digital omvandling av spänningsnivå från avdelningskrets med LDR för att mäta ljusintensiteten.

Initiera ADC:

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

ADCSRA | = (1 << ADPS2) | (1 << ADPS1) | (1ADPS0) - konfigurera ADC -förkalkningsmedel = 128

ADMUX = (1 << REFS0) - ställ in spänningsreferens = AVCC; - konfigurera ingångskanal = ADC0

Titta på videon med en detaljerad beskrivning av ADC AVR -mikrokontroller: AVR -mikrokontroller. Ljusintensitetsmätning. ADC & LDR

Steg 4: Styrenhetens DC-motor och Dual H-Bridge-motordrivrutinmodul-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 använder likströmsmotordrivrutiner eftersom mikrokontroller inte kan leverera ström som inte överstiger 100 milliampere i allmänhet. Mikrokontrollerna är smarta men inte starka; denna modul kommer att lägga till några muskler till mikrokontroller för att driva högeffekts DC -motorer. Den kan styra 2 likströmsmotorer samtidigt upp till 2 ampere vardera eller en stegmotor. Vi kan styra varvtalet med PWM och motorns rotationsriktning. Det användes också för att driva ljusstyrkan på LED -tejp.

Pin beskrivning:

OUT1 och OUT2 port, som är för anslutning av likströmsmotor. OUT3 och OUT4 för anslutning av LED -tejp.

ENA och ENB är aktiveringsstift: genom att ansluta ENA till hög (+5V) möjliggör porten OUT1 och OUT2.

Om du ansluter ENA -stiftet till låg (GND) inaktiverar det OUT1 och OUT2. På samma sätt för ENB och OUT3 och OUT4.

IN1 till IN4 är ingångsstiften som kommer att anslutas till AVR.

Om IN1-hög (+5V), IN2-låg (GND), blir OUT1 hög och OUT2 blir låg, så vi kan driva motorn.

Om IN3-hög (+5V), IN4-låg (GND), OUT4 blir hög och OUT3 blir låg, så lyser LED-bandlampan.

Om du vill vända motorns rotationsriktning, vänd bara IN1 och IN2 polaritet, på samma sätt för IN3 och IN4.

Genom att tillämpa PWM -signalen på ENA och ENB kan du styra motorernas hastighet på två olika utgångsportar.

Styrelsen kan acceptera från 7V till 12V nominellt.

Byxor: Det finns tre bygelnålar; Bygel 1: Om din motor behöver mer än 12V matning måste du koppla bort bygeln 1 och tillföra önskad spänning (max 35V) vid 12V -terminalen. Ta med ytterligare en 5V -matning och ingång på 5V -terminalen. Ja, du måste mata in 5V om du behöver applicera mer än 12V (när bygel 1 tas bort).

5V-ingången är avsedd för korrekt fungerande IC, eftersom borttagning av bygeln inaktiverar den inbyggda 5V-regulatorn och skyddar mot högre ingångsspänning från 12V-terminalen.

5V -terminalen fungerar som utgång om din matning är mellan 7V och 12V och fungerar som ingång om du använder mer än 12V och bygeln är borttagen.

Jumper 2 och Jumper 3: Om du tar bort dessa två hoppare måste du mata in aktiverings- och avaktiveringssignalen från mikrokontrollern, de flesta användare föredrar att ta bort de två hopparna och tillämpa signalen från mikrokontrollern.

Om du behåller de två hopparna är OUT1 till OUT4 alltid aktiverad. Kom ihåg ENA -bygel för OUT1 och OUT2. ENB -bygel för OUT3 och OUT4.

Steg 5: Skriva kod för ett program i C. Överföring av HEX -fil till mikrokontrollerns flashminne

Skriva och bygga AVR -mikrokontrollerprogrammet i C -kod med hjälp av den integrerade utvecklingsplattformen - Atmel Studio.

#ifndef F_CPU #definiera F_CPU 16000000UL // berätta styrenhetens kristallfrekvens (16 MHz AVR ATMega328P) #endif

#include // header för att möjliggöra dataflödeskontroll över stift. Definierar stift, portar etc. #include // header för att aktivera fördröjningsfunktion i programmet

#define BUTTON1 2 // knappomkopplare ansluten till port B pin 2 #define DEBOUNCE_TIME 25 // tid att vänta medan "de-bouncing" -knapp #define LOCK_INPUT_TIME 300 // tid att vänta efter ett knapptryck

// 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); // ställa in timer med förkalkning = 256 TCCR0B | = (1 << CS02); // initiera räknaren TCNT0 = 0; // initiera jämför värde 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); // Välj spänningsreferens (AVCC)

// Knappomkopplarstatus osignerad char button_state () {

/ * knappen trycks in när BUTTON1 bit är klar */

om (! (PINB & (1 <

{

_delay_ms (DEBOUNCE_TIME);

om (! (PINB & (1 <

}

returnera 0;

}

// Portar Initialisering void port_init () {DDRB = 0b00011011; // PB0-IN1, PB1-IN2, PB3-IN3, PB4-IN4, PB2-KNAPPKNAPP DIRECT PORTB = 0b00010110;

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

DDRC = 0b00000000; // PC0-ADC PORTC = 0b00000000; // Ställ in alla stift på PORTC som stänger av den. }

// Denna funktion läser värdet av den analoga till digitala konverteringen. uint16_t get_LightLevel () {_delay_ms (10); // Vänta en stund tills kanalen har valt ADCSRA | = (1 << ADSC); // Starta ADC -konverteringen genom att ställa in ADSC -bit. Skriv 1 till ADSC

medan (ADCSRA & (1 << ADSC)); // Vänta på att konverteringen är klar

// ADSC blir 0 igen tills dess, kör loop loop kontinuerligt _delay_ms (10); retur (ADC); // Returnera 10-bitarsresultatet

}

// Denna funktion Kartlägger om ett tal från ett intervall (0-1023) till ett annat (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 (void)

{uint16_t i1 = 0;

port_init ();

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

medan (1)

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

OCR0A = i1; // Ställ in utgång jämför registerkanal A OCR0B = 100-i1; // Ställ in utgång jämför registerkanal B (inverterad)

if (button_state ()) // Om knappen trycks in, växla lysdiodens status och fördröjning i 300ms (#define LOCK_INPUT_TIME) {PORTB ^= (1 << 0); // växla det aktuella tillståndet för stiftet IN1. PORTB ^= (1 << 1); // växla det aktuella tillståndet för stiftet IN2. Vänd motorns rotationsriktning

PORTB ^= (1 << 3); // växla det aktuella tillståndet för stiftet IN3. PORTB ^= (1 << 4); // växla det aktuella tillståndet för stiftet IN4. LED -tejpen är av/på. _delay_ms (LOCK_INPUT_TIME); }}; retur (0); }

Programmeringen är klar. Bygg sedan och kompilera projektkod till hex -fil.

Ladda upp HEX -fil till mikrokontrollerns flashminne: skriv in kommandot i DOS -promptfönstret:

avrdude –c [namn på programmerare] –p m328p –u –U blixt: w: [namn på din hex -fil]

I mitt fall är det:

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

Detta kommando skriver hex -fil till mikrokontrollerns minne. Titta på videon med en detaljerad beskrivning av mikrokontrollerens flashminnesförbränning: Microcontroller -flashminnesbränning …

Ok! Nu fungerar mikrokontrollern i enlighet med instruktionerna i vårt program. Låt oss kolla upp det!

Steg 6: Den elektriska kretsen

Den elektriska kretsen
Den elektriska kretsen
Den elektriska kretsen
Den elektriska kretsen

Anslut komponenter enligt schematiskt diagram.

Rekommenderad: