/*******************************************************************************
//
// 使用单片机STM32F100C8T6
// 晶振:8.00M
// 编译环境 Keil uVision4
// 在3.3V的供电环境下,就能运行
// 波特率 19200
*******************************************************************************/
#include "stm32f10x_lib.h"
#include "usart.h"
#include "delay.h"
#include "sys_config.h"
#include "adc.h"
#include "complementary_filter.h"
#include "iic.h"
#include <math.h> //Keil library
#define uchar unsigned char
#define uint unsigned int
/*
********************************************************************************
** 函数名称 : main(void)
** 函数功能 : 主函数
** 输 入 : 无
** 输 出 : 无
** 返 回 : 无
********************************************************************************
*/
int main(void)
{
RCC_Configuration(); //配置RCC
NVIC_Configuration(); //配置中断,没有这一句郁闷了很久
GPIO_Configuration(); //配置GPIO
Adc_init(); //初始化ADC
USART1_Configuration(); //配置串口1
Init_com_filter();
Delayms(500); //延时
while(1)
{
//经过测试在晶振8M,时钟24M时,以下三句的循环周期约为10ms
//Adc_filter();//adc循环滤波
//read_ADXL345();//加速度计循环滤波
//read_L3G4200D();//陀螺仪读取并累加
//Get_com_filter();
// USART1_SendData(0X0D); //换行
// USART1_SendData(0X0A); //回车
//Delayms(5); //延时
}
}
void USART1_IRQHandler(void)
{
u16 dat;
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //若接收数据寄存器满
{
dat = USART_ReceiveData(USART1);
// if(dat == '3')
{
dat=Adc_filter();
Show_data_u16(dat);
Get_com_filter();
}
}
}
#include "stm32f10x_lib.h"
#include "complementary_filter.h"
#include "iic.h"
#include "usart.h"
#include "delay.h"
#include "math.h" //Keil library
unsigned char i_a=0; //用于记录加速度计的滤波
unsigned char i_Y=0; //用于记录加速度计的Yaw转角
long i_l=0; //用于记录一个周期内陀螺仪读取的次数
unsigned char BUF[8]; //接收数据缓存区
int x,y;
float angle;
uchar ge,shi,bai,qian,wan,shiwan; //显示变量
int A_X,A_Y,A_Z;
int D_x[10],D_y[10],D_z[10];
int sum_x=0,sum_y=0,sum_z=0;
short T_X,T_Y,T_Z;
long T_[3]={0,0,0};
short data_xyz[3];
float Yaw,Pitch,Q,T,K;
float Yaw_[3]={0,0,0,};
//***BMP085使用
short ac1;
short ac2;
short ac3;
unsigned short ac4;
unsigned short ac5;
unsigned short ac6;
short b1;
short b2;
short mb;
short mc;
short md;
/* 变量定义 ----------------------------------------------*/
//***************************************************
void conversion(long temp_data)
{
shiwan=temp_data/100000+0x30 ;
temp_data=temp_data%100000; //取余运算
wan=temp_data/10000+0x30 ;
temp_data=temp_data%10000; //取余运算
qian=temp_data/1000+0x30 ;
temp_data=temp_data%1000; //取余运算
bai=temp_data/100+0x30 ;
temp_data=temp_data%100; //取余运算
shi=temp_data/10+0x30 ;
temp_data=temp_data%10; //取余运算
ge=temp_data+0x30;
}
//***************************
void Init_ADXL345(void)
{
Single_Write(ADXL345_Addr,0x31,0x0B); //测量范围,正负16g,13位模式
// Single_Write(ADXL345_Addr,0x2C,0x0e); //速率设定为100hz 参考pdf13页
Single_Write(ADXL345_Addr,0x2D,0x08); //选择电源模式 参考pdf24页
Single_Write(ADXL345_Addr,0x2E,0x80); //使能 DATA_READY 中断
// Single_Write(ADXL345_Addr,0x1E,0x00); //X 偏移量 根据测试传感器的状态写入pdf29页
// Single_Write(ADXL345_Addr,0x1F,0x00); //Y 偏移量 根据测试传感器的状态写入pdf29页
// Single_Write(ADXL345_Addr,0x20,0x05); //Z 偏移量 根据测试传感器的状态写入pdf29页
}
//****************************************
void read_ADXL345(void)
{
/* BUF[0]=Single_Read(ADXL345_Addr,0x32);//OUT_X_L_A
BUF[1]=Single_Read(ADXL345_Addr,0x33);//OUT_X_H_A
BUF[2]=Single_Read(ADXL345_Addr,0x34);//OUT_Y_L_A
BUF[3]=Single_Read(ADXL345_Addr,0x35);//OUT_Y_H_A
BUF[4]=Single_Read(ADXL345_Addr,0x36);//OUT_Z_L_A
BUF[5]=Single_Read(ADXL345_Addr,0x37);//OUT_Z_H_A */
Multi_Read(ADXL345_Addr,0x32,6,BUF); //如果不采用连续读出寄存器的数据,则会出现数据的微小波动。这与陀螺仪的读取正好相反
A_X=(BUF[1]<<8)+BUF[0]; //合成数据
A_Y=(BUF[3]<<8)+BUF[2]; //合成数据
A_Z=(BUF[5]<<8)+BUF[4]; //合成数据
}
//******************
void Send_ADXL345_data(int dis_data)
{ float temp ;
if(dis_data>0x7fff)dis_data-=0xffff;
if(dis_data<0){
dis_data=-dis_data;
USART1_SendData('-');
//Delayms(2);
}
else
{
USART1_SendData('+');
// Delayms(2);
}
temp=(float)dis_data*3.9; //计算数据和显示,查考ADXL345快速入门第4页
conversion(temp); //转换出显示需要的数据
USART1_SendData(qian);
USART1_SendData('.');
USART1_SendData(bai);
USART1_SendData(shi);
USART1_SendData(ge);
USART1_SendData('g');
}
//******************ADXL345计算倾斜角度************
void adxl345_angle(void)
{
data_xyz[0]=A_X; //合成数据
data_xyz[1]=A_Y; //合成数据
data_xyz[2]=A_Z; //合成数据
//分别是加速度X,Y,Z的原始数据,10位的
Q=(float)data_xyz[0]*3.9;
T=(float)data_xyz[1]*3.9;
K=(float)data_xyz[2]*3.9;
Q=-Q;
Pitch=(float)(((atan2(K,Q)*180)/3.14159265)+180); //X轴角度值
Yaw=(float)(((atan2(K,T)*180)/3.14159265)+180); //Y轴角度值
}
//*****************************************************
void Send_ADXL345()
{
adxl345_angle();
USART1_SendData('A');
USART1_SendData(':');
USART1_SendData('X'); // 这里的X轴与模块的Y轴相对应
USART1_SendData('=');
Pitch=Pitch*10 ; //扩大十倍,方便显示
conversion(Pitch);
USART1_SendData(qian);
USART1_SendData(bai);
USART1_SendData(shi);
USART1_SendData(ge);
USART1_SendData(' ');
USART1_SendData('Y');
USART1_SendData('=');
Yaw=Yaw*10;
conversion(Yaw);
USART1_SendData(qian);
USART1_SendData(bai);
USART1_SendData(shi);
USART1_SendData(ge);
USART1_SendData(' ');
}
//************初始化L3G4200D*********************************
void Init_L3G4200D(void)
{
Single_Write(L3G4200_Addr,CTRL_REG1, 0x0f);
Single_Write(L3G4200_Addr,CTRL_REG2, 0x00);
Single_Write(L3G4200_Addr,CTRL_REG3, 0x08);
Single_Write(L3G4200_Addr,CTRL_REG4, 0x10);
//500 dps, Degree Per Second的缩写°/S的意思。
//mdps/digit:灵敏度,指输出的每数字1代表的毫角速度 。
//当dps设置为 250dps 时,灵敏度是8.75mdps/digit,则:输出是2000时,角速度 = 2000*8.75/1000=17.5度/秒
Single_Write(L3G4200_Addr,CTRL_REG5, 0x00);
}
//******读取L3G4200D数据****************************************
void read_L3G4200D(void)
{
BUF[0]=Single_Read(L3G4200_Addr,OUT_X_L);
BUF[1]=Single_Read(L3G4200_Addr,OUT_X_H);
BUF[2]=Single_Read(L3G4200_Addr,OUT_Y_L);
BUF[3]=Single_Read(L3G4200_Addr,OUT_Y_H);
BUF[4]=Single_Read(L3G4200_Addr,OUT_Z_L);
BUF[5]=Single_Read(L3G4200_Addr,OUT_Z_H);
//Multi_Read(L3G4200_Addr,0x28,6,BUF); //如果采用连续的读取寄存器数据,就会引起很大的噪声
T_X= (BUF[1]<<8)|BUF[0];
T_Y= (BUF[3]<<8)|BUF[2];
T_Z= (BUF[5]<<8)|BUF[4];
}
//******************
void Send_L3G420D_data(short dis_data)
{ float temp ;
if(dis_data<0){
dis_data=-dis_data;
USART1_SendData('-');
//Delayms(2);
}
else
{
USART1_SendData('+');
//Delayms(2);
}
temp=(float)dis_data*17.5/1000; //计算数据和显示,查考L3G4200D第10页.选用的是500dps
conversion(temp); //转换出显示需要的数据
USART1_SendData(wan);
USART1_SendData(qian);
USART1_SendData(bai);
USART1_SendData(shi);
USART1_SendData(ge);
}
//*****************************************************
void Send_L3G4200D()
{
USART1_SendData('L');
USART1_SendData(':');
USART1_SendData('X');
USART1_SendData('=');
Send_L3G420D_data(T_X);
USART1_SendData(' ');
USART1_SendData('Y');
USART1_SendData('=');
Send_L3G420D_data(T_Y);
USART1_SendData(' ');
USART1_SendData('Z');
USART1_SendData('=');
Send_L3G420D_data(T_Z);
}
//***************************************
void Init_com_filter(void)
{/*
unsigned char i;
for(i=0;i<30;i++)
{
A[i]=0;
}*/
//Init_HMC5883L();
Init_ADXL345();
Init_L3G4200D(); //初始化L3G4200D
}
void Get_com_filter()
{
//read_hmc5883l();
//Send_HMC5883L();
read_ADXL345();
Send_ADXL345();
read_L3G4200D();
Send_L3G4200D();
USART1_SendData(0x0d); //换行
USART1_SendData(0x0a);
//Delayms(20);
}
/*************结束***************/