模拟量是指变量在一定范围连续变化的量,物理世界的数据几乎大多数是模拟量,比如温度,电流,电压,风速,振动等等。模拟量需要通过采样,才可能转化成近似,离散的数字值。
传感器采样的数据大多数都是模拟量。未来的趋势是将大幅度增加各种智能数据采集设备和传感器,智能设备采集,处理,分析模拟量的能力非常重要。智能设备的作用是将物理世界的模拟数据经过本地处理后采集传输给数据分析系统,模拟数据的采集和网络连接非常重要的一环。
AI和大数据技术的基础是数据,而这些数据主要是模拟数据。比如在工业领域,需要检测机器的振动数据,可以预测出设备的健康状况。所以需要检测电机,轴承,变速箱的振动数据,温度等模拟数据。然后可以使用神经网络技术或者大数据统计分析,都得出判断结果。数据采集和测量技术越来越重要。也可以说,大数据实际上是模拟大数据(Big Analog Data)。
常见的物理模拟量包括:
大多数模数转换系统都包含模拟前端电路,这些处理称之为信号调理。包括了信号隔离,增益放大器,滤波,输出驱动。
送入ADC 的电信号需要是一个标准的电信号。只有这样才能使的ADC 转换板具有通用性。常见的ADC 输入信号有下列几种。
标准电流4~20mA
4~20mA 是传感器模拟信号的工业标准。传感器变送器可将模拟值从传感器输出转换为等效的 4 至 20mA 电流。
标准电压
传送给ADC 接口的信号是一个标准的电压范围。典型的是-10 to +10 volts DC。
三种方式的优缺点分析:
现代单片机普遍内置了ADC外围电路和多个模拟量输入,以STM32F429为例,它内部带有3个12位精度的ADC。它有如下特点:
内置ADC的优点是成本低,转换和传输速度快,可以使用DMA 方式传输。缺点是内置ADC的分辨率一般为10~12位。通常,内置ADC用于闭环控制,而外置ADC用于高精度数据采集。
STM32 内置的ADC 位数只有12 位,速度高达1M ,一般使用在要求速度快,精度不是很高的场合使用,比如用来采集电机驱动器中的电流,电压等等。
Mbed OS 有两个模拟量类,分别是analogIn和analogOut 类。他们是针对处理器内部ADC和DAC的接口类。
构造函数:
AnalogIn (PinName pin)
成员函数:
float read ()
unsigned short read_u16 ()
operator float ()
选择的PIn 需要是具有ADC 输入功能的Pin。
#include
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 内部的模拟量信号:
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
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);
}
}
处理器芯片上的ADC 控制器一般都是精度为12bit,如果需要更高的精度,需要使用外接ADC 芯片。ADC 的国际大厂包括了ADI,TI和maxim。下面我们举两个例子。
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 命令包括:
M2-ADS1256=20mA是以ADS1256为核心的 modular-2 的I/O模块 。该模块支持4~20mA电流环模拟量输入。将8路标准20mA电流环的传感器信号转换成0~5V的电压信号,然后通过ADS1256芯片转换成数字数据,通过SPI接口传送给MCU。
另外,该模块还支持4路数字输出,一路RS485接口。
M2-ADS1256=20mA的内部结构和数字引脚:
在Mbed OS 下,我们为ADS1256设计了一个类 ADS1256.
首先我们在ADS1256类中实现了四个底层驱动函数:
-Read_reg 读内部寄存器。
-Write_reg 写内部寄存器。
-Command 发送命令。
-ReadData 读数据。
AD7689是analog device 公司的ADC 芯片。
特性
16 位分辨率
8路多路复用器
内部可选择 2.5V 或者4.096V 参考电压
兼容SPI 接口
内置温度传感器
AD7689 的配置寄存器
AD7689 的配置非常简单,只有一个内部配置寄存器,14位长度。
配置寄存器的描述
AD7689 类
(未完成)