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