อยากทราบการตั้งกำหนดค่าความถี่กับค่าดิวตี้ว่าคำนวณอย่างไรครับ
ตอนนี้รู้อะไร บ้าง ลองทำอะไรไปบ้างครับ อยากรู้ว่าเราเข้าใจการเขียนโปรแกรมสร้างสัญญาณ PWM ถึงไหนแล้ว ถ้าตอบว่าไม่รู้อะไรเลยพี่แนะนำ ให้ไปหาความรู้มาก่อนใน Google มีหมดครับ ถึงจะคุยกับพี่รู้เรื่องเวลาพี่บอก
ผมอยากทราบสูตรการตั้งความถี่อ่ะครับพี่เข้าไปอ่านหลายเว็บแล้วมันไม่ค่อยรู้เรื่องเท่าไหรครับ
ตัวนี้อ่ะครับ TCCR2A = _BV(COM2A1)|_BV(COM2B1)|_BV(WGM20)|_BV(WGM22);
TCCR2B = _BV(CS21);
OCR2A = pot;
ได้ลองตามไปดูที่ดาต้าชีต หรือยังครับ ว่า
TCCR2A = _BV(COM2A1)|_BV(COM2B1)|_BV(WGM20)|_BV(WGM22);
TCCR2B = _BV(CS21);
OCR2A = pot;
คืออะไรหน้าตามันเป็นอย่างไร เราอ่านแล้วเราเข้าใจแบบไหน
ในเบื้องต้นเอาโค้ตนี้ไปลองรันดูครับ อย่างง่ายสุดที่สามารถสร้างสัญญาณจาก Arduino
#include "TimerOne.h"
void setup()
{
pinMode(9, OUTPUT);
Timer1.initialize(20); // initialize timer1, and set at 50kHz
Timer1.pwm(9, 256); // setup pwm on pin 9, 25% duty cycle
Timer1.pwm(10, 256); // setup pwm on pin 10, 25% duty cycle
}
void loop()
{
// your program here...
}
เอาไปรันใน Arduino แล้วใช้สโคปจับ ถ่ายรูปลงมาให้ดูด้วยครับ ผมจะอธิบายไปทีละส่วน ถ้าสะดวกใช้โปรแกรมซิมมาได้ก็แล้วแต่ครับ
พี่มี facebook ไหมครับ จัได้ติดต่อได้ง่ายครับ ต้อนนี้ผมปรับความถี่ได้แล้วครับเหลือปรับค่าดิวตี้ให้เเวลู้ตามแรงดันที่จ่ายเข้าให้ครับ
อยากให้ติดต่อในนี้ครับ FB ผมไม่สะดวกเวลาจะอธิบาย ในนี้ถ้าใช้ pc แชทมีให้ครับ ถ้าใช้ในมือถือส่งเป็นเมล ถ้าไม่มีหัวข้อจะคุยทั่วไป ใส่ไตเติลว่า @mail แล้วส่งมาชื่อผมครับ
อีกอย่างผมออนในเว็บนี้มากกว่า FB ครับ ช่วงนี้งานยุ่งเลยไม่ค่อยได้ออนเลย
เดียวผมจะทดลองดูก่อนนะครับพี่ ถ้าได้ยังไงจะส่งให้พี่ดูนะครับ เพื่อพี่มีวิธีที่ดีกว่านี้ครับ
มีอะไรคืบหน้าลงในนี้เลยนะครับ ถ้าผมรู้ผมจะตอบให้ แต่ถ้าผมไม่รู้ผมจะให้ผู้รู้มาช่วยตอบให้อีกที
ผมเพิ่มค่าดิวตี้ ++ มันเพิ่มขึ้นถึง 100 แล้วค่าความถี่ก็เพี้นยนไปเลยครับ
ผมอยากทราบว่าเราดิวตี้++ ถึงค่าถึงแล้วให้มันหยุดได้ไหมครับ
#include "TimerOne.h"
int pot = 156;
float P1=127;
float P2=1;
double Vout =64;
void setup()
{
Serial.begin(9600);
Timer1.initialize(40);
OCR2A =pot;
Timer1.pwm(10,pot);
TCCR2A = _BV(COM2A1)|_BV(COM2B1)|_BV(WGM20)|_BV(WGM22);
TCCR2B = _BV(CS22);
pinMode(1,INPUT);
pinMode(3,INPUT);
pinMode(10,OUTPUT);
}
void loop()
{
double I = analogRead(A1);
double V = analogRead(A3);
Serial.print("I=");
Serial.print(I);
Serial.print(" ");
Serial.print("V=");
Serial.print(V);
Serial.print(" ");
double Pk1 = I*V;
Serial.print("Pk1 = ");
Serial.print(Pk1);
Serial.print(" ");
if (Pk1<pot)
{
(Vout ++,P1 );
}
else(Vout --);
Serial.print("Vout = ");
Serial.println(Vout);
analogWrite(10,Vout);
}
ตัวนี้เปลี่ยนโคตรโปรแกรมที่เขียนครับ
หมายถึงว่าเราจะให้ค่าดิวตี้มันถึง 100 แล้วหยุดที่ 100 ใช่ป่ะ
ปัญหาคือเมื่อตั้ง 100 แล้วมอสเฟตทำงานหนักเกินครับ ร้อนมากผมอยากให้มันทำงานที่ 60 -70 เปออร์เช็นแต่ยังคงสามารถแสรูตามค่าแรงดันได้อยู่ครับ
ความหมายคือ เวลาแรงดันเข้ามาเยอะ ดิวตี้จะลดลงครับ เมื่อแรงดันมาน้อยดิวตี้จะเยอะขึ้นครับ
เค้าเรียกว่าทำ feedback ป้อนกลับครับ สามารถทำได้ครับ
พี่พอมีแนวทางไหมครับ
โค้ดจะเป็นการจ่าย PWM ออกมาแบบสำเร็จรูปครับ คือ กำหนดค่า Timer1.initialize(40); เท่าไหร่มันก็จับค่าไปเจน PWM ออกมาให้เลย เราจึงไม่สามารถเข้าไปยุ่งกับโครงสร้างของสัญญาณ อ้างอิงได้ วิธีแก้คือใช้ PWM อีกรูปแบบหนึ่งที่ละเอียดขึ้นในระดับสัญญาณอ้างอิง จับ pot มาจาก Vout แล้วเอามาเข้าสมการให้ย่านแมคสุดเหลือแค่ 0 - 5 V เพราะว่าบอร์ดสามารถรับไฟ Vin ได้ไม่เกิน 5 V ถ้าจำไม่ผมถ้าเกินกว่านั้นบอร์ดพัง จากนั้นเอาค่า 0 - 5 v มาแปลงทำสัญญาณ ปรับค่าดิวตี้อีกที