目录

ADC简介

ADC主要特征

ADC功能框图

ADC引脚

电压输入范围

通道选择

单次转换模式

连续转换模式

转换顺序

规则序列

 注入序列

触发源

转换时间

中断

转换结束中断

模拟看门狗中断

DMA请求

代码讲解

宏定义:


ADC简介

12位ADC是一种逐次逼近型模拟数字转换器,它有多达18个通道,可以测量16个外部和2个内部信号源。各通道的A/D转换可以单次、连续、扫描或间断模式执行.ADC的结果可以是左对齐或者是右对齐方式存储在16位数据寄存器中。

模拟看门狗特性允许应用程序检测输入电压是否超出用户定义的高/低阈值。

ADC的输入时钟不得超过14MHZ,它是由PCLK2经分频产生。

ADC主要特征

  • 12位分辨率
  • 转换结束、注入转换结束和发生模拟看门狗事件时产生中断
  • 单次和连续转换模式
  • 从通道0到通道n的自动扫描模式
  • 自校准
  • 带内嵌数据一致性的数据对齐
  • 采样间隔时间可以按通道分别编程
  • 规则转换和注入转换均有外部触发选项
  • 间断模式
  • 双重模式(带2个或以上ADC的器件)
  • ADC转换时间
  • ADC供电要求:2.4V到3.6v
  • ADC输入范围:Vref-<Vin<Vref+
  • 规则通道转换期间有DMA请求产生
  • ADC功能框图

     注意:1、ADC3的规则转换和注入转换触发与ADC1和ADC2的不同

                2、TIM8_CH4和TIM8_TRGO及他们的重映射位只存在于大容量产品中

    ADC引脚

    名称 信号类型 注解
    Vref+ 输入,模拟参考正极 ADC使用的高端。正极参考电压,2.4V<=Vref+<=VDDA
    VDDA 输入,模拟电源 等效于VDD的模拟电源且:2.4V<=VDDA<=VDD(3.6V)
    Vref- 输入,模拟参考负极 ADC使用的低端/负极参考电压,Vref=VSSA
    VSSA 输入,模拟电源地 等效于VSS的模拟电源地
    ADCx_IN[15:0] 模拟输入信号 16个模拟输入通道

    VDDA和VSSA应该分别连接到VDD和VSS。

    电压输入范围

    ADC输入范围为Vref-<y=Vin<=Vref+.由Vref+、Vref-、VDDA、VSSA这四个外部引脚决定。如果我们想让输入的电压范围变宽,去到可以测试负电压或者更高的正电压,我们可以在外部加一个电压调整电路,把需要转换的电压抬升或者降低到0~3.3V,这样ADC就可以测量。

    通道选择

    有16个通道,可以把转换组织分成两组:规则组和注入组。在任意多个通道上以任意顺序进行的一系列转换构成成组转换。例如,可以如下顺序完成转换:通道3、通道8、通道2、通道0、通道2、通道15。

    规则组:由多达16个转换组成,规则通道和它们的转换顺序在ADC_SQRx寄存器中选择,规则组中转换的总数应写入ADC_SQR1寄存器的了L[3:0]位中

    注入组:由多达4个转换组成,注入通道和它们的转换顺序在ADC_JSQR寄存器中选择,注入组里的转换总数目应写入ADC_JSQR寄存器的L[1:0]中

    如果
    ADC_SQRx

    ADC_JSQR
    寄存器在转换期间被更改,当前的转换被清除,一个新的启动脉

    冲将发送到
    ADC
    以转换新选择的组。

    温度传感器/Vrefint内部通道

    温度传感器和通道ADC_IN16相连接,内部参照电压Vrefint和ADC_IN17相连接。可以按注入或规则通道对这两个内部通道进行转换

    单次转换模式

    单次转换模式下,ADC只执行一次转换,该模式下即可通过设置ADC_CR2寄存器的ADON位(只适用于规则通道)启动也可通过外部触发启动(适用于规则通道或注入通道),这时CONT位为0.

    一旦选择通道的转换完成:

  • 如果一个规则通道被转换:
  • -转换数据被存储在16位ADC_DR寄存器中

    -EOC(转换结束)标志被设置

    -如果设置了EOCIE,则产生中断

  • 如果一个注入通道被转换
  • -转换数据被存储在16位的ADC_DRJ1寄存器中

    -JEOC(注入转换结束)标志被设置

    -如果设置了JEOCIE位,则产生中断

    连续转换模式

    在连续转换模式中,当前面ADC转换一结束马上就启动另一次转换。此模式可通过外部触发启动或通过设置ADC_CR2寄存器上的ADON位启动,此时的CONT位是1.

    每个转换后:

  • 如果一个规则通道被转换
  • -规则数据被存储在16位的ADC_DR寄存器中

    -EOC(转换结束)标志被设置

    -如果设置了EOCIE,则产生中断

  • 如果一个注入通道被转换:
  • -转换数据被存储在16位的ADC_DRJ1寄存器中

    -JEOC(注入转换结束)标志被设置

    -如果设置了JEOCIE位,则产生中断

    规则通道:顾名思义,规则就是规矩的意思,我们平时一般使用的就是这个通道,或者应该说我们用到的就是这个通道,没有什么要特别注意的。

    注入通道:注入,可以理解为插入,插队的意思,就是一种不安分的意思,它是一种在规则通道转换的时候强行插入的一种转换通道,如果在规则通道转换过程中,有注入通道插队,那么就要先转换完注入通道,等注入通道完成之后,再回到规则通道的转换流程。这点跟中断程序很像,都是不安分的主,所以注入通道只有在规则通道存在时才会出现。

    转换顺序

    规则序列

    规则序列寄存器有3个,分别为SQR3、SQR2、SQR1。SQR3控制着规则序列中的第一个到第六个转换,对应的位为:SQ1[4:0]~SQ6[4:0],第一次转换的是位 4:0 SQ1[4:0],如果通道 16 想第一 次转换,那么在 SQ1[4:0] 写 16 即可。SQR2 控制着规则序列中的第 7 到第 12 个转换,对应的位 为:SQ7[4:0]~SQ12[4:0],如果通道 1 想第 8 个转换,则 SQ8[4:0] 写 1 即可。SQR1 控制着规则序 列中的第 13 到第 16 个转换,对应位为:SQ13[4:0]~SQ16[4:0],如果通道 6 想第 10 个转换,则 SQ10[4:0] 写 6 即可。具体使用多少个通道,由 SQR1 的位 L[3:0] 决定,最多 16 个通道。

     注入序列

    注入序列寄存器JSQR只有一个,最多支持4个通道,具体多少个由JSQR的JL[2:0]决定。如果JL的值小于4的话,则JSQR跟SQR决定转换顺序的设置不一样,第一次转换的不是JSQR1[4:0];而是JCQRx[4:0],x=4-JL,跟SQR刚好相反,如果 JL=00(1 个转换),那么转换的顺序是从 JSQR4[4:0] 开始,而不是从 JSQR1[4:0] 开始,这个要注意,编程的时候不要搞错。当 JL 等于 4 时,跟 SQR 一样。

    触发源

    通道选好了,转换的顺序也设置好了,那接下来就开始转换了,ADC的转换可以由ADC控制寄存器2:ADC_CR2的ADON这个位来控制,写1的时候开始转换,写0的时候停止转换,这个是最简单也是最好理解的开启ADC转换的控制方式。

    除了这种控制方法,ADC还支持触发转换,这个触发包括内部定时器触发和外部IO触发。触发源有很多,具体选择哪一种触发源,由ADC控制寄存器2:ADC_CR2的EXTSEL[2:0]和JEXTSEL [2:0]位来控制。EXTSEL[2:0]用于选择规则通道的触发源JEXTSEL [2:0]用于选择注入通道的触发源。选定好触发源之后,触发源是否要激活,则由 ADC控制寄存器2:ADC_CR2 的

    EXTTRIG

    JEXTTRIG
    这两位来激活。其中
    ADC3
    的规则转换和注入转换的触发源与
    ADC1/2

    的有所不同,在框图上已经表示出来.

    转换时间

    ADC时钟

    ADC输入时钟ADC_CLK由PCLK2经过分频产生,最大是14MHZ,分频因子由RCC时钟配置寄存器RCC_CFGR的位15:14设置,可以是2/4/6/8分频,注意这里没有1分频。一般我们设置PCLK2=HCLK=72M。

    采样时间

    ADC使用若干个ADC_CLK周期对输入的电压进行采样,采样的周期数可通过ADC采样时间寄存器ADC_SMPR1控制的是通道10~17.每个通道可以分别使用不同的时间采样,其中采样周期最小是1.5个。

    ADC
    的转换时间跟
    ADC
    的输入时钟和采样时间有关,公式为:
    Tconv =
    采样时间
    + 12.5
    个周期。 当 ADCLK = 14MHZ
    (最高),采样时间设置为
    1.5
    周期(最快),那么总的转换时间(最短)
    Tconv = 1.5 周期
    + 12.5
    周期
    = 14
    周期
    = 1us

    一般我们设置
    PCLK2=72M
    ,经过
    ADC
    预分频器能分频到最大的时钟只能是
    12M
    ,采样周期设

    置为
    1.5
    个周期,算出最短的转换时间为
    1.17us
    ,这个才是最常用的。

    中断

    转换结束中断

    数据转换结束后可以产生中断,中断分为3种:规则通道转换结束中断,注入转换通道转换结束中断,模拟看门狗中断。其中转换结束很好理解,跟我们平时接触的中断一样,有相应的中断标志位和中断使能位,我们还可以根据中断类型写相应的中断服务程序。

    模拟看门狗中断

    当被ADC转换的模拟电压低于阈值或者高于阈值时,就会产生中断,前提是我们开起了模拟看门狗中断,其中低阈值和高阈值由ADC_LTR和ADC_HTR设置。例如我们设置高阈值是2.5V,那么模拟电压超过2.5V的时候,就会产生模拟看门狗中断,反之低阈值也一样。

    DMA请求

    规则和注入通道转换结束后,除了产生中断外,还可以产生DMA请求,把转换好的数据直接存储在内存里面。要注意的是只有ADC1和ADC3可以产生DMA请求。

    代码讲解

    ADC初始化结构体详解
    typedef struct
    {
      uint32_t ADC_Mode;                 //ADC工作模式选择
          
      FunctionalState ADC_ScanConvMode;   //ADC扫描(多通道)或者单通道模式选择
      
      FunctionalState ADC_ContinuousConvMode;     //ADC单次转换或者连续转换选择
        
      uint32_t ADC_ExternalTrigConv;      //ADC转换触发信号选择
    
      uint32_t ADC_DataAlign; // ADC 数据寄存器对齐格式
            
      uint8_t ADC_NbrOfChannel;           //ADC采集通道数
            
    }ADC_InitTypeDef;

    ADC_Mode
    :配置
    ADC
    的模式,当使用一个
    ADC
    时是独立模式,使用两个
    ADC
    时是双模式,

    在双模式下还有很多细分模式可选,我们一般使用一个
    ADC
    的独立模式。

    ScanConvMode
    :可选参数为
    ENABLE

    DISABLE
    ,配置是否使用扫描。如果是单通道
    AD
    转换

    使用
    DISABLE
    ,如果是多通道
    AD
    转换使用
    ENABLE

    ADC_ContinuousConvMode
    :可选参数为
    ENABLE

    DISABLE
    ,配置是启动自动连续转换还是单

    次转换。使用
    ENABLE
    配置为使能自动连续转换;使用
    DISABLE
    配置为单次转换,转换一次后

    停止需要手动控制才重新启动转换。一般设置为连续转换。

    ADC_ExternalTrigConv
    :外部触发选择,图
    单个
    ADC
    功能框图
    中列举了很多外部触发条件,可

    根据项目需求配置触发来源。实际上,我们一般使用软件自动触发。

    ADC_DataAlign
    :转换结果数据对齐模式,可选右对齐
    ADC_DataAlign_Right
    或者左对齐

    ADC_DataAlign_Left
    。一般我们选择右对齐模式。

    ADC_NbrOfChannel

    AD
    转换通道数目,根据实际设置即可。

    其中实验可以分为4个实验:独立模式单通道采集实验(分为中断存储和DMA直接存储)、独立模式多通道采集实验、双重ADC同步规则模式采集实验

    我直接以双重ADC同步规则模式采集实验为例

    宏定义:

    #ifndef __BSP_ADC_H
    #define __BSP_ADC_H
    
    #include "stm32f10x.h"
    
    /*定义ADC相关的引脚*/
    #define ADC_x_1_GPIO_PORT				GPIOC
    #define ADC_x_1_PIN_0						GPIO_Pin_1
    #define ADC_x_1_PIN_1						GPIO_Pin_2
    
    #define ADC_x_2_GPIO_PORT				GPIOC
    #define ADC_x_2_PIN_0						GPIO_Pin_3
    #define ADC_x_2_PIN_1						GPIO_Pin_4
    
    #define ADC_GPIO_CLK		RCC_APB2Periph_GPIOC
    
    #define NUMOFCHANNEL		2
    /*定义ADC相关的模式配置*/
    #define ADC_x_1								ADC1
    #define ADC_x_1_CHANNEL_0			ADC_Channel_11
    #define ADC_x_1_CHANNEL_1			ADC_Channel_12
    #define ADC_x_1_CLK						RCC_APB2Periph_ADC1
    
    #define ADC_x_2					 			ADC2
    #define ADC_x_2_CHANNEL_0			ADC_Channel_13
    #define ADC_x_2_CHANNEL_1			ADC_Channel_14
    #define ADC_x_2_CLK						RCC_APB2Periph_ADC2
    
    
    /*DMA的相关定义*/
    #define DMA_CHANNEL			DMA1_Channel1
    #define DMA_CLK				  RCC_AHBPeriph_DMA1
    
    /*ADC中断相关宏定义*/
    //#define ADC_IRQ					ADC1_2_IRQn
    //#define ADC_IRQHandler	ADC1_2_IRQHandler					
    
    void ADCx_Init(void);
    
    #endif /*__BSP_ADC_H*/
    
    
    #include "bsp_adc.h"
    
    __IO uint32_t ADC_ConvertedValue[NUMOFCHANNEL]={0,0};
    /*
    编程思路
    (1)初始ADC用到的GPIO;
    (2)设置ADC的工作参数并初始化
    (3)设置ADC的工作时钟
    (4)设置ADC转换通道顺序及采样时间
    (5)配置使能ADC转换完成中断,在中断内读取转换完数据
    (6)使能ADC
    (7)使能软件触发ADC转换
    	ADC转换结果数据使用中断方式读取,这里没有使用DMA进行数据传输
    
    */
    
    /*
    *@brief	ADC相关GPIO引脚初始化
    *@param	None
    *@retval:None
    */
    static void ADC_GPIO_Config(void)
    {
    	GPIO_InitTypeDef GPIO_InitStruct;
    	RCC_APB2PeriphClockCmd(ADC_GPIO_CLK,ENABLE);
    	
    	GPIO_InitStruct.GPIO_Mode	=	GPIO_Mode_AIN;
    	GPIO_InitStruct.GPIO_Speed	=	GPIO_Speed_50MHz;
    	GPIO_InitStruct.GPIO_Pin	=	ADC_x_1_PIN_0;
    	GPIO_Init(ADC_x_1_GPIO_PORT,&GPIO_InitStruct);
    	
    	GPIO_InitStruct.GPIO_Pin	=	ADC_x_1_PIN_1;	
    	GPIO_Init(ADC_x_1_GPIO_PORT,&GPIO_InitStruct);
    	
    	GPIO_InitStruct.GPIO_Pin	=	ADC_x_2_PIN_0;
    	GPIO_Init(ADC_x_2_GPIO_PORT,&GPIO_InitStruct);
    	
    	GPIO_InitStruct.GPIO_Pin	=	ADC_x_2_PIN_1;	
    	GPIO_Init(ADC_x_2_GPIO_PORT,&GPIO_InitStruct);
    }
    
    /*
    *@brief ADC模式配置
    *@param None
    *@retvla None
    */
    static void ADC_Mode_Config(void)
    {
    	ADC_InitTypeDef ADC_InitStruct;
    	DMA_InitTypeDef DMA_InitStruct;
    	RCC_APB2PeriphClockCmd(ADC_x_1_CLK,ENABLE);
    	RCC_APB2PeriphClockCmd(ADC_x_2_CLK,ENABLE);
    	RCC_AHBPeriphClockCmd(DMA_CLK,ENABLE);
    	
    	DMA_DeInit(DMA_CHANNEL);
    
    	
    	/*-------------- Reset DMA init structure parameters values ------------------*/
      /* Initialize the DMA_PeripheralBaseAddr member */
      DMA_InitStruct.DMA_PeripheralBaseAddr = (uint32_t) ( & ( ADC_x_1->DR ) ) ;
      /* Initialize the DMA_MemoryBaseAddr member */
      DMA_InitStruct.DMA_MemoryBaseAddr = (uint32_t)ADC_ConvertedValue;
      /* Initialize the DMA_DIR member */
      DMA_InitStruct.DMA_DIR = DMA_DIR_PeripheralSRC;
      /* Initialize the DMA_BufferSize member */
      DMA_InitStruct.DMA_BufferSize = NUMOFCHANNEL;
      /* Initialize the DMA_PeripheralInc member */
      DMA_InitStruct.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
      /* Initialize the DMA_MemoryInc member */
      DMA_InitStruct.DMA_MemoryInc = DMA_MemoryInc_Enable;
      /* Initialize the DMA_PeripheralDataSize member */
      DMA_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
      /* Initialize the DMA_MemoryDataSize member */
      DMA_InitStruct.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;
      /* Initialize the DMA_Mode member */
      DMA_InitStruct.DMA_Mode = DMA_Mode_Circular;
      /* Initialize the DMA_Priority member */
      DMA_InitStruct.DMA_Priority= DMA_Priority_High;
      /* Initialize the DMA_M2M member */
      DMA_InitStruct.DMA_M2M = DMA_M2M_Disable;
    	DMA_Init(DMA_CHANNEL,&DMA_InitStruct);
    	DMA_Cmd(DMA_CHANNEL,ENABLE);
    	/********************以下是ADC初始化部分************************/
    	/* Reset ADC init structure parameters values */
      /* Initialize the ADC_Mode member */
      ADC_InitStruct.ADC_Mode = ADC_Mode_RegSimult;
      /* initialize the ADC_ScanConvMode member */
      ADC_InitStruct.ADC_ScanConvMode = ENABLE;
      /* Initialize the ADC_ContinuousConvMode member */
      ADC_InitStruct.ADC_ContinuousConvMode = ENABLE;
      /* Initialize the ADC_ExternalTrigConv member */
      ADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
      /* Initialize the ADC_DataAlign member */
      ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;
      /* Initialize the ADC_NbrOfChannel member */
      ADC_InitStruct.ADC_NbrOfChannel = NUMOFCHANNEL;
    	//初始化ADC
    	ADC_Init(ADC_x_1,&ADC_InitStruct);
    	//配置ADC时钟,CLK2的6分频,即12MHZ
    	RCC_ADCCLKConfig(RCC_PCLK2_Div6);
    	//配置ADC通道转换顺序为1,第一个转换,采样时间28.5个时钟周期
    	ADC_RegularChannelConfig(ADC_x_1,ADC_x_1_CHANNEL_0,1,ADC_SampleTime_28Cycles5);
    	ADC_RegularChannelConfig(ADC_x_1,ADC_x_1_CHANNEL_1,2,ADC_SampleTime_28Cycles5);
    	ADC_DMACmd(ADC_x_1,ENABLE);
    	ADC_Cmd(ADC_x_1,ENABLE);
    	/*******************ADC2初始化配置********************/
    	ADC_InitStruct.ADC_Mode = ADC_Mode_RegSimult;
      ADC_InitStruct.ADC_ScanConvMode = ENABLE;
      ADC_InitStruct.ADC_ContinuousConvMode = ENABLE;
      ADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
      ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;
      ADC_InitStruct.ADC_NbrOfChannel = NUMOFCHANNEL;
    
    	ADC_Init(ADC_x_2,&ADC_InitStruct);
    	//配置ADC时钟,CLK2的6分频,即12MHZ
    	RCC_ADCCLKConfig(RCC_PCLK2_Div6);
    	//配置ADC通道转换顺序为1,第一个转换,采样时间28.5个时钟周期
    	ADC_RegularChannelConfig(ADC_x_2,ADC_x_2_CHANNEL_0,1,ADC_SampleTime_28Cycles5);
    	ADC_RegularChannelConfig(ADC_x_2,ADC_x_2_CHANNEL_1,2,ADC_SampleTime_28Cycles5);
    	//使用外部触发ADC转换
    	ADC_ExternalTrigConvCmd(ADC_x_2, ENABLE);
    	ADC_Cmd(ADC_x_2,ENABLE);
    	//ADC转换结束产生中断,在中断服务函数中读取转换值
      //	ADC_ITConfig(ADC_x,ADC_IT_EOC,ENABLE);
    
    	/*************ADC1*************/
    	//初始化ADC校准寄存器
    	ADC_ResetCalibration(ADC_x_1);
    	//等待校准寄存器初始化完成
    	while(ADC_GetResetCalibrationStatus(ADC_x_1));
    	//ADC开始校准
    	ADC_StartCalibration(ADC_x_1);
    	//等待校准完成
    	while(ADC_GetCalibrationStatus(ADC_x_1));
    	
    	/*************ADC2**************/
    	//初始化ADC校准寄存器
    	ADC_ResetCalibration(ADC_x_2);
    	//等待校准寄存器初始化完成
    	while(ADC_GetResetCalibrationStatus(ADC_x_2));
    	//ADC开始校准
    	ADC_StartCalibration(ADC_x_2);
    	//等待校准完成
    	while(ADC_GetCalibrationStatus(ADC_x_2));
    	//由于没有采用外部触发,所以使用软件触发ADC转换
    	ADC_SoftwareStartConvCmd(ADC_x_1,ENABLE);
    }
    
    /*
    *@brief ADC中断配置
    *@param None
    *@retval:None
    */
    //static void ADC_NVIC_Config(void)
    //{
    //	NVIC_InitTypeDef NVIC_InitStruct;
    //	
    //	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
    
    //	NVIC_InitStruct.NVIC_IRQChannel	=	ADC_IRQ;
    //	
    //	NVIC_InitStruct.NVIC_IRQChannelCmd	=	ENABLE;
    //	
    //	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority	=	0;
    //	
    //	NVIC_InitStruct.NVIC_IRQChannelSubPriority	=	1;
    //	
    
    //	
    //	NVIC_Init(&NVIC_InitStruct);
    
    
    //}
    
    /*
    *brief ADC初始化
    *@param None
    *retval None
    */
    
    void ADCx_Init(void)
    {
    	ADC_GPIO_Config();
    	ADC_Mode_Config();
    //	ADC_NVIC_Config();
    }
    
    
    
    

    main.c

    /*
    双重ADC多通道采集实验
    */
    
    #include "stm32f10x.h"
    #include "bsp_uart.h"
    #include "led.h"
    #include "bsp_adc.h"
    
    extern __IO uint32_t ADC_ConvertedValue[NUMOFCHANNEL];
    
    float ADC_ConvertedValueLocal[NUMOFCHANNEL*2];
    
    void Delay(uint32_t count)
    {
    	for(;count!=0;count--);
    }
    
    int main(void)
    {
    	uint16_t temp0=0,temp1=0,temp2=0,temp3=0;
    	GPIO_LED_Config();
    	USART1_Config();
    	ADCx_Init();
    	
    	printf("**********这是一个ADC测试实验***********\n");
    	while(1)
    	{
    		temp0	=	(ADC_ConvertedValue[0]&0xFFFF0000)>>16;//ADC2CH1
    		temp1	= (ADC_ConvertedValue[0]&0xFFFF);//ADC1 CH1
    		temp2	=	(ADC_ConvertedValue[1]&0xFFFF0000)>>16;//ADC2 CH2
    		temp3	= (ADC_ConvertedValue[1]&0xFFFF);//ADC1 CH2
    		
    		ADC_ConvertedValueLocal[0]	=	(float)temp0/4096*3.3;		//ADC2 CH1
    		ADC_ConvertedValueLocal[1]	=	(float)temp1/4096*3.3;		//ADC1 CH1
    		ADC_ConvertedValueLocal[2]	=	(float)temp2/4096*3.3;		//ADC2 CH2
    		ADC_ConvertedValueLocal[3]	=	(float)temp3/4096*3.3;		//ADC1 CH2
    
    		printf("\r\nADC1的通道11的值为:%f",ADC_ConvertedValueLocal[1]);
    		printf("\r\nADC1的通道12的值为:%f",ADC_ConvertedValueLocal[3]);
    		printf("\r\nADC2的通道13的值为:%f",ADC_ConvertedValueLocal[0]);
    		printf("\r\nADC1的通道14的值为:%f",ADC_ConvertedValueLocal[2]);
    
    		printf("\r\r\r\n");
    		
    		Delay(0xffffee);
    		
    	}	
    	
    }
    

     个人总结

    关于ADC程序驱动的编写,STM32官方的例程中有一些帮助,对于程序编写的步骤我总结如下:
    1、初始ADC用到的GPIO

    2、设置ADC的工作参数并初始化

    3、设置ADC工作时钟(在RCC文件的ADC设置)

    4、设置ADC转换通道顺序和采样时间

    5、配置使能ADC转换完成中断,在中断内读取转换数据

    6、如果是DMA读取数据,需要配置ADC的响应DMA

    7、使能软件触发ADC转换

    物联沃分享整理
    物联沃-IOTWORD物联网 » STM32——ADC采集

    发表评论