STM32F030F4 之ADC使用

Posted beiyhs

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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) ;

以上是关于STM32F030F4 之ADC使用的主要内容,如果未能解决你的问题,请参考以下文章

基于STM32F030F4P9和STM32 CUBEMX 输出PWM波形

STM32F4 ADC模块使用不同DMA模式的区别和对比

stm32f030f4p6 i2c地址是多少?

STM32F030F4P6这个单片机怎么样?

STM32F030F4P6 仅在从闪存启动时运行中断处理程序。从引导加载程序启动时重置

STM32F030F4P6这个单片机怎么样?