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
相关推荐
花落已飘7 分钟前
STM32中实现shell控制台(命令解析实现)
stm32·shell
没有钱的钱仔20 分钟前
STM32低功耗模式全面指南
css·stm32·css3
牵牛老人2 小时前
Qt处理USB摄像头开发说明与QtMultimedia与V4L2融合应用
stm32·单片机·qt
宇钶宇夕3 小时前
针对工业触摸屏维修的系统指南和资源获取途径
单片机·嵌入式硬件·自动化
和风化雨4 小时前
stm32的三种开发方式
stm32·单片机·嵌入式硬件
kanhao1004 小时前
三态逻辑详解:单片机GPIO、计算机总线系统举例
单片机·嵌入式硬件
小眼睛FPGA6 小时前
【RK3568+PG2L50H开发板实验例程】FPGA部分/紫光同创 IP core 的使用及添加
科技·嵌入式硬件·ai·fpga开发·gpu算力
竹照煜_ysn7 小时前
STM32
stm32·单片机·嵌入式硬件
蓬荜生灰8 小时前
永磁无刷电机旋转原理
单片机·嵌入式硬件
金色光环10 小时前
【Modbus学习笔记】stm32实现Modbus
笔记·stm32·学习