Improved LIS302DL driver and related demos: improved bias and sensitivity handling.

git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@9828 35acf78f-673a-0410-8e92-d51de3d6d3f4
This commit is contained in:
Rocco Marco Guglielmi 2016-09-30 13:26:12 +00:00
parent 5bc8491725
commit e7f3671615
3 changed files with 69 additions and 32 deletions

View File

@ -105,19 +105,23 @@ static msg_t read_raw(void *ip, int32_t axes[LIS302DL_NUMBER_OF_AXES]) {
#if LIS302DL_USE_SPI #if LIS302DL_USE_SPI
osalDbgAssert((((LIS302DLDriver *)ip)->config->spip->state == SPI_READY), osalDbgAssert((((LIS302DLDriver *)ip)->config->spip->state == SPI_READY),
"read_raw(), channel not ready"); "read_raw(), channel not ready");
#if LIS302DL_SHARED_SPI #if LIS302DL_SHARED_SPI
spiAcquireBus(((LIS302DLDriver *)ip)->config->spip); spiAcquireBus(((LIS302DLDriver *)ip)->config->spip);
spiStart(((LIS302DLDriver *)ip)->config->spip, spiStart(((LIS302DLDriver *)ip)->config->spip,
((LIS302DLDriver *)ip)->config->spicfg); ((LIS302DLDriver *)ip)->config->spicfg);
#endif /* LIS302DL_SHARED_SPI */ #endif /* LIS302DL_SHARED_SPI */
for(i = 0; i < LIS302DL_NUMBER_OF_AXES; i++) { for(i = 0; i < LIS302DL_NUMBER_OF_AXES; i++) {
lis302dlSPIReadRegister(((LIS302DLDriver *)ip)->config->spip, lis302dlSPIReadRegister(((LIS302DLDriver *)ip)->config->spip,
LIS302DL_AD_OUT_X + (i * 2), 1, &tmp); LIS302DL_AD_OUT_X + (i * 2), 1, &tmp);
axes[i] = (int32_t)((int8_t)tmp); axes[i] = (int32_t)((int8_t)tmp);
} }
#if LIS302DL_SHARED_SPI #if LIS302DL_SHARED_SPI
spiReleaseBus(((LIS302DLDriver *)ip)->config->spip); spiReleaseBus(((LIS302DLDriver *)ip)->config->spip);
#endif /* LIS302DL_SHARED_SPI */ #endif /* LIS302DL_SHARED_SPI */
#endif /* LIS302DL_USE_SPI */ #endif /* LIS302DL_USE_SPI */
return MSG_OK; return MSG_OK;
} }
@ -222,13 +226,34 @@ static msg_t set_full_scale(void *ip, lis302dl_fs_t fs) {
scale = newfs / ((LIS302DLDriver *)ip)->fullscale; scale = newfs / ((LIS302DLDriver *)ip)->fullscale;
((LIS302DLDriver *)ip)->fullscale = newfs; ((LIS302DLDriver *)ip)->fullscale = newfs;
/* Updating register.*/ #if LIS302DL_USE_SPI
#if LIS302DL_SHARED_SPI
spiAcquireBus(((LIS302DLDriver *)ip)->config->spip);
spiStart(((LIS302DLDriver *)ip)->config->spip,
((LIS302DLDriver *)ip)->config->spicfg);
#endif /* LIS302DL_SHARED_SPI */
lis302dlSPIReadRegister(((LIS302DLDriver *)ip)->config->spip, lis302dlSPIReadRegister(((LIS302DLDriver *)ip)->config->spip,
LIS302DL_AD_CTRL_REG1, 1, &cr); LIS302DL_AD_CTRL_REG1, 1, &cr);
#if LIS302DL_SHARED_SPI
spiReleaseBus(((LIS302DLDriver *)ip)->config->spip);
#endif /* LIS302DL_SHARED_SPI */
#endif /* LIS302DL_USE_SPI */
cr &= ~(LIS302DL_CTRL_REG1_FS_MASK); cr &= ~(LIS302DL_CTRL_REG1_FS_MASK);
cr |= fs; cr |= fs;
#if LIS302DL_USE_SPI
#if LIS302DL_SHARED_SPI
spiAcquireBus(((LIS302DLDriver *)ip)->config->spip);
spiStart(((LIS302DLDriver *)ip)->config->spip,
((LIS302DLDriver *)ip)->config->spicfg);
#endif /* LIS302DL_SHARED_SPI */
lis302dlSPIWriteRegister(((LIS302DLDriver *)ip)->config->spip, lis302dlSPIWriteRegister(((LIS302DLDriver *)ip)->config->spip,
LIS302DL_AD_CTRL_REG1, 1, &cr); LIS302DL_AD_CTRL_REG1, 1, &cr);
#if LIS302DL_SHARED_SPI
spiReleaseBus(((LIS302DLDriver *)ip)->config->spip);
#endif /* LIS302DL_SHARED_SPI */
#endif /* LIS302DL_USE_SPI */
/* Scaling sensitivity and bias. Re-calibration is suggested anyway. */ /* Scaling sensitivity and bias. Re-calibration is suggested anyway. */
for(i = 0; i < LIS302DL_NUMBER_OF_AXES; i++) { for(i = 0; i < LIS302DL_NUMBER_OF_AXES; i++) {
@ -272,7 +297,7 @@ void lis302dlObjectInit(LIS302DLDriver *devp) {
devp->vmt_lis302dl = &vmt_lis302dl; devp->vmt_lis302dl = &vmt_lis302dl;
devp->config = NULL; devp->config = NULL;
for(i = 0; i < LIS302DL_NUMBER_OF_AXES; i++) for(i = 0; i < LIS302DL_NUMBER_OF_AXES; i++)
devp->bias[i] = 0; devp->bias[i] = 0.0f;
devp->state = LIS302DL_STOP; devp->state = LIS302DL_STOP;
} }
@ -294,13 +319,6 @@ void lis302dlStart(LIS302DLDriver *devp, const LIS302DLConfig *config) {
devp->config = config; devp->config = config;
#if LIS302DL_USE_SPI
#if LIS302DL_SHARED_SPI
spiAcquireBus((devp)->config->spip);
#endif /* LIS302DL_SHARED_SPI */
spiStart((devp)->config->spip,
(devp)->config->spicfg);
/* Control register 1 configuration block.*/ /* Control register 1 configuration block.*/
{ {
cr[0] = LIS302DL_CTRL_REG1_XEN | LIS302DL_CTRL_REG1_YEN | cr[0] = LIS302DL_CTRL_REG1_XEN | LIS302DL_CTRL_REG1_YEN |
@ -317,6 +335,12 @@ void lis302dlStart(LIS302DLDriver *devp, const LIS302DLConfig *config) {
#endif #endif
} }
#if LIS302DL_USE_SPI
#if LIS302DL_SHARED_SPI
spiAcquireBus((devp)->config->spip);
#endif /* LIS302DL_SHARED_SPI */
spiStart((devp)->config->spip, (devp)->config->spicfg);
lis302dlSPIWriteRegister(devp->config->spip, LIS302DL_AD_CTRL_REG1, lis302dlSPIWriteRegister(devp->config->spip, LIS302DL_AD_CTRL_REG1,
2, cr); 2, cr);
@ -328,17 +352,30 @@ void lis302dlStart(LIS302DLDriver *devp, const LIS302DLConfig *config) {
/* Storing sensitivity information according to full scale value */ /* Storing sensitivity information according to full scale value */
if(devp->config->fullscale == LIS302DL_FS_2G) { if(devp->config->fullscale == LIS302DL_FS_2G) {
devp->fullscale = LIS302DL_2G; devp->fullscale = LIS302DL_2G;
if(devp->config->sensitivity == NULL)
for(i = 0; i < LIS302DL_NUMBER_OF_AXES; i++) for(i = 0; i < LIS302DL_NUMBER_OF_AXES; i++)
devp->sensitivity[i] = LIS302DL_SENS_2G; devp->sensitivity[i] = LIS302DL_SENS_2G;
else
for(i = 0; i < LIS302DL_NUMBER_OF_AXES; i++)
devp->sensitivity[i] = devp->config->sensitivity[i];
} }
else if(devp->config->fullscale == LIS302DL_FS_8G) { else if(devp->config->fullscale == LIS302DL_FS_8G) {
devp->fullscale = LIS302DL_8G; devp->fullscale = LIS302DL_8G;
if(devp->config->sensitivity == NULL)
for(i = 0; i < LIS302DL_NUMBER_OF_AXES; i++) for(i = 0; i < LIS302DL_NUMBER_OF_AXES; i++)
devp->sensitivity[i] = LIS302DL_SENS_8G; devp->sensitivity[i] = LIS302DL_SENS_8G;
else
for(i = 0; i < LIS302DL_NUMBER_OF_AXES; i++)
devp->sensitivity[i] = devp->config->sensitivity[i];
} }
else { else {
osalDbgAssert(FALSE, "lis302dlStart(), accelerometer full scale issue"); osalDbgAssert(FALSE, "lis302dlStart(), accelerometer full scale issue");
} }
if(devp->config->bias != NULL)
for(i = 0; i < LIS302DL_NUMBER_OF_AXES; i++)
devp->bias[i] = devp->config->bias[i];
/* This is the Accelerometer transient recovery time */ /* This is the Accelerometer transient recovery time */
osalThreadSleepMilliseconds(10); osalThreadSleepMilliseconds(10);
@ -359,8 +396,8 @@ void lis302dlStop(LIS302DLDriver *devp) {
osalDbgAssert((devp->state == LIS302DL_STOP) || (devp->state == LIS302DL_READY), osalDbgAssert((devp->state == LIS302DL_STOP) || (devp->state == LIS302DL_READY),
"lis302dlStop(), invalid state"); "lis302dlStop(), invalid state");
#if (LIS302DL_USE_SPI) if (devp->state == LIS302DL_READY) {
if (devp->state == LIS302DL_STOP) { #if LIS302DL_USE_SPI
#if LIS302DL_SHARED_SPI #if LIS302DL_SHARED_SPI
spiAcquireBus((devp)->config->spip); spiAcquireBus((devp)->config->spip);
spiStart((devp)->config->spip, spiStart((devp)->config->spip,
@ -372,8 +409,8 @@ void lis302dlStop(LIS302DLDriver *devp) {
#if LIS302DL_SHARED_SPI #if LIS302DL_SHARED_SPI
spiReleaseBus((devp)->config->spip); spiReleaseBus((devp)->config->spip);
#endif /* LIS302DL_SHARED_SPI */ #endif /* LIS302DL_SHARED_SPI */
}
#endif /* LIS302DL_USE_SPI */ #endif /* LIS302DL_USE_SPI */
}
devp->state = LIS302DL_STOP; devp->state = LIS302DL_STOP;
} }
/** @} */ /** @} */

View File

@ -41,7 +41,7 @@
/** /**
* @brief LIS302DL driver version string. * @brief LIS302DL driver version string.
*/ */
#define EX_LIS302DL_VERSION "1.0.2" #define EX_LIS302DL_VERSION "1.0.3"
/** /**
* @brief LIS302DL driver version major number. * @brief LIS302DL driver version major number.
@ -56,7 +56,7 @@
/** /**
* @brief LIS302DL driver version patch number. * @brief LIS302DL driver version patch number.
*/ */
#define EX_LIS302DL_PATCH 2 #define EX_LIS302DL_PATCH 3
/** @} */ /** @} */
/** /**
@ -297,11 +297,11 @@ typedef struct {
/** /**
* @brief LIS302DL initial sensitivity. * @brief LIS302DL initial sensitivity.
*/ */
float sensitivity[LIS302DL_NUMBER_OF_AXES]; float *sensitivity;
/** /**
* @brief LIS302DL initial bias. * @brief LIS302DL initial bias.
*/ */
float bias[LIS302DL_NUMBER_OF_AXES]; float *bias;
/** /**
* @brief LIS302DL full scale value. * @brief LIS302DL full scale value.
*/ */
@ -312,7 +312,7 @@ typedef struct {
lis302dl_odr_t outputdatarate; lis302dl_odr_t outputdatarate;
#if LIS302DL_USE_ADVANCED || defined(__DOXYGEN__) #if LIS302DL_USE_ADVANCED || defined(__DOXYGEN__)
/** /**
* @brief LIS302DL high pass filtering * @brief LIS302DL high pass filtering.
*/ */
lis302dl_hp_t highpass; lis302dl_hp_t highpass;
#endif #endif

View File

@ -33,7 +33,7 @@
<intAttribute key="org.eclipse.cdt.launch.ATTR_BUILD_BEFORE_LAUNCH_ATTR" value="2"/> <intAttribute key="org.eclipse.cdt.launch.ATTR_BUILD_BEFORE_LAUNCH_ATTR" value="2"/>
<stringAttribute key="org.eclipse.cdt.launch.COREFILE_PATH" value=""/> <stringAttribute key="org.eclipse.cdt.launch.COREFILE_PATH" value=""/>
<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_REGISTER_GROUPS" value=""/> <stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_REGISTER_GROUPS" value=""/>
<stringAttribute key="org.eclipse.cdt.launch.FORMAT" value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&lt;contentList&gt;&lt;content id=&quot;cr2-adc_lld_start_conversion-(format)&quot; val=&quot;4&quot;/&gt;&lt;content id=&quot;CR2-adc-null-port_wait_for_interrupt-(format)&quot; val=&quot;4&quot;/&gt;&lt;content id=&quot;CR2-adc-adcp-adc_lld_start_conversion-(format)&quot; val=&quot;4&quot;/&gt;&lt;content id=&quot;null-read_raw.lto_priv.67-(format)&quot; val=&quot;0&quot;/&gt;&lt;content id=&quot;buff[0]-null-read_raw.lto_priv.67-(format)&quot; val=&quot;2&quot;/&gt;&lt;content id=&quot;buff[1]-null-read_raw.lto_priv.67-(format)&quot; val=&quot;2&quot;/&gt;&lt;content id=&quot;buff[2]-null-read_raw.lto_priv.67-(format)&quot; val=&quot;2&quot;/&gt;&lt;/contentList&gt;"/> <stringAttribute key="org.eclipse.cdt.launch.FORMAT" value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&lt;contentList&gt;&lt;content id=&quot;buff[2]-null-read_raw.lto_priv.67-(format)&quot; val=&quot;2&quot;/&gt;&lt;content id=&quot;buff[1]-null-read_raw.lto_priv.67-(format)&quot; val=&quot;2&quot;/&gt;&lt;content id=&quot;buff[0]-null-read_raw.lto_priv.67-(format)&quot; val=&quot;2&quot;/&gt;&lt;content id=&quot;null-read_raw.lto_priv.67-(format)&quot; val=&quot;0&quot;/&gt;&lt;content id=&quot;CR2-adc-adcp-adc_lld_start_conversion-(format)&quot; val=&quot;4&quot;/&gt;&lt;content id=&quot;CR2-adc-null-port_wait_for_interrupt-(format)&quot; val=&quot;4&quot;/&gt;&lt;content id=&quot;cr2-adc_lld_start_conversion-(format)&quot; val=&quot;4&quot;/&gt;&lt;/contentList&gt;"/>
<stringAttribute key="org.eclipse.cdt.launch.GLOBAL_VARIABLES" value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;globalVariableList/&gt;&#13;&#10;"/> <stringAttribute key="org.eclipse.cdt.launch.GLOBAL_VARIABLES" value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;globalVariableList/&gt;&#13;&#10;"/>
<stringAttribute key="org.eclipse.cdt.launch.MEMORY_BLOCKS" value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;memoryBlockExpressionList/&gt;&#13;&#10;"/> <stringAttribute key="org.eclipse.cdt.launch.MEMORY_BLOCKS" value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;memoryBlockExpressionList/&gt;&#13;&#10;"/>
<stringAttribute key="org.eclipse.cdt.launch.PROGRAM_NAME" value="./build/ch.elf"/> <stringAttribute key="org.eclipse.cdt.launch.PROGRAM_NAME" value="./build/ch.elf"/>