首先确定一个概念就是:精度≠分辨率

高精度必须要高分辨率,但是高分辨率不表示高精度


分辨率:将整个量程分成多少等份,能测量的最小刻度
精 度: 测量值和实际值的偏差,测量的准确度
分辨率8位、12位、13位、16位对应的就是2进制的位数,对应各自的精度就是1/256、1/4096、1/8192、1/65536。
用模拟量对应的实际物理量做除法运算,看对应误差的范围对否能够接受。
比如阀门开度0-100,那么误差率分别为:
8位分辨率:100/2^8(256)=0.4个开度,
12位分辨率:100/2^12(4096)=0.025个开度。
13位分辨率:100/2^13(8196)=0.012个开度
16位分辨率:100/2^16(65536)=0.0015个开度
拿8位分辨率为例,只有阀门大于等于0.4个开度的变化才能被PLC或上位机采集到,0.4个开度以下的变化都不会被采集到。16位的分辨率则比较灵敏,0.0015个开度则会被采集到。所以高分辨率

高分辨率≠高精度

拿ADC芯片来说,一个12位的ADC,它的分辨率就是1/4096,这是固定不变的。而它的精度是由所选用的基准电压的精度,以及AD本身的非线性误差等来决定的。如果选用的基准电压精度为1%,那么AD采样的精度最多只能达到1%,实际上还有其他误差影响,肯定达不到1%。即使用分辨率更高的AD芯片,精度也不会提高。

举个具体的例子,用AD采样1.000V和1.001V两个电压,采样结果是0.800V和0.801V。可以看到,AD能够分辨出0.001V的电压变化,也就是说分辨率可以达到0.001V。但测量精度却只有0.2V。所以说高分辨率并不等于高精度。高分辨率比较容易实现,一个16位的AD,分辨率就可以达到1/65536,而精度要达到万分之一是非常困难的。

高分辨率是高精度的保证

分辨率和精度是两个概念,但也不是完全没有关系。还是拿AD采样来说,如果我要达到0.1%的精度,那AD的分辨率必须要优于0.1%才行。

继续拿电压测量来举例。假设AD的测量范围为0~1V,精度要达到满量程的±0.1%,即±1mV,那么测量一个2mV的电压时,测量结果应该在1~3mV之间。如果这时选用的是一个8位的AD,那么它的分辨率只有1V/256,大约是4mV,测量2mV的电压,要么测的结果是0,要么测的结果是4mV。显然这是达不到要求的精度的。必须选用更高分辨率的AD才行。所以说高分辨率是高精度的保证。

模拟量的转换公式如下:

AD转换(模拟量转数字量-模拟量输入)

1.先计算实际模拟量输入数字占输入范围的比值; 例如:输入值为5693,输入范围为-27648 ~ 27648
1.再使用该比值乘以实际设备的数值范围;例如:实际温度单位为 0 ~ 400℃
1.再加上实际设备范围的最小值。

FUNCTION FC_AD : REAL // 模数转换
VAR_INPUT
    I_RealADValue : LREAL;// 模拟量输入值

    I_HardWareNMin  : LREAL:=0;// 模拟量模块最小输入电压对应的数字量
    I_HardWareNMax  : LREAL:=20050;// 模拟量模块最大输入电压对应的数字量

    I_RealMin : LREAL;// 实际设备的最小值,例如温控器最小设置0度
    I_RealMax : LREAL;// 实际设备的最大值,例如温控器最大设置400度

END_VAR
VAR

END_VAR
FC_AD := (I_RealADValue - I_HardWareNMin) / ( I_HardWareNMax - I_HardWareNMin ) * (I_RealMax - I_RealMin ) + I_RealMin;

DA转换(数字量转模拟量-模拟量输出)

1、先计算实际需要设置的数值占可设置数值范围的比值; 例如:需要设置100℃,实际可设置范围为0~400℃
2、再使用该比值乘以模拟量对应的数字量范围; 例如:模拟量设置范围为-27648 ~ 27648
3、再加上模拟量对应的最小数字量的值。因为模拟量对应的数字量有可能为负数

FUNCTION FC_DA : INT // 数模转换
VAR_INPUT
    I_RealValue : LREAL;// 输入实际设备输出的设定值,例如温控器设置温度100度

    I_HardWareNMin  : LREAL:=0;// 模拟量模块最小输出电压对应的数字量
    I_HardWareNMax  : LREAL:=20050;// 模拟量模块最大输出电压对应的数字量

    I_RealOutMin : LREAL;// 实际设备输出的最小值,例如温控器最小设置0度
    I_RealOutMax : LREAL;// 实际设备的输出最大值,例如温控器最大设置400度
END_VAR
VAR
END_VAR
FC_DA := LREAL_TO_INT((I_RealValue- I_RealOutMin) / (I_RealOutMax - I_RealOutMin) * ( I_HardWareNMax - I_HardWareNMin) + I_HardWareNMin);