Frequency to Voltage Converter with Arduino UNO
สำหรับโครงงานนี้เป็นการนำบอร์ดควบคุม Arduino UNO มาทำหน้าที่เป็นตัวแปลงสัญญาณอินพุตในลักษณะความถี่ให้เป็นแรงดันไฟฟ้ากระแสตรงทางด้านเอาต์พุต (Frequency-to-Voltage Converter) ต่อจากเนื้อหาตอนที่ผ่านมา (คลิกอ่าน Voltage-to-Frequency Converter based on Arduino UNO) โดยในการทดลองโครงงานนี้จะใช้อุปกรณ์ต่อร่วมต่างๆ น้อยมาก และสามารถปรับแต่งการทำงานด้วยการพัฒนาโปรแกรมใหม่ตามที่ต้องการ
ในรูปที่ 1 ถึงรูปที่ 3 แสดงการต่อวงจรต้นแบบสำหรับการทดลองทั้งหมด และในส่วนของการต่อวงจรฟิลเตอร์ (RC Filter) อย่างง่ายด้วยดัวต้านทาน (R) และตัวเก็บประจุ (C) เปลี่ยนสัญญาณพัลซ์วิดธ์มอดูเลตชั่นที่เอาต์พุตให้เป็นแรงดันไฟฟ้ากระแสตรงเอาต์พุต
/* Arduino Code for Frequency to Voltage Converter based on Arduino UNO MCU : Arduino UNO Signal input : D2 [Square wave] PWM output : D9 filter by R=3.3K,C=10uF/16V Dev by : www.electronicsdna.com Date : 12-11-2023 (V.0) */ int PWMinput = 2; int time_H; int time_L; float val; float t_period; float Frequency; void setup() { pinMode (PWMinput,INPUT_PULLUP); Serial.begin (9600); pinMode(9,OUTPUT); // PWM Output Signal } void loop() { time_H = pulseIn(PWMinput,HIGH); time_L = pulseIn(PWMinput,LOW); t_period = time_H+time_L; t_period = t_period/1000; Frequency = 1000/t_period; Serial.print(" F input = "); Serial.print(Frequency); Serial.println(" Hz "); if (Frequency>10000) {Frequency = 10000;} if (Frequency<100) {Frequency = 100;} val = map(Frequency, 100,10000, 0,255); analogWrite(9, val); delay(100); }
โปรแกรมการทำงานข้างบนอธิบายคร่าวๆ ดังนี้คือ ในส่วนแรกจะเป็นการกำหนดค่าตัวแปรต่างๆ สำหรับอ่านค่าสัญญาณสำหรับพัลซ์ด้านบวกและด้านลบ การอ่านค่าความถี่ที่ได้และกำหนดให้ขา D2 (PWMinput = 2; ) รับสัญญาณความถี่อินพุต ในส่วนที่สองเป็นการกำหนดโหมดให้กับขาอินพุต D2 แบบพูลอัพภายในชิฟและกำหนดขาเอาต์พุต D9 รวมทั้งกำหนดใช้พอร์ตสื่อสารอนุกรมที่ความเร็ว 9600 (Serial.begin (9600);) ในส่วนที่สามเป็นการอ่านค่าสัญญาณสำหรับพัลซ์ด้านบวก (time_H) และด้านลบ (time_L) ด้วยคำสั่ง time_H = pulseIn(PWMinput,HIGH); จากนั้นนำค่าที่อ่านได้มาคำนวณเป็นความถี่ด้วยคำสั่ง Frequency = 1000/t_period; เมื่อได้แล้วเราจะกำหนดช่วงความถี่ต่ำสุด (100Hz) และสูงสุด (10000Hz) จากนั้นจะใช้คำสั่ง val = map(Frequency, 100,10000, 0,255); เพื่อปรับสัดส่วนของค่าความถี่ที่ได้และข้อมูลสำหรับกำหนดความกว้างพัลซ์ในช่วง 0-255 สำหรับส่งต่อมายังคำสั่ง analogWrite(9, val); นั้นเอง
สำหรับรูปที่ 4 ถึงรูปที่ 13 เป็นการทดลองการทำงานด้วนการป้อนสัญญาณพัลซ์วิดธ์มอดูเลตที่ความถี่ต่างๆ โดยในรูปที่ 4, 6, 8, 10 และ 12 เป็นค่าความถี่อินพุตซึ่งบอร์ดควบคุม Arduino UNO อ่านได้และแสดงผลให้ทราบ จากนั้นในรูปที่ 5, 7, 9, 11 และ 13 จะแสดงผลของสัญญาณพัลซ์วิดธ์มอดูเลตชั่นเอาต์พุต ที่ตำแหน่งช่องวัดสัญญาณที่ 1 (CH1) และตำแหน่งช่องวัดสัญญาณที่ 2 (CH2) จะแสดงค่าแรงดันเอาต์พุตกระแสตรงเมื่อผ่านวงจรฟิลเตอร์แล้ว
การทดลองโครงงานนี้เป็นการนำบอร์ดควบคุม Arduino UNO มาเพื่อแปลงสัญญาณอินพุตในรูปของความถี่ให้เป็นแรงดันไฟฟ้ากระแสตรงทางด้านเอาต์พุต ซึ่งจะมีความยืดหยุ่นในการปรับค่าการทำงานต่างๆ ได้มากยิ่งขึ้นเมื่อเทียบกับการใช้ไอซีทั่วไปแบบสำเร็จ แต่จุดด้อยของการใช้บอร์ดควบคุม Arduino UNO คือราคาต้นทุนของวงจรการทำงานทั้งหมดโดยรวมจะสูงกว่าครับ.
Reference
- https://www.ti.com/lit/ds/symlink/vfc32.pdf
- https://forum.arduino.cc/t/voltage-to-frequency/236192/2
- https://forum.arduino.cc/t/inverted-voltage-to-frequency-converter-with-display/531415
- https://www.ti.com/lit/ds/symlink/lm331.pdf
- https://www.tme.eu/Document/0456c3b564ec3d8fc0afe703e47bc6fe/ad650jnz.pdf
- https://www.ti.com/lit/an/snaa088/snaa088.pdf