已阅读5页,还剩6页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
LSM303DLHC应用单片机程序-STM32F3031. 单片机端口配置初始化 以STM32F303程序为例 static void LSM303DLHC_LowLevel_Init(void) GPIO_InitTypeDef GPIO_InitStructure; EXTI_InitTypeDef EXTI_InitStructure; I2C_InitTypeDef I2C_InitStructure; /* Enable the I2C periph */ RCC_APB1PeriphClockCmd(LSM303DLHC_I2C_CLK, ENABLE); /* Enable SCK and SDA GPIO clocks */ RCC_AHBPeriphClockCmd(LSM303DLHC_I2C_SCK_GPIO_CLK | LSM303DLHC_I2C_SDA_GPIO_CLK , ENABLE); /* Enable INT1 GPIO clock */ RCC_AHBPeriphClockCmd(LSM303DLHC_I2C_INT1_GPIO_CLK, ENABLE); /* Enable INT2 GPIO clock */ RCC_AHBPeriphClockCmd(LSM303DLHC_I2C_INT2_GPIO_CLK, ENABLE); /* Enable DRDY clock */ 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; /* I2C SCK pin configuration */ GPIO_InitStructure.GPIO_Pin = LSM303DLHC_I2C_SCK_PIN; GPIO_Init(LSM303DLHC_I2C_SCK_GPIO_PORT, &GPIO_InitStructure); /* I2C SDA pin configuration */ GPIO_InitStructure.GPIO_Pin = LSM303DLHC_I2C_SDA_PIN; GPIO_Init(LSM303DLHC_I2C_SDA_GPIO_PORT, &GPIO_InitStructure); /* Mems DRDY */ 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; /* Mems DRDY pin configuration */ GPIO_InitStructure.GPIO_Pin = LSM303DLHC_DRDY_PIN; GPIO_Init(LSM303DLHC_DRDY_GPIO_PORT, &GPIO_InitStructure); /* Connect EXTI Line to Mems DRDY Pin */ 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); /* I2C configuration -*/ 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; /* Apply LSM303DLHC_I2C configuration after enabling it */ I2C_Init(LSM303DLHC_I2C, &I2C_InitStructure); /* LSM303DLHC_I2C Peripheral Enable */ I2C_Cmd(LSM303DLHC_I2C, ENABLE); /* Configure GPIO PINs to detect Interrupts */ 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数据手册void LSM303DLHC_MagInit(LSM303DLHCMag_InitTypeDef *LSM303DLHC_InitStruct) uint8_t cra_regm = 0x00, crb_regm = 0x00, mr_regm = 0x00; /* Configure the low level interface -*/ LSM303DLHC_InitStructure.Temperature_Sensor = LSM303DLHC_TEMPSENSOR_DISABLE; /配置值0x00LSM303DLHC_InitStructure.MagOutput_DataRate =LSM303DLHC_ODR_30_HZ ; /配置值0x14LSM303DLHC_InitStructure.MagFull_Scale = LSM303DLHC_FS_8_1_GA; /配置值0xE0LSM303DLHC_InitStructure.Working_Mode = LSM303DLHC_CONTINUOS_CONVERSION; /配置值0x00 LSM303DLHC_LowLevel_Init(); /* Configure MEMS: temp and Data rate */ cra_regm |= (uint8_t) (LSM303DLHC_InitStruct-Temperature_Sensor | LSM303DLHC_InitStruct-MagOutput_DataRate); /* Configure MEMS: full Scale */ crb_regm |= (uint8_t) (LSM303DLHC_InitStruct-MagFull_Scale); /* Configure MEMS: working mode */ mr_regm |= (uint8_t) (LSM303DLHC_InitStruct-Working_Mode); /* Write value to Mag MEMS CRA_REG regsister */ LSM303DLHC_Write(MAG_I2C_ADDRESS, LSM303DLHC_CRA_REG_M, &cra_regm); /* Write value to Mag MEMS CRB_REG regsister */ LSM303DLHC_Write(MAG_I2C_ADDRESS, LSM303DLHC_CRB_REG_M, &crb_regm); /* Write value to Mag MEMS MR_REG regsister */ LSM303DLHC_Write(MAG_I2C_ADDRESS, LSM303DLHC_MR_REG_M, &mr_regm);3. LSM303DLHC芯片初始化ACC(加速度)寄存器函数 void LSM303DLHC_AccInit(LSM303DLHCAcc_InitTypeDef *LSM303DLHC_InitStruct) uint8_t ctrl1 = 0x00, ctrl4 = 0x00; /* Configure the low level interface -*/ 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(); /* Configure MEMS: data rate, power mode, full scale and axes */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); /* Write value to ACC MEMS CTRL_REG1 regsister */ LSM303DLHC_Write(ACC_I2C_ADDRESS, LSM303DLHC_CTRL_REG1_A, &ctrl1); /* Write value to ACC MEMS CTRL_REG4 regsister */ LSM303DLHC_Write(ACC_I2C_ADDRESS, LSM303DLHC_CTRL_REG4_A, &ctrl4); /* Fill the accelerometer LPF structure */ 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 /* Configure the accelerometer LPF main parameters */ LSM303DLHC_AccFilterConfig(&LSM303DLHCFilter_InitStructure);4. I2C通信读、写LSM303DLHC芯片寄存器封装函数 I2C读取寄存器封装函数 uint16_t LSM303DLHC_Read(uint8_t DeviceAddr, uint8_t RegAddr, uint8_t* pBuffer, uint16_t NumByteToRead) /* Test on BUSY Flag */ LSM303DLHC_Timeout = LSM303DLHC_LONG_TIMEOUT; while(I2C_GetFlagStatus(LSM303DLHC_I2C, I2C_ISR_BUSY) != RESET) if(LSM303DLHC_Timeout-) = 0) return LSM303DLHC_TIMEOUT_UserCallback(); /* Configure slave address, nbytes, reload, end mode and start or stop generation */ I2C_TransferHandling(LSM303DLHC_I2C, DeviceAddr, 1, I2C_SoftEnd_Mode, I2C_Generate_Start_Write); /* Wait until TXIS flag is set */ LSM303DLHC_Timeout = LSM303DLHC_LONG_TIMEOUT; while(I2C_GetFlagStatus(LSM303DLHC_I2C, I2C_ISR_TXIS) = RESET) if(LSM303DLHC_Timeout-) = 0) return LSM303DLHC_TIMEOUT_UserCallback(); if(NumByteToRead1) RegAddr |= 0x80; /* Send Register address */ I2C_SendData(LSM303DLHC_I2C, (uint8_t)RegAddr); /* Wait until TC flag is set */ LSM303DLHC_Timeout = LSM303DLHC_LONG_TIMEOUT; while(I2C_GetFlagStatus(LSM303DLHC_I2C, I2C_ISR_TC) = RESET) if(LSM303DLHC_Timeout-) = 0) return LSM303DLHC_TIMEOUT_UserCallback(); /* Configure slave address, nbytes, reload, end mode and start or stop generation */ I2C_TransferHandling(LSM303DLHC_I2C, DeviceAddr, NumByteToRead, I2C_AutoEnd_Mode, I2C_Generate_Start_Read); /* Wait until all data are received */ while (NumByteToRead) /* Wait until RXNE flag is set */ LSM303DLHC_Timeout = LSM303DLHC_LONG_TIMEOUT; while(I2C_GetFlagStatus(LSM303DLHC_I2C, I2C_ISR_RXNE) = RESET) if(LSM303DLHC_Timeout-) = 0) return LSM303DLHC_TIMEOUT_UserCallback(); /* Read data from RXDR */ *pBuffer = I2C_ReceiveData(LSM303DLHC_I2C); /* Point to the next location where the byte read will be saved */ pBuffer+; /* Decrement the read bytes counter */ NumByteToRead-; /* Wait until STOPF flag is set */ LSM303DLHC_Timeout = LSM303DLHC_LONG_TIMEOUT; while(I2C_GetFlagStatus(LSM303DLHC_I2C, I2C_ISR_STOPF) = RESET) if(LSM303DLHC_Timeout-) = 0) return LSM303DLHC_TIMEOUT_UserCallback(); /* Clear STOPF flag */ I2C_ClearFlag(LSM303DLHC_I2C, I2C_ICR_STOPCF); /* If all operations OK */ return LSM303DLHC_OK; I2C写寄存器封装函数uint16_t LSM303DLHC_Write(uint8_t DeviceAddr, uint8_t RegAddr, uint8_t* pBuffer) /* Test on BUSY Flag */ LSM303DLHC_Timeout = LSM303DLHC_LONG_TIMEOUT; while(I2C_GetFlagStatus(LSM303DLHC_I2C, I2C_ISR_BUSY) != RESET) if(LSM303DLHC_Timeout-) = 0) return LSM303DLHC_TIMEOUT_UserCallback(); /* Configure slave address, nbytes, reload, end mode and start or stop generation */ I2C_TransferHandling(LSM303DLHC_I2C, DeviceAddr, 1, I2C_Reload_Mode, I2C_Generate_Start_Write); /* Wait until TXIS flag is set */ LSM303DLHC_Timeout = LSM303DLHC_LONG_TIMEOUT; while(I2C_GetFlagStatus(LSM303DLHC_I2C, I2C_ISR_TXIS) = RESET) if(LSM303DLHC_Timeout-) = 0) return LSM303DLHC_TIMEOUT_UserCallback(); /* Send Register address */ I2C_SendData(LSM303DLHC_I2C, (uint8_t) RegAddr); /* Wait until TCR flag is set */ LSM303DLHC_Timeout = LSM303DLHC_LONG_TIMEOUT; while(I2C_GetFlagStatus(LSM303DLHC_I2C, I2C_ISR_TCR) = RESET) if(LSM303DLHC_Timeout-) = 0) return LSM303DLHC_TIMEOUT_UserCallback(); /* Configure slave address, nbytes, reload, end mode and start or stop generation */ I2C_TransferHandling(LSM303DLHC_I2C, DeviceAddr, 1, I2C_AutoEnd_Mode, I2C_No_StartStop); /* Wait until TXIS flag is set */ LSM303DLHC_Timeout = LSM303DLHC_LONG_TIMEOUT; while(I2C_GetFlagStatus(LSM303DLHC_I2C, I2C_ISR_TXIS) = RESET) if(LSM303DLHC_Timeout-) = 0) return LSM303DLHC_TIMEOUT_UserCallback(); /* Write data to TXDR */ I2C_SendData(LSM303DLHC_I2C, *pBuffer); /* Wait until STOPF flag is set */ LSM303DLHC_Timeout = LSM303DLHC_LONG_TIMEOUT; while(I2C_GetFlagStatus(LSM303DLHC_I2C, I2C_ISR_STOPF) = RESET) if(LSM303DLHC_Timeout-) = 0) return LSM303DLHC_TIMEOUT_UserCallback(); /* Clear STOPF flag */ I2C_ClearFlag(LSM303DLHC_I2C, I2C_ICR_STOPCF); return LSM303DLHC_OK;5. 从LSM303DLHC取出3轴磁力数值(Mag),并进行单位处理。 void Demo_CompassReadMag (float* pfData) static uint8_t buffer6 = 0; uint8_t CTRLB = 0; uint16_t Magn_Sensitivity_XY = 0, Magn_Sensitivity_Z = 0; uint8_t i =0; LSM303DLHC_Read(MAG_I2C_ADDRESS, LSM303DLHC_CRB_REG_M, &CTRLB, 1); LSM303DLHC_Read(MAG_I2C_ADDRESS, LSM303DLHC_OUT_X_H_M, buffer, 1); LSM303DLHC_Read(MAG_I2C_ADDRESS, LSM303DLHC_OUT_X_L_M, buffer+1, 1); LSM303DLHC_Read(MAG_I2C_ADDRESS, LSM303DLHC_OUT_Y_H_M, buffer+2, 1); LSM303DLHC_Read(MAG_I2C_ADDRESS, LSM303DLHC_OUT_Y_L_M, buffer+3, 1); LSM303DLHC_Read(MAG_I2C_ADDRESS, LSM303DLHC_OUT_Z_H_M, buffer+4, 1); LSM303DLHC_Read(MAG_I2C_ADDRESS, LSM303DLHC_OUT_Z_L_M, buffer+5, 1); /* Switch the sensitivity set in the CRTLB*/ switch(CTRLB & 0xE0) case LSM303DLHC_FS_1_3_GA: /*! magnetometer X Y axes sensitivity for 1.3 Ga full scale LSB/Ga */ Magn_Sensitivity_XY = LSM303DLHC_M_SENSITIVITY_XY_1_3Ga; /数值1100 Magn_Sensitivity_Z = LSM303DLHC_M_SENSITIVITY_Z_1_3Ga; /数值980 break; case LSM303DLHC_FS_1_9_GA: Magn_Sensitivity_XY = LSM303DLHC_M_SENSITIVITY_XY_1_9Ga;/数值855 Magn_Sensitivity_Z = LSM303DLHC_M_SENSITIVITY_Z_1_9Ga; /数值760 break; case LSM303DLHC_FS_2_5_GA: Magn_Sensitivity_XY = LSM303DLHC_M_SENSITIVITY_XY_2_5Ga; /数值670 Magn_Sensitivity_Z = LSM303DLHC_M_SENSITIVITY_Z_2_5Ga; /数值600 break; case LSM303DLHC_FS_4_0_GA: Magn_Sensitivity_XY = LSM303DLHC_M_SENSITIVITY_XY_4Ga; /数值450 Magn_Sensitivity_Z = LSM303DLHC_M_SENSITIVITY_Z_4Ga; /数值400 break; case LSM303DLHC_FS_4_7_GA: Magn_Sensitivity_XY = LSM303DLHC_M_SENSITIVITY_XY_4_7Ga; /数值400 Magn_Sensitivity_Z = LSM303DLHC_M_SENSITIVITY_Z_4_7Ga;/数值355 break; case LSM303DLHC_FS_5_6_GA: Magn_Sensitivity_XY = LSM303DLHC_M_SENSITIVITY_XY_5_6Ga;/数值330 Magn_Sensitivity_Z = LSM303DLHC_M_SENSITIVITY_Z_5_6Ga;/数值295 break; case LSM303DLHC_FS_8_1_GA: Magn_Sensitivity_XY = LSM303DLHC_M_SENSITIVITY_XY_8_1Ga;/数值230 Magn_Sensitivity_Z = LSM303DLHC_M_SENSITIVITY_Z_8_1Ga;/数值205 break; /* 将数据从寄存器读出后*1000转换为mg然后除以量程*/ for(i=0; i2; i+) pfDatai=(float)(int16_t)(uint16_t)buffer2*i 8) + buffer2*i+1)*1000)/Magn_Sensitivity_XY; pfData2=(float)(int16_t)(uint16_t)buffer4 8) + buffer5)*1000)/Magn_Sensitivity_Z;6. 从LSM303DLHC取出3轴加速度数值,并进行处理。 void Demo_CompassReadAcc(float* pfData) int16_t pnRawData3; uint8_t ctrlx2; uint8_t buffer6, cDivider; uint8_t i = 0; float LSM_Acc_Sensitivity = LSM_Acc_Sensitivity_2g; /* Read the register content */ LSM303DLHC_Read(ACC_I2C_ADDRESS, LSM303DLHC_CTRL_REG4_A, ctrlx,2); LSM303DLHC_Read(ACC_I2C_ADDRESS, LSM303DLHC_OUT_X_L_A, buffer, 6); if(ctrlx1&0x40) cDivider=64;/大端 else cDivider=16; /小端 /* check in the control register4 the data alignment*/ /*从寄存器读出的数据按照大小端格式进行数据转换*/ if(!(ctrlx0 & 0x40) | (ctrlx1 & 0x40) /* Little Endian Mode or FIFO mode */ for(i=0; i3; i+) pnRawDatai=(int16_t)(uint16_t)buffer2*i+1 8) + buffer2*i)/cDivider; else /* Big Endian Mode */ for(i=0; i3; i+) pnRawDatai=(int16_t)(uint16_t)buffer2*i 8) + buffer2*i+1)/cDivider; /* Read the register content */ LSM303DLHC_Read(ACC_I2C_ADDRESS, LSM303DLHC_CTRL_REG4_A, ctrlx,2); if(ctrlx1&0x40) /* FIFO mode */ LSM_Acc_Sensitivity = 0.25; else /* normal mode */ /* switch the sensitivity value set in the CRTL4*/ switch(ctrlx0 & 0x30) case LSM303DLHC_FULLSCALE_2G: LSM_Acc_Se
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二手房个人交易合同
- 客车二保合同
- 租房房屋租赁合同
- 深圳市建设工程合同
- 疫情期间复工合同
- 计时计价合同
- 国外电子合同
- 工厂转让合同
- 员工短期劳动合同
- 员工终止合同
- 2025年10月广东深圳市大鹏新区群团工作部招聘编外人员1人考试模拟试题及答案解析
- GB/T 46401-2025养老机构认知障碍老年人照护指南
- 2025江苏南京玄武区招聘社区工作者和“两新”组织专职党务工作人员70人备考考试题库附答案解析
- 基于六经病欲解时理论运用《伤寒论》经方治疗失眠症的创新性研究
- 箱式变电站迁移施工方案
- 2025江西吉安市国资委出资监管企业外部董事人选招录6人备考考试题库附答案解析
- 脚手架工程监理实施细则(盘扣式脚手架)
- 建筑施工现场质量安全检查表模板
- 套筒工艺施工方案
- 2025年高考浙江卷政治真题及答案解析
- 员工自驾车安全培训课件
评论
0/150
提交评论