Talaan ng mga Nilalaman:

AVR Microcontroller. Pulse Width Modulation. Сontroller ng DC Motor at LED Light Intensity .: 6 Mga Hakbang
AVR Microcontroller. Pulse Width Modulation. Сontroller ng DC Motor at LED Light Intensity .: 6 Mga Hakbang

Video: AVR Microcontroller. Pulse Width Modulation. Сontroller ng DC Motor at LED Light Intensity .: 6 Mga Hakbang

Video: AVR Microcontroller. Pulse Width Modulation. Сontroller ng DC Motor at LED Light Intensity .: 6 Mga Hakbang
Video: Creating a PWM in Assembly - Part 7 Microcontroller Basics (PIC10F200) 2024, Nobyembre
Anonim
Image
Image

Kamusta po kayo lahat!

Ang Pulse Width Modulation (PWM) ay isang pangkaraniwang pamamaraan sa telecommunication at control sa kuryente. ito ay karaniwang ginagamit upang makontrol ang kapangyarihan na pinakain sa isang de-koryenteng aparato, maging ito ay isang motor, isang LED, mga nagsasalita, atbp Ito ay karaniwang isang modulationtechnique, kung saan ang lapad ng carrier pulse ay iba-iba alinsunod sa signal ng analog message.

Gumagawa kami ng simpleng circuit ng kuryente upang makontrol ang bilis ng pag-ikot ng DC motor na umaasa sa light intensity. Gagamitin namin ang mga tampok na Light Dependent Resistor at AVR microcontroller tulad ng Analog sa Digital Conversion upang masukat ang tindi ng ilaw. Gagamit din kami ng Dual H-Bridge Motor Driver Module-L298N. Karaniwan itong ginagamit sa pagkontrol ng bilis at direksyon ng mga motor, ngunit maaaring magamit para sa iba pang mga proyekto tulad ng pagmamaneho ng ningning ng ilang mga proyekto sa pag-iilaw. Gayundin, nagdagdag ng isang pindutan sa aming circuit upang i-toggle ang direksyon ng pag-ikot ng engine.

Hakbang 1: Paglalarawan

Paglalarawan
Paglalarawan
Paglalarawan
Paglalarawan

Ang bawat katawan sa mundong ito ay mayroong ilang pagkawalang-kilos. Paikutin ang motor tuwing ito ay pinapatakbo. Sa sandaling ito ay naka-off, malamang na huminto ito. Ngunit hindi ito tumitigil kaagad, tumatagal ng ilang oras. Ngunit bago ito tuluyang huminto, ito ay muling pinapagana! Sa gayon nagsisimula itong gumalaw. Ngunit kahit ngayon, tumatagal ng ilang oras upang maabot ang buong bilis nito. Ngunit bago ito nangyari, ito ay pinapatay, at iba pa. Kaya, ang pangkalahatang epekto ng aksyon na ito ay ang motor na patuloy na umiikot, ngunit sa isang mas mababang bilis.

Ang Pulse Width Modulation (PWM) ay isang kamakailan-lamang na diskarte sa paglipat ng kuryente para sa pagbibigay ng mga intermediate na halaga ng kuryenteng kuryente sa pagitan ng ganap at ganap na antas ng pag-off. Karaniwan, ang mga digital na pulso ay may pareho sa at off na tagal ng oras, ngunit sa ilang mga sitwasyon kailangan namin ang digital na pulso upang magkaroon ng higit / mas mababa sa oras / offtime. Sa diskarteng PWM, lumilikha kami ng mga digital na pulso na may hindi pantay na halaga ng on at off na estado upang makuha ang kinakailangang mga halagang halagang boltahe.

Ang cycle ng tungkulin ay tinukoy ng porsyento ng tagal ng mataas na boltahe sa isang kumpletong digital na pulso. Maaari itong kalkulahin ng:

% ng Duty cycle = T on / T (tagal ng panahon) x 100

Kumuha tayo ng isang pahayag ng problema. Kailangan nating makabuo ng isang 50 Hz PWM signal na mayroong 45% na cycle ng tungkulin.

Dalas = 50 Hz

Panahon ng oras, T = T (on) + T (off) = 1/50 = 0.02 s = 20 ms

Duty Cycle = 45%

Sa gayon, ang paglutas ayon sa equation na ibinigay sa itaas, nakukuha natin

T (on) = 9 ms

T (off) = 11 ms

Hakbang 2: Mga Timer ng AVR - Mode ng PWM

Mga timer ng AVR - PWM Mode
Mga timer ng AVR - PWM Mode
Mga timer ng AVR - PWM Mode
Mga timer ng AVR - PWM Mode

Para sa paggawa ng PWM, naglalaman ang AVR ng magkakahiwalay na hardware! Sa pamamagitan ng paggamit nito, inuutusan ng CPU ang hardware upang makabuo ng PWM ng isang partikular na cycle ng tungkulin. Ang ATmega328 ay mayroong 6 PWM output, 2 ay matatagpuan sa timer / counter0 (8bit), 2 ay matatagpuan sa timer / counter1 (16bit), at 2 ay matatagpuan sa timer / counter2 (8bit). Ang Timer / Counter0 ay ang pinakasimpleng aparato ng PWM sa ATmega328. Ang timer / Counter0 ay may kakayahang tumakbo sa 3 mga mode:

  • Mabilis na PWM
  • Phase at Frequency Naitama ang PWM
  • Naitama ang Yugto ng PWM

ang bawat isa sa mga mode na ito ay maaaring baligtarin o hindi baligtarin.

Simulan ang Timer0 sa PWM mode:

TCCR0A | = (1 << WGM00) | (1 << WGM01) - i-set up ang WGM: Mabilis na PWM

TCCR0A | = (1 << COM0A1) | (1 << COM0B1) - i-set up ang ihambing ang output mode A, B

TCCR0B | = (1 << CS02) - i-set up ang timer gamit ang prescaler = 256

Hakbang 3: Pagsukat ng Banayad na Intensity - ADC & LDR

Pagsukat sa Banayad na Intensity - ADC & LDR
Pagsukat sa Banayad na Intensity - ADC & LDR
Pagsukat sa Banayad na Intensity - ADC & LDR
Pagsukat sa Banayad na Intensity - ADC & LDR
Pagsukat sa Banayad na Intensity - ADC & LDR
Pagsukat sa Banayad na Intensity - ADC & LDR

Ang Light Dependent Resistor (LDR) ay isang transducer na nagbabago ng paglaban nito kapag bumagsak ang ilaw sa mga pagbabago sa ibabaw nito.

Ang mga LDR ay ginawa mula sa mga materyales na semiconductor upang paganahin ang mga ito na magkaroon ng kanilang light sensitive na mga katangian. Ang mga LDR na ito o LABAN NG LARAWAN ay gumagana sa prinsipyo ng "Pag-uugali ng Larawan". Ngayon kung ano ang sinasabi ng prinsipyong ito na tuwing ang ilaw ay bumagsak sa ibabaw ng LDR (sa kasong ito) ang conductance ng elemento ay tataas o sa madaling salita ang pagbawas ng LDR ay bumababa kapag ang ilaw ay bumagsak sa ibabaw ng LDR. Ang pag-aari na ito ng pagbawas ng paglaban para sa LDR ay nakamit dahil ito ay isang pag-aari ng materyal na semiconductor na ginamit sa ibabaw. Ginagamit ang LDR sa karamihan ng mga oras upang makita ang pagkakaroon ng ilaw o para sa pagsukat ng tindi ng ilaw.

Para sa paglilipat ng panlabas na tuloy-tuloy na impormasyon (impormasyon sa analog) sa isang digital / computing system, dapat nating i-convert ang mga ito sa mga halagang integer (digital). Ang ganitong uri ng conversion ay isinasagawa ng Analog to Digital Converter (ADC). Ang proseso ng pag-convert ng isang halagang analog sa digital na halaga ay kilala bilang Analog to Digital Conversion. Sa madaling sabi, ang mga signal ng analog ay totoong mga signal ng mundo sa paligid natin tulad ng tunog at ilaw.

Ang mga digital signal ay katumbas na analog sa digital o numeric format na mahusay na nauunawaan ng mga digital system tulad ng microcontrollers. Ang ADC ay isang tulad ng hardware na sumusukat sa mga analog signal at gumagawa ng isang digital na katumbas ng parehong signal. Ang mga AVR microcontroller ay may naitayong pasilidad ng ADC upang i-convert ang analog voltage sa isang integer. AVR convert ito sa 10-bit na bilang ng saklaw na 0 hanggang 1023.

Gumagamit kami ng analog sa digital na pag-convert ng antas ng boltahe mula sa divider circuit na may LDR upang masukat ang tindi ng ilaw.

Simulan ang ADC:

TADCSRA | = (1 << ADEN) - Paganahin ang ADC

ADCSRA | = (1 << ADPS2) | (1 << ADPS1) | (1ADPS0) - i-set up ang ADC prescaler = 128

ADMUX = (1 << REFS0) - i-set up ang boltahe na sanggunian = AVCC; - i-set up ang Input Channel = ADC0

Panoorin ang video na may detalyadong paglalarawan ng ADC AVR microcontroller: AVR Microcontroller. Maliit na Pagsukat sa Intensity. ADC & LDR

Hakbang 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

Gumagamit kami ng mga driver ng DC motor dahil ang mga microcontroller ay hindi kayang maghatid ng kasalukuyang hindi hihigit sa 100 milliamp sa pangkalahatan. Ang mga microcontroller ay matalino ngunit hindi malakas; ang modyul na ito ay magdaragdag ng ilang mga kalamnan sa mga microcontroller upang maghimok ng mga de-kuryenteng DC motor. Maaari nitong makontrol ang 2 DC motors nang sabay-sabay hanggang sa 2 amps bawat isa o isang stepper motor. Maaari naming makontrol ang bilis gamit ang PWM at pati na rin ang paikot na direksyon ng mga motor. Gayundin, Ginamit ito para sa pagmamaneho ng ningning ng LED tape.

Paglalarawan ng pin:

OUT1 at OUT2 port, na para sa pagkonekta sa DC motor. OUT3 at OUT4 para sa pagkonekta sa LED tape.

Ang ENA at ENB ay pinapagana ang mga pin: sa pamamagitan ng pagkonekta sa ENA sa mataas (+ 5V) pinapagana nito ang port na OUT1 at OUT2.

Kung ikinonekta mo ang ENA pin sa mababa (GND), hindi pinagagana nito ang OUT1 at OUT2. Katulad nito, para sa ENB at OUT3 at OUT4.

Ang IN1 hanggang IN4 ang mga input pin na konektado sa AVR.

Kung IN1-high (+ 5V), IN2-low (GND), ang OUT1 ay mataas at ang OUT2 ay bumababa, kaya maaari tayong magmaneho ng motor.

Kung IN3-high (+ 5V), IN4-low (GND), ang OUT4 ay mataas at ang OUT3 ay bumababa, kaya't naka-on ang ilaw ng LED tape.

Kung nais mong baligtarin ang paikot na direksyon ng motor baligtarin lamang ang IN1 at IN2 polarity, katulad para sa IN3 at IN4.

Sa pamamagitan ng paglalapat ng PWM signal sa ENA at ENB maaari mong makontrol ang bilis ng mga motor sa dalawang magkakaibang output port.

Maaaring tanggapin ng lupon mula 7V hanggang 12V nang nominally.

Mga Jumpers: Mayroong tatlong mga jumper pin; Jumper 1: Kung ikaw ay motor na nangangailangan ng higit sa 12V supply kailangan mong idiskonekta ang Jumper 1 at ilapat ang nais na boltahe (max 35V) sa 12V terminal. Magdala ng isa pang 5V supply at input sa 5V terminal. Oo, kailangan mong maglagay ng 5V kung kailangan mong mag-apply ng higit sa 12V (kapag tinanggal ang Jumper 1).

Ang 5V input ay para sa wastong paggana ng IC, dahil ang pag-alis ng jumper ay hindi pagaganahin ang built-in na 5V regulator at protektahan mula sa mas mataas na boltahe ng pag-input mula sa 12V terminal.

Ang terminal ng 5V ay gumaganap bilang output kung ang iyong supply ay nasa pagitan ng 7V hanggang 12V at kumikilos bilang pag-apply kung mag-apply ka ng higit sa 12V at ang jumper ay tinanggal.

Jumper 2 at Jumper 3: Kung aalisin mo ang dalawang jumper na ito kailangan mong i-input ang paganahin at huwag paganahin ang signal mula sa microcontroller, gusto ng karamihan sa mga gumagamit na alisin ang dalawang jumper at ilapat ang signal mula sa microcontroller.

Kung panatilihin mo ang dalawang jumper ang OUT1 hanggang OUT4 ay laging pinapagana. Tandaan ang ENA jumper para sa OUT1 at OUT2. ENB jumper para sa OUT3 at OUT4.

Hakbang 5: Pagsulat ng Code para sa isang Program sa C. Pag-upload ng HEX File Sa Microcontroller Flash Memory

Pagsulat at pagbuo ng aplikasyon ng AVR microcontroller sa C Code gamit ang Integrated Development Platform - Atmel Studio.

#ifndef F_CPU # tukuyin ang F_CPU 16000000UL // sinasabi sa dalas ng kristal ng controller (16 MHz AVR ATMega328P) #endif

#include // header upang paganahin ang kontrol ng daloy ng data sa mga pin. Tinutukoy ang mga pin, port, atbp. # Isama ang // header upang paganahin ang pagka-antala sa pagpapaandar sa programa

#define BUTTON1 2 // pindutan ng switch na konektado sa port B pin 2 #define DEBOUNCE_TIME 25 // oras upang maghintay habang ang pindutang "de-bouncing" #define LOCK_INPUT_TIME 300 // oras upang maghintay pagkatapos ng isang pindutang pindutin

// 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); // set up timer with prescaler = 256 TCCR0B | = (1 << CS02); // initialize counter TCNT0 = 0; // initialize ihambing ang halaga ng 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); // Select Voltage Reference (AVCC)

// Button switch switch status unsigned char button_state () {

/ * ang pindutan ay pinindot kapag ang BUTTON1 bit ay malinaw * /

kung (! (PINB & (1 <

{

_delay_ms (DEBOUNCE_TIME);

kung (! (PINB & (1 <

}

ibalik ang 0;

}

// Ports Initialization void 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; // Itakda ang lahat ng mga pin ng PORTC mababa na papatayin. }

// Ang pagpapaandar na ito ay binabasa ang halaga ng analog sa digital convert. uint16_t get_LightLevel () {_delay_ms (10); // Maghintay ng kaunting oras para makakuha ng napiling ADCSRA | = (1 << ADSC) ang channel; // Start the ADC conversion by setting ADSC bit. Sumulat ng 1 hanggang sa ADSC

habang (ADCSRA & (1 << ADSC)); // Maghintay para makumpleto ang conversion

// ADSC nagiging 0 muli hanggang sa pagkatapos, patuloy na magpatakbo ng loop _delay_ms (10); bumalik (ADC); // Ibalik ang 10-bit na resulta

}

// Ang pagpapaandar na ito Re-map ng isang numero mula sa isang saklaw (0-1023) patungo sa isa pa (0-100). uint32_t mapa (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 (walang bisa)

{uint16_t i1 = 0;

port_init ();

timer0_init (); ADC_init (); // initialization ADC

habang (1)

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

OCR0A = i1; // Itakda ang output ihambing ang register channel A OCR0B = 100-i1; // Itakda ang output ihambing ang register channel B (inverted)

kung (button_state ()) // Kung ang pindutan ay pinindot, i-toggle ang estado ng LED at antalahin ang 300ms (#define LOCK_INPUT_TIME) {PORTB ^ = (1 << 0); // toggling ang kasalukuyang estado ng pin IN1. PORTB ^ = (1 << 1); // toggling ang kasalukuyang estado ng pin IN2. Baligtarin ang paikot na direksyon ng motor

PORTB ^ = (1 << 3); // toggling ang kasalukuyang estado ng pin IN3. PORTB ^ = (1 << 4); // toggling ang kasalukuyang estado ng pin IN4. Patay / nakabukas ang LED Tape. _delay_ms (LOCK_INPUT_TIME); }}; bumalik (0); }

Kumpleto na ang Programming. Susunod, pagbuo at pag-compile ng code ng proyekto sa hex file.

Ang pag-upload ng HEX file sa microcontroller flash memory: i-type sa DOS prompt window ang utos:

avrdude –c [pangalan ng programmer] –p m328p –u –U flash: w: [pangalan ng iyong hex file]

Sa aking kaso ito ay:

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

Nagsusulat ang utos na ito ng hex file sa memorya ng microcontroller. Panoorin ang video na may detalyadong paglalarawan ng microcontroller flash memory burn: Microcontroller flash memory burn…

Ok! Ngayon, gumagana ang microcontroller alinsunod sa mga tagubilin ng aming programa. Tignan natin!

Hakbang 6: Ang Electrical Circuit

Ang Electrical Circuit
Ang Electrical Circuit
Ang Electrical Circuit
Ang Electrical Circuit

Ikonekta ang mga sangkap alinsunod sa diagram ng eskematiko.

Inirerekumendang: