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

相关推荐
森焱森5 小时前
水下航行器外形分类详解
c语言·单片机·算法·架构·无人机
天水幼麟5 小时前
动手学深度学习-学习笔记(总)
笔记·深度学习·学习
小殷学长7 小时前
【单片机毕业设计17-基于stm32c8t6的智能倒车监测系统】
stm32·单片机·课程设计
天水幼麟7 小时前
动手学深度学习-学习笔记【二】(基础知识)
笔记·深度学习·学习
绿皮的猪猪侠7 小时前
算法笔记上机训练实战指南刷题
笔记·算法·pta·上机·浙大
沧海一笑-dj7 小时前
【51单片机】51单片机学习笔记-课程简介
笔记·学习·51单片机·江科大·江科大学习笔记·江科大单片机·江科大51单片机
老虎06278 小时前
JavaWeb(苍穹外卖)--学习笔记04(前端:HTML,CSS,JavaScript)
前端·javascript·css·笔记·学习·html
TESmart碲视8 小时前
HKS201-M24 大师版 8K60Hz USB 3.0 适用于 2 台 PC 1台显示器 无缝切换 KVM 切换器
单片机·嵌入式硬件·物联网·游戏·计算机外设·电脑·智能硬件
大苏打seven9 小时前
Docker学习笔记:Docker网络
笔记·学习·docker
small_wh1te_coder9 小时前
硬件嵌入式学习路线大总结(一):C语言与linux。内功心法——从入门到精通,彻底打通你的任督二脉!
linux·c语言·汇编·嵌入式硬件·算法·c