-คิดจากการใช้ millis 100ms ว่า interrup กี่ครั้งแล้วนำมา คูณกับ10องศา แล้วหาร 360องศาจะได้รอบ
-พอได้รอบแล้วเอาเวลา 100ms มาหารรอบแล้วไปคูณกับ60 จะได้ rpm
-ปัญหา
-สูตรการคำนวนที่ทำมีความผิดพลาดทำให้ rpm ไม่ตรงความจริง
-rpm ไม่กลับไปsetค่า0
-ค่าที่อ่าน อ่านจำนวนเต็มไม่ได้ค่าจะผิดพลาด ต้องอ่านเป็นค่าทศนิยมจึงมีความใกล้เคียง
ตัวอย่างโค้ด
int ledPin = 9; // LED connected to digital pin 9
float time1 = 0.0;
float time2 = 0.0;
float s=0.0;
float counter = 0.0;
float j = 0.0;
float k=0.0;
float rpm=0.0;
unsigned long Cur_time=0;
unsigned long Prev_time=0;
void setup() {
Serial.begin(9600);
attachInterrupt(0,Millis,RISING);
//LOW to trigger the interrupt whenever the pin is low,
//CHANGE to trigger the interrupt whenever the pin changes value
//RISING to trigger when the pin goes from low to high,
//FALLING for when the pin goes from high to low.
pinMode(ledPin, OUTPUT); //PWM
pinMode(7,OUTPUT);
pinMode(8,OUTPUT);
analogWrite(ledPin, 40); // analogWrite values from 0 to 255
digitalWrite(7,HIGH);
digitalWrite(8,LOW);
}
void loop() {
Cur_time = millis();
int s = Cur_time-Prev_time;
if(s >= 100)
{
j = (counter*10.0)/360.0;
k = j/(s*0.001);
rpm = k*60.0; //rpm
Serial.print("rpm:"); Serial.print(rpm); Serial.println("\t");
counter=0;
Prev_time = Cur_time;
}
}
void Millis()
{
counter++;
}
-และได้โจทย์ใหม่มา ส่งserial ไปแล้วค่าPWM เปลี่ยนความเร็วมอเตอร์เปลี่ยนไปและต่อไปจะเป็นการควบคุมPID และได้ทดลองเขียนserial แต่ยังส่งได้แค่ครั้งเดียว
-ส่ง50ไปมันทำงานแค่ครั้งเดียวยังไม่ทำงานแบบยาวๆทำให้กำลังหาวิธีแก้ไข้ปัญหาตรงนี้ให้ได้
โค้ดตัวอย่าง
int ledPin = 9; // LED connected to digital pin 9
int valum = 1;
float time1 = 0.0;
float time2 = 0.0;
float s=0.0;
float counter = 0.0;
float j = 0.0;
float k=0.0;
float rpm=0.0;
unsigned long Cur_time=0;
unsigned long Prev_time=0;
void setup() {
Serial.begin(9600);
attachInterrupt(0,Millis,RISING);
//LOW to trigger the interrupt whenever the pin is low,
//CHANGE to trigger the interrupt whenever the pin changes value
//RISING to trigger when the pin goes from low to high,
//FALLING for when the pin goes from high to low.
pinMode(ledPin, OUTPUT); //PWM
digitalWrite(7,HIGH);
digitalWrite(8,LOW);
}
void loop()
{
int latter = Serial.read();
analogWrite(ledPin,latter);
Cur_time = millis();
int s = Cur_time-Prev_time;
if(s >= 100)
{
j = (counter*10.0)/360.0;
k = j/(s*0.001);
rpm = k*60.0; //rpm
Serial.print("rpm:"); Serial.print(rpm); Serial.println("\t");
counter=0;
Prev_time = Cur_time;
}
latter=latter;
}
void Millis()
{
counter++;
}


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