STM32采集4-20mA传感器,以及ADC+DMA出现的问题及解决

这篇具有很好参考价值的文章主要介绍了STM32采集4-20mA传感器,以及ADC+DMA出现的问题及解决。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

STM32只能采集0-3.3V的数据,如果需要采集0-5V和4-20mA的数据需要在电路中进行相关设计:

stm32采集0-5v电压,stm32,嵌入式硬件,单片机

0-5V采集电路

stm32采集0-5v电压,stm32,嵌入式硬件,单片机

4-20mA采集电路

本文主要讲述4-20mA采集电路采集

电路输入4-20mA,作用在120欧姆电路(后面面是电压跟随电路,并联),对应输入电压0.48~2.4V

STM32103ZET6为例,内部ADC采集12bit,0-3.3V对应采集到12bit的0-4095数值,则采集的电流对应大约为0.48/3.3*4059~2.4/3.3*4095-->595~2978数值

假如我们是采集的0-6Mpa的压力,那么简单的换算为:

(采集的数值-595)*6000000/(2978-595)=采集的压力(pa)文章来源地址https://www.toymoban.com/news/detail-848801.html

代码如下:代码需要将GPIO和ADC和DMA根据自己的电路接口简单配置即可

ADC.c代码,两个函数分别是ADC+DMA初始化代码和ADC采集一次代码
#include "stm32f10x.h"                  // Device header
#include "Serial1.h"
extern uint16_t AD_Value[4];//压力变送器Kpa4095*6000//温度℃4095*200
extern uint16_t AD_ValueTrasition[4][20];
void AD_Init(void){
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
	RCC_ADCCLKConfig(RCC_PCLK2_Div8);//ADCCLK=APB2/8=14MHz
	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);

	GPIO_InitTypeDef GPIO_InitStructureADC;
	GPIO_InitStructureADC.GPIO_Mode=GPIO_Mode_AIN;
	GPIO_InitStructureADC.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_3|GPIO_Pin_4;
	GPIO_InitStructureADC.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOC,&GPIO_InitStructureADC);

	ADC_RegularChannelConfig(ADC1,ADC_Channel_10,1,ADC_SampleTime_13Cycles5);//采集总转换时间=采样时间+12.5ADC周期=13.5+12.5=26个周期
	ADC_RegularChannelConfig(ADC1,ADC_Channel_11,2,ADC_SampleTime_13Cycles5);
	ADC_RegularChannelConfig(ADC1,ADC_Channel_13,3,ADC_SampleTime_13Cycles5);//一个ADC周期14MHz=1/14 us每周期=26/14 us≈1.9us
	ADC_RegularChannelConfig(ADC1,ADC_Channel_14,4,ADC_SampleTime_13Cycles5);//1.9*4=7.6us
	
	
	ADC_InitTypeDef ADC_InitStructure;
	ADC_InitStructure.ADC_ContinuousConvMode=ENABLE;//连续转换开启/单次转换;
	ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;//数据右对齐
	ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;//是否使用硬件触发;目前该程序使用软件触发
	ADC_InitStructure.ADC_Mode=ADC_Mode_Independent;//独立模式,ADC1单独使用,不和ADC2等一起使用
	ADC_InitStructure.ADC_NbrOfChannel=4;//非扫描模式下该参数无效,用于重装载扫描序列数
	ADC_InitStructure.ADC_ScanConvMode=ENABLE;//扫描模式(多通道)/非扫描模式(单通道),指扫描序列
	ADC_Init(ADC1,&ADC_InitStructure);
	
//如果需要配置看门狗,有几个参数需要配置阈值和监测通道。
//如果需要配置中断,则需要在中断输出控制中用ITConfig函数开启对应的中断输出,然后配置NVIC的优先级
	DMA_InitTypeDef DMA_InitStructure;
	DMA_InitStructure.DMA_BufferSize=4;//缓冲区大小,传输计数器次数,0-65535,2个ADC通道所以传输2次
	DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralSRC;//传输方向;外设站点作为源
	DMA_InitStructure.DMA_M2M=DMA_M2M_Disable;//是否使用软件触发(软件触发和计数器自动重装循环模式不能同时使用,会不能停止)
	
	DMA_InitStructure.DMA_MemoryBaseAddr=(uint32_t)AD_Value;//存储器站点的起始地址,stm32中地址都是32bit,AD_Value是我们存储转移的地址 
	DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_HalfWord;//存储器站点的数据宽度
	DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable;//存储器站点是否自增,数组地址会自增
	
	DMA_InitStructure.DMA_PeripheralBaseAddr=(uint32_t)&ADC1->DR;//外设站点的起始地址,一般使用SARM的话是系统分配,使用变量名获取地址
	DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_HalfWord;//外设站点的数据宽度,Byte-8bit-uint8_t、HalfWord-16bit-uint16_t、Word-32bit-uint32_t;(ADC外设是12bit数据,具体的DMA数据转移对齐,可以看DMA数据宽度对齐方式大小端表格)
	DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;//外设站点是否自增,ADC开启DMA后数据直接转移到DMA,所以不自增
	
	DMA_InitStructure.DMA_Mode=DMA_Mode_Circular;//传输模式,是否使用自动重装,自动重装和软件触发不能同时使用(不可控),Normal正常模式,Circular循环模式
	
	DMA_InitStructure.DMA_Priority=DMA_Priority_High;//优先级
	DMA_Init(DMA1_Channel1,&DMA_InitStructure);//DMA1,使用软件触发时通道可以任意选择,硬件要根据手册中实际电路选择;目前使用ADC1-13、14触发DMA
//开启,如果使用的硬件触发,要在对应外设调用XXX_DMACmd(),开启触发信号输出,如果使用DMA中断,则使用DMA_ITConfit(),然后在NVIC配置响应的中断通道,然后写中断函数
	DMA_Cmd(DMA1_Channel1,ENABLE);
//开启ADC到DMA触发输出
	ADC_DMACmd(ADC1,ENABLE);
//开启ADC。可以软件触发也可以硬件触发。
	ADC_Cmd(ADC1,ENABLE);
//进行ADC校准
	ADC_ResetCalibration(ADC1);//ADC1复位校准
	while(ADC_GetResetCalibrationStatus(ADC1)){//获取复位校准状态;等待复位校准完成
		;
	}
	ADC_StartCalibration(ADC1);//开始校准
	while(ADC_GetCalibrationStatus(ADC1)){//获取开始校准状态;等待校准完成
		;
	}
}

void AD_Once(void){
	ADC_SoftwareStartConvCmd(ADC1,ENABLE);//软件开始ADC转换
	while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC==RESET)){;}
	ADC_SoftwareStartConvCmd(ADC1,DISABLE);//软件停止ADC转换
}
#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "ADC.h"
#include "MySPI1.h"
#include "Serial1.h"
//需要将该文件中的USE_STDPERIPH_DRIVER定义在define的设置里  这样才能使用外设库
//若是导入了头文件需要设置头文件包含路径
extern uint16_t MAX31855KASA_In_Temp,MAX31855KASA_Out_Temp;
extern uint16_t AD_Value[4];
extern uint16_t AD_ValueTrasition[4][20];
uint8_t SendData[30];
int main(void){
	Serial_Init();
	MySPI_Init();
	AD_Init();
	while(1){

		Delay_ms(1);
		AD_Transition();
		Serial_printf("%s","压力Kp为:");
		Serial_printf("%d",AD_Value[2]);
		Serial_printf("%s","\r\n");
		Serial_printf("%s","温度为:");
		Serial_printf("%d",AD_Value[3]);
		Serial_printf("%s","\r\n");
		Delay_ms(500);
	}
}

到了这里,关于STM32采集4-20mA传感器,以及ADC+DMA出现的问题及解决的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 超详细!!STM32-ADC模数转换器-驱动内部温度传感器

      在STM32微控制器系列中,ADC(Analog-to-Digital Converter)是一个重要的外设模块,它允许微控制器将模拟信号转换成数字信号以进行处理。模拟信号–数字信号。    MCU只能处理数字量(10011001),如果需要MCU区分模拟输入信号时,MCU直接做不了,需要将模拟信号通过模数转换

    2024年02月19日
    浏览(45)
  • STM32——ADC读取光敏传感器控制LED灯,看门狗中断

    一、编写读取AD值的函数,之后判断AD值,进行相应操作,比如点灯。 二、用ADC读取光敏传感器AO口输出,并配置ADC通道看门狗监控这条通道,当光线太暗时打开LED灯。 之后会再介绍可编程RGB灯带WS2812B。 光敏传感器有两个输出口,一个是DO(Digital Output),一个是AO(Analog O

    2023年04月18日
    浏览(44)
  • STM32_ADC————ADC+DMA多路数据传输,看门狗中断,传感器控制LED

    一:介绍ADC与DMA的基本情况与初始化 二:利用ADC+DMA+看门狗中断+传感器控制LED灯代码 三:总结实验过程中碰到的错误与问题 通过DMA转运ADC的数据,设置ADC的中断看门狗阈值,当光敏传感器的ADC采样值在看门狗高低阈值中间,不触发中断,如果超过看门狗的高低阈值就会触发

    2024年02月04日
    浏览(45)
  • STM32+DHT11采集温湿度传感器数据

            DHT11 是一款湿温度一体化的数字传感器。该传感器包括一个电阻式测湿元件和一个 NTC 测温元件,并与一个高性能 8 位单片机相连接。通过单片机等微处理器简单的电路连接就能够 实时的采集本地湿度和温度。 DHT11 与单片机之间能采用简单的单总线进行通信,仅

    2024年02月07日
    浏览(40)
  • Stm32_标准库_11_ADC_光敏&热敏传感器_测数值

    在测量光敏传感器数值得基础上手动将通道改成热敏传感器通道即可 由于温度传感器的测量范围是-20 ~ 105摄氏度,所以输出温度得考虑带上符号这就需要在原有输出光照强度代码的基础上新添加几个函数 函数1: 在获取模拟电压函数最开始写入通道函数方便接入GPIO_1或GPIO_

    2024年02月19日
    浏览(42)
  • 通过STM32内部ADC将烟雾传感器发送的信号值显示在OLED上

    一.CubeMX配置 首先我们在CubeMX配置ADC1, 设置一个定时器TIM2定时1s采样一次以及刷新一次OLED, 打开IIC用于驱动OLED显示屏。 二.程序 在Keil5中添加好oled的显示库,以及用来显示的函数、初始化函数、清屏函数等。在主程序中初始化oled,并将其清屏。 在定时器中断回调函数中对A

    2024年02月15日
    浏览(47)
  • Stm32_标准库_8_ADC_光敏传感器_测量具体光照强度

    ADC简介 测量方式 采用二分法比较数据 IO通道 ADC基本结构及配置路线 获取数字变量需要用到用到光敏电阻的AO口,AO端口接在PA0引脚即可 测得的模拟数据与实际光照强度之间的关系为 代码: 完整朴素代码: 效果: 此代码的不足之处在于每次写入数字都会提前占据固定位置,

    2024年02月04日
    浏览(43)
  • STM32 —— 温湿度( AHT20 )传感器入门

    温湿度的具体使用方法可以看官方给出的基于 STM32 的历程,这里只进行简单介绍 官方历程如下: AHT20-21 DEMO V1_3(stm32) AHT20在STM32上的例程 V1.4 DHT20 是 DHT11 的全新升级产品,配置了专用的 ASIC 传感器芯片、高性能的半导体硅基电容式湿度传感器和一个标准的片上温度传感器,并

    2024年02月07日
    浏览(43)
  • STM32——DS18B20温度传感器

    一、DS18B20介绍 (一)DS18B20技术性能特征 1、独特的单总线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯,大大提高了系统的抗干扰性。 2、测温范围  -55°C~+125°C 3、支持多点组网功能,多个DS18B20可以并联在唯一的三线上,最多只

    2024年01月19日
    浏览(43)
  • 基于STM32 RS485传感器数据采集(参考正点原子部分代码)

    目前工业上,传感器一般都选RS485,modbus通讯协议,这种通讯方式,有很强的鲁棒性,本篇文章基于原子哥的精英板进行开发。 1、初始化与电脑通信的串口(PA9 PA10) 2、采用串口中断将数据保存到数组buff中 3、用定时器来配置一帧字节是否结束(空闲时间指定时间) 5、从机

    2024年02月11日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包