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之间) |

相关推荐
雷工笔记16 分钟前
读书笔记|算法的破坏性影响
学习·随笔
千年糊涂26 分钟前
STM32使用薄膜压力传感器
stm32·单片机·嵌入式硬件
2301_7972673429 分钟前
神经网络组植物分类学习规划与本周进展综述15
人工智能·神经网络·学习
月下倩影时30 分钟前
视觉学习篇——理清机器学习:分类、流程与技术家族的关系
学习·机器学习·分类
啊我不会诶40 分钟前
01BFS学习笔记
笔记·学习·算法
01100001乄夵1 小时前
Android入门教程 - 第三章:Android布局全攻略
android·经验分享·笔记·学习方法·android期末学习
1 小时前
ADC单通道采集实验
单片机·stm中adc单通道采样
早睡冠军候选人4 小时前
Ansible学习----管理复杂的 Play 和 Playbook 内容
运维·学习·云原生·ansible
LBuffer5 小时前
破解入门学习笔记题四十六
数据库·笔记·学习
Yurko136 小时前
【计网】基于三层交换机的多 VLAN 局域网组建
网络·学习·计算机网络·智能路由器