ADC模数转换---STM32

描述:STM32单片机接受HRTM温湿度传感器采集的数据;

一、简介

ADC模拟---数字转换器:

ADC可以江引脚上连续变化的模拟电压转换为内存中的数字变量,建立模拟电路到数字电路的桥梁;

12位逐次逼近型的ADC,1us转换时间

输入电压范围:0~3.3V,转换结果范围:0~4095

18个输入通道,可测量16个外部和2个内部信号源

模拟看门狗自动检测输入电压范围

STM32F103C8T6 ADC资源:ADC1、ADC2、10个外部输入通道

ADC通道和引脚对应表:

转换模式:四种转换模式

触发源:

需要一个触发条件;

数据对齐:

ADC是12位,转换结果是12位的,但是寄存器是16位的,所以就需要对齐方式;一般使用第一种对齐方式

转换时间:

ADC转换步骤:采样、保持、量化、编码

STM32 ADC的总转换时间位:

Tconv = 采样时间+12.5个ADC周期

例如:当ADCCLK = 14MHz,采样时间位1.5个ADC周期

Tconv= 15 + 12.5 = 14个ADC周期 = 1us

如果不需要特别快的转换时间,就可以忽略这个;

ADC基本结构:

HRTM030模块介绍:

HRTM030的温度和湿度都是模拟量;

**原理:**通过变换电路将湿敏电阻元件的阻抗值随相对湿度变化的曲线转变为线性电压输出

VCC--->5V

H --->PA1

T --->PA2

GND--->GND

二、工程代码

配置流程:

1.开启时钟(RCC/GPIO/ADC);

2.配置GPIO(模拟输入);

3.配置多路开关;

4.配置ADC转换器;

5.配置看门狗(看需要);

6.配置中断(看需要);

7.使能ADC(ADC_CMD());

hrtm.c

cs 复制代码
#include "stm32f10x.h"  // Device header
#include "delay.h"
#include "hrtm.h"


int Rec_Data[2] = {0};


void HRTM_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
		ADC_InitTypeDef ADC_InitStructure; 
	
		RCC_ADCCLKConfig(RCC_PCLK2_Div6);
    
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);

    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AIN; 
    GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_1 | GPIO_Pin_2 ;      
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  
    
    GPIO_Init(GPIOA, &GPIO_InitStructure);
		
	 
	
		ADC_DeInit(ADC1);  																												//复位ADC1,将外设 ADC1 的全部寄存器重设为缺省值
 
		ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;												//ADC工作模式:ADC1和ADC2工作在独立模式
		ADC_InitStructure.ADC_ScanConvMode = DISABLE;															//模数转换工作在单通道模式
		ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;												//模数转换工作在单次转换模式
		ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;				//转换由软件而不是外部触发启动
		ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;										//ADC数据右对齐
		ADC_InitStructure.ADC_NbrOfChannel = 3;																		//顺序进行规则转换的ADC通道的数目(仅在扫描模式下有用)
		ADC_Init(ADC1, &ADC_InitStructure);																				//根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器   
 
  
		ADC_Cmd(ADC1, ENABLE);																										//使能指定的ADC1
	
		ADC_ResetCalibration(ADC1);																								//使能复位校准  
	 
		while(ADC_GetResetCalibrationStatus(ADC1));																//等待复位校准结束
	
		ADC_StartCalibration(ADC1);	 																							//开启AD校准
 
		while(ADC_GetCalibrationStatus(ADC1));	 																	//等待校准结束
 
	//	ADC_SoftwareStartConvCmd(ADC1, ENABLE);																		//使能指定的ADC1的软件转换启动功能

}



u16 Get_Adc(u8 ch)
{
	ADC_SoftwareStartConvCmd(ADC1,ENABLE);
    ADC_RegularChannelConfig(ADC1,ch,1,ADC_SampleTime_239Cycles5);
	while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC) == RESET);//第二个参数 规则组转换完成标志位
	return ADC_GetConversionValue(ADC1);
}


s16 Get_Adc_Average(u8 ch,u8 times)
{
	s32 temp_val=0;
	s8 t;
	
	for(t=0;t<times;t++)
	{
		temp_val+=Get_Adc(ch);
		delay_ms(6);
	}
	return temp_val/times;
}

void HT_Data(void)
{
		 // 读取湿度传感器的 ADC 值 (PA1)
    Rec_Data[0] = Get_Adc_Average(ADC_Channel_1,10);
		Rec_Data[0] = (Rec_Data[0] / 4095.0) * 3.3; 
		

    // 读取温度传感器的 ADC 值 (PA2)
    Rec_Data[1] = Get_Adc_Average(ADC_Channel_2,10);
		Rec_Data[1] = (Rec_Data[1] / 4095.0) * 3.3; 

}

hrtm.h

cs 复制代码
#ifndef __HRTM_H
#define __HRTM_H

#include "stm32f10x.h"                  // Device header
#include "sys.h"


extern int Rec_Data[2];


void HRTM_Init(void);
u16 Get_Adc(u8 ch);

s16 Get_Adc_Average(u8 ch,u8 times);
void HT_Data(void);

#endif
相关推荐
Yeats_Liao2 分钟前
智能感知低功耗设计:MCU上的AI异常检测与能效优化
人工智能·单片机·物联网·neo4j
Y多了个想法8 分钟前
RK3576 android14 I2C总线,硬件I2C 与 GPIO模拟I2C 比对
经验分享·嵌入式硬件·i2c·rk·rk3576
blevoice8 分钟前
JL杰理AC696N开发板上调试蓝牙音质优化:开启AAC高清音频支持
单片机·ffmpeg·音视频·aac·ac6966b蓝牙音响方案·杰理智能音箱开发·杰理ac6965e蓝牙音频开发
小+不通文墨38 分钟前
树莓派4b-wiringpi库的安装和使用
驱动开发·经验分享·笔记·嵌入式硬件·学习
小麦嵌入式1 小时前
FPGA入门(三):3-8 译码器 仿真波形解读
stm32·单片机·嵌入式硬件·mcu·fpga开发·硬件工程
Elihuss2 小时前
关于RK3506 的MCU软复位后跑不起问题
linux·单片机·嵌入式硬件
fengfuyao9852 小时前
GRBL 1.1 移植到 STM32 (HAL库)
stm32·单片机·嵌入式硬件
biyezuopinvip2 小时前
基于STC89C51单片机的多波形信号发生器设计与Proteus仿真
单片机·proteus·课程设计·proteus仿真·基于stc89c51单片机的·多波形·信号发生器设计
无人装备硬件开发爱好者2 小时前
STM32G474 驱动 1.54 寸三色电子墨水屏实现贪吃蛇游戏完整指南
stm32·嵌入式硬件·游戏
山木嵌入式3 小时前
FreeRTOS任务创建全解析:动态/静态创建+实战案例+参数深度剖析
stm32·freertos