Friday, June 2, 2023

បង្កើតសញ្ញា Square Wave តាមប្រេកង់ចេញពី Arduino

ចំនេះដឹងសំខាន់មួយដែលអ្នកសរសេរកូដអេឡិចត្រូនិចត្រូវតែចេះមិនអាចខានបាន គឺមានលទ្ធភាពបង្កើតសញ្ញាអ្វីក៏បានពី ​Micro controller ។ អត្ថបទនេះខ្ញុំនឹងចែករំលែងពីការបង្កើតសញ្ញាជ្រុងៗ ​(Square wave) ចេញពី Arduino UNO ដែលសញ្ញាដែលចេញនោះអាចកំណត់ឲ្យចេញប្រកង់ប៉ុន្មានក៏បាន។

សញ្ញាផ្សេងៗដែលអាចបង្កើតបាន

សញ្ញាជ្រុង (Square wave)   គឺងាយស្រួលបង្កើតជាងគេក្នុងចំនោមសញ្ញាទាំងអស់ខាងលើ បើនិយាយពីកូដវីញមានតែ 1  និង 0 ប៉ុណ្ណោះ។ តែអ្វីដែលចំនុចសំខាន់ដើម្បីបង្កើតសញ្ញានេះបានគឺការកំណត់ប្រកង់ឲ្យត្រូវទៅតាមការចង់បាន។ ខាងក្រោមជារូបមន្តប្រកង់មានទំនាក់ទំនងជាមួយរយៈននៃខួបរបស់សញ្ញា៖

​រូបបមន្តប្រេកង់

យោងទៅតាមរូបមន្តខាងលើ យើងអាចបង្កើត ​Function  មួយសម្រាប់គណនារយៈពេលនៃខួបរបស់សញ្ញាបាន ដោយបញ្ចូលតម្លៃប្រេកង់៖

int TperiodMilliSecond(int freq){
  return (1/(float)freq)*1000; // return in millisecond
}

បន្ទាប់ពីទទួលបានរយៈពេលនៃខួបរបស់សញ្ញា ធ្វើការសរសេរកូដបញ្ជារជើង Arduino ឲ្យចេញជាសញ្ញាជ្រុង៖

if(millis() - last_t >= TperiodMilliSecond(f)/2.0){
    last_t = millis(); // Reset value
    digitalWrite(FREQ_OUT_PIN, !digitalRead(FREQ_OUT_PIN)); // Toggle pin
  }


ចែកនឹង 2 ត្រង់ចំនុចនេះដោយសារតែរៀងរាល់ពេលលក្ខខណ្ឌនេះដំណើរការម្តង Toggle ពី LOW ទៅ​ HIGH ដែលមានន័យថា ២ ដងទើបស្មើនឹង១ខួប។ លទ្ធផលដូចរូបខាងក្រោម៖

សៀគ្វីតេស្ត

សញ្ញាដែលទទួលបាន

កូដទាំងអស់


#include <button.h>

unsigned long last_t = 0;

int f = 10;

#define FREQ_OUT_PIN 13

button button1(2, HIGH);

void setup() {
  // put your setup code here, to run once:
  pinMode(2, INPUT_PULLUP);
  pinMode(FREQ_OUT_PIN, OUTPUT);

  button1.init(); //Initialize button1
}

void loop() {

  if(button1.push()){
    f += 10;
    if(f > 60) f = 10;
  }

  if(millis() - last_t >= TperiodMilliSecond(f)/2.0){
    last_t = millis();
    digitalWrite(FREQ_OUT_PIN, !digitalRead(FREQ_OUT_PIN));
  }
}

int TperiodMilliSecond(int freq){
  return (1/(float)freq)*1000;
}