วันศุกร์ที่ 12 มิถุนายน พ.ศ. 2558

วันที่19 ที่Fibo

-หา rpm
   -คิดจากการใช้ 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++;
}


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

แสดงความคิดเห็น