Wednesday, June 7, 2023

បង្កើតសញ្ញាស៊ីនុយសូអ៊ីត Sine Wave ចេញពី Arduino

នៅពេលដែលនិយាយពីរលកសញ្ញាគ្រប់គ្នាតែងតែស្រម៉ៃពីរូបរាងរបស់ស៊ីនុយសូអ៊ីត Sine Wave ដោយសារតែវាត្រូវបានគេលើកឡើងមកសិក្សាក្នុងករណីទាំងរូបវិទ្យា និងគណិតវិទ្យា។ ខាងក្រោមនេះខ្ញុំនឹងបង្ហាញពីគម្រូត្រួសៗក្នុងការបង្កើតសញ្ញា Sine Wave ដោយសរសេរកូដ Arduino។

ទំនាក់ទំនងនៃរលកស៊ីនុយសូអ៊ីត

សមីការលកស៊ីនុយសូអីត

ដែល៖
  • A (Amplitude) អំភ្លីទុត (កំពស់ដែលរលកឡើងខ្ពស់បំផុតវាស់ពី 0)
  • f (Frequency) ហ្វ្រេកង់របស់រលក
  • ω = 2π(Angular frequency) ល្បឿនមុំដែលគិតជារ៉ាដ្យង់
  •  (Phase) ដែលមានតម្លៃស្មើ 0 បើរលកចាប់ផ្តើមពី 0 នៅខណៈពេល t = 0

ដើម្បីបង្កើតរលកឡើងវិញបានត្រូវសិក្សាពីការធ្វើ Sampling ដែលយើងត្រូវតែយល់ដឹងពី (Nyquist–Shannon Theorem) ដោយដឹងថាហេតុអ្វីក៏ Sampling Frequency យ៉ាងហោចណាស់ត្រូវតែធំជាង ២ ដងនៃ Signal Frequency។

ការធ្វើ Sampling

ការធ្វើ ​Sampling គឺជាការបំបែករលក១ទាំងមូលឲ្យទៅជាកំនាត់ខ្លីៗតូចដើម្បីខាងស្រួលសិក្សារ ហើយការបង្កើតឡើងវិញក៏មិនបង្កើតរលកទាំងស្រុងម្តងទាំងអស់បានដែរ គឺបង្កើតក្នុងរយៈពេល Sampling Interval នោះរួចតម្រៀបជិតៗគ្នា ដែលនាំឲ្យមើលទៅដូចជារលកទាំងមូលរត់ចេញទៅ។

ការតម្រៀបសញ្ញាបន្ទាប់ពីធ្វើ ​Sampling

មួយវិញទៀតនៅក្នុង Arduino ក៏គ្មាន Ouput ណាមួយដែលអាចបញ្ចេញឲ្យចេញជាតង់ស្យុងជាក់លាក់ ហើយអាចក្រោមសូន្យបានដែរ។ ដោយប្រើប្រាស់ PWM រួមនិង Low-pass Filter យើងជាធ្វើឲ្យចេញជាតង់ស្យុងមធ្យមចេញពីជើង Digital PWM របស់ Arduino បាន ក៏ប៉ុន្តែតង់ស្យុងមិនអាចក្រោមសូន្យដោយគ្មានសៀគ្វៀ H-bridge បានទេ។ វិធីនោះគឺរុញរលកទាំងមូលទៅលើ 2.5V ដោយសន្មតថា 2.5V ជាចំនុចសូន្យរបស់រលក​នោះ 0V និង 5V នឹងក្លាយជាចំនុចទាបបំផុត និងខ្ពស់បំផុត (​Peak)។


សៀគ្វីតេស្ត

រេស៊ីស្តរ 10K និងកុងដង់ 100nF ដើរតួជា Low-pass filter ដើម្បីឲ្យរលកសញ្ញាដែលចេញទៅល្អ មិនមែនជា PWM សុទ្ធសាត។ ចំនែករេស៊ីស្តរ 100k គ្រាន់តែជាគ្រឿងទទួលបញ្ឆោត ១ ដើម្បីឲ្យរលកអណ្តែតមិនចុះវិញ។ ខាងក្រោមនេះកូដ៖

សៀគ្វី និងកូដខាងលើបង្កើតបានរលកសញ្ញាបានល្អដូចខាងក្រោម៖

លទ្ធផលរលកសញ្ញា