วันอาทิตย์ที่ 24 สิงหาคม พ.ศ. 2557

การทดลองที่ 1.3 การตรวจวัดสัญญาณดิจิทัล - เอาต์พุตจากบอร์ด Arduino


การทดลองที่ 1.3
การตรวจวัดสัญญาณดิจิทัล - เอาต์พุตจากบอร์ด Arduino

วัตถุประสงค์
  • ฝึกทักษะในการต่อบอร์ด Arduino
  • ฝึกการใช้ออสซิลโลสโคป เพื่อตรวจดูรูปคลื่นสัญญาณและวิเคราะห์การทำงานของบอร์ด Arduino โดยใช้โค้ดตัวอย่าง
  • เข้าใจการใช้คำสั่ง analogWrite ใน Arduino
อุปกรณ์การทดลอง
  • บอร์ด Arduino                                   1 อัน
  • สายไฟต่อวงจร                                   1 ชุด
  • ออสซิลโลสโคปแบบดิจิทัล                   1 เครื่อง
  • เครื่องกำเนิดสัญญาณ                           1 เครื่อง
ขั้นตอนการทดลอง
1. คอมไพล์โค้ดตัวอย่างที่ 1.2.1 แล้วอัพโหลดไปยังบอร์ด Arduino จากนั้นใช้ออสซิลโลสโคปวัดสัญญษณ output ที่ได้(รูปคลื่นแบบสี่เหลี่ยม) แล้วบันทึกภาพ (ให้ระบุ ความถี่ และค่า Duty Cycle ของสัญญาณตามที่วัดได้จริง)
         Duty Cycle(%) = 100%*(ความกว้างของคลื่นในช่วงที่เป็น High / คาบสัญญาณ)
2. ทำขั้นตอนที่ 1 ซ้ำ สำหรับโค้ดตัวอย่างที่ 1.3.2 - 1.3.4 ตามลำดับ
3. ใช้เครื่องกำเนิดสัญญาณ สร้างคลื่นแบบ PWM (รูปคลื่นแบบ Pulse) ความถี่ 50 Hz มีค่า Duty Cycle = 7.5% และมีระดับแรงดันต่ำและสูงในช่วง 0V และ 5V แล้วใช้ออสซิลโลสโคปตรวจดูรูปคลื่นสัญญาณที่ได้และบันทึกภาพที่ปรากฏ (เปรียบเทียบผลการสร้างสัญญาณเอาต์พุตด้วยบอร์ด Arduino)

ผลการทดลอง
โค้ดที่ 1.3.1: โค้ด Arduino เพื่อสร้างสัญญาณเอาต์พุตที่ขา D5 (แบบที่1)
const byte LED_PIN=5; //ใช้ขาหมายเลข D5 เพื่อสร้างสัญญาณดิจิทัล
void setup(){
   pinMode(LED_PIN,OUTPUT);    //ใช้ขา D5 เป็นเอาต์พุต
void loop(){
   digitalWrite(LED_PIN,HIGH);    //ให้เอาต์พุตที่ขา D5 เป็น High
   delay(10);     //รอเวลาประมาณ 10 มิลลิวินาที
   digitalWrite(LED_PIN,LOW);     //ให้เอาต์พุตที่ขา D5 เป็น Low
   delay(10);    //รอเวลาประมาณ 10 มิลลิวินาที
}







T = 4*5ms = 20ms
f = 1/T = 1/20ms = 50 Hz
Duty Cycle = 100%*(10ms/20ms) = 50%

------------------------------------------->O<-------------------------------------------

โค้ดที่ 1.3.2: โค้ด Arduino เพื่อสร้างสัญญาณเอาต์พุตที่ขา D5 (แบบที่2)
const byte LED_PIN=5;
void setup(){
   pinMode(LED_PIN,OUTPUT);
void loop(){
   digitalWrite(LED_PIN,HIGH);
   digitalWrite(LED_PIN,LOW);
}


   





T = 2*5us = 10us
f = 1/T = 1/10us = 100 kHz
Duty Cycle = 100%*(4.6us/10us) = 46%

-------------------------------------------@-@-------------------------------------------

โค้ดที่ 1.3.3: โค้ด Arduino
const byte LED_PIN=5; //ใช้ขาหมายเลข D5 เพื่อสร้างสัญญาณดิจิทัล
void setup(){
   pinMode(LED_PIN,OUTPUT);    //ใช้ขา D5 เป็นเอาต์พุต
   analogWrite(LED_PIN,191);
void loop(){
}



T = 2*500us = 1ms
f = 1/T = 1/1ms = 1 kHz
Duty Cycle = 100%*(725us/1ms) = 72.5%

------------------------------------------- =.= ---------------------------------------

โค้ดที่ 1.3.4: โค้ด Arduino
#include<Servo.h>
Servo servo;
int minPulse=600;
int maxPulse=2400;

void setup(){
  servo.attach(5,minPulse,maxPulse);
  servo.write(90);
} void loop(){
}




T = 4*5ms = 20ms
f = 1/T = 1/20ms = 50 Hz
Duty Cycle = 100%*(1.6/20) = 8%
-------------------------------------------*O*-------------------------------------------
คำถามท้ายการทดลอง
1. จงอธิบายความแตกต่างของสัญญาณเอาต์พุต (ขาD5) ของบอร์ด Arduino ที่ได้จากโค้ดตัวอย่างในแต่ละกรณี (ให้เปรียบเทียบค่า Duty Cycle และความถี่ของสัญญาณเอาต์พุตที่ได้ในแต่ละกรณี)
ตอบ  คำสั่ง delay ใน Arduino จะทำให้ความค่าความถี่เปลี่ยนไป คือเมื่อมีคำสั่ง delay (1.3.1)ค่าความถี่จะน้อยลงกว่าโค้ดที่ไม่มีคำสั่ง(1.3.2) เนื่องจากความเร็วในการส่งสัญญาณ ส่วนค่า Duty Cycle จะใกล้เคียงกัน
โค้ด 1.3.1 : f = 50 Hz         Duty Cycle = 50%
โค้ด 1.3.1 : f = 100 kHz     Duty Cycle = 46%
analogWrite() จะรับตัวแปลสองค่า คือ ตัวเอาต์พุต และ ค่า analog
ค่า analog เทียบได้กับค่า Duty Cycle คือ ใน Duty Cycle 100% เท่ากับ ค่าใน analogWrite 255
โค้ด 1.3.3 : f = 1 kHz         Duty Cycle = 72.5%

โค้ด 1.3.4 : f = 50 Hz         Duty Cycle = 8%

2. มีขาใดบ้างในบอร์ด Arduino ในการทดลอง นอกจากขา D5 ที่สามารถใช้สร้างสัญญาณ PWM ด้วยคำสั่ง analogWrite()
ตอบ บนบอร์ด Arduino (ATmega168 หรือ ATmega32) มีการทำงานฟังก์ชันบนขา 5,6,9,10 และ 11
แต่ว่าถ้าเป็นขา 5 กับ 6 มันจะมีhigher-than-expected duty cycles บน Arduino Mega จะมีการทำงานบนขา 2-13 และ 44-46 ส่วนในบอร์ที่เก่ากว่ามีแค่ ATmega8 เท่านั้นที่สนับสนุน analogWrite() บนขา 9,10,11

3. ถ้าต้องการสร้างสัญญาณ PWM ที่มีค่า Duty Cycle 20% และ 80% ที่ขา D5 และ D10 ตามลำดับ โดยใช้คำสั่ง analogWrite() จะต้องเขียนโค้ด Arduino อย่างไร (เขียนโค้ดสำหรับ Arduino Sketch ให้ครบถ้วน สาธิตและตรวจสอบความถูกต้องโดยใช้ออสซิลโลสโคปหรือเครื่องวิเคราะห์สัญญาณดิจิทัล)
ตอบ  ค่า Duty Cycle 100% = ค่าใน analogWrite() 255
         จะได้ว่า  ที่ D5    Duty Cycle 20% = analogwrite() 255*20/100 = 51
         จะได้ว่า  ที่ D10  Duty Cycle 80% = analogwrite() 255*80/100 = 204
โค้ด Arduino Sketch
const byte LED_PIN=5; //ใช้ขาหมายเลข D5 เพื่อสร้างสัญญาณดิจิทัล
const byte LED_PIN_2=10; //ใช้ขาหมายเลข D10 เพื่อสร้างสัญญาณดิจิทัล
void setup(){
   pinMode(LED_PIN,OUTPUT);    //ใช้ขา D5 เป็นเอาต์พุต
   analogWrite(LED_PIN,51);
   pinMode(LED_PIN,OUTPUT);    //ใช้ขา D10 เป็นเอาต์พุต
   analogWrite(LED_PIN_2,204);
void loop(){
}
สาธิตและตรวจสอบความถูกต้อง






4.สัญญาณเอาต์พุตที่ได้จากการใช้คำสั่งของ Servo Library มีความถี่เท่าใด
ตอบ 50 Hz

ไม่มีความคิดเห็น:

แสดงความคิดเห็น