- พื้นฐานของสัญญาณ PWM
- การตั้งค่าฮาร์ดแวร์และข้อกำหนด
- แผนภาพวงจรสำหรับ Nuvoton N76E003 ไมโครคอนโทรลเลอร์ LED Dimming
- PWM Pins บนไมโครคอนโทรลเลอร์ N76E003 Nuvoton
- PWM รีจิสเตอร์และฟังก์ชั่นในไมโครคอนโทรลเลอร์ N76E003 Nuvoton
- โหมดการทำงาน PWM ในไมโครคอนโทรลเลอร์ Nuvoton N6E003
- การเขียนโปรแกรม Nuvoton N76E003 สำหรับ PWM
- กระพริบรหัสและทดสอบเอาต์พุต
Pulse Width Modulation (PWM) เป็นเทคนิคที่ใช้กันทั่วไปในไมโครคอนโทรลเลอร์เพื่อสร้างสัญญาณพัลส์ต่อเนื่องโดยมีความถี่และรอบการทำงานที่กำหนดไว้ กล่าวโดยย่อคือ PWM เกี่ยวกับการเปลี่ยนความกว้างของพัลส์ในขณะที่ความถี่คงที่
สัญญาณ PWM ส่วนใหญ่จะใช้ในการควบคุมเซอร์โวมอเตอร์หรือความสว่างของ LED นอกจากนี้เนื่องจากไมโครคอนโทรลเลอร์สามารถให้ลอจิก 1 (สูง) หรือลอจิก 0 (ต่ำ) บนพินเอาต์พุตได้เท่านั้นจึงไม่สามารถให้แรงดันไฟฟ้าอะนาล็อกที่แตกต่างกันได้เว้นแต่จะใช้ตัวแปลง DAC หรือ Digital เป็น Analog ในกรณีเช่นนี้ไมโครคอนโทรลเลอร์สามารถตั้งโปรแกรมให้ส่งออก PWM ด้วยวงจรการทำงานที่หลากหลายซึ่งสามารถแปลงเป็นแรงดันไฟฟ้าอะนาล็อกที่แตกต่างกันได้ ก่อนหน้านี้เราเคยใช้อุปกรณ์ต่อพ่วง PWM ในไมโครคอนโทรลเลอร์อื่น ๆ เช่นกัน
- ARM7-LPC2148 PWM Tutorial: การควบคุมความสว่างของ LED
- การมอดูเลตความกว้างพัลส์ (PWM) โดยใช้ MSP430G2: การควบคุมความสว่างของ LED
- การสร้าง PWM โดยใช้ไมโครคอนโทรลเลอร์ PIC พร้อม MPLAB และ XC8
- การมอดูเลตความกว้างพัลส์ (PWM) ใน STM32F103C8: การควบคุมความเร็วของพัดลม DC
- การสร้างสัญญาณ PWM บนพิน GPIO ของไมโครคอนโทรลเลอร์ PIC
- การสอน Raspberry Pi PWM
- PWM สอนด้วย ESP32
ในบทช่วยสอนนี้เราจะเชื่อมต่อกับ LED ที่จะควบคุมโดยใช้สัญญาณ PWM นี้จากหน่วยไมโครคอนโทรลเลอร์ N76E003 เราจะประเมินว่าเราต้องการการตั้งค่าฮาร์ดแวร์ประเภทใดและเราควรตั้งโปรแกรมไมโครคอนโทรลเลอร์ของเราอย่างไร ก่อนหน้านั้นเรามาทำความเข้าใจพื้นฐานบางประการของสัญญาณ PWM
พื้นฐานของสัญญาณ PWM
ในภาพด้านล่างสัญญาณ PWM คงที่จะปรากฏขึ้น
ภาพด้านบนคืออะไร แต่คลื่นสี่เหลี่ยมคงแบบเดียวกับที่เวลาบนและเดียวกันเวลาปิดสมมติว่าระยะเวลาทั้งหมดของสัญญาณคือ 1 วินาที ดังนั้นเวลาตรงและเวลาปิดคือ 500ms หากมีการเชื่อมต่อ LED ผ่านสัญญาณนี้ไฟ LED จะเปิดเป็นเวลา 500ms และดับลงเป็นเวลา 500ms ดังนั้นในมุมมองแบบเปอร์สเปคทีฟไฟ LED จะสว่างขึ้นครึ่งหนึ่งของความสว่างจริงหากเปิดเป็นสัญญาณ 5V โดยตรงโดยไม่มีเวลาปิด
ดังที่แสดงในภาพด้านบนหากมีการเปลี่ยนแปลงรอบการทำงานไฟ LED จะสว่างขึ้น 25% ของความสว่างจริงโดยใช้หลักการเดียวกับที่กล่าวไว้ก่อนหน้านี้ หากคุณต้องการทราบข้อมูลเพิ่มเติมและเรียนรู้เกี่ยวกับ Pulse Width Modulation (PWM) คุณสามารถอ่านบทความที่เชื่อมโยงได้
การตั้งค่าฮาร์ดแวร์และข้อกำหนด
ตามข้อกำหนดของโครงการนี้คือการควบคุม LED โดยใช้ PWM จำเป็นต้องเชื่อมต่อ LED กับ N76E003 เนื่องจาก LED มีอยู่ในบอร์ดพัฒนา N76E003 จึงใช้ในโครงการนี้ ไม่จำเป็นต้องมีส่วนประกอบอื่น ๆ
ไม่พูดถึงเราต้องN76E003 ไมโครคอนโทรลเลอร์คณะกรรมการพัฒนาการตามเช่นเดียวกับNu-Link โปรแกรมเมอร์ อาจต้องใช้ชุดจ่ายไฟ 5V เพิ่มเติมหากไม่ได้ใช้โปรแกรมเมอร์เป็นแหล่งจ่ายไฟ
แผนภาพวงจรสำหรับ Nuvoton N76E003 ไมโครคอนโทรลเลอร์ LED Dimming
ดังที่เราเห็นในแผนผังด้านล่าง LED ทดสอบมีอยู่ในบอร์ดพัฒนาและเชื่อมต่อกับพอร์ต 1.4 ทางด้านซ้ายสุดจะแสดงการเชื่อมต่ออินเทอร์เฟซการเขียนโปรแกรม
PWM Pins บนไมโครคอนโทรลเลอร์ N76E003 Nuvoton
N76E003 มี 20 พินซึ่ง 10 พินสามารถใช้เป็น PWM ได้ ภาพด้านล่างแสดงหมุด PWM ที่ไฮไลต์ในกล่องสี่เหลี่ยมสีแดง
ดังที่เราเห็นหมุด PWM ที่ไฮไลต์สามารถใช้เพื่อวัตถุประสงค์อื่นได้เช่นกัน อย่างไรก็ตามจุดประสงค์อื่นของพินนี้จะไม่สามารถใช้ได้เมื่อกำหนดค่าพินสำหรับเอาต์พุต PWM Pin 1.4 ซึ่งใช้เป็นพินเอาต์พุต PWM จะสูญเสียฟังก์ชันการทำงานอื่น ๆ แต่นั่นไม่ใช่ปัญหาเนื่องจากไม่จำเป็นต้องใช้ฟังก์ชันอื่นสำหรับโครงการนี้
เหตุผลเบื้องหลังการเลือกพิน 1.4 เป็นพินเอาท์พุตเนื่องจากไฟ LED ทดสอบในตัวเชื่อมต่อกับพินนั้นในบอร์ดพัฒนาดังนั้นเราจึงไม่ต้องใช้ LED ภายนอก อย่างไรก็ตามในไมโครคอนโทรลเลอร์จาก 20 พินสามารถใช้ 10 พินเป็นพินเอาต์พุต PWM และพิน PWM อื่น ๆ สามารถใช้เพื่อวัตถุประสงค์ที่เกี่ยวข้องกับเอาต์พุตได้
PWM รีจิสเตอร์และฟังก์ชั่นในไมโครคอนโทรลเลอร์ N76E003 Nuvoton
N76E003 ใช้นาฬิการะบบหรือ Timer 1 overflow หารด้วยนาฬิกา PWM พร้อม Prescaler เลือกได้ตั้งแต่ 1/1 ~ 1/128 ระยะเวลา PWM สามารถตั้งค่าการใช้ 16 บิตระยะเวลาการลงทะเบียนPWMPH และ PWMPL ลงทะเบียน
ไมโครคอนโทรลเลอร์มีการลงทะเบียน PWM หกตัวที่สร้างสัญญาณ PWM หกรายการที่เรียกว่า PG0, PG1, PG2, PG3, PG4 และ PG5 อย่างไรก็ตามช่วงเวลาจะเหมือนกันสำหรับแต่ละช่องสัญญาณ PWM เนื่องจากใช้ตัวนับระยะเวลา 16 บิตเหมือนกันแต่รอบการทำงานของแต่ละ PWM อาจแตกต่างจากที่อื่นเนื่องจาก PWM แต่ละตัวใช้การลงทะเบียนรอบการทำงาน 16 บิตที่แตกต่างกันซึ่งมีชื่อว่า {PWM0H, PWM0L}, {PWM1H, PWM1L}, {PWM2H, PWM2L}, {PWM3H, PWM3L}, {PWM4H, PWM4L} และ {PWM5H, PWM5L} ดังนั้นใน N76E003 สามารถสร้างเอาต์พุต PWM หกตัวได้อย่างอิสระโดยมีรอบการทำงานที่แตกต่างกัน
ไม่เหมือนกับไมโครคอนโทรลเลอร์อื่น ๆ การเปิดใช้งาน PWM ไม่ได้ตั้งค่าพิน I / O ลงในเอาต์พุต PWM โดยอัตโนมัติ ดังนั้นผู้ใช้ต้องกำหนดค่าโหมดเอาต์พุต I / O
ดังนั้นสิ่งที่จำเป็นสำหรับแอปพลิเคชันขั้นตอนแรกคือการกำหนดหรือเลือกพิน I / O หนึ่งหรือสองตัวหรือมากกว่าสองพินเป็นเอาต์พุต PWM หลังจากเลือกหนึ่งพิน I / O จะต้องตั้งค่าเป็นโหมด Push-Pull หรือ Quasi-Bidirectional เพื่อสร้างสัญญาณ PWM นี้สามารถเลือกใช้PxM1 และ PxM2 ลงทะเบียน รีจิสเตอร์ทั้งสองนี้ตั้งค่าโหมด I / O โดยที่ x ย่อมาจากหมายเลขพอร์ต (ตัวอย่างเช่นพอร์ต P1.0 รีจิสเตอร์จะเป็น P1M1 และ P1M2 สำหรับ P3.0 จะเป็น P3M1 และ P3M2 เป็นต้น)
การกำหนดค่าสามารถดูได้จากภาพด้านล่าง -
จากนั้นขั้นตอนต่อไปคือการเปิดใช้งาน PWM ในพิน I / O เฉพาะนั้น การทำเช่นนี้ผู้ใช้ต้องตั้งค่าPIOCON0 หรือ PIOCON1 ลงทะเบียน การลงทะเบียนขึ้นอยู่กับการแมปพินเนื่องจาก PIOCON0 และ PIOCON1 ควบคุมพินที่แตกต่างกันโดยขึ้นอยู่กับสัญญาณ PWM การกำหนดค่าของการลงทะเบียนทั้งสองนี้สามารถดูได้จากภาพด้านล่าง -
ดังที่เราเห็นการลงทะเบียนด้านบนควบคุมการกำหนดค่า 6 รายการ สำหรับส่วนที่เหลือให้ใช้การลงทะเบียน PIOCON1
ดังนั้นการลงทะเบียนด้านบนจะควบคุมการกำหนดค่า 4 ส่วนที่เหลือ
โหมดการทำงาน PWM ในไมโครคอนโทรลเลอร์ Nuvoton N6E003
ขั้นตอนต่อไปคือการเลือกโหมดการทำงาน PWM PWM แต่ละโหมดรองรับโหมดการทำงานสามโหมด - โหมดเปิดใช้งานอิสระซิงโครนัสและเวลาตาย
โหมดอิสระเป็นโซลูชันที่สามารถสร้างสัญญาณ PWM ทั้งหกได้อย่างอิสระ จำเป็นต้องมีจำนวนครั้งสูงสุดเมื่อต้องเปิดและควบคุมการทำงานที่เกี่ยวข้องกับ LED หรือเสียงกริ่ง
โหมด Synchronousชุด Pg1 / 3/5 เหมือนกันในเฟส PWM ในการส่งออกเช่นเดียวกับ PG0 / 2/4 ที่ PG0 / 04/02 ให้สัญญาณ PWM อิสระ สิ่งนี้จำเป็นสำหรับการควบคุมมอเตอร์สามเฟสเป็นหลัก
โหมดแทรกตายเวลาเป็นนิด ๆ หน่อย ๆ ที่ซับซ้อนและนำไปใช้ในการใช้งานเครื่องจริงโดยเฉพาะอย่างยิ่งในงานอุตสาหกรรม ในแอปพลิเคชันดังกล่าวเอาต์พุต PWM เสริมจำเป็นต้องมีการแทรก“ เวลาตาย” เพื่อป้องกันความเสียหายของอุปกรณ์เปลี่ยนกำลังเช่น GPIB การกำหนดค่าถูกตั้งค่าในโหมดนี้ในลักษณะที่ PG0 / 2/4 ให้สัญญาณเอาต์พุต PWM ในลักษณะเดียวกับโหมดอิสระ แต่ PG1 / 3/5 ให้เอาต์พุต "สัญญาณ PWM นอกเฟส" ของ PG0 / 2/4 และละเว้น PG1 / 3/5 Duty register
ด้านบนสามโหมดสามารถเลือกได้โดยใช้การกำหนดค่าการลงทะเบียนด้านล่าง -
การกำหนดค่าถัดไปคือการเลือกประเภท PWM โดยใช้การลงทะเบียน PWMCON1
ดังที่เราเห็นมี PWM สองประเภทที่สามารถเลือกได้โดยใช้การลงทะเบียนด้านบน ในการจัดแนวขอบตัวนับ 16 บิตจะใช้การดำเนินการแบบลาดเดียวโดยนับตั้งแต่ 0000H ถึงค่าที่ตั้งไว้ของ {PWMPH, PWMPL} จากนั้นเริ่มจาก 0000H รูปคลื่นเอาต์พุตอยู่ชิดขอบซ้าย
แต่ในโหมดจัดแนวกึ่งกลางตัวนับ 16 บิตจะใช้การดำเนินการแบบสองทางลาดโดยนับตั้งแต่ 0000H ถึง {PWMPH, PWMPL} จากนั้นเปลี่ยนจาก {PWMPH, PWMPL} เป็น 0000H อีกครั้งโดยการนับถอยหลัง เอาต์พุตอยู่ในแนวกึ่งกลางและมีประโยชน์สำหรับการสร้างรูปคลื่นที่ไม่ทับซ้อนกัน ในที่สุดการดำเนินการควบคุม PWM ที่สามารถตรวจสอบได้ในการลงทะเบียนด้านล่าง -
ในการตั้งค่าแหล่งสัญญาณนาฬิกาให้ใช้ทะเบียนควบคุมนาฬิกาCKCON
นอกจากนี้ยังสามารถมาสก์สัญญาณเอาต์พุต PWM โดยใช้ทะเบียน PMEN การใช้รีจิสเตอร์นี้ผู้ใช้สามารถปิดบังสัญญาณเอาท์พุตด้วย 0 หรือ 1
ถัดไปคือ PWM Control Register-
การลงทะเบียนข้างต้นมีประโยชน์ในการรัน PWM โหลดช่วงเวลาใหม่และภาระหน้าที่ควบคุมค่าสถานะ PWM และล้างตัวนับ PWM
การกำหนดค่าบิตที่เกี่ยวข้องแสดงไว้ด้านล่าง -
ในการตั้งค่าตัวแบ่งนาฬิกาให้ใช้การลงทะเบียน PWMCON1สำหรับตัวแบ่งสัญญาณนาฬิกา PWM บิตที่ 5 ใช้สำหรับโหมดกลุ่มที่เปิดใช้งาน PWM แบบจัดกลุ่มและมีรอบการทำงานเดียวกันสำหรับคู่ PWM สามคู่แรก
การเขียนโปรแกรม Nuvoton N76E003 สำหรับ PWM
การเข้ารหัสเป็นเรื่องง่ายและรหัสทั้งหมดที่ใช้สำหรับบทช่วยสอนนี้สามารถพบได้ที่ด้านล่างของหน้านี้ LED เชื่อมต่อกับพิน P1.4 ดังนั้นจึงจำเป็นต้องใช้พิน P1.4 สำหรับเอาต์พุต PWM
ในโปรแกรมหลักการตั้งค่าจะทำตามลำดับ ด้านล่างบรรทัดของรหัสตั้งค่า PWM และกำหนดค่าพิน P1.4 เป็นเอาต์พุต PWM
P14_PushPull_Mode;
ใช้เพื่อตั้งค่าพิน P1.4 ในโหมดดัน - ดึง สิ่งนี้ถูกกำหนดไว้ในไลบรารี Function_define.h as-
# กำหนด P14_PushPull_Mode P1M1 & = ~ SET_BIT4; P1M2- = SET_BIT4 PWM1_P14_OUTPUT_ENABLE;
บรรทัดถัดไปที่ใช้เพื่อเปิดใช้งาน PWM ในพิน P1.4 นอกจากนี้ยังกำหนดไว้ในไลบรารี Function_define.h as-
# กำหนด PWM1_P14_OUTPUT_ENABLE BIT_TMP = EA; EA = 0; TA = 0xAA; TA = 0x55; SFRS- = 0x01; PIOCON1- = 0x02; TA = 0xAA; TA = 0x55; SFRS & = 0xFE; EA = BIT_TMP //P1.4 เป็น เอาต์พุต PWM1 เปิดใช้งาน PWM_IMDEPENDENT_MODE;
รหัสด้านล่างนี้ใช้เพื่อตั้งค่า PWM ในโหมดอิสระ ในไลบรารี Function_define.h ถูกกำหนดเป็น -
# กำหนด PWM_IMDEPENDENT_MODE PWMCON1 & = 0x3F PWM_EDGE_TYPE;
จากนั้นเราต้องตั้งค่าเอาต์พุต PWM ประเภท EDGE ในไลบรารี Function_define.h ถูกกำหนดเป็น -
# กำหนด PWM_EDGE_TYPE PWMCON1 & = ~ SET_BIT4 set_CLRPWM;
ต่อไปเราต้องล้างค่าตัวนับ PWM ที่มีให้บริการใน SFR_Macro.h ไลบรารี
#define set_CLRPWM CLRPWM = 1
หลังจากนั้นนาฬิกา PWM จะถูกเลือกเป็นนาฬิกา Fsys และปัจจัยการแบ่งที่ใช้คือการหาร 64
PWM_CLOCK_FSYS; PWM_CLOCK_DIV_64;
ทั้งสองถูกกำหนดให้เป็น -
# กำหนด PWM_CLOCK_FSYS CKCON & = 0xBF # กำหนด PWM_CLOCK_DIV_64 PWMCON1- = 0x06; PWMCON1 & = 0xFE PWM_OUTPUT_ALL_NORMAL;
บรรทัดด้านล่างของรหัสใช้เพื่อปิดบังสัญญาณ PWM เอาต์พุตโดย 0 กำหนดเป็น -
# กำหนด PWM_OUTPUT_ALL_NORMAL PNP = 0x00 set_PWM_period (1023);
จากนั้นเราต้องกำหนดช่วงเวลาของสัญญาณ PWM ฟังก์ชันนี้กำหนดช่วงเวลาในการลงทะเบียน PWMPL และ PWMPH เนื่องจากนี่คือการลงทะเบียน 16 บิตฟังก์ชันจึงใช้วิธีการขยับเล็กน้อยเพื่อตั้งค่าช่วงเวลา PWM
เป็นโมฆะ set_PWM_period (ค่า int ที่ไม่ได้ลงชื่อ) { PWMPL = (ค่า & 0x00FF); PWMPH = ((ค่า & 0xFF00) >> 8); }
อย่างไรก็ตามนอกเหนือจากช่วงเวลา 1023 และ 8 บิตผู้ใช้ยังสามารถใช้ค่าอื่น ๆ ได้เช่นกัน การเพิ่มระยะเวลาส่งผลให้การลดแสงหรือการซีดจางลงอย่างราบรื่น
set_PWMRUN;
สิ่งนี้จะเริ่ม PWM ที่กำหนดไว้ในไลบรารี SFR_Macro.h เป็น -
#define set_PWMRUN PWMRUN = 1
ถัดไปใน ลูป while ไฟ LED จะเปิดและจางลงอย่างต่อเนื่อง
ในขณะที่ (1) { สำหรับ (value = 0; value <1024; value + = 10) { set_PWM1 (value); ตัวจับเวลา 1_Delay10ms (3); } สำหรับ (value = 1023; value> 0; value - = 10) { set_PWM1 (value); ตัวจับเวลา 1_Delay10ms (2); } } }
รอบการทำงานถูกกำหนดโดย set_PWM1 (); ฟังก์ชันที่กำหนดรอบการทำงานในการลงทะเบียน PWM1L และ PWM1H
เป็นโมฆะ set_PWM1 (ค่า int ที่ไม่ได้ลงชื่อ) { PWM1L = (ค่า & 0x00FF); PWM1H = ((ค่า & 0xFF00) >> 8); set_LOAD; }
กระพริบรหัสและทดสอบเอาต์พุต
เมื่อโค้ดพร้อมแล้วให้รวบรวมและอัปโหลดไปยังคอนโทรลเลอร์ หากคุณยังใหม่กับสภาพแวดล้อมโปรดดูการเริ่มต้นใช้งานบทช่วยสอน Nuvoton N76E003 เพื่อเรียนรู้พื้นฐาน ดังที่คุณเห็นจากผลลัพธ์ด้านล่างรหัสส่งคืนคำเตือน 0 และ 0 ข้อผิดพลาดและกระพริบโดยใช้วิธีการกะพริบเริ่มต้นโดย Keil แอปพลิเคชันเริ่มทำงาน
เริ่มสร้างใหม่: โครงการ: PWM สร้างเป้าหมาย 'เป้าหมาย 1' ขึ้นใหม่ ประกอบ STARTUP.A51… รวบรวม main.c… รวบรวม Delay.c… การ เชื่อมโยง… ขนาดโปรแกรม: data = 35.1 xdata = 0 code = 709 กำลัง สร้าง ไฟล์ฐานสิบหกจาก ". \ Objects \ pwm"… ". \ Objects \ pwm" - 0 Error (s), 0 Warning (s) เวลาสร้างที่ผ่านไป: 00:00:05 น
ฮาร์ดแวร์เชื่อมต่อกับแหล่งจ่ายไฟและทำงานได้ตามที่คาดไว้ นั่นคือความสว่างของ LED ออนบอร์ดที่ลดลงแล้วเพิ่มขึ้นเพื่อระบุการเปลี่ยนแปลงรอบการทำงานของ PWM
คุณสามารถดูการทำงานทั้งหมดของบทช่วยสอนนี้ได้ในวิดีโอที่ลิงก์ด้านล่าง หวังว่าคุณจะสนุกกับบทช่วยสอนและเรียนรู้สิ่งที่เป็นประโยชน์หากคุณมีคำถามฝากไว้ในส่วนความคิดเห็นหรือคุณสามารถใช้ฟอรัมของเราสำหรับคำถามทางเทคนิคอื่น ๆ