ADC模数转换---STM32

发布于:2024-12-18 ⋅ 阅读:(67) ⋅ 点赞:(0)

描述: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

#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

#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





网站公告

今日签到

点亮在社区的每一天
去签到