- สัญญาณ PWM คืออะไร?
- PWM โดยใช้ PIC16F877A:
- การเขียนโปรแกรม PIC เพื่อสร้างสัญญาณ PWM:
- แผนผังและการทดสอบ:
- ทำงานกับฮาร์ดแวร์:
นี่คือวิธีการสอนที่ 10 ของเราของ การเรียนรู้ไมโครคอนโทรลเลอร์ PIC ใช้ MPLAB XC8 จนถึงตอนนี้เราได้ครอบคลุมบทเรียนพื้นฐานมากมายเช่น LED กระพริบด้วย PIC, ตัวจับเวลาใน PIC, การเชื่อมต่อ LCD, การเชื่อมต่อ 7 ส่วน, ADC โดยใช้ PIC เป็นต้นหากคุณเป็นผู้เริ่มต้นอย่างแท้จริงโปรดไปที่รายการบทช่วยสอน PIC ทั้งหมดที่นี่และ เริ่มเรียนรู้
ในการกวดวิชานี้เราจะได้เรียนรู้ วิธีการสร้างสัญญาณ PWM ใช้ PIC PIC16F877A PIC MCU ของเรามีโมดูลพิเศษที่เรียกว่าCompare Capture module (CCP) ซึ่งสามารถใช้เพื่อสร้างสัญญาณ PWM ที่นี่เราจะสร้าง PWM 5 kHz โดยมีรอบการทำงานที่เปลี่ยนแปลงได้ตั้งแต่ 0% ถึง 100% เพื่อให้รอบการทำงานแตกต่างกันไปเราใช้โพเทนชิออมิเตอร์ดังนั้นขอแนะนำให้เรียนรู้การสอน ADC ก่อนเริ่มด้วย PWM โมดูล PWM ยังใช้ตัวจับเวลาเพื่อตั้งค่าความถี่ดังนั้นเรียนรู้วิธีใช้ตัวจับเวลาล่วงหน้าได้ที่นี่ นอกจากนี้ในบทช่วยสอนนี้เราจะใช้วงจร RC และ LED เพื่อแปลงค่า PWM เป็นแรงดันไฟฟ้าอนาล็อกและใช้เพื่อลดแสงไฟ LED
สัญญาณ PWM คืออะไร?
Pulse Width Modulation (PWM) เป็นสัญญาณดิจิทัลที่นิยมใช้ในวงจรควบคุม สัญญาณนี้ตั้งไว้สูง (5v) และต่ำ (0v) ในเวลาและความเร็วที่กำหนดไว้ล่วงหน้า เวลาที่สัญญาณอยู่สูงเรียกว่า "ตรงเวลา" และเวลาที่สัญญาณอยู่ต่ำเรียกว่า "เวลาปิด" มีสองพารามิเตอร์ที่สำคัญสำหรับ PWM ดังที่กล่าวไว้ด้านล่าง:
รอบการทำงานของ PWM:
เปอร์เซ็นต์ของเวลาที่สัญญาณ PWM ยังคงสูง (ตรงเวลา) เรียกว่าเป็นรอบการทำงาน หากสัญญาณเปิดอยู่เสมอสัญญาณจะอยู่ในรอบการทำงาน 100% และหากปิดอยู่เสมอจะเป็นรอบการทำงาน 0%
Duty Cycle = เปิดเวลา / (เปิดเวลา + ปิดเวลา)
ความถี่ของ PWM:
ความถี่ของสัญญาณ PWM จะกำหนดความเร็วของ PWM ในช่วงเวลาหนึ่ง หนึ่งช่วงเวลาเสร็จสมบูรณ์เปิดและปิดของสัญญาณ PWM ดังแสดงในรูปด้านบน ในบทช่วยสอนของเราเราจะกำหนดความถี่เป็น 5KHz
PWM โดยใช้ PIC16F877A:
สามารถสร้างสัญญาณ PWM ในไมโครคอนโทรลเลอร์ PIC ของเราได้โดยใช้โมดูลCCP (Compare Capture PWM) ความละเอียดของสัญญาณ PWM ของเราคือ 10 บิตนั่นคือสำหรับค่า 0 จะมีรอบการทำงานเป็น 0% และสำหรับค่า 1024 (2 ^ 10) จะมีรอบการทำงาน 100% มีโมดูล CCP สองโมดูลใน PIC MCU ของเรา (CCP1 และ CCP2) ซึ่งหมายความว่าเราสามารถสร้างสัญญาณ PWM สองตัวบนพินที่แตกต่างกันสองพิน (พิน 17 และ 16) พร้อมกันในบทช่วยสอนของเราเราใช้ CCP1 เพื่อสร้างสัญญาณ PWM บนพิน 17
การลงทะเบียนต่อไปนี้ใช้เพื่อสร้างสัญญาณ PWM โดยใช้ PIC MCU ของเรา:
- CCP1CON (ทะเบียนควบคุม CCP1)
- T2CON (ลงทะเบียนควบคุมตัวจับเวลา 2)
- PR2 (Timer 2 โมดูลการลงทะเบียนงวด)
- CCPR1L (CCP Register 1 ต่ำ)
การเขียนโปรแกรม PIC เพื่อสร้างสัญญาณ PWM:
ในโปรแกรมของเราเราจะอ่านแรงดันอนาล็อก 0-5v จากโพเทนชิออมิเตอร์และจับคู่กับ 0-1024 โดยใช้โมดูล ADC ของเรา จากนั้นเราจะสร้างสัญญาณ PWM ที่มีความถี่ 5000Hz และเปลี่ยนรอบการทำงานตามแรงดันอนาล็อกอินพุต นั่นคือ 0-1024 จะถูกแปลงเป็น 0% -100% Duty cycle บทช่วยสอนนี้ถือว่าคุณได้เรียนรู้การใช้ ADC ใน PIC ไปแล้วหากไม่อ่านจากที่นี่เพราะเราจะข้ามรายละเอียดเกี่ยวกับเรื่องนี้ในบทช่วยสอนนี้
ดังนั้นเมื่อตั้งค่าบิตการกำหนดค่าและเขียนโปรแกรมเพื่ออ่านค่าอนาล็อกเราสามารถดำเนินการต่อด้วย PWM
ควรใช้ขั้นตอนต่อไปนี้เมื่อกำหนดค่าโมดูล CCP สำหรับการทำงานของ PWM:
- กำหนดระยะเวลา PWM โดยเขียนลงในทะเบียน PR2
- ตั้งค่ารอบการทำงาน PWM โดยเขียนลงในทะเบียน CCPR1L และบิต CCP1CON <5: 4>
- ทำให้ CCP1 พินเอาต์พุตโดยการล้างบิต TRISC <2>
- ตั้งค่า TMR2 prescale และเปิดใช้งาน Timer2 โดยเขียนเป็น T2CON
- กำหนดค่าโมดูล CCP1 สำหรับการทำงานของ PWM
มีฟังก์ชันสำคัญสองอย่างในโปรแกรมนี้เพื่อสร้างสัญญาณ PWM หนึ่งคือฟังก์ชัน PWM_Initialize ()ซึ่งจะเริ่มต้นการลงทะเบียนที่จำเป็นในการตั้งค่าโมดูล PWM จากนั้นกำหนดความถี่ที่ PWM ควรทำงานส่วนฟังก์ชันอื่นคือฟังก์ชันPWM_Duty ()ซึ่งจะกำหนดรอบการทำงานของสัญญาณ PWM ใน การลงทะเบียนที่จำเป็น
PWM_Initialize () {PR2 = (_XTAL_FREQ / (PWM_freq * 4 * TMR2PRESCALE)) - 1; // การตั้งค่าสูตร PR2 โดยใช้ Datasheet // ทำให้ PWM ทำงานใน 5KHZ CCP1M3 = 1; CCP1M2 = 1; // กำหนดค่าโมดูล CCP1 T2CKPS0 = 1; T2CKPS1 = 0; TMR2ON = 1; // กำหนดค่าโมดูลตัวจับเวลา TRISC2 = 0; // สร้างขาพอร์ตบน C เป็นเอาต์พุต}
ฟังก์ชันข้างต้นเป็นฟังก์ชันเริ่มต้น PWM ในฟังก์ชันนี้โมดูล CCP1 ถูกตั้งค่าให้ใช้ PWM โดยทำให้บิต CCP1M3 และ CCP1M2 สูง
Prescaler ของโมดูลตัวจับเวลาถูกตั้งค่าโดยทำให้บิต T2CKPS0 สูงและ T2CKPS1 ต่ำสุดบิต TMR2ON จะถูกตั้งค่าให้เริ่มจับเวลา
ตอนนี้เราจะต้องตั้งค่าความถี่ของสัญญาณ PWM ที่ ค่าของความถี่จะต้องถูกเขียนลงในทะเบียน PR2 สามารถกำหนดความถี่ที่ต้องการได้โดยใช้สูตรด้านล่าง
ระยะเวลา PWM = * 4 * TOSC * (TMR2 Prescale Value)
การจัดเรียงสูตรเหล่านี้ใหม่เพื่อรับ PR2 จะให้
PR2 = (งวด / (4 * Tosc * TMR2 Prescale)) - 1
เรารู้ว่า Period = (1 / PWM_freq) และ Tosc = (1 / _XTAL_FREQ) ดังนั้น…..
PR2 = (_XTAL_FREQ / (PWM_freq * 4 * TMR2PRESCALE)) - 1;
เมื่อตั้งค่าความถี่แล้วไม่จำเป็นต้องเรียกฟังก์ชันนี้อีกจนกว่าเราจะต้องเปลี่ยนความถี่อีกครั้ง ในบทช่วยสอนของเราฉันได้กำหนด PWM_freq = 5000; เพื่อให้เราได้รับความถี่ในการทำงาน 5 KHz สำหรับสัญญาณ PWM ของเรา
ตอนนี้ให้เราตั้งค่ารอบการทำงานของ PWMโดยใช้ฟังก์ชันด้านล่าง
PWM_Duty (หน้าที่ int ที่ไม่ได้ลงนาม) {if (duty <1023) {duty = ((float) duty / 1023) * (_ XTAL_FREQ / (PWM_freq * TMR2PRESCALE)); // ในการลด // duty = (((float) duty / 1023) * (1 / PWM_freq)) / ((1 / _XTAL_FREQ) * TMR2PRESCALE); CCP1X = หน้าที่ & 1; // จัดเก็บบิตที่ 1 CCP1Y = duty & 2; // จัดเก็บ CCPR1L บิตที่ 0 = duty >> 2; // จัดเก็บ remining 8 bit}}
สัญญาณ PWM ของเรามีความละเอียด 10 บิตดังนั้นค่านี้จึงไม่สามารถเก็บไว้ในรีจิสเตอร์เดียวได้เนื่องจาก PIC ของเรามีสายข้อมูล 8 บิตเท่านั้น ดังนั้นเราจึงใช้ CCP1CON <5: 4> อีกสองบิต (CCP1X และ CCP1Y) เพื่อเก็บ LSB สองตัวสุดท้ายจากนั้นเก็บอีก 8 บิตที่เหลือในทะเบียน CCPR1L
เวลารอบการทำงานของ PWM สามารถคำนวณได้โดยใช้สูตรด้านล่าง:
PWM Duty Cycle = (CCPRIL: CCP1CON <5: 4>) * Tosc * (TMR2 Prescale Value)
การจัดเรียงสูตรเหล่านี้ใหม่เพื่อรับค่า CCPR1L และ CCP1CON จะให้:
CCPRIL: CCP1Con <5: 4> = PWM Duty Cycle / (Tosc * TMR2 Prescale Value)
ค่า ADC ของเราจะเป็น 0-1024 เราต้องการให้เป็น 0% -100% ดังนั้น PWM Duty Cycle = duty / 1023 นอกจากนี้ในการแปลงวัฏจักรหน้าที่นี้เป็นช่วงเวลาหนึ่งเราต้องคูณด้วยคาบ (1 / PWM_freq)
เรารู้ด้วยว่า Tosc = (1 / PWM_freq) ด้วยเหตุนี้..
หน้าที่ = (((ลอย) หน้าที่ / 1023) * (1 / PWM_freq)) / ((1 / _XTAL_FREQ) * TMR2PRESCALE);
การแก้สมการข้างต้นจะทำให้เรา:
หน้าที่ = ((ลอย) หน้าที่ / 1023) * (_XTAL_FREQ / (PWM_freq * TMR2PRESCALE));
คุณสามารถตรวจสอบโปรแกรมที่สมบูรณ์ในส่วนของรหัสด้านล่างพร้อมกับรายละเอียดวิดีโอ
แผนผังและการทดสอบ:
ตามปกติให้เราตรวจสอบผลลัพธ์โดยใช้การจำลอง Proteus วงจรแผนภาพแสดงอยู่ด้านล่าง
เชื่อมต่อมิเตอร์ให้ 7 THขาฟีดในแรงดันไฟฟ้าของ 0-5 โมดูล CCP1 มีพิน 17 (RC2) ที่นี่ PWM จะถูกสร้างขึ้นซึ่งสามารถตรวจสอบได้โดยใช้ Digital oscilloscope นอกจากนี้ในการแปลงสิ่งนี้เป็นแรงดันไฟฟ้าแบบแปรผันเราได้ใช้ตัวกรอง RC และ LED เพื่อตรวจสอบเอาต์พุตโดยไม่มีขอบเขต
RC-Filter คืออะไร?
กรอง RC หรือตัวกรองผ่านต่ำเป็นวงจรที่เรียบง่ายด้วยสององค์ประกอบเรื่อย ๆ คือตัวต้านทานและตัวเก็บประจุ ส่วนประกอบทั้งสองนี้ใช้เพื่อกรองความถี่ของสัญญาณ PWM ของเราและทำให้เป็นแรงดันไฟฟ้ากระแสตรงแบบแปรผัน
หากเราตรวจสอบวงจรเมื่อใช้แรงดันไฟฟ้าแปรผันกับอินพุตของ R ตัวเก็บประจุ C จะเริ่มชาร์จ ตอนนี้ขึ้นอยู่กับค่าของตัวเก็บประจุตัวเก็บประจุจะใช้เวลาสักครู่ในการชาร์จจนเต็มเมื่อชาร์จแล้วจะปิดกั้นกระแสไฟฟ้ากระแสตรง (โปรดจำไว้ว่าตัวเก็บประจุบล็อก DC แต่อนุญาตให้ใช้ AC) ดังนั้นแรงดัน DC อินพุตจะปรากฏบนเอาต์พุต PWM ความถี่สูง (สัญญาณ AC) จะต่อสายดินผ่านตัวเก็บประจุ ดังนั้นจึงได้รับ DC บริสุทธิ์จากตัวเก็บประจุ พบว่าค่า 1000Ohm และ 1uf เหมาะสมสำหรับโปรเจ็กต์นี้ การคำนวณค่า R และ C เกี่ยวข้องกับการวิเคราะห์วงจรโดยใช้ฟังก์ชันการถ่ายโอนซึ่งอยู่นอกขอบเขตของบทช่วยสอนนี้
ผลลัพธ์ของโปรแกรมสามารถตรวจสอบได้โดยใช้ Digital Oscilloscopeดังที่แสดงด้านล่างเปลี่ยน Potentiometer และรอบหน้าที่ของ PWM ควรเปลี่ยนไป เรายังสามารถสังเกตเห็นแรงดันไฟฟ้าขาออกของวงจร RC โดยใช้โวลต์มิเตอร์ หากทุกอย่างทำงานตามที่คาดไว้เราสามารถดำเนินการกับฮาร์ดแวร์ของเราได้ ตรวจสอบวิดีโอเพิ่มเติมในตอนท้ายสำหรับกระบวนการทั้งหมด
ทำงานกับฮาร์ดแวร์:
การตั้งค่าฮาร์ดแวร์ของโครงการนั้นง่ายมากเราจะนำบอร์ด PIC Perf ของเรากลับมาใช้ใหม่ที่แสดงด้านล่าง
นอกจากนี้เรายังต้องใช้โพเทนชิออมิเตอร์เพื่อป้อนแรงดันไฟฟ้าแบบอะนาล็อกฉันได้ต่อสายปลายตัวเมียเข้ากับหม้อของฉัน (แสดงด้านล่าง) เพื่อให้เราสามารถเชื่อมต่อกับบอร์ด PIC Perf
ในที่สุดเพื่อตรวจสอบเอาต์พุตเราต้องใช้วงจร RC และ LEDเพื่อดูว่าสัญญาณ PWM ทำงานอย่างไรฉันใช้บอร์ด perf ขนาดเล็กและบัดกรีวงจร RC และ LED (เพื่อควบคุมความสว่าง) ตามที่แสดงด้านล่าง
เราสามารถใช้สายเชื่อมต่อแบบหญิงกับหญิงแบบธรรมดาและเชื่อมต่อตามแผนผังที่แสดงด้านบน เมื่อการเชื่อมต่อเสร็จสิ้นให้อัปโหลดโปรแกรมไปยัง PIC โดยใช้ pickit3 ของเราและคุณจะสามารถรับแรงดันไฟฟ้าได้ตามอินพุตของโพเทนชิออมิเตอร์ของคุณ เอาต์พุตตัวแปรใช้เพื่อควบคุมความสว่างของ LED ที่นี่
ฉันใช้มัลติมิเตอร์เพื่อวัดเอาท์พุตตัวแปรนอกจากนี้เรายังสามารถสังเกตเห็นความสว่างของ LED ที่เปลี่ยนไปสำหรับระดับแรงดันไฟฟ้าที่แตกต่างกัน
นั่นคือเราได้ตั้งโปรแกรมให้อ่านแรงดันอนาล็อกจาก POT และแปลงเป็นสัญญาณ PWM ซึ่งจะถูกแปลงเป็นแรงดันไฟฟ้าแปรผันโดยใช้ตัวกรอง RC และผลลัพธ์จะได้รับการตรวจสอบโดยใช้ฮาร์ดแวร์ของเรา หากคุณมีข้อสงสัยหรือติดขัดบางประการกรุณาใช้ส่วนความคิดเห็นด้านล่างเรายินดีที่จะช่วยเหลือคุณ การทำงานที่สมบูรณ์คือการทำงานในวิดีโอ
ตรวจสอบบทแนะนำ PWM อื่น ๆ ของเราเกี่ยวกับไมโครคอนโทรลเลอร์อื่น ๆ:
- การสอน Raspberry Pi PWM
- PWM กับ Arduino Due
- Arduino LED Dimmer โดยใช้ PWM
- ไฟ LED หรี่โดยใช้ไมโครคอนโทรลเลอร์ ATmega32