PASII/CandeII_1.4/Hardware/lsm6d.c

214 lines
5.8 KiB
C
Raw Normal View History

/*************************************************************************************************
**Filename: lsm6d.c
**Version :
**Author :
**Date :
**Description:
**
*************************************************************************************************/
#include "lsm6d.h"
#include "gpio.h"
#include "i2c.h"
#include "delay.h"
#include "mcu_bsp.h"
#include "DebugLog.h"
/*********************************************************************
* Global Variables (declared in header file with 'extern')
*/
stmdev_ctx_t dev_ctx;
tFilter_Type tFilter;
float Angle;
PAS_SENSOR_t PAS;
/*********************************************************************
* Static Variables
*/
static int16_t data_raw_acc[3];
static int16_t data_raw_ang[3];
static int16_t data_acc_offset[3];
static int16_t data_ang_offset[3];
/*********************************************************************
* Static Functions ('static')
*/
static void platform0_delay(uint16_t ms);
static int32_t platform0_write(uint8_t I2C_addr, uint8_t addr, uint8_t* value, uint16_t len);
static int32_t platform0_read(uint8_t I2C_addr,uint8_t regAddress, uint8_t * data, uint16_t len);
static void Filter_Complement(float angle_m_cf,float gyro_m_cf);
static void Cadence_Stop_Judge(int16_t theta);
/*************************************************************************************************
* Function Name:
* Description : lsm6dso <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>
* Arguments :
* Return Value :
*************************************************************************************************/
void Lsm6dso_Init(void)
{
uint8_t temp = 0;
dev_ctx.write_reg = platform0_write;
dev_ctx.read_reg = platform0_read;
dev_ctx.mdelay = platform0_delay;
dev_ctx.master_addr = LSM6DSO_ADDRESS;
PEN_ENABLE(); //ʹ<><CAB9>lsm6d<36><64><EFBFBD><EFBFBD>
platform0_delay(100);
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>Id
lsm6dso_device_id_get(&dev_ctx, &temp);
if(temp == LSM6DSO_ID)
{
PAS.exist = 1;
}
else
{
PAS.exist = 0;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ, <20>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>Ĭ<EFBFBD><C4AC><EFBFBD><EFBFBD>ֵ
lsm6dso_reset_set(&dev_ctx, PROPERTY_ENABLE);
do{
lsm6dso_reset_get(&dev_ctx, &temp);
}while(temp);
//<2F><>ֹI3C<33>ӿ<EFBFBD>
lsm6dso_i3c_disable_set(&dev_ctx, LSM6DSO_I3C_DISABLE);
//ʹ<><CAB9>BDU
lsm6dso_block_data_update_set(&dev_ctx, PROPERTY_ENABLE);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
lsm6dso_gy_data_rate_set(&dev_ctx, LSM6DSO_GY_ODR_12Hz5);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̷<EFBFBD>Χ
lsm6dso_gy_full_scale_set(&dev_ctx, LSM6DSO_1000dps);
//ʹ<>ܽ<EFBFBD><DCBD>ٶȼƵ<C8BC><C6B5>˲<EFBFBD><CBB2><EFBFBD><EFBFBD><EFBFBD>
lsm6dso_gy_lp1_bandwidth_set(&dev_ctx,LSM6DSO_MEDIUM);
lsm6dso_gy_filter_lp1_set(&dev_ctx,PROPERTY_ENABLE);
}
/*************************************************************************************************
* Function Name:
* Description : <EFBFBD>Ƕȼ<EFBFBD><EFBFBD><EFBFBD> ע<EFBFBD><EFBFBD>:10ms<EFBFBD>жϼ<EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>
* Arguments :
* Return Value :
*************************************************************************************************/
void Lsm6dso_RPM_Cal(void)
{
uint8_t reg;
static float gyro_z;
lsm6dso_gy_flag_data_ready_get(&dev_ctx, &reg);
if(reg)
{
lsm6dso_angular_rate_raw_get(&dev_ctx, data_raw_ang);
gyro_z = data_raw_ang[2];
}
gyro_z = (gyro_z - data_ang_offset[2]) + 32768;
gyro_z = (32768 - gyro_z)/32.8; //<2F>õ<EFBFBD><C3B5>Ľ<EFBFBD><C4BD>ٶ<EFBFBD> <20><>λdps(degrees per second)
Angle = Angle + gyro_z*0.1f*182.04;
PAS.angle = Angle;
Cadence_Stop_Judge(PAS.angle);
if(PAS.actFlag == 1)
{
PAS.RPM = (gyro_z*60.0f/360);
}
else
{
PAS.RPM = 0;
}
}
/*************************************************************************************************
* Function Name:
* Description : lsm6dso ʧ<EFBFBD><EFBFBD>
* Arguments :
* Return Value :
*************************************************************************************************/
void Lsm6dso_Disable(void)
{
lsm6dso_reset_set(&dev_ctx, PROPERTY_ENABLE);
}
/*************************************************************************************************
* Function Name:
* Description : <EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD>д
* Arguments :
* Return Value :
*************************************************************************************************/
static void Cadence_Stop_Judge(int16_t theta)
{
static uint8_t cntTimes = 0;
static int16_t Last_theta = 0,temp;
static uint8_t ActFlag = 0;
cntTimes++;
if(cntTimes >= 6)
{
cntTimes = 0;
temp = theta - Last_theta;
if(ABS(temp) > 3200)
{
PAS.actFlag = 1;
}
else
{
PAS.actFlag = 0;
}
Last_theta = theta;
}
}
/*************************************************************************************************
* Function Name:
* Description : <EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD>д
* Arguments :
* Return Value :
*************************************************************************************************/
static int32_t platform0_write(uint8_t I2C_addr, uint8_t addr, uint8_t* value, uint16_t len)
{
ErrorStatus bret = SUCCESS;
bret = i2c_0_write(I2C_addr, 1, addr, value, len);
return (int32_t)(!bret);
}
/*************************************************************************************************
* Function Name:
* Description : <EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* Arguments :
* Return Value :
*************************************************************************************************/
static int32_t platform0_read(uint8_t I2C_addr,uint8_t regAddress, uint8_t * data, uint16_t len)
{
ErrorStatus bret = SUCCESS;
bret = i2c_0_read(I2C_addr, 1, regAddress, data, len);
return (int32_t)(!bret);
}
/*************************************************************************************************
* Function Name:
* Description : <EFBFBD><EFBFBD>ʱ
* Arguments :
* Return Value :
*************************************************************************************************/
static void platform0_delay(uint16_t ms)
{
delay_ms(ms);
}
/*************************************************************************************************/