#define SAMPLEPERIODUS 1000 // Sampling frequency = 1/SAMPLEPERIODUS, where SAMPLEPERIODUS is the sampling period in microsec.
int inPin = 0; // voltage connected to analog pin
float x[] = {0, 0, 0}; // input signal
//float x1 = 0;
//float x2 = 0;
float y[] = {0, 0, 0};
int i = 2;
/*float y1 = 0;
float y2 = 0;*/
float g = 0;
float a = 0;
float b = 0;
float xmax = 0;
float xmin = 0;
float ymax = 0;
float ymin = 0;
void setup(){
Serial.begin(115200);
pinMode(inPin,INPUT);
pinMode(13,OUTPUT);
}
void loop() {
unsigned long time = micros(); // Used to track rate
x
= (float)analogRead(inPin)*5.0/1023.0; // convert raw data to volt
y
= (1.0622*y[i-1])-(0.3786*y[i-2])+(0.0791*x)+(0.1582*x[i-1])+(0.0791*x[i-2]); //Past
if((y[i-1]>y[i-2]) && (y[i-1]>y
)){ymax = y[i-1];}
if((y[i-1]<y[i-2]) && (y[i-1]<y
)){ymin = y[i-1];}
if((x[i-1]>x[i-2]) && (x[i-1]>x
)){xmax = x[i-1];}
if((x[i-1]<x[i-2]) && (x[i-1]<x
)){xmin = x[i-1];}
a = xmax-xmin;
b = ymax-ymin;
g = b/a;
if(g>0.707){
digitalWrite(13,HIGH);
}
else{
digitalWrite(13,LOW);
}
y[i-2] = y[i-1]; y[i-1] = y
;
x[i-2] = x[i-1]; x[i-1] = x
;
Serial.print(x
); //Show input blue
Serial.print(", "); //x beteween y
Serial.print(y
);
Serial.print(", ");
Serial.println(g);
for(unsigned long up = time+SAMPLEPERIODUS; time > 0 && time < up; time = micros());
}
-โจทย์กำหนดให้LED ติดเมื่อความถี่ไม่มากกว่า Cut-off frequency และหากความถี่มากให้LED ดับ
-ก่อนหน้านี้เราได้สร้างฟิลเตอร์ในMATLABโดยใช้ fdatoolกำหนดฟิลเตอร์เป็น 2nd order IIR Butterworth Low pass filter
กำหนดให้ Sampling frequency = 1000 Hz, Cut-off frequency = 110Hz
ซึ่งได้ค่า num = [ 0.0791, 0.1582, 0.0791] และ den = [ 1, -1.0622, 0.3786]
!!!!!!ปัญหาตอนนี้คือ Codeสามารถรันได้แต่ผลที่ได้ไม่ถูกต้อง แต่เมื่อเราลองลบในส่วนSerial.printทุกตัวที่ไม่ใช่Serial.begin(115200); Codeสามารรันและได้ผลปกติ เป็นเพราะสาเหตุใดคะ!!!!!!
ขอบคุณสำหรับทุกความเห็นล่วงหน้านะคะ
Codeมีปัญหาที่Serial.printมีสาเหตุมาจากอะไรคะ รบกวนขอความเห็นหน่อยค่ะ
int inPin = 0; // voltage connected to analog pin
float x[] = {0, 0, 0}; // input signal
//float x1 = 0;
//float x2 = 0;
float y[] = {0, 0, 0};
int i = 2;
/*float y1 = 0;
float y2 = 0;*/
float g = 0;
float a = 0;
float b = 0;
float xmax = 0;
float xmin = 0;
float ymax = 0;
float ymin = 0;
void setup(){
Serial.begin(115200);
pinMode(inPin,INPUT);
pinMode(13,OUTPUT);
}
void loop() {
unsigned long time = micros(); // Used to track rate
x = (float)analogRead(inPin)*5.0/1023.0; // convert raw data to volt
y = (1.0622*y[i-1])-(0.3786*y[i-2])+(0.0791*x)+(0.1582*x[i-1])+(0.0791*x[i-2]); //Past
if((y[i-1]>y[i-2]) && (y[i-1]>y)){ymax = y[i-1];}
if((y[i-1]<y[i-2]) && (y[i-1]<y)){ymin = y[i-1];}
if((x[i-1]>x[i-2]) && (x[i-1]>x)){xmax = x[i-1];}
if((x[i-1]<x[i-2]) && (x[i-1]<x)){xmin = x[i-1];}
a = xmax-xmin;
b = ymax-ymin;
g = b/a;
if(g>0.707){
digitalWrite(13,HIGH);
}
else{
digitalWrite(13,LOW);
}
y[i-2] = y[i-1]; y[i-1] = y;
x[i-2] = x[i-1]; x[i-1] = x;
Serial.print(x); //Show input blue
Serial.print(", "); //x beteween y
Serial.print(y);
Serial.print(", ");
Serial.println(g);
for(unsigned long up = time+SAMPLEPERIODUS; time > 0 && time < up; time = micros());
}
-โจทย์กำหนดให้LED ติดเมื่อความถี่ไม่มากกว่า Cut-off frequency และหากความถี่มากให้LED ดับ
-ก่อนหน้านี้เราได้สร้างฟิลเตอร์ในMATLABโดยใช้ fdatoolกำหนดฟิลเตอร์เป็น 2nd order IIR Butterworth Low pass filter
กำหนดให้ Sampling frequency = 1000 Hz, Cut-off frequency = 110Hz
ซึ่งได้ค่า num = [ 0.0791, 0.1582, 0.0791] และ den = [ 1, -1.0622, 0.3786]
!!!!!!ปัญหาตอนนี้คือ Codeสามารถรันได้แต่ผลที่ได้ไม่ถูกต้อง แต่เมื่อเราลองลบในส่วนSerial.printทุกตัวที่ไม่ใช่Serial.begin(115200); Codeสามารรันและได้ผลปกติ เป็นเพราะสาเหตุใดคะ!!!!!!
ขอบคุณสำหรับทุกความเห็นล่วงหน้านะคะ