Frequency to Voltage Converter with Arduino UNO

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

Frequency to Voltage Converter with Arduino UNO
รูปที่ 1 ลักษณะการทดลองวงจรต้นแบบ
Frequency to Voltage Converter with Arduino UNO
รูปที่ 2 วงจรฟิลเตอร์ที่เอาต์พุตด้วย RC Filter
Frequency to Voltage Converter with Arduino UNO
รูปที่ 3 ฟังก์ชั่นเจนเนอร์เรเตอร์กำเนิดสัญญาณสำหรับทดสอบ

ในรูปที่ 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); นั้นเอง

Frequency to Voltage Converter with Arduino UNO
รูปที่ 4 การทดลองที่ 1 เมื่อป้อนสัญญาณอินพุตที่ความถี่ประมาณ 50Hz
Frequency to Voltage Converter with Arduino UNO
รูปที่ 5 การทดลองที่ 1 สัญญาณเอาต์พุต (CH1) และแรงดันเอาต์พุต (CH2) เมื่อป้อนสัญญาณอินพุตที่ความถี่ประมาณ 50Hz
Frequency to Voltage Converter with Arduino UNO
รูปที่ 6 การทดลองที่ 2 เมื่อป้อนสัญญาณอินพุตที่ความถี่ประมาณ 1000Hz
Frequency to Voltage Converter with Arduino UNO
รูปที่ 7 การทดลองที่ 2 สัญญาณเอาต์พุต (CH1) และแรงดันเอาต์พุต (CH2) เมื่อป้อนสัญญาณอินพุตที่ความถี่ประมาณ 1000Hz
Frequency to Voltage Converter with Arduino UNO
รูปที่ 8 การทดลองที่ 2 เมื่อป้อนสัญญาณอินพุตที่ความถี่ประมาณ 2500Hz
Frequency to Voltage Converter with Arduino UNO
รูปที่ 9 การทดลองที่ 3 สัญญาณเอาต์พุต (CH1) และแรงดันเอาต์พุต (CH2) เมื่อป้อนสัญญาณอินพุตที่ความถี่ประมาณ 2500Hz
Frequency to Voltage Converter with Arduino UNO
รูปที่ 10 การทดลองที่ 4 เมื่อป้อนสัญญาณอินพุตที่ความถี่ประมาณ 5000Hz
Frequency to Voltage Converter with Arduino UNO
รูปที่ 11 การทดลองที่ 4 สัญญาณเอาต์พุต (CH1) และแรงดันเอาต์พุต (CH2) เมื่อป้อนสัญญาณอินพุตที่ความถี่ประมาณ 5000Hz
Frequency to Voltage Converter with Arduino UNO
รูปที่ 12 การทดลองที่ 5 เมื่อป้อนสัญญาณอินพุตที่ความถี่ประมาณ 10000Hz
Frequency to Voltage Converter with Arduino UNO
รูปที่ 13 การทดลองที่ 5 สัญญาณเอาต์พุต (CH1) และแรงดันเอาต์พุต (CH2) เมื่อป้อนสัญญาณอินพุตที่ความถี่ประมาณ 10000Hz

สำหรับรูปที่ 4 ถึงรูปที่ 13 เป็นการทดลองการทำงานด้วนการป้อนสัญญาณพัลซ์วิดธ์มอดูเลตที่ความถี่ต่างๆ โดยในรูปที่ 4, 6, 8, 10 และ 12 เป็นค่าความถี่อินพุตซึ่งบอร์ดควบคุม Arduino UNO อ่านได้และแสดงผลให้ทราบ จากนั้นในรูปที่ 5, 7, 9, 11 และ 13 จะแสดงผลของสัญญาณพัลซ์วิดธ์มอดูเลตชั่นเอาต์พุต ที่ตำแหน่งช่องวัดสัญญาณที่ 1 (CH1) และตำแหน่งช่องวัดสัญญาณที่ 2 (CH2) จะแสดงค่าแรงดันเอาต์พุตกระแสตรงเมื่อผ่านวงจรฟิลเตอร์แล้ว

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

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

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