STM32学习笔记(七)--ADC详解

(1)配置步骤
++++1.配置RCC外设时钟++++ ++++开启GPIO以及ADC外设++++
++++2.配置预分配ADCCLK++++ ++++不能超过14MHZ 一般都是除于6++++
++++3.配置GPIO口++++ ++++初始化为模拟输入的配置 设置专属模式++++
++++4.选择规则组的输入通道++++ ++++选择ADCx以及通道等 去看引脚图++++
++++5.配置ADC++++ ++++初始化配置++++
++++6.配置中断以及定时器等等++++ ++++(需要即配置)++++
++++7.开启ADC的电源++++
++++8.开启ADC的校准++++

(2)代码示例

案例1 ADC1单通道 PA0单通道模拟输入实例 单次转化非扫描

cpp 复制代码
void AD_Init(void)
{
//开启对应的RCC时钟外设 要用的GPIO口以及选择的ADC
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
//进行预分配处理 该晶振为72MHZ除于预分频值要比14MHZ小才行
RCC_ADCCLKConfig(RCC_PCLK2_Div6);
//进行GPIO的初始化配置 注意的是选择模式为模拟输入
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//选择规则组的输入通道 1、2参数根据引脚图 3参数是次序(1-16)4参数采样时间
ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_55Cycles5);
//初始化ADC具体函数功能下文会阐述
ADC_InitTypeDef ADC_InitStructure;
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
ADC_InitStructure.ADC_ScanConvMode = DISABLE;//连续转化非扫描ENABLE
ADC_InitStructure.ADC_NbrOfChannel = 1;
ADC_Init(ADC1, &ADC_InitStructure);
//开启ADC电源 启动ADC
ADC_Cmd(ADC1, ENABLE);

//进行ADC校准
//复位校准
ADC_ResetCalibration(ADC1);
//等待复位校准完成
while (ADC_GetResetCalibrationStatus(ADC1) == SET);
//开始校准
ADC_StartCalibration(ADC1);
//等待校准完成
while (ADC_GetCalibrationStatus(ADC1) == SET);
//连续转化非扫描ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}
//单次转化非扫描
uint16_t AD_GetValue(void)
{
//触发ADC转换
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
//获取ADC转换标志位状态的函数
while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);
//获取ADC转换的函数 会自动清除标志位
return ADC_GetConversionValue(ADC1);
}
/*连续转化非扫描
uint16_t AD_GetValue(void)
{
return ADC_GetConversionValue(ADC1);
}*/

案例2 ADC1多通道 PA0123多通道模拟输入实例 标黄处做修改即可

cpp 复制代码
void AD_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
RCC_ADCCLKConfig(RCC_PCLK2_Div6);
	
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
		
ADC_InitTypeDef ADC_InitStructure;
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
	ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
	ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
ADC_InitStructure.ADC_NbrOfChannel = 1;
ADC_Init(ADC1, &ADC_InitStructure);
	
ADC_Cmd(ADC1, ENABLE);
	
ADC_ResetCalibration(ADC1);
while (ADC_GetResetCalibrationStatus(ADC1) == SET);
ADC_StartCalibration(ADC1);
while (ADC_GetCalibrationStatus(ADC1) == SET);
}

uint16_t AD_GetValue(uint8_t ADC_Channel)
{
ADC_RegularChannelConfig(ADC1,ADC_Channel,1, ADC_SampleTime_55Cycles5);
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);
return ADC_GetConversionValue(ADC1);
}
//
uint16_t AD0, AD1, AD2, AD3;
int main(void)
{
OLED_Init();
AD_Init();
	
OLED_ShowString(1, 1, "AD0:");
OLED_ShowString(2, 1, "AD1:");
OLED_ShowString(3, 1, "AD2:");
OLED_ShowString(4, 1, "AD3:");
	
while (1)
{
	AD0 = AD_GetValue(ADC_Channel_0);
	AD1 = AD_GetValue(ADC_Channel_1);
	AD2 = AD_GetValue(ADC_Channel_2);
	AD3 = AD_GetValue(ADC_Channel_3);
		
	OLED_ShowNum(1, 5, AD0, 4);
	OLED_ShowNum(2, 5, AD1, 4);
	OLED_ShowNum(3, 5, AD2, 4);
	OLED_ShowNum(4, 5, AD3, 4);
	Delay_ms(100);
	}
}

(3)函数分析

函数1:void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct)

(stm32f10x_adc.h) 该函数为初始化ADC函数,其ADC_InitTypeDef结构体成员变量如下所示。

|-----|--------------------------------|----------------|--------------------------------------------|
| 序号 | 名称 | 参数解释 | 示例 |
| 参数1 | ADC_Mode | ADC的工作模式独立、双AD | ADC_Mode_Independent(就此为独立模式 其余都是双AD 相对复杂) |
| 参数2 | ADC_DataAlign | 数据对齐 | ADC_DataAlign_Right(右对齐) |
| 参数3 | ADC_ExternalTrigConv | 外部触发转换选择 触发源 | ADC_ExternalTrigConv_None(不使用外部触发 内部软件触发) |
| 参数4 | ADC_ContinuousConvMode | 选择连续转换还是单次转换 | DISABLE(单次模式) ENABLE(连续模式) |
| 参数5 | ADC_ScanConvMode | 选择扫描还是非扫描 | DISABLE(非扫描模式) ENABLE(扫描模式) |
| 参数6 | ADC_NbrOfChannel (非扫描模式下此参数无用) | 指定扫描模式下会用到几个通道 | 1(1-16之间) |

相关推荐
end_SJ6 分钟前
初学stm32 --- ADC采集内部温度传感器
stm32·单片机·嵌入式硬件
欧老八25 分钟前
工作中Excel技巧整理
笔记
Spcarrydoinb1 小时前
python学习笔记—17—数据容器之字符串
笔记·python·学习
黄金右肾1 小时前
STM32之LWIP网络通讯设计-上(十四)
stm32·单片机·eth·lwip
我不喝甜水儿1 小时前
《Mcal》--MCU模块
单片机·嵌入式硬件
夜半被帅醒1 小时前
【JAVA】Java开发小游戏 - 简单的2D平台跳跃游戏 基本的2D平台跳跃游戏框架,适合初学者学习和理解Java游戏开发的基础概念
java·学习·游戏
不能只会打代码2 小时前
32单片机从入门到精通之测试与验证——单元测试(十五)
单片机·嵌入式硬件·单元测试·32单片机
杂货铺的小掌柜2 小时前
spring mvc源码学习笔记之八
学习·spring·mvc
就叫飞六吧2 小时前
51单片机 和 STM32 在硬件操作上的差异
stm32·单片机·嵌入式硬件·51单片机
tadus_zeng2 小时前
51单片机(一) keil4工程与小灯实验
单片机·嵌入式硬件·51单片机