ในโครงการนี้เราจะไปใช้หนึ่งในคุณสมบัติของ ATmega32A เพื่อปรับความสว่างของ 1 วัตต์ไฟ LED วิธีที่ใช้ในการปรับความเร็วของ LED คือPWM (Pulse Width Modulation) บทช่วยสอน PWM ไมโครคอนโทรลเลอร์ AVRนี้อธิบายแนวคิด PWM และการสร้าง PWM โดยละเอียด (คุณสามารถตรวจสอบวงจรกำเนิด PWM แบบง่ายนี้ได้ด้วย) พิจารณาวงจรง่ายๆดังแสดงในรูป
ตอนนี้ถ้าสวิตช์ในรูปด้านบนปิดอย่างต่อเนื่องในช่วงเวลาหนึ่งหลอดไฟจะเปิดอย่างต่อเนื่องในช่วงเวลานั้น หากสวิตช์ปิดเป็นเวลา 8ms และเปิดเป็นเวลา 2ms ในรอบ 10ms หลอดไฟจะเปิดเฉพาะในเวลา 8ms เท่านั้น ตอนนี้เทอร์มินัลเฉลี่ยตลอดช่วงเวลา 10ms = เวลาเปิดเครื่อง / (เวลาเปิดเครื่อง + เวลาปิดเครื่อง) เรียกว่ารอบการทำงานและเท่ากับ 80% (8 / (8 + 2)) ดังนั้นค่าเฉลี่ย แรงดันขาออกจะเท่ากับ 80% ของแรงดันแบตเตอรี่
ในกรณีที่สองสวิตช์จะปิดเป็นเวลา 5ms และเปิดเป็นเวลา 5ms ในช่วงเวลา 10ms ดังนั้นแรงดันไฟฟ้าขั้วเฉลี่ยที่เอาต์พุตจะเท่ากับ 50% ของแรงดันแบตเตอรี่ บอกว่าแรงดันไฟฟ้าของแบตเตอรี่เป็น 5V หรือไม่และรอบการทำงานเท่ากับ 50% ดังนั้นแรงดันไฟฟ้าขั้วเฉลี่ยจะเท่ากับ 2.5V
ในกรณีที่สามรอบการทำงานเท่ากับ 20% และแรงดันไฟฟ้าขั้วเฉลี่ยเท่ากับ 20% ของแรงดันแบตเตอรี่
ใน ATMEGA32A เรามีช่องสัญญาณ PWM สี่ช่อง ได้แก่ OC0, OC1A, OC1B และ OC2 ที่นี่เราจะใช้ช่องทาง OC0 PWMจะแตกต่างกันไปความสว่างของไฟ LED ที่
ส่วนประกอบที่จำเป็น
ฮาร์ดแวร์:
ไมโครคอนโทรลเลอร์ ATmega32
แหล่งจ่ายไฟ (5v)
โปรแกรมเมอร์ AVR-ISP
ตัวเก็บประจุ 100uF, ไฟ LED 1 วัตต์
TIP127 ทรานซิสเตอร์
กระดุม (2 ชิ้น)
100nF (104) ตัวเก็บประจุ (2 ชิ้น), ตัวต้านทาน100Ωและ1kΩ (2 ชิ้น)
ซอฟต์แวร์:
Atmel สตูดิโอ 6.1
Progisp หรือแฟลชมายากล
แผนภาพวงจรและคำอธิบายการทำงาน
รูปด้านบนแสดงแผนภาพวงจรของไฟหรี่ LED พร้อมไมโครคอนโทรลเลอร์ AVR (คุณสามารถตรวจสอบวงจรหรี่ LED แบบธรรมดานี้ได้ด้วย)
ใน ATmega สำหรับสี่ช่องสัญญาณ PWM เราได้กำหนดพินสี่ตัว เราสามารถรับเอาต์พุต PWM บนพินเหล่านี้เท่านั้น เนื่องจากเราใช้ PWM0 เราควรรับสัญญาณ PWM ที่ขา OC0 (PORTB 3 rd PIN) ดังแสดงในรูปที่เรากำลังเชื่อมต่อฐานของทรานซิสเตอร์กับขา OC0 เพื่อขับเคลื่อน LED เพาเวอร์ นี่คืออีกสิ่งหนึ่งที่มีมากกว่าสี่ช่องสัญญาณ PWM สองช่องเป็นช่องสัญญาณ PWM 8 บิต เราจะใช้ช่องสัญญาณ PWM 8 บิตที่นี่
ตัวเก็บประจุเชื่อมต่อกับปุ่มแต่ละปุ่มเพื่อหลีกเลี่ยงการตีกลับ เมื่อใดก็ตามที่กดปุ่มจะมีเสียงดังที่หมุด แม้ว่าเสียงนี้จะคงที่ในหน่วยมิลลิวินาที สำหรับตัวควบคุมยอดแหลมก่อนที่จะมีเสถียรภาพทำหน้าที่เป็นทริกเกอร์ เอฟเฟกต์นี้สามารถกำจัดได้ทั้งซอฟต์แวร์หรือฮาร์ดแวร์เพื่อให้โปรแกรมเรียบง่าย เราใช้วิธีฮาร์ดแวร์โดยการเพิ่มตัวเก็บประจุ debouncing
ตัวเก็บประจุทำให้ผลของการเด้งปุ่มเป็นโมฆะ
ใน ATMEGA มีสองวิธีในการสร้าง PWMได้แก่:
1. เฟสที่ถูกต้อง PWM
2. รวดเร็ว PWM
ที่นี่เราจะทำให้ทุกอย่างเรียบง่ายดังนั้นเราจะใช้วิธี FAST PWMเพื่อสร้างสัญญาณ PWM
ก่อนอื่นให้เลือกความถี่ของ PWM ซึ่งขึ้นอยู่กับการใช้งานโดยทั่วไปสำหรับ LED ความถี่ใด ๆ ที่มากกว่า 50Hz จะทำ ด้วยเหตุนี้เราจึงเลือกนาฬิกานับ 1MHZ ดังนั้นเราจึงเลือกไม่มี prescalar Prescalar คือตัวเลขที่ถูกเลือกเพื่อให้ได้นาฬิกาเคาน์เตอร์ที่น้อยกว่า ตัวอย่างเช่นถ้านาฬิกาออสซิลเลเตอร์เป็น 8Mhz เราสามารถเลือก Prescalar เป็น '8' เพื่อรับนาฬิกา 1MHz สำหรับตัวนับ Prescalar ถูกเลือกตามความถี่ หากเราต้องการพัลส์ช่วงเวลามากขึ้นเราต้องเลือก Prescalar ที่สูงขึ้น
ตอนนี้เพื่อให้ได้ FAST PWM ของนาฬิกา 50Hz จาก ATMEGA เราจำเป็นต้องเปิดใช้งานบิตที่เหมาะสมในรีจิสเตอร์“ TCCR0 ” นี่เป็นเพียงการลงทะเบียนเดียวที่เราต้องกังวลสำหรับการรับ 8 บิต FAST PWM
ที่นี่
1. CS00, CS01, CS02 (สีเหลือง) - เลือก prescalar สำหรับเลือกนาฬิกาเคาน์เตอร์ ตารางสำหรับ prescalar ที่เหมาะสมแสดงไว้ในตารางด้านล่าง ดังนั้นสำหรับ prescaling หนึ่ง (นาฬิกาออสซิลเลเตอร์ = นาฬิกาเคาน์เตอร์)
ดังนั้น CS00 = 1 อีกสองบิตเป็นศูนย์
2. WGM01 และ WGM00 ได้รับการเปลี่ยนแปลงเพื่อเลือกโหมดการสร้างรูปคลื่นตามตารางด้านล่างสำหรับ PWM ที่รวดเร็ว เรามี WGM00 = 1 และ WGM01 = 1;
3. ตอนนี้เรารู้แล้วว่า PWM เป็นสัญญาณที่มีอัตราส่วนหน้าที่แตกต่างกันหรือเวลาเปิดปิดที่แตกต่างกัน จนถึงตอนนี้เราได้เลือกความถี่และประเภทของ PWM ธีมหลักของโครงการนี้อยู่ในส่วนนี้ สำหรับการรับอัตราส่วนหน้าที่แตกต่างกันเราจะเลือกค่าระหว่าง 0 ถึง 255 (2 ^ 8 เพราะ 8 บิต) สมมติว่าเราเลือกค่า 180 เนื่องจากตัวนับเริ่มนับจาก 0 และถึงค่า 180 การตอบสนองเอาต์พุตอาจถูกทริกเกอร์ ทริกเกอร์นี้อาจกลับด้านหรือไม่กลับด้าน นั่นคือผลลัพธ์ที่สามารถบอกให้ดึงขึ้นเมื่อถึงจำนวนหรือสามารถบอกให้ดึงลงเมื่อถึงจำนวน
การเลือกการดึงขึ้นหรือลงนี้ถูกเลือกโดยบิต CM00 และ CM01
ดังแสดงในตารางเพื่อให้เอาต์พุตมีการเปรียบเทียบสูงและเอาต์พุตจะยังคงสูงจนถึงค่าสูงสุด (ดังแสดงในรูปด้านล่าง) เราต้องเลือกโหมดย้อนกลับเพื่อทำเช่นนั้นดังนั้น COM00 = 1; COM01 = 1.
ดังแสดงในรูปด้านล่าง OCR0 (Output Compare Register 0) คือไบต์ที่เก็บค่าที่ผู้ใช้เลือก ดังนั้นถ้าเราเปลี่ยน OCR0 = 180 คอนโทรลเลอร์จะทริกเกอร์การเปลี่ยนแปลง (สูง) เมื่อตัวนับถึง 180 จาก 0
ตอนนี้สำหรับการเปลี่ยนแปลงความสว่างของ LEDเราต้องเปลี่ยน DUTY RATIO ของสัญญาณ PWM ในการเปลี่ยนอัตราส่วนหน้าที่เราต้องเปลี่ยนค่า OCR0 เมื่อเราเปลี่ยนค่า OCR0 นี้ตัวนับจะใช้เวลาต่างกันเพื่อไปถึง OCR0 ดังนั้นคอนโทรลเลอร์จะดึงเอาท์พุทสูงในเวลาที่ต่างกัน
ดังนั้นสำหรับ PWM ของรอบการทำงานที่แตกต่างกันเราจำเป็นต้องเปลี่ยนค่า OCR0
ในวงจรเรามีสองปุ่ม ปุ่มหนึ่งใช้สำหรับเพิ่มค่า OCR0 ดังนั้น DUTY RATIO ของสัญญาณ PWM อีกปุ่มหนึ่งใช้สำหรับลดค่า OCR0 และดังนั้น DUTY RATIO ของสัญญาณ PWM