สร้างสัญญาณ PWM ด้วย Arduino โดยรับสัญญาณมาสร้าง

ขอคำแนะนำหน่อยได้ไหมครับ ถ้าผมต้องการสร้าง pwm โดยการรับ สัญญาณ absolute sine แล้วไป compare กับสัญญาณ สามเหลี่ยม 40 kHz ให้ออกมาเป็น pwm พอจะทำได้ไหมอะครับ แล้วต้องทำยังไงหรอครับ ผมมือใหม่มากๆเลยครับ


ผมไม่แน่ใจว่าอันนี้จะตรงกับที่คุณหารึป่าวแต่มันก็สร้างได้ละครับ

คือรับค่า signal มาคอมแพ การสร้าง pwm อีกที

int SinPin = A0;    // select the input pin for sin generator
int TriPin= A5;      // select the input pin for the tri generator
int PulsePin1 = 13; 
int PulsePin2= 7;


void setup() {
  // declare the pulsePin as an OUTPUT:
  pinMode(PulsePin1, OUTPUT); 
pinMode(PulsePin2, OUTPUT);
pinMode(SinPin,INPUT);
pinMode(TriPin,INPUT);

}

void loop() {
  int analogsin = analogRead(SinPin); // original sinewave
  int analogtri= 1+ analogRead(TriPin); // triangle OFFSET 1V 
  int analognegsin= -1* analogRead(SinPin); // invert sine 
                
if (analogsin>=analogtri)  {       
  digitalWrite( PulsePin1, HIGH);
  
}
if ( analogsin<=analogtri){
  digitalWrite(PulsePin1,LOW);

}
if( analognegsin>=analogtri){
  digitalWrite( PulsePin2, HIGH);
}
else{
   digitalWrite(PulsePin2, LOW);
}
}

ขอบคุณนะครับ :smiley:
แล้วถ้าเราสร้างสัญญาณ สามเหลี่ยม 40kHz ไว้ใน arduino แล้วรอรับสัญญาณ absolute sine มาพอจะเป้นไปได้ไหมอะครับ หรือว่าต้องรับสัญญาณสามเหลี่ยมเข้ามาอย่างด้วยอะครับ

ตอนมันรับ input signal มันอ่านไม่ออกหลอกครับว่าเป็นสัญญาณอะไร แต่มันสามารถอ่านได้ว่ามีค่า แรงดันที่เท่าไหร่ หรือความถี่ จากนั้นเอาค่าที่อ่านได้ไปแปลง เพื่อเอาไปกำหนด เป็น ค่า top เพื่อคอมแพร์กับสัญญาณสามเหลี่ยม ภายในเพื่อสร้าง pwm ออกมาอีกที

อาจจะต้องอธิบายให้ละเอียดกว่านี้ เพื่อให้เห็นภาพว่าจะทำลักษณะไหน

มันเป็นประมาณนี้อะครับ แล้วอาจารย์เขาอยากให้วงจรน้อยเท่าที่จะทำได้ครับ

เบื้องต้นต้องอ่าน ดาต้าชีต ของ Atmega328 ดูครับต้องเปลี่ยนโหมดสัญญาณ referent ใหม่ให้ตรงที่เอามาให้ดูนี้คือ แบบฟันปลาครับ เปิดดาต้าชีตไล่ดูว่าอันไหนตรงกับที่เราต้องการ แล้วศึกษาต่อไปว่าเราจะกำหนดค่าให้มันได้อย่างไร เอาข้อมูลที่ได้มาคุยกันครับ

ที่พี่บอกโหมด ใช่โหมดนี้ไหมอะครับ แล้วผมจะต้อง set ค่าหรืออะไรยังไงหรอครับ

1.อ่านกระทู้ referent แล้วตอบผมหน่อยว่าผมตั้งโหมดด้วยคำสั้งอะไร?
2.ศึกษาเรื่องการดึงค่าสัญญาณคอมแพออกมาดู เผื่อสามารถเอาสโคปจับสัญญาณคอมแพกับสัญญาณอินพุตที่เข้ามา ตอนนั้นเหมือนผมเคยเห็นผ่านๆ แต่ก็ไม่แน่ใจ

ปล. อันไหนที่ผมรู้ผมจะตอบให้เลยนะครับ แต่ถ้านอกเหนือจากที่ผมรู้ ผมจะไกร์ให้น้องไปค้นคว้ามา แล้วเอามาคุยกันดู ว่ามีความเป็นไปได้มากน้อยแค่ไหน

เทคนิกคือได้ข้อมูลอะไรมาก็เอามาแปะไว้ในกระทู้นี้ก่อน จากนั้นก็เอาข้อมูลมาวิเคราะห์ว่า ได้อะไรจากมันบ้าง ใช้งานพื้นที่กระทู้นี้ได้เต็มที่ไม่ต้องกลัวรก ครับ

TCCR1A กับ TCCR1B ใช่ไหมอะครับ
แล้วก็ตั้งค่าให้เป็น 40kHz แล้วก็เอาไปเปรียบเทียบกับสัญญาณ Absolute sine ที่รับเข้ามาใช่ไหมอะครับ หรือว่าผมต้องไปศึกษาการดึงค่าสัญญาณคอมแพครับ

1 Likes

อ่านวิธีเขียนเป็นคำสั่งจากการเลือกโหมดให้ละเอียดครับ ตัวอย่างผมอธิบายไว้ค่อนข้างละเอียด

ในส่วนของ 40kHz คำนวนออกมาในตารางดูว่าได้ 40kHz ไหม เช็คสมการด้วยว่าโหมดนี้ใช้สมการอะไรคำนวน

ส่วนเรื่องการดึงค่าออกมาคอมแพ อันนี้ผมเสริมให้เฉยๆ เป็นทางเลือกที่สอง เผื่อทางที่ 1 ไม่เวิร์ค ก็ใช้แผน 2 ไป แต่ต้องศึกษาความเป็นไปได้ก่อนว่ามันทำได้จริงรึป่าว หรือมันมีแผน 3 ที่อาจจะง่ายกว่านี้ครับ

อย่างที่บอกข้อมูลที่มีมันช่วยเราตัดสินใจง่ายขึ้น อาจจะอย่าพึ่งเจาะลึกทางใดทางหนึ่ง ถ้ายังมีเวลา ค้นคว้าดูทางเลือกเรามีกี่ทาง ที่สามารถทำได้ สมมติ หามาแล้วมี 3 ทาง ที่ทำได้ก็เลือกทางที่ง่ายสุดก่อนเพื่อเซพเวลาอีกที

1581333657517 พี่ครับผมเห็นแค่สูตรนี้อะครับ ผมไม่เข้าใจว่าเราจะต้องกำหนดอะไรเท่าไหร่บ้างครับ แล้วจะเขียนโค้ดยังไงให้มัน compare กันอะครับ

ผมต้องไว้ในหัวข้อ

การเลือกค่าปรีสเกลเลอร์

ครับ

ลองอ่านแล้วอธิบายให้ฟังหน่อย ในความเข้าใจของตัวเองว่าใจความคืออะไร

คือผมเข้าใจว่า การปรีสเกลเลอร์ เป็นการหารความถี่เพื่อให้ได้ความถี่สัญญาณที่ต้องการ คือเหมือนเราคำนวณสูตรในโหมดที่เราเลือก แล้วเลือกใช้ค่า Top ที่เป็นจำนวนเต็ม แต่ผมไม่เข้าใจค่าของ fclkl/O อันนี้คือค่าอะไรหรอครับ แล้วในโหมดที่ผมใช้ มันก็ไม่มีค่า top ในสมการครับ อย่างงี้ต้องเลือกยังไงหรอครับ

เราใช้โหมดไหนครับ ในหัวข้อนั้น มีสมการ fclkl/O อยู่ด้วยรึป่าว ถ้าไม่มีแสดงว่าใช้สมการเดียวกันได้ ถ้าเป็นอย่างนั้นก็คำนวณหาค่า Top ที่เป็นจำนวนเต็ม ออกมา ว่าได้เท่าไหร่ด้วยการแทนที่ความถี่ 40kHz เหมือนตัวอย่าง

ผม ใช้โหมด fast pwm mode ครับ มีค่าfclkl/O ด้วยอะครับ 1581333657517
อย่างงี้ต้องทำยังไงหรอครับ

ในดาต้าชีตมันจะบอกอยู่นะครับ มันบอกว่าคือค่าอะไร?

มันคือค่า timer/counter timing ใช่ไหมอะครับ. แล้วในตัวอย่างพี่แทนค่ามันด้วยค่าเท่าไหร่หรอครับ

ผมลองแทนค่า ในสูตร 40k=fclkio/(8*256). มันได้ค่าออกมา 81.92M อะครับ

ไม่น่าจะใช่นะครับ มันคือค่า ความถี่สูงสุดของชิบ หรือ Clock speed ครับ

แล้วอย่างงี้เราพอจะมีวิธีกำหนดความถี่ของ สัญญาณฟันปลาได้ไหมอะครับ

ก็อย่างที่บอกครับ แทนค่าสมการหาค่า top ออกมา