Բովանդակություն:

AVR միկրոկոնտրոլեր: Իմպուլսի լայնության մոդուլյացիա: DC շարժիչի և LED լույսի ինտենսիվության վերահսկիչ. 6 քայլ
AVR միկրոկոնտրոլեր: Իմպուլսի լայնության մոդուլյացիա: DC շարժիչի և LED լույսի ինտենսիվության վերահսկիչ. 6 քայլ

Video: AVR միկրոկոնտրոլեր: Իմպուլսի լայնության մոդուլյացիա: DC շարժիչի և LED լույսի ինտենսիվության վերահսկիչ. 6 քայլ

Video: AVR միկրոկոնտրոլեր: Իմպուլսի լայնության մոդուլյացիա: DC շարժիչի և LED լույսի ինտենսիվության վերահսկիչ. 6 քայլ
Video: ESP32 Tutorial 15 - DC Motor Speed Control with ESP32 L293D | SunFounder's ESP32 IoT Learnig kit 2024, Նոյեմբեր
Anonim
Image
Image

Ողջույն բոլորին!

Pulse Width Modulation (PWM) շատ տարածված տեխնիկա է հեռահաղորդակցության և էներգիայի կառավարման մեջ: այն սովորաբար օգտագործվում է էլեկտրական սարքի սնուցվող հզորությունը վերահսկելու համար ՝ լինի դա շարժիչ, LED, բարձրախոս և այլն: Հիմնականում դա մոդուլյացիոն տեխնիկա է, որի դեպքում կրիչի զարկերակի լայնությունը տատանվում է ՝ ըստ անալոգային հաղորդագրության ազդանշանի.

Մենք պարզ էլեկտրական շղթա ենք պատրաստում ՝ լույսի ինտենսիվության մեջ կախված DC շարժիչի պտտման արագությունը վերահսկելու համար: Լույսի ինտենսիվությունը չափելու համար մենք կօգտագործենք Light Dependent Resistor- ի և AVR միկրոկառավարիչի գործառույթները, ինչպիսիք են Analog to Digital Conversion- ը: Նաև մենք պատրաստվում ենք օգտագործել D-H-Bridge Motor Driver Module-L298N մոդուլը: Այն սովորաբար օգտագործվում է շարժիչների արագությունը և ուղղությունը վերահսկելու համար, բայց կարող է օգտագործվել այլ նախագծերի համար, ինչպիսիք են լուսավորման որոշ նախագծերի պայծառությունը: Նաև կոճակ ավելացրեց մեր շրջանագծին `շարժիչի պտույտի ուղղությունը փոխելու համար:

Քայլ 1: Նկարագրություն

Նկարագրություն
Նկարագրություն
Նկարագրություն
Նկարագրություն

Այս աշխարհի յուրաքանչյուր մարմին ունի որոշակի իներցիա: Շարժիչը պտտվում է ամեն անգամ, երբ այն միացված է: Անջատվելուն պես այն հակված կլինի կանգ առնել: Բայց դա անմիջապես չի դադարում, դա որոշ ժամանակ է պահանջում: Բայց մինչև ամբողջովին կանգ առնելը, այն նորից միացված է: Այսպիսով, այն սկսում է շարժվել: Բայց նույնիսկ հիմա, այն լրիվ արագության հասնելու համար որոշ ժամանակ է պահանջվում: Բայց մինչ դա տեղի կունենա, այն անջատված է և այլն: Այսպիսով, այս գործողության ընդհանուր ազդեցությունն այն է, որ շարժիչը անընդհատ պտտվում է, բայց ավելի ցածր արագությամբ:

Pulse Width Modulation (PWM) համեմատաբար վերջին էներգիայի անջատման տեխնիկա է ՝ լիովին միացված և լիովին անջատված մակարդակների միջև միջանկյալ քանակությամբ էլեկտրաէներգիա ապահովելու համար: Սովորաբար, թվային իմպուլսներն ունեն միացման և անջատման նույն ժամանակահատվածը, բայց որոշ իրավիճակներում մեզ անհրաժեշտ է, որ թվային զարկերակը ժամանակին/ժամանակից դուրս ավելի/պակաս ունենա: PWM տեխնիկայում մենք ստեղծում ենք միացման և անջատման անհավասար քանակությամբ թվային իմպուլսներ `պահանջվող միջանկյալ լարման արժեքներ ստանալու համար:

Աշխատանքային ցիկլը սահմանվում է ամբողջ թվային զարկերակում բարձր լարման տևողության տոկոսով: Այն կարելի է հաշվարկել ՝

% Պարտական ցիկլ = T միացված /T (ժամանակաշրջան) x 100

Եկեք ընդունենք խնդրահարույց հայտարարություն: Մենք պետք է ստեղծենք 50 Հց PWM ազդանշան, որն ունի 45% աշխատանքային ցիկլ:

Հաճախականություն = 50 Հց

Timeամանակահատված, T = T (միացված) + T (անջատված) = 1/50 = 0,02 վ = 20 ms

Աշխատանքի ցիկլ = 45%

Այսպիսով, լուծելով վերը տրված հավասարման համաձայն, մենք ստանում ենք

T (միացված) = 9 ms

T (անջատված) = 11 ms

Քայլ 2: AVR ժամաչափեր - PWM ռեժիմ

AVR ժամաչափեր - PWM ռեժիմ
AVR ժամաչափեր - PWM ռեժիմ
AVR ժամաչափեր - PWM ռեժիմ
AVR ժամաչափեր - PWM ռեժիմ

PWM- ի պատրաստման համար AVR- ն պարունակում է առանձին սարքավորում: Օգտագործելով սա ՝ պրոցեսորը հրահանգում է սարքավորմանը արտադրել որոշակի աշխատանքային ցիկլի PWM: ATmega328- ն ունի 6 PWM ելք, 2 -ը տեղակայված են ժամաչափի/հաշվիչի վրա (8 բիթ), 2 -ը տեղակայված են ժամաչափի/հաշվիչի վրա (16 բիթ), իսկ 2 -ը `ժամաչափի/հաշվիչի վրա (8 բիթ): Erամաչափը/Counter0- ը ATmega328- ի ամենապարզ PWM սարքն է: Erամաչափը/Counter0- ը կարող է աշխատել երեք ռեժիմով.

  • Արագ PWM
  • Փուլ և հաճախականություն ուղղված PWM
  • Փուլը ուղղեց PWM- ը

այս ռեժիմներից յուրաքանչյուրը կարող է շրջված կամ ոչ շրջված լինել:

Initialize Timer0- ը PWM ռեժիմում

TCCR0A | = (1 << WGM00] | (1 << WGM01) - կարգավորել WGM: Արագ PWM

TCCR0A | = (1 << COM0A1] | (1 << COM0B1) - սահմանել համեմատել ելքային ռեժիմը A, B

TCCR0B | = (1 << CS02) - կարգավորեք ժամանակաչափ նախալեզվիչով = 256

Քայլ 3. Լույսի ինտենսիվության չափում - ADC & LDR:

Լույսի ինտենսիվության չափում - ADC & LDR
Լույսի ինտենսիվության չափում - ADC & LDR
Լույսի ինտենսիվության չափում - ADC & LDR
Լույսի ինտենսիվության չափում - ADC & LDR
Լույսի ինտենսիվության չափում - ADC & LDR
Լույսի ինտենսիվության չափում - ADC & LDR

Լույսի վրա կախված դիմադրողը (LDR) փոխարկիչ է, որը փոխում է իր դիմադրությունը, երբ լույսը ընկնում է նրա մակերևույթի վրա:

LDR- ները պատրաստված են կիսահաղորդչային նյութերից, որպեսզի նրանք ունենան իրենց լուսազգայուն հատկությունները: Այս LDR- ները կամ PHOTO RESISTORS- ն աշխատում են «Լուսանկարչական հաղորդունակություն» սկզբունքով: Այժմ այն, ինչ ասում է այս սկզբունքը, այն է, երբ լույսը ընկնում է LDR- ի մակերևույթին (այս դեպքում) տարրի հաղորդունակությունը մեծանում է, կամ այլ կերպ ասած LDR- ի դիմադրությունը նվազում է, երբ լույսը ընկնում է LDR- ի մակերեսին: LDR- ի համար դիմադրության նվազման այս հատկությունը ձեռք է բերվում, քանի որ դա մակերեսին օգտագործվող կիսահաղորդչային նյութի հատկություն է: LDR- ն շատ դեպքերում օգտագործվում է լույսի առկայությունը հայտնաբերելու կամ լույսի ինտենսիվությունը չափելու համար:

Արտաքին շարունակական տեղեկատվությունը (անալոգային տեղեկատվությունը) թվային/հաշվողական համակարգի փոխանցելու համար մենք պետք է դրանք վերածենք ամբողջական (թվային) արժեքների: Այս տեսակի փոխակերպումն իրականացվում է Անալոգային թվային փոխարկիչի (ADC) միջոցով: Անալոգային արժեքը թվային արժեքի վերածելու գործընթացը հայտնի է որպես անալոգային թվային փոխակերպում: Մի խոսքով, անալոգային ազդանշանները մեզ շրջապատող իրական աշխարհի ազդանշաններ են, ինչպես ձայնը և լույսը:

Թվային ազդանշանները թվային կամ թվային ձևաչափի անալոգային համարժեքներ են, որոնք լավ են ընկալվում թվային համակարգերի կողմից, ինչպիսիք են միկրոկառավարիչները: ADC- ն այնպիսի սարքավորում է, որը չափում է անալոգային ազդանշանները և արտադրում է նույն ազդանշանի թվային համարժեքը: AVR միկրոկոնտրոլերները ներկառուցված են ADC սարքավորում ՝ անալոգային լարումը ամբողջ թիվ դարձնելու համար: AVR- ը այն փոխակերպում է 0-ից 1023 միջակայքի 10-բիթանոց թվի:

Լույսի ինտենսիվությունը չափելու համար մենք օգտագործում ենք լարման մակարդակի անալոգային թվային փոխակերպում LDR- ով բաժանարար միացումից:

Նախնականացնել ADC- ն ՝

TADCSRA | = (1 << ADEN] - Միացնել ADC- ը

ADCSRA | = (1 << ADPS2) | (1 << ADPS1] | (1ADPS0) - կարգավորեք ADC նախալեզվիչ = 128

ADMUX = (1 << REFS0] - կարգավորել լարման հղում = AVCC; - կարգաբերեք Մուտքային ալիք = ADC0

Դիտեք տեսանյութը ՝ ADC AVR միկրոկառավարիչի մանրամասն նկարագրությամբ ՝ AVR միկրոկոնտրոլեր: Լույսի ինտենսիվության չափում: ADC & LDR

Քայլ 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

Մենք օգտագործում ենք DC շարժիչների վարորդներ, քանի որ միկրոկոնտրոլերները ընդհանուր առմամբ չեն կարողանում հոսանք հաղորդել ոչ ավելի, քան 100 միլիամպ: Միկրոկոնտրոլերները խելացի են, բայց ոչ ուժեղ; այս մոդուլը մի քանի մկան կավելացնի միկրոկոնտրոլերներին `բարձր հզորության DC շարժիչներ վարելու համար: Այն կարող է միաժամանակ կառավարել 2 DC շարժիչ ՝ յուրաքանչյուրը մինչև 2 ամպեր կամ մեկ քայլաչափ: Մենք կարող ենք վերահսկել արագությունը PWM- ի միջոցով, ինչպես նաև շարժիչների պտտման ուղղությունը: Բացի այդ, այն օգտագործվում էր LED ժապավենի պայծառությունը քշելու համար:

Պին նկարագրություն

OUT1 և OUT2 նավահանգիստ, որը նախատեսված է DC շարժիչը միացնելու համար: OUT3 և OUT4 LED ժապավենը միացնելու համար:

ՀԷNA -ը և ENB- ն միացման կապեր են. Միացնելով ՀԷNA -ը բարձր (+5V) - ին, այն հնարավորություն է տալիս OUT1 և OUT2 նավահանգիստներին:

Եթե ՀԷNA -ի կապը միացնեք ցածրին (GND), այն անջատում է OUT1- ը և OUT2- ը: Նմանապես, ENB- ի և OUT3- ի և OUT4- ի համար:

IN1- ից IN4- ը մուտքային կապումներն են, որոնք միացված կլինեն AVR- ին:

Եթե IN1- բարձր (+5V), IN2- ցածր (GND), OUT1- ը դառնում է բարձր, իսկ OUT2- ը ՝ ցածր, այդպիսով մենք կարող ենք շարժիչ վարել:

Եթե IN3- բարձր (+5V), IN4- ցածր (GND), OUT4- ը դառնում է բարձր, իսկ OUT3- ը ՝ ցածր, ուստի LED ժապավենի լույսը միացված է:

Եթե ցանկանում եք շրջել շարժիչի պտտման ուղղությունը, պարզապես հակադարձեք IN1 և IN2 բևեռականությունը, նույնը ՝ IN3- ի և IN4- ի համար:

Կիրառելով PWM ազդանշանը ՀԷNA -ին և ENB- ին, կարող եք վերահսկել շարժիչների արագությունը երկու տարբեր ելքային պորտերի վրա:

Տախտակը կարող է անվանական ընդունել 7 Վ -ից մինչև 12 Վ լարման:

Թռչկոտողներ. Կան երեք ցատկող կապում; Թռիչք 1. Եթե շարժիչի կարիք ունեք ավելի քան 12 Վ լարման, դուք պետք է անջատեք Jumper 1 -ը և կիրառեք ցանկալի լարումը (առավելագույնը 35 Վ) 12 Վ տերմինալում: Բերեք ևս 5 Վ լարման և մուտքի 5 Վ տերմինալում: Այո, դուք պետք է մուտքագրեք 5V, եթե ձեզ անհրաժեշտ է կիրառել ավելի քան 12V (երբ Jumper 1- ը հեռացվում է):

5 Վ մուտքը նախատեսված է IC- ի պատշաճ աշխատանքի համար, քանի որ թռիչքի հեռացումը կակտիվացնի ներկառուցված 5 Վ կարգավորիչը և կպաշտպանի 12 Վ տերմինալից մուտքի ավելի բարձր լարումից:

5 Վ տերմինալը գործում է որպես ելք, եթե ձեր մատակարարումը 7 Վ -ից մինչև 12 Վ է, և գործում է որպես մուտք, եթե կիրառեք ավելի քան 12 Վ, և թռիչքը հանվում է:

Jumper 2 և Jumper 3. Եթե այս երկու թռիչքները հեռացնեք, ապա պետք է միկրոկառավարիչից մուտքագրեք միացման և անջատման ազդանշանը, օգտվողներից շատերը նախընտրում են հեռացնել երկու թռիչքը և ազդանշանը կիրառել միկրոկոնտրոլերից:

Եթե երկու թռիչքը պահեք, OUT1- ը OUT4- ին միշտ միացված կլինի: Հիշեք ՀԷNA -ի թռիչքը OUT1- ի և OUT2- ի համար: ENB jumper OUT3 և OUT4 համար:

Քայլ 5. Codeրագրի համար ծածկագիր գրելը C. Բեռնել HEX ֆայլը միկրոկառավարիչի ֆլեշ հիշողության մեջ

AVR միկրոկառավարիչի կիրառումը C կոդի մեջ գրելն ու կառուցելը `օգտագործելով ինտեգրված զարգացման պլատֆորմը` Atmel Studio:

#ifndef F_CPU #սահմանել F_CPU 16000000UL // պատմող վերահսկիչ բյուրեղային հաճախականություն (16 ՄՀց AVR ATMega328P) #endif

#include // վերնագիր ՝ կապերի վրա տվյալների հոսքի վերահսկումը միացնելու համար: Սահմանում է կապում, նավահանգիստներ և այլն: #include // header `ծրագրում հետաձգման գործառույթը միացնելու համար

#define BUTTON1 2 // կոճակի անջատիչ, որը միացված է B պին 2-ին #սահմանել DEBOUNCE_TIME 25 // ժամանակ սպասել, մինչ «դե-ցատկում» կոճակը #սահմանել LOCK_INPUT_TIME 300 // կոճակը սեղմելուց հետո սպասելու ժամանակը

// Timer0, PWM Initialization void timer0_init () {// կարգավորեք ժմչփը OC0A, OC0B կապը միացման ռեժիմում և CTC ռեժիմում TCCR0A | = (1 << COM0A1] | (1 << COM0B1) | (1 << WGM00) | (1 << WGM01]; // կարգավորել ժամանակաչափ նախալեզվիչով = 256 TCCR0B | = (1 << CS02); // սկզբնական հաշվիչ TCNT0 = 0; // սկզբնավորել համեմատել արժեքը OCR0A = 0; }

// ADC Initialization void ADC_init () {// Միացնել ADC- ն, ընտրանքի հաճախականությունը = osc_freq/128 սահմանել prescaler- ը առավելագույն արժեքի, 128 ADCSRA | = (1 << ADEN) | (1 << ADPS2] | (1 << ADPS1] | (1 << ADPS0];

ADMUX = (1 << REFS0); // Ընտրեք լարման հղում (AVCC)

// Button switch status unsigned char button_state () {

/ * կոճակը սեղմվում է, երբ BUTTON1 բիթը պարզ է */

եթե (! (PINB & (1 <

{

_delay_ms (DEBOUNCE_TIME);

եթե (! (PINB & (1 <

}

վերադարձ 0;

}

// Նավահանգիստների նախաստորագրում 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; // Setածր դարձրեք PORTC- ի բոլոր կապումները, որն անջատում է այն: }

// Այս գործառույթը կարդում է անալոգային թվային փոխակերպման արժեքը: uint16_t get_LightLevel () {_delay_ms (10); // Սպասեք որոշ ժամանակ, մինչև ալիքը ստանա ընտրված ADCSRA | = (1 << ADSC); // Սկսեք ADC- ի փոխարկումը `ADSC բիթ սահմանելով: ADSC- ին գրեք 1

իսկ (ADCSRA & (1 << ADSC)); // Սպասեք փոխակերպման ավարտին

// ADSC- ն մինչ այդ նորից դառնում է 0, անընդհատ գործարկել հանգույցը _delay_ms (10); վերադարձ (ADC); // Վերադարձեք 10-բիթանոց արդյունքը

}

// Այս գործառույթը վերագրանցում է մի շարք մի տիրույթից (0-1023) մյուս տիրույթում (0-100): uint32_t քարտեզ (uint32_t x, uint32_t in_min, uint32_t in_max, uint32_t out_min, uint32_t out_max) {վերադարձ (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; }

int հիմնական (անվավեր)

{uint16_t i1 = 0;

port_init ();

timer0_init (); ADC_init (); // նախաստորագրում ADC

մինչդեռ (1)

{i1 = քարտեզ (get_LightLevel (), 0, 1023, 0, 100);

OCR0A = i1; // Սահմանել ելքային համեմատական գրանցամատյան A OCR0B = 100-i1; // Սահմանել ելքային համեմատական գրանցամատյան B (շրջված)

if (button_state ()) // Եթե կոճակը սեղմված է, միացրեք LED- ի վիճակը և հետաձգեք 300ms (#սահմանեք LOCK_INPUT_TIME) {PORTB ^= (1 << 0); // միացնել PIN- ի ընթացիկ վիճակը PORTB ^= (1 << 1); // միացնել IN2- ի քորոցի ընթացիկ վիճակը: Հակադարձեք շարժիչի պտտման ուղղությունը

PORTB ^= (1 << 3); // IN3 ներդիրի ընթացիկ վիճակի փոփոխություն: PORTB ^= (1 << 4); // միացնել IN4- ի քորոցի ընթացիկ վիճակը: LED ժապավենը անջատված/միացված է: _delay_ms (LOCK_INPUT_TIME); }}; վերադարձ (0); }

Programրագրավորումն ավարտված է: Հաջորդը, նախագծի ծածկագիրը կառուցելը և կազմելը վեցանկյուն ֆայլում:

Բեռնել HEX ֆայլը միկրոկառավարիչի ֆլեշ հիշողության մեջ. Մուտքագրեք DOS հուշման պատուհանում հրամանը.

avrdude –c [ծրագրավորողի անունը] –p m328p –u –U flash: w: [ձեր վեցանկյուն ֆայլի անունը]

Իմ դեպքում դա հետևյալն է.

avrdude –c ISPProgv1 –p m328p –u –U ֆլեշ ՝ w: PWM.hex

Այս հրամանը գրում է վեցանկյուն ֆայլ միկրոկառավարիչի հիշողության մեջ: Դիտեք տեսանյութը ՝ միկրոկառավարիչի ֆլեշ հիշողության այրման մանրամասն նկարագրությամբ.

Լավ! Այժմ, միկրոկառավարիչը աշխատում է մեր ծրագրի ցուցումներին համապատասխան: Եկեք ստուգենք այն:

Քայլ 6: Էլեկտրական միացում

Էլեկտրական միացում
Էլեկտրական միացում
Էլեկտրական միացում
Էլեկտրական միացում

Միացրեք բաղադրիչները սխեմատիկ սխեմայի համաձայն:

Խորհուրդ ենք տալիս: