新闻中心

EEPW首页 > 模拟技术 > 设计应用 > 微控制器无需CPU即可生成同步正弦波与余弦波

微控制器无需CPU即可生成同步正弦波与余弦波

作者:时间:2006-11-17来源:网络收藏
嵌入式系统通常需要数模转换器(DAC)生成模拟电压与波形。DAC有时用作嵌入式处理器的外置器件,有时集成至处理器中。无论哪种情况,都必须在适当时间将预期输出值写入DAC。一般情况下我们采用定时器中断写入预期值来实现上述目的。如果DAC必须生成周期波形,须从表格写入下一个值,递增数据表指针(tablepointer),并且检查表格边界,以便确定何时复位数据表指针。

将周期值写入DAC的过程要求CPU开销保持输出波形。所需要的CPU开销取决于数据表的长度、输出波形的频率以及CPU的工作频率。例如,为了每个周期采用32个数据点生成1个1kHz的,在CPU频率为1MHz情况下要求CPU每秒能够处理32000个中断信号。处理如此多的中断仅在中断之间留下1000000/32000=31.25个CPU指令周期。针对上下文切换与执行,如果每个中断服务只需要15个CPU周期,所需CPU开销就会达到近50%。

如果应用要求第二个模拟输出波形,那么CPU负载将会增大,甚至在所需的中断服务时间内不能更新两个DAC。MSP430F15x/16x器件是解决该问题的良好方案。这些器件集成了两个DAC与1个DMA控制器。DMA控制器的用途是在无需CPU干预情况下将数据从一个位置转移到另一个位置。在本例中,DMA能够在规定时间内将数据从数据表转移到2个DAC。数据转移结构图如下所示。



DMA控制器具有三条独立的通道。每条通道在配置后都可以用于将数值在任何地址之间进行转移。因此,一个数据表可以同时用于,而两条DMA通道只需存取数据表的不同部分,以便形成正弦与余弦输出。

此外,每条DMA通道都可以独立递增其源地址或目的地址。本例中,每条DMA通道编程后递增其源地址,但目的地址不变,始终为其对应的DAC数据寄存器。

DMA传输次数也可以配置。在每条DMA通道传输完已编程数据值数量之后,即可以从最初编程的源地址开始进行下一次传输,从而使每条DMA通道都构成一个带数据表的环形缓冲区并生成周期波形。

为移动数据值,每条DMA通道都需要一个触发器。本例中,来自每个DAC的中断标记用作其相应DMA通道的触发器。如果2条通道同时触发,则需要对DMA通道进行优先排序,这样一来,会在其中一个接收数据的DAC中造成延迟,进而造成输出信号失真,因此应单独处理DAC更新。

这些器件中的每个DAC都能通过定时器触发,这样在需要下一个DAC数据值之前就可以将其加载到DAC数据寄存器中,当定时器触发DAC时,每个DAC均能输出新的值。本例中设置由Timer_A1输出信号触发每个DAC。由于2个DAC采用相同的触发信号,因此每个DAC的输出波形相互同步,以便保持相应的正弦/余弦关系。

下面列出完整代码以及2个输出波形的示波器画面。

------------------------------------------------------------------------- #defineFS_Val4095


staticintSin_tab[40]={
0.500*FS_Val,
0.598*FS_Val,
0.691*FS_Val,
0.778*FS_Val,
0.854*FS_Val,
0.916*FS_Val,
0.962*FS_Val,
0.990*FS_Val,
1.000*FS_Val,
0.990*FS_Val,
0.962*FS_Val,
0.916*FS_Val,
0.854*FS_Val,
0.778*FS_Val,
0.691*FS_Val,
0.598*FS_Val,
0.500*FS_Val,
0.402*FS_Val,
0.309*FS_Val,
0.222*FS_Val,
0.146*FS_Val,
0.084*FS_Val,
0.038*FS_Val,
0.010*FS_Val,
0.000*FS_Val,
0.010*FS_Val,
0.038*FS_Val,
0.084*FS_Val,
0.146*FS_Val,
0.222*FS_Val,
0.309*FS_Val,
0.402*FS_Val,
0.500*FS_Val,
0.598*FS_Val,
0.691*FS_Val,
0.778*FS_Val,
0.854*FS_Val,
0.916*FS_Val,
0.962*FS_Val,
0.990*FS_Val
};

voidmain(void)
{
WDTCTL=WDTPW+WDTHOLD;//StopWDT
ADC12CTL0=REF2_5V+REFON;//Internal2.5Vref

//SetupDMAtriggersforbothDMAchannels
DMACTL0=DMA0TSEL_5+DMA1TSEL_5;//DAC12IFGtrigger

//SetupDMA0
DMA0SA=(int)Sin_tab;//Sourceblockaddress
DMA0DA=DAC12_0DAT_;//Destinationsingleaddress
DMA0SZ=0x20;//Blocksize
DMA0CTL=DMADT_4+DMASRCINCR_3+DMAEN;//Rptsinglech,incsrc,word-word

//SetupDAC0LoadwithTimer_A,groupwithDAC1
DAC12_0CTL=DAC12LSEL_2+DAC12IR+DAC12AMP_2+DAC12IFG+DAC12ENC+DAC12GRP;

//SetupDMA1
DMA1SA=(int)Sin_tab+8;//Sourceblockaddress
DMA1DA=DAC12_1DAT_;//Destinationsingleaddress
DMA1SZ=0x20;//Blocksize
DMA1CTL=DMADT_4+DMASRCINCR_3+DMAEN;//Rptsinglech,incsrc,word-word

//SetupDAC1LoadwithTimer_A
DAC12_1CTL=DAC12LSEL_2+DAC12IR+DAC12AMP_2+DAC12IFG+DAC12ENC;

//SetupTimer_A
CCTL1=OUTMOD_3;//CCR1set/reset
CCR1=1;//CCR1PWMDutyCycle
CCR0=3;//ClockperiodofCCR0
TACTL=TASSEL_1+MC_1;//ACLK,upmode

//TurnOffCPUforever
LPM3;
}
-------------------------------------------------------------------------


最后,每次DMA传输都会强行占用2个CPU时钟周期。虽然CPU并不用于传输操作,但时钟周期的占用会造成必要的CPU开销且大于零。不过,对于1kHz的来说,假设有32个数据点,第31.25个数据点之外的2个周期仅需要6.4%的开销,相比之下不使用DMA时开销达到近50%。另外,产生2个波形只需要4个周期或7.8%的开销,而在不使用DMA时几乎不可能产生2个1kHz正弦波。



评论


相关推荐

技术专区

关闭