基于STM32F103的4-20mA采集电路,带RS485输出及隔离功能,附原理图、PCB源文...
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主控电路的需求,也可以找我定制设计。
更多推荐

所有评论(0)