stm32-模拟数字转化器ADC

 

 接线图:

#include "stm32f10x.h"                  // Device header
		//1: 开启RCC时钟,包括ADC和GPIO的时钟
		//2:配置GPIO将GPIO配置为模拟输入模式
		//3:配置多路开关将左边的通道接入到规则组中
		//4:配置ADC转换器,单次转换,连续转换,扫描还是非扫描
		//5:开关控制调用ADC_COM参数ADC配置完成就能正常工作
void AD_Init(void){
// void RCC_ADCCLKConfig(uint32_t RCC_PCLK2); RCC_ADCCLKConfig配置ADCCLK分频器
// void ADC_DeInit(ADC_TypeDef* ADCx); 恢复缺省配置
// void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct); Init初始化
// void ADC_StructInit(ADC_InitTypeDef* ADC_InitStruct); 结构体初始化
// void ADC_Cmd(ADC_TypeDef* ADCx, FunctionalState NewState); 给ADC上电
// void ADC_DMACmd(ADC_TypeDef* ADCx, FunctionalState NewState); 开始DMA输出信号
// void ADC_ITConfig(ADC_TypeDef* ADCx, uint16_t ADC_IT, FunctionalState NewState); // 中断输出控制
// void ADC_ResetCalibration(ADC_TypeDef* ADCx); 复位校准
// FlagStatus ADC_GetResetCalibrationStatus(ADC_TypeDef* ADCx);获取复位校准状态
// void ADC_StartCalibration(ADC_TypeDef* ADCx); 开始校准
// FlagStatus ADC_GetCalibrationStatus(ADC_TypeDef* ADCx); 获取开始校准状态
// void ADC_SoftwareStartConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState); ADC软件开始转换函数用于软件触发的函数
// FlagStatus ADC_GetSoftwareStartConvStatus(ADC_TypeDef* ADCx); ADC获取软件开始转换状态
// void ADC_DiscModeChannelCountConfig(ADC_TypeDef* ADCx, uint8_t Number); 配置间断模式每隔几个通道间断一次
// void ADC_DiscModeCmd(ADC_TypeDef* ADCx, FunctionalState NewState); 是否启用间断模式
// void ADC_RegularChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime); ADC规则组通道配置
// void ADC_ExternalTrigInjectedConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState); ADC外部触发转换控制是否允许外部触发转换
// uint16_t ADC_GetInjectedConversionValue(ADC_TypeDef* ADCx, uint8_t ADC_InjectedChannel); ADC获取外部触发转换值
// uint16_t ADC_GetConversionValue(ADC_TypeDef* ADCx); 获取ADC转换的数据寄存器,读取电平转换结果需要使用这个函数
// uint32_t ADC_GetDualModeConversionValue(void); ADC_获取双模式转换值,ADC双模式读取转换结果的函数
// 以下的三个函数是对模拟看门狗进行配置的函数:第一个是是否启动模拟看门狗,第二个是配置高低阈值,第三个是配置看门的通道
// void ADC_AnalogWatchdogCmd(ADC_TypeDef* ADCx, uint32_t ADC_AnalogWatchdog);
// void ADC_AnalogWatchdogThresholdsConfig(ADC_TypeDef* ADCx, uint16_t HighThreshold, uint16_t LowThreshold);
// void ADC_AnalogWatchdogSingleChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel);
// void ADC_TempSensorVrefintCmd(FunctionalState NewState); ADC温度传感器,内部参考电压控制
// 以下的4个函数:第一个是获取标志位状态,第二个是清除标志位,第三个获取中断状态,第四个清除中断挂起位
// FlagStatus ADC_GetFlagStatus(ADC_TypeDef* ADCx, uint8_t ADC_FLAG);
// void ADC_ClearFlag(ADC_TypeDef* ADCx, uint8_t ADC_FLAG);
// ITStatus ADC_GetITStatus(ADC_TypeDef* ADCx, uint16_t ADC_IT);
// void ADC_ClearITPendingBit(ADC_TypeDef* ADCx, uint16_t ADC_IT);
	
	
}

AD.C代码

#include "stm32f10x.h"                  // Device header
		//	  1: 开启RCC时钟,包括ADC和GPIO的时钟
		//    2:配置GPIO将GPIO配置为模拟输入模式
		//	  3:配置多路开关将左边的通道接入到规则组中
		//    4:配置ADC转换器,单次转换,连续转换,扫描还是非扫描
		//	  5:开关控制调用ADC_COM参数ADC配置完成就能正常工作
		 
void AD_Init(void){
	  
	  // 开启ADC的时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
	  // 开启GPIOA的时钟
	  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	  // 配置ADC_CLK,72MHz/6 = 12MHz
	  RCC_ADCCLKConfig(RCC_PCLK2_Div6);
	  // 配置GPIO
	  GPIO_InitTypeDef GPIO_InitStructre;
	  // 将GPIO的模式引用出来
	  GPIO_InitStructre.GPIO_Mode =GPIO_Mode_AIN;       //  选择GPIO的模式,设置为AN模拟输入的模式在AIN模式下GPIO口是没有效果的
	  GPIO_InitStructre.GPIO_Pin = 	GPIO_Pin_0;         //  选择GPIO的输出模式,选择输出的管脚
	  GPIO_InitStructre.GPIO_Speed = GPIO_Speed_50MHz;  //  选择GPIO的时钟频率
	  GPIO_Init(GPIOA,&GPIO_InitStructre);              //  初始化GPIO
	
	  // 第二步 ---》 选择规则组的输入通道,参数二:指定通道,参数三:规则组序列器里面的次序1-16之间,参数4:指定通道的采样时间
	  ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_239Cycles5); 
	  
	  // 第三步 ---> 使用结构体初始化ADC
	  ADC_InitTypeDef ADC_InitStructure;
	  // 引出结构体成员
	  ADC_InitStructure.ADC_ContinuousConvMode = DISABLE ;                //  配置扫描的模式
		ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;              //  配置ADC的数据对齐方式
		ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //  配置ADC的外部触发转换选择:这里使用内部软件触发的方式
		ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;                  //  配置ADC的工作模式为独立模式
		ADC_InitStructure.ADC_NbrOfChannel = 1;                             //  配置通道数目
		ADC_InitStructure.ADC_ScanConvMode = DISABLE;                       //  配置扫描的模式
	  ADC_Init(ADC1,&ADC_InitStructure);
	
	  // 以下还可以配置中断和模拟看门狗,根据自己的需求进行配置
		
		
		// 开启ADC设置,第一个ENABLE第二个开启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(void){
    // 1: 软件触发转换 2:等待触发完成也就是等待EOC标志位设置为1,3:读取ADC数据寄存器
	  ADC_SoftwareStartConvCmd(ADC1,ENABLE); 
	  // 获取标志位状态共有5个参数,
	  // 第一个参数AWD模拟看门狗标志位,
	  // 第二个参数EOC规则组转换完成标志位,
	  // 第三个参数JEOC注入组转换完成标志位,
	  // 第四个参数:JSTRT:注入组开始转换标志位,
	  // 第五个参数:STRT规则组开始转换标志位
	  while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET); // 这里添加一个while空循环实现一个等待的过程
    // 获取ADC的结果--->使用ADC获取转换值的方式
	  return ADC_GetConversionValue(ADC1);
}


AD.H代码

#ifndef __AD_H
#define __AD_H

uint16_t AD_GetValue(void);
void AD_Init(void);

#endif

main函数代码

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "AD.h"

uint16_t ADValue;
float Votage;
int main(void)
{
  // 初始化oled
	OLED_Init();
	AD_Init();
	
	OLED_ShowString(1,1,"ADVALUE!");
  OLED_ShowString(2,1,"Votage:0.00V");
	
	while (1)
	{
	  ADValue = AD_GetValue();
		Votage = (float)ADValue / 4095 * 3.3;
		OLED_ShowNum(1, 9, ADValue, 4); 
		OLED_ShowNum(2, 9, Votage,  1); 
		OLED_ShowNum(2, 11, (int)(Votage * 100) % 100,  1);
		Delay_ms(100);
	}
}

切换为连续转换模式需要修改的代码

相关推荐

  1. STM32ADC采集传感器的模拟数据

    2024-03-19 16:00:04       31 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-19 16:00:04       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-19 16:00:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-19 16:00:04       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-19 16:00:04       20 阅读

热门阅读

  1. C语言经典例题 --- 公因数、素数、闰年

    2024-03-19 16:00:04       18 阅读
  2. 零基础学python:8、 函数的基础

    2024-03-19 16:00:04       23 阅读
  3. Electron框架初识:原理与实践优势深度解读

    2024-03-19 16:00:04       14 阅读
  4. 2分钟速览!chatgpt的使用方法

    2024-03-19 16:00:04       17 阅读
  5. 创建存储过程,与存储过程调用

    2024-03-19 16:00:04       26 阅读
  6. linux命令学习之split 分割大文件 —— 筑梦之路

    2024-03-19 16:00:04       17 阅读
  7. 24计算机考研调剂 | 浙江科技大学

    2024-03-19 16:00:04       15 阅读
  8. 一文解读ISO26262安全标准:初步危害分析PHA

    2024-03-19 16:00:04       16 阅读