STM32 AD多通道

接线图:

代码配置:

与单通道相比,将多路选择从初始化函数,调用到功能函数里,在功能函数里以此调用需要使用的通道

整体代码:

cs 复制代码
//AD多通道
void AD_Init2(void)
{
	//定义结构体变量
	GPIO_InitTypeDef GPIO_InitStructure;//定义GPIO结构体变量
	ADC_InitTypeDef ADC_InitStructure;  //定义ADC结构体变量
	
	//开启RCC时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);//开启ADC1的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//开启GPIO A族时钟
  RCC_ADCCLKConfig(RCC_PCLK2_Div6);                   //配置分频器 选择6分频 分频之后ADCCLK = 72MHz/6 = 12MHz
	
	//配置GPIO
	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);   //GPIO初始化
	
	
	
	
	//配置ADC转换器
	ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;//选择连续转换模式还是单次转换 本次单次转换
	ADC_InitStructure.ADC_DataAlign =ADC_DataAlign_Right; //指定ADC数据是左对齐还是右对齐 这次选择右对齐
	ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//触发控制的触发源 本次使用软件触发
	ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;//配置独立模式还是双ADC模式 这里选独立模式
	ADC_InitStructure.ADC_NbrOfChannel = 1;//在扫描模式下,总共会用到几个通道 
	ADC_InitStructure.ADC_ScanConvMode = DISABLE;//选择扫描模式还是非扫描模式 本次非扫描
	ADC_Init(ADC1, &ADC_InitStructure);
	
	//开关控制 开启ADC
	ADC_Cmd(ADC1,ENABLE);//开启ADC电源
	
	//校准
	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);//获取转换结果
	
}

主函数:

cs 复制代码
#include "AD.h"
int main(void)
{
	uint16_t AD0, AD1, AD2, AD3;
	OLED_Init();
	AD_Init2();
	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);
		
	}
	
	
}
相关推荐
三佛科技-1873661339711 分钟前
辉芒微FT62FC1x低成本小体积定时器触摸MCU芯片选型深度解析
单片机·嵌入式硬件
独小乐30 分钟前
018.使用I2C总线EEPROM|千篇笔记实现嵌入式全栈/裸机篇
linux·笔记·单片机·嵌入式硬件·arm·信息与通信
C^h1 小时前
rtthread控制达妙4310电机
数据库·单片机·嵌入式硬件
三佛科技-187366133971 小时前
LP3717BSL 12V1A隔离型极简化自供电充电器适配器电源方案测试报告
单片机·嵌入式硬件
一路往蓝-Anbo2 小时前
第二章:STM32 bxCAN 控制器详解:从内存到总线的“中转站”
stm32·单片机·嵌入式硬件·软件工程
jucat3 小时前
定时排气扇
嵌入式硬件
Dunkle.T3 小时前
DC-DC PCB设计要点说明——拓扑、走线、选型、铺铜详解
单片机·嵌入式硬件·pcb·dc-dc
Lugas Luo3 小时前
DVR 存储工具深度分析报告 (测试与产品视角)
linux·嵌入式硬件·测试工具
charlie1145141913 小时前
嵌入式C++工程实践——第13篇:第一次重构 —— enum class取代宏,类型安全的开始
开发语言·c++·vscode·stm32·安全·重构·现代c++
菜鸟的学习日记、4 小时前
电气元件介绍(一)——电阻
嵌入式硬件·上拉电阻·下拉电阻·电阻·电气元件