Voltage-to-Frequency Converter based on Arduino UNO

โครงงานนี้เป็นการทดลองใช้บอร์ดควบคุม Arduino UNO ทำหน้าที่เป็นตัวแปลงสัญญาณอินพุตแรงดันกระแสตรงให้เป็นความถี่ทางด้านเอาต์พุต (Voltage-to-Frequency Converter) ด้วยการเขียนโปรแกรมควบคุมการทำงานให้กับบอร์ด Arduino UNO สำหรับเป็นแนวทางการทดลองเพื่อนำไปประยุกต์ใช้งานต่างๆ อีกแบบหนึ่ง

Voltage-to-Frequency Converter based on Arduino UNO
รูปที่ 1 ลักษณะการทดลองวงจรแปลงแรงดันอินพุตกระแสตรงให้เป็นความถี่

รูปที่ 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

Voltage-to-Frequency Converter based on Arduino UNO
รูปที่ 2 การทดลองที่ 1 เมื่อป้อนแรงดันอินพุตประมาณ 0V ความถี่เอาต์พุตเท่ากับ 10Hz
Voltage-to-Frequency Converter based on Arduino UNO
รูปที่ 3 การทดลองที่ 2 เมื่อป้อนแรงดันอินพุตประมาณ 1V ความถี่เอาต์พุตเท่ากับ 2.024kHz
Voltage-to-Frequency Converter based on Arduino UNO
รูปที่ 4 การทดลองที่ 3 เมื่อป้อนแรงดันอินพุตประมาณ 2.5V ความถี่เอาต์พุตเท่ากับ 4.950kHz
Voltage-to-Frequency Converter based on Arduino UNO
รูปที่ 5 การทดลองที่ 4 เมื่อป้อนแรงดันอินพุตประมาณ 3V ความถี่เอาต์พุตเท่ากับ 6.025kHz
Voltage-to-Frequency Converter based on Arduino UNO
รูปที่ 6 การทดลองที่ 5 เมื่อป้อนแรงดันอินพุตประมาณ 5V ความถี่เอาต์พุตเท่ากับ 10.0kHz

ในรูป 2 ถึงรูปที่ 6 แสดงผลการทดลองเมื่อป้อนแรงดันอินพุตกระแสตรงค่าต่างๆ ที่ตำแหน่งช่องวัดสัญญาณที่ 2 (CH2) และสังเกตความถี่ทางด้านเอาต์พุตที่เกิดขึ้นตำแหน่งช่องวัดสัญญาณที่ 1 (CH1) โดยผลการทดลองที่ได้จะเป็นสัดส่วนเชิงเส้นระหว่างกันในช่วงที่กำหนดดังรูปที่ 7

Voltage-to-Frequency Converter based on Arduino UNO
รูปที่ 7 กราฟแสดงความสัมพันธ์ระหว่างแรงดันอินพุตและความถี่ทางด้านเอาต์พุต
Voltage-to-Frequency Converter based on Arduino UNO
รูปที่ 8 การต่อวงจรและวัดสัญญาณอินพุตและเอาต์พุต
Voltage-to-Frequency Converter based on Arduino UNO
รูปที่ 9 ลักษณะทั่วไปสำหรับการทดลอง (1)
Voltage-to-Frequency Converter based on Arduino UNO
รูปที่ 10 ลักษณะทั่วไปสำหรับการทดลอง (2)

สำหรับการทดลองนี้เป็นการนำบอร์ดควบคุม Arduino UNO มาทำหน้าที่แปลงจากสัญญาณอินพุตที่เป็นไฟฟ้ากระแสตรงให้เป็นความถี่เอาต์พุตในย่านที่เราต้องการ (Voltage-to-Frequency Converter) ซึ่งก่อนหน้านี้ได้นำเสนอเนื้อหาเกี่ยวกับการใช้ไอซีไว้บ้างแล้ว และเนื้อหาในตอนต่อไปจะเป็นการใช้บอร์ดควบคุม Arduino UNO มาแปลงจากสัญญาณความถี่ทางด้านอินพุตให้เป็นไฟฟ้ากระแสตรงที่เอาต์พุต (Frequency-to-Voltage Converter) กันอีกแบบหนึ่งครับ.

Reference

  1. https://www.ti.com/lit/ds/symlink/vfc32.pdf
  2. https://forum.arduino.cc/t/voltage-to-frequency/236192/2
  3. https://forum.arduino.cc/t/inverted-voltage-to-frequency-converter-with-display/531415
  4. https://www.ti.com/lit/ds/symlink/lm331.pdf
  5. https://www.tme.eu/Document/0456c3b564ec3d8fc0afe703e47bc6fe/ad650jnz.pdf
  6. https://www.ti.com/lit/an/snaa088/snaa088.pdf