本帖最后由 洋葱圈 于 2013-11-25 13:58 编辑
PDB是什么意思,英文全称是Programmable Delay Block,即可编程延时模块。从中文字面意思上看,每个字都那么熟悉,但是就是无法理解是什意思,很正常,但是再仔细看下技术文档中对该模块的简要介绍,应该就略知一二了吧。下面是文档中英文介绍的翻译:
“可编程延时模块(PDB)为ADC输入的硬件触发或DAC生成的间隔触发提供可控制的内部或外部触发或可编程的间隔时间,以便能使ADC的转换或者DAC的更新达到精准定时。”
上面的介绍是一整句话,但是已经阐释了PDB的整个功能。别看它这么长,说白了就是为ADC或DAC提供硬件触发的,再具体点就是提供什么触发呢,可以提供来自单片机内部模块的触发、外部的触发或者软件可编程的触发。来自单片机内部的模块的触发可以是CMP、PIT、FTM等等。也就是说PDB可以理解为一个桥梁,它接受不同来源的触发,转而再去触发ADC或DAC模块,相当于ADC、或DAC的管家一样。
PDB工作原理
之前的废话要讲清楚PDB的工作原理,真的不是一件简单的事情,如果按照技术文档的流程来看,你会越看越晕。技术文档的流程是先介绍特点、再介绍具体的寄存器最后进行功能描述。虽然符合书写原则,但是对于新手来讲确实如同天书一般。我是如何看的呢,如果我对这个模块不了解,那么我会先看一些关于该模块的简要介绍、特点,再去看章节最后一部分的功能描述(Functional Description)。这些功能描述往往会捎带上寄存器的初始化流程、模块的运行流程等信息,这样我就对这个模块有了大体上的了解,最后再去逐一攻破细节。
看懂PDB模块图说了这么多看技术文档的心得,其实是为我接下来的描述找后路,因为很可能你会看不懂我的描述,呵呵。如果真是这样,那就赶紧去啃技术文档吧。我接下来也只是说说PDB的重点需要描述的地方,告诉大家我对于PDB工作方式的理解。首先看下PDB的模块图解,改图描述了整个模块内部的关系机理。 图中两个关键的部分分别是绿框和红框部分,没有这两部分,PDB的工作无从谈起。
绿框部分是PDB的计数器部分,和大部分涉及到时间的外设模块一样,PDB也有计数器、MOD模寄存器等等。有了计数器,就有了基本的定时功能,也就可以控制触发的时间了。由“PDB Counter”框出来的引线,分别引向了橙色框“控制逻辑”部分、蓝色框“中断延时”部分和黄色框“ADC通道触发”部分。也就是说,PDB计数器分别会向这几部分提供计数支持。
蓝框部分是PDB的中断延时功能,当PDB计数器“PDB Counter”的值等于蓝框中“PDBIDLY”寄存器的值时,PDB会根据TOEx位来判断是否产生PDB中断。有了这个功能,PDB就可以被当做一个普通的周期中断定时器来使用了。
橙色框部分是控制逻辑模块,该模块可以理解为是用来控制PDB寄存器复位的。那么那些事件可以引起“PDB Counter”的复位呢?首先看绿框,当“PDBCNT”寄存器的值等于“PDBMOD”模寄存器的值时就会告诉“Control Logic”模块计数器到达预设上限了。如果“CONT”位为1表示PDB为连续工作模式,则“Control Logic”通知“PDB Counter”复位重新计数,如果果“CONT”位为0表示PDB为单次转换模式,则“Control Logic”等待触发事件的到来,这个触发事件就是红框表示出来的部分。当触发事件发生,则“Control Logic”通知“PDB Counter”复位重新计数。
红框部分就是上面说的触发模块了,触发源由“TRIGSEL”位进行选择,触发源可以是Trigger-In 0~14或“SWTRIG”软件触发中的任意一个。从图中还可以看出,触发源出来的引向不止用来控制PDB的复位,还引向了“DAC interval trigger x”DAC间隔触发器,也就是说,触发源可以触发DAC间隔触发器产生DAC触发,当“DAC Interval Counter x”间隔计数器的值等于“DACINTx”的值的时候,就会输出DAC触发事件。另外触发源还引向了黄框的部分,即ADC。
黄色框是通道n的预触发m模块,什么n呀m啊估计你已经荤菜了。简单理解就是n代表ADC的0或1模块,m为ADCx的A或B组通道。也就是说“Ch0 pre-trigger 0”用来触发ADC0的A组通道,同理“Ch0 pre-trigger 1”用来触发ADC0的B组通道。名字理解了,但是这个黄框内的复杂关系估计还是会让你晕菜,没关系,我们从已知的部分开始看。当触发源控制计数器复位开始计时后,“PDB Counter”的值就一直和“PDBCHnDLYm”的值进行对比,当相等后就会最终输出“Pre-trigger m”事件,这个就是ADC的硬件触发信号。图中的什么Ack、BB等等信号,是Back to Back模式中需要用到的,这个我们会在以后讲到,今天大家能消化这些就不错了。
什么是预触发可能有朋友会问了,触发就触发呗,怎么还搞个预触发,太复杂了。其实仔细想想就不难理解,从上图的模块图中不难看出,触发源只能选择一个,而相对来说ADC0模块有两组通道A和B,如果PDB在收到触发后就就立即触发A和B组是不可能的,因为ADCx的每组通道是不可能同时进行转换的,必定有一个先后顺序,有了先后顺序就必定需要有延时等待,因此就需要了上面讲到的“PDBCHnDLYm”通道延时寄存器,而这个延时计数的过程就是预触发过程,当“PDBCHnDLYm”的值等于“PDB Counter”的值时所导致的触发就是预触发。我们还可以从下面的示例图中看出这个过程:
当PDB接收到了触发源的输入事件后(红色线开始),“PDB Counter”就会开始计数,持续“PDBCHnDLY0”的时间后,也就是黄色线的长度,会产生“Ch n pre-trigger 0”预触发信号,与此同时,对应产生“Ch n trigger”通道n的触发事件。以此类推,当等待“PDBCHnDLYm”的时间后,产生“Ch n pre-trigger m”预触发信号和对应的触发信号。
|