วันพฤหัสบดีที่ 11 กุมภาพันธ์ พ.ศ. 2559

การสร้างสัญญาณ PWM ด้วยภาษา VHDL




PWM(Pulse Width Modulation) คืออะไร
PWM คือเทคนิคการส่งสัญญาณแบบสวิตซ์ หรือ ส่งค่าดิจิตอล 0-1 โดยให้สัญญาณความถี่คงที่ การควบคุมระยะเวลาสัญญาณสูงและสัญญาณต่ำ ที่ต่างกัน ก็จะทำให้ค่าแรงดันเฉลี่ยของสัญญาณสวิตซ์ ต่างกันด้วย
แนวทางการสร้างสัญญาณ PWM
            การสร้างสัญญาณ PWM จะต้องอาศัยตัวนับ (Counter) เป็นตัวนับ โดยโปรแกรมที่เราจะทำเมื่อกดปุ่มหนึ่งครั้งจะเพื่อ Duty Cycle ของ PWM ครั้งละ 10% เมื่อเพิ่มครบ 100% จะกลับไปเริ่มต้นที่ 0% ใหม่ เมื่อ และสัญญาณ PWM ที่เราต้องการนั้นอยู่ในช่วง 500 Hz – 1kHz โดยเราทราบความถี่ของบอร์ด FPGA อยู่แล้วคือ 50MHz การที่เราจะได้ความถี่1kHz นั้น เราต้องคำนวณจาก ความถี่CLK ของบอร์ด FPGA หารด้วย ความถี่ที่เราต้องการคือ 1kHz จะได้ Period ของสัญญาณ PWM จากนั้นเราก็นั้น Period นั้นไปทำการกำหนดลอจิกของสัญญาณ PWM
Generator PWM
            ทำไมเราต้อง Generate สัญญาณ การ Generate สัญญาณนั้น ทำให้เราไม่ต้องยุ่งยากในการสร้างสัญญาณหลายๆครั้ง การ Generate ก็เหมือนกับการวนลูปเพื่อทำอะไรซ้ำๆตามจำนวนครั้งที่เราต้องการ โดยที่เราไม่ต้องไปสร้างสิ่งเดิมๆ หลายๆรอบ


สร้างสัญญาณ PWM 3ช่อง ขั้นตอนแรกสร้างสัญญาณ PWM 1 ช่องก่อน
รูป RTL ที่ได้

Code ในส่วนของ Debounce



                                การสร้าง Debounce สร้างเพื่อ แก้ไขส่วนที่เป็น bounce ขณะกดปุ่มจะมีสัญญาณ bounce เกิดขึ้นทำให้เกิดการผิดพลาด โดยหลักการสร้าง Debounce นั้น จะใช้การนับค่าจนถึง 500000 ถึงการจะนับเพิ่มขึ้นได้นั้น ลอจิกของสัญญาณต้องเหมือนกับลอจิกก่อนหน้า ซึ่งถ้านับถึง 500000 สัญญาณที่ได้นั้นจะออกจากช่วงที่เป็น bounce และนำสัญญาณลอจิก นั้นส่งให้ในส่วนของการนับในขั้นตอนถัดไป
·         

      Code ในส่วนของ counterDuty



                     ส่วนของ counterDuty นั้นจะเป็นส่วนของการนับเมื่อมีการกดปุ่ม ซึ่งรับลอจิกผ่านการ Debounce มาแล้ว โดยค่าเริ่มต้นของการนับคือ 0 เมื่อกดปุ่มแล้วปล่อย จะทำการนับเพิ่มทีละหนึ่ง แต่หากนับถึง 10 แล้วกดอีกครั้งจะทำการเซ็ตค่าเป็น 0 และเมื่อกดปุ่ม Reset ก็จะเซ็ตค่าเป็น 0 เหมือนกันแตกต่างกันตรงที่ ปุ่ม Reset จะทำงานโดยไม่ต้องรอสัญญาณ CLK           



·         Code ในส่วนของ countertoPWM




             สำหรับปรับความถี่ของสัญญาณ PWM โดยทำงานตามสัญญาณ Clock ขอบขาขึ้น
โดยความถี่จะเริ่มที่ 500Hz เมื่อกดปุ่ม(PB_fq) ความถี่จะเพิ่มขึ้นครั้งละ 100Hz แต่เมื่อความถี่เท่ากับ 1kHz พอกดอีกครั้ง จะกลับมาเริ่มที่500Hz และค่าของตัวแปร frequency จะนำมาคำนวณค่าของ pwm_periode ของสัญญาณ PWM จึงเกิดการเปลี่ยนแปลงความถี่ของสัญญาณ PWM

             ส่วนนี้เป็นส่วนของการแปลงค่าที่นับได้เป็นสัญญาณ PWM โดยคาบของสัญญาณ PWM  จะขึ้นอยู่กับ ค่า pwm_period ที่ส่งมาจาก process ก่อนหน้า โดยจะนำคาบของสัญญาณมาแบ่งเป็น 10 ส่วนแล้วคูณ กับเลขที่นับได้จากส่วน counter หลังจากนั้นก็ไปกำหนดเงื่อนไขว่าหากสัญญาณน้อยกว่าส่วนของ Duty ให้แสดงลอจิกเป็น 1 หากมากกว่าให้เป็น 0 และถ้าสัญญาณถึงค่า period -1 ให้เป็นลอจิกเป็น 1  
·        

         Code ในส่วนของ PWM_display




              ส่วนนี้เป็นส่วนของการรวมทั้ง 3 ส่วนเข้าด้วยกัน โดยเริ่มจากให้มีการ Debounce ลอจิกก่อนที่จะส่งค่าเข้าไปให้ counter เป็นตัวนับ และให้ส่วน counter ส่งไปให้ส่วนของการแสดง สัญญาณ PWM

       
·      Code ในส่วนของ pwm_generic
ส่วนนี้เป็นส่วนของการ Generate ซึ่งจะนำส่วนต่างๆทั้ง 3 ส่วนที่ผ่านมา




    เมื่อทำสัญญาณ PWM 1 ช่องสัญญาณได้แล้ว จึงทำการ Generate PWM 3 ช่องสัญญาณ
จะได้รูป RTL ดังนี้


ผลที่ได้





รูปสัญญาณเริ่มต้น ค่าของ Duty Cycle จะเท่ากับ 0%




เมื่อกดปุ่ม ค่า Duty Cycle จะเพิ่มขึ้นทีหละ10%



เมื่อกดปุ่ม ค่า Duty Cycle จะเพิ่มขึ้นเรื่อยๆ
สังเกตในรูปภาพสัญญาณ ลอจิก 1 จะขยายกว้างขึ้น


เมื่อค่าของ Duty Cycle ถึง 100% สัญญาณจะเป็นดังรูปภาพ




PWM signal 1 channel



ผลที่ได้



สัญญาณ PWM 3 channel


เมื่อกดปุ่ม PB0 ในบอร์ด FPGA  ค่าของ Duty Cycle จะเพิ่มขึ้นที่ละ10%
ของสัญญาณ PWM ในสัญญาณช่องที่ 1
  

เมื่อกดปุ่ม PB1 ในบอร์ด FPGA  ค่าของ Duty Cycle จะเพิ่มขึ้นที่ละ10%
ของสัญญาณ PWM ในสัญญาณช่องที่ 2

เมื่อกดปุ่ม PB2 ในบอร์ด FPGA  ค่าของ Duty Cycle จะเพิ่มขึ้นที่ละ10%
ของสัญญาณ PWM ในสัญญาณช่องที่ 3


เมื่อเลื่อน switch SW0 ให้เป็นลอจิก 0 จะ Reset สัญญาณทั้งหมด




PWM signal 3 channel



ความถี่ของสัญญาณ PWM เริ่มที่ 500Hz เมื่อกดปุ่ม PB4
ความถี่จะเพิ่มขึ้นครั้งละ 100Hz พอถึง 1kHz กดปุ่ม PB4 อีกครั้งจะวนกลับมา 500Hz










              





                        



                           







                  




































































ไม่มีความคิดเห็น:

แสดงความคิดเห็น