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 */
上一篇:stm32专题二十四:ADC简介
下一篇:stm32专题二十四:ADC独立模式单通道采集
推荐阅读
史海拾趣
1958年,Eagle-Picher公司的电池技术得到了重大的突破。在美国宇航局的探索者1号卫星上,Eagle-Picher的电池成功发射到太空,为卫星的运行提供了稳定的电源。这一里程碑式的事件标志着Eagle-Picher的电池技术在太空探索领域的应用达到了新的高度,也为公司赢得了更多的科研和商业机会。
2022年12月,中移物联网的OneNET城市物联网平台在2022中国移动全球合作伙伴大会上亮相。该平台以城市为核心,整合了各类物联网资源,为城市管理、公共服务等领域提供了全方位的物联网解决方案。OneNET城市物联网平台的推出,标志着中移物联网在物联网领域的技术实力和市场地位得到了进一步提升。
中移物联网自2012年成立以来,便致力于物联网专用网络的建设。根据中国移动的整体战略布局,公司开发并运营了物联网连接管理平台OneLink和物联网应用开放平台OneNET,为各行业提供稳定、高效的物联网连接服务。这些平台的建立,不仅满足了市场对于物联网连接的需求,也为公司后续业务的拓展奠定了坚实基础。
中移物联网始终秉持开放、合作、共享的发展理念,与国内外众多企业建立了紧密的合作关系。公司积极与硬件设备厂商、软件开发商、解决方案提供商等开展技术合作,共同推动物联网技术的创新与应用。同时,中移物联网还与行业协会、学术机构建立合作关系,加强技术交流和合作研究,为构建良好的物联网产业生态做出了积极贡献。这些合作不仅提升了公司的技术实力和市场竞争力,也推动了整个物联网行业的健康发展。
随着科技的进步,Eclipse Magnetics公司开始关注航空航天领域的需求。他们发现,在复杂的航空系统中,精确的磁性控制至关重要。于是,公司投入大量研发资源,成功开发出一系列高性能的磁性产品,为航空航天领域提供了可靠的解决方案。这一突破不仅巩固了Eclipse Magnetics在电子行业中的地位,还为公司赢得了众多知名客户的信任。
随着汽车电子市场的快速发展,三礼公司敏锐地捕捉到了这一市场的巨大潜力。2011年,公司成功开发了超薄型模压电感,并完成了全厂70%以上的精益生产配置。同年,公司还取得了车载规范TS16949认证,成为世界第一客户的主要供货商。这一成就不仅彰显了公司在电感领域的技术实力,也为公司进一步拓展车载市场奠定了坚实基础。
随着现代网络技术的发展,嵌入式系统如单片机、DSP等系统对接入网络的需求日益增加,例如具有远程抄表功能的电表系统、可以进行远程控制的信息家电系统等。本文采用TI公司的TMS320VC33 DSP芯片设计与Realtek公司的RTL8019网卡的硬件接口电路,并在DSP ...… 查看全部问答∨ |
|
章 Delphi串口(COM口)编程(附截图) 2009-06-27 19:45 因为公司有个读卡器由键盘口换成了COM口的,所以原来的程式要做个小小的调整,要改成从串口读数据。一般的系 ...… 查看全部问答∨ |
近来看见网上许多人讨论Silverlight for Embedded,不知MS有没有放出例子参考参考,在网上找了一下找不到,那位达人有的能贡献出来让大家参考一下吗?呵呵… 查看全部问答∨ |
正在学单片机 书中讲的是: push 后面的操作数只能是直接寻址方式 如:push 30H push ACC 还说:push A不对,也就是操作数不能是寄存器寻址 可书中的例子中却多次出现:push A 请问是不是书上印错了… 查看全部问答∨ |
我们开始行动起来吧!!! 新手注册后: 1、设置类似“水版”的版块,专门用于广告用户灌水用(制定相应规则,不遵守一律屏蔽发言)! 2、专业版块能看帖,不能发新帖,但可以回帖!回帖达到一定程度(还要看质量,要是夹杂广告,直接封号),向 ...… 查看全部问答∨ |
我需要在AD中断里面切换AD转换通道,但是只要在AD中切换通道得到的AD转换数据就不正常; 现象一、1、如果我在AD中断函数中只开启某一个AD转换通道,那么得到AD数据值a = (temp2<<8)+temp1,( 注释 temp2=ADC_DRH,temp1= ADC_DRL );a是正常的数 ...… 查看全部问答∨ |
|
板子给的cputimer程序有问题,希望各位大神帮忙参考一下,当DSP单步调试时寄存器CLKMD的值不发生变化,单步运行到while(*CLKMD & 0x01 );报错:寄存器不可读。还有它的软件等待状态寄存器的设置也报错。我怀疑给的程序有问题。程序如下: #inclu ...… 查看全部问答∨ |
目前用户最需要一个能将时序分析和SI融为一体的工具,并且界面优化,设置简单,同时又包括Design KIT。ICX Tau如果能够象Quantum-SI一样性能得到改进,必将提升人气,更受客户青睐。由于Mentor具有PCB设计前端和后端,ICX+Tau优势是其它工具 ...… 查看全部问答∨ |