加速度磁力计.docx

上传人:b****3 文档编号:11209777 上传时间:2023-05-29 格式:DOCX 页数:21 大小:18.74KB
下载 相关 举报
加速度磁力计.docx_第1页
第1页 / 共21页
加速度磁力计.docx_第2页
第2页 / 共21页
加速度磁力计.docx_第3页
第3页 / 共21页
加速度磁力计.docx_第4页
第4页 / 共21页
加速度磁力计.docx_第5页
第5页 / 共21页
加速度磁力计.docx_第6页
第6页 / 共21页
加速度磁力计.docx_第7页
第7页 / 共21页
加速度磁力计.docx_第8页
第8页 / 共21页
加速度磁力计.docx_第9页
第9页 / 共21页
加速度磁力计.docx_第10页
第10页 / 共21页
加速度磁力计.docx_第11页
第11页 / 共21页
加速度磁力计.docx_第12页
第12页 / 共21页
加速度磁力计.docx_第13页
第13页 / 共21页
加速度磁力计.docx_第14页
第14页 / 共21页
加速度磁力计.docx_第15页
第15页 / 共21页
加速度磁力计.docx_第16页
第16页 / 共21页
加速度磁力计.docx_第17页
第17页 / 共21页
加速度磁力计.docx_第18页
第18页 / 共21页
加速度磁力计.docx_第19页
第19页 / 共21页
加速度磁力计.docx_第20页
第20页 / 共21页
亲,该文档总共21页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

加速度磁力计.docx

《加速度磁力计.docx》由会员分享,可在线阅读,更多相关《加速度磁力计.docx(21页珍藏版)》请在冰点文库上搜索。

加速度磁力计.docx

加速度磁力计

LSM303DLHC应用单片机程序-----STM32F303

1.单片机端口配置初始化

以STM32F303程序为例

staticvoidLSM303DLHC_LowLevel_Init(void)

{

GPIO_InitTypeDefGPIO_InitStructure;

EXTI_InitTypeDefEXTI_InitStructure;

I2C_InitTypeDefI2C_InitStructure;

/*EnabletheI2Cperiph*/

RCC_APB1PeriphClockCmd(LSM303DLHC_I2C_CLK,ENABLE);

/*EnableSCKandSDAGPIOclocks*/

RCC_AHBPeriphClockCmd(LSM303DLHC_I2C_SCK_GPIO_CLK|LSM303DLHC_I2C_SDA_GPIO_CLK,ENABLE);

/*EnableINT1GPIOclock*/

RCC_AHBPeriphClockCmd(LSM303DLHC_I2C_INT1_GPIO_CLK,ENABLE);

/*EnableINT2GPIOclock*/

RCC_AHBPeriphClockCmd(LSM303DLHC_I2C_INT2_GPIO_CLK,ENABLE);

/*EnableDRDYclock*/

RCC_AHBPeriphClockCmd(LSM303DLHC_DRDY_GPIO_CLK,ENABLE);

GPIO_PinAFConfig(LSM303DLHC_I2C_SCK_GPIO_PORT,LSM303DLHC_I2C_SCK_SOURCE,LSM303DLHC_I2C_SCK_AF);

GPIO_PinAFConfig(LSM303DLHC_I2C_SDA_GPIO_PORT,LSM303DLHC_I2C_SDA_SOURCE,LSM303DLHC_I2C_SDA_AF);

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;

GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;

GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_DOWN;

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;

/*I2CSCKpinconfiguration*/

GPIO_InitStructure.GPIO_Pin=LSM303DLHC_I2C_SCK_PIN;

GPIO_Init(LSM303DLHC_I2C_SCK_GPIO_PORT,&GPIO_InitStructure);

/*I2CSDApinconfiguration*/

GPIO_InitStructure.GPIO_Pin=LSM303DLHC_I2C_SDA_PIN;

GPIO_Init(LSM303DLHC_I2C_SDA_GPIO_PORT,&GPIO_InitStructure);

/*MemsDRDY*/

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN;

GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;

GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;

/*MemsDRDYpinconfiguration*/

GPIO_InitStructure.GPIO_Pin=LSM303DLHC_DRDY_PIN;

GPIO_Init(LSM303DLHC_DRDY_GPIO_PORT,&GPIO_InitStructure);

/*ConnectEXTILinetoMemsDRDYPin*/

SYSCFG_EXTILineConfig(LSM303DLHC_DRDY_EXTI_PORT_SOURCE,LSM303DLHC_DRDY_EXTI_PIN_SOURCE);

EXTI_InitStructure.EXTI_Line=LSM303DLHC_DRDY_EXTI_LINE;

EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;

EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising;

EXTI_InitStructure.EXTI_LineCmd=ENABLE;

EXTI_Init(&EXTI_InitStructure);

/*I2Cconfiguration-------------------------------------------------------*/

I2C_InitStructure.I2C_Mode=I2C_Mode_I2C;

I2C_InitStructure.I2C_AnalogFilter=I2C_AnalogFilter_Enable;

I2C_InitStructure.I2C_DigitalFilter=0x00;

I2C_InitStructure.I2C_OwnAddress1=0x00;

I2C_InitStructure.I2C_Ack=I2C_Ack_Enable;

I2C_InitStructure.I2C_AcknowledgedAddress=I2C_AcknowledgedAddress_7bit;

I2C_InitStructure.I2C_Timing=0x00902025;

/*ApplyLSM303DLHC_I2Cconfigurationafterenablingit*/

I2C_Init(LSM303DLHC_I2C,&I2C_InitStructure);

/*LSM303DLHC_I2CPeripheralEnable*/

I2C_Cmd(LSM303DLHC_I2C,ENABLE);

/*ConfigureGPIOPINstodetectInterrupts*/

GPIO_InitStructure.GPIO_Pin=LSM303DLHC_I2C_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(LSM303DLHC_I2C_INT1_GPIO_PORT,&GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin=LSM303DLHC_I2C_INT2_PIN;

GPIO_Init(LSM303DLHC_I2C_INT2_GPIO_PORT,&GPIO_InitStructure);

}

2.LSM303DLHC芯片初始化MAG(磁力)寄存器函数

给地址寄存器写值及功能参见LSM303DLHC数据手册

voidLSM303DLHC_MagInit(LSM303DLHCMag_InitTypeDef*LSM303DLHC_InitStruct)

{

uint8_tcra_regm=0x00,crb_regm=0x00,mr_regm=0x00;

/*Configurethelowlevelinterface---------------------------------------*/

LSM303DLHC_InitStructure.Temperature_Sensor=LSM303DLHC_TEMPSENSOR_DISABLE;//配置值0x00

LSM303DLHC_InitStructure.MagOutput_DataRate=LSM303DLHC_ODR_30_HZ;//配置值0x14

LSM303DLHC_InitStructure.MagFull_Scale=LSM303DLHC_FS_8_1_GA;//配置值0xE0

LSM303DLHC_InitStructure.Working_Mode=LSM303DLHC_CONTINUOS_CONVERSION;//配置值0x00

LSM303DLHC_LowLevel_Init();

/*ConfigureMEMS:

tempandDatarate*/

cra_regm|=(uint8_t)(LSM303DLHC_InitStruct->Temperature_Sensor|LSM303DLHC_InitStruct->MagOutput_DataRate);

/*ConfigureMEMS:

fullScale*/

crb_regm|=(uint8_t)(LSM303DLHC_InitStruct->MagFull_Scale);

/*ConfigureMEMS:

workingmode*/

mr_regm|=(uint8_t)(LSM303DLHC_InitStruct->Working_Mode);

/*WritevaluetoMagMEMSCRA_REGregsister*/

LSM303DLHC_Write(MAG_I2C_ADDRESS,LSM303DLHC_CRA_REG_M,&cra_regm);

/*WritevaluetoMagMEMSCRB_REGregsister*/

LSM303DLHC_Write(MAG_I2C_ADDRESS,LSM303DLHC_CRB_REG_M,&crb_regm);

/*WritevaluetoMagMEMSMR_REGregsister*/

LSM303DLHC_Write(MAG_I2C_ADDRESS,LSM303DLHC_MR_REG_M,&mr_regm);

}

3.LSM303DLHC芯片初始化ACC(加速度)寄存器函数

voidLSM303DLHC_AccInit(LSM303DLHCAcc_InitTypeDef*LSM303DLHC_InitStruct)

{

uint8_tctrl1=0x00,ctrl4=0x00;

/*Configurethelowlevelinterface---------------------------------------*/

LSM303DLHCAcc_InitStructure.Power_Mode=LSM303DLHC_NORMAL_MODE;//配置值0x00

LSM303DLHCAcc_InitStructure.AccOutput_DataRate=LSM303DLHC_ODR_50_HZ;//配置值0x40

LSM303DLHCAcc_InitStructure.Axes_Enable=LSM303DLHC_AXES_ENABLE;//配置值0x07

LSM303DLHCAcc_InitStructure.AccFull_Scale=LSM303DLHC_FULLSCALE_2G;//配置值0x00

LSM303DLHCAcc_InitStructure.BlockData_Update=LSM303DLHC_BlockUpdate_Continous;//配置值0x00

LSM303DLHCAcc_InitStructure.Endianness=LSM303DLHC_BLE_LSB;//配置值0x00

LSM303DLHCAcc_InitStructure.High_Resolution=LSM303DLHC_HR_ENABLE;//配置值0x08

LSM303DLHC_LowLevel_Init();

/*ConfigureMEMS:

datarate,powermode,fullscaleandaxes*/

ctrl1|=(uint8_t)(LSM303DLHC_InitStruct->Power_Mode|LSM303DLHC_InitStruct->AccOutput_DataRate|\

LSM303DLHC_InitStruct->Axes_Enable);

ctrl4|=(uint8_t)(LSM303DLHC_InitStruct->BlockData_Update|LSM303DLHC_InitStruct->Endianness|\

LSM303DLHC_InitStruct->AccFull_Scale|LSM303DLHC_InitStruct->High_Resolution);

/*WritevaluetoACCMEMSCTRL_REG1regsister*/

LSM303DLHC_Write(ACC_I2C_ADDRESS,LSM303DLHC_CTRL_REG1_A,&ctrl1);

/*WritevaluetoACCMEMSCTRL_REG4regsister*/

LSM303DLHC_Write(ACC_I2C_ADDRESS,LSM303DLHC_CTRL_REG4_A,&ctrl4);

}

/*FilltheaccelerometerLPFstructure*/

LSM303DLHCFilter_InitStructure.HighPassFilter_Mode_Selection=LSM303DLHC_HPM_NORMAL_MODE;//配置值0x80

LSM303DLHCFilter_InitStructure.HighPassFilter_CutOff_Frequency=LSM303DLHC_HPFCF_16;//配置值0x10

LSM303DLHCFilter_InitStructure.HighPassFilter_AOI1=LSM303DLHC_HPF_AOI1_DISABLE;//配置值0x00

LSM303DLHCFilter_InitStructure.HighPassFilter_AOI2=LSM303DLHC_HPF_AOI2_DISABLE;//配置值0x00

/*ConfiguretheaccelerometerLPFmainparameters*/

LSM303DLHC_AccFilterConfig(&LSM303DLHCFilter_InitStructure);

4.I2C通信读、写LSM303DLHC芯片寄存器封装函数

I2C读取寄存器封装函数

uint16_tLSM303DLHC_Read(uint8_tDeviceAddr,uint8_tRegAddr,uint8_t*pBuffer,uint16_tNumByteToRead)

{

/*TestonBUSYFlag*/

LSM303DLHC_Timeout=LSM303DLHC_LONG_TIMEOUT;

while(I2C_GetFlagStatus(LSM303DLHC_I2C,I2C_ISR_BUSY)!

=RESET)

{

if((LSM303DLHC_Timeout--)==0)returnLSM303DLHC_TIMEOUT_UserCallback();

}

/*Configureslaveaddress,nbytes,reload,endmodeandstartorstopgeneration*/

I2C_TransferHandling(LSM303DLHC_I2C,DeviceAddr,1,I2C_SoftEnd_Mode,I2C_Generate_Start_Write);

/*WaituntilTXISflagisset*/

LSM303DLHC_Timeout=LSM303DLHC_LONG_TIMEOUT;

while(I2C_GetFlagStatus(LSM303DLHC_I2C,I2C_ISR_TXIS)==RESET)

{

if((LSM303DLHC_Timeout--)==0)returnLSM303DLHC_TIMEOUT_UserCallback();

}

if(NumByteToRead>1)

RegAddr|=0x80;

/*SendRegisteraddress*/

I2C_SendData(LSM303DLHC_I2C,(uint8_t)RegAddr);

/*WaituntilTCflagisset*/

LSM303DLHC_Timeout=LSM303DLHC_LONG_TIMEOUT;

while(I2C_GetFlagStatus(LSM303DLHC_I2C,I2C_ISR_TC)==RESET)

{

if((LSM303DLHC_Timeout--)==0)returnLSM303DLHC_TIMEOUT_UserCallback();

}

/*Configureslaveaddress,nbytes,reload,endmodeandstartorstopgeneration*/

I2C_TransferHandling(LSM303DLHC_I2C,DeviceAddr,NumByteToRead,I2C_AutoEnd_Mode,I2C_Generate_Start_Read);

/*Waituntilalldataarereceived*/

while(NumByteToRead)

{

/*WaituntilRXNEflagisset*/

LSM303DLHC_Timeout=LSM303DLHC_LONG_TIMEOUT;

while(I2C_GetFlagStatus(LSM303DLHC_I2C,I2C_ISR_RXNE)==RESET)

{

if((LSM303DLHC_Timeout--)==0)returnLSM303DLHC_TIMEOUT_UserCallback();

}

/*ReaddatafromRXDR*/

*pBuffer=I2C_ReceiveData(LSM303DLHC_I2C);

/*Pointtothenextlocationwherethebytereadwillbesaved*/

pBuffer++;

/*Decrementthereadbytescounter*/

NumByteToRead--;

}

/*WaituntilSTOPFflagisset*/

LSM303DLHC_Timeout=LSM303DLHC_LONG_TIMEOUT;

while(I2C_GetFlagStatus(LSM303DLHC_I2C,I2C_ISR_STOPF)==RESET)

{

if((LSM303DLHC_Timeout--)==0)returnLSM303DLHC_TIMEOUT_UserCallback();

}

/*ClearSTOPFflag*/

I2C_ClearFlag(LSM303DLHC_I2C,I2C_ICR_STOPCF);

/*IfalloperationsOK*/

returnLSM303DLHC_OK;

}

I2C写寄存器封装函数

uint16_tLSM303DLHC_Write(uint8_tDeviceAddr,uint8_tRegAddr,uint8_t*pBuffer)

{

/*TestonBUSYFlag*/

LSM303DLHC_Timeout=LSM303DLHC_LONG_TIMEOUT;

while(I2C_GetFlagStatus(LSM303DLHC_I2C,I2C_ISR_BUSY)!

=RESET)

{

if((LSM303DLHC_Timeout--)==0)returnLSM303DLHC_TIMEOUT_UserCallback();

}

/*Configureslaveaddress,nbytes,reload,endmodeandstartorstopgeneration*/

I2C_TransferHandling(LSM303DLHC_I2C,DeviceAddr,1,I2C_Reload_Mode,I2C_Generate_Start_Write);

/*WaituntilTXISflagisset*/

LSM303DLHC_Timeout=LSM303DLHC_LONG_TIMEOUT;

while(I2C_GetFlagStatus(LSM303DLHC_I2C,I2C_ISR_TXIS)==RESET)

{

if((LSM303DLHC_Timeout--)==0)returnLSM303DLHC_TIMEOUT_UserCallback();

}

/*SendRegisteraddress*/

I2C_SendData(LSM303DLHC_I2C,(uint8_t)RegAddr);

/*WaituntilTCRflagisset*/

LSM303DLHC_Timeout=LSM303DLHC_LONG_TIMEOUT;

while(I2C_GetFlagStatus(LSM303DLHC_I2C,I2C_ISR_TCR)==RESET)

{

if((LSM303DLHC_Timeout--)==0)returnLSM303DLHC_TIMEOUT_UserCallback();

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 表格模板 > 合同协议

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2