stm32 ADC单通道转换

stm32c8t6仅有12位分辨率

1、单次转换 非扫描

1、初始化

cpp 复制代码
void Ad_Init()
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
	
	//配置ADCCLK时钟分频,ADC的输入时钟不得超过14MHz
	RCC_ADCCLKConfig(RCC_PCLK2_Div6);
	
	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);

	//选择规则组输入通道
	ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_1Cycles5);
	
	ADC_InitTypeDef ADC_InitStruct;
	//独立模式 ADC1 和 ADC2 单独转换
	ADC_InitStruct.ADC_Mode=ADC_Mode_Independent;
	//选择数据对齐 左对齐、右对齐
	ADC_InitStruct.ADC_DataAlign=ADC_DataAlign_Right;
	//外部触发源选择, 这里使用软件触发,所以选择None
	ADC_InitStruct.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;
	//连续转换模式, 选择单次转换还是连续转换
	ADC_InitStruct.ADC_ContinuousConvMode=DISABLE;
	//扫描转换模式, 选择扫描模式还是非扫描模式
	ADC_InitStruct.ADC_ScanConvMode=DISABLE;
	//通道数目, 只有在扫描模式下才能使用多个通道
	ADC_InitStruct.ADC_NbrOfChannel=1;
	
	ADC_Init(ADC1, &ADC_InitStruct);
	ADC_Cmd(ADC1, ENABLE);
	
	//手册中建议在每次上电后执行一次校准
	//复位校准
	ADC_ResetCalibration(ADC1);
	//等待复位校准完成, 复位校准完成后为 RESET
	while(ADC_GetResetCalibrationStatus(ADC1)==SET);
	//开始校准
	ADC_StartCalibration(ADC1);
	//等待校准完成
	while(ADC_GetCalibrationStatus(ADC1)==SET);
	
}

ADC的复位校准位

2、开始转换

cpp 复制代码
uint16_t AD_GetValue()
{
	//开始转换
	ADC_SoftwareStartConvCmd(ADC1, ENABLE);
	//判断转换是否完成, 转换结束时EOC置1
	while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)==RESET);
	//取转换结果, 内部代码为读取DR寄存器内容,
	//读取后会自动清除EOC标志位
	return ADC_GetConversionValue(ADC1);
}

2、连续转换 非扫描

不需要不断地触发,不需要等待转换完成

ADC会连续不断地对指定通道进行转换,把结果放到数据寄存器中

1、初始化

cpp 复制代码
ADC_InitStruct.ADC_ContinuousConvMode=ENABLE;

//手册中建议在每次上电后执行一次校准
//复位校准
ADC_ResetCalibration(ADC1);
//等待复位校准完成, 复位校准完成后为 RESET
while(ADC_GetResetCalibrationStatus(ADC1)==SET);
//开始校准
ADC_StartCalibration(ADC1);
//等待校准完成
while(ADC_GetCalibrationStatus(ADC1)==SET);
//连续转换仅需要在最开始触发一次就可以,
//软件触发转换函数可以挪到初始化最后,不需要每次取值都使用
ADC_SoftwareStartConvCmd(ADC1, ENABLE);

2、返回值

连续转换模式下,不需要判断转换完成的标志位,直接返回值就可以

cpp 复制代码
uint16_t AD_GetValue()
{
	return ADC_GetConversionValue(ADC1);
}
相关推荐
xuxg20054 小时前
4G 模组 AT 命令解析框架课程正式发布
stm32·嵌入式·at命令解析框架
CODECOLLECT6 小时前
京元 I62D Windows PDA 技术拆解:Windows 10 IoT 兼容 + 硬解码模块,如何降低工业软件迁移成本?
stm32·单片机·嵌入式硬件
BackCatK Chen6 小时前
STM32+FreeRTOS:嵌入式开发的黄金搭档,未来十年就靠它了!
stm32·单片机·嵌入式硬件·freertos·低功耗·rtdbs·工业控制
全栈游侠9 小时前
STM32F103XX 02-电源与备份寄存器
stm32·单片机·嵌入式硬件
Lsir10110_9 小时前
【Linux】中断 —— 操作系统的运行基石
linux·运维·嵌入式硬件
深圳市九鼎创展科技11 小时前
瑞芯微 RK3399 开发板 X3399 评测:高性能 ARM 平台的多面手
linux·arm开发·人工智能·单片机·嵌入式硬件·边缘计算
辰哥单片机设计11 小时前
STM32项目分享:车辆防盗报警系统
stm32·单片机·嵌入式硬件
風清掦13 小时前
【江科大STM32学习笔记-05】EXTI外部中断11
笔记·stm32·学习
小龙报13 小时前
【51单片机】从 0 到 1 玩转 51 蜂鸣器:分清有源无源,轻松驱动它奏响新年旋律
c语言·数据结构·c++·stm32·单片机·嵌入式硬件·51单片机
范纹杉想快点毕业13 小时前
嵌入式与单片机开发核心学习指南——从思维转变到第一性原理的深度实践
单片机·嵌入式硬件