Robofun 機器人論壇

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

用ARDUINO計算IDG500 GYRO角度

[複製鏈接]
跳轉到指定樓層
1#
發表於 2011-10-7 23:53:33 | 顯示全部樓層 回帖獎勵 |倒序瀏覽 |閱讀模式
這位大大好:   我想請問一下 我想用GYRO來計算角度值精準度不用到0.X度,但是我寫完之後發現他都會有誤差可以請大大幫忙看一下嗎??
小弟還是很~~新的新手,寫的很奇怪請見諒。麻煩請指點一下
unsigned char X45input = A0;                  
unsigned char VREFinput= A1;                  
int X45read,VREFread,AN;   
int X45 = 0.00,MAX=0.00;
float VREF = 0.00;
float angle=0;
long timer,timer1;
void setup() {
    Serial.begin(9600);                     
    delay(1000);             //等待GYRO準備好 20ms 但保險我直接用1秒
    timer = millis();        //紀錄時間
}

void loop() {
  X45read  = analogRead(X45input);                   // 將 X45  的輸入電壓存到所設定的變數
  VREFread = analogRead(VREFinput);                  // 將 VREF 的輸入電壓存到所設定的變數
  VREF = 1.35*1024/VREFread;                         //計算參考電位為多少 利用gyro本分的vref反推
  X45 = (X45read*VREF)*100/1024;                      //計算adc轉換後的電壓 只計算到小數第2位因此我*100
if(X45 > MAX && X45 > 135)                           //抓取傳回值的最大值在進行運算
    MAX = X45;
else if(X45 < MAX && X45 < 135)                      //抓取傳回值的最小值在進行運算   擔心auto zero
    MAX = X45;
else
{
    angle += ((X45 - 135)/0.91)*(millis() - timer)/400;      //計算角度 400我用測的...理論因該為1000
    timer = millis();                                       
    MAX = 135;
}
  if(millis() - timer1 > 1000)                                //每一秒判斷角度目前的誤差
  {
      if(abs(angle) < 1)                                       //靜態狀態下 若小於1 清除目前的角度值
         angle = 0;
      else                                             
      {
         AN += angle;                                          //反之則輸出確認角度
         angle = 0;
      }
      timer1 = millis();
  }
  Serial.print(" ");   Serial.print(MAX);   Serial.print(9,BYTE);
  Serial.print(" ");  Serial.print(AN);  Serial.println();  
}
2#
 樓主| 發表於 2011-10-8 13:26:01 | 顯示全部樓層
各位大大好,昨天到arduino的網站找到一份gyro的程式,我以他的方式修改成我可以用的之後發現度數轉90度卻只有20度可以請大大幫我看一下嗎...
int X45input = A0;                  
int VREFinput= A1;                  
float gyroV = 5;
float gyroZ = 1.35;
float gyroS =0.0091;
float rotationThreshold = 0.6;
float angle = 0;
void setup() {
    Serial.begin(9600);                     
    delay(20);             //等待GYRO準備好 20ms
}
void loop() {
    float Vref = (1.35*1023)/analogRead(VREFinput);
    float gyroRate = (analogRead(X45input) * Vref) /1023;
    gyroRate -=gyroZ;
    gyroRate /= gyroS;
    if(gyroRate >= rotationThreshold || gyroRate <= -rotationThreshold)
    {
      gyroRate /=50;
      angle += gyroRate;
    }
    Serial.print(" ");  Serial.print(angle);  Serial.println();
    delay(20);
}
3#
 樓主| 發表於 2011-10-9 14:24:07 | 顯示全部樓層
感謝V大的回應
這兩張圖我都嘗試過了讀值也很正確0.0
但是依然沒辦法好好控制
此外我以2.6秒轉90度 用估計計算大約他會輸出1.6V左右
但他卻只有1.4V輸出~
我不知怎麼用了 請大大開導
4#
 樓主| 發表於 2011-10-16 21:25:40 | 顯示全部樓層
感謝v大的回覆
   我照v大的方式跑之後,發現他再靜態時會一直加上去.....
目前接線
   A0     <----> XOUT;
   3.3V  <----> VCC;
  GND   <----> GND;
因為ARDUINO的參考電壓為3.3V 因此我參考電壓改成3.3
請問要怎麼用呢??
5#
 樓主| 發表於 2011-10-17 18:09:50 | 顯示全部樓層
感謝V大一直幫我!!
V大我用了你的方式後依然沒辦法....以下是RUN之後的一小部分
-29104
-13352
2400
17652
-32632
-16880
-1128
14624
29876
-19908
-4156
11596
27348
-22436
-6684
9068
24820
這是在靜態時測試的,請v大看一下
6#
 樓主| 發表於 2011-10-17 18:16:35 | 顯示全部樓層
剛沒看清楚V大少加一行電壓轉換,這是測試之後的結果

1.35        -241
1.35        -241
1.35        -241
1.35        -243
1.35        -245
1.35        -247
1.35        -249
1.34        -253
1.35        -255
1.35        -257
1.35        -259
1.35        -261
1.35        -261
1.35        -263
1.35        -265
1.35        -267
1.35        -267
靜態時的結果 左邊為輸入近來的電壓    右邊為角度0.0
7#
 樓主| 發表於 2011-10-18 14:33:16 | 顯示全部樓層
感謝v大的回應
請問一下
我對於 ZERO-RATE OUTPUT 被四捨五入有些疑問0.0
程式在運算過程中不是先四捨五入後再進行運算嗎??
例如: v = 1.3468     四捨五入 = 1.35
          x = v - 1.35;
          那x不是等於0嗎?
         請大大幫忙解惑~
8#
 樓主| 發表於 2011-10-19 02:25:57 | 顯示全部樓層
本帖最後由 幸福羔羊 於 2011-10-19 02:28 編輯

v大你好,我利用v大前面的程式碼稍微更改了一下,雖然不是很精準在靜態下可以顯示0度
旋轉90度時也大約在那個附近(沒有伺服馬達幫忙旋轉...),一情況還是算理想,但是我有點搞不懂為什麼我
最後累加必須一定得*3倍才會理想請大大幫忙看一下。
此外我想請問...陀螺儀是否可以利用加速儀做補償呢?? 我聽板上的G大說法去查了一下尤拉角 但程度不是我可以理解的程度....
int X45input = A0;                     //X軸腳位
int VREFinput= A1;                     //VREF腳位
float gyroZ = 1.35;                    //AUTOZERO
float gyroS =0.0091;                   //靈敏度
float rotationThreshold = 0.6;         //靜態誤差區間
float angle = 0;                       
long timer;
void setup() {
    Serial.begin(9600);                     
    delay(20);             //等待GYRO準備好 20ms
    timer = millis();
}
void loop() {
    float Vref = (1.35*1023)/analogRead(VREFinput);      //計算ARDUINO的參考電位
    float gyroRate = (analogRead(X45input) * Vref) /1023;      //轉換X軸電壓     
    gyroRate =(gyroRate-gyroZ)/gyroS;                    //轉換角速度
    if(gyroRate >= rotationThreshold || gyroRate <= -rotationThreshold) 靜態誤差比較
    {
      gyroRate = gyroRate*(millis() - timer)/1000 ;            
      angle += gyroRate*3;                      //累加角度
    }
    timer = millis();
    Serial.print(" ");  Serial.print(angle);  Serial.println();
    delay(20);
}
9#
 樓主| 發表於 2011-10-31 17:33:57 | 顯示全部樓層
其實我都是硬著頭皮寫的,都沒有任何的根據0.0
我想請問v大,再接觸一個感測器時,會不會先對他做一些處理呢??
例如 電路,MATLAB 之類的,因為我都直接接上MCU上
另外想請問互補濾波器是否有相關的資料呢??我網路上查很久都沒有詳細的說明..可否請V大幫忙><

我目前還適用 5 DOF 因為我老師買的,所以我只好用了^^||
10#
 樓主| 發表於 2011-11-3 18:30:44 | 顯示全部樓層
V大的CODE好複雜....我可能要吸收一陣子才行

請問v在上面的數學方程式是中,是如何轉成code的??

以及數學方程式是怎麼呈現的??

以及程式中的變數是怎麼獲得的呢??

如果可以我想看有關於這方面的書籍,可以請v大推薦一下嗎><
11#
 樓主| 發表於 2011-11-5 14:52:33 | 顯示全部樓層
本帖最後由 幸福羔羊 於 2011-11-5 15:08 編輯

v大妳好 我想請問CODE裡面的LSB是什麼呢??網路上查是說最低有效位元,但他是指誰呢?? 請V大幫忙
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-5-12 10:48 , Processed in 0.212109 second(s), 7 queries , Apc On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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