历史上的今天

今天是:2024年10月27日(星期日)

正在发生

2021年10月27日 | stm32专题二十四:ADC 标准库函数分析

发布者:HeavenlyJoy444 来源: eefocus关键字:stm32  ADC  标准库函数 手机看文章 扫描二维码
随时随地手机看文章

ADC初始化结构体:


typedef struct

{

  uint32_t ADC_Mode;                      /*!< Configures the ADC to operate in independent or

                                               dual mode. 

                                               This parameter can be a value of @ref ADC_mode */

 

  FunctionalState ADC_ScanConvMode;       /*!< Specifies whether the conversion is performed in

                                               Scan (multichannels) or Single (one channel) mode.

                                               This parameter can be set to ENABLE or DISABLE */

 

  FunctionalState ADC_ContinuousConvMode; /*!< Specifies whether the conversion is performed in

                                               Continuous or Single mode.

                                               This parameter can be set to ENABLE or DISABLE. */

 

  uint32_t ADC_ExternalTrigConv;          /*!< Defines the external trigger used to start the analog

                                               to digital conversion of regular channels. This parameter

                                               can be a value of @ref ADC_external_trigger_sources_for_regular_channels_conversion */

 

  uint32_t ADC_DataAlign;                 /*!< Specifies whether the ADC data alignment is left or right.

                                               This parameter can be a value of @ref ADC_data_align */

 

  uint8_t ADC_NbrOfChannel;               /*!< Specifies the number of ADC channels that will be converted

                                               using the sequencer for regular channel group.

                                               This parameter must range from 1 to 16. */

}ADC_InitTypeDef;

(1)ADC模式: 一般选择独立模式;


/** @defgroup ADC_mode 

  * @{

  */

 

// 独立模式,最为常用

#define ADC_Mode_Independent                       ((uint32_t)0x00000000)

// 剩下的都是双ADC模式,包括同步、交叉、交替、混合等,不常用

#define ADC_Mode_RegInjecSimult                    ((uint32_t)0x00010000)

#define ADC_Mode_RegSimult_AlterTrig               ((uint32_t)0x00020000)

#define ADC_Mode_InjecSimult_FastInterl            ((uint32_t)0x00030000)

#define ADC_Mode_InjecSimult_SlowInterl            ((uint32_t)0x00040000)

#define ADC_Mode_InjecSimult                       ((uint32_t)0x00050000)

#define ADC_Mode_RegSimult                         ((uint32_t)0x00060000)

#define ADC_Mode_FastInterl                        ((uint32_t)0x00070000)

#define ADC_Mode_SlowInterl                        ((uint32_t)0x00080000)

#define ADC_Mode_AlterTrig                         ((uint32_t)0x00090000)

(2)ADC扫描模式:单通道 AD转换使用 DISABLE,多通道 AD转换使用 ENABLE;


(3)ADC连续转换:一般都会启用;


(4)外部触发选择:一般选择软件触发,也可以使用定时器触发 or 外部中断事件触发;


(5)ADC数据对齐:右对齐;


(6)ADC转换通道数量;


常用的标准固件库函数:


(1)ADC初始化函数


// 初始化ADC

void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct);

(2)ADC时钟设置函数(设置分频系数),通常设置为6分频,ADCCLK = 12MHz


/**

  * @brief  Configures the ADC clock (ADCCLK).

  * @param  RCC_PCLK2: defines the ADC clock divider. This clock is derived from 

  *   the APB2 clock (PCLK2).

  *   This parameter can be one of the following values:

  *     @arg RCC_PCLK2_Div2: ADC clock = PCLK2/2

  *     @arg RCC_PCLK2_Div4: ADC clock = PCLK2/4

  *     @arg RCC_PCLK2_Div6: ADC clock = PCLK2/6

  *     @arg RCC_PCLK2_Div8: ADC clock = PCLK2/8

  * @retval None

  */

void RCC_ADCCLKConfig(uint32_t RCC_PCLK2)

{

  uint32_t tmpreg = 0;

  /* Check the parameters */

  assert_param(IS_RCC_ADCCLK(RCC_PCLK2));

  tmpreg = RCC->CFGR;

  /* Clear ADCPRE[1:0] bits */

  tmpreg &= CFGR_ADCPRE_Reset_Mask;

  /* Set ADCPRE[1:0] bits according to RCC_PCLK2 value */

  tmpreg |= RCC_PCLK2;

  /* Store the new value */

  RCC->CFGR = tmpreg;

}

(3)ADC规则通道配置函数(配置通道、转换顺序、采样周期)


/**

  * @brief  Configures for the selected ADC regular channel its corresponding

  *         rank in the sequencer and its sample time.

  * @param  ADCx: where x can be 1, 2 or 3 to select the ADC peripheral.

  * @param  ADC_Channel: the ADC channel to configure. 

  *   This parameter can be one of the following values:

  *     @arg ADC_Channel_0: ADC Channel0 selected

  *     @arg ADC_Channel_1: ADC Channel1 selected

  *     @arg ADC_Channel_2: ADC Channel2 selected

  *     @arg ADC_Channel_3: ADC Channel3 selected

  *     @arg ADC_Channel_4: ADC Channel4 selected

  *     @arg ADC_Channel_5: ADC Channel5 selected

  *     @arg ADC_Channel_6: ADC Channel6 selected

  *     @arg ADC_Channel_7: ADC Channel7 selected

  *     @arg ADC_Channel_8: ADC Channel8 selected

  *     @arg ADC_Channel_9: ADC Channel9 selected

  *     @arg ADC_Channel_10: ADC Channel10 selected

  *     @arg ADC_Channel_11: ADC Channel11 selected

  *     @arg ADC_Channel_12: ADC Channel12 selected

  *     @arg ADC_Channel_13: ADC Channel13 selected

  *     @arg ADC_Channel_14: ADC Channel14 selected

  *     @arg ADC_Channel_15: ADC Channel15 selected

  *     @arg ADC_Channel_16: ADC Channel16 selected

  *     @arg ADC_Channel_17: ADC Channel17 selected

  * @param  Rank: The rank in the regular group sequencer. This parameter must be between 1 to 16.

  * @param  ADC_SampleTime: The sample time value to be set for the selected channel. 

  *   This parameter can be one of the following values:

  *     @arg ADC_SampleTime_1Cycles5: Sample time equal to 1.5 cycles

  *     @arg ADC_SampleTime_7Cycles5: Sample time equal to 7.5 cycles

  *     @arg ADC_SampleTime_13Cycles5: Sample time equal to 13.5 cycles

  *     @arg ADC_SampleTime_28Cycles5: Sample time equal to 28.5 cycles

  *     @arg ADC_SampleTime_41Cycles5: Sample time equal to 41.5 cycles

  *     @arg ADC_SampleTime_55Cycles5: Sample time equal to 55.5 cycles

  *     @arg ADC_SampleTime_71Cycles5: Sample time equal to 71.5 cycles

  *     @arg ADC_SampleTime_239Cycles5: Sample time equal to 239.5 cycles

  * @retval None

  */

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

{

  uint32_t tmpreg1 = 0, tmpreg2 = 0;

  /* Check the parameters */

  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));

  /* if ADC_Channel_10 ... ADC_Channel_17 is selected */

  if (ADC_Channel > ADC_Channel_9)

  {

    /* Get the old register value */

    tmpreg1 = ADCx->SMPR1;

    /* Calculate the mask to clear */

    tmpreg2 = SMPR1_SMP_Set << (3 * (ADC_Channel - 10));

    /* Clear the old channel sample time */

    tmpreg1 &= ~tmpreg2;

    /* Calculate the mask to set */

    tmpreg2 = (uint32_t)ADC_SampleTime << (3 * (ADC_Channel - 10));

    /* Set the new channel sample time */

    tmpreg1 |= tmpreg2;

    /* Store the new register value */

    ADCx->SMPR1 = tmpreg1;

  }

  else /* ADC_Channel include in ADC_Channel_[0..9] */

  {

    /* Get the old register value */

    tmpreg1 = ADCx->SMPR2;

    /* Calculate the mask to clear */

    tmpreg2 = SMPR2_SMP_Set << (3 * ADC_Channel);

    /* Clear the old channel sample time */

[1] [2]
关键字:stm32  ADC  标准库函数 引用地址:stm32专题二十四:ADC 标准库函数分析

上一篇:stm32专题二十四:ADC简介
下一篇:stm32专题二十四:ADC独立模式单通道采集

推荐阅读

集微网消息,由于各大内存厂产能“刹不住车”,NAND Flash快闪存储器和DRAM价格已经持续走低,终结了持续两年的市场供应紧俏状况。韩国SK海力士虽然第三季度销售额高达696亿人民币,同比增长40.9%,公司仍将采取措施以应对市场供过于求,价格下滑。SK海力士表示将会调整设备方面的投资,降低产能,从而缩减成本。SK海力士将于明年第一季度末在M15工厂开始...
据外媒AppleInsider报道,苹果周五发布了其“Privacy on iPhone”系列中的最新隐私广告,其中详细介绍了存储在移动设备上的个人敏感数据宝库,并巧妙地暗示iPhone可能是确保信息安全的唯一方法。   短短一分钟的广告被发布在苹果的官方YouTube频道上,其标题为“ iPhone上的隐私-就这么简单”,这是该公司针对隐私的商业广告系列的最新一则广...
截至10月26日收盘,A股三大指数今日收盘涨跌不一,其中沪指走势较弱,下跌0.82%,收报3251.12点;深成指上涨0.48%,收报13191.25点;创业板指上涨0.65%,收报2617.74点。市场成交量萎缩,两市合计成交6336亿元。从盘面上看,充电桩、人脸识别、光伏概念涨幅居前,证券、白酒、银行板块跌幅居前。两市1839家个股上涨,2038家个股下跌;其中涨停家数34家,跌...
10月27日,来自LG化学官方消息显示,LG化学和东丽公司签署合作协议,双方将共投资超过1万亿韩元,在匈牙利成立合资公司“LG Toray Hungary Battery Separator Kft”,共同进军欧洲电池隔膜市场。图源:LG化学官网据悉,合资公司将以50:50的持股比例开始运营,不过,LG化学计划在30个月内追加收购东丽20%的股份,以确保经营权 。合资公司的工厂位置位...

史海拾趣

问答坊 | AI 解惑

基于DSP的上网方案的软硬件设计与实现

随着现代网络技术的发展,嵌入式系统如单片机、DSP等系统对接入网络的需求日益增加,例如具有远程抄表功能的电表系统、可以进行远程控制的信息家电系统等。本文采用TI公司的TMS320VC33 DSP芯片设计与Realtek公司的RTL8019网卡的硬件接口电路,并在DSP ...…

查看全部问答∨

华为Quartus教程

华为的Quartus入门教程,比较系统全面,但讲得不深,有兴趣的朋友可以下来看看…

查看全部问答∨

delphi串口编程

章   Delphi串口(COM口)编程(附截图) 2009-06-27 19:45        因为公司有个读卡器由键盘口换成了COM口的,所以原来的程式要做个小小的调整,要改成从串口读数据。一般的系 ...…

查看全部问答∨

求Silverlight for Embedded应用例子

近来看见网上许多人讨论Silverlight for Embedded,不知MS有没有放出例子参考参考,在网上找了一下找不到,那位达人有的能贡献出来让大家参考一下吗?呵呵…

查看全部问答∨

51单片机中push的问题

正在学单片机 书中讲的是: push 后面的操作数只能是直接寻址方式 如:push 30H     push ACC 还说:push A不对,也就是操作数不能是寄存器寻址 可书中的例子中却多次出现:push A 请问是不是书上印错了…

查看全部问答∨

针对新注册用户的广告水贴一些问题讨论

我们开始行动起来吧!!! 新手注册后: 1、设置类似“水版”的版块,专门用于广告用户灌水用(制定相应规则,不遵守一律屏蔽发言)! 2、专业版块能看帖,不能发新帖,但可以回帖!回帖达到一定程度(还要看质量,要是夹杂广告,直接封号),向 ...…

查看全部问答∨

AD中断函数中取AD 转换结果,得到数据不正确

我需要在AD中断里面切换AD转换通道,但是只要在AD中切换通道得到的AD转换数据就不正常; 现象一、1、如果我在AD中断函数中只开启某一个AD转换通道,那么得到AD数据值a = (temp2<<8)+temp1,( 注释 temp2=ADC_DRH,temp1= ADC_DRL );a是正常的数 ...…

查看全部问答∨

TA 中断 疑问

void main(void) {   WDTCTL = WDTPW + WDTHOLD;             // Stop WDT   Init_Clk();   TA1CTL |= TASSEL_1+TACLR+TAIE;          ...…

查看全部问答∨

DSP TMS320VC5402的定时器0控制LED的亮灭

板子给的cputimer程序有问题,希望各位大神帮忙参考一下,当DSP单步调试时寄存器CLKMD的值不发生变化,单步运行到while(*CLKMD & 0x01 );报错:寄存器不可读。还有它的软件等待状态寄存器的设置也报错。我怀疑给的程序有问题。程序如下: #inclu ...…

查看全部问答∨

关于PCB设计SI问题

  目前用户最需要一个能将时序分析和SI融为一体的工具,并且界面优化,设置简单,同时又包括Design KIT。ICX Tau如果能够象Quantum-SI一样性能得到改进,必将提升人气,更受客户青睐。由于Mentor具有PCB设计前端和后端,ICX+Tau优势是其它工具 ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved