การปรับค่าดิวตี้สัญญาณ PWM ความถี่16 kHz จาก Arduino

111156 (ท๊อป ไหน’น) September 26, 2020, 6:13pm #1

การปรับค่าดิวตี้จาก 0-100 % ของสัญญาณ PWM ความถี่16 kHz โดยใช้ตัวต้านทานปรับค่าได้ จาก Arduino ช่วยแนะนำโค้ดโปรแกรมหน่อยครับ

111156 (ท๊อป ไหน’น) September 26, 2020, 6:18pm #2

มาจากนี้ครับ แบบชิฟเฟต แต่ผมต้องการใช้แค่เฟสเดียวครับ PWM 16kHz ใช้ R ปรับค่าได้แบบละเอียด แนะนำหน่อยครับ

111156 (ท๊อป ไหน’น) September 26, 2020, 6:24pm #3

//โค้ตตัวอย่าง

float xxx;
float yyy;
unsigned long pwm1;
unsigned long pwm2;

void setup(){

pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
TCCR1A = _BV(COM1A1) | _BV(COM1B1) | _BV(COM1B0) | _BV(WGM11); 
TCCR1B = _BV(WGM13) | _BV(CS11);
}
void loop(){
	while((analogRead(A1))<250){
	}
while((analogRead(A1))>900){
  OCR1A = 0;
  OCR1B = 0;
	}
ICR1 = 50; 
pwm1 = analogRead(A1); 
pwm2 = analogRead(A1); 
xxx = float(pwm1);
yyy = float(pwm2);
xxx = xxx * ICR1;
yyy = yyy * ICR1;
xxx = xxx / 1024;
yyy = yyy / 1024;
OCR1A = int(28-(xxx/2));
OCR1B = int(23+(yyy/2));
}

Remy_Martin (Permpol Thanapunnamas) September 27, 2020, 12:23pm #4

จริงๆ ผมเขียนวิธีการหาค่าความถี่ตามที่เราต้องการไว้ให้แล้วนะ ครับ เราอ่านบทความหลักแล้วเข้าใจว่าอย่างไรบ้าง

ถ้ายังงงก็เริ่มอ่านที่คอมเมนนี้

1 Like

111156 (ท๊อป ไหน’น) September 28, 2020, 1:27am #5

อ่านแล้วครับ มีสูตรคำนวณความถี่ และหาค่าTop
f=1/T ,T=1/f : 16khz หา T= 1/16000 = 62.5uS

และมีโค้ดที่ใส่ค่า T แล้วได้ความถี่ออกมา

แล้วแบบเฟสเดียวทำยังไงครับ ที่ใช้Rปรับค่าปรับความกว้างของ pwm 16khz ได้ 0%-100% Preformatted text

Remy_Martin (Permpol Thanapunnamas) September 28, 2020, 1:31am #6

ถ้า เหสเดียวมันจะง่ายขึ้นหนึ่ง มันสามารถใช้คำสั่งเดียว pwm. อะไรสักยอย่าง ผมจำไม่ได้ ลองหามาคุยกันหน่อยครับ

1 Like

111156 (ท๊อป ไหน’น) September 28, 2020, 5:39am #7

ยังไงครับพี่

Remy_Martin (Permpol Thanapunnamas) September 28, 2020, 12:44pm #8

ลองหาโค้ต pwm ที่ใช้คำสั่งเดียว สร้าง ให้ผมหน่อยครับ เอามาคุยกัน

1 Like

111156 (ท๊อป ไหน’น) September 28, 2020, 6:38pm #9

111156 (ท๊อป ไหน’น) September 28, 2020, 6:40pm #10

#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...
}

1 Like

Remy_Martin (Permpol Thanapunnamas) September 28, 2020, 11:05pm #11

ใช้ครับ อันนี้แหละลองแล้วเป็นไงบ้าง

1 Like

111156 (ท๊อป ไหน’น) September 29, 2020, 7:10am #12

แล้วใช้ R ปรับดิวตี้ยังไงครับ

Remy_Martin (Permpol Thanapunnamas) September 29, 2020, 8:42am #13

คำสั่งไหนคือกำหนด ดิวตี้ไซเคิบครับ

1 Like

111156 (ท๊อป ไหน’น) September 29, 2020, 6:27pm #14

  Timer1.pwm(9, 256);         // setup pwm on pin 9, 25% duty cycle
  Timer1.pwm(10, 256);       // setup pwm on pin 10, 25% duty cycle
}

Remy_Martin (Permpol Thanapunnamas) September 30, 2020, 1:43am #15

ตรงไหนที่ เปลี่ยนแล้วค่า ดิวตี้ไซเคิ้ลจะเปลี่ยนตามครับ

1 Like

PUYIOT September 30, 2020, 3:05am #16

ขอลักษณะการนำไปใช้งานหน่อยครับ ว่าสามารถนำไปใช้อะไรได้บ้าง

1 Like

111156 (ท๊อป ไหน’น) September 30, 2020, 12:25pm #17

เลข ดิจิทัล ครับ

111156 (ท๊อป ไหน’น) September 30, 2020, 12:28pm #18

นำสัญญาณไปขับมอสเฟสครับ

Remy_Martin (Permpol Thanapunnamas) September 30, 2020, 5:01pm #19

ตรงไหนที่เราเปลี่ยนแล้ว duty เปลี่ยนตาม เราตั้งตัวแปรมาใหม่ แล้วแทนมันลงไปครับ จากนั้น ก็ใช้ map() ฟังก์ชัน แปลงค่าสูงสุดต่ำสุดเอาครับ

1 Like

111156 (ท๊อป ไหน’น) September 30, 2020, 10:01pm #20

แปลงยังไงครับ😅