2012-06-19 07:50 AM
hi, everyone. i don't understand why the output data XH,XL. is unchange all the time , when i read the status_reg, i find that there is no new data coming ..and sometimes the same code gave me different output ,like the data is keep changing but totally wrong, even my board is stastic on the table, but the output gives me thousands of degrees bias. i really confusing., any one can help me ?
here is a part of my output part1: GYRO_XH [1] GYRO_XL: [5] GYRO_XH [fffffff5] GYRO_XL: [c7] GYRO_XH [ffffff80] GYRO_XL: [0] GYRO_XH [ffffffff] GYRO_XL: [f3] GYRO_XH [fffffffd] GYRO_XL: [ef] GYRO_XH [ffffffe8] GYRO_XL: [74] GYRO_XH [ffffffff] GYRO_XL: [ba] part2: GYRO_XH: [ffffffff] GYRO_XL: [e6] GYRO_X: [ffffffe6] GYRO_X2: [-26] //2's complement always -26 GYRO_XH: [ffffffff] GYRO_XL: [e6] GYRO_X: [ffffffe6] GYRO_X2: [-26] very urgent ,many thanks for any help, #gyro-lsm330dl2012-06-20 09:43 AM
The numbers are already in two complement form, testing the sign and multiplying by -1 makes no sense to me.
GYRO_X = GYRO_XH<<8 | GYRO_XL; //16-bits, XH followed by XL printf(''\r\nGYRO_X: [%x] '',GYRO_X); printf(''\r\nGYRO_X2: [%d] '',GYRO_X); GYRO_Xfold = GYRO_Xf; GYRO_Xf = ((float)GYRO_X * (70.0 / 1000.0)) - GYRO_Xbias + GYRO_XbiasOffset; //divide the gyro values by 70 to get degrees per second GYRO_XmaArray[GYRO_MA_Index] = GYRO_Xf; printf(''\r\nGYRO_Xf1: [%f] '',GYRO_Xf); I'd probably hold GYRO_XH and GYRO_XL as uint16_t Further I would mask the data bits return uint16_t GYRO_ReadByte(uint16_t HalfWord) { uint16_t temp; HalfWord = HalfWord << 8; HalfWord |= 0x8000; GYRO_CS_LOW(); while (SPI_I2S_GetFlagStatus(GYRO_SPI, SPI_I2S_FLAG_TXE) == RESET); SPI_I2S_SendData(GYRO_SPI, HalfWord); while (SPI_I2S_GetFlagStatus(GYRO_SPI, SPI_I2S_FLAG_RXNE) == RESET); temp = SPI_I2S_ReceiveData(GYRO_SPI) & 0xFF; // should mask the data bits GYRO_CS_HIGH(); return temp; } I don't know enough about the device, or have one to test, to provide a working example.2012-06-20 09:37 PM
i change the code as u say, but sometimes i still got this GYRO_XH[ffffffff]. confusing..
now when i put the board stastic on the table, the output value are between ±1 degree .GYRO_X_D1[0.00] GYRO_X_D[0.04]
GYRO_XH[0] GYRO_XL[4] GYRO_X2[4] GYRO_X_D1[0.04] GYRO_X_D[0.15] GYRO_XH[0] GYRO_XL[5] GYRO_X2[5] GYRO_X_D1[0.15] GYRO_X_D[0.33] GYRO_XH[0] GYRO_XL[3] GYRO_X2[3] GYRO_X_D1[0.33] GYRO_X_D[0.48] GYRO_XH[0] GYRO_XL[0] GYRO_X2[0] GYRO_X_D1[0.48] GYRO_X_D[0.54] GYRO_XH[0] GYRO_XL[2] GYRO_X2[2] GYRO_X_D1[0.54] GYRO_X_D[0.58] GYRO_XH[ffffffff] GYRO_XL[ff] GYRO_X2[-1] GYRO_X_D1[0.58] GYRO_X_D[0.60] GYRO_XH[ffffffff] GYRO_XL[fb] GYRO_X2[-5] GYRO_X_D1[-0.04] GYRO_X_D[-0.14] GYRO_XH[0] GYRO_XL[4] GYRO_X[4] GYRO_X2[4] GYRO_X_D1[-0.14] GYRO_X_D[-0.16] GYRO_XH[0] GYRO_XL[1] GYRO_X2[1] GYRO_X_D1[-0.16] GYRO_X_D[-0.06]is it normal? or i need to care the zero tolerance?
when i turn it 90 degrees, it still shows like arround -7, and ,when i turn it back, the degree doesn't follow to change back, but i observe the angular rate seems change correctly. GYRO_XH[ffffffff] GYRO_XL[fa] GYRO_X[fffffffa] GYRO_X2[-6] GYRO_X_D[-0.31] GYRO_XH[0] GYRO_XL[b] GYRO_X2[11] GYRO_X_D[-0.21] GYRO_XH[fffffffc] GYRO_XL[b8] GYRO_X[fffffcb8] GYRO_X2[-840] GYRO_X_D[-16.19] GYRO_XH[0] GYRO_XL[3c] GYRO_X[3c] GYRO_X2[60] GYRO_X_D[-31.22] GYRO_XH[ffffffff] GYRO_XL[fc] GYRO_X[fffffffc] GYRO_X2[-4] GYRO_X_D[-30.14] GYRO_XH[0] GYRO_XL[6] GYRO_X[6] GYRO_X2[6] GYRO_X_D[-30.10] i think my integration part is correct, there is something wrong with data read frequency? or my define value for registers?2012-06-20 11:33 PM
At the first glance, the data seem plausible.
You should keep in mind that this MEMS are mechanical systems with analog/digital interface electronics, you will always have some noise and some bias. In comparision to full scale, this values seem normal. Having the interface to this sensor finished is the first step. I would definitely implement a zero point calibration, and observe the drift behavior. If you read the accelerometer data (coming back to this topic), you should read a value that evaluates to 1g for an axis aligned downwards. That value should turn negative (i.e. factor -1) if flipping over. To use the gyro data for integration, you will certainly need a constant sampling rate, i.e. read your sensor at regulat intervalls. A suggestion: To make up a short int from two byte, you can use a union. Something like:union {
uint8_t bytes[2];
int16_t sensorvalue;
};
Just write the high/low byte from the gyro in the correct order in (observe endianess), and read out the value - no need to do any conversion.
2012-06-21 03:21 AM
is theconstant sampling rate same as output data rate?cause i didn't see sampling rate in the PDF.
About the zero calibration, are u talking about the typical zero-rate level? cause i choose 2000dps, so is it no need to care about it? another question.how toread sensor at regulat intervalls? i'm the first time dealling with gyro. so a lot of puzzles. i attached the PDF ________________ Attachments : ST_lsm330dl_.pdf : https://st--c.eu10.content.force.com/sfc/dist/version/download/?oid=00Db0000000YtG6&ids=0680X000006HtVP&d=%2Fa%2F0X0000000aQy%2F6PYiIZ9cW12mslWJhw2Vnmv1CJc8NF4wc2.2MJPHL8Y&asPdf=false2012-06-21 04:30 AM
And I'm dealing the first time with this LSM330 device.
But it is similiar to other gyro/accelerometer, and even more similiar to other ST MEMS. As I recall, you have to configure a device-internal sampling rate anyway. In the datasheet, it is mentioned as Data Rate. You can use the interrupt capability of the device, i.e. connect the interrupt outputs to a GPIO, configure an interrupt-on-change, and thus read data when new are available.About the zero calibration, are u talking about the typical zero-rate level? cause i choose ..Just put the device on the table and don't move, while measuring. You will see a non-zero output for all axes, that changes with temperature. If you can live with that, it's ok - it depends on your application. If the application is an IMU, this is usually done when installed in the vehicle. For something like a mobile phone, it is probably irrelevant...
2012-06-21 05:31 PM
2012-06-22 01:15 AM
2012-06-22 03:10 AM
If you code from the first post is still valid in this case :
#define GYRO_VALUE_CTRL_REG4 0xA0 //DISCONTINUES UPDATE#F0, LITTLE ENDIAN. 2000 DPS, 4-WIRE This might be a little much. Try the smallest value of 250dps. which output rate should i use ?This is not the output rate, but the full scale value, i.e. the value your GYRO_<n> values are scaled to. 2000 means, the SHORT_MAX value (32767) equals a rate of 2000 degree per second. That would mean, in this range you can measure rotation rates of up to 5.5 turns per second. Since I don't know the application, I can't comment on that. For balancing a robot, this seems quite a lot.
2012-06-22 03:52 AM
...may i have ur email address whoever is farmiar...
I would hesitate to reveal my mail address here publicly, there are some trolls around.now i'm doing a project which needs to write a gyro software that provides degree readout .this will be used on the robot to keep it balance.
Sound like a project in the educational field, like an university. There are several papers and examples around, just include the search words IMU and kalman filter. That examples will probably not include code for the LSM330. That sensor seems relatively new, and more targeted to the mobile phone/device market. And it would be too simple, then ...
2012-06-22 04:04 AM
i changed to 250dps and printf some part of data when i slowly turn 90 degrees ,and then i turn it back to 90 degrees. it only shows me aroud 4 degrees, the sign also don't follow
it seems that the output data from gyro is too small,
i find that when i slowly turn the board, the degree sometimes don't change, or change very few. no matter how much i turn.
and when the output is being added to a degree, it's hard to change back