สารบัญ:

ไมโครคอนโทรลเลอร์ AVR การปรับความกว้างพัลส์ ตัวควบคุม DC Motor และ LED Light Intensity.: 6 Steps
ไมโครคอนโทรลเลอร์ AVR การปรับความกว้างพัลส์ ตัวควบคุม DC Motor และ LED Light Intensity.: 6 Steps

วีดีโอ: ไมโครคอนโทรลเลอร์ AVR การปรับความกว้างพัลส์ ตัวควบคุม DC Motor และ LED Light Intensity.: 6 Steps

วีดีโอ: ไมโครคอนโทรลเลอร์ AVR การปรับความกว้างพัลส์ ตัวควบคุม DC Motor และ LED Light Intensity.: 6 Steps
วีดีโอ: PWM in AVR 2024, พฤศจิกายน
Anonim
Image
Image

สวัสดีทุกคน!

การปรับความกว้างพัลส์ (PWM) เป็นเทคนิคทั่วไปในการสื่อสารโทรคมนาคมและการควบคุมพลังงาน มักใช้เพื่อควบคุมกำลังไฟฟ้าที่จ่ายให้กับอุปกรณ์ไฟฟ้า ไม่ว่าจะเป็นมอเตอร์ ไฟ LED ลำโพง ฯลฯ โดยพื้นฐานแล้วจะเป็นเทคนิคการมอดูเลต ซึ่งความกว้างของพัลส์พาหะจะแปรผันตามสัญญาณข้อความแอนะล็อก.

เราสร้างวงจรไฟฟ้าอย่างง่ายเพื่อควบคุมความเร็วในการหมุนของมอเตอร์กระแสตรงโดยขึ้นกับความเข้มของแสง เราจะใช้คุณสมบัติตัวต้านทานแบบพึ่งพาแสงและไมโครคอนโทรลเลอร์ AVR เช่น การแปลงแอนะล็อกเป็นดิจิทัลเพื่อวัดความเข้มของแสง นอกจากนี้ เราจะใช้โมดูลไดรเวอร์มอเตอร์สะพานคู่ H-L298N โดยทั่วไปจะใช้ในการควบคุมความเร็วและทิศทางของมอเตอร์ แต่สามารถใช้สำหรับโครงการอื่นๆ เช่น การเพิ่มความสว่างของโครงการแสงสว่างบางโครงการ นอกจากนี้ยังเพิ่มปุ่มในวงจรของเราเพื่อสลับทิศทางการหมุนของเครื่องยนต์

ขั้นตอนที่ 1: คำอธิบาย

คำอธิบาย
คำอธิบาย
คำอธิบาย
คำอธิบาย

ร่างกายทุกคนในโลกนี้มีแรงเฉื่อยอยู่บ้าง มอเตอร์หมุนทุกครั้งที่เปิดเครื่อง ทันทีที่ปิดเครื่อง เครื่องจะหยุดทำงาน แต่มันไม่หยุดทันที มันต้องใช้เวลา แต่ก่อนที่มันจะดับสนิท มันก็เปิดขึ้นมาใหม่อีกครั้ง! มันจึงเริ่มเคลื่อนไหว แต่ถึงตอนนี้ก็ยังต้องใช้เวลาสักระยะกว่าจะถึงความเร็วเต็มที่ แต่ก่อนที่มันจะเกิดขึ้น มันจะปิดอยู่ เป็นต้น ดังนั้น ผลกระทบโดยรวมของการกระทำนี้คือมอเตอร์หมุนอย่างต่อเนื่อง แต่ด้วยความเร็วที่ต่ำกว่า

การปรับความกว้างของพัลส์ (PWM) เป็นเทคนิคการสลับกำลังไฟฟ้าล่าสุดสำหรับการจัดหาพลังงานไฟฟ้าระดับกลางระหว่างระดับเปิดเต็มที่และปิดเต็มที่ โดยปกติพัลส์ดิจิทัลจะมีช่วงเวลาเปิดและปิดเหมือนกัน แต่ในบางสถานการณ์ เราจำเป็นต้องมีพัลส์ดิจิทัลเพื่อให้ตรงต่อเวลา/นอกเวลามากขึ้น/น้อยลง ในเทคนิค PWM เราสร้างพัลส์ดิจิทัลที่มีสถานะเปิดและปิดไม่เท่ากันเพื่อให้ได้ค่าแรงดันกลางที่ต้องการ

รอบการทำงานถูกกำหนดโดยเปอร์เซ็นต์ของระยะเวลาไฟฟ้าแรงสูงในพัลส์ดิจิตอลที่สมบูรณ์ สามารถคำนวณได้โดย:

% ของรอบการทำงาน = T บน /T (ช่วงเวลา) x 100

ให้เราใช้คำสั่งปัญหา เราจำเป็นต้องสร้างสัญญาณ PWM 50 Hz ที่มีรอบการทำงาน 45%

ความถี่ = 50 Hz

ช่วงเวลา 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 มีฮาร์ดแวร์แยกต่างหาก! เมื่อใช้สิ่งนี้ CPU จะสั่งให้ฮาร์ดแวร์สร้าง PWM ของรอบการทำงานเฉพาะ ATmega328 มีเอาต์พุต PWM 6 ตัว 2 ตัวอยู่บนตัวจับเวลา/ตัวนับ0 (8 บิต) 2 ตัวอยู่บนตัวจับเวลา/ตัวนับ 1 (16 บิต) และ 2 ตัวอยู่บนตัวจับเวลา/ตัวนับ 2 (8 บิต) Timer/Counter0 เป็นอุปกรณ์ PWM ที่ง่ายที่สุดบน ATmega328 Timer/Counter0 สามารถทำงานได้ 3 โหมด:

  • PWM เร็ว
  • เฟสและความถี่แก้ไข PWM
  • เฟสแก้ไข PWM

แต่ละโหมดเหล่านี้สามารถกลับด้านหรือไม่กลับด้าน

เริ่มต้น Timer0 ในโหมด PWM:

TCCR0A |=(1 << WGM00)|(1 << WGM01) - ตั้งค่า WGM: Fast PWM

TCCR0A |= (1 << COM0A1)|(1 << COM0B1) - ตั้งค่าเปรียบเทียบโหมดเอาต์พุต A, B

TCCR0B |= (1 << CS02) - ตั้งเวลาด้วย prescaler = 256

ขั้นตอนที่ 3: การวัดความเข้มของแสง - ADC & LDR

การวัดความเข้มของแสง - ADC & LDR
การวัดความเข้มของแสง - ADC & LDR
การวัดความเข้มของแสง - ADC & LDR
การวัดความเข้มของแสง - ADC & LDR
การวัดความเข้มของแสง - ADC & LDR
การวัดความเข้มของแสง - ADC & LDR

ตัวต้านทานแบบพึ่งพาแสง (LDR) เป็นทรานสดิวเซอร์ที่เปลี่ยนความต้านทานเมื่อแสงตกบนพื้นผิวเปลี่ยนแปลง

LDR ทำจากวัสดุเซมิคอนดักเตอร์เพื่อให้มีคุณสมบัติไวต่อแสง LDRs หรือ PHOTO RESISTORS เหล่านี้ทำงานบนหลักการของ "Photo conductivity" สิ่งที่หลักการนี้กล่าวคือเมื่อใดก็ตามที่แสงตกบนพื้นผิวของ LDR (ในกรณีนี้) ค่าการนำไฟฟ้าขององค์ประกอบจะเพิ่มขึ้น หรือกล่าวอีกนัยหนึ่งคือ ความต้านทานของ LDR จะลดลงเมื่อแสงตกบนพื้นผิวของ LDR คุณสมบัตินี้ทำให้ความต้านทานลดลงสำหรับ LDR เนื่องจากเป็นคุณสมบัติของวัสดุเซมิคอนดักเตอร์ที่ใช้กับพื้นผิว LDR มักถูกใช้เพื่อตรวจจับว่ามีแสงอยู่หรือเพื่อวัดความเข้มของแสง

สำหรับการถ่ายโอนข้อมูลภายนอกแบบต่อเนื่อง (ข้อมูลแอนะล็อก) เข้าสู่ระบบดิจิทัล/คอมพิวเตอร์ เราต้องแปลงข้อมูลเหล่านั้นเป็นค่าจำนวนเต็ม (ดิจิทัล) การแปลงประเภทนี้ดำเนินการโดย Analog to Digital Converter (ADC) กระบวนการแปลงค่าแอนะล็อกเป็นค่าดิจิทัลเรียกว่าการแปลงแอนะล็อกเป็นดิจิทัล กล่าวโดยย่อ สัญญาณอนาล็อกเป็นสัญญาณในโลกแห่งความเป็นจริงรอบตัวเรา เช่น เสียงและแสง

สัญญาณดิจิตอลเทียบเท่าอนาล็อกในรูปแบบดิจิทัลหรือตัวเลข ซึ่งระบบดิจิทัลอย่างไมโครคอนโทรลเลอร์เข้าใจดี ADC เป็นหนึ่งในฮาร์ดแวร์ดังกล่าวซึ่งวัดสัญญาณแอนะล็อกและสร้างสัญญาณดิจิทัลที่เทียบเท่ากับสัญญาณเดียวกัน ไมโครคอนโทรลเลอร์ AVR มีสิ่งอำนวยความสะดวก ADC ในตัวเพื่อแปลงแรงดันอนาล็อกเป็นจำนวนเต็ม AVR แปลงเป็นจำนวน 10 บิตของช่วง 0 ถึง 1023

เราใช้การแปลงระดับแรงดันแอนะล็อกเป็นดิจิตอลจากวงจรแบ่งด้วย LDR เพื่อวัดความเข้มของแสง

เริ่มต้น ADC:

TADCSRA |= (1<<ADEN) - เปิดใช้งาน ADC

ADCSRA |= (1<<ADPS2)| (1<<ADPS1)| (1ADPS0) - ตั้งค่า ADC prescaler = 128

ADMUX = (1 << REFS0) - ตั้งค่าแรงดันอ้างอิง = AVCC; - ตั้งค่า Input Channel = ADC0

ดูวิดีโอพร้อมคำอธิบายโดยละเอียดของไมโครคอนโทรลเลอร์ ADC AVR: ไมโครคอนโทรลเลอร์ AVR การวัดความเข้มของแสง ADC & LDR

ขั้นตอนที่ 4: คอนโทรลเลอร์ 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 Motor & Dual H-Bridge Motor Driver Module-L298N

เราใช้ตัวขับมอเตอร์กระแสตรงเนื่องจากไมโครคอนโทรลเลอร์ไม่สามารถส่งกระแสไฟโดยทั่วไปได้ไม่เกิน 100 มิลลิแอมป์ ไมโครคอนโทรลเลอร์นั้นฉลาด แต่ไม่แข็งแรง โมดูลนี้จะเพิ่มกล้ามเนื้อบางส่วนให้กับไมโครคอนโทรลเลอร์เพื่อขับเคลื่อนมอเตอร์กระแสตรงกำลังสูง สามารถควบคุมมอเตอร์กระแสตรง 2 ตัวพร้อมกันได้ถึง 2 แอมป์ต่อมอเตอร์แต่ละตัวหรือหนึ่งตัว เราสามารถควบคุมความเร็วได้โดยใช้ PWM และทิศทางการหมุนของมอเตอร์ด้วย นอกจากนี้ยังใช้สำหรับขับความสว่างของเทป LED

คำอธิบายพิน:

พอร์ต OUT1 และ OUT2 ซึ่งใช้สำหรับต่อมอเตอร์กระแสตรง OUT3 และ OUT4 สำหรับต่อเทป LED

ENA และ ENB เป็นพินที่เปิดใช้งาน: โดยการเชื่อมต่อ ENA กับ high (+5V) จะทำให้พอร์ต OUT1 และ OUT2 ใช้งานได้

หากคุณเชื่อมต่อพิน ENA ไปที่ระดับต่ำ (GND) จะเป็นการปิดใช้งาน OUT1 และ OUT2 ในทำนองเดียวกัน สำหรับ ENB และ OUT3 และ OUT4

IN1 ถึง IN4 คือพินอินพุตที่จะเชื่อมต่อกับ AVR

ถ้า IN1-high(+5V), IN2-low(GND) OUT1 จะสูงและ OUT2 ต่ำ ดังนั้นเราจึงสามารถขับเคลื่อนมอเตอร์ได้

หาก IN3-high(+5V), IN4-low(GND) OUT4 จะสูงและ OUT3 จะต่ำ ดังนั้นไฟ LED เทปจึงติดสว่าง

หากคุณต้องการย้อนกลับทิศทางการหมุนของมอเตอร์ เพียงแค่ย้อนกลับขั้ว IN1 และ IN2 เช่นเดียวกับ IN3 และ IN4

ด้วยการใช้สัญญาณ PWM กับ ENA และ ENB คุณสามารถควบคุมความเร็วของมอเตอร์บนพอร์ตเอาต์พุตที่แตกต่างกันสองพอร์ต

บอร์ดสามารถรับได้ตั้งแต่ 7V ถึง 12V ในนาม

จัมเปอร์: มีหมุดจัมเปอร์สามตัว จัมเปอร์ 1: หากคุณต้องการมอเตอร์มากกว่า 12V คุณต้องถอดจัมเปอร์ 1 และใช้แรงดันไฟฟ้าที่ต้องการ (สูงสุด 35V) ที่ขั้ว 12V นำแหล่งจ่ายไฟและอินพุต 5V อีกอันมาที่ขั้ว 5V ใช่ คุณต้องป้อน 5V หากคุณต้องการใช้มากกว่า 12V (เมื่อถอด Jumper 1 ออก)

อินพุต 5V มีไว้เพื่อการทำงานที่เหมาะสมของ IC เนื่องจากการถอดจัมเปอร์ออกจะทำให้ตัวควบคุม 5V ในตัวไม่ทำงานและป้องกันจากแรงดันไฟฟ้าขาเข้าที่สูงขึ้นจากขั้วต่อ 12V

เทอร์มินัล 5V ทำหน้าที่เป็นเอาต์พุตหากแหล่งจ่ายไฟของคุณอยู่ระหว่าง 7V ถึง 12V และทำหน้าที่เป็นอินพุตหากคุณใช้มากกว่า 12V และจัมเปอร์จะถูกลบออก

Jumper 2 และ Jumper 3: หากคุณถอดจัมเปอร์สองตัวนี้ออก คุณต้องป้อนสัญญาณเปิดและปิดจากไมโครคอนโทรลเลอร์ ผู้ใช้ส่วนใหญ่ต้องการถอดจัมเปอร์สองตัวนี้ออกและใช้สัญญาณจากไมโครคอนโทรลเลอร์

หากคุณเก็บจัมเปอร์ไว้สองตัว OUT1 ถึง OUT4 จะถูกเปิดใช้งานเสมอ จำจัมเปอร์ ENA สำหรับ OUT1 และ OUT2 จัมเปอร์ ENB สำหรับ OUT3 และ OUT4

ขั้นตอนที่ 5: การเขียนโค้ดสำหรับโปรแกรมใน C. การอัปโหลดไฟล์ HEX ลงในหน่วยความจำแฟลชไมโครคอนโทรลเลอร์

การเขียนและสร้างแอปพลิเคชันไมโครคอนโทรลเลอร์ AVR ในรหัส C โดยใช้แพลตฟอร์มการพัฒนาแบบบูรณาการ - Atmel Studio

#ifndef F_CPU#define F_CPU 16000000UL // บอกความถี่คริสตัลคอนโทรลเลอร์ (16 MHz AVR ATMega328P) #endif

#include //header เพื่อเปิดใช้งานการควบคุมการไหลของข้อมูลบนพิน กำหนดพิน พอร์ต ฯลฯ #include //header เพื่อเปิดใช้งานฟังก์ชันดีเลย์ในโปรแกรม

#define BUTTON1 2 // สวิตช์ปุ่มเชื่อมต่อกับพอร์ต B ขา 2 #define DEBOUNCE_TIME 25 // เวลาที่รอในขณะที่ปุ่ม "ยกเลิกการตีกลับ" #define LOCK_INPUT_TIME 300 // เวลารอหลังจากกดปุ่ม

// Timer0, PWM Initialization void timer0_init () { // ตั้งค่าตัวจับเวลา OC0A, OC0B pin ในโหมดสลับและโหมด CTC TCCR0A |= (1 << COM0A1) | (1 << COM0B1) | (1 << WGM00) | (1 << WGM01); // ตั้งเวลาด้วย prescaler = 256 TCCR0B |= (1 << CS02); // เริ่มต้นตัวนับ TCNT0 = 0; // เริ่มต้นเปรียบเทียบค่า OCR0A = 0; }

// การเริ่มต้น ADC เป็นโมฆะ ADC_init () { // เปิดใช้งาน ADC, ความถี่สุ่มตัวอย่าง = osc_freq/128 ตั้งค่าพรีสเกลเลอร์เป็นค่าสูงสุด, 128 ADCSRA |= (1<<ADEN) | (1<<ADPS2)| (1<< ADPS1)| (1<<ADPS0);

ADMUX = (1<<REFS0); // เลือกแรงดันอ้างอิง (AVCC)

// สถานะสวิตช์ปุ่ม unsigned ถ่าน button_state () {

/* ปุ่มถูกกดเมื่อ BUTTON1 บิตชัดเจน */

ถ้า (!(PINB & (1<

{

_delay_ms(DEBOUNCE_TIME);

ถ้า (!(PINB & (1<

}

กลับ 0;

}

// การเริ่มต้นพอร์ตเป็นโมฆะ port_init () { DDRB = 0b00011011; //PB0-IN1, PB1-IN2, PB3-IN3, PB4-IN4, PB2 - สวิตช์ปุ่ม PORTB=0b00010110;

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

DDRC =0b00000000; // PC0-ADC PORTC=0b00000000; // ตั้งค่าพินทั้งหมดของ PORTC ให้ต่ำ ซึ่งจะปิด }

// ฟังก์ชันนี้อ่านค่าของการแปลงแอนะล็อกเป็นดิจิทัล uint16_t get_LightLevel() { _delay_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; }

int หลัก (เป็นโมฆะ)

{ uint16_t i1=0;

port_init();

timer0_init(); ADC_init(); // การเริ่มต้น ADC

ในขณะที่ (1)

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

OCR0A=i1; // ตั้งค่าเอาต์พุตเปรียบเทียบช่องรีจิสเตอร์ A OCR0B=100-i1; // ตั้งค่าเอาต์พุตเปรียบเทียบช่องรีจิสเตอร์ B (กลับด้าน)

if (button_state()) // หากกดปุ่ม ให้สลับสถานะของ LED และหน่วงเวลา 300ms (#define LOCK_INPUT_TIME) { PORTB ^= (1<<0); // สลับสถานะปัจจุบันของพิน IN1 PORTB ^= (1<<1); // สลับสถานะปัจจุบันของพิน IN2 กลับทิศทางการหมุนของมอเตอร์

PORTB ^= (1<<3); // สลับสถานะปัจจุบันของพิน IN3 PORTB ^= (1<<4); // สลับสถานะปัจจุบันของพิน IN4 LED Tape ถูกปิด/เปิด _delay_ms(LOCK_INPUT_TIME); } }; กลับ (0); }

การเขียนโปรแกรมเสร็จสมบูรณ์ ถัดไป สร้างและรวบรวมรหัสโครงการเป็นไฟล์ฐานสิบหก

การอัปโหลดไฟล์ HEX ลงในหน่วยความจำแฟลชไมโครคอนโทรลเลอร์:พิมพ์คำสั่งในหน้าต่างพรอมต์ DOS:

avrdude –c [ชื่อโปรแกรมเมอร์] –p m328p –u –U flash:w:[ชื่อไฟล์ hex ของคุณ]

ในกรณีของฉันคือ:

avrdude –c ISPProgv1 –p m328p –u –U แฟลช:w:PWM.hex

คำสั่งนี้เขียนไฟล์ฐานสิบหกลงในหน่วยความจำของไมโครคอนโทรลเลอร์ ดูวิดีโอพร้อมคำอธิบายโดยละเอียดของการเบิร์นหน่วยความจำแฟลชไมโครคอนโทรลเลอร์: การเบิร์นหน่วยความจำแฟลชไมโครคอนโทรลเลอร์…

ตกลง! ตอนนี้ไมโครคอนโทรลเลอร์ทำงานตามคำแนะนำของโปรแกรมของเรา มาลองดูกัน!

ขั้นตอนที่ 6: วงจรไฟฟ้า

วงจรไฟฟ้า
วงจรไฟฟ้า
วงจรไฟฟ้า
วงจรไฟฟ้า

เชื่อมต่อส่วนประกอบตามแผนผังไดอะแกรม

แนะนำ: