Stm32旧版库函数18——读传感器

news2024/11/16 9:46:44

/*******************************************************************************
//
// 使用单片机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);    
}


/*************结束***************/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/98409.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot请求参数传递与接收

一、GET请求和POST请求的区别是什么 GET和POST请求的区别主要有下面几点 GET没有请求体&#xff0c;POST有请求体GET传输比POST快GET只能携带少量数据&#xff08;因为其请求url有长度限制&#xff09;&#xff0c;POST可以携带的数据量较大POST因为将数据放在请求体中&#…

使用IDEA工具通过Java API 访问HDFS

文章目录一&#xff0c;了解 HDFS Java API&#xff08;一&#xff09;HDFS常见类与接口&#xff08;二&#xff09;FileSystem的常用方法二&#xff0c;编写Java程序访问HDFS01 创建Maven项目02 添加相关依赖03 创建日志属性文件&#xff08;1&#xff09;在resources目录里创…

变电站火灾检测项目(tf2)

目录 1. 项目背景 2. 项目研究数据集介绍&#xff08;变电站火灾检测图像数据集&#xff09; 3. 目标检测模型介绍&#xff08;SE改进的YOLOv4-tiny模型&#xff09; 4. 模型训练及测试 1. 项目背景 我们的日常生活与电力息息相关&#xff0c;变电站作为输配电系统的关键环…

【设计模式】责任链模式

【设计模式】责任链模式 文章目录【设计模式】责任链模式一&#xff1a;责任链模式概述二&#xff1a;责任链模式结构三&#xff1a;责任链模式案例实现四&#xff1a;优缺点五&#xff1a;责任链模式实战一&#xff1a;责任链模式概述 在现实生活中&#xff0c;常常会出现这样…

Jmeter(二十一):jmeter导入和导出接口的处理

JMeter测试导入接口 利用Jmeter测试上传文件&#xff0c;首先可根据接口文档或者fiddler抓包分析文件上传的接口&#xff1b;如下图&#xff1a; 以下是我通过fiddler所截取的文件上传的接口 1、填写导入接口的信息 查看文件上传栏下的填写信息&#xff1a; 文件名称&#xf…

【图像分割】多种阈值图像分割(带面板)【含GUI Matlab源码 733期】

⛄一、图像分割简介 理论知识参考&#xff1a;【基础教程】基于matlab图像处理图像分割【含Matlab源码 191期】 ⛄二、部分源代码 function varargout yuzhifenge(varargin) % YUZHIFENGE MATLAB code for yuzhifenge.fig % YUZHIFENGE, by itself, creates a new YUZHIFEN…

【Redis】缓存问题

用户数据一般都是存储在数据库中&#xff0c;数据库则落在磁盘上。而磁盘的I/O速度是计算机中最慢的硬件。 当用户的访问量在某一个时间段突然上升&#xff0c;数据库就很容易崩溃。为了避免用户直接访问数据库&#xff0c;所以会使用缓存数据库(Redis)作为缓冲层。 Redis 是内…

DIY NAS服务器之OMV 5.6入坑指南(二)- 安装omv-extras插件

DIY NAS服务器之OMV 5.6入坑指南&#xff08;一&#xff09;-openmediavalut 5.6安装 前面我们已经安装好了OMV5.6了。 接下来就是建设我们的OMV系统了。 首先第一步&#xff0c;我们开启社区插件omv-extras&#xff1a; 通过如下url把插件安装文件 下载到电脑本地&#xff0c…

Mysql分布式锁(二)直接用一条sql语句来实现原子性

文章目录一、直接用更新的sql实现1. 场景描述2. 修改sqlStockMapperStockService3. 重新测试二、问题1. 锁范围问题&#xff1a;行级锁 表级锁2. 若逻辑太复杂&#xff0c;一个sql无法实现4. 无法监控库存变化前后的状态一、直接用更新的sql实现 1. 场景描述 之前的deduct()方…

DevOps实战系列【第十三章】:流水线应用工具Blue Ocean使用

个人亲自录制全套DevOps系列实战教程 &#xff1a;手把手教你玩转DevOps全栈技术 BlueOcean图形化工具 可以通过插件的方式安装到jenkins&#xff0c;搜索“Blue Ocean”&#xff0c;安装后重启即可。 由于兼容问题&#xff0c;BlueOcean依赖的插件有些是失败的&#xff0c;我…

实际生产中使用Oracle的小问题及解决方法记录:ORA-00911,ORA-12514,ORA-28547

背景 在上次安装并初步测试 Oracle 后Oracle 11g安装使用、备份恢复并与SpringBoot集成&#xff0c;在实际生产中使用 Oracle 时又遇到几个小问题&#xff1a; ORA-00911 &#xff0c; ORA-12514 &#xff0c; ORA-28547 。下面分别列出这几个问题的解决方法。 Note&#xff…

DCBC路由模式配置端口映射

DCBC路由模式配置端口映射 拓扑搭建 前提&#xff1a;使用DCBC、CS6200、两台PC机&#xff1a;一台用户配置IP另一台用于测试端口映射&#xff0c;外网环境使用192.168.19.0/24网段 网段划分 全网互通 1.DCBC对应工作模式配置 对应接口配置 配置静态路由两条&#xff0c;一条…

ArcGIS And ENVI:如何进行植被指数的提取并制作成专题地图?

目录 01 目的 02 操作步骤 2.1 在ENVI加载tm_860516.img文件 2.2 进行NDVI指数的计算 2.3 使用ArcGIS对NDVI植被指数提取图进行专题制作 2.3.1 加载NDVI植被指数提取图 2.3.2 对NDVI植被指数提取图进行重分类 2.3.3 布局视图下的NDVI植被指数的相关编辑 03 实验结果 01 目的 对…

Iterated function

In mathematics, an iterated function is a function X → X (that is, a function from some set X to itself) which is obtained by composing another function f : X → X with itself a certain number of times. The process of repeatedly applying the same function…

【数据结构与算法 - 数据结构基础】什么是数据结构?

【数据结构与算法 - 数据结构基础】什么是数据结构&#xff1f; 文章目录【数据结构与算法 - 数据结构基础】什么是数据结构&#xff1f;1 数据结构包含的三个方面1.1 数据的逻辑结构1.1.1 线性结构数组【Array】链表【LinkedList】栈【Stack】队列【Queue】1.1.2 树结构【Tree…

【生信】初探基因定位和全基因组关联分析

初探QTL和GWAS 文章目录初探QTL和GWAS实验目的实验内容实验题目第一题&#xff1a;玉米MAGIC群体的QTL分析第二题&#xff1a;TASSEL自带数据集的关联分析实验过程玉米MAGIC群体的QTL分析① 包含的数据② 绘制LOD曲线株高对应的QTLTASSEL自带数据集的关联分析TASSEL简介实际操作…

Docker ( 一 ) 基本概念及安装

1.Docker是什么&#xff1f; Docker 是一个开源的应用容器引擎, 可以简化理解实现应用与运行环境分离. Docker 其中包括&#xff0c;镜像、容器、仓库等概念&#xff0c;目的就是通过对应用组件的封装、分发、部署、运行等生命周期的管理&#xff0c;使用户的产品&#xff08…

Android 进阶——性能优化之电量优化全攻略及实战小结(一)

文章大纲引言一、偷懒至上的原则二、低电耗模式1、低电耗模式概述2、低电耗模式限制3、适配适应低电耗模式三、应用待机模式对其他用例的支持引言 电池续航时间是移动用户体验中最重要的一个方面。没电的设备完全无法使用。因此&#xff0c;对于应用来说&#xff0c;尽可能地考…

数据库拆分4--sharding-jdbc-spring-boot-starter自动装配启动过程

学习一下springboot是如何整合sharding-jdbc的。 添加依赖以后 <dependency><groupId>org.apache.shardingsphere</groupId><artifactId>sharding-jdbc-spring-boot-starter</artifactId><version>4.1.1</version> </dependency…

Java8之JMX与MBean

参考文章&#xff1a; 《JMX超详细解读》 《JMX》 写在开头&#xff1a;本文为学习后的总结&#xff0c;可能有不到位的地方&#xff0c;错误的地方&#xff0c;欢迎各位指正。 在学习tomcat源码架构的时候了解到其中使用了JMX来实现一些管理工作&#xff0c;于是便整理了这篇…