-PWM คืออะไร
PWM จะใช้หลักการที่ส่งค่าแบบดิจิตอลคือ 0-1 ด้วยความถี่ค่าหนึ่ง แต่จะส่งค่าให้มีสัญญาณสูง(1)สลับกับสัญญาณต่ำ(0) โดยให้ระยะเวลาของแต่ละชนิดสัญญาณต่างกัน เพื่อให้ค่าเฉลี่ยของสัญญาณทั้งหมดออกมาเป็นค่าที่ต้องการนั่นเอง เช่นถ้าเราส่งค่าที่มีระยะสัญญาณสูงและต่ำเท่ากัน ก็จะได้ค่าเป็น 2.5 โวล์ ถ้าเราให้ค่าสัญญาณสูงยาวกว่า เราก็จะได้ค่ามากกว่า 2.5 และในทำนองเดียวกันถ้าเราให้ค่าสัญญาณต่ำยาวกว่า เราก็จะได้ค่าเฉลี่ยน้อยกว่า 2.5 นั่นเอง Arduino สามารถรับค่าอนาล็อคได้ 255 ระดับ ดังนั้นหมายความว่าค่าสัญญาณ 0 โวล์ถึง 5 โวล์ ก็จะแสดงได้เป็น 0 ถึง 255 ในสัญญาณดิจิตอลนั่นเอง โดยเราสามารถใช้หลักบัญญัติไตรยางค์ สามารถเปรียบเทียบค่าได้เลย ในการใช้งาน PWM เราจะต้องเลือกขาที่เขียนว่าเป็น PWM เท่านั้น
ตัวอย่างโปรแกรม
void setup() {
pinMode(13, OUTPUT);
}
void loop() {
for (int i=1; i<256; i++){
analogWrite(13, i);
delay(10);
}
for (int i=255; i>=0; i--){
analogWrite(13, i);
delay(10);
}
delay(3000);
}
void setup() {
pinMode(13, OUTPUT);
}
void loop() {
for (int i=1; i<256; i++){
analogWrite(13, i);
delay(10);
}
for (int i=255; i>=0; i--){
analogWrite(13, i);
delay(10);
}
delay(3000);
}
สังเกตุว่าเมื่อไฟมีช่วงคาบเวลาสูงคือ 255 ไฟจะสว่างสุด ถ้าคาบเวลาเป็น 0 ไฟจะดับลง
ตัวอย่างการประยุกต์คือ เอาไว้ใช้ในการ MOD การรับส่งค่าด้วยการส่งแบบอินฟาเรด ซึ่งสามารถส่งเป็น ASCII ได้เลย หรือเอาไว้ต่อกับ TRIAC เพื่อปรับหน่วงไฟอัตโนมัติใช้ในรถยนต์เมื่อเจ้าของสั่งปิดล๊อคประตู โดยให้ค่อยๆหรี่ลงเป็นลำดับก็เท่ไปอีกแบบนะครับ ที่เหลือก็แล้วแต่จะนำไปปรับใช้ครับ
แหล่งที่มาอ้างอิง https://www.facebook.com/permalink.php?id=205375546266456&story_fbid=343883472415662
-ตัวอย่างโค้ดการใช้งาน
analogWrite() แต่แบบนี้เราต้องต่อ poten
int ledPin = 9; // LED connected to digital pin 9
int analogPin = 3; // potentiometer connected to analog pin 3
int val = 0; // variable to store the read value
void setup()
{
pinMode(ledPin, OUTPUT); // sets the pin as output
}
void loop()
{
val = analogRead(analogPin); // read the input pin
analogWrite(ledPin, val / 4); // analogRead values go from 0 to 1023, analogWrite values from 0 to 255
}
-PIDหรือDC motor control with PID คือ การfeedback ไปยัง microcontroller
#include <Encoder.h>
Encoder myEnc(2, 18); //(digital 2, analog 4)
void setup() {
Serial.begin(9600);
Serial.println("Basic Encoder Test:");
}
long oldPosition = -999;
void loop() {
long newPosition = myEnc.read();
if (newPosition != oldPosition) {
oldPosition = newPosition;
Serial.println(newPosition);
}
}
Encoder myEnc(2, 18); //(digital 2, analog 4)
void setup() {
Serial.begin(9600);
Serial.println("Basic Encoder Test:");
}
long oldPosition = -999;
void loop() {
long newPosition = myEnc.read();
if (newPosition != oldPosition) {
oldPosition = newPosition;
Serial.println(newPosition);
}
}
โค้ดที่ยกมานี้ยังไม่ได้ทำขึ้นเองหรือดัดแปลง แต่จะนำมาเป็นแนวทางเพื่อนำไปศึกษาและทำงาน
-ในขณะนี้ผมกำลังจะเอาค่าที่วัดได้จาก encoder มาควบคุมความเร็วมอเตอร์ หรือไปควบคุมPWM แต่ยังคงทำไม่ได้ เพราะความรู้ยังไม่ครอบคุมเนื้อหาเท่าที่ควร




ไม่มีความคิดเห็น:
แสดงความคิดเห็น