陀螺仪数据采集编程问题(pic单片机与传感器采用串口通信)
时间:10-02
整理:3721RD
点击:
(模块与单片机是通过USATR通信)我写了一个关于AHRS的程序用来测量加速度,陀螺仪值,磁场和四元素的值,但是在晃动PCB时Watch窗口的值一直没有更新,不知道为什么,求助大家。(我用的是MPLAB IDE V8.8 编译工具MCC18. 编译通过)。麻烦大家审下代码
#include <p18f2525.h>
#include <math.h>
#include <string.h>
#define uchar unsigned char
#define uint unsigned int
//^^^^^^^^^^^^^^^^^^^^^配置位的软件设置^^^^^^^^^^^^^^^^^^^^^^//
#pragma config WDT = OFF //看门狗禁止
#pragma config OSC = HS //晶振
#pragma config LVP = OFF //低电压编程禁止
float Acc[3],Gyr[3],Mag[3],rpy[3],Q[4];
float ROLL,PITCH,YAW;
unsigned char Re_buf[11];
unsigned char sign;
unsigned char counter=0;
void delayms(unsigned char time) //延时函数
{
unsigned char i;
while(time--)
{
for(i=0;i<120;i++);
}
}
//^^^^^^^^^^^^^^^^^^^^^单片机串口初始化^^^^^^^^^^^^^^^^^^^^^^//
void UartInit(void)
{
TRISCbits.TRISC7=1; //IO方向初始化RC7口设置为输入、RC6口设置为输出
TRISCbits.TRISC6=0;
PIE1bits.RCIE=0; //关闭接收使能RCIE
RCSTA=0x00; //关闭串行端口
PIE1bits.RCIE=1; //使能外部中断PEIE
PIE1bits.TXIE=1; //串口发送中断
RCSTA=0x90; //使能串行端口,使能连续接收
TXSTA=0x24; //使能发送,高速波特率
SPBRG=51; //设置波特率寄存器X=51,波特率为9600;波特率=Fosc/[16(X+1)]
INTCON=0xC0; //全局中断GIE打开;使能外部中断PEIE
}
//^^^^^^^^^^^字节发送函数^^^^^^^^^^^^^^^^^^^//
void UartData(uchar dat)
{
TXREG=dat;
while(TXSTAbits.TRMT==0);
}
//^^^^^^^^^^^字符串发送函数^^^^^^^^^^^^^^^^^^^//
void UartSend(uchar *ptr,unsigned char length) //*s^^^^ptr
{
int i=0;
while(i<length)
{
UartData(*(ptr+i));
i++;
}
}
//***********************串口中断********************************//
void UartReceive()
{
if(PIR1bits.RCIF)
{
Re_buf[counter]=RCREG;
if(counter==0&&Re_buf[0]!=0x5A&&counter==1&&Re_buf[1]!=0x5A) return; //第0号和1号数据不是帧头
counter++; //如果是帧头则开始计数
if(counter==11) //接收到11个数据
{
counter=0; //重新赋值,准备下一帧数据的接收
sign=1;
}
}
}
void main(void)
{
TRISBbits.TRISB3=0;
PORTBbits.RB3=1;
TRISBbits.TRISB4=0;
PORTBbits.RB4=1;
UartInit();
delayms(20);
while(1)
{
if(sign)
{
sign=0;
if(Re_buf[0]==0x5A&&Re_buf[1]==0x5A) //检查帧头
{
switch(Re_buf[2])
{
case 0x15: //三轴加速度
{
Acc[0]=((short)(Re_buf[4]<<8|Re_buf[5]))/16383.0;
Acc[1]=((short)(Re_buf[6]<<8|Re_buf[7]))/16383.0;
Acc[2]=((short)(Re_buf[8]<<8|Re_buf[9]))/16383.0;
}
break;
case 0x25: //陀螺仪数据
{
Gyr[0]=((short)(Re_buf[4]<<8|Re_buf[5]))/16383.0;
Gyr[1]=((short)(Re_buf[6]<<8|Re_buf[7]))/16383.0;
Gyr[2]=((short)(Re_buf[8]<<8|Re_buf[9]))/16383.0;
}
break;
case 0x35: //磁力计数据
{
Mag[0]=((short)(Re_buf[4]<<8|Re_buf[5]))/16383.0;
Mag[1]=((short)(Re_buf[6]<<8|Re_buf[7]))/16383.0;
Mag[2]=((short)(Re_buf[8]<<8|Re_buf[9]))/16383.0;
}
break;
case 0x45: //欧拉角数据
{
ROLL=((short)(Re_buf[4]<<8|Re_buf[5]))/16383.0*100;
PITCH=((short)(Re_buf[6]<<8|Re_buf[7]))/16383.0*100;
YAW=((short)(Re_buf[8]<<8|Re_buf[9]))/16383.0*100;
rpy[0]=ROLL;
rpy[1]=PITCH;
rpy[2]=YAW;
}
break;
}
}
}
}
}
已退回5积分