4-20mA采集电路,主控为STM32F103,RS485输出。 提供原理图和pcb源文件(AD设计),以及源码,包含ADC采样代码,RS485代码等,带隔离功能。 备注:精通各种运放的使用,支持其他采样电路和STM32主控电路的定制设计。

最近在搞一个4-20mA采集电路的项目,主控用的是STM32F103,输出走的是RS485。这个项目挺有意思的,尤其是涉及到模拟信号的采集和数字信号的传输,中间还加了个隔离功能,防止干扰。今天就来聊聊这个项目的设计思路和实现细节。

首先,4-20mA信号的采集是个关键点。这个信号范围在工业控制中很常见,因为它抗干扰能力强,传输距离远。我们用一个精密的采样电阻把电流信号转换成电压信号,然后通过运放进行放大和调理。这里我用的是OP07,一个经典的低噪声运放,特别适合这种小信号放大的场景。

// ADC采样代码
void ADC_Configuration(void) {
    ADC_InitTypeDef ADC_InitStructure;
    ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
    ADC_InitStructure.ADC_ScanConvMode = ENABLE;
    ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
    ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
    ADC_InitStructure.ADC_NbrOfChannel = 1;
    ADC_Init(&ADC_InitStructure);
    ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5);
    ADC_Cmd(ADC1, ENABLE);
    ADC_ResetCalibration(ADC1);
    while(ADC_GetResetCalibrationStatus(ADC1));
    ADC_StartCalibration(ADC1);
    while(ADC_GetCalibrationStatus(ADC1));
    ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}

上面这段代码是STM32的ADC初始化配置,采样的是通道0的信号。ADC的采样时间设置为55.5个周期,这样可以在保证精度的同时,提高采样速度。

4-20mA采集电路,主控为STM32F103,RS485输出。 提供原理图和pcb源文件(AD设计),以及源码,包含ADC采样代码,RS485代码等,带隔离功能。 备注:精通各种运放的使用,支持其他采样电路和STM32主控电路的定制设计。

接下来是RS485的输出部分。RS485是一种常见的工业通信协议,支持多点通信,传输距离远。我们用的是MAX485芯片,它可以把STM32的TTL电平转换成RS485电平。为了防止通信过程中的干扰,我们还加了光耦隔离。

// RS485发送代码
void RS485_Send(uint8_t *data, uint16_t len) {
    RS485_DE_HIGH();  // 使能发送
    USART_SendData(USART1, data, len);
    while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
    RS485_DE_LOW();  // 使能接收
}

这段代码是RS485的发送函数,先使能发送,然后通过USART发送数据,发送完成后使能接收。这样可以避免总线冲突。

最后,为了增强系统的抗干扰能力,我们在电源和信号线上都加了隔离。电源隔离用的是DC-DC隔离模块,信号隔离用的是光耦。这样即使外部有强干扰,也不会影响到主控电路。

// 光耦隔离代码
void Opto_Isolation(void) {
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    GPIO_SetBits(GPIOA, GPIO_Pin_0);  // 光耦输出高电平
}

这段代码是光耦隔离的控制代码,通过控制GPIO口的高低电平来控制光耦的开关。

总的来说,这个4-20mA采集电路的设计思路就是:信号采集 -> 信号调理 -> 数字处理 -> 通信输出。中间加了隔离,提高了系统的可靠性。如果你对这个项目感兴趣,可以下载我提供的原理图、PCB源文件和源码,自己动手试试。如果有其他采样电路或STM32主控电路的需求,也可以找我定制设计。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐