Robofun 機器人論壇

標題: 計時器歸零 疑問 [打印本頁]

作者: a743304    時間: 2012-8-7 14:05
標題: 計時器歸零 疑問
可以請教一下 我要讓 millis() 這指令的計時器歸零,該輸入什麼指令或者使用其他方法?
作者: mzw2008    時間: 2012-8-7 19:50
好像沒這功能哩
因為這個指令是取arduino 開始執行程式以後到底經過多少millis
或是可以按reset呢?
作者: a743304    時間: 2012-8-7 20:40
那如果我要用中斷的方式
在一個固定時間內
計算 總共接收到多少個 pulse
可以教學一下 程式碼要如何打嗎
------------------------------------------------
中斷的部分 就可以了 謝謝
作者: mzw2008    時間: 2012-8-7 22:23
多少 pulse ?
pulse 的長相是怎樣?
作者: a743304    時間: 2012-8-8 14:27
馬達轉動 經過 光遮斷器後所產生的信號
pulse 已經可以抓到了
現在想把 抓到固定pulse 後的時間 抓出來計算再轉換成 RPM
我有用 millis() 指令下去跑 可是出來的 RPM 有點不準
所以才想說 用 中斷的方式 可是對中斷不熟
附上我得程式 請版主 幫忙看一下囉
-------------------------------------------------------------------------------
int encoderPin = 2;
int pulse = 0;
int var ;
int var2 = 0;
unsigned long time ;
unsigned long time2 = 0 ;
double rpm ;
void setup()
{
  Serial.begin(9600);
  pinMode(encoderPin,INPUT);
  pinMode(13,OUTPUT);
}
void loop()
{
  var = digitalRead(encoderPin);
  if (var != var2 )
  {
    time = millis();
    pulse = pulse +1 ;
    var2 = var;
  }
  
  if (pulse == 241)
  {
    unsigned long time3  ;
    time3 = time - time2 ;
    rpm = 1200000/ time3   ;
    Serial.print("rpm:") ;
    Serial.println(rpm);
    pulse = 0;
    time2 = time ;
  }
  
}
作者: mzw2008    時間: 2012-8-8 15:33
var = digitalRead(encoderPin);
  if (var != var2 )
  {
    time = millis();
    pulse = pulse +1 ;
    var2 = var;
  }
這段看起來是想要抓HIGH的時間?
改成time= pulseIn(encoderPin, HIGH);
就可直接取得SENSOR 在HIGH的時間有多少 (in microseconds)
作者: a743304    時間: 2012-8-10 13:43
版主你好
我有嘗試用pulseIn() 這功能,可是在馬達轉速固定之下
讀出來的時間 卻會有很大的差異
不知道是哪邊有問題
請版主 幫我看一下囉
---------------------------------------------------------
int encoderPin = 2;
int var;
unsigned long time ;
double rpm ;
void setup()
{
  Serial.begin(9600);
  pinMode(encoderPin,INPUT);
  pinMode(13,OUTPUT);
}
void loop()
{
  var = digitalRead(encoderPin);
  time = pulseIn(encoderPin,HIGH,3000000);
    unsigned long time3 ;
    time3 = time *4 *6 ;
    rpm = 60000000/ time3   ;
    Serial.print("time:") ;
    Serial.println(time3);
    Serial.print("rpm:") ;
    Serial.println(rpm);
}
作者: a743304    時間: 2012-8-13 13:56
還是 可以 輸入哪個指令 讓程式 RESET呢?
作者: mzw2008    時間: 2012-8-13 21:57
應該說...得先瞭解你的硬體和接線
很多時候這誤差很大很大的
一組一百的編碼器和一組幾千上萬的等級也會有很大差別
作者: Curtiss    時間: 2012-9-27 23:23
回復 5# a743304

好像有辦法可以歸零,搜尋 millis() reset 可以找到,但據說會有其他不可預期的影響,因為有其他的函式會使用 millis()。
rpm 不準確,可能是程式的問題。有疑問的地方有兩個:
1. 這一段程式是遇到脈波的上升端與下降端都令 pusle 加 1
------------------------
  if (var != var2 )
  {
    time = millis();
    pulse = pulse +1 ;
    var2 = var;
  }
------------------------
如果脈波寬度不大,可能會偵測不到上升端或下降端。建議先使用示波器看一下脈波寬度大約是多少。

2. 因為不知道馬達轉一圈會有幾個脈波,無法確定這段程式是否正確。如果只有一個光遮斷器,計算方法就不對了。
------------------------  
  if (pulse == 241)
  {
    unsigned long time3  ;
    time3 = time - time2 ;
    rpm = 1200000/ time3   ;
    Serial.print("rpm:") ;
    Serial.println(rpm);
    pulse = 0;
    time2 = time ;
  }
------------------------




歡迎光臨 Robofun 機器人論壇 (https://robofun.net/forum/) Powered by Discuz! X3.2