STM32F103控制4-20mA电流输出+DC转DC电路

 一、材料准备

        1、STM32F103C8T6最小系统板+电脑(Keil5软件)

        2、MCP4725模块开发板(12位DAC、I2C通讯协议)

        3、自己焊接的电压转电流电路及5V转发电路

二、电路仿真测试

        1、电路仿真就不放换算公式,直接上电路图。

R8为负载阻值。R8=51Ω;

R8为负载阻值。R8=500Ω;

可以明确看出在1V的输入电压的情况下,负载阻值增加近9倍,电流变化不足0.01mA。

5VDC-DC电路十分常见,电路图如下。

三、MCP4725和STM32通讯连接

        1、本次使用软I2C编写代码,所以先制作了I2C的采集和响应代码

#include "stm32f10x.h"                  // Device header
#include "delay.h"
#include "stdio.h"
#include "I2C_TypeDefStructure.h"


void I2CW_SCL(MyI2C_TypeDef *GPIO_I2C,uint8_t X)
{
	GPIO_WriteBit(GPIO_I2C->GPIOX,GPIO_I2C->GPIO_Pin_SCL,(BitAction)X);
	Delay_us(10);
}
void I2CW_SDA(MyI2C_TypeDef *GPIO_I2C,uint8_t X)
{
	GPIO_WriteBit(GPIO_I2C->GPIOX,GPIO_I2C->GPIO_Pin_SDA,(BitAction)X);
	Delay_us(10);
}
uint8_t I2CR_SDA(MyI2C_TypeDef *GPIO_I2C)
{
	uint8_t X;
	X = GPIO_ReadInputDataBit(GPIO_I2C->GPIOX,GPIO_I2C->GPIO_Pin_SDA);
	Delay_us(10);
	return X;
}

void MyI2C_Init(MyI2C_TypeDef *GPIO_I2C)
{
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_OD;
	GPIO_InitStructure.GPIO_Pin=GPIO_I2C->GPIO_Pin_SDA|GPIO_I2C->GPIO_Pin_SCL;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIO_I2C->GPIOX,&GPIO_InitStructure);
	 
	GPIO_SetBits(GPIO_I2C->GPIOX,GPIO_I2C->GPIO_Pin_SCL|GPIO_I2C->GPIO_Pin_SDA);
} 


void MyI2C_Start(MyI2C_TypeDef *GPIO_I2C)
{
	I2CW_SDA(GPIO_I2C,1);
	I2CW_SCL(GPIO_I2C,1);
	I2CW_SDA(GPIO_I2C,0);
	I2CW_SCL(GPIO_I2C,0);
}

void MyI2C_Stop(MyI2C_TypeDef *GPIO_I2C)
{
	I2CW_SDA(GPIO_I2C,0);
	I2CW_SCL(GPIO_I2C,1);
	I2CW_SDA(GPIO_I2C,1);
	
}
void MyI2C_SendByte(MyI2C_TypeDef *GPIO_I2C,uint8_t Byte)
{
	for(uint8_t i=0;i < 8;i++)
	{
	I2CW_SDA(GPIO_I2C,Byte & (0x80>>i));
	I2CW_SCL(GPIO_I2C,1);
	I2CW_SCL(GPIO_I2C,0);
	}
}

uint8_t MyI2C_ReceiveByte(MyI2C_TypeDef *GPIO_I2C)
{
	uint8_t Byte=0x00;
	I2CW_SDA(GPIO_I2C,1);
	for(uint8_t i=0;i<8;i++)
	{
		I2CW_SCL(GPIO_I2C,1);
		if(I2CR_SDA(GPIO_I2C)==1)
		{
			Byte|=(0x80>>i);
		}
		I2CW_SCL(GPIO_I2C,0);
	}
	return Byte;
}

void MyI2C_SendACK(MyI2C_TypeDef *GPIO_I2C,uint8_t ACK) // 在每一次字节发送数据要有应答,应答的目标是告诉从机下一个时序的开始
{
	I2CW_SDA(GPIO_I2C,ACK);
	I2CW_SCL(GPIO_I2C,1);
	I2CW_SCL(GPIO_I2C,0);
}

uint8_t MyI2C_ReceiveACK(MyI2C_TypeDef *GPIO_I2C)
{
	uint8_t ACK=0x00;
	I2CW_SDA(GPIO_I2C,1);
	I2CW_SCL(GPIO_I2C,1);
	ACK=I2CR_SDA(GPIO_I2C);
	I2CW_SCL(GPIO_I2C,0);
	return ACK;
}

        2、MCP4725的驱动时序电路

#include "stm32f10x.h"                  // Device header
#include "MyI2C.h"
#include "I2C_TypeDefStructure.h"



void MCP4725_Init(MyI2C_TypeDef *GPIO_I2C)
{
	MyI2C_Init(GPIO_I2C);
}

void MCP4725_SendDAC(MyI2C_TypeDef *GPIO_I2C,float DAC_Aout,float DAC_ALL)
{
	uint16_t DAC_Byte=(DAC_Aout/DAC_ALL)*4095;
	uint8_t Data_H=((0x0F00&DAC_Byte)>>8);
	uint8_t Data_L=0x00FF&DAC_Byte;
	MyI2C_Start(GPIO_I2C);
	MyI2C_SendByte(GPIO_I2C,0xC0);//Mcp4725设备地址
	MyI2C_ReceiveACK(GPIO_I2C);
	MyI2C_SendByte(GPIO_I2C,Data_H);
	MyI2C_ReceiveACK(GPIO_I2C);
	MyI2C_SendByte(GPIO_I2C,Data_L);
	MyI2C_ReceiveACK(GPIO_I2C);
	MyI2C_Stop(GPIO_I2C);
}

3、最后就是主程序的显示

#include "MCP4725.h"
#include "I2C_TypeDefStructure.h"
void OLED_ShowFloat(uint8_t line,uint8_t Colum,float num,uint8_t Length)
{
	uint32_t GEWEI=0;
	uint32_t XIAOSHU=0;
	GEWEI=num/1;
	OLED_ShowNum(line,Colum,GEWEI,1);
	XIAOSHU=(num-GEWEI)*100;
	OLED_ShowChar(line,Colum+1,'.');
	OLED_ShowNum(line,Colum+3,XIAOSHU,2);
}
int main()
{
	OLED_Init();

	MyI2C_TypeDef MCP4725_1Typedef;
	MCP4725_1Typedef.GPIOX=GPIOA;
	MCP4725_1Typedef.GPIO_Pin_SDA=GPIO_Pin_2;
	MCP4725_1Typedef.GPIO_Pin_SCL=GPIO_Pin_3;

	


	MCP4725_Init(&MCP4725_1Typedef);

	float a=0.0;
	while(1)
	{

		a =a+0.1;
		OLED_ShowNum(1,1,a,4);
		MCP4725_SendDAC(&MCP4725_1Typedef,a,4.5);
		if(a==4.5)
			a=0.0;
		Delay_ms(500);



	}
}

4、最后就是把STM32系统板,电路供电、型号转换电路进行连接测试了。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 4-20mA采集电路是一种常用的电流测量电路,可用于测量各种工业设备的电流信号。这种电路使用RS485通信协议将采集到的电流信号传输给STM32F103单片机进行处理。 4-20mA采集电路主要由电流传感器、变送器和RS485换器组成。电流传感器是用来将待测电流换为电压信号的装置,可以通过与待测电流回路串联的方式进行接入。变送器是将传感器信号进行放大和换,将4-20mA电流信号换成0-5V的电压信号。RS485换器是用来将电压信号换成数字信号,并通过RS485通信协议将数据发送给STM32F103单片机STM32F103是一款性能强大的32位ARM微控制器,拥有丰富的外设资源和强大的计算能力。它可以通过串口接收RS485换器传输的数据,并进行相应的数据处理和控制。 在实际应用中,4-20mA采集电路可用于监测温度、压力、液位等工业参数。传感器将待测信号换为电压信号后,变送器将其换为标准的电流信号,方便传输和处理。通过RS485通信协议,采集到的数据可以传输给STM32F103单片机,进行数据存储、显示或控制等操作。 总之,4-20mA采集电路的RS485输出可以与STM32F103单片机结合使用,实现对各种工业设备电流信号的采集和处理。 ### 回答2: 4-20mA采集电路RS485输出STM32F103是一种常见的工业控制系统电路设计。这种电路可以将4-20mA模拟信号换为数字信号,并通过RS485通信协议输出STM32F103单片机进行处理。 其中,4-20mA采集电路用于将传感器产生的模拟信号换为电流信号。将输入信号与电阻相连,通过电流随信号变化而改变。通过适当选取电阻值,可以使得输入信号范围为4-20mA。这样设计的好处是电流信号抗干扰能力强,传输距离远,适合工业环境使用。 RS485是一种工业标准通信协议,具有双向、多点、抗干扰等特点。RS485采用差分信号传输机制,能够在长距离、高噪声环境下稳定传输数据。通过RS485接口,将4-20mA换为数字信号,并输出STM32F103进行后续处理。 STM32F103是一款常用的32位ARM Cortex-M3内核微控制器。它具有高性能、丰富的外设资源和丰富的通信接口。在这个电路中,STM32F103负责接收RS485输出的数字信号,并进行相应的数据解析、计算、控制等操作。 总的来说,4-20mA采集电路RS485输出STM32F103是一种将模拟信号换为数字信号,并通过RS485通信协议输出STM32F103进行处理的工业控制系统电路设计。这种设计适用于各种工业情况下的信号采集和数据处理需求。 ### 回答3: 4-20mA采集电路实现了将外部电流信号换成4-20mA电流输出。而RS485是一种常用的工业串口通信协议,具有传输距离远、抗干扰能力强等特点。STM32F103是一款常用的单片机芯片,具有丰富的外设资源和高性能的处理能力。 在这个应用中,我们可以使用STM32F103来实现4-20mA采集电路,并通过RS485进行通信输出。具体实现方法如下: 1. 选择合适的电流传感器:根据实际需求选择合适的电流传感器,如Hall传感器或Shunt电阻等。该传感器将外部电流信号换成电压信号。 2. 连接电流传感器和STM32F103:将电流传感器的输出端与STM32F103的模拟输入引脚连接,以读取电压信号。根据外部电路的要求,可能需要使用运放等电路进行信号放大。 3. 编程配置ADC采集:使用STM32F103的内置ADC模块,编写相应的程序来配置和读取ADC采集结果。根据电流传感器的输出范围和精度要求,设置合适的ADC采样精度和采样速率。 4. 数据处理和传输:将ADC采集结果进行数据处理,将其换为4-20mA电流信号范围。然后,使用STM32F103的UART或USART模块,配置RS485通信协议,并将数据通过RS485换成差分信号输出。 5. 连接RS485电路和外部设备:通过RS485电路将RS485差分信号换成正常的RS485信号,并与外部设备连接,如PLC、HMI等。确保在通信过程中使用合适的通信协议和位速。 通过以上步骤,我们可以实现4-20mA采集电路的数据采集和通过RS485进行通信输出。这样的设计可以广泛应用于工业自动化控制领域,实现远距离和可靠的数据传输。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值