文档库 最新最全的文档下载
当前位置:文档库 › 3轴电子罗盘HM5883应用

3轴电子罗盘HM5883应用

3轴电子罗盘HM5883应用
3轴电子罗盘HM5883应用

1.原理图

2.程序

[1] 头文件1

/****************************************Copyright (c)************************************************** **

** https://www.wendangku.net/doc/2412838451.html,

**

**--------------File Info-------------------------------------------------------------------------------

** File name: 24C02.h

** Descriptions: 24C02 操作函数库

**

**------------------------------------------------------------------------------------------------------

** Created by: A VRman

** Created date: 2010-10-29

** V ersion: 1.0

** Descriptions: The original version

**

**------------------------------------------------------------------------------------------------------

** Modified by:

** Modified date:

** V ersion:

** Descriptions:

********************************************************************************************************/ #ifndef __HMC5883L_H

#define __HMC5883L_H

/* Includes ------------------------------------------------------------------*/

#include "stm32f10x_lib.h"

#include "GrobalV ariable.h"

/* Private define ------------------------------------------------------------*/

#define A T24C01A /* 24C01A,I2C时序和往后的24C02一样*/

//#define A T24C01 /* 24C01,I2C的时序和普通的有点不同*/

#define ADDR_24LC02 0xA0

#define I2C_P AGESIZE 4 /* 24C01/01A页缓冲是4个*/

/* Private function prototypes -----------------------------------------------*/

void I2C_Configuration(void);

u8 I2C_Read(I2C_TypeDef *I2Cx,u8 I2C_Addr,u8 addr,u8 *buf,u16 num);

u8 I2C_Write(I2C_TypeDef *I2Cx,u8 I2C_Addr,u8 addr,u8 *buf,u16 num);

///void HMC5883L_test(void);

void Axia3AngInit(void) ;

void Detect3AxiaAng(void);

#endif

/********************************************************************************************************* END FILE

*********************************************************************************************************/ [2] 头文件2

/******************** (C) COPYRIGHT 2008 STMicroelectronics ********************

* File Name : stm32f10x_i2c.h

* Author : MCD Application T eam

* V ersion : V2.0.1

* Date : 06/13/2008

* Description : This file contains all the functions prototypes for the

* I2C firmware library.

********************************************************************************

* THE PRESENT FIRMW ARE WHICH IS FOR GUIDANCE ONL Y AIMS A T PROVIDING CUSTOMERS

* WITH CODING INFORMA TION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SA VE TIME.

* AS A RESUL T, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT,

* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE

* CONTENT OF SUCH FIRMW ARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING

* INFORMA TION CONT AINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.

*******************************************************************************/

/* Define to prevent recursive inclusion -------------------------------------*/

#ifndef __STM32F10x_I2C_H

#define __STM32F10x_I2C_H

/* Includes ------------------------------------------------------------------*/

#include "stm32f10x_map.h"

/* Exported types ------------------------------------------------------------*/

/* I2C Init structure definition */

typedef struct

{

u16 I2C_Mode;

u16 I2C_DutyCycle;

u16 I2C_OwnAddress1;

u16 I2C_Ack;

u16 I2C_AcknowledgedAddress;

u32 I2C_ClockSpeed;

}I2C_InitTypeDef;

/* Exported constants --------------------------------------------------------*/

#define IS_I2C_ALL_PERIPH(PERIPH) (((*(u32*)&(PERIPH)) == I2C1_BASE) || \

((*(u32*)&(PERIPH)) == I2C2_BASE))

/* I2C modes */

#define I2C_Mode_I2C ((u16)0x0000)

#define I2C_Mode_SMBusDevice ((u16)0x0002)

#define I2C_Mode_SMBusHost ((u16)0x000A)

#define IS_I2C_MODE(MODE) (((MODE) == I2C_Mode_I2C) || \

((MODE) == I2C_Mode_SMBusDevice) || \

((MODE) == I2C_Mode_SMBusHost))

/* I2C duty cycle in fast mode */

#define I2C_DutyCycle_16_9 ((u16)0x4000)

#define I2C_DutyCycle_2 ((u16)0xBFFF)

#define IS_I2C_DUTY_CYCLE(CYCLE) (((CYCLE) == I2C_DutyCycle_16_9) || \

((CYCLE) == I2C_DutyCycle_2))

/* I2C cknowledgementy */

#define I2C_Ack_Enable ((u16)0x0400)

#define I2C_Ack_Disable ((u16)0x0000)

#define IS_I2C_ACK_ST A TE(ST A TE) (((ST A TE) == I2C_Ack_Enable) || \

((ST A TE) == I2C_Ack_Disable))

/* I2C transfer direction */

#define I2C_Direction_Transmitter ((u8)0x00)

#define I2C_Direction_Receiver ((u8)0x01)

#define IS_I2C_DIRECTION(DIRECTION) (((DIRECTION) == I2C_Direction_Transmitter) || \

((DIRECTION) == I2C_Direction_Receiver))

/* I2C acknowledged address defines */

#define I2C_AcknowledgedAddress_7bit ((u16)0x4000)

#define I2C_AcknowledgedAddress_10bit ((u16)0xC000)

#define IS_I2C_ACKNOWLEDGE_ADDRESS(ADDRESS) (((ADDRESS) == I2C_AcknowledgedAddress_7bit) || \

((ADDRESS) == I2C_AcknowledgedAddress_10bit))

/* I2C registers */

#define I2C_Register_CR1 ((u8)0x00)

#define I2C_Register_CR2 ((u8)0x04)

#define I2C_Register_OAR1 ((u8)0x08)

#define I2C_Register_OAR2 ((u8)0x0C)

#define I2C_Register_DR ((u8)0x10)

#define I2C_Register_SR1 ((u8)0x14)

#define I2C_Register_SR2 ((u8)0x18)

#define I2C_Register_CCR ((u8)0x1C)

#define I2C_Register_TRISE ((u8)0x20)

#define IS_I2C_REGISTER(REGISTER) (((REGISTER) == I2C_Register_CR1) || \

((REGISTER) == I2C_Register_CR2) || \

((REGISTER) == I2C_Register_OAR1) || \

((REGISTER) == I2C_Register_OAR2) || \

((REGISTER) == I2C_Register_DR) || \

((REGISTER) == I2C_Register_SR1) || \

((REGISTER) == I2C_Register_SR2) || \

((REGISTER) == I2C_Register_CCR) || \

((REGISTER) == I2C_Register_TRISE))

/* I2C SMBus alert pin level */

#define I2C_SMBusAlert_Low ((u16)0x2000)

#define I2C_SMBusAlert_High ((u16)0xDFFF)

#define IS_I2C_SMBUS_ALERT(ALERT) (((ALERT) == I2C_SMBusAlert_Low) || \

((ALERT) == I2C_SMBusAlert_High))

/* I2C PEC position */

#define I2C_PECPosition_Next ((u16)0x0800)

#define I2C_PECPosition_Current ((u16)0xF7FF)

#define IS_I2C_PEC_POSITION(POSITION) (((POSITION) == I2C_PECPosition_Next) || \

((POSITION) == I2C_PECPosition_Current))

/* I2C interrupts definition */

#define I2C_IT_BUF ((u16)0x0400)

#define I2C_IT_EVT ((u16)0x0200)

#define I2C_IT_ERR ((u16)0x0100)

#define IS_I2C_CONFIG_IT(IT) ((((IT) & (u16)0xF8FF) == 0x00) && ((IT) != 0x00))

/* I2C interrupts definition */

#define I2C_IT_SMBALERT ((u32)0x10008000)

#define I2C_IT_TIMEOUT ((u32)0x10004000)

#define I2C_IT_PECERR ((u32)0x10001000)

#define I2C_IT_OVR ((u32)0x10000800)

#define I2C_IT_AF ((u32)0x10000400)

#define I2C_IT_ARLO ((u32)0x10000200)

#define I2C_IT_BERR ((u32)0x10000100)

#define I2C_IT_TXE ((u32)0x00000080)

#define I2C_IT_RXNE ((u32)0x00000040)

#define I2C_IT_STOPF ((u32)0x60000010)

#define I2C_IT_ADD10 ((u32)0x20000008)

#define I2C_IT_BTF ((u32)0x60000004)

#define I2C_IT_ADDR ((u32)0xA0000002)

#define I2C_IT_SB ((u32)0x20000001)

#define IS_I2C_CLEAR_IT(IT) (((IT) == I2C_IT_SMBALERT) || ((IT) == I2C_IT_TIMEOUT) || \

((IT) == I2C_IT_PECERR) || ((IT) == I2C_IT_OVR) || \

((IT) == I2C_IT_AF) || ((IT) == I2C_IT_ARLO) || \

((IT) == I2C_IT_BERR) || ((IT) == I2C_IT_STOPF) || \

((IT) == I2C_IT_ADD10) || ((IT) == I2C_IT_BTF) || \

((IT) == I2C_IT_ADDR) || ((IT) == I2C_IT_SB))

#define IS_I2C_GET_IT(IT) (((IT) == I2C_IT_SMBALERT) || ((IT) == I2C_IT_TIMEOUT) || \

((IT) == I2C_IT_PECERR) || ((IT) == I2C_IT_OVR) || \

((IT) == I2C_IT_AF) || ((IT) == I2C_IT_ARLO) || \

((IT) == I2C_IT_BERR) || ((IT) == I2C_IT_TXE) || \

((IT) == I2C_IT_RXNE) || ((IT) == I2C_IT_STOPF) || \

((IT) == I2C_IT_ADD10) || ((IT) == I2C_IT_BTF) || \

((IT) == I2C_IT_ADDR) || ((IT) == I2C_IT_SB))

/* I2C flags definition */

#define I2C_FLAG_DUALF ((u32)0x00800000)

#define I2C_FLAG_SMBHOST ((u32)0x00400000)

#define I2C_FLAG_SMBDEF AUL T ((u32)0x00200000)

#define I2C_FLAG_GENCALL ((u32)0x00100000)

#define I2C_FLAG_TRA ((u32)0x00040000)

#define I2C_FLAG_BUSY ((u32)0x00020000)

#define I2C_FLAG_MSL ((u32)0x00010000)

#define I2C_FLAG_SMBALERT ((u32)0x10008000)

#define I2C_FLAG_TIMEOUT ((u32)0x10004000)

#define I2C_FLAG_PECERR ((u32)0x10001000)

#define I2C_FLAG_OVR ((u32)0x10000800)

#define I2C_FLAG_AF ((u32)0x10000400)

#define I2C_FLAG_ARLO ((u32)0x10000200)

#define I2C_FLAG_BERR ((u32)0x10000100)

#define I2C_FLAG_TXE ((u32)0x00000080)

#define I2C_FLAG_RXNE ((u32)0x00000040)

#define I2C_FLAG_STOPF ((u32)0x60000010)

#define I2C_FLAG_ADD10 ((u32)0x20000008)

#define I2C_FLAG_BTF ((u32)0x60000004)

#define I2C_FLAG_ADDR ((u32)0xA0000002)

#define I2C_FLAG_SB ((u32)0x20000001)

#define IS_I2C_CLEAR_FLAG(FLAG) (((FLAG) == I2C_FLAG_SMBALERT) || ((FLAG) == I2C_FLAG_TIMEOUT) || \

((FLAG) == I2C_FLAG_PECERR) || ((FLAG) == I2C_FLAG_OVR) || \

((FLAG) == I2C_FLAG_AF) || ((FLAG) == I2C_FLAG_ARLO) || \

((FLAG) == I2C_FLAG_BERR) || ((FLAG) == I2C_FLAG_STOPF) || \

((FLAG) == I2C_FLAG_ADD10) || ((FLAG) == I2C_FLAG_BTF) || \

((FLAG) == I2C_FLAG_ADDR) || ((FLAG) == I2C_FLAG_SB))

#define IS_I2C_GET_FLAG(FLAG) (((FLAG) == I2C_FLAG_DUALF) || ((FLAG) == I2C_FLAG_SMBHOST) || \

((FLAG) == I2C_FLAG_SMBDEF AUL T) || ((FLAG) == I2C_FLAG_GENCALL) || \

((FLAG) == I2C_FLAG_TRA) || ((FLAG) == I2C_FLAG_BUSY) || \

((FLAG) == I2C_FLAG_MSL) || ((FLAG) == I2C_FLAG_SMBALERT) || \

((FLAG) == I2C_FLAG_TIMEOUT) || ((FLAG) == I2C_FLAG_PECERR) || \

((FLAG) == I2C_FLAG_OVR) || ((FLAG) == I2C_FLAG_AF) || \

((FLAG) == I2C_FLAG_ARLO) || ((FLAG) == I2C_FLAG_BERR) || \

((FLAG) == I2C_FLAG_TXE) || ((FLAG) == I2C_FLAG_RXNE) || \

((FLAG) == I2C_FLAG_STOPF) || ((FLAG) == I2C_FLAG_ADD10) || \

((FLAG) == I2C_FLAG_BTF) || ((FLAG) == I2C_FLAG_ADDR) || \

((FLAG) == I2C_FLAG_SB))

/* I2C Events */

/* EV1 */

#define I2C_EVENT_SLA VE_TRANSMITTER_ADDRESS_MA TCHED ((u32)0x00060082) /* TRA, BUSY, TXE and ADDR flags */

#define I2C_EVENT_SLA VE_RECEIVER_ADDRESS_MA TCHED ((u32)0x00020002) /* BUSY and ADDR flags */

#define I2C_EVENT_SLA VE_TRANSMITTER_SECONDADDRESS_MA TCHED ((u32)0x00860080) /* DUALF, TRA, BUSY and TXE flags */

#define I2C_EVENT_SLA VE_RECEIVER_SECONDADDRESS_MA TCHED ((u32)0x00820000) /* DUALF and BUSY flags */

#define I2C_EVENT_SLA VE_GENERALCALLADDRESS_MA TCHED ((u32)0x00120000) /* GENCALL and BUSY flags */

/* EV2 */

#define I2C_EVENT_SLA VE_BYTE_RECEIVED ((u32)0x00020040) /* BUSY and RXNE flags */

/* EV3 */

#define I2C_EVENT_SLA VE_BYTE_TRANSMITTED ((u32)0x00060084) /* TRA, BUSY, TXE and BTF flags */

/* EV4 */

#define I2C_EVENT_SLA VE_STOP_DETECTED ((u32)0x00000010) /* STOPF flag */

/* EV5 */

#define I2C_EVENT_MASTER_MODE_SELECT ((u32)0x00030001) /* BUSY, MSL and SB flag */

/* EV6 */

#define I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED ((u32)0x00070082) /* BUSY, MSL, ADDR, TXE and TRA flags */

#define I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED ((u32)0x00030002) /* BUSY, MSL and ADDR flags */

/* EV7 */

#define I2C_EVENT_MASTER_BYTE_RECEIVED ((u32)0x00030040) /* BUSY, MSL and RXNE flags */

/* EV8 */

#define I2C_EVENT_MASTER_BYTE_TRANSMITTED ((u32)0x00070084) /* TRA, BUSY, MSL, TXE and BTF flags */

/* EV9 */

#define I2C_EVENT_MASTER_MODE_ADDRESS10 ((u32)0x00030008) /* BUSY, MSL and ADD10 flags */

/* EV3_2 */

#define I2C_EVENT_SLA VE_ACK_F AILURE ((u32)0x00000400) /* AF flag */

#define IS_I2C_EVENT(EVENT) (((EVENT) == I2C_EVENT_SLA VE_TRANSMITTER_ADDRESS_MA TCHED) || \

((EVENT) == I2C_EVENT_SLA VE_RECEIVER_ADDRESS_MA TCHED) || \

((EVENT) == I2C_EVENT_SLA VE_TRANSMITTER_SECONDADDRESS_MA TCHED) || \

((EVENT) == I2C_EVENT_SLA VE_RECEIVER_SECONDADDRESS_MA TCHED) || \

((EVENT) == I2C_EVENT_SLA VE_GENERALCALLADDRESS_MA TCHED) || \

((EVENT) == I2C_EVENT_SLA VE_BYTE_RECEIVED) || \

((EVENT) == (I2C_EVENT_SLA VE_BYTE_RECEIVED | I2C_FLAG_DUALF)) || \

((EVENT) == (I2C_EVENT_SLA VE_BYTE_RECEIVED | I2C_FLAG_GENCALL)) || \

((EVENT) == I2C_EVENT_SLA VE_BYTE_TRANSMITTED) || \

((EVENT) == (I2C_EVENT_SLA VE_BYTE_TRANSMITTED | I2C_FLAG_DUALF)) || \

((EVENT) == (I2C_EVENT_SLA VE_BYTE_TRANSMITTED | I2C_FLAG_GENCALL)) || \

((EVENT) == I2C_EVENT_SLA VE_STOP_DETECTED) || \

((EVENT) == I2C_EVENT_MASTER_MODE_SELECT) || \

((EVENT) == I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED) || \

((EVENT) == I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED) || \

((EVENT) == I2C_EVENT_MASTER_BYTE_RECEIVED) || \

((EVENT) == I2C_EVENT_MASTER_BYTE_TRANSMITTED) || \

((EVENT) == I2C_EVENT_MASTER_MODE_ADDRESS10) || \

((EVENT) == I2C_EVENT_SLA VE_ACK_F AILURE))

/* I2C own address1 -----------------------------------------------------------*/

#define IS_I2C_OWN_ADDRESS1(ADDRESS1) ((ADDRESS1) <= 0x3FF)

/* I2C clock speed ------------------------------------------------------------*/

#define IS_I2C_CLOCK_SPEED(SPEED) (((SPEED) >= 0x1) && ((SPEED) <= 400000))

/* Exported macro ------------------------------------------------------------*/

/* Exported functions ------------------------------------------------------- */

void I2C_DeInit(I2C_TypeDef* I2Cx);

void I2C_Init(I2C_TypeDef* I2Cx, I2C_InitTypeDef* I2C_InitStruct);

void I2C_StructInit(I2C_InitTypeDef* I2C_InitStruct);

void I2C_Cmd(I2C_TypeDef* I2Cx, FunctionalState NewState);

void I2C_DMACmd(I2C_TypeDef* I2Cx, FunctionalState NewState);

void I2C_DMALastTransferCmd(I2C_TypeDef* I2Cx, FunctionalState NewState);

void I2C_GenerateST ART(I2C_TypeDef* I2Cx, FunctionalState NewState);

void I2C_GenerateSTOP(I2C_T ypeDef* I2Cx, FunctionalState NewState);

void I2C_AcknowledgeConfig(I2C_TypeDef* I2Cx, FunctionalState NewState);

void I2C_OwnAddress2Config(I2C_TypeDef* I2Cx, u8 Address);

void I2C_DualAddressCmd(I2C_TypeDef* I2Cx, FunctionalState NewState);

void I2C_GeneralCallCmd(I2C_TypeDef* I2Cx, FunctionalState NewState);

void I2C_ITConfig(I2C_TypeDef* I2Cx, u16 I2C_IT, FunctionalState NewState);

void I2C_SendData(I2C_TypeDef* I2Cx, u8 Data);

u8 I2C_ReceiveData(I2C_TypeDef* I2Cx);

void I2C_Send7bitAddress(I2C_TypeDef* I2Cx, u8 Address, u8 I2C_Direction);

u16 I2C_ReadRegister(I2C_TypeDef* I2Cx, u8 I2C_Register);

void I2C_SoftwareResetCmd(I2C_TypeDef* I2Cx, FunctionalState NewState);

void I2C_SMBusAlertConfig(I2C_TypeDef* I2Cx, u16 I2C_SMBusAlert);

void I2C_TransmitPEC(I2C_TypeDef* I2Cx, FunctionalState NewState);

void I2C_PECPositionConfig(I2C_TypeDef* I2Cx, u16 I2C_PECPosition);

void I2C_CalculatePEC(I2C_TypeDef* I2Cx, FunctionalState NewState);

u8 I2C_GetPEC(I2C_TypeDef* I2Cx);

void I2C_ARPCmd(I2C_TypeDef* I2Cx, FunctionalState NewState);

void I2C_StretchClockCmd(I2C_TypeDef* I2Cx, FunctionalState NewState);

void I2C_FastModeDutyCycleConfig(I2C_TypeDef* I2Cx, u16 I2C_DutyCycle);

u32 I2C_GetLastEvent(I2C_TypeDef* I2Cx);

ErrorStatus I2C_CheckEvent(I2C_TypeDef* I2Cx, u32 I2C_EVENT);

FlagStatus I2C_GetFlagStatus(I2C_TypeDef* I2Cx, u32 I2C_FLAG);

void I2C_ClearFlag(I2C_TypeDef* I2Cx, u32 I2C_FLAG);

ITStatus I2C_GetITStatus(I2C_TypeDef* I2Cx, u32 I2C_IT);

void I2C_ClearITPendingBit(I2C_TypeDef* I2Cx, u32 I2C_IT);

#endif /*__STM32F10x_I2C_H */

/******************* (C) COPYRIGHT 2008 STMicroelectronics *****END OF FILE****/

[3] 源文件1

/****************************************Copyright (c)**************************************************

**

** https://www.wendangku.net/doc/2412838451.html,

**

**--------------File Info-------------------------------------------------------------------------------

** File name: 24C02.c

** Descriptions: 24C02 操作函数库

**

**------------------------------------------------------------------------------------------------------

** Created by: A VRman

** Created date: 2010-10-29

** V ersion: 1.0

** Descriptions: The original version

**

**------------------------------------------------------------------------------------------------------

** Modified by:

** Modified date:

** V ersion:

** Descriptions:

********************************************************************************************************/

/* Includes ------------------------------------------------------------------*/

#include "HMC5883L.h"

#include "Grobalfunction.h"

/*******************************************************************************

* Function Name : I2C_Configuration

* Description : EEPROM管脚配置

* Input : None

* Output : None

* Return : None

* Attention : None

*******************************************************************************/

void I2C_Configuration(void)

{

I2C_InitTypeDef I2C_InitStructure;

GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO , ENABLE);

/* Configure I2C1 pins: PB6->SCL and PB7->SDA */

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;///6,7->8,9

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;

GPIO_Init(GPIOB, &GPIO_InitStructure);

I2C_DeInit(I2C1);

I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;

I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;

I2C_InitStructure.I2C_OwnAddress1 = 0x30;

I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;

I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;

I2C_InitStructure.I2C_ClockSpeed = 100000; /* 100K速度*/

I2C_Cmd(I2C1, ENABLE);

I2C_Init(I2C1, &I2C_InitStructure);

/*允许1字节1应答模式*/

I2C_AcknowledgeConfig(I2C1, ENABLE);

}

/******************************************************************************* * Function Name : I2C_delay

* Description : 延迟时间

* Input : None

* Output : None

* Return : None

* Attention : None

*******************************************************************************/ static void I2C_delay(u16 cnt)

{

while(cnt--);

}

/******************************************************************************* * Function Name : I2C_AcknowledgePolling

* Description : 等待获取I2C总线控制权判断忙状态

* Input : - I2Cx:I2C寄存器基址

* - I2C_Addr:从器件地址

* Output : None

* Return : None

* Attention : None

*******************************************************************************/ static void I2C_AcknowledgePolling(I2C_TypeDef *I2Cx,u8 I2C_Addr)

{

vu16 SR1_Tmp;

do

{

I2C_GenerateST ART(I2Cx, ENABLE); /*起始位*/

/*读SR1*/

SR1_Tmp = I2C_ReadRegister(I2Cx, I2C_Register_SR1);

/*器件地址(写)*/

#ifdef A T24C01A

I2C_Send7bitAddress(I2Cx, I2C_Addr, I2C_Direction_Transmitter);

#else

I2C_Send7bitAddress(I2Cx, 0, I2C_Direction_Transmitter);

#endif

}while(!(I2C_ReadRegister(I2Cx, I2C_Register_SR1) & 0x0002));

I2C_ClearFlag(I2Cx, I2C_FLAG_AF);

I2C_GenerateSTOP(I2Cx, ENABLE); /*停止位*/

}

/*******************************************************************************

* Function Name : I2C_Read

* Description : 通过指定I2C接口读取多个字节数据

* Input : - I2Cx:I2C寄存器基址

* - I2C_Addr:从器件地址

* - addr:预读取字节存储位置

* - *buf:读取数据的存储位置

* - num:读取字节数

* Output : None

* Return : 成功返回0

* Attention : None

*******************************************************************************/

u8 I2C_Read(I2C_TypeDef *I2Cx,u8 I2C_Addr,u8 addr,u8 *buf,u16 num)

{

///u16 angle;

if(num==0)

return 1;

while(I2C_GetFlagStatus(I2Cx, I2C_FLAG_BUSY));

/*允许1字节1应答模式*/

I2C_AcknowledgeConfig(I2Cx, ENABLE);

/* 发送起始位*/

I2C_GenerateST ART(I2Cx, ENABLE);

while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_MODE_SELECT));/*EV5,主模式*/

///#ifdef A T24C01A

/*发送器件地址(写)*/

I2C_Send7bitAddress(I2Cx, I2C_Addr, I2C_Direction_Transmitter);

while (!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));

/*发送地址*/

I2C_SendData(I2Cx, addr);

while (!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_TRANSMITTED));/*数据已发送*/ /*起始位*/

I2C_GenerateST ART(I2Cx, ENABLE);

while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_MODE_SELECT));

/*器件读*/

I2C_Send7bitAddress(I2Cx, I2C_Addr, I2C_Direction_Receiver);

/// while(1);

while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));

///#else

/*发送器件地址(读)24C01*/

/// I2C_Send7bitAddress(I2Cx, addr<<1, I2C_Direction_Receiver);

/// while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));

///#endif

while (num)

{

if(num==1)

{

I2C_AcknowledgeConfig(I2Cx, DISABLE); /* 最后一位后要关闭应答的*/ I2C_GenerateSTOP(I2Cx, ENABLE); /* 发送停止位*/

return 0;

}

/*器件读*/

/// I2C_Send7bitAddress(I2Cx, I2C_Addr, I2C_Direction_Receiver);

while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_RECEIVED)); /* EV7 */

*buf = I2C_ReceiveData(I2Cx);

buf++;

/* Decrement the read bytes counter */

num--;

/// I2C_Send7bitAddress(I2Cx, I2C_Addr, I2C_Direction_Receiver);

/// while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));

}

/* 再次允许应答模式*/

I2C_AcknowledgeConfig(I2Cx, ENABLE);

return 0;

}

/*******************************************************************************

* Function Name : I2C_WriteOneByte

* Description : 通过指定I2C接口写入一个字节数据

* Input : - I2Cx:I2C寄存器基址

* - I2C_Addr:从器件地址

* - addr:预写入字节地址

* - value:写入数据

* Output : None

* Return : 成功返回0

* Attention : None

*******************************************************************************/

u8 I2C_WriteOneByte(I2C_TypeDef *I2Cx,u8 I2C_Addr,u8 addr,u8 value)

{

/* 起始位*/

I2C_GenerateST ART(I2Cx, ENABLE);

while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_MODE_SELECT));

///#ifdef A T24C01A

/* 发送器件地址(写)*/

I2C_Send7bitAddress(I2Cx, I2C_Addr, I2C_Direction_Transmitter);

while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));

/*发送地址*/

I2C_SendData(I2Cx, addr);

while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_TRANSMITTED));

///#else

/// I2C_Send7bitAddress(I2Cx, addr<<1, I2C_Direction_Transmitter);

/// while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); ///#endif

/* 写一个字节*/

I2C_SendData(I2Cx, value);

while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_TRANSMITTED));

/* 停止位*/

I2C_GenerateSTOP(I2Cx, ENABLE);

I2C_AcknowledgePolling(I2Cx,I2C_Addr);

I2C_delay(1000);

return 0;

}

/*******************************************************************************

* Function Name : I2C_Write

* Description : 通过指定I2C接口写入多个字节数据

* Input : - I2Cx:I2C寄存器基址

* - I2C_Addr:从器件地址

* - addr:预写入字节地址

* - *buf:预写入数据存储位置

* - num:写入字节数

* Output : None

* Return : 成功返回0

* Attention : None

*******************************************************************************/

u8 I2C_Write(I2C_TypeDef *I2Cx,u8 I2C_Addr,u8 addr,u8 *buf,u16 num)

{

u8 err=0;

while(num--)

{

if(I2C_WriteOneByte(I2Cx, I2C_Addr,addr++,*buf++))

{

err++;

}

}

if(err)

return 1;

else

return 0;

}

//初始化HMC5883,根据需要请参考pdf进行修改****

void Init_HMC5883()

{

///Single_Write_HMC5883(0x02,0x00); //

I2C_WriteOneByte(I2C1,0x3c,0x02,0);

}

/************************************************************************************************************/ /*******************************************************************************

* Function Name : void Axia3AngInit(void).

* Description : Read 3 axia angle data from HMC5883 then process the data.

* Input : - I2Cx:I2C寄存器基址

* - I2C_Addr:从器件地址

* - addr:预写入字节地址

* - value:写入数据

* Output : None

* Return : 成功返回0

* Attention : None

*******************************************************************************/

void Axia3AngInit(void)

{

I2C_Configuration();

Init_HMC5883();

}

/************************************************************************************************************/

/************************************************************************************************************/ /*******************************************************************************

* Function Name : Detect3AxiaAng();

* Description : Read 3 axia angle data from HMC5883 then process the data.

* Input : - I2Cx:I2C寄存器基址

* - I2C_Addr:从器件地址

* - addr:预写入字节地址

* - value:写入数据

* Output : None

* Return : 成功返回0

* Attention : None

*******************************************************************************/

void Detect3AxiaAng(void)

{

I2C_Read(I2C1,0x3C,0x03,BUF,7);//

Axia3Ang_x=BUF[0] << 8 | BUF[1]; //Combine MSB and LSB of X Data output register

Axia3Ang_z=BUF[2] << 8 | BUF[3]; //Combine MSB and LSB of Z Data output register

Axia3Ang_y=BUF[4] << 8 | BUF[5]; //Combine MSB and LSB of Y Data output register

/*

//Get float data

Axia3Ang_xF=Axia3Ang_x*0.0 BUF[0] << 8 | BUF[1]; //Combine MSB and LSB of X Data output register

Axia3Ang_zF=Axia3Ang_x* BUF[2] << 8 | BUF[3]; //Combine MSB and LSB of Z Data output register

Axia3Ang_yF=Axia3Ang_x* BUF[4] << 8 | BUF[5]; //Combine MSB and LSB of Y Data output register

// delay_ms(500);

*/

}

//*********************************************************

//主程序********

//*********************************************************

void HMC5883L_test(void )

{ // bit sign_bit;

///unsigned int i;

///int x,y,z;

///double angle;

I2C_Configuration();

Init_HMC5883();

while(1) //循环

{

///// Multiple_Read_HMC5883(); //连续读出数据,存储在BUF中

///loop1:

I2C_Read(I2C1,0x3C,0x03,BUF,7);//

//---------显示X轴

delay_ms(10);

/// goto loop1;

/// while(1);

Axia3Ang_x=BUF[0] << 8 | BUF[1]; //Combine MSB and LSB of X Data output register

Axia3Ang_z=BUF[2] << 8 | BUF[3]; //Combine MSB and LSB of Z Data output register

Axia3Ang_y=BUF[4] << 8 | BUF[5]; //Combine MSB and LSB of Y Data output register

delay_ms(500);

/// angle= atan2((double)y,(double)x) * (180 / 3.14159265) + 180; // angle in degrees

/// angle*=10;

///conversion(angle); //计算数据和显示

///for (i=0;i<10000;i++); //延时

}

}

/********************************************************************************************************* END FILE

*********************************************************************************************************/

[4] 源文件4

/******************** (C) COPYRIGHT 2008 STMicroelectronics ********************

* File Name : stm32f10x_i2c.c

* Author : MCD Application T eam

* V ersion : V2.0.1

* Date : 06/13/2008

* Description : This file provides all the I2C firmware functions.

********************************************************************************

* THE PRESENT FIRMW ARE WHICH IS FOR GUIDANCE ONL Y AIMS A T PROVIDING CUSTOMERS

* WITH CODING INFORMA TION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SA VE TIME. * AS A RESUL T, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT,

* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE * CONTENT OF SUCH FIRMW ARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING

* INFORMA TION CONT AINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.

*******************************************************************************/

/* Includes ------------------------------------------------------------------*/

#include "stm32f10x_i2c.h"

#include "stm32f10x_rcc.h"

/* Private typedef -----------------------------------------------------------*/

/* Private define ------------------------------------------------------------*/

/* I2C SPE mask */

#define CR1_PE_Set ((u16)0x0001)

#define CR1_PE_Reset ((u16)0xFFFE)

/* I2C ST ART mask */

#define CR1_ST ART_Set ((u16)0x0100)

#define CR1_ST ART_Reset ((u16)0xFEFF)

/* I2C STOP mask */

#define CR1_STOP_Set ((u16)0x0200)

#define CR1_STOP_Reset ((u16)0xFDFF)

/* I2C ACK mask */

#define CR1_ACK_Set ((u16)0x0400)

#define CR1_ACK_Reset ((u16)0xFBFF)

/* I2C ENGC mask */

#define CR1_ENGC_Set ((u16)0x0040)

#define CR1_ENGC_Reset ((u16)0xFFBF)

/* I2C SWRST mask */

#define CR1_SWRST_Set ((u16)0x8000)

#define CR1_SWRST_Reset ((u16)0x7FFF)

/* I2C PEC mask */

#define CR1_PEC_Set ((u16)0x1000)

#define CR1_PEC_Reset ((u16)0xEFFF)

/* I2C ENPEC mask */

#define CR1_ENPEC_Set ((u16)0x0020)

#define CR1_ENPEC_Reset ((u16)0xFFDF)

/* I2C ENARP mask */

#define CR1_ENARP_Set ((u16)0x0010)

#define CR1_ENARP_Reset ((u16)0xFFEF)

/* I2C NOSTRETCH mask */

#define CR1_NOSTRETCH_Set ((u16)0x0080)

#define CR1_NOSTRETCH_Reset ((u16)0xFF7F)

/* I2C registers Masks */

#define CR1_CLEAR_Mask ((u16)0xFBF5)

/* I2C DMAEN mask */

#define CR2_DMAEN_Set ((u16)0x0800)

#define CR2_DMAEN_Reset ((u16)0xF7FF)

/* I2C LAST mask */

#define CR2_LAST_Set ((u16)0x1000)

#define CR2_LAST_Reset ((u16)0xEFFF)

/* I2C FREQ mask */

#define CR2_FREQ_Reset ((u16)0xFFC0)

/* I2C ADD0 mask */

#define OAR1_ADD0_Set ((u16)0x0001)

#define OAR1_ADD0_Reset ((u16)0xFFFE)

/* I2C ENDUAL mask */

#define OAR2_ENDUAL_Set ((u16)0x0001)

#define OAR2_ENDUAL_Reset ((u16)0xFFFE)

/* I2C ADD2 mask */

#define OAR2_ADD2_Reset ((u16)0xFF01)

/* I2C F/S mask */

#define CCR_FS_Set ((u16)0x8000)

/* I2C CCR mask */

#define CCR_CCR_Set ((u16)0x0FFF)

/* I2C FLAG mask */

#define FLAG_Mask ((u32)0x00FFFFFF)

/* Private macro -------------------------------------------------------------*/

/* Private variables ---------------------------------------------------------*/

/* Private function prototypes -----------------------------------------------*/

/* Private functions ---------------------------------------------------------*/

/******************************************************************************* * Function Name : I2C_DeInit

* Description : Deinitializes the I2Cx peripheral registers to their default

* reset values.

* Input : - I2Cx: where x can be 1 or 2 to select the I2C peripheral.

* Output : None

* Return : None

*******************************************************************************/ void I2C_DeInit(I2C_TypeDef* I2Cx)

{

/* Check the parameters */

assert_param(IS_I2C_ALL_PERIPH(I2Cx));

switch (*(u32*)&I2Cx)

{

case I2C1_BASE:

/* Enable I2C1 reset state */

RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C1, ENABLE);

/* Release I2C1 from reset state */

RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C1, DISABLE);

break;

case I2C2_BASE:

/* Enable I2C2 reset state */

RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C2, ENABLE);

/* Release I2C2 from reset state */

RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C2, DISABLE);

break;

default:

break;

}

}

/*******************************************************************************

* Function Name : I2C_Init

* Description : Initializes the I2Cx peripheral according to the specified

* parameters in the I2C_InitStruct.

* Input : - I2Cx: where x can be 1 or 2 to select the I2C peripheral.

* - I2C_InitStruct: pointer to a I2C_InitTypeDef structure that

* contains the configuration information for the specified

* I2C peripheral.

* Output : None

* Return : None

******************************************************************************/

void I2C_Init(I2C_TypeDef* I2Cx, I2C_InitTypeDef* I2C_InitStruct)

{

u16 tmpreg = 0, freqrange = 0;

u16 result = 0x04;

u32 pclk1 = 8000000;

RCC_ClocksTypeDef rcc_clocks;

/* Check the parameters */

assert_param(IS_I2C_ALL_PERIPH(I2Cx));

assert_param(IS_I2C_MODE(I2C_InitStruct->I2C_Mode));

assert_param(IS_I2C_DUTY_CYCLE(I2C_InitStruct->I2C_DutyCycle));

assert_param(IS_I2C_OWN_ADDRESS1(I2C_InitStruct->I2C_OwnAddress1));

assert_param(IS_I2C_ACK_ST A TE(I2C_InitStruct->I2C_Ack));

assert_param(IS_I2C_ACKNOWLEDGE_ADDRESS(I2C_InitStruct->I2C_AcknowledgedAddress)); assert_param(IS_I2C_CLOCK_SPEED(I2C_InitStruct->I2C_ClockSpeed));

/*---------------------------- I2Cx CR2 Configuration ------------------------*/

/* Get the I2Cx CR2 value */

tmpreg = I2Cx->CR2;

/* Clear frequency FREQ[5:0] bits */

tmpreg &= CR2_FREQ_Reset;

/* Get pclk1 frequency value */

RCC_GetClocksFreq(&rcc_clocks);

pclk1 = rcc_clocks.PCLK1_Frequency;

/* Set frequency bits depending on pclk1 value */

freqrange = (u16)(pclk1 / 1000000);

tmpreg |= freqrange;

/* Write to I2Cx CR2 */

I2Cx->CR2 = tmpreg;

/*---------------------------- I2Cx CCR Configuration ------------------------*/ /* Disable the selected I2C peripheral to configure TRISE */

I2Cx->CR1 &= CR1_PE_Reset;

/* Reset tmpreg value */

/* Clear F/S, DUTY and CCR[11:0] bits */

tmpreg = 0;

/* Configure speed in standard mode */

if (I2C_InitStruct->I2C_ClockSpeed <= 100000)

{

/* Standard mode speed calculate */

result = (u16)(pclk1 / (I2C_InitStruct->I2C_ClockSpeed << 1));

/* Test if CCR value is under 0x4*/

if (result < 0x04)

{

/* Set minimum allowed value */

result = 0x04;

}

/* Set speed value for standard mode */

tmpreg |= result;

/* Set Maximum Rise Time for standard mode */

I2Cx->TRISE = freqrange + 1;

}

/* Configure speed in fast mode */

else /*(I2C_InitStruct->I2C_ClockSpeed <= 400000)*/

{

if (I2C_InitStruct->I2C_DutyCycle == I2C_DutyCycle_2)

{

/* Fast mode speed calculate: Tlow/Thigh = 2 */

result = (u16)(pclk1 / (I2C_InitStruct->I2C_ClockSpeed * 3));

}

else /*I2C_InitStruct->I2C_DutyCycle == I2C_DutyCycle_16_9*/ {

/* Fast mode speed calculate: Tlow/Thigh = 16/9 */

result = (u16)(pclk1 / (I2C_InitStruct->I2C_ClockSpeed * 25));

/* Set DUTY bit */

result |= I2C_DutyCycle_16_9;

}

/* Test if CCR value is under 0x1*/

if ((result & CCR_CCR_Set) == 0)

{

/* Set minimum allowed value */

result |= (u16)0x0001;

}

/* Set speed value and set F/S bit for fast mode */

tmpreg |= result | CCR_FS_Set;

/* Set Maximum Rise Time for fast mode */

I2Cx->TRISE = (u16)(((freqrange * 300) / 1000) + 1);

}

/* Write to I2Cx CCR */

I2Cx->CCR = tmpreg;

/* Enable the selected I2C peripheral */

I2Cx->CR1 |= CR1_PE_Set;

/*---------------------------- I2Cx CR1 Configuration ------------------------*/

/* Get the I2Cx CR1 value */

tmpreg = I2Cx->CR1;

/* Clear ACK, SMBTYPE and SMBUS bits */

tmpreg &= CR1_CLEAR_Mask;

/* Configure I2Cx: mode and acknowledgement */

/* Set SMBTYPE and SMBUS bits according to I2C_Mode value */

/* Set ACK bit according to I2C_Ack value */

tmpreg |= (u16)((u32)I2C_InitStruct->I2C_Mode | I2C_InitStruct->I2C_Ack);

/* Write to I2Cx CR1 */

I2Cx->CR1 = tmpreg;

/*---------------------------- I2Cx OAR1 Configuration -----------------------*/

/* Set I2Cx Own Address1 and acknowledged address */

I2Cx->OAR1 = (I2C_InitStruct->I2C_AcknowledgedAddress | I2C_InitStruct->I2C_OwnAddress1); }

/*******************************************************************************

* Function Name : I2C_StructInit

* Description : Fills each I2C_InitStruct member with its default value.

* Input : - I2C_InitStruct: pointer to an I2C_InitTypeDef structure

* which will be initialized.

* Output : None

* Return : None

*******************************************************************************/ void I2C_StructInit(I2C_InitTypeDef* I2C_InitStruct)

{

/*---------------- Reset I2C init structure parameters values ----------------*/

/* Initialize the I2C_Mode member */

I2C_InitStruct->I2C_Mode = I2C_Mode_I2C;

/* Initialize the I2C_DutyCycle member */

I2C_InitStruct->I2C_DutyCycle = I2C_DutyCycle_2;

/* Initialize the I2C_OwnAddress1 member */

I2C_InitStruct->I2C_OwnAddress1 = 0;

/* Initialize the I2C_Ack member */

I2C_InitStruct->I2C_Ack = I2C_Ack_Disable;

/* Initialize the I2C_AcknowledgedAddress member */

I2C_InitStruct->I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;

/* initialize the I2C_ClockSpeed member */

I2C_InitStruct->I2C_ClockSpeed = 5000;

}

/******************************************************************************* * Function Name : I2C_Cmd

* Description : Enables or disables the specified I2C peripheral.

* Input : - I2Cx: where x can be 1 or 2 to select the I2C peripheral.

* - NewState: new state of the I2Cx peripheral. This parameter

* can be: ENABLE or DISABLE.

* Output : None

* Return : None

*******************************************************************************/ void I2C_Cmd(I2C_TypeDef* I2Cx, FunctionalState NewState)

{

/* Check the parameters */

assert_param(IS_I2C_ALL_PERIPH(I2Cx));

assert_param(IS_FUNCTIONAL_ST A TE(NewState));

if (NewState != DISABLE)

{

/* Enable the selected I2C peripheral */

I2Cx->CR1 |= CR1_PE_Set;

}

else

{

/* Disable the selected I2C peripheral */

I2Cx->CR1 &= CR1_PE_Reset;

}

}

/******************************************************************************* * Function Name : I2C_DMACmd

* Description : Enables or disables the specified I2C DMA requests.

* Input : - I2Cx: where x can be 1 or 2 to select the I2C peripheral.

* - NewState: new state of the I2C DMA transfer.

* This parameter can be: ENABLE or DISABLE.

* Output : None

* Return : None

*******************************************************************************/ void I2C_DMACmd(I2C_TypeDef* I2Cx, FunctionalState NewState)

{

/* Check the parameters */

assert_param(IS_I2C_ALL_PERIPH(I2Cx));

assert_param(IS_FUNCTIONAL_ST A TE(NewState));

if (NewState != DISABLE)

{

/* Enable the selected I2C DMA requests */

I2Cx->CR2 |= CR2_DMAEN_Set;

}

else

{

/* Disable the selected I2C DMA requests */

I2Cx->CR2 &= CR2_DMAEN_Reset;

电子罗盘的工作原理及校准 电子罗盘,电子指南针,android

Android ST集成传感器方案实现电子罗盘功能 电子罗盘是一种重要的导航工具,能实时提供移动物体的航向和姿态。随着半导体工艺的 进步和手机操作系统的发展,集成了越来越多传感器的智能手机变得功能强大,很多手机 上都实现了电子罗盘的功能。而基于电子罗盘的应用(如Android的Skymap)在各个软件 平台上也流行起来。 要实现电子罗盘功能,需要一个检测磁场的三轴磁力传感器和一个三轴加速度传感器。随着微机械工艺的成熟,意法半导体推出将三轴磁力计和三轴加速计集成在一个封装里的二合一传感器模块LSM303DLH,方便用户在短时间内设计出成本低、性能高的电子罗盘。本文以LSM303DLH为例讨论该器件的工作原理、技术参数和电子罗盘的实现方法。 1. 地磁场和航向角的背景知识 如图1所示,地球的磁场象一个条形磁体一样由磁南极指向磁北极。在磁极点处磁场和当地的水平面垂直,在赤道磁场和当地的水平面平行,所以在北半球磁场方向倾斜指向地面。用来衡量磁感应强度大小的单位是Tesla或者Gauss(1Tesla=10000Gauss)。随着地理位置的不同,通常地磁场的强度是0.4-0.6 Gauss。需要注意的是,磁北极和地理上的北极并不重合,通常他们之间有11度左右的夹角。 图1 地磁场分布图 地磁场是一个矢量,对于一个固定的地点来说,这个矢量可以被分解为两个与当地水平面平行的分量和一个与当地水平面垂直的分量。如果保持电子罗盘和当地的水平面平行,那么罗盘中磁力计的三个轴就和这三个分量对应起来,如图2所示。

图2 地磁场矢量分解示意图 实际上对水平方向的两个分量来说,他们的矢量和总是指向磁北的。罗盘中的航向角(Azimuth)就是当前方向和磁北的夹角。由于罗盘保持水平,只需要用磁力计水平方向两 轴(通常为X轴和Y轴)的检测数据就可以用式1计算出航向角。当罗盘水平旋转的时候,航向角在0?- 360?之间变化。 2.ST集成磁力计和加速计的传感器模块LSM303DLH 2.1 磁力计工作原理 在LSM303DLH中磁力计采用各向异性磁致电阻(Anisotropic Magneto-Resistance)材料来检测空间中磁感应强度的大小。这种具有晶体结构的合金材料对外界的磁场很敏感,磁 场的强弱变化会导致AMR自身电阻值发生变化。 在制造过程中,将一个强磁场加在AMR上使其在某一方向上磁化,建立起一个主磁域,与主磁域垂直的轴被称为该AMR的敏感轴,如图3所示。为了使测量结果以线性的方式变化,AMR材料上的金属导线呈45º角倾斜排列,电流从这些导线上流过,如图4所示。由初始的强磁场在AMR材料上建立起来的主磁域和电流的方向有45º的夹角。 图3 AMR材料示意图 图4 45º角排列的导线

电子罗盘

电子指南针 指南针 1、概述 指南针是用以判别方位的一种简单仪器。指南针的前身是中国古代四大发明之一的司南。主要组成部分是一根装在轴上可以自由转动的磁针。磁针在地磁场作用下能保持在磁子午线的切线方向上。磁针的北极指向地理的南极,利用这一性能可以辨别方向。常用于航海、大地测量、旅行及军事等方面。 指南针的发明是我国劳动人民,在长期的实践中对物体磁性认识的结果。由于生产劳动,人们接触了磁铁矿,开始了对磁性质的了解。人们首先发现了磁石引铁的性质。后来又发现了磁石的指向性。经过多方的实验和研究,终于发明了可以实用的指南针。 2、磁偏角与磁倾角 现在人们已经知道,地球的两个磁极和地理的南北极只是接近,并不重合。磁针指向的是地球磁极而不是地理的南北极,这样磁针指的就不是正南、正北方向而略有偏差,这个角度就叫磁偏角。又因为地球近似球形,所以磁针指向磁极时必向下倾斜,和水平方向有一个夹角,这个夹角称为磁倾角。不同地点的磁偏角和磁倾角都不相同。磁偏角和磁倾角的发现使指南针的指向更加准确。

图1. 地球磁场示意图 3、罗盘定位 要确定方向除了指南针之外,还需要有方位盘相配合。最初使用指南针时,可能没有固定的方位盘,随着测方位的需要,出现了磁针和方位盘一体的罗盘 4、电子指南针 指南针是一个重要的导航工具,甚至在G P S中也会用到。电子指南针将替代旧的针式指南针或罗盘指南针,因为电子指南针全采用固态的元件,还可以简单地和其他电子系统接口。 电子指南针系统中磁场传感器的磁阻(M R)技术是最佳的解决方法,和现在很多电子指南针还在使用的磁通量闸门传感器相比较,M R技术不需要绕线圈而且可以用I C生产过程(I C-l i k e p r o c e s s)生产,是一个更值得使用的解决方案。 由于M R有高灵敏度,它甚至比这个应用范围中的霍尔元件更好。

罗经使用方法

构造包括:构造包括: (一)中央之透明玻璃小圆盒,内含: (1)带钗形头的磁针。 (2)底盘上之红线,以南北轴的基准。 (1)带钗形头的磁针。 (2)底盘上之红线,以南北轴的基准。 (3)红在线一端之两旁画有两点,两点处即指著北方。 (二)小圆盒外镶一木制转盘,上有各种用途不同之刻度,以供测量定位。 (三)最外一层为一方形盘座,用以固定玻璃小圆盒及木制转盘。 上系二透明垂直之交叉线,以测量时之基准。 平面图 第一层显示方位名称。 第二层即是以地球磁力线为基准者,一般称为地盘,用以测量屋内各种器物之方位。第三层即是地盘之纳音层。

第四层即是以地球子午线为基准者,一般称为人盘,用以测量屋外形势。 第五层即是天盘。 罗经因于应用上的不同,有各种层次。一般少则二、三层多则数十层。 第一层显示东、东南、南、西南、西、西北、北八方,其中 东方包括甲、卯、乙三个字。 东南包括辰、巽、巳三个字。 南方包括丙、午、丁三个字。 西南包括未、坤、申三个字。 西方包括庚、酉、辛三个字。 西北包括戍、乾、亥三个字。 北方包括壬、子、癸三个字。 自甲卯乙至壬子癸共二十四个字、每字占15度即成了第二层。 第二层即以地磁子午线为基准来测量房宅内各种器物之方位。一般称此层为地盘。 第三层为配合第二层使用时,所需考虑的纳音问题。于第二层每一个字下均有三格,包括两种至三种纳音或一空格。 例: 南方丙字下则有丁巳(纳音土)、庚午(纳音土)及一空格。 又例: 西北方戍字下则有丙戍(纳音土)、戊戍(纳音木)及庚戍(纳音金)三种不同之纳音。一般除了确定方位外,还需考虑该方位之纳音是否与出生年之纳音相生或相同。设方向为壬向时,壬字下包括癸亥(纳音水)及甲子(纳音金)。 若出生年之纳音为木时,则当对准癸亥方向为佳。 若出生年之纳音为金时,则当对准甲子方向为佳。 若出生年之纳音为水时,则甲字方向或癸亥方向均可。 若出生年之纳音为土时,则甲字方向尚可用。 若可调于空格处。即调于癸亥与甲字之间。

单片机原理及应用第三版(张毅刚)1-6章全

第1章思考题及习题1参考答案 一、填空 1. 除了单片机这一名称之外,单片机还可称为或。答:微控制器,嵌入式 控制器. 2.单片机与普通微型计算机的不同之处在于其将、、和三部分,通 过内部连接在一起,集成于一块芯片上。答:CPU、存储器、I/O口、总线 3. AT89S52单片机工作频率上限为 MHz。答:33 MHz。 4. 专用单片机已使系统结构最简化、软硬件资源利用最优化,从而大大降低和提 高。答:成本,可靠性。 二、单选 1. 单片机内部数据之所以用二进制形式表示,主要是 A.为了编程方便B.受器件的物理性能限制 C.为了通用性D.为了提高运算速度 答:B 2. 在家用电器中使用单片机应属于微计算机的。 A.辅助设计应用B.测量、控制应用 C.数值计算应用D.数据处理应用 答: B 3. 下面的哪一项应用,不属于单片机的应用范围。 A.工业控制 B.家用电器的控制 C.数据库管理 D.汽车电子设备 答:C 三、判断对错 1. STC系列单片机是8051内核的单片机。对 2. AT89S52与AT89S51相比,片内多出了4KB的Flash程序存储器、128B的RAM、1个中断 源、1个定时器(且具有捕捉功能)。对 3. 单片机是一种CPU。错 4. AT89S52单片机是微处理器。错

5. AT89C52片内的Flash程序存储器可在线写入,而AT89S52则不能。错 6. 为AT89C51单片机设计的应用系统板,可将芯片AT89C51直接用芯片AT89S51替换。对 7. 为AT89S51单片机设计的应用系统板,可将芯片AT89S51直接用芯片AT89S52替换。对 8. 单片机的功能侧重于测量和控制,而复杂的数字信号处理运算及高速的测控功能则是DSP 的长处。对 四、简答 1. 微处理器、微计算机、微处理机、CPU、单片机、嵌入式处理器它们之间有何区别? 答:微处理器、微处理机和CPU它们都是中央处理器的不同称谓,微处理器芯片本身不是计算机。而微计算机、单片机它们都是一个完整的计算机系统,单片机是集成在一个芯片上的用于测控目的的单片微计算机。 2. AT89S51单片机相当于MCS-51系列单片机中的哪一型号的产品?“S”的含义是什么? 答:相当于MCS-51系列中的87C51,只不过是AT89S51芯片内的4K字节Flash存储器取代了87C51片内的4K字节的EPROM。 3. 单片机可分为商用、工业用、汽车用以及军用产品,它们的使用温度范围各为多少? 答:商用:温度范围为0~+70℃;工业用:温度范围为-40~+85℃;汽车用:温度范围为-40~+125℃;军用:温度范围为-55~+150℃。 4. 解释什么是单片机的在系统编程(ISP)与在线应用编程(IAP)。 答:单片机的在系统编程ISP(In System Program),也称在线编程,只需一条与PC机USB口或串口相连的ISP下载线,就可把仿真调试通过的程序代码从PC机在线写入单片机的Flash存储器内,省去了编程器。在线应用编程(IAP)就是可将单片机的闪存内的应用程序在线修改升级。 5. 什么是“嵌入式系统”? 系统中嵌入了单片机作为控制器,是否可称其为“嵌入式系统”? 答:广义上讲,凡是系统中嵌入了“嵌入式处理器”,如单片机、DSP、嵌入式微处理器,都称其为“嵌入式系统”。但多数人把“嵌入”嵌入式微处理器的系统,称为“嵌入式系统”。目前“嵌入式系统”还没有一个严格和权威的定义。目前人们所说的“嵌入式系统”,多指后者。 6. 嵌入式处理器家族中的单片机、DSP、嵌入式微处理器各有何特点?它们的应用领域有何 不同? 答:单片机体积小、价格低且易于掌握和普及,很容易嵌入到各种通用目的的系统中,

电子罗盘的方位角计算公式

BY 电子罗盘的方位角计算公式 丙寅电子 Honeywell 在中国区的特级代理。 上海丙寅电子有限公司是美国霍尼韦尔提供软硬件全套解决方案,如需要任何设计与技术方面的支的项目支持经验。 在磁阻传感器应用领域有丰富 上海丙寅电子有限公司 电话:86 021 65072675 传真:86 021 65075878 地址:中国 上海市虹口区四平路188号上海商贸大厦801室 公司主页:http://www.bingyindz.com 邮箱:by07@anotron.com 持可与我们联系,将助您在最短的时间内设计成功。

如何得到罗盘的方位角 磁阻传感器为建立罗盘导航系统提供了固态有效的解决办法!但是我们怎么才能够从简单的3轴数据得到罗盘的方位角呢?下面就将一步步告诉你如何去实现!1)当3轴磁力计工作时可以读到XYZ 三轴的磁场强度,此时的数值并不能直接用作方位角的计算!因为此时的读数可能受到器件版面上其他一些含磁材料的影响,形成圆心坐标的硬铁漂移! 用作方位角计算的XYZ 数值必须将此漂移值移除,使圆心回到原点。 上海丙寅电子上 海丙寅电子上海丙寅电子上海丙寅电子上 海丙寅电子上 海丙寅电子丙寅电子寅电子寅电

具体的办法是:1,水平匀速旋转,收集XY 轴的数据 2,转动器材90度(此时Z 轴水平)匀速旋转以收集Z 轴数据 3,将读取到的各轴数据的最大值加上最小值除以2,就得到一个各轴的offset 值 Xoffset=(Xmax+Xmin )/2 Yoffset=(Ymax+Ymin )/2 Zoffset=(Zmax+Zmin )/24,然后将磁力计读取的各轴的裸值减去前面计算所得的offset 值,就可以得到用作角度计算的Heading 值 X H =X 裸-Xoffset Y H =Y 裸-Yoffset Z H =Z 裸-Zoffset 如果只用作水平测量,则此时的方位角为 方位角=arctanY H /X H 上海丙寅电子 上海丙寅电子 上海丙寅电子 上海丙寅电子上 海丙寅电子上海丙寅电子海丙寅电子海丙寅电子 海丙寅电子

数字式电子罗盘毕业设计

毕业设计说明书数字式电子罗盘设计 学生姓名:孔垂礼学号: 1105044263 学院:计算机与控制工程 专业:电气工程及其自动化 指导教师:龙达峰 2015 年 06 月

数字式电子罗盘设计 摘要 数字式电子罗盘具有很多优点,例如:体积比较小、启动非常迅速、功率损耗较低、制造成本低廉等,当今社会测控技术对测向传感器提出了非常高的要求;为了提高数字 罗盘的测量精度,特意设计了一种基于HMC5883L三轴磁阻传感器[1]的数字电子罗盘;在分析相关类似产品的基础上,特别强调对电源、器件选型、信号调理电路、软件设计等方面进行了分析研究,设计出了数字罗盘并且研制了试验的样机;为验证设计效果,在双轴陀螺测试转台上进行了测试,试验结果初步验证了该设计方案的可行性;论文的研究 工作可以为研究和改良数字式磁罗盘的测量准确度提供可靠的资料. 关键词:地磁场,数字罗盘,HMC5883L三轴磁阻传感器,重力加速度计

Here is the translation of your chinese paper’s title Abstract Digital electronic compass, has small volume, quick start, low power consumption, and low cost, the modern measurement and control technology puts forward higher requirements on sensor of direction finding; In order to improve the precision of the digital compass, we design a HMC5883L triaxial magnetic resistance sensor based digital electronic compass; On the basis of the analysis of related products, focuses on the power supply, device selection, signal conditioning circuit and software design are analyzed in aspects of research, design the digital compass and test prototype was developed; To verify the design effect, on the two-axis gyro testing table was tested, experimental results verify the feasibility of the design scheme of; Thesis research work could be used to research and provide reference for improving the measuring accuracy of digital magnetic compass. Key words : Earth's magnetic field, digital compass, HMC5883L three-axis magnetic resistance sensor, the gravity accelerometer

地磁电子罗盘

磁电子罗盘是一种利用地磁场实现定向功能的装置,在移动机器人导航方面有着重要的应用价值。与传统的自主惯性导航设备相比,磁电子罗盘具有体积小、成本低、无累计误差、能够自动寻北等特点。与常规的指针型罗盘相比,磁电子罗盘在抗冲击性、抗震性等方面性能良好。并且能够对杂散磁场进行补偿,输出电信号.可方便地与其他电子设备组成应用系统。 本罗盘设计采用Philips公司的KMZ52磁阻传感器和Microchip公司的PIC16F818单片机。并对罗盘进行详细介绍。 2地磁场 由于地球本身具有磁性。在地球和近地空间之间存在磁场,称为地磁场。地磁场的强度为0.3高斯至0.6高斯,其大小和方向随地点(甚至随时间)而异。地磁场的北极、南极分别在地理南极、北极附近,彼此并不重合,而且两者间的偏差随时间缓慢变化。 本文设计的二维磁电子罗盘用于测量、计算磁场的方位角,并将其转换为电信号传输给移动机器人的控制器。此磁电子罗盘采用磁电阻传感器,移动机器人的控制器接收来自磁电阻传感器信号,此信号均为0 V~5 V模拟量,电压值的变化表现为航向角的不同,并且要求高可靠性和一定精度。 3各向异性磁阻传感器的测量原理 各向异性磁电阻效应是指对于强磁性金属(铁、钴、镍等及其合金),当外加磁场平行于磁场内部磁化方向时,阻值不变;若外界磁场方向偏离时,则其阻值减小;如果把这类金属做成薄膜带状导线,当电流通过时,其阻值大小随内外两磁场的合成磁化方向与电流流向的相对关系变化,趋于同向时阻值增大,背向时阻值减小。由于坡莫(NiFe)合金在弱磁场下的电阻变化率较大,因此适用于弱磁场中。 KMZ52是Philips公司生产的一种磁阻传感器,是利用坡莫合金薄片的磁阻效应测量磁场的高灵敏度磁阻传感器。该磁阻传感器内置两个正交磁敏电阻桥、完整的补偿线圈和设置/复位线圈。补偿线圈的输出与当前测量结果形成闭环反馈,使传感器的灵敏度不受地域限制。这种磁阻传感器主要应用于导航、通用地磁测量和交通检测。该磁阻传感器在金属铝的表面沉积了一定厚度的高磁导率的坡莫合金,在翻转线圈和外界磁场两个力的作用下,电子改变运动方向,使得磁敏电阻的阻值发生变化。同时KMZ52的斑马条电阻成45°放置,这使得电子在正反向磁场力作用下有较好的对称性。由于加入了翻转磁场,KMZ52的变化曲线与普通的磁敏电阻不同,更加线性化。KMZ52磁阻传感器的核心部分是惠斯通电桥,是由4个磁敏感元件组成的磁阻桥臂。磁敏感元件由长而薄的坡莫合金薄膜制成。在外加磁场的作用下,磁阻的变化引起输出电压的变化。 如图1所示,KMZ52磁阻传感器的等效电路,其中,R1~R4的阻值均为R,供电电源为U。在外加偏置磁场H的作用下,R1和R4的磁化方向背向电流方向转动引起阻值减小。而R2和R3的磁化方向朝向电流方向转动,阻值增大△R。计算得:

徐东海常见等电子体原理及如何判断等电子体

等电子原理及其应用 等电子原理:含有相同原子数(除氢外)和价电子数的分子或离子往往具有相似的几何构型和化学键合情况。 1、同族元素互换法 即将既定粒子中的某元素换成它的同族元素。如:(1)CCl4的等电子体确定:换IVA族元素有SiCl4、GeCl4等;换VIIA族元素有CF4、CBr4、CI4、CFCl3、……;同时换可有SiF4、SiFCl3、……。 (2)CO2的等电子体确定:可将O原子换为S原子得COS、CS2,注意不能将C原子换为Si原子,因为CO2和SiO2的结构不同(前者为分子晶体,后者为原子晶体)。同理,不能将BeCl2的等电子体确定为MgCl2或BeF2(后两种为离子晶体)。 (3)SO42-的等电子体确定:将一个O原子换为S原子得S2O32-;NO3-的等电子体可确定为PO3-。(4)对于原子晶体类也可作类似推导:金刚石C n与晶体硅Si n互为等电子体。 2、价电子迁移法 即将既定粒子中的某元素原子的价电子逐一转移给组成中的另一种元素的原子,相应原子的质子数也随之减少或增加,变换为具有相应质子数的元素。 一般来说,讨论的元素为s区或p区元素,即主族元素居多,通常相关元素的族序数满足A+B=C+D(或A+B=2C)关系的,可考虑将A、B等个数换为C、D(或1A、1B换为2C)。如:

(1)CO2的等电子体确定,除了上述结果以外,还可以采用价电子迁移法:C、O原子的价电子数分别为4、6,从周期表中的位置看,中间夹着N元素,N原子价电子数为5,一个O原子拿一个电子给C原子,在电性不变条件下质子数同时变为7(价电子同时变为5),则可换为两个N原子(由此也可以看出N2与CO互为等电子体)得N2O;如果将C原子的两个价电子转移给两个O原子,元素原子分别转换为1个Be、2个Cl,就可以得到CO2的另一个等电子体BeCl2。 同样可以判断:金刚石C2n与晶体硅Si2n的等电子体还可以为金刚砂 (SiC)n、GaAs、AlP等;石墨C2n与白石墨(BN)n互为等电子体;无机苯B3N3H6与有机苯C6H6互为等电子体。 (2)离子之间的等电子体也可以推导:与N3-的等电子体查找方法,可将2个N原子换为1个C原子和一个O原子可得CNO-。 3、电子—电荷互换法 即将既定粒子中的某元素原子的价电子转化为粒子所带的电荷。这种方法可实现分子与离子的互判。如: CN-的等电子体查找可用N原子1个电子换作1个负电荷,则N原子换为C原子,离子带2个负电荷,其等电子体即为C22-;反之,将CN-的电荷转化为1个电子,该电子给C原子,即得N2,若给N 原子即得CO。同样可判断HNO3的等电子体为HCO3-;ICl4-与XeCl4互为等电子体

基于磁阻芯片和MSP430单片机的电子罗盘设计_郭检柟

第8卷 第1期 信 息 与 电 子 工 程 Vo1.8,No.1 2010年2月 INFORMATION AND ELECTRONIC ENGINEERING Feb.,2010 文章编号:1672-2892(2010)01-0012-04 基于磁阻芯片和MSP430单片机的电子罗盘设计 郭检柟 (东南大学 IC 学院,江苏 南京 210096) 摘 要:电子罗盘是一种获取载体姿态航向的设备。介绍磁电子罗盘的工作原理及其具体实现,利用Honeywell 的HMC1022双轴磁阻传感器设计了一种小型化的电子罗盘,利用AD623高精密度放大器作信道调理电路,利用低功耗的MSP430微处理器完成A /D 转换、方位角计算以及数字化输出等工作。采用置位/复位电路配合微处理器有效解决了传感器失调和漂移的影响。实验表明该系统具有良好的获取航向能力,且运行稳定,功耗低,误差小于1°。 关键词:地磁场;电子罗盘;磁阻芯片;MSP430微处理器 中图分类号:TN911.72 文献标识码:A Design of digital compass with magneto resistive chip and the MCU of MSP430 GUO Jian -nan (School of IC,Southeast University,Nanjing Jiangsu 210096,China) Abstract:Digital compass is a kind of device which can acquire the carrier ’s attitude. This study introduced the principle of an electronic compass. By using magneto resistive sensor chip HMC1022 made by Honeywell,a 2-axis electronic compass was developed. The amplifier AD623 was used as the signal conditioning circuit. The MPU MSP430 was in charge of A/D converting, azimuth computing and digital outputting. And the Set/Reset(S/R) circuit was adopted so that the error due to null and drift could be minimized. Experiment results showed that the system had good ability to acquire the carrier ’s attitude with stable operation and low power consumption. The error was below 1°. Key words:geomagnetic field;digital compass;magneto resistive sensor chip;MSP430 1 电子罗盘的测量原理 地球的磁感应强度大约为50 μT~60 μT ,相当于沿着地球中心的一个磁棒,磁棒的两极相对于地理的两极有大约11.5°的夹角。无论何地,地球磁场的水平分量永远指向磁北极。这一原理是所有罗盘的制作基础。所有罗盘都是测量地球磁场的北方向,其他方向即可推算出来。地球磁场的北方向和实际的北方向有差别,而这种差别的大小在地球上的不同地点是不同的,所以必须知道罗盘所在的大致位置,才能计算出如何补偿地磁和真实北方向的差别,以显示出真实的北方向。 磁北的方向就是地磁场在水平面上分量的方向。假设电子罗盘处于水平面上,要确定其相对于磁北的航向角α。由磁阻传感器可以直接得出地磁场的水平分量H x ,H y ,因此相对于磁北的航向角为: arctan β=x y H H (1) 正切函数的周期为180°,为保证数据有效性,船体航向角α转换到相对磁北0°~360°的范围内。可将式(1)分解为式(2),由此可以得到相对于磁北极的360°范围内(顺时针方向)的航向角,加上当地的磁偏角就可以算出与真北的航向角。 2 电子罗盘系统硬件结构 本设计使用Honeywell 生产的AMR 二轴磁阻传感器HMC1022作为磁场测量元件,通过置位/复位(S/R)电路 收稿日期:2009-09-10;修回日期:2009-11-20

点解原理及其应用

点解原理及其应用 1.(2017·滕州二中高三月考)下图所示装置中,已知电子由b 极沿导线流向锌。下列判断正确的是 ( ) A .该装置中Cu 极为阴极 B .一段时间后锌片质量减少 C .b 极反应的电极反应式为H 2-2e -+2OH - ===2H 2O D .当铜极的质量变化为32 g 时,a 极上消耗的O 2的体积为5.6 L 2.(2017·荆州中学高三上学期月考)利用控制n (H 2S)∶n (FeCl 3)=1∶2反应得到的产物再用电解法制氢,其工作原理如图所示。下列有关的说法错误的是( ) A .惰性电极a 发生氧化反应 B .Fe(OH)3胶体中滴加溶液X ,先有沉淀后沉淀溶解 C .溶液Y 加热蒸发灼烧最终得到Fe 2O 3 D .电解池总反应的离子方程式为2Fe 2++2H +=====电解2Fe 3++H 2↑ 3.(2017·陕西民院附中高三月考)早在1807年化学家戴维用电解熔融氢氧化钠制得钠,反应原理为4NaOH(熔融)=====电解4Na +O 2↑+2H 2O ;后来盖·吕萨克用铁与熔融氢氧化钠作用也制得钠,反应原理为3Fe +4NaOH=====1 100 ℃ Fe 3O 4+2H 2↑+4Na ↑。下列有关说法正确的是( ) A .电解熔融氢氧化钠制钠,阳极发生电极反应为Na ++e -===Na B .盖·吕萨克法制钠原理是利用铁的还原性比钠强 C .若戴维法与盖·吕萨克法制得等量的钠,则两反应中转移的电子总数比为2∶1

D.目前工业上常用电解熔融氯化钠法制钠(如图),电解槽中石墨极为阳极,铁为阴极 4.(2017·天水一中高三第一次月考)500 mL KNO3和Cu(NO3)2的混合溶液中c(NO-3)=6 mol·L-1,用石墨作电极电解此溶液,当通电一段时间后,两极均收集到22.4 L气体(标准状况),假定电解后溶液体积仍为500 mL,下列说法正确的是() A.上述电解过程中共转移2 mol电子 B.原混合溶液中c(K+)为2 mol·L-1 C.电解得到的Cu的物质的量为0.5 mol D.电解后溶液中c(H+)为2 mol·L-1 5.(2017·成都七中高三零模)高铁酸盐在能源环保领域有广泛用途。用镍(Ni)、铁作电极电解浓NaOH溶液制备高铁酸盐Na2FeO4的装置如图所示。下列推断合理的是() A.铁是阳极,电极反应为Fe-6e-+4H2O===FeO2-4+8H+ B.电解时电子的流动方向:负极→Ni电极→溶液→Fe电极→正极 C.若隔膜为阴离子交换膜,则电解结束后左侧溶液中含有FeO2-4 D.电解时阳极区pH 降低、阴极区pH升高,撤去隔膜混合后,与原溶液比较pH升高(假设电解前后体积变化忽略不计) 6.(2017·枣阳高中高三第一次月考)电解硫酸钠溶液生产硫酸和烧碱溶液的装置如图所示,其中阴极和阳极均为惰性电极。测得同温同压下,气体甲与气体乙的体积比约为1∶2,以下说法正确的是()

基于磁阻式传感器的电子罗盘的设计大学论文

本科毕业论文 便携式电子罗盘软件设计与校准 学生姓名: 学号: 学院:机电工程学院 专业:机械设计制造及其自动化(机电一体化)指导教师: 2016年 5 月 9 日

目录 引言 (4) 第一章.电子罗盘的测量与倾角补偿原理 (5) 1.1 电子罗盘的测量原理 (5) 1.2 倾角补偿原理 (6) 第二章电子罗盘的硬件设计与实现 (7) 2.1 系统框架 (7) 2.2 传感器的选择 (7) 2.3. 单片机开发环境 (8) 第三章.电子罗盘误差分析与补偿 (9) 3.1 误差来源 (9) 3.2 误差的补偿 (10) 3.2.1 漂移补偿 (10) 3.2.2 椭球化补偿 (10) 第四章.校正及其程序设计 (12) 4.1 8字型校准 (12) 4.2 8字型校准的程序设计 (12) 4.3 倾斜补偿的程序设计与实现 (13) 4.4 滤波算法 (14) 第五章.结论与展望 (15) 致谢 (16) 参考文献 (17)

便携式电子罗盘软件设计与校准 摘要本设计采用了STM32F103C8T6高速单片机为控制核心,连接了采用IIC总线通讯方式的磁阻传感器HMC5883L集成模块和加速度传感器MMA8452集成模块,通过磁阻传感器测量大地磁场,但是测量的数据仅仅在水平面内有效。在倾斜时侧需要使用加速度计进行补偿。在经过加速度传感器的姿态数据采集后使用单片机进行数据整理、运算,经过加速度计得到的X、Y、Z三轴姿态信息进行分别计算出俯仰角PITCH和横滚角ROLL。磁阻传感器采集的大地磁场的X、Y、Z三轴数据经过单片机进行俯仰角和横滚角的倾斜度补偿。在经过补偿之后,通过SPI连接的OLED显示屏输出磁阻传感器的大地磁场角度信息。 关键词:STM32单片机磁阻传感器加速度计电子罗盘 The design and calibration of portable electronic compass system Abstract This design adopts the stm32f103c8t6 high-speed microcontroller as control core, connecting the IIC bus communication hmc5883l magnetoresistive sensor integrated module and acceleration sensor MMA8452 integrated module, by magnetoresistive sensor to measure the magnetic field of the earth, but the measurement data only in the horizontal plane effectively. Accelerometer is used to compensate for the inclination of the side. In after acceleration sensor attitude data acquisition SCM data arrangement, calculation, after acceleration meter is obtained the X, y, Z three-axis attitude information are respectively to calculate the pitching angle of pitch and transverse roll angle, roll. The X, Y and Z three axis data of the magnetic field of the magnetic field of the magnetic field of the magnetic field of the magnetic resistance sensor are carried out by the single chip microcomputer to carry on the pitch angle and roll angle of the roll angle compensation. After compensation, the earth's magnetic field angle information of the OLED display is connected with the SPI display screen. Key words STM32 MCU ; magnetoresistive sensor ;acceleration sensor; electronic compass

罗盘使用和实战技巧

罗盘的使用和实战技巧 大家现在要马上找出自己家居的山向,我为大家解释罗盘的构造。 罗盘的底盘正方形,代表地,中间圆形,代表天,称为天圆地方。 放宜指南针的地方称为天池,指南针的英中一端好象一对小牛角,那个方向是北方。另一端所指的是南方。天池的底盘有两个小红点,将小牛角移至两点中央,那便是正北方。 罗盘上红色代表吉祥,黑色代表凶险。这是术数师为方便后学者而设计的。 罗盘的间置的时候必须平放,才可以令磁针保持在间适得状态。如果侧放,令磁针打侧跌在固定位置,很快便灰失去功效,这一点大家必须留意。 放宜罗盘的时候,亦要留意附近是否有电流或磁石,有的话同样令磁针很快便失效。 一个专业的风水师要带备两个罗盘。当发现磁针不稳左的时候,便要拿出第二个罗盘,去确定是磁针失效,抑或受磁场干扰。 相传蚩尤被黄帝打败之后,灵魂附于指南车之内,所以罗盘有被视为有辟邪之说。 有人将罗盘视为辟邪之物,用原理去解释,罗盘上包含所有五行八卦,的确可以产生平衡五行的作用。而且灵界最怕接触诞生与死亡,因为灵界滞留在没有时空的境界当中,最怕被人提醒时间观念。罗盘正好代表时空,由此推论,灵界的确很怕见到罗盘。 那么罗盘是否需要开光?我之前已经说过,风水不是符法,不是神通,并不需要向着罗盘念经和施法。 实战之窍门 当要找岀家宅坐向的时候,究竟应该站在那个位巻去量度?这是历代风水师的秘技,我破例在这里公开。 要准确呈:度一间屋的坐向,你要站在大门之外,距离大门口七个脚印的位置(即约三步的距离),而对着大门口去量度。 你将罗盘放在胸前,罗盘的边线与大门口互相平衡,这样便可以准确地找出这间屋的山向。古时所有人都住在独立的楼房之中,要找岀山向非常容易。 现代大多数人都住在髙楼大厦之内,根据我的实战经验,由地面至五楼的单位,受地而磁场的影响较大,须以整座大厦的坐向为单位本身坐向,量度的时候,要站在大厦正门之外七个脚步去量度。 不说不知,基本上层数越低,代表越好风水。理由是风水受地气影响,你住在摩天大厦的顶层,地气不足,风水的变数也越多。 所以最值钱一左是地铺,有钱人亦一泄住在独立洋房之中,这样才能真正吸纳地气的磁场。假如你所住的屋并非位于理想的山向之上,有些风水师建议你将大门改成斜角或列一个方向,以求将房屋的山向改变。 但实际的经验是,这种改变的功效只能维持很短时间,理由是这种变动不能将整座大厦的气场改变过来。 到山到向 我刚才已经说过,风水受时间,即理气的影响。从二0 0四年至二0二三年,地球进入二十年的八运当中。我稍会再详细讲解八运的计算方法。 在八运之中,以下六种山向大旺发,称为[到山到向],坐落这些方位之上的家宅,丁财两得。?乾山巽向?巽山乾向?丑山未向?未山丑向?巳山亥向?亥山巳向 上山下水 与[到山到水]相反的,是[上山下水]之局,这是大凶之局,坐落于这些方位的家宅,丁财

数字电子罗盘 型号

数字电子罗盘型号:XL49-ZCC212N-TTL-TY1 一.概述 电子罗盘是基于X,Y 两个方向的磁阻传感器测出地球磁场的水平分量,从而得出方位 角。本产品无活动件,耐振动,并具有硬铁校准功能,可以克服 周围硬铁磁场的干扰。工作电压:+5V,功耗低,体积小。以TTL 方式与上位机进行通信,.其输出波特率9600bp/s,为查询输出 方式。 二.产品特点 体积小; 重量轻; 功耗低; 耐振动;三.产品应用 手持式仪器仪表; 机器人导航、定位; 航行系统; 船用自动; 天线定位; 车载GPS 导航; 航模定四.技术参数表:

三.产品应用 手持式仪器仪表; 机器人导航、定位; 航行系统; 船用自动舵; 天线定位; 车载GPS 导航; 航模定向。 四.技术参数表: 测量范围;0°\u65374X 360° 分辨率:1 精度:<5 响应频率:5 重复性:<1 电压:5+(-)0.1V 工作电流:<30 工作温度:-40 ~+ 85 外形尺寸:22 * 25.4 * 11.5

五.通讯协议:(数据输出为ASC11 码): 1、输出协议: 每组方位数据共11 个字节,内容如下: Byte1:$[0x24] Byte2:H[0x48] Byte3:,[0x2C] Byte4:角度值的百位 Byte5:角度值的十位 Byte6:角度值的个位 Byte7:*[0x2A] Byte8:校验第一位 Byte9:校验第二位 Byte10:回车[0x0d] Byte11:换行[0x0a] 如: $H,211*30 注: 单字节传送每帧的格式为:1 位起始位,8 位数据位,1 位结束位2、用户指令:

扫描电子显微镜基本原理和应用

扫描电子显微镜的基本原理和结构 下图为扫描电子显微镜的原理结构示意图。由三极电子枪发出的电子束经栅极静电聚焦后成 为直径为50mm的电光源。在2-30KV的加速电压下,经过2-3个电磁透镜所组成的电子光学系统, 电子束会聚成孔径角较小,束斑为5-10m m的电子束,并在试样表面聚焦。末级透镜上边装有扫描线圈,在它的作用下,电子束在试样表面扫描。高能电子束与样品物质相互作用产生二次电 子,背反射电子,X射线等信号。这些信号分别被不同的接收器接收,经放大后用来调制荧光屏 的亮度。由于经过扫描线圈上的电流与显象管相应偏转线圈上的电流同步,因此,试样表面任意点发射的信号与显象管荧光屏上相应的亮点一一对应。也就是说,电子束打到试样上一点时,在荧光屏上就有一亮点与之对应,其亮度与激发后的电子能量成正比。换言之,扫描电镜是采用逐点成像的图像分解法进行的。光点成像的顺序是从左上方开始到右下方,直到最後一行右下方的 像元扫描完毕就算完成一帧图像。这种扫描方式叫做光栅扫描。 扫描电镜由电子光学系统,信号收集及显示系统,真空系统及电源系统组成。 1 电子光学系统 电子光学系统由电子枪,电磁透镜,扫描线圈和样品室等部件组成。其作用是用来获得扫描电子束,作为产生物理信号的激发源。为了获得较高的信号强度和图像分辨率,扫描电子束应具有较高的亮度和尽可能小的束斑直径。 <1>电子枪: 其作用是利用阴极与阳极灯丝间的高压产生高能量的电子束。目前大多数扫描电镜采用热阴极电 子枪。其优点是灯丝价格较便宜,对真空度要求不高,缺点是钨丝热电子发射效率低,发射源直径较大,即使经过二级或三级聚光镜,在样品表面上的电子束斑直径也在5-7nm,因此仪器分辨率受到限制。现在,高等级扫描电镜采用六硼化镧(LaB6)或场发射电子枪,使二次电子像的分 辨率达到2nm。但这种电子枪要求很高的真空度。 扫描电子显微镜的原理和结构示意图

dsp原理及应用课后答案电子工业出版社

第二章 3、处理器工作方式状态寄存器 PMST 中的 MP/MC、 OVLY 和 DROM 三个状态位对 C54x 的存储空间结构各有何影响? 当 OVLY= 0 时,程序存储空间不使用内部 RAM。当 OVLY= 1 时,程序存储空间使用内部RAM。内部 RAM 同时被映射到程序存储空间和数据存储空间。当 MP/ MC=0 时,4000H~EFFFH 程序存储空间定义为外部存储器; F000H~FEFFH 程序存储空间定义为内部ROM;当 MP/ MC=1 时, 4000H~FFFFH 程序存储空间定义为外部存储。DROM=0: 0000H~3FFFH——内部 RAM ; 4000H~FFFFH——外部存储器; DROM=1 :0000H~3FFFH——内部 RAM; 4000H~EFFFH——外部存储器; F000H~FEFFH——片内ROM; FF00H~FFFFH——保留。 4 、 TMS320C54x 芯片的片内外设主要包括哪些电路? ①通用 I/O 引脚②定时器③时钟发生器④主机接口 HPI⑤串行通信接口⑥软件可编程等待状态发生器⑦可编程分区转换逻辑 5、 TMS320C54x 芯片的流水线操作共有多少个操作阶段每个阶段执行什么任务完成一条指令都需要哪些操作周期? 六个操作阶段:①预取指 P;将 PC 中的内容加载 PAB ②取指 F; 将读取到的指令字加载 PB③译码 D; 若需要,数据 1 读地址加载 DAB;若需要,数据 2 读地址加载 CAB;修正辅助寄存器和堆栈指针④寻址 A; 数据 1 加载 DB;数据 2 加载CB;若需要,数据 3 写地址加载 EAB⑤读数 R; 数据 1 加载 DB;数据 2 加载 CB;若需要,数据 3 写地址加载 EAB;⑥执行 X。执行指令,写数据加载 EB。 6、 TMS320C54x 芯片的流水线冲突是怎样产生的有哪些方法可以避免流水线冲突?答:’C54x 的流水线结构,允许多条指令同时利用 CPU 的内部资源。由于 CPU 的资源有限,当多于一个流水线上的指令同时访问同一资源时,可能产生时序冲突。解决办法①由 CPU 通过延时自动解决;②通过程序解决,如重新安排指令或插入空操作指令。为了避免流水冲突,可以根据等待周期表来选择插入的 NOP 指令的数量。 7、 TMS320C54x 芯片的串行口有哪几种类型?

相关文档