历史上的今天
返回首页

历史上的今天

今天是:2024年12月04日(星期三)

正在发生

2019年12月04日 | AVR/Arduino定时/计数器、中断入门

2019-12-04 来源:eefocus

在Arduino中,可以使用AnalogWrite来使用硬件产生490Hz/980Hz的pwm波,并可根据参数来设定占空比。不了解这个的同学可以去AnalogWrite学习下,SecretsOfArduinoPWM也是讲了Arduino在avr的定时/计数器上做的封装,我们这里并不讲Arduino相关,而是讲AVR的定时/计数器,如何产生更多PWM波和定时/计数器的中断使用。

AVR Timer/Counter(以下统称Timer)

以ATmega358p为例,其内部拥有一个16位计时器,两个8位计时器,下图则为16位计时器的大致图解:

对于没有接触过avr内部的Arduino同学来说,这张图看不出来任何意思,别急,这些都是AVR-GCC里定义的缩写,我们先来解释下图中的缩写对照:

缩写全称
TCNTTimer/Counter Register
TCCRTimer/Counter Control Register
OCROutput Compare Register
OCOutput Compare Match Output
ICRInput Capture Register
Int.ReqInterrupt Request
TOVTimer Overflow
ICFInput Capture Flag

而图中TCNT为主要工作部件,其工作模式的是依据TCCR的设定值。以该16位计时器为例,该计时器在ATmega358p中的序号为1,则其所有缩写都会与1有关,即TCNT1的工作模式由TCCR1A和TCCR1B来决定。不急着看别的,我们先来瞅瞅TCCR1A与TCCR1B是怎么来配置TCNT1的工作模式的:

TCCR1A:

图中7、6、5、4位分别应该是COM1A1、COM1A0、COM1B1、COM1B0,话说这datasheet有时候也真是会省事儿

TCCR1B:

这两个寄存器都是八位寄存器,再来一张表来对照一下图中的缩写:

缩写全称
COMnACompare Output Mode for Channel A
COMnBCompare Output Mode for Channel B
WGMWave Generation Mode
ICNCInput Capture Noise Canceler
ICESInput Capture Edge Select
CSClock Select

我们通过配置这两个寄存器来控制TCNT1的工作模式,通过配置WGM来选择波型生成模式,主要有Fast PWM/PWM Phase Correct/CTC模式,并且也拥有不同的计数TOP值,有0xFF/ICR1/OCR1A等,通过COM结合WGM对针脚的输出做配置,用CS来选择生成波型的prescaler,分别有1/8/64/256/1024,或者外部时钟。TOP值为ICR1或OCR1A时,要对使用的寄存器进行赋值。工作模式中,Fast PWM与PWM Phase Correct这两种计数模式不同的是,PWM Phase Correct可以到达top值后又递减至0,Fast PWM到达top值后则会触发上升或下降沿。

如下配置:


TCCR1A = _BV(COM1A1) | _BV(COM1B1) | _BV(WGM10);

TCCR1B = _BV(CS12) | _BV(CS10);

//WGM配置了PWM Phase Correct,使用的TOP值为0x00FF

//COM配置了在往上计数时清零,往下计数时置位

//使用了1024的prescaler

OCR1A = 100;

OCR1B = 50;


则我们可以得到的时钟频率为Fclk/(prescaler*TOP)=16000000/(1024*255)/2=30.63Hz,且OC1A占空比为OCR1A/TOP=100/255=39%,OC1B占空比为OCR1B/TOP=50/255=19.6%。

更多配置组合请看SecretsOfArduinoPWM/PWM的秘密或直接datasheet,其中要注意的是,使用OCR1A为TOP值时,可以在一定范围内配置任意频率,但OC1A的占空比为始终为50%,OC1B的占空比为(OCR1B+1)/(OCR1A+1)。

Interrupt

中断是其它与CPU异步进行的硬件与CPU交互的一种方法。这样我们就不用在CPU中去等待其它某些任务的完成和触发状态,由其它硬件去来触发进入CPU主进程的时机。回头看第一张大图,在图中可以找到四处(Int.Req),分别是TOVn(Timer/Counter Overflow), OCnA(Output Compare A Match), OCnB(Output Compare B Match), ICF(Input Capture Flag),根据字义我们便可了解到该中断的作用,在使用中断时,我们要先于TIMSK1(Timer/Counter 1 Interrupt Mask Register)中开启相应的中断位。

下图为TIMSK1:

图中的字母应为ICIE1, OCIE1B, OCIE1A, TOIE1,这数据手册,也是太懒了。下表为对照:

缩写全称
ICIEInput Capture Interrupt Enable
OCIEOutput Compare Interrupt Enable
TOIETimer/Counter Overflow Interrupt Enable

开启该遮罩位后,便可打开中断,前提也是在全局中断打开的情况下(sei()为打开全局中断,cli()为关闭全局中断)。在当下的AVR-GCC环境中,我们使用宏命令ISR来定义中断程序,使用方法如下:


ISR(xxxx_vect)

{

    // user code here

}


而这里的xxxx_vect则是要监听的中断向量地址,可以于Atmel官网: Interrupts上找得到所有中断对应的向量名称。

如上面的四种向量,于mega328p中,则分别对应:

ICIE1TIMER1_CAPT_vect
OCIE1ATIMER1_COMPA_vect
OCIE1BTIMER1_COMPB_vect
TOIE1TIMER1_OVF_vect

而中断又分为两种,一种为事件触发型,这种中断会在上一个中断没有运行结束前队列等待,直至前面优先的任务完成后才能执行;另一种为中断条件触发,如果上一个中断还没有返回回来,那么则不会触发这个中断(如果定时器为高频时则会出现该情况)。所以在使用中断的时候,进入中断、跳转、返回都需要耗费时钟,不要对高频使用中断,甚至会使主线程一直处于堆栈状态,且中断中不要运行太多程序。


There are basically two types of interrupts: The first type is triggered by an event that sets the Interrupt Flag. The second type of interrupts will trigger as long as the interrupt condition is present


The traps when using interrupts中也是罗列了一些使用中断的坑和技巧,可以看看。附上Atmega328p的datasheet,真是有问题就看datasheet,上面的图与摘录都是从datasheet里出来的。

Have fun

推荐阅读

史海拾趣

General Magnetics Inc公司的发展小趣事
采用更高效的散热方式,如增加散热面积、优化风道设计等,以降低电子变压器的运行温度。
Diodes公司的发展小趣事

随着科技的快速发展和市场的不断变化,客户需求也在不断更新。为了满足客户不断变化的需求,Diodes公司始终保持敏锐的市场洞察力和创新力。公司不断推出新产品、新技术和新应用方案,以满足客户在性能、可靠性、成本等方面的需求。同时,Diodes还积极与客户沟通交流,了解客户的实际需求和反馈意见,不断优化产品和服务。这些努力使得Diodes能够紧跟市场步伐、满足客户需求,在激烈的市场竞争中保持领先地位。

Global Mixed-Mode Technology Inc公司的发展小趣事
三相缺相报警灯电路可以与其他电气保护设备配合使用,共同保障电气系统的安全稳定运行。例如,当三相缺相报警灯电路检测到缺相情况时,可以发出警报信号给操作人员或监控系统;同时,断路器或过载保护器等设备也可以根据设定的保护参数来切断故障电路或降低负载功率等措施来防止设备损坏或生产事故的发生。这些设备之间通过电气信号或控制逻辑相互关联和配合工作。
汇科公司的发展小趣事

与山东汇科电气技术有限公司不同,苏州汇科技术股份有限公司成立于2000年,是一家专业从事开发、设计、制造各式工业窑炉的技术型企业。公司位于江苏省常熟市辛庄工业开发区,凭借对技术的执着追求和对品质的严格把控,逐渐在行业中崭露头角。多年来,苏州汇科技术股份有限公司通过不断的技术创新和产品升级,赢得了客户的广泛认可和市场的信赖。

Defender Security公司的发展小趣事

物联网技术的快速发展为网络安全带来了新的挑战和机遇。Defender Security公司积极应对这一变化,加大了对物联网安全领域的投入。他们与多家物联网企业合作,共同研发了适用于物联网设备的安全防护方案。通过不断优化和升级产品,Defender Security成功帮助物联网企业解决了安全问题,同时也为自己带来了新的增长点。

艾为(AWINIC)公司的发展小趣事

2015年7月,艾为电子成功挂牌新三板,迈入了资本市场的新征程。上市以来,艾为电子充分利用资本市场的优势,加快了技术研发和市场拓展的步伐。同时,公司还积极寻求与国内外优秀企业的合作机会,通过引入战略投资者和开展资本运作,为公司的未来发展注入了新的动力。

这五个故事从不同角度展现了艾为电子在电子行业中的发展历程和成就,体现了公司不断追求卓越、创新发展的精神风貌。随着科技的不断进步和市场的不断变化,相信艾为电子将继续保持其竞争优势,为电子行业的发展贡献更多力量。

问答坊 | AI 解惑

难分伯仲的PLD双雄——Xilinx和Altera (二)

难分伯仲的PLD双雄——Xilinx和Altera (二) 三、DSP变数   在过去一年左右的时间里,尽管Xilinx与Altera的收入都有增长,但是双方的争斗处于相对平静的状态。在2004至2005年期间,Xilinx的收入 ...…

查看全部问答>

基于FPGA的多路数字量采集模块设计

1 引言 测控系统常常需要处理所采集到的各种数字量信号。通常测控系统采用通用MCU完成系统任务。但当系统中采集信号量较多时,仅依靠MCU则难以完成系统任务。针对这一问题,提出一种基于FPGA技术的多路数字量采集模块。利用FPGA的I/O端口数多且可 ...…

查看全部问答>

恩智浦Cortex开发板免费申请

恩智浦Cortex开发板免费申请 希望批准…

查看全部问答>

Zigbee与nanotron CSS技术定位特性比较

 目前在市面上有多种定位系统,包括Zigbee、WiFi等,以及最新的CSS定位系统。从定位原理上分析,一般的定位系统都可以归纳到基于时间的系统、基于信号强度系统,而这两类系统都有着各自的共性。下面以这两种系统的典型代表CSS系统(基于时间)和Zi ...…

查看全部问答>

1G甚至更高频率的示波器国内为何做不上去?

国内示波器为何做到高端就没法做上去了?300M以下的产品比较成熟了,问题出在哪?…

查看全部问答>

Stellaris驱动库用户指南

目录第1章 简介.................................................................................................................1第2章 编译代码........................................................................................ ...…

查看全部问答>

DA中settling time和update rate的关系

在DA的选型中我们经常发现settling time要大于update rate的倒数。快速率的转换, 需要短的output rising time 才能让输出能够跟上. settling time一般是指两个码之间的转换的rising time + 输出稳定到一定精度内的时间,一般是是输出最终稳定到0.1 ...…

查看全部问答>

NRF24L01

大家有人知道NRF24L01在发送的同时还能接收吗?就是发送和接收互不影响,如果有人搞出开来请至电,最好程序能让我参考一下,谢谢了…

查看全部问答>

同样的函数多嵌套了一层就不能运行了

while(1) {        Load_Sys_ICO3( ); //    AI_LoadPicFile(\"0:/sg.bmp\",34,30,134,60); //         AI_LoadPicFile(\"0:/qu.bmp\",168,30,223,60); //         AI ...…

查看全部问答>

isplever8.1里面没有gal16v8这个芯片

isplever8.1里面找不到gal16v8这个芯片,现在官网上资料也没找到啊,求助 …

查看全部问答>