经过ADC进行信号采样是MCU运用的常见使命,这能够将接连模拟信号转化为一系列离散的数字数据供MCU处理。在某些运用中,单个ADC需求以高采样率对多个通道进行采样。例如电源监测体系的办理子体系需求对多个稳压电源的输出进行采样,以监测体系的作业状况;再如在依据传感器的运用中,MCU需求对多个传感器进行采样以完结体系反应。
咱们有位客户想运用一片赛普拉斯的PSoC4完结用1MSps采样率采样16个通道的规划,16个通道的总采样时长不能超过19μs。但PSoC4内置的多路复用器(SARMUX)只支撑8个通道。本文将介绍怎么经过PSoC内部的可编程模块战胜这一规划难题。
剖析规划需求
首要咱们需求仔细剖析规划需求。客户把16个输入的完好采样视为一个采样周期。如图1所示,一个采样周期的最大时长限制为19μs。每个采样周期之间可运用中止服务恳求(ISR)存储采样成果。
图1:对16通道采样的时序。
若要用一个8通道SAR来完结这个方针,咱们需求运用PSoC4片内的通用可编程数字模块(UDB)完结定制规划。该规划运用PSoC4片内的数字信号互联(DSI)完结多路复用器切换采样通道,并且在采样周期结束时将采样成果缓冲在依据数据通路(datapath)的FIFO中,然后经过中止服务子程序(ISR)悉数读取出来。
数据通路是UDB模块中最灵敏的部分。每个UDB模块包括一个数据通路,每个数据通路包括一个具有多个寄存器的8位ALU。UDB结构和数据通路功用的具体介绍请参阅PSoC4技能参考手册。每个数据通路可完结一个8字节FIFO。咱们需求四个FIFO来缓冲16个12位SAR采样成果。
图2:16通道SAR采样。
图2显现的是依据DSI的多路复用器,能在多个输入之间主动切换当时的采样通道。图3显现的是硬件FIFO的概览图。
图3:用于缓冲采样成果的四个8字节FIFO。
装备SAR组件
SAR被装备成单端形式采样单个输入通道,输入电压规模在0~Vdd之间,1MSps采样率。在收到采样触发信号后,SAR就开端输入信号收集,收集结束后发生一个“SDONE”信号,该信号被送入DSI网络,并被命名为“ADC_SDONE”。PSoC Creator规范组件库中供给的SAR组件无法支撑输出采样成果到DSI总线上。因而,咱们需求把SAR组件导入到项目中并加以修正,如图4中的赤色部分所示。
图4:具体规划—修正SAR组件。
图5所示的是SAR组件的输出衔接。在SAR_Start函数之后,咱们还需求增加一行代码,使得SAR能将采样成果输出到DSI网络,如下所示:
// start SAR component and wait for conversion trigger
SAR_Start();?
// enable SAR sampling result output on DSI
*((reg32 *)(SAR_SAR_CHAN_CONFIG_IND + (uint32)(0 2))) |=
SAR_DSI_OUT_EN;
图5:具体规划—SAR的输出衔接。
依据DSI的多路复用器
如图6中蓝色部分所示,经过DSI操控的硬件多路复用器替代SARMUX,以用于切换16个通道。选用SWITCH_CLK时钟触发Count7单元,以生成通道挑选信号,这样每次通道转化可分为两个阶段:信号收集和转化。
图6:依据DSI的MUX和触发信号生成。
信号收集完结之后,信号将保持在SAR中,此刻可切换输入通道。因而用于显现信号收集阶段完结的SDONE可用于通道切换。实践上,SWITCH_CLK是依据DSI信号“ADC_SDONE”(SDONE)界说的时钟,其设置见图6的“cydwr”页面。
图7:规划规模资源的时钟界说。
Count7单元归于定制组件,不在规范组件库的规模内。它是一个递减计数器,输出当时的计数器值给DSI。其默认值初始值为0x7F。因而通道挑选的规模是从#15到#0。在主程序中增加以下代码完结对Count7的操控。
/* Enter critical section */
interruptState = CyEnterCriticalSection();
/* Set the Count Start bit */
MYCOUNT7_AUX_CTL |= (1 5);
/* Exit critical section */
CyExitCriticalSection(interruptState);
// set default value of count7 as 0x7F
MYCOUNT7_COUNTER = MYCOUNT7_PERIOD;
生成SAR的采样触发
第1步:在完结当时采样作业之前生成下一个触发信号
由于针对SAR只要一个实践输入,因而一旦完结对当时通道的采样,SAR就需求为下一次采样触发信号。许多信号都适用于此意图,但触发信号挑选应遵从以下两个规矩:
1. 在触发信号和当时采样完结之间不该存在距离,乃至触发信号能够提早发生,这样就能够下降推迟。
2. 触发信号有必要保证不会损坏当时采样作业。
依据上述规矩,可挑选SDONE和EOC用于触发。但运用EOC将使每通道采样时刻至~1.4μs,这是由于触发信号上升沿时刻和SAR开端采样之间存在开支。SAR需求至少5个SARADC_CLK时钟来将DSI触发信号转化为信号采样开端。咱们的规划要求愈加严苛。EOC信号与SARADC_CLK上升沿同步。在穿过DSI网络,并抵达SAR的SOC(开端转化)之后,就已经略滞后于采样时钟的上升沿。因而,它需求6个SARADC_CLK时钟或大约340ns触发发生耗时。
咱们有必要寻求另一种触发信号。走运的是在SAR作业时,其可存储一个触发信号,但仅限一个,用于下一次扫描。因而咱们能够运用SDONE触发转化。让触发发生耗时与SAR转化时刻并行,SAR就可在当时转化完结之前存储该触发事情。现在对16通道的采样咱们能有1μs的转化时刻(见图12中的SDONE周期)。
第2步:在每次采样周期结束时暂时中止触发信号生成
在每次采样周期结束时,咱们需求暂时中止触发信号生成,不然继续不断的采样将使FIFO溢出。如图6的赤色部分所示,在挑选通道0时,需封闭同步的D触发器(DFF)以暂时中止触发器输出。而在FIFO被ISR清空后,则需运用0x7F重置Count7单元,然后从头启用DFF输出。一起,应运用固件触发的方法在新周期中开端榜首通道的采样,如图8所示。
图8:SAR ADC时序。
FIFO操控
UDB可装备为8字节FIFO,用于存储来自DSI网络的数据。图9显现了装备数据通路的概览图。FIFO时钟将数据采样到FIFO。F0 Load和F1 Load担任启用或禁用FIFO。两个状况信号可提示FIFO Full事情。
图9:针对8字节FIFO的数据途径装备。
图10所示的是FIFO的作业时序。12位SAR成果别离存储在LSB_FIFO和MSB_FIFO中。Count7单元可对从15到0的通道进行排序。因而通道15到8存储于FIFO上部,通道7到0存储于FIFO下部。加载信号依据FULL状况和启用信号而生成。
图10:FIFO时序。
最终四个通道的成果一旦存储结束后就会触发ISR读取FIFO。FIFO Enable运用Count7单元的位(如图11的赤色部分所示),一起该位也与SWITCH_CLK(SDONE)同步。这样可保证EN改变不会损坏FIFO采样。
图11:为FIFO生成EN的具体规划。
规划测验
图12所示的是一个采样周期。十六个SDONE和EOC脉冲表明通道转化。十六个FIFOCLK和一个FIFO的FULL信号可对最终四个成果进行缓冲,用于阐明FIFO的作业状况。请注意,SDONE和FIFOCLK之间的距离是1μs。
图12:测验成果——一个采样周期中的信号。
图13是多个采样周期的波形。将数据从FIFO存储到SRAM的两个周期之间的距离是大约9.56μs。
图13:测验成果——多个采样周期。