กดหมายเลขบน Keypad (Arduino) ควบคุมการปรับค่าดิวตี้ และสัญญาณพัลส์ PWM

ต้องการกดหมายเลขบน Keypad (Arduino) ควบคุมปรับค่าดิวตี้ สัญญาณพัลส์ PWM, fs= 16kHz คงที่ เช่น กดเลข 5 ได้สัญญาณpwn ค่าดิวตี้ไซเคิล 5% แรงดันเท่ากับ…v ความถี่ 16kHz ประมาณนี้ครับ **กดเพิ่มที่ล่ะ 5 ค่าดิวตี้ก็จะเปลี่ยนไป เช่น 5, 10, 15, …n// เราจะทำแบบนี้ได้ไหมครับ มีแนวทางแนะนำไหมครับ ใช้รุ่นไหนได้บ้างครับ🙏 ผิดถูกขออภัยด้วยครับมือใหม่ ขอบคุณครับ

ช่วยแนะนำหน่อยครับ :pray:ขอบคุณครับ

ใช้ตัวไหนครับ มีภาพไหมขอดูหน่อย


รูปตัวอย่างครับ รูปนี้ผ่านวงจรแล้วครับ
แต่ที่จริงออกจาก Arduino ผมสั่งเข้ามาแค่ช่องสัญญาณเดียว ขา 9 ~ PWM 16kHz ใช้Rปรับ(A1) แรงดัน3-4v

ตอนนี้ใช้ R ปรับค่าครับ ( อยากเปลี่ยนเป็น ใช้ Keypad !! กดค่าเอาจะทำได้มั้ยครับ.) แบบกดหมายเลขเพิ่มทีล่ะ5 เช่น 5,10,15,20 , แต่ล่ะรหัสค่าแรงดันค่าดิวตี้ก็จะเปลี่ยนไปมากขึ้นและลดลงตามค่าที่เรากดหรือค่าที่ใกล้เคียงกก็ได้ครับครับ อยากทำให้มันคีย์ปรับค่าได้เหมือน R ปรับค่านะครับ ขาออกเป็นสัญญาณPWM ที่ความถี่ 16kHz คงที่ จะเอาไปควบคุมวงจรกำลังอีกทีนึงครับ (ใช้กับมอสเฟต)

ขอดูโค้ตที่ใช้กับ R หน่อยครับ

Screenshot_2563_0620_003501

หมายถึงอันไหนครับ R ใช้ 1k ครับ แบบค่าละเอียด หรือแบบธรรมดาก็ได้ครับ

float xxx;

unsigned long pwm1;

void setup(){

pinMode(9, OUTPUT);

TCCR1A = _BV(COM1A1) | _BV(COM1B1) | _BV(COM1B0) | _BV(WGM11); 
TCCR1B = _BV(WGM13) | _BV(CS11);
}
void loop(){
  while((analogRead(A1))<0){
  }
while((analogRead(A1))>1000){
  OCR1A = 0;
  OCR1B = 0;
  }
  
ICR1 = 62.5; 
pwm1 = analogRead(A1); 

xxx = float(pwm1);

xxx = xxx * ICR1;

xxx = xxx / 512;

OCR1A = int(62.5-(xxx/2));

}

ตอนแรกมันเป็นซิฟเฟสกันครับ ผมแก้เอาคับเหลือช่องสัญญาณเดียว ครับ ผมมั่วๆเอา แต่มันก็ใช้ได้ครับ ขอบคุณมากคับ ใช่R ปรับที่ขาA1 ครับ

ถ้ามันไม่ถูกต้องตรงไหนต้องขอโทษด้วยครับ แนะนำผมหน่อย ครัย

ค่าดิวตี้ไซเคิล 5%

ผมต้องการรู้ว่า Duty 5% ใช้ค่า A1 เท่าไหร่ครับ

ดูยังไงครับ ค่า A1 แรงดัน ตอนหมุนปรับ 5% หรอครับ

หายังไงครับ

ปรับ R จะได้ (ค่าแรงดันที่ป้อน A1 ) เมื่อแรงดันที่ ขา 9 ปรับได้ ดิวตี้ 5% แบบนี้หรอครับ ถ้าใช่ผมจะหาค่าให้คับ

ผมวัดโดย ปรับR 1k หมุนสุดทิศทางตามเข็ม ควบคุมขาA1 จะแรงดันสูงสุดที่ขา9 ไม่มีโหลด =5 - 5.18v วัดที่ขาA1 มันจะกลับกันครับ =0v
…ขา9 มาก ขาA1จะน้อย …ขาA1 มาก ขา9จะน้อย ครับ
เช่น…
ถ้า output สูงสุดเป็น 5v
ดิวตี้ 5% หาจาก “100%/5 V= 20%” จะได้ 1v = 20% ,ถ้า 5% = 0.25v ออกที่ขา9

กลับกัน ขาA1 จะ = 4.75 v โดยประมาณ
Duty 5% A1 = 4.75 V หรือต้องเป็นเลข แอนนาล็อกครับ(0-1024)
คิดแบบนี้ไหมครับ ค่า A1 ถ้าผิดแนะนำผมหน่อยครับ
แต่ถ้าให้กำหนดค่าในโค้ตผมยังเขียนไม่เป็นครับ:sweat_smile::pray: ช่วยด้วยครับ

:thinking: แล้ว keypad มันสั่งออกเป็นระดับแรงดันแบบนี้ได้ไหมครับ เหมือน key ปรับแรงดัน! แต่เรากำหนดเลขให้มันแต่ล่ะแรงดัน ใช้แทน R ปรับค่า อ่ะครับผมสงสัย
เราจะสั่ง Contron ได้แบบไหนบ้างอย่างไรครับ:grin::pray:

ไม่ต้องไปถึงขั้นนั้นครับ ใส่แค่นี้ก็ได้แล้วครับ

float xxx;

unsigned long pwm1;

void setup(){

pinMode(9, OUTPUT);

TCCR1A = _BV(COM1A1) | _BV(COM1B1) | _BV(COM1B0) | _BV(WGM11); 

TCCR1B = _BV(WGM13) | _BV(CS11);

}

void loop(){

  while((analogRead(A1))<0){

  }

while((analogRead(A1))>1000){

  OCR1A = 0;

  OCR1B = 0;

  }

  Serial.println(String("Read A1 = ")+ A1);

  

ICR1 = 62.5; 

pwm1 = analogRead(A1); 

xxx = float(pwm1);

xxx = xxx * ICR1;

xxx = xxx / 512;

OCR1A = int(62.5-(xxx/2));

}

เมื่อเราได้ค่า A1 มาแล้วเราก็เอาค่านั้นมากำหนดบน Kaypad ว่า ถ้า กด 5 ให้ส่งค่า A1 = x ออกมา แค่นั้นเอง

อ่อครับขอบคุณมากครับ🙏

แล้วโค้ด Keypad จะเป็นยังไงครับ ผมใช้ตัว 4*3 ครับ
ผมกำหนดไม่เป็นครับ ผมมีแต่โค้ดนี้ครับกดkey ตามตัวเลขธรรมดาครับ

#include <Keypad.h>

const byte ROWS = 4; //four rows
const byte COLS = 3; //three columns

char keys[ROWS][COLS] = {
  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
  {'*','0','#'}
};
byte rowPins[ROWS] = {9, 8, 7, 6}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {5, 4, 3}; //connect to the column pinouts of the keypad

//Create an object of keypad
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

void setup(){
  Serial.begin(9600);
}
  
void loop(){
  char key = keypad.getKey();// Read the key
  
  // Print if key pressed
  if (key){
    Serial.print("Key Pressed : ");
    Serial.println(key);
  }
}

:pray::pray::pray:

มันก็จะประมาณนี้ครับ แต่ต้องไปหาให้ได้ก่อนว่า X ขณะนั้นที่เราต้องการเท่าไหร่ ก็เอามาแทน ส่วน

analogRead(A1) ก็ตัดไปเลย ไปใช้ตัวแปร inputA1 แทน

ครับผม เดี๋ยวจะศึกษาโค้ดดูครับ ขอบคุณครับ


//(โค้ดตัวอย่าง)*

#include <Keypad.h>

const byte ROWS = 4; //four rows
const byte COLS = 3; //three columns
int inputA1;

char keys[ROWS][COLS] = {
  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
  {'*','0','#'}
};
byte rowPins[ROWS] = {8, 7, 6, 5}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {4, 3, 2}; //connect to the column pinouts of the keypad

//Create an object of keypad
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

void setup(){
  Serial.begin(9600);
}
  
void loop(){
  char key = keypad.getKey();// Read the key
  
  // Print if key pressed
  if (key){
    Serial.print("Key Pressed : ");
    Serial.println(key);
  }

  if(key == '5'){ //เมื่อ กด 5 เข้าเงื่อนไขนี้
      inputA1 = 20; // แทนค่า inputA1 ด้วย 20 ที่ทำให้ PWM มี dutycycle 5 %
    
  }
}

โทษทีผมลืมแปะโค้ตตัวอย่าง 555

มันกดที่ล่ะ2ตัวได้ไหมครับหลักสิบ,เช่น10 ,15, 20

10 = …%
15=…%

เราจะเอาโค้ดมารวมกันยังไงครับ :sweat_smile: :pray: