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

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

3天内不再提示

深度讲解模拟量的硬件和程序的设计

GReq_mcu168 来源:今日头条 作者:电卤药丸 2021-04-28 17:28 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

单片机系统里对模拟量的处理要比数字量稍显复杂,但是只要掌握了使用技巧,使用起来也很简单,很多朋友一开始比较纠结于单片机的底层语言,非要先弄个明白才罢休,其实大可不必,重要的是我们要先学会怎么应用。

现以铅酸电池电压检测及充电电流检测为例讲解模拟量的硬件和程序的设计。

如图1为28节铅酸电池的电压检测电路,1--14节组成电池组1,15--28节组成电池组2;第1节正极为BAT+,14与15节之间为BATM,第28节负极为BAT-。输入端的8个二极管的作用是钳位作用;电路计算如图所示。

4e7efe86-a7ff-11eb-9728-12bb97331649.png

图1:电池组电压检测电路

如图2为铅酸电池的充电电流检测电路,TA1为工频电流互感器,输入的4个二极管为整流二极管,电流流过R37(510Ω)形成压差△V。电路计算如图所示。

4f3fc878-a7ff-11eb-9728-12bb97331649.png

图2:电池组充电电流检测电路

如图3为单片机STM32F103CBT6,图1和图2的模拟信号输入至单片机的PA5、PA6、PA7。

4f6098e6-a7ff-11eb-9728-12bb97331649.png

图3:STM32F103CBT6单片机

由于代码较多,为便于浏览,我就把其中一部分以截图的形式展示

如图4为单片机adc.c文件的底层配置,把PA5、PA6、PA7端口配置成模拟输入模式。

4f760262-a7ff-11eb-9728-12bb97331649.png

图4:配置端口模式

如图5对以上三个模拟量进行模数转换并缓存入数组ADC_ConvertedValue[3],得到的AD值的范围是0~4096。

4f86db78-a7ff-11eb-9728-12bb97331649.png

图5:模数转换并缓存

如图6把以上两个配置函数整合在一起,定义成模拟量的初始化函数void ADC1_Init(void)。

4fc06fc8-a7ff-11eb-9728-12bb97331649.png

图6:初始化

如图7在adc.h文件里声明函数void ADC1_Init(void),另外几个函数也在adc的c文件里定义的,后面附上源程序(非截图)。

4fd31f92-a7ff-11eb-9728-12bb97331649.png

图7:声明函数

如图8在main()主函数里调用ADC1_Init()初始化函数(要去掉void),初始化函数一定要放在while(1)的前面,表示在进入while(1)无限循环前只执行一次。Analog_Processing()为模拟量处理函数,要放在while(1)无限循环里面(该函数在下面讲)。

4ffcf466-a7ff-11eb-9728-12bb97331649.png

图8,函数调用

以下为模拟量在main.c文件里的定义。

s16 Charging_Current; //充电电流实际值

s16 Battery1_Voltage; //电池组1电压实际值

s16 Battery2_Voltage; //电池组2电压实际值

s16 Battery_Voltage; //电池组总电压值

下面三个函数的定义都在adc.c文件里面定义的。

以下代码为模拟量处理函数:①对数组ADC_ConvertedValue[3]缓存值进行滤波处理;②对滤波后的AD值转换为实际值。

/******************************

模拟量处理函数

******************************/

void Analog_Processing(void)

{

//对AD值进行滤波

ADC_Charging_Current=Filter(ADC_ConvertedValue[0],ADC_Charging_Current,1,10);

ADC_Battery1_Voltage=Filter(ADC_ConvertedValue[1],ADC_Battery1_Voltage,1,10);

ADC_Battery2_Voltage=Filter(ADC_ConvertedValue[2],ADC_Battery2_Voltage,1,10);

//AD值转换为实际值

Charging_Current = Adc_To_Act(ADC_Charging_Current, 10, 4096, 0, 220);//22.0A

Battery1_Voltage = Adc_To_Act(ADC_Battery1_Voltage, 10, 4096, 0, 267);//267V

Battery2_Voltage = Adc_To_Act(ADC_Battery2_Voltage, 10, 4096, 0, 267);//267V

//两组电压相加得到总电压

Battery_Voltage = Battery1_Voltage + Battery2_Voltage;

}

以下代码为滤波函数,滤波函数有很多,采用合适的才是最实用的(该函数滤波后的值是连续变化的,有些滤波函数滤波后的值是跳变的)。

/******************************

滤波函数(base/k越大,容性越大)

该函数相当于是一个电容,通常取值k=1,base=10

******************************/

u16 Filter(u16 NewData, u16 OldData, u8 k, u8 base)

{

u16 uiResult;

if (NewData 》 OldData)

{

uiResult = NewData - OldData;

uiResult *= k;

uiResult += base 》》 2;

uiResult /= base;

uiResult = OldData + uiResult;

}

else if (OldData 》 NewData)

{

uiResult = OldData - NewData;

uiResult *= k;

uiResult += base 》》 2;

uiResult /= base;

uiResult = OldData - uiResult;

}

else

{

uiResult = NewData;

}

return(uiResult);

}

使用方法如下:NewData表示最新采用的模拟量;OldData表示滤波后的模拟量。

ADC_Battery1_Voltage=Filter(ADC_ConvertedValue[1],ADC_Battery1_Voltage,1,10);

为便于逻辑计算、控制及显示,以下代码是把AD值转换为实际值,

/******************************

AD值转换实际值函数

******************************/

s16 Adc_To_Act(s16 Adc_Value, s16 Pre_Adc_Min, s16 Pre_Adc_Max, s16 Pre_Act_Min, s16 Pre_Act_Max)

{

s32 _temp;

s32 _range;

_temp = (s32)((Adc_Value - Pre_Adc_Min) * (Pre_Act_Max - Pre_Act_Min) / (Pre_Adc_Max-Pre_Adc_Min)) + Pre_Act_Min;

_temp = Adc_Value - Pre_Adc_Min;

_range = Pre_Act_Max - Pre_Act_Min;

_temp = _temp * _range;

_range = Pre_Adc_Max - Pre_Adc_Min;

_temp = _temp + _range / 2;

_temp = _temp / _range;

_temp = _temp + Pre_Act_Min;

return(_temp);

}

使用方法如下:Adc_Value表示要转换的模拟量;Pre_Adc_Min表示模拟量AD值的最小值;Pre_Adc_Max表示模拟量AD值的最大值;Pre_Act_Min表示转换后实际值的最小值;Pre_Act_Max表示转换后实际值的最大值;(以下最大实际值220表示22.0A,是因为数码管显示需要小数表示)。

Charging_Current = Adc_To_Act(ADC_Charging_Current, 10, 4096, 0, 220);//22.0A

要点:

①模拟量的采样电路,我多采用运放的差分放大电路,原因是被测电压可以和运放不用共地,且可有效抑制共模噪声,可达到较高的精确线性测量,比如以上电池组的被测电压的误差与实际相差在0.3V左右;

②电池组输入至运放的8个1M的电阻是两个为一组的,且功率至少1/4W以上,因为在高压下的电阻容易老化,为保险起见,通常一个电阻的最大压差在100V以下为宜;

③电池组分为两组检测,一是为了降低元件所承受的电压,二是为了监视两组电池电压之间是否平衡,达到保护电池目的。

③函数应功能模块化,且具备通用性质,便于移植和调用,对于很多朋友应先学会如何使用,底层代码只要会配置就完全足够了。

当然,以上提供的设计是我通常的做法,能满足大多数的常规应用。
编辑:lyn

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

    关注

    9

    文章

    285

    浏览量

    28051
  • 模拟量
    +关注

    关注

    5

    文章

    565

    浏览量

    27868
  • 硬件
    +关注

    关注

    13

    文章

    3638

    浏览量

    69180

原文标题:模拟量采集从硬件到程序,从滤波到实际值转换,多少人懂了

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    探秘TPS08U高精度模拟量采集模块:设计与应用全解析

    探秘TPS08U高精度模拟量采集模块:设计与应用全解析 在电子工程师的日常工作中,高精度模拟量采集模块是不可或缺的工具。今天,我们就来深入了解一下 TPS08U 高精度模拟量采集模块,看看它在实际
    的头像 发表于 04-28 15:45 74次阅读

    LORA模拟量互传模块:宽电压适配,多场景兼容通用

    LoRa模拟量互传模块,具备零布线、低成本、3–5km、免维护、灵活扩容、抗干扰等特性,把两根模拟信号线变成了一对无线“隔空传电信号”的设备,让你在不改动PLC程序、不布新线的前提下,把模拟量
    的头像 发表于 03-17 16:22 242次阅读

    如何在EtherCAT从站上增加模拟量输入AI变量

    要在EtherCAT从站增加模拟量输入AI变量,首先需更新从站设备程序,定义新的AI变量并初始化。
    的头像 发表于 03-11 16:30 249次阅读
    如何在EtherCAT从站上增加<b class='flag-5'>模拟量</b>输入AI变量

    西门子S7-1200和S7-1500 PLC系列模拟量传感器怎么接线

    西门子S7-1200和S7-1500PLC系列模拟量传感器怎么接线,现场看到的4线制,3线制,2线制模拟量传感器接线。
    的头像 发表于 03-06 13:57 936次阅读
    西门子S7-1200和S7-1500 PLC系列<b class='flag-5'>模拟量</b>传感器怎么接线

    模拟量光端机两线制怎么接线?广州邮科接线全攻略

    在工业自动化、远程监控和智能传感系统中,模拟量光端机扮演着信号远距离、高抗干扰传输的关键角色。尤其当现场使用的是两线制压力/温度变送器(输出4-20mA信号)时,如何正确接线成为工程实施中的核心问题
    的头像 发表于 02-09 09:36 288次阅读
    <b class='flag-5'>模拟量</b>光端机两线制怎么接线?广州邮科接线全攻略

    工业人必看:一主一从WIFI模拟量双向对传模块选型攻略

    WIFI 模拟量双向对传模块是物联网与工业自动化领域中,专用于模拟量信号无线双向传输的智能硬件,也是衔接前端传感器、后端执行器与控制平台的关键设备,能破解传统有线传输布线难、维护成本高的痛点。 一
    的头像 发表于 12-01 17:31 800次阅读

    广州邮科模拟量光端机,到底是啥神器?一篇文章给你讲明白!

    你是不是在工厂、电站或者监控项目里,经常听到“模拟量信号”这个词?比如压力、温度、流量这些连续变化的数据,要把它们传得远、传得稳,可真不是件简单事。老式的布线方式又麻烦又容易受干扰,头都大了对吧
    的头像 发表于 10-30 09:38 437次阅读
    广州邮科<b class='flag-5'>模拟量</b>光端机,到底是啥神器?一篇文章给你讲明白!

    抗干扰模拟量无线模块,与PLC、DCS数据自组网

    一、概述 模拟量转无线模块 是一种用于将模拟量信号(如温度、湿度、压力、电流、电压等)转换为无线信号进行传输的设备。 二、 模拟量转无线模块的特点 1. 远距离传输: 无线传输距离可达50KM左右
    的头像 发表于 10-29 10:12 463次阅读
    抗干扰<b class='flag-5'>模拟量</b>无线模块,与PLC、DCS数据自组网

    提升性价比之选:CAN接口模拟量采集模块的三大核心功能价值

    在工业物联网(IIoT)、智能控制与自动化系统中,存在大量 “连续变化” 的物理信号,比如温度的升降、压力的波动、电流的强弱,这些信号被称为 “模拟量”。而CAN 接口模拟量采集模块,正是一种专门
    的头像 发表于 10-11 15:30 531次阅读

    CAN接口模拟量采集模块能做什么?工业/汽车/能源等四大领域实例拆解

    CAN 接口模拟量采集模块凭借高精度采集、抗干扰传输、工业级稳定的核心优势,已从传统工业场景渗透到汽车、能源、农业、医疗等多个领域。其本质是通过模拟量信号捕获 - 数字量转换 - CAN 总线传输
    的头像 发表于 10-11 15:29 868次阅读

    集中式ZDM-E0800V模拟量采集模块(上) — 基础应用

    在工业自动化中,模拟量信号极为关键。致远电子的E系列高速IO模块ZDM-E0800V支持EtherCAT协议,可采集工业现场的电压模拟量信号。本文将详细介绍其功能与使用方法,展示其如何实现电压的精确
    的头像 发表于 10-09 11:32 687次阅读
    集中式ZDM-E0800V<b class='flag-5'>模拟量</b>采集模块(上) — 基础应用

    4G模拟量双向对传模块:同步远传,远程无线遥控开关

    4G模拟量双向对传模块是一种基于4G网络实现模拟量信号远程双向传输的工业物联网设备。主要用于解决工业现场中传感器、执行器等设备的数据采集和远程控制问题,尤其适用于距离远、布线困难的场景。 核心
    的头像 发表于 07-23 17:04 754次阅读

    4G模拟量传输终端实现车间环境实时监控

    。对此,物通博联提供基于4G模拟量传输终端的高性价比车间环境监测方案。 4G模拟量拥有丰富的接口,能够轻松连接各类模拟量传感器,如温湿度传感器、压力传感器、气体浓度传感器等,精准采集车间环境中的各种
    的头像 发表于 07-14 10:30 824次阅读
    4G<b class='flag-5'>模拟量</b>传输终端实现车间环境实时监控

    4G模拟量双向对传模块:不限距离传输,实时同步

    在工业现场控制、环境监测、能源管理等场景中,模拟量信号(如4-20mA电流、0-10V电压)仍是传感器与执行器的主流语言。然而传统传输方案面临两大桎梏:①距离限制:有线传输成本高,RS485最长仅
    的头像 发表于 06-25 15:43 923次阅读

    模拟量双向对传模块,局域网通讯,应用广泛

    局域网模拟量双向对传模块是一种用于在局域网(如以太网、Wi-Fi、CAN总线等)上实现模拟量信号(如电压、电流、温度、压力等)双向、实时、远距离传输的专用设备或模块。主要价值在于替代传统长距离
    的头像 发表于 06-20 16:04 843次阅读