DAC功能详解
1. DAC缓冲区操作
缓冲区大小为1~16可设置大小的以word为单位的区域,转换的时候,由读指针指向正在转换的数据,可通过访问读指针获知当前正在转换的缓冲区单元。数据转换的次序为从顶部到底部依次转换,从顶部到底部之间,用户可设置位置标记(watermark)作为预警位置,当读指针指向缓冲区顶部、底部或位置标记处时,都有状态位可供查询,也可以发出中断请求。如果DAC使能,但DAC缓冲区未使能,则DAC的数据一直来自DAT0寄存器,该数据被转换成模拟电压输出。改变该寄存器中的数据,当前输出的模拟电压也会立刻改变。
如果DAC和DAC缓冲区都使能,则缓冲区中被读指针指向的字数据会被转换成模拟电压,之后读指针会在硬件触发器或软件触发器的触发下,指向缓冲区中下一个字。
数据缓冲区的工作模式有三个,模式的切换不会改变指针指向的位置。指针的值可以被置为0到DACBFUP之间的任何一个值。
缓冲区普通模式为默认模式,在这个模式下,读指针在触发信号下每次加1,直到到达最高限,然后下一个触发信号到来时,指针回0。
摇摆模式和普通模式不同的是,当读指针到达底部时,并不直接回0,而是开始递减,一步步退回缓冲区顶部。
单次扫描模式是,读指针在触发信号下每次加1,直到到达最高限,然后停止。
DAC数据缓冲区中的读指针指向位置可以触发3个中断。一个是,当读指针到达缓冲区底部时,也就是最高限时。第二个是,读指针到达缓冲区顶部时,也就是起始位置时。第三个是,读指针到达用户设置的位置标记时。
2. DAC触发信号
当缓冲区使能时,DAC会在触发信号的驱动下轮流转换缓冲区中的数据。如没有触发信号,则当前DAC输出模拟电压的数据永远来自当前读指针指向的位置。如不使用缓冲区,则DAC转化无需设置触发器。
触发信号有两个选择,一个是软件触发,一个是硬件触发,通过DACx_C0寄存器中的DACTRGSEL位设置。默认情况下,选择硬件触发,硬件触发信号来自PDB模块,软件触发通过程序指令实现。
软件触发的方法是,只要向DACx_C0寄存器中的DACSWTRG位写1,即可实现软件触发。硬件触发则需要设置PDB模块,由PDB模块提供周期性的DAC间隔触发信号,详细可参见PDB模块设置。
3. 例程
将如下数组置于DAC缓冲区内,在触发信号触发下是实现连续转换,实现三角波输出。
[cpp] view plaincopy
uint16 DAC_DATA[]={255,511,767,1023,1279,1535,1791,2047,2303,
2559,2815,3071,3327,3583,3839,4095};
初始化代码如下:
[cpp] view plaincopy
void DAC0_Init(void)
{
uint8i;
SIM_SCGC2|=SIM_SCGC2_DAC0_MASK;//打开DAC0时钟
DAC0_C0|=DAC_C0_DACEN_MASK;//DAC使能
DAC0_C0|=DAC_C0_DACRFS_MASK;//参考电压2,选择VDDA
DAC0_C0&=~DAC_C0_DACTRGSEL_MASK;//使用硬件触发器
DAC0_C1|=DAC_C1_DACBFEN_MASK;//缓冲区使能
DAC0_C1|=DAC_C1_DACBFMD(1);//摇摆模式
for(i=0;i<=15;i++)//缓冲区初始化
{
DAC0_DATL(i)=DAC_DATA%256;
DAC0_DATH(i)=DAC_DATA/256;
}
}
有关硬件触发设置参考PDB模块的DAC间隔触发部分。
Nicrosystem专业提供freescale、TI和STM32高性价比开发板、解决方案
http://nicrosystem.taobao.com