วันพุธที่ 9 กุมภาพันธ์ พ.ศ. 2554

การใช้ PWM version มั่ว...

  เพื่อที่จะดูเป็นทางการ กระผมขอเปิดบทความแรกด้วยการโพสอะไรที่มันดูมีสาระหน่อยละกันฮับ  เอาเป็นเรื่องการเขียน 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

1 ความคิดเห็น: