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 小时前
DCDC降压模块
单片机·嵌入式硬件
三菱-Liu8 小时前
三菱Q系列PLC系统配置
运维·驱动开发·嵌入式硬件·制造
嵌入式大圣9 小时前
单片机锂电池电量电压检测
stm32·单片机·嵌入式硬件·mcu·物联网·51单片机·iot
Echo_cy_9 小时前
STM32 串口收发HEX数据包
stm32·单片机·嵌入式硬件
冷曦_sole11 小时前
linux-16 关于shell(十五)date,clock,hwclock,man,时间管理,命令帮助
linux·stm32·单片机
嵌入式@hxydj12 小时前
STM32F103单片机HAL库串口通信卡死问题解决方法
stm32·单片机·嵌入式硬件·串口·uart·hal·卡死
嵌入式阿萌12 小时前
STM32F407+LAN8720A +LWIP +FreeRTOS 实现TCP服务器
服务器·stm32·tcp/ip
qq_4597300312 小时前
STM32 IIC协议实现
stm32·单片机·嵌入式硬件
Be Legendary-CGK14 小时前
【电子元器件】电感基础知识
嵌入式硬件·硬件工程