Posted on May 24, 2012 at 14:47Hi there,
I'm using an L3G4200D sensor for calculating the angle displacement
with the code below. However from the computation I get half of the real rotation
the sensor make, that is, if I rotate it of 90 degree, I measure a 45 degree rotation.
The output data rate is set a 100hz, resolution is 250dps and the BW is set at 12,5Hz.
I realized that I might loose some samples (I don't use interrupts),
but that should not be a problem when rotating at constant speed,
as I always calculate the delta from the last sample.
Any suggestion would be appreciated.
http://geneva.servebeer.com/redmine/projects/opencortex-m/repository/revisions/master/entry/demos/l3g200d-i2c/main.cpp#L117
while
(
1
) {
http://geneva.servebeer.com/redmine/projects/opencortex-m/repository/revisions/master/entry/demos/l3g200d-i2c/main.cpp#L118
http://geneva.servebeer.com/redmine/projects/opencortex-m/repository/revisions/master/entry/demos/l3g200d-i2c/main.cpp#L119
gyroscope.readGyroscopeData(x, y, z);
http://geneva.servebeer.com/redmine/projects/opencortex-m/repository/revisions/master/entry/demos/l3g200d-i2c/main.cpp#L120
http://geneva.servebeer.com/redmine/projects/opencortex-m/repository/revisions/master/entry/demos/l3g200d-i2c/main.cpp#L121
// Data rate is 100Hz, thus T = 0.01s
http://geneva.servebeer.com/redmine/projects/opencortex-m/repository/revisions/master/entry/demos/l3g200d-i2c/main.cpp#L122
uint64_t currentValue = util::currentCounterValue();
http://geneva.servebeer.com/redmine/projects/opencortex-m/repository/revisions/master/entry/demos/l3g200d-i2c/main.cpp#L123
uint32_t delta = currentValue - previousValue;
http://geneva.servebeer.com/redmine/projects/opencortex-m/repository/revisions/master/entry/demos/l3g200d-i2c/main.cpp#L124
timeElapsed = (
float
)delta /
1000000
;
http://geneva.servebeer.com/redmine/projects/opencortex-m/repository/revisions/master/entry/demos/l3g200d-i2c/main.cpp#L125
http://geneva.servebeer.com/redmine/projects/opencortex-m/repository/revisions/master/entry/demos/l3g200d-i2c/main.cpp#L126
previousValue = currentValue;
http://geneva.servebeer.com/redmine/projects/opencortex-m/repository/revisions/master/entry/demos/l3g200d-i2c/main.cpp#L127
http://geneva.servebeer.com/redmine/projects/opencortex-m/repository/revisions/master/entry/demos/l3g200d-i2c/main.cpp#L128
/* Convert data to dps */
http://geneva.servebeer.com/redmine/projects/opencortex-m/repository/revisions/master/entry/demos/l3g200d-i2c/main.cpp#L129
if
((x - x0) > kThreshold || (x - x0) < -kThreshold)
http://geneva.servebeer.com/redmine/projects/opencortex-m/repository/revisions/master/entry/demos/l3g200d-i2c/main.cpp#L130
wxz = (x - x0) *
0
.00875
;
http://geneva.servebeer.com/redmine/projects/opencortex-m/repository/revisions/master/entry/demos/l3g200d-i2c/main.cpp#L131
else
http://geneva.servebeer.com/redmine/projects/opencortex-m/repository/revisions/master/entry/demos/l3g200d-i2c/main.cpp#L132
wxz =
0
;
http://geneva.servebeer.com/redmine/projects/opencortex-m/repository/revisions/master/entry/demos/l3g200d-i2c/main.cpp#L133
http://geneva.servebeer.com/redmine/projects/opencortex-m/repository/revisions/master/entry/demos/l3g200d-i2c/main.cpp#L134
if
((y - y0) > kThreshold || (y - y0) < -kThreshold)
http://geneva.servebeer.com/redmine/projects/opencortex-m/repository/revisions/master/entry/demos/l3g200d-i2c/main.cpp#L135
wyz = (y - y0) *
0
.00875
;
http://geneva.servebeer.com/redmine/projects/opencortex-m/repository/revisions/master/entry/demos/l3g200d-i2c/main.cpp#L136
else
http://geneva.servebeer.com/redmine/projects/opencortex-m/repository/revisions/master/entry/demos/l3g200d-i2c/main.cpp#L137
wyz =
0
;
http://geneva.servebeer.com/redmine/projects/opencortex-m/repository/revisions/master/entry/demos/l3g200d-i2c/main.cpp#L138
http://geneva.servebeer.com/redmine/projects/opencortex-m/repository/revisions/master/entry/demos/l3g200d-i2c/main.cpp#L139
if
((z - z0) > kThreshold || (z - z0) < -kThreshold)
http://geneva.servebeer.com/redmine/projects/opencortex-m/repository/revisions/master/entry/demos/l3g200d-i2c/main.cpp#L140
wxy = (z - z0) *
0
.00875
;
http://geneva.servebeer.com/redmine/projects/opencortex-m/repository/revisions/master/entry/demos/l3g200d-i2c/main.cpp#L141
else
http://geneva.servebeer.com/redmine/projects/opencortex-m/repository/revisions/master/entry/demos/l3g200d-i2c/main.cpp#L142
wxy =
0
;
http://geneva.servebeer.com/redmine/projects/opencortex-m/repository/revisions/master/entry/demos/l3g200d-i2c/main.cpp#L143
http://geneva.servebeer.com/redmine/projects/opencortex-m/repository/revisions/master/entry/demos/l3g200d-i2c/main.cpp#L144
xz += (wxz * timeElapsed);
http://geneva.servebeer.com/redmine/projects/opencortex-m/repository/revisions/master/entry/demos/l3g200d-i2c/main.cpp#L145
yz += (wyz * timeElapsed);
http://geneva.servebeer.com/redmine/projects/opencortex-m/repository/revisions/master/entry/demos/l3g200d-i2c/main.cpp#L146
xy += (wxy * timeElapsed);
http://geneva.servebeer.com/redmine/projects/opencortex-m/repository/revisions/master/entry/demos/l3g200d-i2c/main.cpp#L147
http://geneva.servebeer.com/redmine/projects/opencortex-m/repository/revisions/master/entry/demos/l3g200d-i2c/main.cpp#L148
sprintf(bufferOut,
''
#wxz=%+f wyz=%+f wxy=%+f xz=%+f yz=%+f xy=%+f
\n
''
,
http://geneva.servebeer.com/redmine/projects/opencortex-m/repository/revisions/master/entry/demos/l3g200d-i2c/main.cpp#L149
wxz, wyz, wxy, xz, yz, xy);
http://geneva.servebeer.com/redmine/projects/opencortex-m/repository/revisions/master/entry/demos/l3g200d-i2c/main.cpp#L150
trace(bufferOut);
http://geneva.servebeer.com/redmine/projects/opencortex-m/repository/revisions/master/entry/demos/l3g200d-i2c/main.cpp#L151
http://geneva.servebeer.com/redmine/projects/opencortex-m/repository/revisions/master/entry/demos/l3g200d-i2c/main.cpp#L152
gpioPortC.toggle(GPIO::ePin12);
http://geneva.servebeer.com/redmine/projects/opencortex-m/repository/revisions/master/entry/demos/l3g200d-i2c/main.cpp#L153
/* Sensor data rate is set at 100Hz. */
http://geneva.servebeer.com/redmine/projects/opencortex-m/repository/revisions/master/entry/demos/l3g200d-i2c/main.cpp#L154
//util::delayms(1);
http://geneva.servebeer.com/redmine/projects/opencortex-m/repository/revisions/master/entry/demos/l3g200d-i2c/main.cpp#L155
}
http://geneva.servebeer.com/redmine/projects/opencortex-m/repository/revisions/master/entry/demos/l3g200d-i2c/main.cpp#L156