ภาษาแอสเซมบลี ควบคุมความสว่าง LED ด้วย PWM


จนถึงตอนนี้เราใช้ไฟ LED กะพริบ ตอนนี้เรากะพริบต่อไป แต่ด้วยความถี่สูง ด้วยการกะพริบนั้นเราจะเปลี่ยนมาควบคุมความสว่างของหลอดไฟ LED และนี่เป็นลักษณะเชิงเส้นที่แน่นอน

ความรู้เบื้องต้นเกี่ยวกับโหมด PWM ของตัวจับเวลา


ภาษาแอสเซมบลี ควบคุมความสว่าง LED ด้วย PWM


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

หลังจากนั้นการจับคู่การเปรียบเทียบจะเกิดขึ้นภายในวงจรทั้งหมดจะยิ่งได้ระยะแรกนานขึ้นและระยะที่สองจะสั้นลง ลักษณะการทำงานนี้ช่วยให้สามารถควบคุมกำลังของมอเตอร์กระแสตรงและความเข้มของไฟ LED โปรดทราบว่าในช่วง ON ทรานซิสเตอร์จะขับเคลื่อนมอเตอร์ด้วยกำลังไฟฟ้าสูงสุดที่มีอยู่และ จำกัด ระยะเวลาไว้เท่านั้น ดังนั้นกำลังของมอเตอร์จึงเป็นเส้นตรงจริงๆ

การควบคุมเอาต์พุต PWM ที่รวดเร็วบิต COM0A1 และ COM0A0 ในพอร์ต TCCR0A เป็นตัวกำหนดลักษณะการทำงานของเอาต์พุต ด้วย 0b10 เอาต์พุตจะถูกตั้งค่าไว้ที่จุดเริ่มต้นของวงจร PWM โดย 0b11 จะถูกล้าง คล้ายกับ COM0B1 และ COM0B0 นี้ในพอร์ตเดียวกันควบคุมขาเอาต์พุต OC0B

บิต COM0A1 และ COM0A0 ในพอร์ต TCCR0A เป็นตัวกำหนดลักษณะการทำงานของเอาต์พุต ด้วย 0b10 เอาต์พุตจะถูกตั้งค่าไว้ที่จุดเริ่มต้นของวงจร PWM โดย 0b11 จะถูกล้าง คล้ายกับ COM0B1 และ COM0B0 นี้ในพอร์ตเดียวกันควบคุมขาเอาต์พุต OC0B

ภาษาแอสเซมบลี ควบคุมความสว่าง LED ด้วย PWM

ตัวอย่าง Fast PWMสิ่งนี้แสดงให้เห็นว่าแรงดันไฟฟ้าบนเอาต์พุต OC0A เปลี่ยนแปลงอย่างไรในโหมด Fast PWM โดยมี TOP ที่ 255 และเปรียบเทียบการจับคู่ที่ 100 ความกว้างพัลส์ที่ได้คือ 100/256 = สูง 39%

ภายในโหมด Fast PWM การเลือกตัวตั้งเวลาล่วงหน้าจะกำหนดความถี่ของ PWM ที่ความถี่นาฬิกาที่แตกต่างกันและค่า Prescaler ความถี่ต่อไปนี้จะส่งผลให้มีช่วงกว้าง

ClockP=1P=8P=64P=256P=1.024
9.6 Mcs/s37.5 kcs/s4.69 kcs/s586 cs/s146.5 cs/s36,6 cs/s
4.8 Mcs/s18.8 kcs/s2.35 kcs/s293 cs/s73.3 cs/s18.3 cs/s
2.4 Mcs/s9.4 kcs/s1.68 kcs/s147 cs/s36.7 cs/s9.15 cs/s
1.2 Mcs/s4.69 kcs/s586 cs/s73.2 cs/s18.3 cs/s4.6 cs/s
128 kcs/s500 cs/s62.5 cs/s7.8 cs/s1.95 cs/s0.49 cs/s

ที่ 1.2 และ 2.4 Mcs / s ความถี่ PWM ทั้งหมดอยู่ในช่วงที่ได้ยิน (เมื่อใช้มอเตอร์อาจส่งผลให้เกิดเสียงฮัมได้ไม่สะดวก) ความถี่สัญญาณนาฬิกา 128 kcs / s ไม่เหมาะสมสำหรับวัตถุประสงค์ดังกล่าวที่ค่า Prescaler 1,024 เราสามารถทำตามกระบวนการ PWM ด้วยสายตาได้

เฟสถูกต้อง 8 บิต PWM



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

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

PWM ที่มีความละเอียดแตกต่างกัน


PWM กับ CTCไม่จำเป็นต้องใช้ความละเอียด 8 บิตเสมอไปโดยมีขั้นตอนการนับ 256 ขั้น (ความแม่นยำ 0.39%) ในบางกรณีก็เพียงพอที่จะมีความละเอียดเพียงสี่ (6.25%) หรือห้า (3.1%) บิตของสัญญาณ PWM สำหรับมอเตอร์ขนาดเล็ก 8 บิตอาจจะทำงานมากเกินไป หากนับเป็น 16 (ความละเอียดสี่บิต) วงจรจะรีสตาร์ทความถี่ PWM จะเพิ่มขึ้นตามลำดับ สิ่งนี้สามารถเข้าถึงได้โดยการรวมโหมด PWM กับ CTC: ในกรณีนั้นเปรียบเทียบพอร์ตการจับคู่ A จะใช้เป็น CTC และเปรียบเทียบการจับคู่ B เป็นสัญญาณ PWM ทั้งสองโหมดเป็นไปได้ดังที่ตารางโหมดแสดง

ในกรณีที่มีความละเอียด 4 บิต (เปรียบเทียบ Match A = 15) โดยมีนาฬิกา 1.2 Mcs / s และตัวจับเวลา 1 ตัวความถี่ PWM จะอยู่ที่ 37.5 kcs / s เหนือพื้นที่ที่ได้ยินสำหรับมนุษย์และสัตว์ป่าส่วนใหญ่ (ไม่รวม ค้างคาว)

ในกรณีของตัวจับเวลา / ตัวนับ 16 บิตซึ่ง ATtiny13 ไม่มีเลยโหมด PWM ที่ถูกต้องเฟสปกติจะมีความละเอียด 16 บิต (ความแม่นยำ: 0.0015%) ซึ่งสูงกว่าข้อกำหนดในทางปฏิบัติใด ๆ ดังนั้นจึงมีความจำเป็นเกือบตลอดเวลาที่จะต้องลดความละเอียดลง เพื่อบรรเทาการเปรียบเทียบ Match A จากงาน CTC นี้และอนุญาตให้ใช้เป็นช่องสัญญาณ PWM เพิ่มเติมพอร์ตเพิ่มเติม (ICR) จะจัดเตรียมงานนี้

ควบคุมความสว่าง LED ด้วย PWM


รายการอุปกรณ์


ขั้นตอนการทํางาน

1 : โปรแกรมแรก เปิดไฟ LED


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


2 : โหมด Fast PWM


ด้วยข้อมูลก่อนหน้านี้เกี่ยวกับฟังก์ชันคุณสมบัติและวิธีการควบคุมความเข้มของ PWM สามารถตั้งโปรแกรมได้ด้วยวิธีง่ายๆ ในฐานะที่เป็นความถี่รอบ PWM เราเลือกที่ 1.2 Mcs / s clock และ Prescaler เป็น 1 ส่งผลให้ 1,200 / 256 = 4.7 kcs / s เร็วพอสำหรับสายตามนุษย์และสำหรับกล้องดิจิทัลทุกรุ่น

โค้ดสำหรับ Fast PWM ด้วยการเปลี่ยนขั้วของเอาต์พุต PWM

 ; -------- Register -------------------------
 .def rmp = R16 ; multi purpose register
 ;
 ; -------- Program --------------------------
     ; Init output pin OC0A
     sbi DDRB,DDB0 ; OC0A as output
     ; PWM compare value to timer 0
     ldi rmp,20 * 256 / 100 ; 20% intensity
     out OCR0A,rmp ; to compare match port A
     ; Timer 0 in Fast PWM mode, output A low at cycle start
     ldi rmp,(1<<COM0A1)|(1<<COM0A0)|(1<<WGM01)|(1<<WGM00)
     out TCCR0A,rmp ; to timer control port A
     ; Start Timer 0 with prescaler = 1
     ldi rmp,1<<CS00 ; Prescaler = 1
     out TCCR0B,rmp ; to timer control port B
     ; Enable sleep mode
     ldi rmp,1<<SE ; Sleep enable, mode idle
     out MCUCR,rmp ; to Universal control port
 Loop:
     sleep ; go to sleep
     nop ; in case of wakeup
     rjmp Loop ; again to sleep


ความเข้มของ LED


การควบคุมความเข้ม PWM เป็นรหัสที่ค่อนข้างง่าย และนี่คือผลลัพธ์:

ความแตกต่างของความเข้มข้นจะเห็นได้ชัดเจน

โปรดทราบว่าไม่สามารถตั้งค่า PWM เป็นความเข้ม 0% ได้เนื่องจากพัลส์นาฬิกาแรกจะทำงานเสมอ ถ้า 0% ควรจะปิด LED จริงๆต้องแยกขาเอาต์พุตออกจากตัวควบคุม PWM และตั้งค่าขาพอร์ตให้เป็น LOW


credit : http://www.avr-asm-tutorial.net/avr_en/micro_beginner/5_Led_pwm/5_Led_Pwm.html


<<< #4 ไฟกระพริบ ด้วย Timer บทความก่อนหน้า | บทความต่อไป #6 ปุ่มขัดจังหวะ interrupt >>>