Remy_Martin
(Permpol Thanapunnamas)
กุมภาพันธ์ 6, 2017, 2:05pm
4
ลองโค้ดนี้ดูครับ สามารถปรับความถี่ได้จากคำสั่ง Timer1.initialize() ต้องการความถี่เท่าไหร่ก็ลองไปปรับค่าดู ตอนนี้ 20 = 50kHz ปรับค่าได้ตั้งแต่ 0 - 255 สัญญาณ pwm จะออกมาหน้าตาเหมือนกันที่ pin9 และ pin10 ไม่รู้ว่าตรงกับที่ต้องการหรือป่าวนะครับ น่าจะลงรายละเอียดมากกว่านี้อีกนิด ลองไปเทสดูครับ
#include "TimerOne.h"
int pot = 0; // analog value 0-5VDC : 0-255
void setup()
{
OCR2A = pot;
pinMode(9, OUTPUT);
Timer1.initialize(20); // initialize timer1, and set at 50kHz
Timer1.pwm(9, pot); // setup pwm on pin 9, 25% duty cycle
Timer1.pwm(10, pot); // setup pwm on pin 10, 25% duty cycle
TCCR2A = _BV(COM2A1) | _BV(COM2B1) | _BV(WGM21) | _BV(WGM20);
TCCR2B = _BV(CS20); // prescaler à 1.
OCR2A = pot;
}
void loop()
{
pot = analogRead(A0)/4; // Value between 0 and 255
Timer1.pwm(9, pot); // setup pwm on pin 9, 25% duty cycle
Timer1.pwm(10, pot); // setup pwm on pin 10, 25% duty cycle
}
Remy_Martin
(Permpol Thanapunnamas)
กุมภาพันธ์ 6, 2017, 2:07pm
5
ได้ผลยังไงบอกผมด้วยนะครับ อิอิ
PLC
(PLC)
กุมภาพันธ์ 6, 2017, 3:58pm
7
แล้วค่าความถี่ คำนวณอย่างไรครับ ใส่ตรงไหนครับผม
PLC
(PLC)
กุมภาพันธ์ 6, 2017, 4:01pm
8
ค่าดิวตี้ ต้องใส่อย่างไรนะครับผม ช่วยแนะนำหน่อยนะครับ
Remy_Martin
(Permpol Thanapunnamas)
กุมภาพันธ์ 6, 2017, 4:42pm
9
เรื่องความถี่ลองเอาสูตรที่พี่ให้มาคำนวนดูครับ
ที่ใส่เข้าไปในคำสั่ง () นั้นคือค่าท๊อปนั้นเอง เพราะงั้นน้องต้องรู้ว่า PWM ของ atmega328 มีกี่โหมด แต่ละโหมดมีสูตรการหาความถี่อย่างไร
Atmega328 datasheet
http://www.atmel.com/Images/Atmel-42735-8-bit-AVR-Microcontroller-ATmega328-328P_Datasheet.pdf
ถ้าน้องไม่รู้จริงๆ ลองใส่ค่าท๊อปลงไปทุกสมการหาความถี่ ในแต่ละโหมด โหมดไหนได้ความถี่ 50 kHz แสดงว่าเราใช้ PWM ในโหมดนั้นอยู่ ซึ่งจะทำให้เราคำนวนต่อไปได้ว่า สัญญาณ PWM ที่ได้นั้น ถูกสร้างมาได้อย่างไร
ตีโจทย์แรกให้แตกก่อนนะครับ!!
PLC
(PLC)
กุมภาพันธ์ 7, 2017, 3:48am
10
เหมือนว่าโปรแกรมยังไม่ผ่านนะครับ ช่วยแนะนำหน่อยนะครับ
Remy_Martin
(Permpol Thanapunnamas)
กุมภาพันธ์ 7, 2017, 3:53am
12
ลองเช็คในส่วนไลเบอรี่ในโปรแกรม arduino ดูว่ามี TimerOne.h หรือป่าว ถ้าไม่มีก็ไปหาใน google มาลงซะ อัพลงในโปรแกรม Arduino นั้นแหละ
PLC
(PLC)
กุมภาพันธ์ 7, 2017, 3:56am
14
ผมรันไม่ผ่านตรงบรรทัดที่ขีดเส้นไว้นะครับ ช่วยแนะนำวิธีการแก้ไขหน่อยนะครับ
Remy_Martin
(Permpol Thanapunnamas)
กุมภาพันธ์ 7, 2017, 4:08am
16
ก็นั้นแหละครับ จะใช้คำสั่งที่ขีดเส้นใต้นั้นได้มันต้องมีไลเบอรี่ “TimerOne.h” ก่อน
ส่วนดาวโหลดน้องลอง Search ใน google ดูก่อนครับ อยากให้ลองทำเองดูก่อน
ถ้าหาไม่ได้ ทำไม่ได้จริงๆ ค่อยบอกพี่นะครับ
PLC
(PLC)
กุมภาพันธ์ 7, 2017, 6:35am
17
ตอนนี้แก้ไข “TimerOne.h” ได้แล้วครับพี่ แต่เบริน์ไปแล้ว กลับไม่มีสัญญาณครับ
Remy_Martin
(Permpol Thanapunnamas)
กุมภาพันธ์ 7, 2017, 7:10am
19
ลืมบอกไปว่า ถ้าเบิร์นโค้ต ไปตรงๆ เท่ากับว่าเราให้ดิวตี้ไซเคิลเป็น 0 นะ เพราะ int pot = 0;
ตรง pot ต้องการดิวตี้ไซต์เคิลเท่าไหร่ลองตั้งดู 0 - 255
Remy_Martin
(Permpol Thanapunnamas)
กุมภาพันธ์ 7, 2017, 8:57am
20
ลืมบอกไปอีกอย่าง(ลืมอีกละ) ตัดบรรทัดนี้ออกไปด้วยครับไม่งั้นสัญญาณจะไม่ออก
เพราะว่า มันรับค่าอนาล็อกมาจากข้างนอก 0 - 5 Vdc มาเป็นค่าดิวตี้ไซต์เคิล
PLC
(PLC)
กุมภาพันธ์ 7, 2017, 2:06pm
21
ตอนนี้ผมปรับค่าดิวตี้และความถี่ได้แล้วนะครับ แต่ความถี่ก็ยังปรับละเอียด เช่น 12.3333kHz ยังไม่ได้ครับ
โปรแกรมยังอ่านค่าเต็ม เช่น43 44 45 อยู๋ครับ ยังอ่านค่า เช่น 44.333ยังไม่ได้ครับ
Remy_Martin
(Permpol Thanapunnamas)
กุมภาพันธ์ 7, 2017, 2:12pm
22
อันนี้เป็น วิธีการสร้างสัญญาณ PWM ออกมา
Top เป็นตัวกำหนดความถี่
Compare ก็คือสัญญาณเปรียบเทียบซึ่งจะเปรียบเทียบแล้วจ่ายเป็นค่ากิวตี้ไซต์เคิล
Bottom ก็คือค่าต่ำสุด ซึ่งตรงข้ามกับ ค่า Top นั้นเอง
PLC
(PLC)
กุมภาพันธ์ 7, 2017, 2:14pm
23
คืออธิบายแบบนี้ครับ
โปรแกรมสามารถสร้างความถี่ที่เป้นจุดทศยมได้ครับ
แต่โปรแกรมไม่สามารถสร้างความถี่ที่เป้นจุดทศนิยมได้ทุกค่าครับพี่
Remy_Martin
(Permpol Thanapunnamas)
กุมภาพันธ์ 7, 2017, 2:16pm
24
อันนี้คือ เอาไปใส่ใน คำสั่ง Timer1.initialize(); หรอครับ
จะใส่ Timer1.initialize(44.333); หรอ