码迷,mamicode.com
首页 > 其他好文 > 详细

STM32F030 ADC应用

时间:2015-07-21 18:42:26      阅读:153      评论:0      收藏:0      [点我收藏+]

标签:stm32

//==文件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) ; 
}



版权声明:本文为博主原创文章,未经博主允许不得转载。

STM32F030 ADC应用

标签:stm32

原文地址:http://blog.csdn.net/libiaojs/article/details/46988943

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!