历史上的今天
今天是:2025年02月17日(星期一)
2020年02月17日 | 基于STM32的三轴数字罗盘HMC5883L模块的测试方案
2020-02-17 来源:elecfans
最近买了个数字罗盘模块,调通后发现很不错,非常灵敏,测试的时候精度在1°以内。连续测量模式下,最快测量、输出速率可达75hz,模块每次测量完毕并将数据更新至寄存器后,其DRDY引脚便产生一个低电平脉冲(可以配置一个外部中断捕获DRDY引脚的下降沿,并在中断服务程序中读取数据),在STM32中可以设置一个下降沿触发的外部中断,并在中断服务程序中调用角度数据读取函数。以下为操作该模块的主要步骤。
一、IIC协议相关操作(单片机作为主机控制时钟线)
宏定义:
//这里用到了STM32的位带区操作,方便实现对一个位的操作
//PB13配置为OD输出,同时外部给上拉电阻,这样既可输出信号给从机,也能
//在PB13为漏极开路状态时接收从机的信号(STM32的IO配置为输出模式时,
//IO口的电平也会不断地被捕获到输入寄存器中)
//PB14配置为推挽输出,PB15配置为浮空输入
#defineR_SDAIPB13//PB13输入寄存器
#defineW_SDAOPB13//PB13输出寄存器
#defineW_SCLOPB14//PB14输出寄存器
#defineR_DRDYIPB15//PB15输入寄存器
#defineXmsb0//X轴数字量的高8位
#defineXlsb1//X轴数字量的低8位
#defineZmsb2//Z轴数字量的高8位
#defineZlsb3//Z轴数字量的低8位
#defineYmsb4//Y轴数字量的高8位
#defineYlsb5//Y轴数字量的低8位
附位带宏定义:
#defineGPIOB_ODR_Addr(GPIOB_BASE+12)//0x40010C0C
#defineGPIOB_IDR_Addr(GPIOB_BASE+8)//0x40010C08
#defineBITBAND_Addr(Addr,num)((volaTIleunsignedlong*)(0x42000000+32*(Addr-0x40000000)+4*num))
#defineIPB13*BITBAND_Addr(GPIOB_IDR_Addr,13)
#defineOPB13*BITBAND_Addr(GPIOB_ODR_Addr,13)
#defineOPB14*BITBAND_Addr(GPIOB_ODR_Addr,14)
#defineIPB15*BITBAND_Addr(GPIOB_IDR_Addr,15)
启动IIC传输:
void_iic_Start()
{
W_SCL=1;
W_SDA=1;
_delay();
W_SDA=0;//SCL高时,拉低SDA,表示开始IIC传输,占用总线
_delay();
W_SCL=0;//控制SCL
_delay();
}
停止IIC传输:
void_iic_Stop()
{
W_SCL=1;//释放SCL(由于没有其他主器件,SCL无需开漏)
W_SDA=0;
发送一个字节:
uint8_t_iic_SendByte(uint8_tdat)
{
uint8_TI;
for(i=0;i《8;i++)
{
_delay();
W_SDA=dat》》7;//SCL拉高之前写SDA
dat=dat《《1;
_delay();
W_SCL=1;//拉高SCL,从器件开始读取SDA
_delay();
W_SCL=0;//重新拉低SCL
}
W_SDA=1;//释放SDA
W_SCL=1;//拉高SCL,读取从器件应答信号
//等待应答
i=100;
while(i&&R_SDA){i--;_delay();}
if(i==0)//无应答
{
W_SCL=0;//重新拉低SCL
return0;
}
else{//有应答
_delay();
W_SCL=0;//重新拉低SCL
return1;
}
}
_delay();
W_SDA=1;//SCL为高时,拉高SDA表示结束ICC传输,释放总线
}
接收一个字节:
uint8_t_iic_ReadByte(uint8_tAck)
{
uint8_ttemp,i;
W_SDA=1;//释放SDA
_delay();
for(i=0;i《8;i++)
{
_delay();
W_SCL=1;//拉高SCL开始读取SDA
temp=temp《《1;
temp|=R_SDA;//SCL拉高之后读取SDA
W_SCL=0;//拉低SCL,从器件开始放置数据
}
//发送应答信号
if(Ack)W_SDA=0;//拉低SDA表示应答
W_SCL=1;//拉高SCL,从器件接收应答信号
_delay();
W_SCL=0;//重新拉低SCL
W_SDA=1;//释放SDA
returntemp;
}
二、配置HMC5883L模块
voidHMC5883L_Init()
{
_iic_Start();
_iic_SendByte(0x3c);//写操作
_iic_SendByte(0x00);//指针指向00,配置寄存器A
_iic_SendByte(0x78);//数据测量、输出速率75hz
_iic_Start();//指针定位到02,模式寄存器
_iic_SendByte(0x3c);
_iic_SendByte(0x02);
_iic_SendByte(0x00);//连续测量模式
_iic_Stop();
}
三、读取角度数据
接收三轴数据,处理X,Y轴的数据并计算角度:
int16_tHMC5883L_ReadAngle()
{
staTIcuint8_TI;
staticuint8_tXYZ_Data[6];//用来存储三个轴输出的数字量
_iic_Start();
_iic_SendByte(0x3c);//发送HMC5883L的器件地址0x3c,写操作
_iic_SendByte(0x03);//指针指向03,Xmsb寄存器
_iic_Start();
_iic_SendByte(0x3d);//改为读操作
//依次读取三个轴的数字量
for(i=0;i《5;i++)//前5次读取发送应答信号
{
XYZ_Data[i]=_iic_ReadByte(1);
}
XYZ_Data[5]=_iic_ReadByte(0);//不应答
_iic_Stop();
returnatan2((double)((int16_t)((XYZ_Data[Ymsb]《《8)+XYZ_Data[Ylsb])),(double)((int16_t)((XYZ_Data[Xmsb]《《8)+XYZ_Data[Xlsb])))*(180/3.14159265)+180;//计算角度,需要包含math.h头文件
}
配置好IO口,调用HMC5883L_Init()后,便可调用HMC5883L_ReadAngle()读取角度值,0~360°。以下为测试时的截图:

测试时,模块比较灵敏且精确,稍微旋转模块便有精确的变化。由于该模块是基于对地磁场的测量,此模块容易受到其他磁场的干扰,比如将该模块靠近直流电机时,便会因为电机内的磁场而降低精度甚至失灵(之前做智能小车时就遇到这个问题,要将电机内的磁场屏蔽起来才行)。
上一篇:stm32使用中出现的警告
史海拾趣
|
前两三天找了和看了很多关于44b0中断的资料,结合了bootloader的代码,总算深入了解了44b0的向量和非向量的IRQ中断方式,但发现找不到HandleFIQ所对应的入口。请问FIQ中断是如何在uclinux下实现的?它如何实现区分发生了26种中断源中 ...… 查看全部问答> |
|
Linux IP:192.168.0.2 ARM 开发板IP:192.168.0.3 Linux自已mount nfs成功:mount -t nfs 192.168.0.2:/nfs /mnt/nfs Linux和开发板能Ping通,但开发板却不能mount Linux中的nfs共享目录: mount -t nfs -o nolock 192.16 ...… 查看全部问答> |
|
大家好,想请教个关于MOBILE下播放WAV的问题 最近在做个导航的测试,需要把各个语音文件给串起来播放,比如“前方”、“五”、“十”。。。。 我是用wave function进行处理的。起初我只用一个缓冲去,然后在我的主线程中开个线程进行语音播放处 ...… 查看全部问答> |
|
在使用 Altera 的 FPGA 时候,根据系统设计需要在管脚的内部加上上拉电阻。Quartus II 软件中在 Assignment 的 Pin Planner中可以设置。具体过程如下: 1. 在菜单 Ass ...… 查看全部问答> |
|
加速度传感器能够准确的测量被测物体的加速度信息,从而获知其当前的运动状态,包括位置,速度和加速度。加速度传感器已广泛应用于各类消费电子产品中。本设计正是基于ADI的两轴加速度传感器ADXL320而设计的,它能够精确地测量出佩戴者行走的步数, ...… 查看全部问答> |
|
DIY 太阳能自动跟踪阳光系统,视频+多图~~~ 图片是从视频中接的图不清楚,高清图已经附上貌似之前的图片删不掉了,,, $(\'flv_KY8\').innerHTML=(mobileplayer() ? \"\" : AC_FL_RunContent(\'width\', \'500\', \'height\', \'375\', \'allowN ...… 查看全部问答> |
|
【实验内容】基于FSPAD_702平板,实现串口通信。 【实验目的】熟悉FSPAD_702平板串口通信的整体流程。 【实验环境】Ubuntu 10.04虚拟机,FSPAD_702开源平板,usb转网口模块,usb转串口数据线等 ...… 查看全部问答> |




