Robofun 機器人論壇
標題:
ADXL330數值更精準
[打印本頁]
作者:
jtr1106
時間:
2011-9-22 23:31
標題:
ADXL330數值更精準
最近剛碰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
時間:
2011-9-23 10:22
試著把analogRead(?pin)所得到的資料
累加十次後再除以十
得到的數據再print出來看看
如果這樣用的話可以把delay縮短一點
原理是利用均化去抑制雜訊
順便提高一下數據解析度
但是會犧牲一點點採樣頻寬
試試看就知道囉!!
作者:
g921002
時間:
2011-9-23 22:11
比如你的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
作者:
jtr1106
時間:
2011-9-24 23:22
那如果要寫程式抓出裡面數值的話..
大概要重哪些方面下手 才能抓出serial monitor裡面的數值下來判別
=____=我是ARDUINO與三軸新手...
請各位大大指導我一下謝謝~
作者:
g921002
時間:
2011-9-24 23:56
我不懂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,這樣的解析度其實有點差,如果頻寬許可,就可以用上面的方式再增加解析度。
作者:
jtr1106
時間:
2011-9-25 12:07
// 變數設定
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; 老是出問題...
是語法錯誤還是怎樣...
歡迎光臨 Robofun 機器人論壇 (https://robofun.net/forum/)
Powered by Discuz! X3.2