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);
		
	}
	
	
}
相关推荐
Do vis8242 小时前
STM32第一天建立工程
stm32
蓑衣客VS索尼克2 小时前
单片机中的基础外设GPIO的知识和应用—(6)
笔记·stm32·单片机·嵌入式硬件
云山工作室5 小时前
基于单片机的智慧农业大棚系统(论文+源码)
单片机·嵌入式硬件
柒十三.5 小时前
江科大51单片机笔记【10】蜂鸣器(上)
笔记·嵌入式硬件·51单片机
zephyr_zeng6 小时前
VsCode + EIDE + OpenOCD + STM32(野火DAP) 开发环境配置
c语言·c++·vscode·stm32·单片机·嵌入式硬件·编辑器
鹿屿二向箔6 小时前
72MHz的MCU能支持多大频率的传感器数据采样率?
服务器·网络·单片机
美好的事情总会发生7 小时前
SDIO(Secure Digital Input Output)详解
linux·嵌入式硬件·硬件工程
柒月玖.7 小时前
基于AT89C51单片机的家用全自动洗衣机设计
单片机·嵌入式硬件
Moonnnn.9 小时前
51单片机——程序执行过程(手工汇编)
汇编·笔记·嵌入式硬件·学习·51单片机
派阿喵搞电子9 小时前
STM32的APB1和APB2的区别
stm32·单片机·嵌入式硬件