ผู้เขียน หัวข้อ: การเรียนรู้ครั้งที่ 7 [Basic ESP32] การใช้งาน DAC  (อ่าน 3410 ครั้ง)

admin

  • Administrator
  • Hero Member
  • *****
  • กระทู้: 688
    • ดูรายละเอียด
    • อีเมล์
การเรียนรู้ครั้งที่ 7 [Basic ESP32] การใช้งาน DAC
« เมื่อ: กุมภาพันธ์ 06, 2019, 09:23:43 AM »
การเรียนรู้ครั้งที่ 7 [Basic ESP32] การใช้งาน DAC
    DAC (Digital to Analog Converter) เป็นวงจรที่มีหน้าที่แปลงสัญญาณดิจิทัลให้เป็นสัญญาณแอนะล็อก สัญญาณดิจิทัลจะมีเพียงแค่ 2 ระดับคือ 1 กับ 0 โดยที่ 1 ใช้แทนระดับของการมีแรงดัน(ใกล้เคียงแหล่งจ่าย) และ 0 ใช้แทนระดับแรงดัน 0 โวลต์(หรือใกล้เคียงกราวด์) ส่วนสัญญาณแอนะล็อกเป็นสัญญาณที่มีแรงดันที่มีค่าการเปลี่ยนแปลงแบบต่อเนื่องได้
    ESP32 มีวงจรแปลงสัญญาณอยู่ภายใน 2 วงจรโดยส่งออกภายนอกทางขา 25 และ 26 วงจร DAC ของ ESP32 เป็นขนาด 8 บิตทำให้การแปลงให้เป็นสัญญาณแอนะล็อกได้ทั้งหมด 256 ระดับตั้งแต่แรงดัน 0V จนถึงแรงดัน 3.3V (หรือใกล้เคียง)
หมายเหตุ
   ESP32 เป็นไมโครคอนโทรลเลอร์การแปลงค่าและส่งของขาพอร์ตแต่ละครั้งต้องใช้เวลาดำเนินการดังนั้นจึงต้องแลกมาระหว่างรูปคลื่นที่ต่อเนื่องหรือรูปคลื่นที่เป็นขั้นบันได ดังนี้
   -ถ้าต้องการรูปคลื่นต่อเนื่องต้องส่งค่าในทุก ๆ มุมที่ทำได้ส่งผลให้ได้ความถี่ต่ำ
   -ถ้าต้องการความถี่สูงต้องส่งค่าของรูปคลื่นในมุมที่ห่าง ๆ กันเพื่อให้ได้ครบ 1 ลูกคลื่นในเวลาอันสั้น


ตัวอย่างผลที่ได้จากการแปลงสัญญาณให้ได้รูปคลื่นซายน์โดยเปลี่ยนแปลงค่าทุก ๆ 5 องศา


ตัวอย่างผลที่ได้จากการแปลงสัญญาณให้ได้รูปคลื่นซายน์โดยเปลี่ยนแปลงค่าทุก ๆ 10 องศา


ตัวอย่างผลที่ได้จากการแปลงสัญญาณให้ได้รูปคลื่นซายน์โดยเปลี่ยนแปลงค่าทุก ๆ 15 องศา


ตัวอย่างผลที่ได้จากการแปลงสัญญาณให้ได้รูปคลื่นซายน์โดยเปลี่ยนแปลงค่าทุก ๆ 20 องศา


ตัวอย่างผลที่ได้จากการแปลงสัญญาณให้ได้รูปคลื่นซายน์โดยเปลี่ยนแปลงค่าทุก ๆ 30 องศา


ตำแหน่งขาของ ESP32 ที่ใช้งาน


วงจรที่ใช้ทดลอง
« แก้ไขครั้งสุดท้าย: กุมภาพันธ์ 08, 2019, 08:42:16 PM โดย admin »

admin

  • Administrator
  • Hero Member
  • *****
  • กระทู้: 688
    • ดูรายละเอียด
    • อีเมล์
Re: การเรียนรู้ครั้งที่ 7 [Basic ESP32] การใช้งาน DAC
« ตอบกลับ #1 เมื่อ: กุมภาพันธ์ 06, 2019, 09:28:33 AM »

ฟังก์ชั่นที่ใช้งานในการทดลองนี้

รูปแบบ คำอธิบาย
dacWrite(pin, value); ฟังก์ชั่นส่งค่าแอนะล็อกที่เป็นแรงดันระหว่าง 0-3.3V
pin: หมายเลขขาที่ต้องการส่งค่าแอนะล็อกออก(25,26)
value: ค่าที่ต้องการส่งออก (0-255)
sin(value); ฟังก์ชั่นตรีโกณมิติที่คืนค่า sine จากมุมที่กำหนด
value:ค่ามุมเป็นเรเดียน
« แก้ไขครั้งสุดท้าย: กุมภาพันธ์ 07, 2019, 07:43:37 AM โดย admin »

admin

  • Administrator
  • Hero Member
  • *****
  • กระทู้: 688
    • ดูรายละเอียด
    • อีเมล์
Re: การเรียนรู้ครั้งที่ 7 [Basic ESP32] การใช้งาน DAC
« ตอบกลับ #2 เมื่อ: กุมภาพันธ์ 06, 2019, 09:34:35 AM »
ตัวอย่างโปรแกรมสร้างสัญญาณ
1. โปรแกรมสร้างสัญญาณรูปคลื่นซายน์ โดยสร้างรูปคลื่นจากการเปลี่ยนแปลงค่าทุก ๆ 1 องศา ส่งสัญญาณออกทางขา 25 (DAC1)

โค้ด
โค๊ด: [Select]
#define DAC1 25
int sine[360];
void setup() {
  for (int deg = 0 ; deg < 360 ; deg++ ) {
    sine[deg] = int(128 + 127  * sin(deg * PI / 180));
  }
}
void loop() {
  for (int deg = 0 ; deg < 360 ; deg ++ ) {
    dacWrite(DAC1, sine[deg]);
  }
}

ผลการรันที่ได้


2. โปรแกรมสร้างสัญญาณรูปคลื่นซายน์ โดยสร้างรูปคลื่นจากการเปลี่ยนแปลงค่าทุก ๆ 5 องศา ส่งสัญญาณออกทางขา 25 (DAC1)

โค้ด
โค๊ด: [Select]
#define DAC1 25
int sine[360];
void setup() {
  for (int deg = 0 ; deg < 360 ; deg++ ) {
    sine[deg] = int(128 + 127  * sin(deg * PI / 180));
  }
}
void loop() {
  for (int deg = 0 ; deg < 360 ; deg +=5 ) {
    dacWrite(DAC1, sine[deg]);
  }
}

ผลการรันที่ได้


3. โปรแกรมสร้างสัญญาณรูปคลื่นซายน์ โดยสร้างรูปคลื่นจากการเปลี่ยนแปลงค่าทุก ๆ 10 องศา ส่งสัญญาณออกทางขา 25 (DAC1)

โค้ด
โค๊ด: [Select]
#define DAC1 25
int sine[360];
void setup() {
  for (int deg = 0 ; deg < 360 ; deg++ ) {
    sine[deg] = int(128 + 127  * sin(deg * PI / 180));
  }
}
void loop() {
  for (int deg = 0 ; deg < 360 ; deg +=10 ) {
    dacWrite(DAC1, sine[deg]);
  }
}

ผลการรันที่ได้


3. โปรแกรมสร้างสัญญาณรูปคลื่นซายน์และรูปคลื่นฟันเลื่อยโดยสร้างรูปคลื่นจากการเปลี่ยนแปลงค่าทุก ๆ 1 องศา ส่งสัญญาณออกทางขา 25 (DAC1) และขา 26 (DAC2)

โค้ด
โค๊ด: [Select]
#define DAC1 25
#define DAC2 26
int sine[360];
int sawtooth[360];
void setup() {
  for (int deg = 0 ; deg < 360 ; deg++ ) {
    //----------------------------Sine wave----------------
    sine[deg] = int(128 + 127  * sin(deg * PI / 180));
    //------------------Sawtooth---------------------------
    sawtooth[deg] = map(deg, 0, 360, 0, 255);
  }
}
void loop() {
  for (int deg = 0 ; deg < 360 ; deg ++ ) {
    dacWrite(DAC1, sine[deg]);
    dacWrite(DAC2, sawtooth[deg]);   
  }
}

ผลการรันที่ได้


« แก้ไขครั้งสุดท้าย: กุมภาพันธ์ 06, 2019, 09:46:01 AM โดย admin »

admin

  • Administrator
  • Hero Member
  • *****
  • กระทู้: 688
    • ดูรายละเอียด
    • อีเมล์
Re: การเรียนรู้ครั้งที่ 7 [Basic ESP32] การใช้งาน DAC
« ตอบกลับ #3 เมื่อ: กุมภาพันธ์ 06, 2019, 10:01:51 AM »
...

admin

  • Administrator
  • Hero Member
  • *****
  • กระทู้: 688
    • ดูรายละเอียด
    • อีเมล์
Re: การเรียนรู้ครั้งที่ 7 [Basic ESP32] การใช้งาน DAC
« ตอบกลับ #4 เมื่อ: กุมภาพันธ์ 06, 2019, 10:02:03 AM »
...