STM32笔记——ADC模数转换

一、概述

二、ADC模数转换器

2.1 ADC简介

  • ADC(Analog-Digital Converter)模拟-数字转换器
  • ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量,建立模拟电路到数字电路的桥梁
  • 12位逐次逼近型ADC,1us转换时间
  • 输入电压范围:0~3.3V,转换结果范围:0~4095
  • 18个输入通道,可测量16个外部和2个内部信号源 规则组和注入组两个转换单元
  • 模拟看门狗自动监测输入电压范围
  • STM32F103C8T6 ADC资源:ADC1、ADC2,10个外部输入通道

2.2 ADC框图

STM32笔记——ADC模数转换_第1张图片

  •  输入通道:需要进行AD转换的信号从这里进入AD转换器。STM32F103C8T6有10个外部输入通道,和两个内部输入通道。
  • 硬件触发:让ADC开始转换。分为注入组触发和规则组触发。
  • 时钟:ABP2总线的72Mhz频率,经过ADC的预分频器分频得到ADC的时钟ADCCLK。
  • 转换结束标志和模拟看门狗:规则组转换结束会由硬件置位EOC,注入组转换结束会由硬件置位JEOC,可通向中断;模拟看门狗当超过阈值会置位AWD标志位,可通向中断。

2.3 ADC转换模式

  • 单次转换,非扫描模式

STM32笔记——ADC模数转换_第2张图片

  •  连续转换,非扫描模式

STM32笔记——ADC模数转换_第3张图片

  •  单次转换,扫描模式

STM32笔记——ADC模数转换_第4张图片

  •  连续转换,扫描模式

STM32笔记——ADC模数转换_第5张图片

三、ADC基本结构

STM32笔记——ADC模数转换_第6张图片

  1. 初始化GPIO
  2. 初始化AD转换器:①开启ADC时钟;②设置ADC预分频器分频;③初始化ADC
  3. 使能ADC
  4. 校准

模块程序如下:

#include "stm32f10x.h"                  // Device header
void AD_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	GPIO_InitTypeDef GPIO_InitStruct;
	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AIN;
	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0;
	GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStruct);
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
	RCC_ADCCLKConfig(RCC_PCLK2_Div6);
	ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_55Cycles5);
	ADC_InitTypeDef ADC_InitStruct;
	ADC_InitStruct.ADC_ContinuousConvMode=DISABLE;//单次转换
	ADC_InitStruct.ADC_DataAlign=ADC_DataAlign_Right;//数据右对齐
	ADC_InitStruct.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;//无外部触发源
	ADC_InitStruct.ADC_Mode=ADC_Mode_Independent;//ADC1和ADC2独立
	ADC_InitStruct.ADC_NbrOfChannel=1;//通道数目
	ADC_InitStruct.ADC_ScanConvMode=DISABLE;//非扫描模式
	ADC_Init(ADC1,&ADC_InitStruct);
	
	ADC_Cmd(ADC1,ENABLE);
	//校准
	ADC_ResetCalibration(ADC1);
	while(ADC_GetResetCalibrationStatus(ADC1)==SET);
	ADC_StartCalibration(ADC1);
	while(ADC_GetCalibrationStatus(ADC1)==SET);
}

你可能感兴趣的:(stm32,单片机,嵌入式硬件)