1.初始化L3GD20端口装备。将端口装备为SPI通讯接口。
单片机端口初始化包含I/O端口,I/O端口spi体系时钟。
以STM32F303为例装备端口如下:
staticvoidL3GD20_LowLevel_Init(void)
{
GPIO_InitTypeDefGPIO_InitStructure;
SPI_InitTypeDefSPI_InitStructure;
RCC_APB2PeriphClockCmd(L3GD20_SPI_CLK,ENABLE);
RCC_AHBPeriphClockCmd(L3GD20_SPI_SCK_GPIO_CLK|L3GD20_SPI_MISO_GPIO_CLK|L3GD20_SPI_MOSI_GPIO_CLK,ENABLE);
RCC_AHBPeriphClockCmd(L3GD20_SPI_CS_GPIO_CLK,ENABLE);
RCC_AHBPeriphClockCmd(L3GD20_SPI_INT1_GPIO_CLK,ENABLE);
RCC_AHBPeriphClockCmd(L3GD20_SPI_INT2_GPIO_CLK,ENABLE);
GPIO_PinAFConfig(L3GD20_SPI_SCK_GPIO_PORT,L3GD20_SPI_SCK_SOURCE,L3GD20_SPI_SCK_AF);
GPIO_PinAFConfig(L3GD20_SPI_MISO_GPIO_PORT,L3GD20_SPI_MISO_SOURCE,L3GD20_SPI_MISO_AF);
GPIO_PinAFConfig(L3GD20_SPI_MOSI_GPIO_PORT,L3GD20_SPI_MOSI_SOURCE,L3GD20_SPI_MOSI_AF);
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;//GPIO_PuPd_DOWN;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin=L3GD20_SPI_SCK_PIN;
GPIO_Init(L3GD20_SPI_SCK_GPIO_PORT,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=L3GD20_SPI_MOSI_PIN;
GPIO_Init(L3GD20_SPI_MOSI_GPIO_PORT,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=L3GD20_SPI_MISO_PIN;
GPIO_Init(L3GD20_SPI_MISO_GPIO_PORT,&GPIO_InitStructure);
SPI_I2S_DeInit(L3GD20_SPI);
SPI_InitStructure.SPI_Direction=SPI_Direction_2Lines_FullDuplex;
SPI_InitStructure.SPI_DataSize=SPI_DataSize_8b;
SPI_InitStructure.SPI_CPOL=SPI_CPOL_Low;
SPI_InitStructure.SPI_CPHA=SPI_CPHA_1Edge;
SPI_InitStructure.SPI_NSS=SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_8;
SPI_InitStructure.SPI_FirstBit=SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial=7;
SPI_InitStructure.SPI_Mode=SPI_Mode_Master;
SPI_Init(L3GD20_SPI,&SPI_InitStructure);
SPI_RxFIFOThresholdConfig(L3GD20_SPI,SPI_RxFIFOThreshold_QF);
SPI_Cmd(L3GD20_SPI,ENABLE);
GPIO_InitStructure.GPIO_Pin=L3GD20_SPI_CS_PIN;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(L3GD20_SPI_CS_GPIO_PORT,&GPIO_InitStructure);
GPIO_SetBits(L3GD20_SPI_CS_GPIO_PORT,L3GD20_SPI_CS_PIN);
GPIO_InitStructure.GPIO_Pin=L3GD20_SPI_INT1_PIN;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN;
GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;
GPIO_Init(L3GD20_SPI_INT1_GPIO_PORT,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=L3GD20_SPI_INT2_PIN;
GPIO_Init(L3GD20_SPI_INT2_GPIO_PORT,&GPIO_InitStructure);
}
2.陀螺仪初始化装备
装备陀螺仪芯片功用和芯片初始化设置
对应寄存器装备及功用参阅LG3D20数据手册
代码示例如下:
voidL3GD20_Init(L3GD20_InitTypeDef*L3GD20_InitStruct)
{
uint8_tctrl1=0x00,ctrl4=0x00;
L3GD20_LowLevel_Init();
L3GD20_InitStructure.Power_Mode=L3GD20_MODE_ACTIVE; //装备值0x08
L3GD20_InitStructure.Output_DataRate=L3GD20_OUTPUT_DATARATE_1; //装备值0x00
L3GD20_InitStructure.Axes_Enable=L3GD20_AXES_ENABLE; //装备值0x07
L3GD20_InitStructure.Band_Width=L3GD20_BANDWIDTH_4; //装备值0x30
L3GD20_InitStructure.BlockData_Update=L3GD20_BlockDataUpdate_Continous; //装备值0x00
L3GD20_InitStructure.Endianness=L3GD20_BLE_LSB; //装备值0x00
L3GD20_InitStructure.Full_Scale=L3GD20_FULLSCALE_500; //装备值0x10
ctrl1|=(uint8_t)(L3GD20_InitStruct->Power_Mode|L3GD20_InitStruct->Output_DataRate|
L3GD20_InitStruct->Axes_Enable|L3GD20_InitStruct->Band_Width);
ctrl4|=(uint8_t)(L3GD20_InitStruct->BlockData_Update|L3GD20_InitStruct->Endianness|
L3GD20_InitStruct->Full_Scale);
L3GD20_Write(&ctrl1,L3GD20_CTRL_REG1_ADDR,1);
L3GD20_Write(&ctrl4,L3GD20_CTRL_REG4_ADDR,1);
}
voidL3GD20_FilterConfig(L3GD20_FilterConfigTypeDef*L3GD20_FilterStruct)
{
uint8_ttmpreg;
L3GD20_Read(&tmpreg,L3GD20_CTRL_REG2_ADDR,1);
tmpreg&=0xC0;
L3GD20_FilterStructure.HighPassFilter_Mode_Selection=L3GD20_HPM_NORMAL_MODE_RES; //装备值0x00
L3GD20_FilterStructure.HighPassFilter_CutOff_Frequency=L3GD20_HPFCF_0; //装备值0x00
tmpreg|=(uint8_t)(L3GD20_FilterStruct->HighPassFilter_Mode_Selection|
L3GD20_FilterStruct->HighPassFilter_CutOff_Frequency);
L3GD20_Write(&tmpreg,L3GD20_CTRL_REG2_ADDR,1);
}
voidL3GD20_FilterCmd(uint8_tHighPassFilterState)
{
uint8_ttmpreg;
L3GD20_Read(&tmpreg,L3GD20_CTRL_REG5_ADDR,1);
tmpreg&=0xEF;
tmpreg|=HighPassFilterState;//装备值0x10
L3GD20_Write(&tmpreg,L3GD20_CTRL_REG5_ADDR,1);
}
3.L3GD20装备SPI数据读、写寄存器函数
读取函数L3GD20_Read(uint8_t*pBuffer,uint8_tReadAddr,uint16_tNumByteToRead)
voidL3GD20_Read(uint8_t*pBuffer,uint8_tReadAddr,uint16_tNumByteToRead)
{
if(NumByteToRead>0x01)
{
ReadAddr|=(uint8_t)(READWRITE_CMD|MULTIPLEBYTE_CMD);
}
else
{
ReadAddr|=(uint8_t)READWRITE_CMD;
}
L3GD20_CS_LOW();
L3GD20_SendByte(ReadAddr);
while(NumByteToRead>0x00)
{
*pBuffer=L3GD20_SendByte(DUMMY_BYTE);
NumByteToRead–;
pBuffer++;
}
L3GD20_CS_HIGH();
}
写L3GD20寄存器函数L3GD20_Write(uint8_t*pBuffer,uint8_tWriteAddr,uint16_tNumByteToWrite)
voidL3GD20_Write(uint8_t*pBuffer,uint8_tWriteAddr,uint16_tNumByteToWrite)
{
if(NumByteToWrite>0x01)
{
WriteAddr|=(uint8_t)MULTIPLEBYTE_CMD;
}
L3GD20_CS_LOW();
L3GD20_SendByte(WriteAddr);
while(NumByteToWrite>=0x01)
{
L3GD20_SendByte(*pBuffer);
NumByteToWrite–;
pBuffer++;
}
L3GD20_CS_HIGH();
}
4.封装读取陀螺仪3轴数据函数
将读取出来的数据进行处理核算
Demo_GyroReadAngRate(float*pfData)
voidDemo_GyroReadAngRate(float*pfData)
{
uint8_ttmpbuffer[6]={0};
int16_tRawData[3]={0};
uint8_ttmpreg=0;
floatsensitivity=0;
inti=0;
L3GD20_Read(&tmpreg,L3GD20_CTRL_REG4_ADDR,1);
L3GD20_Read(tmpbuffer,L3GD20_OUT_X_L_ADDR,6);
if(!(tmpreg&0x40))
{
for(i=0;i<3;i++)
{
RawData[i]=(int16_t)(((uint16_t)tmpbuffer[2*i+1]<<8)+tmpbuffer[2*i]);
}
}
else
{
for(i=0;i<3;i++)
{
RawData[i]=(int16_t)(((uint16_t)tmpbuffer[2*i]<<8)+tmpbuffer[2*i+1]);
}
}
switch(tmpreg&0x30)
{
case0x00:
sensitivity=L3G_Sensitivity_250dps;//L3G_Sensitivity_500dps=360/pi
break;
case0x10:
sensitivity=L3G_Sensitivity_500dps;//L3G_Sensitivity_500dps=180/pi=57.1429
break;
case0x20:
sensitivity=L3G_Sensitivity_2000dps;//L3G_Sensitivity_500dps=1/4*180/pi
break;
}
for(i=0;i<3;i++)
{
pfData[i]=(float)RawData[i]/sensitivity;//读出数据除以量程
}
}
后续便是自己的算法处理机判别。1.初始化L3GD20端口装备。将端口装备为SPI通讯接口。
单片机端口初始化包含I/O端口,I/O端口spi体系时钟。
以STM32F303为例装备端口如下:
staticvoidL3GD20_LowLevel_Init(void)
{
GPIO_InitTypeDefGPIO_InitStructure;
SPI_InitTypeDefSPI_InitStructure;
RCC_APB2PeriphClockCmd(L3GD20_SPI_CLK,ENABLE);
RCC_AHBPeriphClockCmd(L3GD20_SPI_SCK_GPIO_CLK|L3GD20_SPI_MISO_GPIO_CLK|L3GD20_SPI_MOSI_GPIO_CLK,ENABLE);
RCC_AHBPeriphClockCmd(L3GD20_SPI_CS_GPIO_CLK,ENABLE);
RCC_AHBPeriphClockCmd(L3GD20_SPI_INT1_GPIO_CLK,ENABLE);
RCC_AHBPeriphClockCmd(L3GD20_SPI_INT2_GPIO_CLK,ENABLE);
GPIO_PinAFConfig(L3GD20_SPI_SCK_GPIO_PORT,L3GD20_SPI_SCK_SOURCE,L3GD20_SPI_SCK_AF);
GPIO_PinAFConfig(L3GD20_SPI_MISO_GPIO_PORT,L3GD20_SPI_MISO_SOURCE,L3GD20_SPI_MISO_AF);
GPIO_PinAFConfig(L3GD20_SPI_MOSI_GPIO_PORT,L3GD20_SPI_MOSI_SOURCE,L3GD20_SPI_MOSI_AF);
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;//GPIO_PuPd_DOWN;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin=L3GD20_SPI_SCK_PIN;
GPIO_Init(L3GD20_SPI_SCK_GPIO_PORT,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=L3GD20_SPI_MOSI_PIN;
GPIO_Init(L3GD20_SPI_MOSI_GPIO_PORT,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=L3GD20_SPI_MISO_PIN;
GPIO_Init(L3GD20_SPI_MISO_GPIO_PORT,&GPIO_InitStructure);
SPI_I2S_DeInit(L3GD20_SPI);
SPI_InitStructure.SPI_Direction=SPI_Direction_2Lines_FullDuplex;
SPI_InitStructure.SPI_DataSize=SPI_DataSize_8b;
SPI_InitStructure.SPI_CPOL=SPI_CPOL_Low;
SPI_InitStructure.SPI_CPHA=SPI_CPHA_1Edge;
SPI_InitStructure.SPI_NSS=SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_8;
SPI_InitStructure.SPI_FirstBit=SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial=7;
SPI_InitStructure.SPI_Mode=SPI_Mode_Master;
SPI_Init(L3GD20_SPI,&SPI_InitStructure);
SPI_RxFIFOThresholdConfig(L3GD20_SPI,SPI_RxFIFOThreshold_QF);
SPI_Cmd(L3GD20_SPI,ENABLE);
GPIO_InitStructure.GPIO_Pin=L3GD20_SPI_CS_PIN;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(L3GD20_SPI_CS_GPIO_PORT,&GPIO_InitStructure);
GPIO_SetBits(L3GD20_SPI_CS_GPIO_PORT,L3GD20_SPI_CS_PIN);
GPIO_InitStructure.GPIO_Pin=L3GD20_SPI_INT1_PIN;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN;
GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;
GPIO_Init(L3GD20_SPI_INT1_GPIO_PORT,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=L3GD20_SPI_INT2_PIN;
GPIO_Init(L3GD20_SPI_INT2_GPIO_PORT,&GPIO_InitStructure);
}
2.陀螺仪初始化装备
装备陀螺仪芯片功用和芯片初始化设置
对应寄存器装备及功用参阅LG3D20数据手册
代码示例如下:
voidL3GD20_Init(L3GD20_InitTypeDef*L3GD20_InitStruct)
{
uint8_tctrl1=0x00,ctrl4=0x00;
L3GD20_LowLevel_Init();
L3GD20_InitStructure.Power_Mode=L3GD20_MODE_ACTIVE; //装备值0x08
L3GD20_InitStructure.Output_DataRate=L3GD20_OUTPUT_DATARATE_1; //装备值0x00
L3GD20_InitStructure.Axes_Enable=L3GD20_AXES_ENABLE; //装备值0x07
L3GD20_InitStructure.Band_Width=L3GD20_BANDWIDTH_4; //装备值0x30
L3GD20_InitStructure.BlockData_Update=L3GD20_BlockDataUpdate_Continous; //装备值0x00
L3GD20_InitStructure.Endianness=L3GD20_BLE_LSB; //装备值0x00
L3GD20_InitStructure.Full_Scale=L3GD20_FULLSCALE_500; //装备值0x10
ctrl1|=(uint8_t)(L3GD20_InitStruct->Power_Mode|L3GD20_InitStruct->Output_DataRate|
L3GD20_InitStruct->Axes_Enable|L3GD20_InitStruct->Band_Width);
ctrl4|=(uint8_t)(L3GD20_InitStruct->BlockData_Update|L3GD20_InitStruct->Endianness|
L3GD20_InitStruct->Full_Scale);
L3GD20_Write(&ctrl1,L3GD20_CTRL_REG1_ADDR,1);
L3GD20_Write(&ctrl4,L3GD20_CTRL_REG4_ADDR,1);
}
voidL3GD20_FilterConfig(L3GD20_FilterConfigTypeDef*L3GD20_FilterStruct)
{
uint8_ttmpreg;
L3GD20_Read(&tmpreg,L3GD20_CTRL_REG2_ADDR,1);
tmpreg&=0xC0;
L3GD20_FilterStructure.HighPassFilter_Mode_Selection=L3GD20_HPM_NORMAL_MODE_RES; //装备值0x00
L3GD20_FilterStructure.HighPassFilter_CutOff_Frequency=L3GD20_HPFCF_0; //装备值0x00
tmpreg|=(uint8_t)(L3GD20_FilterStruct->HighPassFilter_Mode_Selection|
L3GD20_FilterStruct->HighPassFilter_CutOff_Frequency);
L3GD20_Write(&tmpreg,L3GD20_CTRL_REG2_ADDR,1);
}
voidL3GD20_FilterCmd(uint8_tHighPassFilterState)
{
uint8_ttmpreg;
L3GD20_Read(&tmpreg,L3GD20_CTRL_REG5_ADDR,1);
tmpreg&=0xEF;
tmpreg|=HighPassFilterState;//装备值0x10
L3GD20_Write(&tmpreg,L3GD20_CTRL_REG5_ADDR,1);
}
3.L3GD20装备SPI数据读、写寄存器函数
读取函数L3GD20_Read(uint8_t*pBuffer,uint8_tReadAddr,uint16_tNumByteToRead)
voidL3GD20_Read(uint8_t*pBuffer,uint8_tReadAddr,uint16_tNumByteToRead)
{
if(NumByteToRead>0x01)
{
ReadAddr|=(uint8_t)(READWRITE_CMD|MULTIPLEBYTE_CMD);
}
else
{
ReadAddr|=(uint8_t)READWRITE_CMD;
}
L3GD20_CS_LOW();
L3GD20_SendByte(ReadAddr);
while(NumByteToRead>0x00)
{
*pBuffer=L3GD20_SendByte(DUMMY_BYTE);
NumByteToRead–;
pBuffer++;
}
L3GD20_CS_HIGH();
}
写L3GD20寄存器函数L3GD20_Write(uint8_t*pBuffer,uint8_tWriteAddr,uint16_tNumByteToWrite)
voidL3GD20_Write(uint8_t*pBuffer,uint8_tWriteAddr,uint16_tNumByteToWrite)
{
if(NumByteToWrite>0x01)
{
WriteAddr|=(uint8_t)MULTIPLEBYTE_CMD;
}
L3GD20_CS_LOW();
L3GD20_SendByte(WriteAddr);
while(NumByteToWrite>=0x01)
{
L3GD20_SendByte(*pBuffer);
NumByteToWrite–;
pBuffer++;
}
L3GD20_CS_HIGH();
}
4.封装读取陀螺仪3轴数据函数
将读取出来的数据进行处理核算
Demo_GyroReadAngRate(float*pfData)
voidDemo_GyroReadAngRate(float*pfData)
{
uint8_ttmpbuffer[6]={0};
int16_tRawData[3]={0};
uint8_ttmpreg=0;
floatsensitivity=0;
inti=0;
L3GD20_Read(&tmpreg,L3GD20_CTRL_REG4_ADDR,1);
L3GD20_Read(tmpbuffer,L3GD20_OUT_X_L_ADDR,6);
if(!(tmpreg&0x40))
{
for(i=0;i<3;i++)
{
RawData[i]=(int16_t)(((uint16_t)tmpbuffer[2*i+1]<<8)+tmpbuffer[2*i]);
}
}
else
{
for(i=0;i<3;i++)
{
RawData[i]=(int16_t)(((uint16_t)tmpbuffer[2*i]<<8)+tmpbuffer[2*i+1]);
}
}
switch(tmpreg&0x30)
{
case0x00:
sensitivity=L3G_Sensitivity_250dps;//L3G_Sensitivity_500dps=360/pi
break;
case0x10:
sensitivity=L3G_Sensitivity_500dps;//L3G_Sensitivity_500dps=180/pi=57.1429
break;
case0x20:
sensitivity=L3G_Sensitivity_2000dps;//L3G_Sensitivity_500dps=1/4*180/pi
break;
}
for(i=0;i<3;i++)
{
pfData[i]=(float)RawData[i]/sensitivity;//读出数据除以量程
}
}
后续便是自己的算法处理机判别。1.初始化L3GD20端口装备。将端口装备为SPI通讯接口。
单片机端口初始化包含I/O端口,I/O端口spi体系时钟。
以STM32F303为例装备端口如下:
staticvoidL3GD20_LowLevel_Init(void)
{
GPIO_InitTypeDefGPIO_InitStructure;
SPI_InitTypeDefSPI_InitStructure;
RCC_APB2PeriphClockCmd(L3GD20_SPI_CLK,ENABLE);
RCC_AHBPeriphClockCmd(L3GD20_SPI_SCK_GPIO_CLK|L3GD20_SPI_MISO_GPIO_CLK|L3GD20_SPI_MOSI_GPIO_CLK,ENABLE);
RCC_AHBPeriphClockCmd(L3GD20_SPI_CS_GPIO_CLK,ENABLE);
RCC_AHBPeriphClockCmd(L3GD20_SPI_INT1_GPIO_CLK,ENABLE);
RCC_AHBPeriphClockCmd(L3GD20_SPI_INT2_GPIO_CLK,ENABLE);
GPIO_PinAFConfig(L3GD20_SPI_SCK_GPIO_PORT,L3GD20_SPI_SCK_SOURCE,L3GD20_SPI_SCK_AF);
GPIO_PinAFConfig(L3GD20_SPI_MISO_GPIO_PORT,L3GD20_SPI_MISO_SOURCE,L3GD20_SPI_MISO_AF);
GPIO_PinAFConfig(L3GD20_SPI_MOSI_GPIO_PORT,L3GD20_SPI_MOSI_SOURCE,L3GD20_SPI_MOSI_AF);
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;//GPIO_PuPd_DOWN;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin=L3GD20_SPI_SCK_PIN;
GPIO_Init(L3GD20_SPI_SCK_GPIO_PORT,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=L3GD20_SPI_MOSI_PIN;
GPIO_Init(L3GD20_SPI_MOSI_GPIO_PORT,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=L3GD20_SPI_MISO_PIN;
GPIO_Init(L3GD20_SPI_MISO_GPIO_PORT,&GPIO_InitStructure);
SPI_I2S_DeInit(L3GD20_SPI);
SPI_InitStructure.SPI_Direction=SPI_Direction_2Lines_FullDuplex;
SPI_InitStructure.SPI_DataSize=SPI_DataSize_8b;
SPI_InitStructure.SPI_CPOL=SPI_CPOL_Low;
SPI_InitStructure.SPI_CPHA=SPI_CPHA_1Edge;
SPI_InitStructure.SPI_NSS=SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_8;
SPI_InitStructure.SPI_FirstBit=SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial=7;
SPI_InitStructure.SPI_Mode=SPI_Mode_Master;
SPI_Init(L3GD20_SPI,&SPI_InitStructure);
SPI_RxFIFOThresholdConfig(L3GD20_SPI,SPI_RxFIFOThreshold_QF);
SPI_Cmd(L3GD20_SPI,ENABLE);
GPIO_InitStructure.GPIO_Pin=L3GD20_SPI_CS_PIN;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(L3GD20_SPI_CS_GPIO_PORT,&GPIO_InitStructure);
GPIO_SetBits(L3GD20_SPI_CS_GPIO_PORT,L3GD20_SPI_CS_PIN);
GPIO_InitStructure.GPIO_Pin=L3GD20_SPI_INT1_PIN;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN;
GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;
GPIO_Init(L3GD20_SPI_INT1_GPIO_PORT,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=L3GD20_SPI_INT2_PIN;
GPIO_Init(L3GD20_SPI_INT2_GPIO_PORT,&GPIO_InitStructure);
}
2.陀螺仪初始化装备
装备陀螺仪芯片功用和芯片初始化设置
对应寄存器装备及功用参阅LG3D20数据手册
代码示例如下:
voidL3GD20_Init(L3GD20_InitTypeDef*L3GD20_InitStruct)
{
uint8_tctrl1=0x00,ctrl4=0x00;
L3GD20_LowLevel_Init();
L3GD20_InitStructure.Power_Mode=L3GD20_MODE_ACTIVE; //装备值0x08
L3GD20_InitStructure.Output_DataRate=L3GD20_OUTPUT_DATARATE_1; //装备值0x00
L3GD20_InitStructure.Axes_Enable=L3GD20_AXES_ENABLE; //装备值0x07
L3GD20_InitStructure.Band_Width=L3GD20_BANDWIDTH_4; //装备值0x30
L3GD20_InitStructure.BlockData_Update=L3GD20_BlockDataUpdate_Continous; //装备值0x00
L3GD20_InitStructure.Endianness=L3GD20_BLE_LSB; //装备值0x00
L3GD20_InitStructure.Full_Scale=L3GD20_FULLSCALE_500; //装备值0x10
ctrl1|=(uint8_t)(L3GD20_InitStruct->Power_Mode|L3GD20_InitStruct->Output_DataRate|
L3GD20_InitStruct->Axes_Enable|L3GD20_InitStruct->Band_Width);
ctrl4|=(uint8_t)(L3GD20_InitStruct->BlockData_Update|L3GD20_InitStruct->Endianness|
L3GD20_InitStruct->Full_Scale);
L3GD20_Write(&ctrl1,L3GD20_CTRL_REG1_ADDR,1);
L3GD20_Write(&ctrl4,L3GD20_CTRL_REG4_ADDR,1);
}
voidL3GD20_FilterConfig(L3GD20_FilterConfigTypeDef*L3GD20_FilterStruct)
{
uint8_ttmpreg;
L3GD20_Read(&tmpreg,L3GD20_CTRL_REG2_ADDR,1);
tmpreg&=0xC0;
L3GD20_FilterStructure.HighPassFilter_Mode_Selection=L3GD20_HPM_NORMAL_MODE_RES; //装备值0x00
L3GD20_FilterStructure.HighPassFilter_CutOff_Frequency=L3GD20_HPFCF_0; //装备值0x00
tmpreg|=(uint8_t)(L3GD20_FilterStruct->HighPassFilter_Mode_Selection|
L3GD20_FilterStruct->HighPassFilter_CutOff_Frequency);
L3GD20_Write(&tmpreg,L3GD20_CTRL_REG2_ADDR,1);
}
voidL3GD20_FilterCmd(uint8_tHighPassFilterState)
{
uint8_ttmpreg;
L3GD20_Read(&tmpreg,L3GD20_CTRL_REG5_ADDR,1);
tmpreg&=0xEF;
tmpreg|=HighPassFilterState;//装备值0x10
L3GD20_Write(&tmpreg,L3GD20_CTRL_REG5_ADDR,1);
}
3.L3GD20装备SPI数据读、写寄存器函数
读取函数L3GD20_Read(uint8_t*pBuffer,uint8_tReadAddr,uint16_tNumByteToRead)
voidL3GD20_Read(uint8_t*pBuffer,uint8_tReadAddr,uint16_tNumByteToRead)
{
if(NumByteToRead>0x01)
{
ReadAddr|=(uint8_t)(READWRITE_CMD|MULTIPLEBYTE_CMD);
}
else
{
ReadAddr|=(uint8_t)READWRITE_CMD;
}
L3GD20_CS_LOW();
L3GD20_SendByte(ReadAddr);
while(NumByteToRead>0x00)
{
*pBuffer=L3GD20_SendByte(DUMMY_BYTE);
NumByteToRead–;
pBuffer++;
}
L3GD20_CS_HIGH();
}
写L3GD20寄存器函数L3GD20_Write(uint8_t*pBuffer,uint8_tWriteAddr,uint16_tNumByteToWrite)
voidL3GD20_Write(uint8_t*pBuffer,uint8_tWriteAddr,uint16_tNumByteToWrite)
{
if(NumByteToWrite>0x01)
{
WriteAddr|=(uint8_t)MULTIPLEBYTE_CMD;
}
L3GD20_CS_LOW();
L3GD20_SendByte(WriteAddr);
while(NumByteToWrite>=0x01)
{
L3GD20_SendByte(*pBuffer);
NumByteToWrite–;
pBuffer++;
}
L3GD20_CS_HIGH();
}
4.封装读取陀螺仪3轴数据函数
将读取出来的数据进行处理核算
Demo_GyroReadAngRate(float*pfData)
voidDemo_GyroReadAngRate(float*pfData)
{
uint8_ttmpbuffer[6]={0};
int16_tRawData[3]={0};
uint8_ttmpreg=0;
floatsensitivity=0;
inti=0;
L3GD20_Read(&tmpreg,L3GD20_CTRL_REG4_ADDR,1);
L3GD20_Read(tmpbuffer,L3GD20_OUT_X_L_ADDR,6);
if(!(tmpreg&0x40))
{
for(i=0;i<3;i++)
{
RawData[i]=(int16_t)(((uint16_t)tmpbuffer[2*i+1]<<8)+tmpbuffer[2*i]);
}
}
else
{
for(i=0;i<3;i++)
{
RawData[i]=(int16_t)(((uint16_t)tmpbuffer[2*i]<<8)+tmpbuffer[2*i+1]);
}
}
switch(tmpreg&0x30)
{
case0x00:
sensitivity=L3G_Sensitivity_250dps;//L3G_Sensitivity_500dps=360/pi
break;
case0x10:
sensitivity=L3G_Sensitivity_500dps;//L3G_Sensitivity_500dps=180/pi=57.1429
break;
case0x20:
sensitivity=L3G_Sensitivity_2000dps;//L3G_Sensitivity_500dps=1/4*180/pi
break;
}
for(i=0;i<3;i++)
{
pfData[i]=(float)RawData[i]/sensitivity;//读出数据除以量程
}
}
后续便是自己的算法处理机判别。1.初始化L3GD20端口装备。将端口装备为SPI通讯接口。
单片机端口初始化包含I/O端口,I/O端口spi体系时钟。
以STM32F303为例装备端口如下:
staticvoidL3GD20_LowLevel_Init(void)
{
GPIO_InitTypeDefGPIO_InitStructure;
SPI_InitTypeDefSPI_InitStructure;
RCC_APB2PeriphClockCmd(L3GD20_SPI_CLK,ENABLE);
RCC_AHBPeriphClockCmd(L3GD20_SPI_SCK_GPIO_CLK|L3GD20_SPI_MISO_GPIO_CLK|L3GD20_SPI_MOSI_GPIO_CLK,ENABLE);
RCC_AHBPeriphClockCmd(L3GD20_SPI_CS_GPIO_CLK,ENABLE);
RCC_AHBPeriphClockCmd(L3GD20_SPI_INT1_GPIO_CLK,ENABLE);
RCC_AHBPeriphClockCmd(L3GD20_SPI_INT2_GPIO_CLK,ENABLE);
GPIO_PinAFConfig(L3GD20_SPI_SCK_GPIO_PORT,L3GD20_SPI_SCK_SOURCE,L3GD20_SPI_SCK_AF);
GPIO_PinAFConfig(L3GD20_SPI_MISO_GPIO_PORT,L3GD20_SPI_MISO_SOURCE,L3GD20_SPI_MISO_AF);
GPIO_PinAFConfig(L3GD20_SPI_MOSI_GPIO_PORT,L3GD20_SPI_MOSI_SOURCE,L3GD20_SPI_MOSI_AF);
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;//GPIO_PuPd_DOWN;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin=L3GD20_SPI_SCK_PIN;
GPIO_Init(L3GD20_SPI_SCK_GPIO_PORT,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=L3GD20_SPI_MOSI_PIN;
GPIO_Init(L3GD20_SPI_MOSI_GPIO_PORT,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=L3GD20_SPI_MISO_PIN;
GPIO_Init(L3GD20_SPI_MISO_GPIO_PORT,&GPIO_InitStructure);
SPI_I2S_DeInit(L3GD20_SPI);
SPI_InitStructure.SPI_Direction=SPI_Direction_2Lines_FullDuplex;
SPI_InitStructure.SPI_DataSize=SPI_DataSize_8b;
SPI_InitStructure.SPI_CPOL=SPI_CPOL_Low;
SPI_InitStructure.SPI_CPHA=SPI_CPHA_1Edge;
SPI_InitStructure.SPI_NSS=SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_8;
SPI_InitStructure.SPI_FirstBit=SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial=7;
SPI_InitStructure.SPI_Mode=SPI_Mode_Master;
SPI_Init(L3GD20_SPI,&SPI_InitStructure);
SPI_RxFIFOThresholdConfig(L3GD20_SPI,SPI_RxFIFOThreshold_QF);
SPI_Cmd(L3GD20_SPI,ENABLE);
GPIO_InitStructure.GPIO_Pin=L3GD20_SPI_CS_PIN;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(L3GD20_SPI_CS_GPIO_PORT,&GPIO_InitStructure);
GPIO_SetBits(L3GD20_SPI_CS_GPIO_PORT,L3GD20_SPI_CS_PIN);
GPIO_InitStructure.GPIO_Pin=L3GD20_SPI_INT1_PIN;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN;
GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;
GPIO_Init(L3GD20_SPI_INT1_GPIO_PORT,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=L3GD20_SPI_INT2_PIN;
GPIO_Init(L3GD20_SPI_INT2_GPIO_PORT,&GPIO_InitStructure);
}
2.陀螺仪初始化装备
装备陀螺仪芯片功用和芯片初始化设置
对应寄存器装备及功用参阅LG3D20数据手册
代码示例如下:
voidL3GD20_Init(L3GD20_InitTypeDef*L3GD20_InitStruct)
{
uint8_tctrl1=0x00,ctrl4=0x00;
L3GD20_LowLevel_Init();
L3GD20_InitStructure.Power_Mode=L3GD20_MODE_ACTIVE; //装备值0x08
L3GD20_InitStructure.Output_DataRate=L3GD20_OUTPUT_DATARATE_1; //装备值0x00
L3GD20_InitStructure.Axes_Enable=L3GD20_AXES_ENABLE; //装备值0x07
L3GD20_InitStructure.Band_Width=L3GD20_BANDWIDTH_4; //装备值0x30
L3GD20_InitStructure.BlockData_Update=L3GD20_BlockDataUpdate_Continous; //装备值0x00
L3GD20_InitStructure.Endianness=L3GD20_BLE_LSB; //装备值0x00
L3GD20_InitStructure.Full_Scale=L3GD20_FULLSCALE_500; //装备值0x10
ctrl1|=(uint8_t)(L3GD20_InitStruct->Power_Mode|L3GD20_InitStruct->Output_DataRate|
L3GD20_InitStruct->Axes_Enable|L3GD20_InitStruct->Band_Width);
ctrl4|=(uint8_t)(L3GD20_InitStruct->BlockData_Update|L3GD20_InitStruct->Endianness|
L3GD20_InitStruct->Full_Scale);
L3GD20_Write(&ctrl1,L3GD20_CTRL_REG1_ADDR,1);
L3GD20_Write(&ctrl4,L3GD20_CTRL_REG4_ADDR,1);
}
voidL3GD20_FilterConfig(L3GD20_FilterConfigTypeDef*L3GD20_FilterStruct)
{
uint8_ttmpreg;
L3GD20_Read(&tmpreg,L3GD20_CTRL_REG2_ADDR,1);
tmpreg&=0xC0;
L3GD20_FilterStructure.HighPassFilter_Mode_Selection=L3GD20_HPM_NORMAL_MODE_RES; //装备值0x00
L3GD20_FilterStructure.HighPassFilter_CutOff_Frequency=L3GD20_HPFCF_0; //装备值0x00
tmpreg|=(uint8_t)(L3GD20_FilterStruct->HighPassFilter_Mode_Selection|
L3GD20_FilterStruct->HighPassFilter_CutOff_Frequency);
L3GD20_Write(&tmpreg,L3GD20_CTRL_REG2_ADDR,1);
}
voidL3GD20_FilterCmd(uint8_tHighPassFilterState)
{
uint8_ttmpreg;
L3GD20_Read(&tmpreg,L3GD20_CTRL_REG5_ADDR,1);
tmpreg&=0xEF;
tmpreg|=HighPassFilterState;//装备值0x10
L3GD20_Write(&tmpreg,L3GD20_CTRL_REG5_ADDR,1);
}
3.L3GD20装备SPI数据读、写寄存器函数
读取函数L3GD20_Read(uint8_t*pBuffer,uint8_tReadAddr,uint16_tNumByteToRead)
voidL3GD20_Read(uint8_t*pBuffer,uint8_tReadAddr,uint16_tNumByteToRead)
{
if(NumByteToRead>0x01)
{
ReadAddr|=(uint8_t)(READWRITE_CMD|MULTIPLEBYTE_CMD);
}
else
{
ReadAddr|=(uint8_t)READWRITE_CMD;
}
L3GD20_CS_LOW();
L3GD20_SendByte(ReadAddr);
while(NumByteToRead>0x00)
{
*pBuffer=L3GD20_SendByte(DUMMY_BYTE);
NumByteToRead–;
pBuffer++;
}
L3GD20_CS_HIGH();
}
写L3GD20寄存器函数L3GD20_Write(uint8_t*pBuffer,uint8_tWriteAddr,uint16_tNumByteToWrite)
voidL3GD20_Write(uint8_t*pBuffer,uint8_tWriteAddr,uint16_tNumByteToWrite)
{
if(NumByteToWrite>0x01)
{
WriteAddr|=(uint8_t)MULTIPLEBYTE_CMD;
}
L3GD20_CS_LOW();
L3GD20_SendByte(WriteAddr);
while(NumByteToWrite>=0x01)
{
L3GD20_SendByte(*pBuffer);
NumByteToWrite–;
pBuffer++;
}
L3GD20_CS_HIGH();
}
4.封装读取陀螺仪3轴数据函数
将读取出来的数据进行处理核算
Demo_GyroReadAngRate(float*pfData)
voidDemo_GyroReadAngRate(float*pfData)
{
uint8_ttmpbuffer[6]={0};
int16_tRawData[3]={0};
uint8_ttmpreg=0;
floatsensitivity=0;
inti=0;
L3GD20_Read(&tmpreg,L3GD20_CTRL_REG4_ADDR,1);
L3GD20_Read(tmpbuffer,L3GD20_OUT_X_L_ADDR,6);
if(!(tmpreg&0x40))
{
for(i=0;i<3;i++)
{
RawData[i]=(int16_t)(((uint16_t)tmpbuffer[2*i+1]<<8)+tmpbuffer[2*i]);
}
}
else
{
for(i=0;i<3;i++)
{
RawData[i]=(int16_t)(((uint16_t)tmpbuffer[2*i]<<8)+tmpbuffer[2*i+1]);
}
}
switch(tmpreg&0x30)
{
case0x00:
sensitivity=L3G_Sensitivity_250dps;//L3G_Sensitivity_500dps=360/pi
break;
case0x10:
sensitivity=L3G_Sensitivity_500dps;//L3G_Sensitivity_500dps=180/pi=57.1429
break;
case0x20:
sensitivity=L3G_Sensitivity_2000dps;//L3G_Sensitivity_500dps=1/4*180/pi
break;
}
for(i=0;i<3;i++)
{
pfData[i]=(float)RawData[i]/sensitivity;//读出数据除以量程
}
}
后续便是自己的算法处理机判别。
声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/zhishi/moni/260836.html