0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

关于ADC数值标定转换为物理量数值的方法

GReq_mcu168 来源:今日头条 作者:今日头条 2022-05-26 15:58 次阅读

处理器经过模数转换得到数值之后,需要经过进一步的转换得到表征真实物理量的数值。

得到了物理量数值,就可以进行显示,故障判断等操作。

我们需要找到从模数转换数值到物理量之间的转换关系;

比如,用14位的ADC对市电电压进行采样,得到了某个数据,该数据并不是电压值,而需要经过转换关系得到电压值。

如果传感器信号处理电路的线性度都比较好,可以在整个测量范围内采用线性关系进行转换,如下:

a033c832-dcbb-11ec-ba43-dac502259ad0.png

a0423bba-dcbb-11ec-ba43-dac502259ad0.jpg

ADC与物理量的线性关系

x为ADC读到的数值,y为物理量的数值,比如电压值、电流值、温度值、压力值等等。

有两个问题需要注意:

1) k,b的数值从何而来

2) 单片机如何转换

一、k, b数值的确认

我通常采用三种方法来确认k、b数值:

1)正向推导,根据传感器、信号处理电路的线性关系推导得到:

以下图的三相线电压测量电路为例:

a04f3450-dcbb-11ec-ba43-dac502259ad0.png

三相线电压测量电路

电压互感器的参数为:

初次级的变比:1mA:1mA

初级限流电流为:400kΩ;

次级线圈电阻为:17Ω;

次级采样电阻为:100Ω;

运放组成的处理电路的参数为:

放大倍数:47/(4.7+0.1//0.017)=9.969。

根据这些参数,假设相电压的真有效值为U,按照下面步骤推导:

  • 初级电流为a056d57a-dcbb-11ec-ba43-dac502259ad0.png

  • 次极输出电压=次极电流*100//4700=

a05e8f22-dcbb-11ec-ba43-dac502259ad0.png

  • 运放输出电压=次极输出电压*放大倍数

a06f2832-dcbb-11ec-ba43-dac502259ad0.png

  • 单片机读到的14位ADC的数值=

a080d708-dcbb-11ec-ba43-dac502259ad0.png

  • ADC与线电压的关系为:

a08d6734-dcbb-11ec-ba43-dac502259ad0.png

  • 进一步得到:

a09e5120-dcbb-11ec-ba43-dac502259ad0.png

  • 为了减少量化误差,提供精度,我们对换算得到的电压保留一位小数,当用整数来表示需,需要扩大10倍,得到:

a0b0fc1c-dcbb-11ec-ba43-dac502259ad0.png

从而得到了ADC与扩大10倍的线电压之间的线性转换关系,其k=3.302264,b=0;

2)分段线性化以及最小二乘法确认转换关系

在另一篇文章中详述。

二、 单片机如何转换

当我们得到ADC数值与物理量之间的线性转换关系:

a033c832-dcbb-11ec-ba43-dac502259ad0.png

我们需要在程序中将物理量计算出来。

低端的单片机都没有硬件浮点数计算能力,即使是32位的cortex-M0/cortex-M3内核的处理器(如STM32F0xx以及STM32F1xx系统处理器)也没有硬件浮点数计算能力。

当我们通过浮点数进行转换运算时,会消耗大量的时间。

我的做法是,将k转变为整以一个整数后再除以另一个整数,

而对物理量保留小数点,利用扩大整10倍的整数进行存储时,b可以直接四舍五入为整数;

即:

a0c4d7c8-dcbb-11ec-ba43-dac502259ad0.png

,其中,M、N、b都是整数。

在STM32F103的处理器上,我做了一些测算:

采用64MHz的时间频率,

计算65535次的浮点数转换的耗时为:164ms。

单次运算耗时为:2.5us。

转化为整数乘除运算,计算65535次耗时为:20ms。

单次运算耗时为:0.31us。

当转为整数运算时,可能会扩大舍入误差。

我的做法是,根据整数M、N的位数取大数,比如16位的数。

如果k小于1,则将N固定为65535。

M=round(k*65535)。

如果k大于等于1,则将M固定为65535。

N=round(65535/k)。

在上例中,k=3.302264,则M=65535,N=round(65535/3.302264)=19845。

const STRConfigCalDef g_pt_calvoldefs[PT_VOLTAGE_NUM] =
{
{65535, 19845, 0},
{65535, 19845, 0},
{65535, 19845, 0}
};
U16  pt_calval(U16 val, U16 pm, U16 pn, signed int pk,){
U32 uwDataA;
signed int uwDataB;
U16 resval;
uwDataA = (U32)val * pm;
if(pn == 0){
pn = 1;
}
uwDataA = (U32)val * pm;
uwDataA = (U32)uwDataA / pn;
uwDataB = (signed int)uwDataA;
uwDataB = uwDataB + pk;
if(uwDataB < 0){
uwDataB = 0;
}
  if(uwDataB > 65535){
uwDataB = 65535;
}
resval = (U16)uwDataB;
return(resval)
}

a0d21f46-dcbb-11ec-ba43-dac502259ad0.jpg

转为整数运算的转换算法

审核编辑 :李倩


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 传感器
    +关注

    关注

    2525

    文章

    48165

    浏览量

    740749
  • adc
    adc
    +关注

    关注

    95

    文章

    5655

    浏览量

    539688
  • 数值
    +关注

    关注

    0

    文章

    79

    浏览量

    14292

原文标题:ADC数值标定转换为物理量数值的方法及注意事项

文章出处:【微信号:mcu168,微信公众号:硬件攻城狮】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    STM8 ADC1读出了16192数值是哪里的问题?

    刚接触学习STM8 ADC 使用ADC1,AIN4通道 stm8s的VCC 为5V,ADC测量NTC电阻电压时读数15600左右,直接将AIN4接入VCC,读出来16192左右的数值
    发表于 04-17 07:59

    STM32通过DMA方式传输TIM3定时器计数值数值重复是为什么?

    AD值防止数据错乱,故DMA配置必须放在ADC之前。) 因此为了排除相同原因导致的数据重复,所以将DMA配置放在TIM3定时器初始化之前。 结果反馈,TIM3计数器数值重复 3.DMA通道及触发方式
    发表于 04-10 06:50

    单模光纤数值孔径一般是多少

    单模光纤是一种用于光通信和光传感的关键元件,具有优异的传输性能和高带宽。其中,数值孔径是单模光纤重要的参数之一。本文将详细介绍单模光纤的数值孔径,包括定义、计算方法、影响因素等内容,以及单模光纤
    的头像 发表于 04-09 17:13 365次阅读

    12位ADC模拟信号到数字信号的转换

    12 位 ADC 是一种逐次逼近型模拟数字转换器。其分辨率可以达到12位。这意味着它可以将模拟信号转换为12位的二进制数,其数值范围在0到4095之间。
    的头像 发表于 01-23 16:56 1212次阅读
    12位<b class='flag-5'>ADC</b>模拟信号到数字信号的<b class='flag-5'>转换</b>

    什么是光纤的数值孔径,其物理意义是什么

    光纤的数值孔径是指光纤传输中心芯的直径与光纤外层材料的折射指数之间的参数差异。它是光纤传输的一个重要指标,对于确定光纤传输性能、光信号传输质量等具有重要作用。 为了更好地理解光纤的数值孔径,我们需要
    的头像 发表于 01-22 10:55 1000次阅读

    用实验来证明,不同条件下的热阻数值千差万别

    用实验来证明,不同条件下的热阻数值千差万别
    的头像 发表于 12-15 09:20 214次阅读
    用实验来证明,不同条件下的热阻<b class='flag-5'>数值</b>千差万别

    怎么将vlookup的结果变成数值

    将VLOOKUP的结果转换为数值可以通过以下几种方式实现。 方法一:使用VALUE函数 VALUE函数可以将文本字符串转换为数值。VLOOK
    的头像 发表于 12-01 10:08 1.1w次阅读

    关于AD7980读取数值和范围的问题

    测量条件: VDD:2.5V, REF:3.0V, SDI=VIO:3.3V, 遇到的问题: 当接入IN+为恒定3.0V或者更高,读取的数值为57343,为什么不是2^16=65536呢? 当
    发表于 12-01 09:58

    为什么测量的动态电阻数值偏大了?

    为什么测量的动态电阻数值偏大了?
    的头像 发表于 11-30 17:15 277次阅读
    为什么测量的动态电阻<b class='flag-5'>数值</b>偏大了?

    为什么电容值的数值是有规律的

    为什么电容值的数值是有规律的
    的头像 发表于 11-30 16:08 232次阅读
    为什么电容值的<b class='flag-5'>数值</b>是有规律的

    adc采集的电压值数值如何真有效性转换

    adc采集的电压值数值如何真有效性转换adc采集温度基准电压纹波太大有什么影响? ADC采集的电压值
    的头像 发表于 10-17 18:17 939次阅读

    使用快速Fourier变换法将ADC样本转换为频域频谱的方法和结果

    应用:展示使用快速Fourier变换法将ADC样本转换为频域频谱的方法和结果。 BSP 版本: NUC121/125系列 BSP CMSIS V3.01.003 硬件
    发表于 08-22 08:13

    MATLAB中常用的数值计算和数值分析基础知识

    MATLAB是一个功能强大的数值计算和科学计算软件,它提供了许多用于数值计算和数值分析的基础功能。
    的头像 发表于 07-07 09:27 1362次阅读

    请问ADC采样的电压信号怎么转换成气压数值

    气压传感器经过放大的信号进入单片机约1.5V,在100PA范围内电压增加量大概1V,在0-100PA气压内电压波动范围1.5v-2.5v.怎么计算电压与气压数值的关系得到实时气压数值?我规律没找到求助各位了。
    发表于 06-25 08:18

    Verilog数值转换知识总结

    本节主要对有符号数的十进制与二进制表示以及一些数值变换进行简单的总结。
    的头像 发表于 06-01 11:32 675次阅读