历史上的今天
返回首页

历史上的今天

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

正在发生

2018年10月05日 | STM32关于使用定时器触发ADC转换的解决办法和详细说明

2018-10-05 来源:eefocus

以STM32 ADC的常规通道为例(注入通道类似):

STM32关于使用定时器触发ADC转换的解决办法和详细说明

如上图,STM32 ADC的常规通道可以由以上6个信号触发任何一个,我们以使用TIM2_CH2触发ADC1,独立模式,每次仅测一条通道,则ADC的配置如下:(以下代码使用STM32固件库V3.5)

void ADC_Configuration(void)

{

ADC_InitTypeDef ADC_InitStructure;

ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;

ADC_InitStructure.ADC_ScanConvMode = DISABLE; //关闭通道扫描模式

ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;

//注意不要使用持续转换模式,否则只要触发一次,

//后续的转换就会永不停歇(除非CONT清0),这样第一次以后的ADC,就不是由TIM2_CC2来触发了

ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T2_CC2;//配置TIM2_CC2为触发源

ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;

ADC_InitStructure.ADC_NbrOfChannel = 1;

ADC_Init(ADC1, &ADC_InitStructure);

RCC_ADCCLKConfig(RCC_PCLK2_Div6);//配置时钟(12MHz),在RCC里面还应配置APB2=AHB时钟72MHz,

ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 1, ADC_SampleTime_1Cycles5);  

ADC_Cmd(ADC1,ENABLE);

ADC_ResetCalibration(ADC1);

while(ADC_GetResetCalibrationStatus(ADC1));

ADC_StartCalibration(ADC1);           //Start Calibration register

while(ADC_GetCalibrationStatus(ADC1));//waiting for finishing the calibration

ADC_ExternalTrigConvCmd(ADC1, ENABLE);

//设置外部触发模式使能(这个“外部“其实仅仅是相对于ADC模块的外部,实际上还是在STM32内部)

}

这里再注意一点上面左图最顶上的那句话:当外部触发信号被选为ADC规则或注入转换时,只有它的上升沿可以启动转换。这跟下面的定时器2的正确配置关系很大。

 

void TIM2_Configuration(void)

{

TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

TIM_OCInitTypeDef TIM_OCInitStructure;

TIM_TimeBaseStructure.TIM_Period = 10000; //设置100ms一次TIM2比较的周期

TIM_TimeBaseStructure.TIM_Prescaler = 719;//系统主频72M,这里分频720,相当于100K的定时器2时钟

TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;

TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

TIM_TimeBaseInit(TIM2, & TIM_TimeBaseStructure);

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;//下面详细说明

TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//TIM_OutputState_Disable;

TIM_OCInitStructure.TIM_Pulse = 5000;

TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;//如果是PWM1要为Low,PWM2则为High

TIM_OC2Init(TIM2, & TIM_OCInitStructure);

TIM_Cmd(TIM2, ENABLE);

TIM_InternalClockConfig(TIM2);

TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable);

TIM_UpdateDisableConfig(TIM2, DISABLE);

}

还是来引用参考手册的原图:(截图引自通用定时器一章)

STM32关于使用定时器触发ADC转换的解决办法和详细说明

上图中红蓝两个框的中间部分,顶上是TIM2的自动重装寄存器和计数器寄存器,下面4个Capture/compare x register是TIM2_CCRx寄存器。

 

要使用TIM2的CC2来触发ADC,看懂这个图是关键。

首先要明确,这个图的红框部分和蓝框部分,是不会同时工作的,红框是配置为输入捕捉模式才能生效,蓝框是配置为输出比较模式才能生效,通过配置TIM2_CCMR1_CC2S来控制TIM2_CC2究竟是处于哪种模式(CC2S=0为比较输出,>0为输入捕捉),请注意:这里蓝框的其中一个输出是TIMx_CH2,而TIM2_CH2又是ADC规则通道的触发源,也就是说如果要触发ADC,则需要每次比较匹配时,在TIM2_CH2上产生一次上升沿。

 

那么我们首先需要操作蓝框内的最左边部分也就是OC2REF,要使比较匹配时发生一次上升沿,(以定时器向上计数为例)就需要在TIM2_CNT时,通道2为低电平,TIM2_CNT>=TIM2_CCR2时,通道2为高电平。

从参考手册定时器一章4.7节的CCMR1寄存器中的0C2M[2:0]的介绍可以看出来,只有在PWM模式才能满足上面所说的条件,任何单纯的冻结、配置OC2REF为高或者为低、强制OC2REF为高或者为低,都无法满足要求,不少同学就是死在这个上面,以为是配置TIMING模式,实际上这样根本无法改变OC2REF的电平,就无从触发ADC了。

CCMR1_CCxS(x为1、2、3、4,决定是哪个通道)是选择为捕捉输入还是比较输出,这里我们需要配置为输出。

以上两段配置程序,可以以100ms的周期驱动AD转换一次,不再需要使用TIM和ADC中断资源。

 

总结:想要使用STM32的定时器触发ADC,必须将定时器配置为比较输出PWM模式,并且一定要注意TIMx_CHx输出上升沿才出发,若是在比较匹配的瞬时产生的不是上升沿而是下降沿,那么就不一定是在比较匹配的瞬间触发ADC了,特别是在类似于电机控制的应用中要注意这一点。


推荐阅读

史海拾趣

CTS公司的发展小趣事

进入20世纪90年代,CTS公司迎来了重要的技术突破。随着Motorola通讯零件事业部的加入,CTS在无线通讯领域取得了显著进展,成为该领域的领先者。此外,CTS还积极投入研发,不断推出创新产品,进一步巩固了其在电子行业的地位。

Frequency Sources公司的发展小趣事

在20世纪90年代初,Frequency Sources公司(或类似名称的公司)凭借其在频率源技术领域的深厚积累,成功研发出了一种新型高精度晶体振荡器。这种振荡器在稳定性、相位噪声和温度特性等方面均达到了当时业界的顶尖水平,为无线通信、卫星导航等领域提供了关键的技术支持。这一技术创新不仅巩固了公司在频率源技术领域的领先地位,还为公司赢得了广泛的市场认可和大量订单。

Hosiden Corporation公司的发展小趣事

Hosiden Corporation的创立可以追溯到其早期作为电子元器件制造商的起步阶段。公司自成立以来,便专注于电子连接器和电缆的研发与生产,逐步在汽车电子、医疗和工业市场等领域建立起稳固的市场地位。通过不断的技术积累和产品质量提升,Hosiden逐渐在竞争激烈的电子行业中崭露头角。

Heatron公司的发展小趣事

随着全球对环保和节能问题的日益关注,Heatron公司积极响应号召,致力于研发和生产环保节能的电加热产品。公司投入大量资源于新材料、新技术的研发中,成功推出了一系列低能耗、高效率的加热器产品。这些产品不仅满足了市场对环保节能的需求,还进一步巩固了Heatron在电子行业中的领先地位。

Eurofarad公司的发展小趣事

Eurofarad,作为Exxelia Technologies旗下的知名品牌,自1965年成立以来,就专注于电子元件的设计和制造。在创立初期,Eurofarad凭借对电子技术的深入研究和对市场需求的敏锐洞察,迅速推出了多款高性能、高质量的电子元件产品。这些产品在市场上获得了广泛的认可,为Eurofarad的后续发展奠定了坚实的基础。

CML Microcircuits公司的发展小趣事

面对未来电子行业的挑战和机遇,CML Microcircuits公司制定了可持续发展的未来规划。公司将继续加大在研发和创新方面的投入,推动技术的不断进步。同时,CML还将关注环保和可持续发展的问题,积极采用环保材料和节能技术,降低生产过程中的能耗和排放。此外,公司还将加强与全球合作伙伴的合作,共同推动电子行业的可持续发展。

这些故事虽然基于虚构,但它们展示了CML Microcircuits公司可能经历的发展路径和关键事件。在实际情况下,公司的发展可能受到多种因素的影响,包括市场环境、技术趋势、竞争态势等。因此,对于CML Microcircuits公司的真实历史和发展情况,还需要进一步了解和分析相关资料。

问答坊 | AI 解惑

谷歌CEO施密特:与雅虎合作计划有望10月落实

北京时间9月1日消息 据国外媒体报道,谷歌CEO埃里克·施密特在接受彭博电视台采访时称,希望美国政府能批准谷歌与雅虎的合作]计划,使该计划能在今年10月开始实施。 据彭博电视台在科罗拉多州丹佛市进行的一次采访,美国政府正在审查两家公司的网 ...…

查看全部问答>

我对SDRAM的深入理解

我了解事物喜欢从底层根本去了解,而不是你说什么我照做就行了,我会形成一些探寻究竟的念头,也会产生很多疑问。 讨论之前当然要先看过某厂的datasheet,我看的是Micron。 按上面说,terminate和precharge都能掐断burst读或写。我也是第一次用Sd ...…

查看全部问答>

有经验者进来说说吧!英语四级很重要吗?

    对于计算机专业的人来说,英语四级很重要吗?现在很忙,根本顾及不了英语,而老师也把它说得很重要。当然,我忙是因为自己的专业,而不是去浪费时间。    对于已经在社会工作的前辈们,你们认为英语四级重要吗?  & ...…

查看全部问答>

STM8的标准库头文件包含是不是有点问题?

在stm8s_conf.h中有如下语句: /* Includes ------------------------------------------------------------------*/ #include "stm8s.h" 在stm8s.h中有如下语句: #ifdef USE_STDPERIPH_DRIVER #include "stm8s_conf.h" #endi ...…

查看全部问答>

基于51的无线多点粮仓温湿度监控系统 (初次发贴多多关照)

                                      &n ...…

查看全部问答>

430launchpad G2553 定时器A模拟串口困惑

定时器A模拟串口发送时,DEMO里有这么一句:       if (RXTXData & 0x01)                  //判断最低位是否为1       CCTL0 &= ~ OUTMO ...…

查看全部问答>

青风Hanker TI M4 开发板开发应用教程-----第一集:硬件介绍:

    前述:    在作为TI国内最大最全的技术论坛,TI的MCU应该占有非常重要的地位,并且TI已经整合了LM的cortex技术,推出自己的产品:    TM4C123GH6PZ是 TI公司的是基于ARM Cortex™-M4F处理器核的32位MCU, ...…

查看全部问答>

单相功率因素的检测,大家有什么好方法么

本帖最后由 paulhyde 于 2014-9-15 03:22 编辑 功率测量电路比较纠结啊。。大家有什么好的想法来讨论下?    …

查看全部问答>