เพื่อที่จะดูเป็นทางการ กระผมขอเปิดบทความแรกด้วยการโพสอะไรที่มันดูมีสาระหน่อยละกันฮับ เอาเป็นเรื่องการเขียน PWM ของบอร์ด AVR ที่กำลังเรียนอยู่ในวิชา Verilog ละกัน
[PWM-ยกตัวอย่างแบบ fast pwm mode นะ]
ขออธิบายเท่าที่เราเข้าใจนะ... เพราะไม่รู้จิง+จารย์ไม่ได้สอนในห้อง(เลยยยยย)
?pwm คือ... อะไรไม่รู้ที่สามารถควบคุมการนับ TCNT0(Counter ของ timer) ได้ [กำหนดค่าสูงสุดของการนับ ปกติเปน 255 แล้ว interrupt เป็น 0]
และสามารถสร้าง square wave ได้จากไอ่ TCNT0 อ่ะแหละ... มันเป็นไง เด๋วบอกอีกที :P
fast pwm ?
มันคือ mode ที่นับ Counter(TCNT0) ตั้งแต่ 0 ถึง TOP(ปกติ max:255) อ่ะ แล้วกลับมาที่ 0 ใหม่เพื่อนับไปเรื่อยๆ ในแต่ละ Clock
ถ้าเราตั้งโหมดให้กำหนด TOP ได้ (กำหนดโดย OCR0A) เราจะสามารถที่จะควบคุมปริมาณจำนวน square wave ที่เกิดขึ้นได้ในเวลาที่กำหนด
Square Wave มาจากไหน ?
-ขอเริ่มจากการกำหนด ค่า OCR0A และ OCR0B ซึ่ง... OCR0A คือ TOP ของ TCNT0 ที่เป็น counter ที่จะนับ และ OCR0B เรียกง่ายๆ มันจะเป็นตัวกำหนด % Duty-Cycle ของ wave ที่เราต้องการ [ในที่นี้ต้องการ 50% duty-cycle ดังนั้น OCR0B = OCR0A/2]
-ส่วน Wave ที่แสดงออกมานั้นจะออกทาง OC0A(PD6) หรือไม่ก็ OC0B(PD5) แล้วแต่เรากำหนด(เด๋วจะกำหนดให้ดู) ซึ่งมันจะทำงานประมาณว่า พอ Counter นับไปถึง OCR0B แล้วมันจะสลับค่า Wave ไปอีกค่าหนึ่ง(ตามที่ตั้งค่าไว้)
และจะสลับไปเป็นอีกค่าเมื่อ Counter นับถึง OCR0A หรือ TOP นั่นเอง แล้วกลับมานับ 0 ใหม่
ซึ่งการทำงานตรงนี้จะให้ Square Wave มาให้เราได้
ต้องการบรรเลง NOTE ต่างๆจะทำอย่างไร ?
- เนื่องจากปกติ avr จะสร้าง clock ความถี่ 16MHz หรือ สร้าง คลื่นมา 16ล้าน ลูกถูกป่ะ, แล้วหลังจากเรา prescale ด้วย 1024 แล้วมันจะให้ clock ทั้งหมด 15625 ลูกภายใน 1 วินาที(16MHz/1024 = 15625 Hz)
คราวนี้(สมมติ)เราต้องการสร้าง wave จำนวน 261.63 Hz ซึ่งหมายถึง ใน 1 วิต้องมี Wave ทั้งหมด ~ 261 ลูก แสดงว่า Counter นั้นจะต้องวิ่งนับทั้งหมด 15625/261.63 clock ~ 59 clock
จะได้ว่าเราจะต้องกำหนด TOP(OCR0A) ให้เป็น 59 เพื่อจะทำให้ใน 1 วินั้นมี Wave ~ 261 ลูก
หมาวยเหตุ: ปกติ Interrupt นั้นจะต้องนับ Counter ถึง 255 มันถึงจะทำ ISR(TIMER0_OVF_vect) แต่ในที่นี้ Counter พอนับถึง TOP มันก็ Interrupt เน้ออออ
Example Code : Click
PWM Reference : Click
ขอบคุณมากครับ :)
ตอบลบ