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

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

1 Likes

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

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

ลองโค้ดนี้ดูครับ สามารถปรับความถี่ได้จากคำสั่ง 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
        }

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

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

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

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

เรื่องความถี่ลองเอาสูตรที่พี่ให้มาคำนวนดูครับ

ที่ใส่เข้าไปในคำสั่ง () นั้นคือค่าท๊อปนั้นเอง เพราะงั้นน้องต้องรู้ว่า PWM ของ atmega328 มีกี่โหมด แต่ละโหมดมีสูตรการหาความถี่อย่างไร

Atmega328 datasheet
http://www.atmel.com/Images/Atmel-42735-8-bit-AVR-Microcontroller-ATmega328-328P_Datasheet.pdf

ถ้าน้องไม่รู้จริงๆ ลองใส่ค่าท๊อปลงไปทุกสมการหาความถี่ ในแต่ละโหมด โหมดไหนได้ความถี่ 50 kHz แสดงว่าเราใช้ PWM ในโหมดนั้นอยู่ ซึ่งจะทำให้เราคำนวนต่อไปได้ว่า สัญญาณ PWM ที่ได้นั้น ถูกสร้างมาได้อย่างไร

ตีโจทย์แรกให้แตกก่อนนะครับ!!

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

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

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

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

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

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

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

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

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

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

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