STM32处理变送器输出的4-20ma,STM32的AD转换只能接受0-3.3V的电压输入,怎么用运放实现转换
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STM32处理变送器输出的4-20ma,STM32的AD转换只能接受0-3.3V的电压输入,怎么用运放实现转换相关的知识,希望对你有一定的参考价值。
百度搜索基本是4-20ma转换到1-5V,怎么实现0-3.3V转换
4~20mA经过250Ω取样电阻即可转变为1~5V。
再用减法器电路,将输出减去1V,即可得到0~4V。将减法器电路的增益改为3.3/4,即可得到0~3.3V的输出。
电路如下图:
上图中,ui1接1V,Ui2接1~5V。R1=R2=4kΩ,RF=R3=3.3kΩ,输出就是0~3.3V。
追问ui1所接1V电压怎么实现,用单独的1V电源么
追答不需要。
1、可以采用电阻分压实现,但是,分压电阻必须远远小于R1,否则,受R1影响电压不准确。
2、可以直接采用供电电源,比如说5V。只需要将R1改为原先电阻的5倍即可。
即:
ui1接5V,ui2接1~5V输入。
R1=20kΩ,R2=4kΩ,RF=R3=3.3kΩ。
这个电路 Uo=Rf(Ui2/R2-Ui1/R1) 这个么,模拟电路烂的不行...
追答是的!
参考技术A 额~~~这个问题~~~~接一个运放,将电流转变为0-3.3V之间的电压就可以了,只需要调整运放的反馈电阻,使用电压并联负反馈电路就可以把电流量放大成电压量。追问前面有个朋友说了这个方法 ,采用250欧姆电阻转换为1-5V电压,然后输入减法器,减去1V后转换为0-4V电压,再将运放调节为3.3/4放大转换到0-3.3V,利用下面接法:
减去的1V电压采用Ui1接5V电源分压实现,Ui2接电阻转换后的1-5V电压,不知道朋友说的是不是这种方法,这个电路放大比例对不对
我用的是这个电路,Ua和Uc之间是一个电流量,下面两个电容是用来调整相位的,如果你的电流时直流电流变换器输出的量,则不需要,只需要调整R17,就可以实现吧4-20ma转成0.66~3.3v的转换,这是典型的电压并联负反馈,这种方法使用了运放减小输出阻抗,使得电流转换不会对单片机的ADC产生影响。
STM32L476应用开发之二:模拟量数据采集
采集模拟量数据在一台一起中是必不可少的功能。在本次实验中我们要采集的模拟量值主要包括氧气传感器的输出以及压力变送器的输出。
1硬件设计
我们需要采集数据对精度有一定的要求,而STM32L476自带ADC为12位的,所以我们采用独立的ADC芯片来完成这一工作。由于使用经验的关系,我们选择了AD7705芯片。
AD7705为完整16位、低成本、Σ-Δ型ADC,适合直流和低频交流测量应用。其具有低功耗(3 V时最大值为1 mW)特性,因而可用于环路供电、电池供电或本地供电的应用中。片内可编程增益放大器提供从1至128的增益设置,无需使用外部信号调理硬件便可接受低电平和高电平模拟输入。AD7705拥有两个差分通道,对外通讯支持SPI接口方式。其结构图如下:
在STM32L476RG开发板中,有SPI3口已经引到端子可以使用。各引脚分别为:
CN7-1 PC10 SPI3-SCK
CN7-2 PC11 SPI3-MISO
CN7-3 PC12 SPI3-MOSI
在开发板上的位置如下红框标识:
根据以上描述,于是我们设计电路图如下:
2、软件设计
完成硬件连接后我们可以开始软件开发了,首先我们在STM32CubeMX中对硬件部分进行配置。由于板子上没有焊接X3外部晶振,我们使用内部时钟源。使用SPI3的引脚PC10,PC11,PC12,如下图所示:
然后配置SPI3的的参数,我们采用7为数据,大端以及64分频,具体的参数配置如下图所示:
对应的SPI3端口的配置程序如下所示:
static void SPI3_Configuration(void) { hspi3.Instance = SPI3; hspi3.Init.Mode = SPI_MODE_MASTER; hspi3.Init.Direction = SPI_DIRECTION_2LINES; hspi3.Init.DataSize = SPI_DATASIZE_8BIT; hspi3.Init.CLKPolarity = SPI_POLARITY_LOW; hspi3.Init.CLKPhase = SPI_PHASE_1EDGE; hspi3.Init.NSS = SPI_NSS_SOFT; hspi3.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_64; hspi3.Init.FirstBit = SPI_FIRSTBIT_MSB; hspi3.Init.TIMode = SPI_TIMODE_DISABLE; hspi3.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; hspi3.Init.CRCPolynomial = 7; if (HAL_SPI_Init(&hspi3) != HAL_OK) { Error_Handler(); } }
接下来我们实现通过SPI3接口读取摸你脸个采集值得程序。
/*获取采集的物理量值,并作平滑处理*/
void GetMeasuredValue(void) { float currentValue[2]={-1.0,-1.0}; CalcMeasuredValue(currentValue); if(smoothIndex>=SmoothCount) { smoothIndex=0; } aPara.phyPara.o2Concentration=SmoothingFilter(currentValue[0],AD1Value,smoothIndex,SmoothCount,(O2RANGE-O2ZERO),2.0,0.2); aPara.phyPara.h2Concentration=SmoothingFilter(currentValue[1],AD2Value,smoothIndex,SmoothCount,(H2RANGE-H2ZERO),2.0,0.2); smoothIndex++; }
/*计算测量值,将AD转换的值转为物理量的对应值*/
static void CalcMeasuredValue(float *newValue) { uint16_t measuredValue=0; /*转化通道1的值*/ ADDA_AD7705_ENABLE();//使能器件 Delayus(200); measuredValue=GetAD7705ChannelValue(Channel1,SPIReadWriteByte,CheckDataIsReady); ADDA_AD7705_DISABLE();//片选取消 newValue[0]=PowerNPolyfit(((float)(measuredValue-AD1Zero)/(float)(AD1Scale-AD1Zero)),ADFactor[0],3)*(O2RANGE-O2ZERO)+O2ZERO; Delayms(1); /*转化通道2的值*/ ADDA_AD7705_ENABLE();//使能器件 Delayus(200); measuredValue=GetAD7705ChannelValue(Channel2,SPIReadWriteByte,CheckDataIsReady); ADDA_AD7705_DISABLE();//片选取消 newValue[1]=PowerNPolyfit(((float)(measuredValue-AD2Zero)/(float)(AD2Scale-AD2Zero)),ADFactor[1],3)*(H2RANGE-H2ZERO)+H2ZERO; Delayms(1); }
/*对SPI端口读写一个字节*/
static uint8_t SPIReadWriteByte(uint8_t data) { uint8_t rxData=0; HAL_SPI_TransmitReceive(&hspi3,&data,&rxData,1,1000); return rxData; }
/*检查数据是否准备好*/
static uint8_t CheckDataIsReady(void) { return (uint8_t)HAL_GPIO_ReadPin (GPIOB,GPIO_PIN_7); }
3、测试结果
程序下装后,运行正常可一看到2个通道的采集数据。如下图所示:
我们在测试时,采集了两个传感器输出,在实际使用时,我们只需要一路接传感器,而另外一路我们采集锂电池的电压信号。
以上是关于STM32处理变送器输出的4-20ma,STM32的AD转换只能接受0-3.3V的电压输入,怎么用运放实现转换的主要内容,如果未能解决你的问题,请参考以下文章