Robofun 機器人論壇

 找回密碼
 申請會員
搜索
熱搜: 活動 交友 discuz
查看: 8055|回復: 9
打印 上一主題 下一主題

計時器歸零 疑問

[複製鏈接]
跳轉到指定樓層
1#
發表於 2012-8-7 14:05:37 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
可以請教一下 我要讓 millis() 這指令的計時器歸零,該輸入什麼指令或者使用其他方法?
2#
發表於 2012-8-7 19:50:14 | 只看該作者
好像沒這功能哩
因為這個指令是取arduino 開始執行程式以後到底經過多少millis
或是可以按reset呢?
3#
 樓主| 發表於 2012-8-7 20:40:52 | 只看該作者
那如果我要用中斷的方式
在一個固定時間內
計算 總共接收到多少個 pulse
可以教學一下 程式碼要如何打嗎
------------------------------------------------
中斷的部分 就可以了 謝謝
4#
發表於 2012-8-7 22:23:32 | 只看該作者
多少 pulse ?
pulse 的長相是怎樣?
5#
 樓主| 發表於 2012-8-8 14:27:13 | 只看該作者
馬達轉動 經過 光遮斷器後所產生的信號
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 ;
  }
  
}
6#
發表於 2012-8-8 15:33:07 | 只看該作者
var = digitalRead(encoderPin);
  if (var != var2 )
  {
    time = millis();
    pulse = pulse +1 ;
    var2 = var;
  }
這段看起來是想要抓HIGH的時間?
改成time= pulseIn(encoderPin, HIGH);
就可直接取得SENSOR 在HIGH的時間有多少 (in microseconds)
7#
 樓主| 發表於 2012-8-10 13:43:13 | 只看該作者
版主你好
我有嘗試用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);
}
8#
 樓主| 發表於 2012-8-13 13:56:09 | 只看該作者
還是 可以 輸入哪個指令 讓程式 RESET呢?
9#
發表於 2012-8-13 21:57:16 | 只看該作者
應該說...得先瞭解你的硬體和接線
很多時候這誤差很大很大的
一組一百的編碼器和一組幾千上萬的等級也會有很大差別
10#
發表於 2012-9-27 23:23:46 | 只看該作者
回復 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 ;
  }
------------------------
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

小黑屋|手機版|Archiver|機器人論壇 from 2005.07

GMT+8, 2025-1-31 18:52 , Processed in 0.488925 second(s), 7 queries , Apc On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表