制作一个0-20mA的信号发生器,可以给很多仪器仪表做校准或测试

发布者:心连心意最新更新时间:2024-06-20 来源: elecfans关键字:信号发生器  校准  测试 手机看文章 扫描二维码
随时随地手机看文章

概述

一般仪器仪表的信号电流都为4-20mA,指最小电流为4mA,最大电流为20mA。传输信号时候,要考虑到导线上也有电阻,如果用电压传输则会在导线的产生一定的压降,那接收端的信号就会产生一定的误差,所以使用电流信号作为变送器的标准传输。为什么选择4-20mA而不是0-20mA呢?4ma而不是0ma是用来检测线路开路的,如果0是最小,那么开路故障就检测不到了。为了解决上述问题和避开相关噪声的影响,我们用电流来传输信号,因为电流对噪声并不敏感。4~20mA的电流环便是用4mA表示零信号,用20mA表示信号的满刻度,而低于4mA高于20mA的信号用于各种故障的报警。


很多控制器接受来自各种检测仪表的0~20mA或4~20mA电流,制作一个0-20mA的的信号发生器,可以给很多仪器仪表做校准或测试。

2. 总体方案设计

2.1. 设计目标

单片机控制4路PWM,输出的PWM信号控制输出电压在0-3.0V之间,经过电流电压转电流电路变成电流信号,输出电流在0-20mA之间。按键调节输出电流,oled实时显示4路电流值。

2.2. 设计思路

芯片选择STM32F030C8T6,带4路PWM输出,性价比高,同时支持rt-thread操作系统,这里我们选用2.1的版本。OLED选用中景园电子0-96寸OLED。

2.2.1.硬件电路原理

图1是一个电压转电流的典型电路。单片机输出PWM,控制Vi电压电平在0-3V之间,RL流过的电流为0-20ma。

图1 电压转电流电路

图2 OLED显示电路

由于MCU内部可配置上拉电阻,所以可以直接将按键接到MCU上。

图3 按键电路

2.2.2.软件设计流图

2.2.3.关键代码

按键部分代码。

/* key thread entry */

staticvoid key_thread_entry(void*parameter)

{

KEY_e i;

uint8_t key_state1[KEY_NUM];

uint8_t key_state2[KEY_NUM];

uint8_t key_counter[KEY_NUM];

rt_base_t level;

memset(key_counter, 0, sizeof(key_counter));

while(1)

{

for (i=KEY1; i{

key_state1[i] = rt_hw_key(i);

}

rt_thread_delay(RT_TICK_PER_SECOND / 20);

for (i=KEY1; i{

key_state2[i] = rt_hw_key(i);

}

for (i=KEY1; i{

if (key_state1[i] == key_state2[i] &&

key_state1[i] == 0)

{

level =rt_hw_interrupt_disable();

if (key_counter[i] == 0)

{

switch(i)

{

case KEY2:

if (pwm_channel< 3)

{

pwm_channel++;

}

break;

case KEY1:

if (pwm_channel> 0)

pwm_channel--;

break;

case KEY3:

if(pwm_value[pwm_channel] < 20000)

pwm_value[pwm_channel]++;

break;

case KEY4:

if(pwm_value[pwm_channel] > 0)

pwm_value[pwm_channel]--;

break;

case KEY5:

if(pwm_value[pwm_channel] < 16000)

pwm_value[pwm_channel] += 4000;

else

pwm_value[pwm_channel] = 20000;

break;

case KEY6:

if(pwm_value[pwm_channel] >= 4000)

pwm_value[pwm_channel] -= 4000;

else

pwm_value[pwm_channel] = 0;

break;

}

rt_kprintf('key %dclicked ', i);

}

if (key_counter[i] >= 5)

{

switch(i)

{

case KEY2:

if (pwm_channel< 3)

{

pwm_channel++;

}

break;

case KEY1:

if (pwm_channel> 0)

pwm_channel--;

break;

case KEY3:

if(pwm_value[pwm_channel] < 20000)

pwm_value[pwm_channel]++;

break;

case KEY4:

if(pwm_value[pwm_channel] > 0)

pwm_value[pwm_channel]--;

break;

case KEY5:

if(pwm_value[pwm_channel] < 16000)

pwm_value[pwm_channel]+= 4000;

else

pwm_value[pwm_channel] = 20000;

break;

case KEY6:

if(pwm_value[pwm_channel] >= 4000)

pwm_value[pwm_channel] -= 4000;

else

pwm_value[pwm_channel] = 0;

break;

}

rt_kprintf('key%d pressed ', i);

}

if (key_counter[i] < 5)

{

key_counter[i]++;

}

rt_hw_interrupt_enable(level);

}

else

{

key_counter[i] = 0;

}

}

rt_thread_delay(RT_TICK_PER_SECOND / 100);

}

}

oled显示部分代码。

/* oled thread entry */

staticvoid oled_thread_entry(void*parameter)

{

uint8_t i;

rt_base_tlevel;

char str_pwm[64];

OLED_Init();

OLED_Clear();

PWM_TIM1(999, 1); //48MHZ/(999+1)/(1+1) = 24KHZ

while(1)

{

//OLED_ShowString(0, 3,'1.3' OLED TEST');

if ((memcmp(pwm_value_temp, pwm_value, sizeof(pwm_value)) != 0) ||

(pwm_channel_temp != pwm_channel))

{

level = rt_hw_interrupt_disable();

memcpy((char *)pwm_value_temp, (char *)pwm_value, sizeof(pwm_value));

pwm_channel_temp = pwm_channel;

rt_hw_interrupt_enable(level);

for (i=0; i<4; i++)

{

if (pwm_channel == i)

{

snprintf(str_pwm, 64,'* %2d.%03d ma', pwm_value[i]/1000, pwm_value[i]%1000);

}

else

{

snprintf(str_pwm, 64,' %2d.%03d ma',pwm_value[i]/1000, pwm_value[i]%1000);

}

OLED_ShowString(0, i*2,(uint8_t *)str_pwm);

}

TIM_SetCompare1(TIM1, 0.915 *(pwm_value_temp[3] * 999) / 20000);

TIM_SetCompare2(TIM1, 0.915 *(pwm_value_temp[2] * 999) / 20000);

TIM_SetCompare3(TIM1, 0.915 *(pwm_value_temp[1] * 999) / 20000);

TIM_SetCompare4(TIM1, 0.915 *(pwm_value_temp[0] * 999) / 20000);

rt_thread_delay(RT_TICK_PER_SECOND / 10);

}

else

{

//OLED_ShowString(63,6,'CODE:');

rt_thread_delay(RT_TICK_PER_SECOND / 10);

}

}

}

2.2.4.RTT使用情况

按键的初始化函数可以不用再main函数中添加,而是在key.c中调用下面的函数就可以了INITDEVICEEXPORT(rthwkey_init),代码看起来干净整洁。通过scons来裁剪配置系统,不需要人为删减代码,非常好用。Finsh组件,方便调试,方便自定义添加串口命令。代码类linux编程风格。提供POSIX 标准接口,上层代码移植方便。


关键字:信号发生器  校准  测试 引用地址:制作一个0-20mA的信号发生器,可以给很多仪器仪表做校准或测试

上一篇:RCC时钟控制系统组成及时钟原程序分析
下一篇:一文知道串口通信的帧同步问题

推荐阅读最新更新时间:2026-03-25 12:02

​是德科技宣布为 Autotalks 安全连接车辆芯片组的射频校准和验证提供测试支持
• 基于软件的解决方案,助力尖端蜂窝车联网芯片组自动完成复杂的校准和验证测试 • 为汽车网络接入设备模块制造商和远程信息处理控制单元制造商提供现成、省时的解决方案 是德科技(Keysight Technologies, Inc.)日前宣布, 其 PathWave Test Executive for Manufacturing Developer 版本开始支持 Autotalks 蜂窝车联网(LTE V2X)芯片组和专用短程通信(DSRC)芯片组的自动射频校准和验证测试 。这些芯片组通常用于远程信息处理控制单元(TCU)。TCU 是控制互联车辆之间的无线跟踪、诊断和通信的嵌入式车载系统。 是德科技宣布为 Auto
[物联网]
​是德科技宣布为 Autotalks 安全连接车辆芯片组的射频<font color='red'>校准</font>和验证提供<font color='red'>测试</font>支持
电磁兼容抗扰度测试仪器的校准---脉冲群EFT篇
电子电器产品在进入市场之前一般都需要经过电磁兼容测试,主要是为了避免电子产品在使用的过程中会受到来自外界电磁干扰。 随着电磁兼容抗扰度测试仪器的普及,电磁兼容测试仪器的校准计量也就显得越来越重要了! 电快速瞬变脉冲群抗扰度测试是符合GB/T 17626.4与IEC61000-4-4标准的一项测试,主要是模拟电感性负载(如继电器、接触器等)在断开时,由于开关触点间隙的绝缘击穿或触点弹跳等原因,会在断开点处产生暂态骚扰。 这种暂态骚扰以脉冲群的形式出现,如果电感性负载多次重复开关则脉冲群就以相应的时间间隔多次重复出现,这种暂态的骚扰能量较小但频谱很宽,所以仍会对电子、电气设备的可靠工作产生严重的影响。 HMC50/
[测试测量]
电磁兼容抗扰度<font color='red'>测试</font>仪器的<font color='red'>校准</font>---脉冲群EFT篇
电磁兼容抗扰度测试仪器的校准---静电ESD篇
电子电器产品在进入市场之前一般都需要经过电磁兼容测试,主要是为了避免电子产品在使用的过程中会受到电磁干扰。 随着电磁兼容抗扰度测试仪器的普及,电磁兼容测试仪器的校准计量也就显得越来越重要了! 静电抗扰度测试对于大型设备可能并不是很重要,但在今天这个互联网科技井喷,伴随5G商用的时代,各种产品普遍越来越小型化,ESD测试已然成为大部分设备的“关键”电磁兼容测试之一,例如在便携式计算器、MP3和MD播放器、USB存储棒、音频设备等。 在静电放电发生器的计量校准中,静电的放电电压我们一般是用高压探头和示波器连接来检测静电的电压,这关系到静电枪的高压是否在标准误差的范围。 而在静电放电发生器的计量校准中,还有一个至关重要的
[测试测量]
电磁兼容抗扰度<font color='red'>测试</font>仪器的<font color='red'>校准</font>---静电ESD篇
电磁兼容抗扰度测试仪器的校准---电压跌落DIPS篇
电子电器产品在进入市场之前一般都需要经过电磁兼容测试,主要是为了避免电子产品在使用的过程中会受到来自外界电磁干扰。 随着电磁兼容抗扰度测试仪器的普及,电磁兼容测试仪器的校准计量也就显得越来越重要了! 电源暂降与跌落抗扰度测试符合标准:GB/T17626.11,IEC61000-4-11,该项测试项目主要是由电网、变电设施的故障或负荷突然出现大的变化所引起的。电压变化是由连接到电网的负荷的连续变化引起的。如果EUT对电源电压的变化不能及时作出反应,就有可能引发故障。 深圳市华瑞高电子技术有限公司的峰值冲击电流校准件适用于额定输入电流每相不超过16A、连接到50Hz/60Hz交流电网的计量。 在该项测试的计量中,我们
[测试测量]
电磁兼容抗扰度<font color='red'>测试</font>仪器的<font color='red'>校准</font>---电压跌落DIPS篇
安规综合测试仪的校准方法及注意事项
安规综合测试仪(以下简称安规测试仪)是用来测试产品安全性能的主要仪器,一般有:耐压测试,漏电流测试,接地电阻测试,绝缘电阻测试,等等。为了保证安规仪测试的准确性,相应地要对高压输出、漏电流测量、接地电阻测量和绝缘电阻测量等进行校准。 高压输出准确度的校准 1.校准方法 安规综合测试仪输出的高压有交流电压和直流电压之分,电压高达5000V以上。交流电压一般为工频50Hz或60Hz,校准包括交流电压输出准确度和电压波形失真。直流电压校准包括直流电压输出准确度和电压纹波大小。 安规综合测试仪输出的高压通过1000:1标准高压分压器接入数字多用表的电压输入端或失真仪输入端。如果是交流电压,利用数字多用表的交流电压测试功能,测得的值
[测试测量]
绝缘测试校准的理想工具:兆欧表校验仪 RH9A
RH9A兆欧表校验仪、绝缘测试仪校准测试仪 RH9A兆欧表校验仪、绝缘测试仪校准测试仪 产品介绍 ◆ 设计运用Cropico高质量SP1旋钮开关结合特别挑选的电阻器 ◆ 这款十进制的高阻值电阻器可理想地用于绝缘测试仪的校准和计量检测 ◆ 额定电压最高达5kV ◆ 携带盒坚固耐用 ◆ 可选3位,6位或9位十进制电阻箱,或RH9A-5固定阻值高阻箱。 ◆ 这款RH9A系列覆盖量程从1KΩ到1TΩ ◆ 可以在工厂、实验室、车间或现场应用 ◆ 仪器提供包括1米长度的高压测试导线和校验证书 RH9A兆欧表校验仪、绝缘测试仪校准测试仪 产品特点 ◆ 高精密十进制电阻箱 ◆ 可选3位、6位和9位 ◆ 最大电压5KV ◆ 精度达到0.1%
[测试测量]
绝缘<font color='red'>测试</font>仪<font color='red'>校准</font>的理想工具:兆欧表校验仪 RH9A
VNA使用方法:矢量网络分析仪校准测试方法
是不是每次测量一个新的项目前都必须做校准? 这个是不一定需要的,尽量将每次校准的state存入VNA,名字最好为校准状态,例如频率范围,输入激励功率等。如果有新的测试项目,但是它的测试条件和已有状态相似,且load state后,检查校准状态良好,就可用使用以前的校准状态,而不需要重新校准。 将校准state保存并调用的好处在于:CalibraTIon Kit也是有使用寿命的,多次的校准,会是的校准件多次和校准电缆接触,可能污染校准件,使得校准件特性发生改变,影响下一次校准。 尽量养成如下习惯:将网络分析仪的port不用的时候加上防尘套;对测试电缆进行标号,使得VNA每个port尽可能固定连接某个电缆;对测试电缆不用时
[测试测量]
VNA使用方法:矢量网络分析仪校准测试方法
  是不是每次测量一个新的项目前都必须做校准?   这个是不一定需要的,尽量将每次校准的state存入VNA,名字最好为校准状态,例如频率范围,输入激励功率等。如果有新的测试项目,但是它的测试条件和已有状态相似,且load state后,检查校准状态良好,就可用使用以前的校准状态,而不需要重新校准。   将校准state保存并调用的好处在于:CalibraTIon Kit也是有使用寿命的,多次的校准,会是的校准件多次和校准电缆接触,可能污染校准件,使得校准件特性发生改变,影响下一次校准。   尽量养成如下习惯:将网络分析仪的port不用的时候加上防尘套;对测试电缆进行标号,使得VNA每个port尽可能固定连接某个电缆;
[测试测量]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved