Სარჩევი:

AVR მიკროკონტროლერი. Პულსის მოდულაცია. DC ძრავისა და LED სინათლის ინტენსივობის კონტროლერი .: 6 ნაბიჯი
AVR მიკროკონტროლერი. Პულსის მოდულაცია. DC ძრავისა და LED სინათლის ინტენსივობის კონტროლერი .: 6 ნაბიჯი

ვიდეო: AVR მიკროკონტროლერი. Პულსის მოდულაცია. DC ძრავისა და LED სინათლის ინტენსივობის კონტროლერი .: 6 ნაბიჯი

ვიდეო: AVR მიკროკონტროლერი. Პულსის მოდულაცია. DC ძრავისა და LED სინათლის ინტენსივობის კონტროლერი .: 6 ნაბიჯი
ვიდეო: ESP32 Tutorial 15 - DC Motor Speed Control with ESP32 L293D | SunFounder's ESP32 IoT Learnig kit 2024, ნოემბერი
Anonim
Image
Image

Გამარჯობა ყველას!

პულსის სიგანის მოდულაცია (PWM) არის ძალიან გავრცელებული ტექნიკა ტელეკომუნიკაციებსა და ენერგიის კონტროლში. ის ჩვეულებრივ გამოიყენება ელექტრო მოწყობილობის კვების ენერგიის გასაკონტროლებლად, იქნება ეს ძრავა, LED, დინამიკები და ა.შ. რა

ჩვენ ვაკეთებთ მარტივ ელექტრულ წრეს, რომ გავაკონტროლოთ DC ძრავის ბრუნვის სიჩქარე სინათლის ინტენსივობაზე დამოკიდებული. ჩვენ ვაპირებთ გამოვიყენოთ სინათლის დამოკიდებული რეზისტორი და AVR მიკროკონტროლის მახასიათებლები, როგორიცაა ანალოგური ციფრული გარდაქმნა სინათლის ინტენსივობის გასაზომად. ასევე ჩვენ ვაპირებთ გამოვიყენოთ ორმაგი H-Bridge საავტომობილო დრაივერის მოდული-L298N. ის ჩვეულებრივ გამოიყენება ძრავების სიჩქარისა და მიმართულების გასაკონტროლებლად, მაგრამ შეიძლება გამოყენებულ იქნას სხვა პროექტებისთვის, როგორიცაა განათების გარკვეული პროექტების სიკაშკაშის მართვა. გარდა ამისა, ჩვენ დავამატეთ ღილაკი ჩვენს წრეზე ძრავის ბრუნვის მიმართულების გადასატანად.

ნაბიჯი 1: აღწერა

აღწერა
აღწერა
აღწერა
აღწერა

ამ სამყაროში თითოეულ სხეულს აქვს გარკვეული ინერცია. ძრავა ბრუნავს, როდესაც ის ჩართულია. როგორც კი ის გამორთულია, ის შეჩერდება. მაგრამ ის არ ჩერდება დაუყოვნებლივ, ამას გარკვეული დრო სჭირდება. მაგრამ სანამ ის სრულად გაჩერდება, ის კვლავ ჩართულია! ასე იწყებს მოძრაობას. მაგრამ ახლაც კი, გარკვეული დრო სჭირდება სრულ სიჩქარეს. მაგრამ სანამ ეს მოხდება, ის გამორთულია და ასე შემდეგ. ამრიგად, ამ მოქმედების საერთო ეფექტი იმაში მდგომარეობს, რომ ძრავა ბრუნავს განუწყვეტლივ, მაგრამ უფრო დაბალი სიჩქარით.

პულსის სიგანის მოდულაცია (PWM) არის შედარებით უახლესი დენის გადართვის ტექნიკა, რომელიც უზრუნველყოფს შუალედური რაოდენობის ელექტროენერგიას სრულად ჩართულ და სრულად გამორთულ დონეს შორის. ჩვეულებრივ, ციფრულ იმპულსებს აქვთ ერთი და იგივე პერიოდი, მაგრამ ზოგიერთ სიტუაციაში ჩვენ გვჭირდება ციფრული პულსი მეტი/ნაკლები დრო/დრო. PWM ტექნიკით, ჩვენ ვქმნით ციფრულ იმპულსებს არათანაბარი რაოდენობის ჩართვისა და გამორთვის მდგომარეობით, რათა მივიღოთ საჭირო შუალედური ძაბვის მნიშვნელობები.

სამუშაო ციკლი განისაზღვრება მაღალი ციფრული პულსის მაღალი ძაბვის ხანგრძლივობის პროცენტული მაჩვენებლით. ის შეიძლება გამოითვალოს:

% მოვალეობის ციკლი = T ჩართულია /T (პერიოდის დრო) x 100

ავიღოთ პრობლემური განცხადება. ჩვენ უნდა შევქმნათ 50 Hz PWM სიგნალი, რომელსაც აქვს 45% სამუშაო ციკლი.

სიხშირე = 50 ჰერცი

დროის პერიოდი, T = T (ჩართული) + T (გამორთული) = 1/50 = 0,02 s = 20 ms

მოვალეობის ციკლი = 45%

ამრიგად, ამონახსნის ზემოთ მოცემული განტოლების მიხედვით, ჩვენ ვიღებთ

T (ჩართულია) = 9 ms

T (გამორთულია) = 11 ms

ნაბიჯი 2: AVR ქრონომეტრები - PWM რეჟიმი

AVR ტაიმერები - PWM რეჟიმი
AVR ტაიმერები - PWM რეჟიმი
AVR ტაიმერები - PWM რეჟიმი
AVR ტაიმერები - PWM რეჟიმი

PWM– ის შესაქმნელად, AVR შეიცავს ცალკეულ ტექნიკას! ამის გამოყენებით, CPU ავალებს ტექნიკას აწარმოოს კონკრეტული მოვალეობის ციკლის PWM. ATmega328– ს აქვს 6 PWM გამოსავალი, 2 მდებარეობს ტაიმერზე/მრიცხველზე 0 (8 ბიტიანი), 2 მდებარეობს ტაიმერზე/მრიცხველზე 1 (16 ბიტიანი) და 2 მდებარეობს ტაიმერზე/მრიცხველზე 2 (8 ბიტიანი). ტაიმერი/Counter0 არის უმარტივესი PWM მოწყობილობა ATmega328– ზე. ტაიმერს/მრიცხველს შეუძლია 3 რეჟიმში მუშაობა:

  • სწრაფი PWM
  • ფაზა და სიხშირე შესწორებულია PWM
  • ფაზა შესწორებულია PWM

თითოეული ეს რეჟიმი შეიძლება იყოს შებრუნებული ან არაინვერტირებული.

ტაიმერის ინიციალიზაცია 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 გადააქციეთ ის 10 ბიტიან დიაპაზონში 0-დან 1023-მდე.

ჩვენ ვიყენებთ ძაბვის დონის ანალოგურ ციფრულ გარდაქმნას გამყოფი წრიდან 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: კონტროლერი DC Motor & D-H-Bridge Motor Driver Module-L298N

კონტროლერი DC Motor & Dual H-Bridge Motor Driver Module-L298N
კონტროლერი DC Motor & Dual H-Bridge Motor Driver Module-L298N
კონტროლერი DC Motor & Dual H-Bridge Motor Driver Module-L298N
კონტროლერი DC Motor & Dual H-Bridge Motor Driver Module-L298N
კონტროლერი DC Motor & Dual H-Bridge Motor Driver Module-L298N
კონტროლერი DC Motor & Dual H-Bridge Motor Driver Module-L298N

ჩვენ ვიყენებთ DC საავტომობილო დრაივერებს, რადგან მიკროკონტროლერებს არ შეუძლიათ დენის მიწოდება ზოგადად არა უმეტეს 100 მილიამპერიდან. მიკროკონტროლერები არიან ჭკვიანები, მაგრამ არა ძლიერები; ეს მოდული დაამატებს კუნთებს მიკროკონტროლერებს მაღალი სიმძლავრის DC ძრავების მართვისთვის. მას შეუძლია აკონტროლოს 2 DC ძრავა ერთდროულად 2 ამპერიმდე თითოეული ან ერთი სტეპერიანი ძრავა. ჩვენ შეგვიძლია გავაკონტროლოთ სიჩქარე PWM გამოყენებით და ასევე ძრავების ბრუნვის მიმართულება. ასევე, იგი გამოიყენება LED ფირის სიკაშკაშის მართვისთვის.

ჩამაგრების აღწერა:

OUT1 და OUT2 პორტი, რომელიც განკუთვნილია DC ძრავის დასაკავშირებლად. OUT3 და OUT4 LED ფირის დასაკავშირებლად.

ENA და ENB ჩართულია ქინძისთავები: ENA- ს მაღალ (+5V) შეერთებასთან ერთად ის იძლევა პორტს OUT1 და OUT2.

თუ თქვენ დააკავშირებთ ENA პინს დაბალ (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 სიგნალის გამოყენებით ENA და ENB თქვენ შეგიძლიათ აკონტროლოთ ძრავების სიჩქარე ორ სხვადასხვა გამომავალ პორტზე.

დაფას შეუძლია ნომინალურად მიიღოს 7V– დან 12V– მდე.

მხტუნავები: არის სამი მხტუნავები; მხტუნავი 1: თუ თქვენ გჭირდებათ 12 ვ -ზე მეტი ძრავა, თქვენ უნდა გათიშოთ ჯუმპერი 1 და გამოიყენოთ 12 ვ ტერმინალზე სასურველი ძაბვა (მაქსიმუმ 35 ვ). მოიყვანეთ კიდევ 5 ვ კვების წყარო და შეყვანა 5 ვ ტერმინალზე. დიახ, თქვენ უნდა შეიყვანოთ 5V, თუ გჭირდებათ 12V- ზე მეტი (როდესაც Jumper 1 ამოღებულია).

5V შეყვანა არის IC– ის სათანადო ფუნქციონირებისთვის, ვინაიდან მხტუნავის ამოღება გამორთავს ინტეგრირებულ 5V რეგულატორს და დაიცავს 12V ტერმინალიდან უფრო მაღალი ძაბვისგან.

5V ტერმინალი მოქმედებს როგორც გამომავალი, თუ თქვენი მარაგი 7V– დან 12V– მდეა და შეყვანის ფუნქციაა, თუ 12V– ზე მეტს იყენებთ და მხტუნავი ამოღებულია.

Jumper 2 და Jumper 3: თუ თქვენ ამოიღებთ ამ ორ მხტუნავას თქვენ უნდა შეიყვანოთ ჩართვის და გამორთვის სიგნალი მიკროკონტროლიდან, მომხმარებელთა უმეტესობა ამჯობინებს ორი მხტუნავის ამოღებას და სიგნალის გამოყენებას მიკროკონტროლიდან.

თუ ორ მხტუნავს ინახავთ, OUT1 to OUT4 ყოველთვის ჩართული იქნება. დაიმახსოვრეთ ENA მხტუნავი OUT1 და OUT2. ENB მხტუნავი OUT3 და OUT4.

ნაბიჯი 5: პროგრამის კოდის წერა C. ატვირთეთ HEX ფაილი მიკროკონტროლერის ფლეშ მეხსიერებაში

AVR მიკროკონტროლერის პროგრამის წერა და შექმნა C კოდში ინტეგრირებული განვითარების პლატფორმის - Atmel Studio გამოყენებით.

#ifndef F_CPU #განსაზღვრეთ F_CPU 16000000UL // კონტროლერი ეუბნება ბროლის სიხშირეს (16 MHz AVR ATMega328P) #endif

#include // header მონაცემების ნაკადის კონტროლის გასააქტიურებლად ქინძისთავებზე. განსაზღვრავს ქინძისთავებს, პორტებს და ა.შ. #include // header პროგრამაში ფუნქციის შეფერხების გასააქტიურებლად

#define BUTTON1 2 // ღილაკზე გადართვა დაკავშირებულია პორტ B pin 2-თან #განსაზღვრეთ DEBOUNCE_TIME 25 // დრო ლოდინის დროს ღილაკზე "მოხსნის" #განსაზღვრეთ LOCK_INPUT_TIME 300 // ლოდინის დრო ღილაკის დაჭერის შემდეგ

// ტაიმერი 0, PWM ინიციალიზაცია void timer0_init () {// დააყენეთ ტაიმერი OC0A, OC0B pin გადართვის რეჟიმში და CTC რეჟიმში TCCR0A | = (1 << COM0A1] | (1 << COM0B1) | (1 << WGM00) | (1 << WGM01]; // დააყენეთ ტაიმერი წინასწარგამრიცხველით = 256 TCCR0B | = (1 << CS02); // მრიცხველის ინიციალიზაცია TCNT0 = 0; // ინიციალიზაცია შედარების მნიშვნელობა OCR0A = 0; }

// ADC ინიციალიზაცია void ADC_init () {// ADC ჩართვა, შერჩევის სიხშირე = osc_freq/128 დააყენეთ prescaler მაქსიმალური მნიშვნელობა, 128 ADCSRA | = (1 << ADEN) | (1 << ADPS2] | (1 << ADPS1] | (1 << ADPS0];

ADMUX = (1 << REFS0]; // აირჩიეთ ძაბვის მითითება (AVCC)

// ღილაკზე გადართვა სტატუსი ხელმოუწერელი char button_state () {

/ * ღილაკზე დაჭერილია როდესაც ღილაკი 1 ბიტი ნათელია */

თუ (! (PINB & (1 <

{

_ დაგვიანებით_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; // დააყენეთ PORTC– ის ყველა ქინძისთავი დაბალი, რაც მას გამორთავს. }

// ეს ფუნქცია კითხულობს ანალოგურ ციფრულ მნიშვნელობას. uint16_t get_LightLevel () {_melay_ms (10); // დაელოდეთ ცოტა ხანს, სანამ არხი მიიღებს არჩეულ ADCSRA | = (1 << ADSC]; // დაიწყეთ ADC კონვერტაცია ADSC ბიტის დაყენებით. ჩაწერეთ 1 ADSC- ში

ხოლო (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; }

მთავარი (ბათილია)

{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– ის მიმდინარე მდგომარეობის გადართვა IN1. PORTB ^= (1 << 1); // პინ IN2– ის ამჟამინდელი მდგომარეობის გადართვა. შეცვალე ძრავის ბრუნვის მიმართულება

PORTB ^= (1 << 3); // პინ IN3– ის ამჟამინდელი მდგომარეობის გადართვა. PORTB ^= (1 << 4); // პინ IN4– ის ამჟამინდელი მდგომარეობის გადართვა. LED ლენტი გამორთულია/ჩართულია. _ დაგვიანებით_ms (LOCK_INPUT_TIME); }}; დაბრუნება (0); }

პროგრამირება დასრულებულია. შემდეგი, პროექტის კოდის შედგენა და შედგენა hex ფაილში.

მიკროკონტროლერის ფლეშ მეხსიერებაში HEX ფაილის ატვირთვა: ჩაწერეთ DOS ფანჯარაში ბრძანება:

avrdude –c [პროგრამისტის სახელი] –p m328p –u –U flash: w: [თქვენი hex ფაილის სახელი]

ჩემს შემთხვევაში ეს არის:

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

ეს ბრძანება წერს ექვსკუთხა ფაილს მიკროკონტროლის მეხსიერებაში. უყურეთ ვიდეოს მიკროკონტროლის ფლეშ მეხსიერების დაწვის დეტალური აღწერით: მიკროკონტროლერის ფლეშ მეხსიერების წვა…

Კარგი! ახლა, მიკროკონტროლი მუშაობს ჩვენი პროგრამის ინსტრუქციის შესაბამისად. მოდით შევამოწმოთ!

ნაბიჯი 6: ელექტრული წრე

ელექტრული წრე
ელექტრული წრე
ელექტრული წრე
ელექტრული წრე

შეაერთეთ კომპონენტები სქემატური დიაგრამის შესაბამისად.

გირჩევთ: