Voltage-to-Frequency Converter based on Arduino UNO
โครงงานนี้เป็นการทดลองใช้บอร์ดควบคุม Arduino UNO ทำหน้าที่เป็นตัวแปลงสัญญาณอินพุตแรงดันกระแสตรงให้เป็นความถี่ทางด้านเอาต์พุต (Voltage-to-Frequency Converter) ด้วยการเขียนโปรแกรมควบคุมการทำงานให้กับบอร์ด Arduino UNO สำหรับเป็นแนวทางการทดลองเพื่อนำไปประยุกต์ใช้งานต่างๆ อีกแบบหนึ่ง
รูปที่ 1 แสดงลักษณะการทดลองวงจรแปลงแรงดันอินพุตกระแสตรงให้เป็นความถี่ โดยใช้บอร์ดควบคุม Arduino UNO เป็นตัวประมวลผล ซึ่งจะใช้ตัวต้านทานปรับค่า (VR) สำหรับทดลองปรับค่าแรงดันอินพุตส่งไปยังขา A0 และสัญญาณเอาต์พุตจะจ่ายออกมาจากบอร์ด Arduino UNO ที่ขา D9
/* Voltage to Frequency Converter Based on Arduino UNO Vi = 0-5V @A0 Adj Frequency PWMout = D9 [PWM Signal Duty cycle 50%] Fout = 10Hz-10kHz R&D By : www.electronicsDNA.com Date : 8-11-2023 (V.0) */ #include <PWM.h> int PWMpin = 9; // PWM Driver Signal int Voltage_IN = 0; long frequency = 0; // Set frequency (in Hz) long Output_Fs = 0; void setup() { //initialize all timers except for 0, to save time keeping functions InitTimersSafe(); Serial.begin(9600); //sets the frequency for the specified pin bool success = SetPinFrequencySafe(PWMpin,frequency); if(success) { pinMode(13, OUTPUT); digitalWrite(13, HIGH); delay(300); digitalWrite(13, LOW); delay(300); } } void loop() { Voltage_IN = analogRead(A0); Serial.print(" Vi = "); Serial.print(Voltage_IN); Output_Fs = Voltage_IN; if (Output_Fs>1000) {Output_Fs = 1000;} if (Output_Fs<10) {Output_Fs = 1;} frequency = Output_Fs*10; bool success = SetPinFrequencySafe(PWMpin,frequency); pwmWrite(PWMpin,128); Serial.print(", F output = "); Serial.print(frequency); Serial.println("Hz "); delay(300); }
อธิบายโปรแกรมการทำงานคือในส่วนแรกจะเป็นการประกาศค่าตัวแปรสำหรับการประมวลผลและเรียกใช้ไลบารี (#include <PWM.h>) สามารถดาวน์โหลดได้จากคำอธิบายข้างล่างนี้ ในส่วนที่สองจะเป็นการกำหนดขาใช้งานและฟังก์ชั่นการสร้างสัญญาณพัลซ์วิดมอดูเลตชั่น bool success = SetPinFrequencySafe(PWMpin,frequency); รวมถึงการสื่อสารผ่านพอร์ตอนุกรมด้วยคำสั่ง Serial.begin(9600);
ในส่วนที่สามจะเป็นการอ่านค่าแรงดันอินพุต Voltage_IN = analogRead(A0); จากนั้นจะทำการตรวจสอบค่าที่อ่านได้ให้อยู่ในช่วงที่กำหนด if (Output_Fs>1000) {Output_Fs = 1000;} และ if (Output_Fs<10) {Output_Fs = 1;} คือถ้าค่าที่อ่านได้มากกว่า 1000 จะกำหนดให้ค่าตัวแปร Output_Fs เท่ากับ 1000 และถ้าค่าที่อ่านได้น้อยกว่า 10 จะกำหนดให้ค่าตัวแปร Output_Fs เท่ากับ 10 เมื่อได้ค่าที่ต้องการก็จะนำมาคูณ 10 ด้วยคำสั่ง frequency = Output_Fs*10; แล้วนำผลที่ได้ไปใช้ในฟังก์ชั่น bool success = SetPinFrequencySafe(PWMpin,frequency); จากนั้นจะกำหนดค่าดิวตี้ไซเกิลให้มีค่าประมาณ 50% ด้วยคำสั่ง pwmWrite(PWMpin,128); แล้วแสดงผลผ่านพอร์ตอนุกรมด้วยคำสั่ง Serial.print(“, F output = “); นั้นเอง
Download Arduino Library —> PWM.h
ในรูป 2 ถึงรูปที่ 6 แสดงผลการทดลองเมื่อป้อนแรงดันอินพุตกระแสตรงค่าต่างๆ ที่ตำแหน่งช่องวัดสัญญาณที่ 2 (CH2) และสังเกตความถี่ทางด้านเอาต์พุตที่เกิดขึ้นตำแหน่งช่องวัดสัญญาณที่ 1 (CH1) โดยผลการทดลองที่ได้จะเป็นสัดส่วนเชิงเส้นระหว่างกันในช่วงที่กำหนดดังรูปที่ 7
สำหรับการทดลองนี้เป็นการนำบอร์ดควบคุม Arduino UNO มาทำหน้าที่แปลงจากสัญญาณอินพุตที่เป็นไฟฟ้ากระแสตรงให้เป็นความถี่เอาต์พุตในย่านที่เราต้องการ (Voltage-to-Frequency Converter) ซึ่งก่อนหน้านี้ได้นำเสนอเนื้อหาเกี่ยวกับการใช้ไอซีไว้บ้างแล้ว และเนื้อหาในตอนต่อไปจะเป็นการใช้บอร์ดควบคุม Arduino UNO มาแปลงจากสัญญาณความถี่ทางด้านอินพุตให้เป็นไฟฟ้ากระแสตรงที่เอาต์พุต (Frequency-to-Voltage Converter) กันอีกแบบหนึ่งครับ.
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