การสร้างสัญญาณ pwm ที่สามารถปรับค่าความถี่ และดิวตี้ไซเคิลได้ตามต้องการ


(PLC) #1

รบกวนช่วยแนะนำโปรแกรม Arduino ในการสร้างสัญญาณ PWM ที่สามารถปรับได้ทุกค่าหน่อยครับ


การสร้าง PWM ใน arduino
(Permpol Thanapunnamas) #2

ทุกค่านี้หมายถึงค่าอะไรบ้างง่ะ แจงรายละเอียดหน่อยครับ


(PLC) #3

เช่นความถี่ที่ 14.44KHz 155.4456KHz แบบนี้ครับผม


(Permpol Thanapunnamas) #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
        }

(Permpol Thanapunnamas) #5

ได้ผลยังไงบอกผมด้วยนะครับ อิอิ


(PLC) #6

ขอบคุณมากครับผม


(PLC) #7

แล้วค่าความถี่ คำนวณอย่างไรครับ ใส่ตรงไหนครับผม


(PLC) #8

ค่าดิวตี้ ต้องใส่อย่างไรนะครับผม ช่วยแนะนำหน่อยนะครับ


(Permpol Thanapunnamas) #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) #10

เหมือนว่าโปรแกรมยังไม่ผ่านนะครับ ช่วยแนะนำหน่อยนะครับ


(PLC) #11


(Permpol Thanapunnamas) #12

ลองเช็คในส่วนไลเบอรี่ในโปรแกรม arduino ดูว่ามี TimerOne.h หรือป่าว ถ้าไม่มีก็ไปหาใน google มาลงซะ อัพลงในโปรแกรม Arduino นั้นแหละ


(PLC) #13


(PLC) #14

ผมรันไม่ผ่านตรงบรรทัดที่ขีดเส้นไว้นะครับ ช่วยแนะนำวิธีการแก้ไขหน่อยนะครับ


(PLC) #15

ขอลิ้งดาวโหลดหน่อยครับ


(Permpol Thanapunnamas) #16

ก็นั้นแหละครับ จะใช้คำสั่งที่ขีดเส้นใต้นั้นได้มันต้องมีไลเบอรี่ “TimerOne.h” ก่อน
ส่วนดาวโหลดน้องลอง Search ใน google ดูก่อนครับ อยากให้ลองทำเองดูก่อน
ถ้าหาไม่ได้ ทำไม่ได้จริงๆ ค่อยบอกพี่นะครับ


(PLC) #17

ตอนนี้แก้ไข “TimerOne.h” ได้แล้วครับพี่ แต่เบริน์ไปแล้ว กลับไม่มีสัญญาณครับ


(Permpol Thanapunnamas) #19

ลืมบอกไปว่า ถ้าเบิร์นโค้ต ไปตรงๆ เท่ากับว่าเราให้ดิวตี้ไซเคิลเป็น 0 นะ เพราะ int pot = 0;

ตรง pot ต้องการดิวตี้ไซต์เคิลเท่าไหร่ลองตั้งดู 0 - 255 :smirk:


(Permpol Thanapunnamas) #20

ลืมบอกไปอีกอย่าง(ลืมอีกละ) ตัดบรรทัดนี้ออกไปด้วยครับไม่งั้นสัญญาณจะไม่ออก

เพราะว่า มันรับค่าอนาล็อกมาจากข้างนอก 0 - 5 Vdc มาเป็นค่าดิวตี้ไซต์เคิล


(PLC) #21

ตอนนี้ผมปรับค่าดิวตี้และความถี่ได้แล้วนะครับ แต่ความถี่ก็ยังปรับละเอียด เช่น 12.3333kHz ยังไม่ได้ครับ
โปรแกรมยังอ่านค่าเต็ม เช่น43 44 45 อยู๋ครับ ยังอ่านค่า เช่น 44.333ยังไม่ได้ครับ