采集模拟量数据在一台一起中是必不可少的功能。在本次实验中我们要采集的模拟量值主要包括氧气传感器的输出以及压力变送器的输出。

1硬件设计

我们需要采集数据对精度有一定的要求,而STM32L476自带ADC为12位的,所以我们采用独立的ADC芯片来完成这一工作。由于使用经验的关系,我们选择了AD7705芯片。

AD7705为完整16位、低成本、Σ-Δ型ADC,适合直流和低频交流测量应用。其具有低功耗(3 V时最大值为1 mW)特性,因而可用于环路供电、电池供电或本地供电的应用中。片内可编程增益放大器提供从1至128的增益设置,无需使用外部信号调理硬件便可接受低电平和高电平模拟输入。AD7705拥有两个差分通道,对外通讯支持SPI接口方式。其结构图如下:

在STM32L476RG开发板中,有SPI3口已经引到端子可以使用。各引脚分别为:

CN7-1         PC10            SPI3-SCK

CN7-2         PC11            SPI3-MISO

CN7-3         PC12            SPI3-MOSI

在开发板上的位置如下红框标识:

根据以上描述,于是我们设计电路图如下:

2、软件设计

完成硬件连接后我们可以开始软件开发了,首先我们在STM32CubeMX中对硬件部分进行配置。由于板子上没有焊接X3外部晶振,我们使用内部时钟源。使用SPI3的引脚PC10,PC11,PC12,如下图所示:

然后配置SPI3的的参数,我们采用7为数据,大端以及64分频,具体的参数配置如下图所示:

对应的SPI3端口的配置程序如下所示:

static void SPI3_Configuration(void)

{

  hspi3.Instance = SPI3;

  hspi3.Init.Mode = SPI_MODE_MASTER;

  hspi3.Init.Direction = SPI_DIRECTION_2LINES;

  hspi3.Init.DataSize = SPI_DATASIZE_8BIT;

  hspi3.Init.CLKPolarity = SPI_POLARITY_LOW;

  hspi3.Init.CLKPhase = SPI_PHASE_1EDGE;

  hspi3.Init.NSS = SPI_NSS_SOFT;

  hspi3.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_64;

  hspi3.Init.FirstBit = SPI_FIRSTBIT_MSB;

  hspi3.Init.TIMode = SPI_TIMODE_DISABLE;

  hspi3.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;

  hspi3.Init.CRCPolynomial = ;

  if (HAL_SPI_Init(&hspi3) != HAL_OK)

  {

    Error_Handler();

  }

}

接下来我们实现通过SPI3接口读取摸你脸个采集值得程序。

/*获取采集的物理量值,并作平滑处理*/

void GetMeasuredValue(void)

{

  float currentValue[]={-1.0,-1.0};

  CalcMeasuredValue(currentValue);

    if(smoothIndex>=SmoothCount)

  {

    smoothIndex=;

  }

  aPara.phyPara.o2Concentration=SmoothingFilter(currentValue[],AD1Value,smoothIndex,SmoothCount,(O2RANGE-O2ZERO),2.0,0.2);

  aPara.phyPara.h2Concentration=SmoothingFilter(currentValue[],AD2Value,smoothIndex,SmoothCount,(H2RANGE-H2ZERO),2.0,0.2);

  smoothIndex++;

}

/*计算测量值,将AD转换的值转为物理量的对应值*/

static void CalcMeasuredValue(float *newValue)
{
uint16_t measuredValue=; /*转化通道1的值*/ ADDA_AD7705_ENABLE();//使能器件 Delayus(); measuredValue=GetAD7705ChannelValue(Channel1,SPIReadWriteByte,CheckDataIsReady); ADDA_AD7705_DISABLE();//片选取消 newValue[]=PowerNPolyfit(((float)(measuredValue-AD1Zero)/(float)(AD1Scale-AD1Zero)),ADFactor[],)*(O2RANGE-O2ZERO)+O2ZERO; Delayms(); /*转化通道2的值*/ ADDA_AD7705_ENABLE();//使能器件 Delayus(); measuredValue=GetAD7705ChannelValue(Channel2,SPIReadWriteByte,CheckDataIsReady); ADDA_AD7705_DISABLE();//片选取消 newValue[]=PowerNPolyfit(((float)(measuredValue-AD2Zero)/(float)(AD2Scale-AD2Zero)),ADFactor[],)*(H2RANGE-H2ZERO)+H2ZERO; Delayms(); }

/*对SPI端口读写一个字节*/

static uint8_t SPIReadWriteByte(uint8_t data)
{
uint8_t rxData=; HAL_SPI_TransmitReceive(&hspi3,&data,&rxData,,); return rxData; }

/*检查数据是否准备好*/

static uint8_t CheckDataIsReady(void)
{
return (uint8_t)HAL_GPIO_ReadPin (GPIOB,GPIO_PIN_7);
}

3、测试结果

程序下装后,运行正常可一看到2个通道的采集数据。如下图所示:

我们在测试时,采集了两个传感器输出,在实际使用时,我们只需要一路接传感器,而另外一路我们采集锂电池的电压信号。

STM32L476应用开发之二:模拟量数据采集的更多相关文章

  1. (56)Linux驱动开发之二

                                                                                             内核基础   1.li ...

  2. python网页爬虫开发之二

    1.网站robots robotparser模块首先加载robots.txt文件,然后通过can_fetch()函数确定指定的用户代理是否允许访问网页. 2.识别网站技术 3.下载网页 使用urlli ...

  3. OneNET麒麟座应用开发之二:串口读取PM25传感器数据

    作为环境数据监测站首先要获取大气中可吸入颗粒物的数据.为了检测PM25数据,我们采用北京海联信为的HLPM025K3型号传感器,该传感器使用激光法测量PM25和PM10的数据. 该型传感器的检测对象如 ...

  4. 指尖下的js ——多触式web前端开发之二:处理简单手势(转)

    这篇文章将描述多触式网页开发中对手势(Gesture)事件的处理.     水果设备中的Gesture,广义的说包括手指点击(click),轻拂(flick),双击(double-click),两只手 ...

  5. yii2-basic后台管理功能开发之二:创建CRUD增删改查

    昨天实现了后台模板的嵌套,今天我们可以试着创建CRUD模型啦 刚开始的应该都是“套用”,不再打算细说,只把关键的地方指出来. CRUD即数据库增删改查操作.可以理解为yii2为我们做了一个组件,来实现 ...

  6. iOS开发之二:UIWindow与UIView

    1.UIWindow UIWindow 继承自UIView,它是整个应用的容器,一般来说一个应用就只有一个UIWindow. 如果不使用storyboard 时,需要我们自己创建UIWindow.实例 ...

  7. DJI SDK iOS 开发之二:搭建主要的开发环境

    本文想介绍搭建主要的DJI SDK iOS下的开发环境,只是DJI官方已经给出了非常具体的执行其demo的教程.网址例如以下: https://dev.dji.com/cn/guide 我这里总结一下 ...

  8. android软件开发之webView.addJavascriptInterface循环渐进【二】

    本篇文章由:http://www.sollyu.com/android-software-development-webview-addjavascriptinterface-cycle-of-gra ...

  9. android开发之Animations的使用(二)

    android开发之Animations的使用(二) 本博文主要讲述的是android开发中的animation动画效果的使用,和上一篇博文不同的是,此次四种动画效果,主要使用的是xml文件实现的,提 ...

随机推荐

  1. gcd 二进制/循环

    #include<bits/stdc++.h> #define LL long long using namespace std; inline aabs(LL x){ ?x:-x;} i ...

  2. HMM拓扑与转移模型

        <Topology> <TopologyEntry> <ForPhones> 1 2 3 4 5 6 7 8 </ForPhones> < ...

  3. jira安装插件svn

    1.登录jira 2.设置-插件-查找新插件 搜索 Jira Subversion plugin 3.安装成功之后 4.关联svn仓库 5.关联成功

  4. springboot+freemarker

    springboot添加freemarker支持 1.application.properties中添加配置 #freemarker config spring.freemarker.allow-re ...

  5. 【译】第九篇 SQL Server安全透明数据加密

    本篇文章是SQL Server安全系列的第九篇,详细内容请参考原文. Relational databases are used in an amazing variety of applicatio ...

  6. 闭包可以存储变量(下标) 小demo

    点击每一行弹出其下标

  7. 为什么可逆矩阵又叫“非奇异矩阵(non-singular matrix)”?

    最近在捡回之前的线性代数知识,在复习可逆矩阵的时候,发现有的书上把可逆矩阵又称为非奇异矩阵,乍一看名字完全不知所云,仔细一分析,还是不明白.要想弄明白,还是得从英文入手,下面的解释主要从这里得来的Wh ...

  8. drand48 等 随机数生成函数

    参考: http://www.man7.org/linux/man-pages/man3/drand48.3.html drand48 返回服从均匀分布的·[0.0, 1.0) 之间的 double ...

  9. 集合排序 Comparator和Comparable的使用区别

    Java 排序 Compare  Comparator接口 Comparable接口 区别 在Java中使用集合来存储数据时非常常见的,集合排序功能也是常用功能之一.下面看一下如何进行集合排序,常用的 ...

  10. 海马玩模拟器——搭建React Native环境

    Visual Studio Emulator for Android 模拟器国内这网络环境不太用,所以使用海马玩模拟器,给大家推荐一下! 下面开始配置环境: 1)下载1.8+JDK,配置JDK环境参考 ...