Robofun 機器人論壇

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

ADXL330數值更精準

[複製鏈接]
跳轉到指定樓層
1#
發表於 2011-9-22 23:31:59 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
最近剛碰ADXL330不久..
這是我的程式碼...有辦法讓他輸出來的值
更精準嗎...

還有如何用程式抓出他的數值出來做判別...

const int groundpin = 18;            
const int powerpin = 19;              
const int xpin = A3;                  
const int ypin = A2;                  
const int zpin = A1;                  

void setup()
{

  Serial.begin(9600);


  pinMode(groundpin, OUTPUT);
  pinMode(powerpin, OUTPUT);
  digitalWrite(groundpin, LOW);
  digitalWrite(powerpin, HIGH);
}

void loop()
{

   Serial.print("X = ");Serial.print(analogRead(xpin));


  Serial.print("Y = ");Serial.print(analogRead(ypin));


  Serial.println("Z = ");Serial.print(analogRead(zpin));

  Serial.println();

  delay(100);
}
nichal 該用戶已被刪除
2#
發表於 2011-9-23 10:22:49 | 只看該作者
試著把analogRead(?pin)所得到的資料
累加十次後再除以十
得到的數據再print出來看看
如果這樣用的話可以把delay縮短一點

原理是利用均化去抑制雜訊
順便提高一下數據解析度
但是會犧牲一點點採樣頻寬
試試看就知道囉!!
3#
發表於 2011-9-23 22:11:01 | 只看該作者
比如你的ADC是10bits的,出來的值為0~1023。
你可以把讀到的值乘以16(左移4bits),然後假設這後4bits是量化誤差。
然後參入+-2bits的隨機誤差(+-4)後加入LPF或用平均移動濾波。

基本上可以提高2.Xbits的解析度(理想為4bits),若是無法提升取樣速度,這種方式會降低信號頻寬。
若是用平均移動濾波,平均的長度不宜太大,若以上面nichal大大的取n=10,會降到取樣頻率的1/20左右(大約)。

比較理論的推導在這,內容不難,如果學過信號處理就很容易理解
http://ww1.microchip.com/downloa ... mpling%2001152A.pdf
4#
 樓主| 發表於 2011-9-24 23:22:58 | 只看該作者
那如果要寫程式抓出裡面數值的話..
大概要重哪些方面下手 才能抓出serial monitor裡面的數值下來判別

=____=我是ARDUINO與三軸新手...
請各位大大指導我一下謝謝~
5#
發表於 2011-9-24 23:56:19 | 只看該作者
我不懂ARDUINO,不過單就程式碼來看不是已經能在終端機看到三軸加速度的ADC值。
ADXL330的1g是0.3V,中點電壓是0.5VCC

如果VCC是3.3V,中點電壓在1.65V,如果你的Sensor水平放置,應該是在1.85V。
以1.85V來說,假設你的ADC是10bits@3.3V,那就是1850/(3300/1024)=574;
在減掉中點電壓的ADC值 574-512 = 62 => 1g,所以各軸運動過程中(ADC值-512)/62就是各軸的g值。
但因為一般ADC的電源多是直接跟板上電源一起,所以這個值不會準,要實際校正。

還有這樣能解析到1/62=0.016g,這樣的解析度其實有點差,如果頻寬許可,就可以用上面的方式再增加解析度。
6#
 樓主| 發表於 2011-9-25 12:07:54 | 只看該作者
//  變數設定
double X,Y,Z //轉到正確XYZ的G值
double SMA; // SMA = abs(x)+abs(y)+abs(z)
int Xread,Yread,Zread; //  讀入XYZ的值
int Xinput = 1; // X軸的腳point位子
int Yinput = 3; // Y軸的腳point位子
int Zinput = 5; // Z軸的腳point位子
int Xref = ; // X  軸的偏差校正參數
int Yref = ; // Y  軸的偏差校正參數
int Zref = ; // Z  軸的偏差校正參數
void setup()   //板子鮑率,指一秒傳送9600bits。
{   Serial.begin(9600); }
void loop()
{  //  將 XYZ 軸的值求得
Xread = analogRead(Xinput-Xref);
Yread = analogRead(Yinput-Yref);
Zread = analogRead(Zinput-Zref);
// SMA值計算
X=X*X; Y=Y*Y;   Z=Z*Z;
SMA = X+Y+Z;
//  設定SMA數據的型態,取到小數點後兩位。
printDouble(SMA,2);
delay(5); //  要等待5m秒後再執行。
}
這是我朋友給我的另一組程式碼
只是他也不清楚位啥double SMA; 老是出問題...
是語法錯誤還是怎樣...
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-5-4 11:37 , Processed in 0.280959 second(s), 8 queries , Apc On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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