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);
		
	}
	
	
}
相关推荐
2401_8628808216 分钟前
input 子系统框架 、platform 驱动框架
linux·驱动开发·嵌入式硬件
Industio_触觉智能24 分钟前
瑞芯微AI算力NPU路线图与协处理器|触觉智能瑞芯微RK方案商出品
人工智能·嵌入式硬件·硬件架构·智能硬件·npu·瑞芯微·端侧ai
女神下凡1 小时前
嵌入式系统 vs 嵌入式文件系统
arm开发·嵌入式硬件·设计规范
芯岭技术1 小时前
XL2400T收发芯片,2.4G无线荧光棒控光解决方案,+PA距离可达700M
单片机·嵌入式硬件·物联网
HPT_Lt2 小时前
ZCC485符合RS485、422通信协议高速超低功耗接口芯片
嵌入式硬件
艾芯微科技2 小时前
ETA1637S2G|钰泰同步升压 LED 背光驱动 SOT23-6,0.1% 超低占空比 PWM 调光
网络·单片机·嵌入式硬件·集成测试·51单片机
女神下凡2 小时前
芯参谋(55):LED 驱动 · 系统设计指南
arm开发·单片机·嵌入式硬件·硬件工程·设计规范
姓刘的哦2 小时前
STM32外扩SRAM
stm32
深圳市恒锐丰科技杨生3 小时前
LR010N04SD10 N 沟道 SGT‑MOSFET|Long‑Tek 龙夏电子
嵌入式硬件·硬件工程
西城微科方案开发3 小时前
方案商|西城微科胎压计方案开发
单片机·嵌入式硬件