MbedOS 设备中的模数转换(ADC)

       模拟量是指变量在一定范围连续变化的量,物理世界的数据几乎大多数是模拟量,比如温度,电流,电压,风速,振动等等。模拟量需要通过采样,才可能转化成近似,离散的数字值。

   传感器采样的数据大多数都是模拟量。未来的趋势是将大幅度增加各种智能数据采集设备和传感器,智能设备采集,处理,分析模拟量的能力非常重要。智能设备的作用是将物理世界的模拟数据经过本地处理后采集传输给数据分析系统,模拟数据的采集和网络连接非常重要的一环。

       AI和大数据技术的基础是数据,而这些数据主要是模拟数据。比如在工业领域,需要检测机器的振动数据,可以预测出设备的健康状况。所以需要检测电机,轴承,变速箱的振动数据,温度等模拟数据。然后可以使用神经网络技术或者大数据统计分析,都得出判断结果。数据采集和测量技术越来越重要。也可以说,大数据实际上是模拟大数据(Big Analog Data)。

常见的物理模拟量包括:

  • -流量
  • -压力                                                                                                                                  
  • -温度
  • -振动
  • -应变
  • -PH值

模拟信号的调理

大多数模数转换系统都包含模拟前端电路,这些处理称之为信号调理。包括了信号隔离,增益放大器,滤波,输出驱动。

模拟信号的标准化接口

送入ADC 的电信号需要是一个标准的电信号。只有这样才能使的ADC 转换板具有通用性。常见的ADC 输入信号有下列几种。

标准电流4~20mA

4~20mA 是传感器模拟信号的工业标准。传感器变送器可将模拟值从传感器输出转换为等效的 4 至 20mA 电流。

标准电压

  传送给ADC 接口的信号是一个标准的电压范围。典型的是-10 to +10 volts DC。

 

扫描二维码关注公众号,回复: 3857689 查看本文章

ADC 技术的分类

  • 逐次逼法Successive Approximation (SAR)。
  • Delta-Sigma (∆Σ)
  • 流水线法(Pipeline)

三种方式的优缺点分析:

ADC 比较

内置ADC

现代单片机普遍内置了ADC外围电路和多个模拟量输入,以STM32F429为例,它内部带有3个12位精度的ADC。它有如下特点:

  1. 12位ADC,高达1M转换速率
  2. ADC 的信号范围 0~3.6V
  3. 支持DMA 模式
  4. 单端输入,不支持差分输入。

内置ADC的优点是成本低,转换和传输速度快,可以使用DMA 方式传输。缺点是内置ADC的分辨率一般为10~12位。通常,内置ADC用于闭环控制,而外置ADC用于高精度数据采集。

STM32 内置的ADC 位数只有12 位,速度高达1M ,一般使用在要求速度快,精度不是很高的场合使用,比如用来采集电机驱动器中的电流,电压等等。

Mbed 的AnalogIn 控制类

Mbed OS 有两个模拟量类,分别是analogIn和analogOut 类。他们是针对处理器内部ADC和DAC的接口类。

Analogin 类

 构造函数:

        AnalogIn (PinName pin)

成员函数:

float  read ()

unsigned short   read_u16 ()

operator  float ()

选择的PIn 需要是具有ADC 输入功能的Pin。

Mbed OS源代码

#include <mbed.h>
AnalogIn Ain(p20);
float ADCdata;
int main() {
printf("ADC Data Values... \n\r");
while (1) {
ADCdata=Ain;
 printf("%f \n\r",ADCdata);
wait (0.5);
}
}

STM32F 内部的模拟量信号:

  • ADC_TEMP  读取芯片的温度。
  • ADC_VREF 读取ADC参考电压。
  • ADC_VBAT  读取后备电池输入电压。

Mbed OS 下读取三个模拟量的例子。

例1:读取STM32内部温度传感器

    STM32有一个内部的温度传感器,可以用来测量CPU及周围的温度(TA)。STM32的内部温度传感器支持的温度范围为:-40~125度。精度比较差,为±1.5℃左右。

STM32F内部温度的计算公式如下:

T(℃)={(V25-Vsense)/Avg_Slope}+25

V25=Vsense在25度时的数值(典型值为:1.43)。

Avg_Slope=温度与Vsense曲线的平均斜率(单位为mv/℃或uv/℃)(典型值为4.3mV/℃)。

 TEMP=(1.43-Vsense)/0.0043+25;

或者

TEMP=(1.42 - adc*3.3/4096)*1000/4.35 + 25;

令人高兴的是,Mbed 内部已经计算了温度;只需要放大100倍就可以了。

程序代码

#include "mbed.h"
AnalogIn   temp(ADC_TEMP);
main()
{
while (1)
{
 printf("chip temp=%4.4f\n", temp.read()*100);
 wait(1.0); // 1 sec
}
}

例2:读取 Vref和Vbat

 #include <mbed.h>
AnalogIn adc_vref(ADC_VREF);
AnalogIn adc_vbat(ADC_VBAT);  
DigitalOut led(PC_6);
int main()
{
    printf("\nSTM32 ADC internal channels reading example\n");
    while(1) {
        printf("ADC VRef = %f\n", adc_vref.read());         
        printf("ADC VBat = %f\n", adc_vbat.read())              
        led = !led;
        wait(1.0);
    }
}

modular-2 内置ADC 接口板

Mbed OS 源代码

外接ADC转换器

处理器芯片上的ADC 控制器一般都是精度为12bit,如果需要更高的精度,需要使用外接ADC 芯片。ADC 的国际大厂包括了ADI,TI和maxim。下面我们举两个例子。

TI  ADS1256

ADS1256 是TI 公司低噪声AD转换芯片。

主要特性

-24位分辨率,23位无噪声。

-数据输出速率 30KSPS

-支持4路差分或者8路单端模拟信号输入。

-信号范围:±2VREF, VREF=2.5V 时,信号范围为±5V。

-该芯片内置PGA可编程放大器,小信号输入信号范围可以通过PGA放大。

-5V兼容的SPI接口

-模拟电压5V

-数字电压1.8~3.6V

-SSOP-28 封装

ADS1256 内部结构

ADSL-1256 使用要点

模拟信号输入

 ADS1256 具有两种模拟信号输入方式

 - 8路单端输入,AINCOM 为公共端

 - 4路差分输入。任意一个AIN 可以选择成为AINP,同样,任意一个AIN可以成为AINN,内部使用模拟开关,通过软件选择。

可编程增益放大器

ADS1256内部有一个可编程增益放大器PGA。PGA的放大倍数可以为1,2,4,8,16,32,和64 倍。可以将输入的模拟信号预先放大最大64倍。

数字接口

MCU 通过下面的信号线和ADS1256相连。

SPI 从模式

-DIN 对应于SPI MOSI

DOUT 对应于SPI MISO

CLK  对应于 SPI CLK

CS   对应于 SPI-CS

DRDY    输出信号 ,当转换数据就绪时,DRDY为低电平。当24位数据被读走,MCU发出RDATA或者(RDATAC) 命令时,DRDY被复位成高电平。

RESET   输入信号,低电平时为ADS1256 复位。

SYNC/PDWN输入信号。

内部寄存器

内部寄存器和控制命令

ADS1256 具有11个内部寄存器(详见ADS1256 数据手册),通过SPI 命令访问。

SPI命令

通过发送SPI 命令访问ADS1256 内部寄存器和控制。SPI 命令由一个或者2个字节组成。

ADS1256 命令包括:

  1. RDATA 读数据
  2. RDATAC 连续读数据
  3. SDATAC 停止连续读数据
  4. RREG   读寄存器(两个字节)
  5. WREG   写寄存器(两个字节)

M2-ADS1256-20mA接口板

       M2-ADS1256=20mA是以ADS1256为核心的 modular-2 的I/O模块 。该模块支持4~20mA电流环模拟量输入。将8路标准20mA电流环的传感器信号转换成0~5V的电压信号,然后通过ADS1256芯片转换成数字数据,通过SPI接口传送给MCU。

另外,该模块还支持4路数字输出,一路RS485接口。

M2-ADS1256=20mA的内部结构和数字引脚:

ADS1256

ADS1256类的实现

在Mbed OS 下,我们为ADS1256设计了一个类 ADS1256.

首先我们在ADS1256类中实现了四个底层驱动函数:

-Read_reg  读内部寄存器。

-Write_reg  写内部寄存器。

-Command 发送命令。

-ReadData 读数据。

AD7689 芯片

AD7689是analog device 公司的ADC 芯片。

特性

16 位分辨率

8路多路复用器

内部可选择 2.5V 或者4.096V 参考电压

兼容SPI 接口

内置温度传感器

AD7689 的配置寄存器

AD7689 的配置非常简单,只有一个内部配置寄存器,14位长度。

配置寄存器的描述

 

M2-7689-10V 接口板

MbedOS AD7689 驱动

AD7689 类

(未完成)

 

 

 

猜你喜欢

转载自blog.csdn.net/yaojiawan/article/details/82924091