DAC7718是TI公司产的一款12位双极性DA芯片,发现用的人特别少……经过种种波折,终于搞定……保持风格,废话少说!
首先说下硬件连接。DAC7718的DS读起来还是很晦涩的……理解起来更是不少偏差,有很多个小陷阱……一个是参考电压方面,其参考电压的范围是-0.3—DVdd(工作电压),这个芯片上的电压比较多,有工作电压、极性电压、IO电压等,要搞清各自的作用,我的是Dvdd、IOVdd接了3.3V,AVdd接12V,AVss接-12V;再有一个就是offset 管脚,这个值得注意,在DAC7718不同的工作模式下,它的接法是不同的,在单极性工作模式,此管脚需接地,在双极性工作模式,此管脚必须悬空。
硬件懂得不多,就少丢人了,还是说说软件设计……看DS其实DAC7718的驱动过程很简单,就是根据时序配置各个寄存器就OK了,但是中间还是有点难理解的地方……
首先,在配置 configuration reg 时,只要设置 SCE=0 ,就可以根据公式1来计算输出值了……
OUT V =V REF *Gain*INPUT_CODE/4096- VREF ´ (Gain - 1)*OFFSETDAC_CODE/4096
这就涉及到INPUT_COED和OFFSETDAVC_CODE 的值的计算方式,其实这两个数很好理解,就是放入两个寄存器的数,但是这中间有个小问题,就是这两个数的格式问题。
根据DS,这与\USB/BTC的管脚有关,我的此管脚接了高电平,又是双极性,所以格式是Table 2,BTC格式,按照此格式,就与上面说到的公式有点矛盾……唉,这DS啊……
总之呢,当INPUT_CODE为0x7FF,则公式前半部分为Vref*Gain*(2047/2048),OFFSET_CODE为800,则公式后半部分为 -Vref*(Gain-1)*(2047/2048),前面正数减后面负数。得到最大量程……但要注意的是,输出值不一定是理论值,因为输出的最高电压是极性电压上下0.5V左右……
了解了以上,OK,可以写程序配置了……但是配置INPUT和OFFSET都为0,输出并不是0,这就是另外一个问题:漂移……我的解决办法是,固定INPUT的值,改变OFFSET使其配合输出5V,然后在输出-5V,这样OFFSET就有了两个固定值,改变INPUT,输出想要的值……
好了,啰嗦完毕,把程序贴上:
/**********************************************
功能:DAC7718初始化
入口参数:无
返回值:无
创建:CM 100728
修改:
*********************************************/
void Init_DAC(void)
{
P4OUT&=~DA_CS; //P4.3输出低电平
Write_DAC(0x8000); //配置DAC,默认配置,软件复位
P4OUT|=DA_CS;
}
/**********************************************
功能:配置DA
入口参数:无
返回值:无
创建:CM 100728
修改:
*********************************************/
void Write_DAC(lint data)
{
for(uchar bit_data=0;bit_data<24;bit_data++)
{
P4OUT |=DA_SCLK;
Delay5us();
if(data&0x800000) //移位向寄存器中写24位数据
P4OUT |=DA_SDI;
else
P4OUT &=~DA_SDI;
Delay5us();
P4OUT &=~DA_SCLK;
Delay5us();
data <<=1;
}
}
/**********************************************
功能:DA输出(8路输出统一)
入口参数:无
返回值:无
创建:CM 100728
修改:
*********************************************/
void DAC_Out(lint input_data,lint offset_data)
{
lint input_data1;
lint offset_data1;
for(uchar j=0;j<2;j++)
{
offset_data1=offset_data&0x00ffff;
offset_data1=offset_data|(0x030000+(0x010000*j));
P4OUT&=~DA_CS; //P4.3输出低电平
Write_DAC(offset_data1);
P4OUT|=DA_CS;
}
for(uchar i=0;i<8;i++) //8路输出要相同或
{
input_data1=input_data&0x00ffff; //清地址
input_data1=input_data|(0x080000+(0x010000*i)); //选择8个不同的地址,其中DA0的地址为0x080000
P4OUT&=~DA_CS; //P4.3输出低电平
Write_DAC(input_data1);
P4OUT|=DA_CS;
}
}
调用如下:
DAC_Out(0x0000,0x6160); //-5V
DAC_Out(0x0000,0xc660); //5V
DAC_Out(0xBF50,0x6160); //-10V