STM32(X):ADC

概述

ADC_Init()函数

函数声明:void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct);

  1. ADCx参数有效性
    assert_param(IS_ADC_ALL_PERIPH(ADCx));

    #define IS_ADC_ALL_PERIPH(PERIPH) (((PERIPH) == ADC1) || \
                                       ((PERIPH) == ADC2) || \
                                       ((PERIPH) == ADC3))
    
  2. 结构体参数有效性

    typedef struct
    {
      uint32_t ADC_Mode;  
      FunctionalState ADC_ScanConvMode;      
      FunctionalState ADC_ContinuousConvMode; 
      uint32_t ADC_ExternalTrigConv;        
      uint32_t ADC_DataAlign;                
      uint8_t ADC_NbrOfChannel;              
    }ADC_InitTypeDef;
    
      assert_param(IS_ADC_MODE(ADC_InitStruct->ADC_Mode));
      assert_param(IS_FUNCTIONAL_STATE(ADC_InitStruct->ADC_ScanConvMode));
      assert_param(IS_FUNCTIONAL_STATE(ADC_InitStruct->ADC_ContinuousConvMode));
      assert_param(IS_ADC_EXT_TRIG(ADC_InitStruct->ADC_ExternalTrigConv));   
      assert_param(IS_ADC_DATA_ALIGN(ADC_InitStruct->ADC_DataAlign)); 
      assert_param(IS_ADC_REGULAR_LENGTH(ADC_InitStruct->ADC_NbrOfChannel));
    
    #define IS_ADC_MODE(MODE) (((MODE) == ADC_Mode_Independent) || \
                               ((MODE) == ADC_Mode_RegInjecSimult) || \
                               ((MODE) == ADC_Mode_RegSimult_AlterTrig) || \
                               ((MODE) == ADC_Mode_InjecSimult_FastInterl) || \
                               ((MODE) == ADC_Mode_InjecSimult_SlowInterl) || \
                               ((MODE) == ADC_Mode_InjecSimult) || \
                               ((MODE) == ADC_Mode_RegSimult) || \
                               ((MODE) == ADC_Mode_FastInterl) || \
                               ((MODE) == ADC_Mode_SlowInterl) || \
                               ((MODE) == ADC_Mode_AlterTrig))
                           	                         
    
    #define IS_FUNCTIONAL_STATE(STATE) (((STATE) == DISABLE) || ((STATE) == ENABLE))
    
    #define IS_ADC_EXT_TRIG(REGTRIG) (((REGTRIG) == ADC_ExternalTrigConv_T1_CC1) || \
                                  ((REGTRIG) == ADC_ExternalTrigConv_T1_CC2) || \
                                  ((REGTRIG) == ADC_ExternalTrigConv_T1_CC3) || \
                                  ((REGTRIG) == ADC_ExternalTrigConv_T2_CC2) || \
                                  ((REGTRIG) == ADC_ExternalTrigConv_T3_TRGO) || \
                                  ((REGTRIG) == ADC_ExternalTrigConv_T4_CC4) || \
                                  ((REGTRIG) == ADC_ExternalTrigConv_Ext_IT11_TIM8_TRGO) || \
                                  ((REGTRIG) == ADC_ExternalTrigConv_None) || \
                                  ((REGTRIG) == ADC_ExternalTrigConv_T3_CC1) || \
                                  ((REGTRIG) == ADC_ExternalTrigConv_T2_CC3) || \
                                  ((REGTRIG) == ADC_ExternalTrigConv_T8_CC1) || \
                                  ((REGTRIG) == ADC_ExternalTrigConv_T8_TRGO) || \
                                  ((REGTRIG) == ADC_ExternalTrigConv_T5_CC1) || \
                                  ((REGTRIG) == ADC_ExternalTrigConv_T5_CC3))
    
    #define IS_ADC_DATA_ALIGN(ALIGN) (((ALIGN) == ADC_DataAlign_Right) || \
                                      ((ALIGN) == ADC_DataAlign_Left))
    
    #define IS_ADC_REGULAR_LENGTH(LENGTH) (((LENGTH) >= 0x1) && ((LENGTH) <= 0x10))
    

ADC_Cmd()函数

void ADC_Cmd(ADC_TypeDef* ADCx, FunctionalState NewState);

  assert_param(IS_ADC_ALL_PERIPH(ADCx));
  assert_param(IS_FUNCTIONAL_STATE(NewState));
  1. ADCx参数有效性:同上
  2. NewState参数有效性:同上

ADC_SoftwareStartConvCmd()函数

void ADC_SoftwareStartConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState);
参数有效性:同上

void ADC_RegularChannelConfig()函数

void ADC_RegularChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime)

  assert_param(IS_ADC_ALL_PERIPH(ADCx));
  assert_param(IS_ADC_CHANNEL(ADC_Channel));
  assert_param(IS_ADC_REGULAR_RANK(Rank));
  assert_param(IS_ADC_SAMPLE_TIME(ADC_SampleTime));
  1. ADCx参数有效性:同上

  2. ADC_Channel 参数有效性

    #define IS_ADC_CHANNEL(CHANNEL) (((CHANNEL) == ADC_Channel_0) || ((CHANNEL) == ADC_Channel_1) || \
                                     ((CHANNEL) == ADC_Channel_2) || ((CHANNEL) == ADC_Channel_3) || \
                                     ((CHANNEL) == ADC_Channel_4) || ((CHANNEL) == ADC_Channel_5) || \
                                     ((CHANNEL) == ADC_Channel_6) || ((CHANNEL) == ADC_Channel_7) || \
                                     ((CHANNEL) == ADC_Channel_8) || ((CHANNEL) == ADC_Channel_9) || \
                                     ((CHANNEL) == ADC_Channel_10) || ((CHANNEL) == ADC_Channel_11) || \
                                     ((CHANNEL) == ADC_Channel_12) || ((CHANNEL) == ADC_Channel_13) || \
                                     ((CHANNEL) == ADC_Channel_14) || ((CHANNEL) == ADC_Channel_15) || \
                                     ((CHANNEL) == ADC_Channel_16) || ((CHANNEL) == ADC_Channel_17))
    
  3. Rank参数有效性

    #define IS_ADC_REGULAR_RANK(RANK) (((RANK) >= 0x1) && ((RANK) <= 0x10))
    
  4. ADC_SampleTime参数有效性

    #define IS_ADC_SAMPLE_TIME(TIME) (((TIME) == ADC_SampleTime_1Cycles5) || \
                                      ((TIME) == ADC_SampleTime_7Cycles5) || \
                                      ((TIME) == ADC_SampleTime_13Cycles5) || \
                                      ((TIME) == ADC_SampleTime_28Cycles5) || \
                                      ((TIME) == ADC_SampleTime_41Cycles5) || \
                                      ((TIME) == ADC_SampleTime_55Cycles5) || \
                                      ((TIME) == ADC_SampleTime_71Cycles5) || \
                                      ((TIME) == ADC_SampleTime_239Cycles5))
    

ADC_GetConversionValue()函数

` uint16_t ADC_GetConversionValue(ADC_TypeDef* ADCx)`

参数有效性同上

配置过程

在这里插入图片描述

  1. 添加stm32f10x_adc.c文件
  2. 在硬件文件夹下面新建一个ADC文件夹,添加adc.h和adc.c文件
  3. 在侧边栏添加ADC文件夹,并且在配置中包含adc头文件
  4. 在头文件使用ifdef写唯一标识符

写adc源文件

  1. 源文件包含函数:

    void Adc_Init(void);//初始化函数
    u16  Get_Adc(u8 ch); //读取adc的值
    u16 Get_Adc_Average(u8 ch,u8 times); //多次读取adc取平均值
    
  2. 初始化函数

    void  Adc_Init(void)
    { 	
    	ADC_InitTypeDef ADC_InitStructure; //定义结构体
    	GPIO_InitTypeDef GPIO_InitStructure;//定义结构体
    
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1	, ENABLE );	  //使能ADC1通道时钟
    	RCC_ADCCLKConfig(RCC_PCLK2_Div6);   //设置ADC分频因子6 72M/6=12,ADC最大时间不能超过14M
    
    	//PA1 作为模拟通道输入引脚                         
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;	//模拟输入引脚
    	GPIO_Init(GPIOA, &GPIO_InitStructure);	
    
    	ADC_DeInit(ADC1);  //ADC1复位
    
    	ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;	//ADC工作模式:ADC1和ADC2工作在独立模式
    	ADC_InitStructure.ADC_ScanConvMode = DISABLE;	//模数转换工作在单通道模式
    	ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;	//模数转换工作在单次转换模式
    	ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;	//转换由软件而不是外部触发启动
    	ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;	//ADC数据右对齐
    	ADC_InitStructure.ADC_NbrOfChannel = 1;	//顺序进行规则转换的ADC通道的数目
    	ADC_Init(ADC1, &ADC_InitStructure);	//结构体赋值
    
      
    	ADC_Cmd(ADC1, ENABLE);	//使能ADC
    	ADC_ResetCalibration(ADC1);	//使能复位校准  
    	while(ADC_GetResetCalibrationStatus(ADC1));	//等待使能结束
    	ADC_StartCalibration(ADC1);	 //开启校准
    	while(ADC_GetCalibrationStatus(ADC1));//等待校准结束
    }
    
  3. 获取ADC函数

    u16 Get_Adc(u8 ch)   
    {
    	ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 );	//设置采样时间 			    
    	ADC_SoftwareStartConvCmd(ADC1, ENABLE);	//使能软件转化功能
    	while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束
    	return ADC_GetConversionValue(ADC1);//返回结果
    }
    
  4. 求平均值函数

    u16 Get_Adc_Average(u8 ch,u8 times)
    {
    	u32 temp_val=0;
    	u8 t;
    	for(t=0;t<times;t++)
    	{
    		temp_val+=Get_Adc(ch);
    		delay_ms(5);
    	}
    	return temp_val/times;
    } 
    

主函数

int main(void){ 
	u16 adcx;
	float temp;
	delay_init();	    	 //延时函数初始化	  
	uart_init(9600);	 	//串口初始化为9600
	LED_Init();		  		//初始化与LED连接的硬件接口
 	LCD_Init();
 	Adc_Init();		  		//ADC初始化	    
	POINT_COLOR=RED;//设置字体为红色 
	LCD_ShowString(60,50,200,16,16,"Mini STM32");	
	LCD_ShowString(60,70,200,16,16,"ADC TEST");	
	LCD_ShowString(60,90,200,16,16,"ATOM@ALIENTEK");
	LCD_ShowString(60,110,200,16,16,"2014/3/9");	
	//显示提示信息
	POINT_COLOR=BLUE;//设置字体为蓝色
	LCD_ShowString(60,130,200,16,16,"ADC_CH1_VAL:");	      
	LCD_ShowString(60,150,200,16,16,"ADC_CH1_VOL:0.000V");	    
	while(1)
	{
		adcx=Get_Adc_Average(ADC_Channel_1,10);
		LCD_ShowxNum(156,130,adcx,4,16,0);//显示ADC的值
		temp=(float)adcx*(3.3/4096);
		adcx=temp;
		LCD_ShowxNum(156,150,adcx,1,16,0);//显示电压值
		temp-=adcx;
		temp*=1000;
		LCD_ShowxNum(172,150,temp,3,16,0X80);
		LED0=!LED0;
		delay_ms(250);	
	}											    
}	

版权声明:本文为CSDN博主「Kafen Wong」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/KafenWong/article/details/122635995

生成海报
点赞 0

Kafen Wong

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

STM32F2————配置时钟延迟不准的问题

STM32F2配置时钟问题 笔者在本科毕业设计使用STM32F207芯片,但是在配置时钟时出现了问题。 问题 我按照F1写代码的延时函数放在F2竟然不准了 换个办法 使用Systick时钟也是不准,原因是笔者代

为什么重写printf函数没有用?

以前在网上找了无数方法去重写printf函数,但发现都没效果,今天偶然发现重写printf函数可以了,原因是以前没有勾选微库(Use MicroLlB)! 这里