STM32F405--ADC多通道(单次转换、非扫描模式、软件触发)

功能描述:使用STM32F405RGT6的ADC1的通道4和通道5分别对输入到PA4和PA5上的模拟电压进行模数转换,并在OLED上显示ADC的原始采样值和实际电压值。ADC配置为独立模式、单通道、单次转换、非扫描模式、软件触发。

  • main.c文件内容如下
#include "stm32f4xx.h"                  // Device header
#include "OLED.h"
#include "MyADC.h"

uint16_t ADC_Value;
double Voltage;

int main(void)
{
	MyADC_Init();
	OLED_Init();
	
	OLED_Clear();	//清屏OLED
	OLED_Refresh();	//刷新OLED
	
	while(1)
	{
		ADC_Value = MyADC_GetValue(ADC_Channel_4);			//获取ADC1通道4的采样值
		Voltage = ((double)ADC_Value/4096)*3.3;				//计算对应的电压
		OLED_Printf(0,0,8,"ADC_Value = %d",ADC_Value);		//显示ADC采样值
		OLED_Printf(0,16,8,"Voltage = %.2lfV",Voltage);		//显示电压值
		
		ADC_Value = MyADC_GetValue(ADC_Channel_5);			//获取ADC1通道5的采样值
		Voltage = ((double)ADC_Value/4096)*3.3;				//计算对应的电压
		OLED_Printf(0,32,8,"ADC_Value = %d",ADC_Value);		//显示ADC采样值
		OLED_Printf(0,48,8,"Voltage = %.2lfV",Voltage);		//显示电压值
		
		OLED_Refresh();										//刷新OLED
	}
}

  • MyADC.c文件内容如下
#include "MyADC.h"           

/**
  * @摘要  		初始化ADC和相应的GPIO
  * @参数  		无
  * @返回值  	无
  * @说明  		无
  */
void MyADC_Init(void)
{
	//开启GPIOA的时钟
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
	
	//定义GPIO初始化结构体
	GPIO_InitTypeDef GPIO_InitStructure;
	//初始化上述结构体
	GPIO_StructInit(&GPIO_InitStructure);
	//配置GPIO模式为模拟输入模式
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
	//配置GPIO输出类型为推挽输出(此处无用)
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
	//指定GPIO引脚为Pin4和Pin5
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;
	//配置GPIO输入类型为浮空输入(此处无用)
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
	//配置GPIO的速度为快速50MHZ
	GPIO_InitStructure.GPIO_Speed = GPIO_Fast_Speed;
	//初始化对应的GPIO
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	//开启ADC1的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
	
	//定义所有ADC共用配置的初始化结构体
	ADC_CommonInitTypeDef ADC_CommonInitStructure;
	//初始化上述结构体
	ADC_CommonStructInit(&ADC_CommonInitStructure);
	//配置为独立模式
	ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
	//配置ADC时钟的预分频器的值为4,即21MHZ(<30MHZ)
	ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4;
	//失能DMA
	ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;
	//配置多ADC模式下的两个ADC采样间隔(此处无用)
	ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_8Cycles;
	//初始化所有ADC共用配置
	ADC_CommonInit(&ADC_CommonInitStructure);
	
	//定义ADC初始化结构体
	ADC_InitTypeDef ADC_InitStructure;
	//初始化上述结构体
	ADC_StructInit(&ADC_InitStructure);
	//配置ADC分辨率为12位
	ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
	//配置ADC为单次转换模式
	ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
	//配置ADC为非扫描模式
	ADC_InitStructure.ADC_ScanConvMode = DISABLE;
	//配置ADC数据对齐方式为右对齐
	ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
	//配置ADC外部触发为无,即关闭外部触发
	ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
	//配置ADC外部触发源为TIM2的TRGO输出(此处无用)
	ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T2_TRGO;
	//配置ADC转换通道数为1(此处无用)
	ADC_InitStructure.ADC_NbrOfConversion = 1;
	//初始化对应的ADC
	ADC_Init(ADC1, &ADC_InitStructure);
	
	//开启ADC1,此时ADC1进入等待触发的状态
	ADC_Cmd(ADC1, ENABLE);
}

/**
  * @摘要  		软件触发ADC并读取采样值
  * @参数  		无
  * @返回值  	ADC的采样值
  * @说明  		无
  */
uint16_t MyADC_GetValue(uint8_t ADC_Channel)
{
	//配置每一个规则通道的排序和采样周期,此处用来选择转换哪一个通道
	ADC_RegularChannelConfig(ADC1, ADC_Channel, 1, ADC_SampleTime_56Cycles);
	//软件触发ADC1,此时ADC1进入采样转换状态
	ADC_SoftwareStartConv(ADC1);
	//等待ADC1转换完成
	while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC) == RESET);
	//转换完成后,ADC1又进入等待触发的状态
	
	//返回ADC1的采样值
	return ADC_GetConversionValue(ADC1);
}

  • MyADC.h文件内容如下
#ifndef __MYADC_H
#define __MYADC_H

#include "stm32f4xx.h"                  // Device header

void MyADC_Init(void);
uint16_t MyADC_GetValue(uint8_t ADC_Channel);

#endif

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值