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);
		
	}
	
	
}
相关推荐
rit84324995 分钟前
STC8单片机模拟AD转换程序(NTC测温)
单片机·嵌入式硬件
szxinmai主板定制专家10 分钟前
基于 STM32 + FPGA 船舶电站控制器设计与实现
arm开发·人工智能·stm32·嵌入式硬件·fpga开发·架构
我不是程序猿儿12 分钟前
【嵌入式】编码器计数倍频,机械一格与电气计数
stm32·单片机·嵌入式硬件·学习
Hello World . .14 分钟前
51单片机基础外设:GPIO(以LED、按键、数码管为例)
单片机·嵌入式硬件
Flamingˢ18 分钟前
基于ARM的裸机程序设计和开发(三):C编程基础与Zynq裸机开发常用方法
c语言·arm开发·单片机
Crazyong2 小时前
FreeRTOS-CPU使用率统计
单片机·嵌入式硬件
_Ningye9 小时前
STM32 — 6.1 TIM定时中断
stm32·单片机·嵌入式硬件
小白学电子_9 小时前
proteus仿真51单片机通过矩阵按键和数码管制作简单计算器
嵌入式硬件·51单片机·proteus
非鱼䲆鱻䲜11 小时前
vscode开发stm32添加新的头文件路径和包含源文件
ide·vscode·stm32·cmake·包含头文件·包含源文件
FreakStudio11 小时前
把 Flask 搬进 ESP32,高中生自研嵌入式 Web 框架 MicroFlask !
python·单片机·嵌入式·cortex-m3·异步编程·电子diy