25 พ.ค. 2022 เวลา 05:01 • วิทยาศาสตร์ & เทคโนโลยี
ประยุกต์ FIR Filter บน Microchip PIC16F1824
ภาคต่อการประยุกต์ใช้งาน FIR Filter
สำหรับบทความนี้จะเป็นการนำ FIR Filter ไปใช้กรองความถี่ที่ไม่ต้องการออกจาก ADC-Analog to Digital Converter บนไมโครคอนโทรลเลอร์ PIC16F1824 ใช้ Mplab X IDEและ XC8 Compiler
เครื่องมือ
1. MPLAB X IDE+MCC Code Configurator
2. XC8
ปรับแต่ง XC8 ให้ใช้ Memory น้อย
1. Program Memory — ROM และ Data Memory — RAM
เนื่องจาก PIC16F1824 มี Program Memory เพียง 4KWord (3.5KBytes) และ Data Memory เพียง 256 Bytes จึงต้องลดขนาด Code ให้ได้มากที่สุดอาจจะต้องเปลี่ยนสเปกฟิลเตอร์เพื่อลดขนาด Co-Eff ลง
แน่นอนว่าอาจจะไม่สามารถกรองความถี่ได้ตามที่ต้องการ แต่พยายามทำให้อยู่ในจุดที่ยอมรับได้มากที่สุด ขั้นตอนนี้อาจจะต้องทดลองทำซ้ำหลายๆ ครั้ง เนื่องจากเราไม่รู้ว่าจะต้องเขียนอะไรเพิ่มเติมบ้าง ดังนั้นเมื่อคอมไพล์แล้วอาจจะต้องปรับลดขนาด Co-Efficient ลงหรือถ้าพื้นที่ยังเหลือก็ปรับขึ้นได้ตามความเหมาะสม
2. Data Type
ข้อมูลประเภท Float มีความกว้าง 4 Bytes แต่ XC8 มีออปชั่น Float กว้าง 3 Bytes หรือ 24 Bits ปกติแล้วข้อมูลประเภท Float จะมีความยาว 4 Bytes เข้ารหัสตามมาตรฐาน IEEE754 (วิธีคำนวนมือ 1, วิธีคำนวนมือ 2, เอกสาร Microchip)
โดยเลือกปุ่มเครื่องมือดังรูปข้างล่าง
ที่ XC8 Global Options ให้เลือก C standard เป็น C90 ทั้งนี้ XC8 รองรับ float 24 bit ด้วย C90
Optimization โดยเลือก XC8 Compiler > Option Categories > Optimizations แล้วเลือก Optimization เป็น s ซึ่ง XC 8 Free อาจะไม่สามารถทำ Optimization ระดับ S ได้ (สามารถใช้ MPLAB Express คอมไพล์ ซึ่งโค้ดจะเล็กกว่าใช้ MPLAB X + XC8)
กด OK แล้วเขียนโปรแกรมส่วนอื่นต่อได้เลย
3. ตัวแปรสำหรับนับและนับไม่เกิน 255 ค่า ให้แก้ไขเป็น unsigned char จากรูปข้างล่างนี้เห็นว่าตัวแปร i ในฟังก์ชั่น init และ ตัวแปร index เป็นตัวแปรชนิด int ซึ่ง int มีความยาว 16 bit แต่เราใช้แค่ 8 bit เพราะค่า Co-Eff ไม่เกิน 255 ค่า ให้แก้ไขทั้ง Header File และ Source File ของ T-Filter ดังรูปข้างล่าง
4. Unroll Loop ในส่วนนี้อาจมีผลต่อ Program Memory ไม่มากเพราะใช้จำนวน Co-Eff น้อย ซึ่งสามารถเลือกว่าจะทำคอนโวลูชั่นโดยการใช้ลูป For หรือ จะทำคอนโวลูชั่นโดยการเขียนโค้ดไปตรงๆ ซึ่งการเขียนโค้ดตรงๆ จะทำงานเร็วกว่าใช้ลูปเล็กน้อยและประหยัดตัวแปรไป 1 Byte ซึ่งไม่มีผลอะไรมากนักเนื่องจากเป็นตัวแปรในฟังก์ชั่น
5. Optimized อะไรไม่ใช้ให้ลบทิ้ง เป็นวิธีง่ายๆ ส่วนไหนไม่จำเป็นลบทิ้งให้หมด
ผลลัพธ์
ใช้งานได้ คอมไพล์ผ่าน ยังเหลือ Program Memory อีกนิดหน่อย แล้วแต่ว่าจะเขียนอะไรลงไป
โฆษณา