4-20mA电流信号采样调试方案详解
创作时间:
作者:
@小白创作中心
4-20mA电流信号采样调试方案详解
引用
CSDN
1.
https://m.blog.csdn.net/m0_60415072/article/details/144930512
本文介绍了一种4-20mA电流信号采样调试方案,通过硬件电路设计和软件配置,实现高精度的电流信号采集。文章详细描述了电路原理、软件配置参数以及调试过程,并提供了完整的代码实现。
一、前言
在工业自动化领域,4-20mA电流信号是一种常见的传感器输出信号。本文介绍了一种基于STM32G474VET6主控的电流信号采集方案,通过硬件电路设计和软件配置,实现高精度的电流信号采集。
二、硬件电路
电路图如下:
其中I2_IN接传感器的电流输出+,地接传感器的电流输出-。例如I2_IN为10mA,经过10R采样电阻将I2_IN电压抬至100mV,经过差分放大电路后抬至1V(此电路增益为49.9k/4.99k=10)。后面一级放大电路为50Hz工频滤波,使用在线计算器计算得到各滤波电容值。
因此,通过此电路可以将4-20mA的电流转换至0-2V范围内,然后通过ADC采样进行读取。
三、软件配置
主控为STM32G474VET6,使用ADC1+DMA采样,配置如下:
因为项目需要,配置了4个通道,其中3个为4-20mA电流通道,1个为内部基准电压通道,实际调试部分只展示了第一个通道的效果。采样周期都拉至了最高的640.5个周期。
四、调试部分
尝试了改变采样周期、采样间隔时间、采样触发方式都未果后,尝试使用滤波。使用VOFA上位机查看滤波前的波形。粉色是电流值,高频噪声很大。内部电压基准值基本稳定。
使用了卡尔曼滤波+平滑均值滤波,之所以选择平滑均值滤波是为了在处理第一次的滤波时尽可能减少对下一次采样的影响,确保采样周期的稳定。滤波效果如下:
使用的是4-20mA信号发生器,设置为9.6mA输出:
万用表实测电流为9.61mA:
因此误差基本在0.01-0.02mA左右,能满足使用需求。
五、相关代码
Kalman.c
#include "Kalman.h"
Kalman kfp,kfp1;
void Kalman_Init()
{
kfp.Last_P = 1;
kfp.Now_P = 0;
kfp.out = 0;
kfp.Kg = 0;
kfp.Q = 0.0015;//小往大
kfp.R = 0.003;//大往小
kfp1.Last_P = 1;
kfp1.Now_P = 0;
kfp1.out = 0;
kfp1.Kg = 0;
kfp1.Q = 0.0015;//小往大
kfp1.R = 0.003;//大往小
}
/**
*卡尔曼滤波器
*@param Kalman *kfp 卡尔曼结构体参数
* float input 需要滤波的参数的测量值(即传感器的采集值)
*@return 滤波后的参数(最优值)
*/
float KalmanFilter_new(Kalman *kfp,float input)
{
//预测协方差方程:k时刻系统估算协方差 = k-1时刻的系统协方差 + 过程噪声协方差
kfp->Now_P = kfp->Last_P + kfp->Q;
//卡尔曼增益方程:卡尔曼增益 = k时刻系统估算协方差 / (k时刻系统估算协方差 + 观测噪声协方差)
kfp->Kg = kfp->Now_P / (kfp->Now_P + kfp->R);
//更新最优值方程:k时刻状态变量的最优值 = 状态变量的预测值 + 卡尔曼增益 * (测量值 - 状态变量的预测值)
kfp->out = kfp->out + kfp->Kg * (input -kfp->out);//因为这一次的预测值就是上一次的输出值
//更新协方差方程: 本次的系统协方差付给 kfp->LastP 威下一次运算准备。
kfp->Last_P = (1-kfp->Kg) * kfp->Now_P;
return kfp->out;
}
float KalmanFilter_new1(Kalman *kfp1,float input)
{
//预测协方差方程:k时刻系统估算协方差 = k-1时刻的系统协方差 + 过程噪声协方差
kfp1->Now_P = kfp1->Last_P + kfp1->Q;
//卡尔曼增益方程:卡尔曼增益 = k时刻系统估算协方差 / (k时刻系统估算协方差 + 观测噪声协方差)
kfp1->Kg = kfp1->Now_P / (kfp1->Now_P + kfp1->R);
//更新最优值方程:k时刻状态变量的最优值 = 状态变量的预测值 + 卡尔曼增益 * (测量值 - 状态变量的预测值)
kfp1->out = kfp1->out + kfp1->Kg * (input -kfp1->out);//因为这一次的预测值就是上一次的输出值
//更新协方差方程: 本次的系统协方差付给 kfp->LastP 威下一次运算准备。
kfp1->Last_P = (1-kfp1->Kg) * kfp1->Now_P;
return kfp1->out;
}
Kalman.h
#ifndef Kalman_H
#define Kalman_H
#include "main.h"
typedef struct
{
float Last_P;//上次估算协方差 不可以为0 ! ! ! ! !
float Now_P;//当前估算协方差
float out;//卡尔曼滤波器输出
float Kg;//卡尔曼增益
float Q;//过程噪声协方差
float R;//观测噪声协方差
}Kalman;
void Kalman_Init(void);
float KalmanFilter_new(Kalman *kfp,float input);
float KalmanFilter_new1(Kalman *kfp1,float input);
extern Kalman kfp,kfp1;
#endif
平滑均值滤波+ADC处理:
//平滑均值滤波
#define N 100
int value_buf[N];
int sum=0;
int curNum=0;
int moveAverageFilter()
{
if(curNum < N)
{
value_buf[curNum] = adc_result[0];
sum += value_buf[curNum];
curNum++;
return sum/curNum;
}
else
{
sum -= sum/N;
sum += adc_result[0];
return sum/N;
}
}
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc)
{
adc_result[0] = KalmanFilter_new(&kfp,adc_result[0]);
adc_result_temp1 = (float)(moveAverageFilter()*3.3/4095);
Vref = (float)(adc_result[3]*3.3/4095);
I_1_ADC = (adc_result_temp1*1000)/100.0;//mA
HAL_ADC_Start_DMA(&hadc1,(uint32_t*)adc_result,4);
}
相关初始化:
Kalman_Init();
HAL_ADCEx_Calibration_Start(&hadc1,ADC_SINGLE_ENDED);
HAL_ADC_Start_DMA(&hadc1,(uint32_t*)adc_result,4);
热门推荐
研究证实:参苓白术散具有增强免疫力、抑制肿瘤功效
家庭医生在线教你应对粉瘤感染
江苏数字经济规模破5万亿,三大技术岗位年薪超30万
头伏萝卜二伏白菜,7种耐热蔬菜入伏后正适合种植
毕业论文任务书完全攻略:六大要素与实例详解
官方发布:毕业设计任务书撰写规范及模板
肥胖导致疾病
中国最大王宫基址现邯郸,赵王城遗址展现战国风采
鸡窝头讲解员带火邯郸丛台公园,千年古园免费开放
邯郸广府镇:2600年古城焕发新生,成乡村旅游新宠
手机拍聚餐:5个实用技巧让美食照片更有温度
武汉气候最大的长处与最大的短处就是:春夏秋冬四季分明
B12补充剂能改善脑供血不足吗?
瘦西湖:扬州必打卡的绝美景点
冬游扬州,探寻千年古城墙的秘密
扬州双璧:富春茶社与冶春茶社的美食传奇
扬州个园:四季假山里的园林艺术
《康熙王朝》主题曲里的蒙古长调秘密
广元核桃饼:千年传承的地方美味
铭智达教你自动化设备故障排查
视觉点胶自动化设备调试秘籍,效率翻倍!
Modbus调试工具:工业自动化工程师的必备利器
佩戴饰品有讲究:7种常见饰品暗藏风险,选购指南来了
饭局买单有讲究:从商务宴请到情侣约会的支付规则
南北VS美国:饭局文化背后的集体与个人
春节聚餐防胖指南:科学进餐顺序+健康食材全攻略
个性化ID安全设置指南:打造既时尚又安全的数字身份
如何打造一个独特的ID:个性化命名全攻略
炉石传说 & GTA5:个性化ID设置指南
陈皮粉缓解胃胀有科学依据,但这些人不宜食用