STM32F030F4 之ADC使用

//==文件adc.h============================================================

#ifndef __ADC_H

#define __ADC_H

#include stm32f0xx.h

#define Adc_Channel_Num             4       //ADC通道数目

//========各通道在结果列表中的位置===================

#define     Adc_Data_IS               0

#define     Adc_Data_Bat                1

#define     Adc_Data_Vr                 2

#define     Adc_Data_NTC                3

//=======AD通道定义==========================================

#define     ADC_CHANNEL_IS               ADC_Channel_5 //电流检测

#define     ADC_CHANNEL_BAT              ADC_Channel_1 //电池电压检测

#define     ADC_CHANNEL_VR               ADC_Channel_0  //电位器通道

#define     ADC_CHANNEL_NTC              ADC_Channel_2  //NTC通道

//=========================================

extern __IO uint16_t RegularConvData_Tab[Adc_Channel_Num];

//extern uint16_t R_AdcResult_Tab[Adc_Channel_Num] ;

extern uint32_t Adc_Channel_Tab[Adc_Channel_Num] ;

extern uint32 Adc_Index ;

extern void ADC_GPIO_Init(void) ;

extern  void ADC1_Init(void);

extern uint16 Adc_Switch(uint32 ADC_Channel) ;

extern void Adc_StartSwitch(uint32 ADC_Channel) ;

#endif /* __ADC_H */

//==文件adc.c============================================================

#include global.h

#include adc.h

/* Private typedef -----------------------------------------------------------*/

/* Private define ------------------------------------------------------------*/

#define ADC1_DR_Address                0x40012440

__IO uint16_t RegularConvData_Tab[Adc_Channel_Num]; //adc转换结果表

//uint16_t R_AdcResult_Tab[Adc_Channel_Num]; //adc转换结果表-最终取值表

uint32_t Adc_Channel_Tab[Adc_Channel_Num]={ADC_CHANNEL_IS,ADC_CHANNEL_BAT,ADC_CHANNEL_VR,ADC_CHANNEL_NTC} ;//adc转换通道表

uint32 Adc_Index = 0 ; //adc转换索引

/*******************************************************************************

* 函数名称: ADC_GPIO_Init();

* 功能描述: ADC--GPIO输入引脚配置---在此可以设置16路外部输入通道

* 输入参数: void

* 返回参数: 无

********************************************************************************/

void ADC_GPIO_Init(void)

{  

    GPIO_InitTypeDef  GPIO_InitStructure;

    /* Enable  GPIOA clock */

    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);

    //==================VR========================PA4                                                           

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_5 ;                

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;

//  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;

    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; //AD无需要上下拉

//  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  // 做输入时不用设置速率

    GPIO_Init(GPIOA, &GPIO_InitStructure);

    

}

/*******************************************************************************

* 函数名称: ADC1_Init

* 功能描述:

* 输入参数: void

* 返回参数: 无

********************************************************************************/

void ADC1_Init(void)

{

    

  ADC_InitTypeDef     ADC_InitStruct;

//  DMA_InitTypeDef     DMA_InitStruct;

      /* ADC1 DeInit */

  ADC_DeInit(ADC1);

  /* ADC1 Periph clock enable */

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);

  RCC_ADCCLKConfig(RCC_ADCCLK_PCLK_Div4) ; //时钟分频48M/4=12M 最大时钟不超过14M

  

//   /* ADC DMA request in circular mode */

  ADC_DMARequestModeConfig(ADC1, ADC_DMAMode_Circular);

  

  /* Enable ADC_DMA */

//  ADC_DMACmd(ADC1, ENABLE); 

  ADC_DMACmd(ADC1, DISABLE); 

    

  /* Initialize ADC structure */

  ADC_StructInit(&ADC_InitStruct);

  

  /* Configure the ADC1 in continous mode withe a resolutuion equal to 12 bits  */

  ADC_InitStruct.ADC_Resolution = ADC_Resolution_12b;

  ADC_InitStruct.ADC_ContinuousConvMode = DISABLE ;//ENABLE;

  ADC_InitStruct.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;

  ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;

  ADC_InitStruct.ADC_ScanDirection = ADC_ScanDirection_Upward;//ADC_ScanDirection_Backward;

  ADC_Init(ADC1, &ADC_InitStruct);

 

//   /* Convert the ADC1 temperature sensor  with 55.5 Cycles as sampling time */

//   ADC_ChannelConfig(ADC1, ADC_Channel_TempSensor , ADC_SampleTime_55_5Cycles); 

//   ADC_TempSensorCmd(ENABLE);

  

  /* Convert the ADC1 Vref  with 55.5 Cycles as sampling time */

  ADC_ChannelConfig(ADC1, ADC_Channel_0  , ADC_SampleTime_55_5Cycles);

  ADC_ChannelConfig(ADC1, ADC_Channel_1  , ADC_SampleTime_55_5Cycles);

  ADC_ChannelConfig(ADC1, ADC_Channel_2  , ADC_SampleTime_55_5Cycles);

  ADC_ChannelConfig(ADC1, ADC_Channel_5  , ADC_SampleTime_55_5Cycles);

   

//   ADC_VrefintCmd(ENABLE);

    

  /* ADC Calibration  校验 */

  ADC_GetCalibrationFactor(ADC1);

  ADC_DMACmd(ADC1, ENABLE);

  /* Enable ADC1 */

  ADC_Cmd(ADC1, ENABLE);    

  

  /* Wait the ADCEN falg */

  while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADEN));

  

  /* ADC1 regular Software Start Conv */

  ADC_StartOfConversion(ADC1);

  

}

/*******************************************************************************

* 函数名称: Adc_Switch

* 功能描述: ADC转换

* 输入参数: ADC转换通道标号

* 返回参数: 该通道的转换结果

********************************************************************************/

uint16 Adc_Switch(uint32 ADC_Channel)

{

    ADC1->CHSELR = 0 ;

    ADC1->CHSELR = (uint32_t)ADC_Channel;    //选择通道

  /* ADC1 regular Software Start Conv */

  ADC_StartOfConversion(ADC1);  //启动转换

  while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET) ; //等级转换

    return ADC_GetConversionValue(ADC1) ;

}

/*******************************************************************************

* 函数名称: Adc_StartSwitch

* 功能描述: ADC转换

* 输入参数: ADC转换通道标号

* 返回参数: 该通道的转换结果

********************************************************************************/

void Adc_StartSwitch(uint32 ADC_Channel)

{

    ADC1->CHSELR = 0 ;

    ADC1->CHSELR |= (uint32_t)ADC_Channel;   //选择通道

  /* ADC1 regular Software Start Conv */

  ADC_StartOfConversion(ADC1);  //启动转换

//  while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET) ; //等级转换

//  return ADC_GetConversionValue(ADC1) ;

}

原文地址:https://www.cnblogs.com/beiyhs/p/11412273.html

时间: 2024-08-30 16:16:35

STM32F030F4 之ADC使用的相关文章

重学STM32---(五)ADC

这两天把外部中断和ADC看了下,个人感觉外部中断不是很难,也就没有把记下来了,毕竟写这个挺浪费时间.ADC是比较复杂的,如果想让完全自由的运用ADC必须经过多次实践可能才可以.由于已经学过库函数,也就打算自己看数据手册写了一个简单的寄存器版的ADC,期间也遇到了很多问题,幸好都解决了. 把这次学习的重点都记下来,以后再看不知是什么感觉O(∩_∩)O哈哈~ 1. 模拟看门狗特性允许应用程序检测输入电压是否超出用户定义的高/低阀值. ADC的输入时钟不得超过14MHz,它是由PCLK2经分频产生.

1.13裸机ADC部分

1.13.1.ADC的引入 1.13.1.1.什么是ADC (1)ADC:analog digital converter ,AD转换,模数转换(也就是模拟转数字) (2)CPU本身是数数字的,而外部世界变量(如电压.温度.高度.压力)都是模拟的,所以需要用CPU来处理这些外部的模拟量的时候就需要做AD转换 1.13.1.2.为什么需要ADC (1)为了用数字技术来处理外部的模拟量 1.13.1.3.关于模拟量和数字量 (1)模拟的就是连续的,显示生活中的时间.电压.高度等都是模拟的(连续分布的

利用STM32CubeMX来生成USB_HID_Mouse工程【添加ADC】(2)【非dma和中断方式】

上回讲到怎么采集一路的adc的数据,这次我们来采集两路的数据. 现在直接修改原先的代码 /* Private variables ---------------------------------------------------------*/ uint16_t AD_Value_Buf[2]; uint16_t AD_X_Value = 0; uint16_t AD_Y_Value = 0; /* USER CODE END PV */ /* USER CODE BEGIN 3 */ fo

STM32F0的多路ADC 无DMA

前段时间几乎用了一下午的时间, 就为了调F0的两路ADC, 一开始想的办法是将采样的连续模式(ADC_ContinuousConvMode)使能, 然后连续拿两个值, 拿完分别返回. 坏处不用说, 看着就傻, 就算你只需要一个ADC通道的值, 也要拿足N个, 比如你一共要拿5个ADC引脚的电压, 那就要全拿, 然后取其中第若干个, 如果你要拿8个做平均, 就要把时间再乘8, 看着就蠢. 但是反复调试发现如果不连续采样, 第一次ok, 但是后面每次就只采后一个通道了, 很奇怪, 结果发现原来是居然

【ADC】ADC初始化的注意事项

ADC的初始化如果没设置好,对于整个系统是有很大的影响的,首先就是拖慢采集速度. 再有就是没打开通道没有检测.那直接看710的ADC初始化代码来理解吧 要用的引脚需要先设置为输入. 27     AD1PCFGH=0XFFFF;                        //选择AN0引脚作为模拟输入28     AD1PCFGL=0XFFF0; 这两个寄存器设置需要注意,0为模拟输入,所以你要多个采集的话就要把那几位置零了 AD1CSSL=0X0001;                  

MAX10 ADC的一些基知识

MAX10 ADC 的一些知识 1.        MAX 10 内部集成的12bit SAR ADC的特点为: a.        采样速率高达1Mhz. b.        模拟通道多达18个,单个ADC多达17个,双ADC器件中有16个双功能ADC通道,2个专用的ADC. c.         提供单端测量功能. d.        双ADC器件的专用模拟输入管脚具备同步测量功能.因两个专用的管脚的封装布线是匹配的.而双功能管脚,两个ADC模块之间的布线延时在同步测量中导致数据失配.另外I

ADC类型总结

1.SAR型 (逐次逼近型) 摘要:逐次逼近寄存器型(SAR)模数转换器(ADC)占据着大部分的中等至高分辨率ADC市场.SAR ADC的采样速率最高可达5Msps,分辨率为8位至18位.SAR架构允许高性能.低功耗ADC采用小尺寸封装,适合对尺寸要求严格的系统. 本文说明了SAR ADC的工作原理,采用二进制搜索算法,对输入信号进行转换.本文还给出了SAR ADC的核心架构,即电容式DAC和高速比较器.最后,对SAR架构与流水线.闪速型以及Σ-Δ ADC进行了对比. 引言 逐次逼近寄存器型(S

STM32 ADC基础与多通道采样

12位ADC是一种逐次逼近型模拟数字数字转换器.它有多达18个通道,可测量16个外部和2个内部信号源.ADC的输入时钟不得超过14MHZ,它是由PCLK2经分频产生.如果被ADC转换的模拟电压低于低阀值或高于高阀值,AWD模拟看门狗状态位被设置. ADC通常要与DMA一起使用 这里只是简单的用库配置ADC 不断扫描来实现ADC的应用. 配置DMA: void DMA_Config(void) { DMA_InitTypeDef DMA_InitStructure;//定义DMA初始化结构体 DM

HAL驱动库学习-ADC

如何使用ADC驱动库 1  实现如下两个函数 a: HAL_ADC_MspInit()使能ADC时钟,设置时钟源, 使能ADC Pin,设置为输入模式,可选 DMA,中断 b:HAL_ADC_MspDeInit() 与 HAL_ADC_MspInit()作用相反,用来关闭ADC,可选 DMA,中断 2  配置ADC参数,详细参数描述参考ADC属性定义.通过HAL_ADC_Init()来加载参数 3  配置ADC通道,包括使用的通道,采样时间等 HAL_ADC_ConfigChannel() 4