因研究生阶段项目需求,需要采用HWT101给单片机提供角度信息。
HWT101是维特智能公司下的一款角度传感器,它可以通过计算角速度测量绕Z轴旋转的水平方向的偏航角,具有高精度、几乎无漂移、不受磁场干扰的特点。外观展示如下,可以通过IIC或者USART接收角度信息。其外观如下L:
本文通过串口中断的方式来接收角度信息。首先,HWT101不需要外部提供激励,只要给提供3.3V到5V的电压就能一直发送数据,其发送角度信息格式如下:
而我们这里只用到了它的角度信息,故通过串口中断接收信息,并按照其数据格式将角度解析出来即可。首先,对串口2的中断进行配置的代码如下:
void USART2_IRQHandler(void)
{
if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
{
CopeSerial2Data((unsigned char)USART2->DR);//接收数据
USART_ClearITPendingBit(USART2, USART_IT_RXNE);
}
USART_ClearITPendingBit(USART2,USART_IT_ORE);
}
然后按照数据格式对数据进行处理:
void CopeSerial2Data(unsigned char ucData)
{
static unsigned char ucRxBuffer[250];
static unsigned char ucRxCnt = 0;
ucRxBuffer[ucRxCnt++]=ucData;
if (ucRxBuffer[0]!=0x55) //校验数据头
{
ucRxCnt=0;
return;
}
if (ucRxCnt<11) {return;}//判断一帧数据是否接收完成
else
{
switch(ucRxBuffer[1])
{
case 0x53: memcpy(&stcAngle,&ucRxBuffer[2],8);break;//判断是否为角度的数据
}
ucRxCnt=0;
}
}
然后在主函数中将其通过串口1输出即可。
printf("Angle:%.3f %.3f %.3f\r\n",(float)stcAngle.Angle[0]/32768*180,(float)stcAngle.Angle[1]/32768*180,(float)stcAngle.Angle[2]/32768*180);
//按照说明将其转化为角度输出
下面是完成的代码链接,有需要的可以自取。