AD5410是数字写入控制电流输出的片子,分写数据部分和读数据部分,读数据其实就是读AD5410的寄存器的数据,主要目的无非是看看我写进寄存器的内容是否正确,调试出现错误时会用到,真正实现电流输出的是写数据部分。我一个部分一个部分来吧。
第一部分写数据
控制电流输出编程的大方向:上电复位AD5410(向复位寄存器写数据)——配置AD5410的控制方式(向控制寄存器写数据)——写数据到AD5410的数据寄存器(跟电流对应的码值)。三个步骤完成就可以输出你想要的电流了,就是按顺序向三个寄存器写数据。
向AD5410寄存器写数据就是一次性写3个字节的数,即24个bit,我用图例表示24个bit:
aaaa aaaa bbbb bbbb bbbb bbbb,a表示第一个要写的字节,b表示第二个和第三个要写的字节(因为b是16个bit,所以分2个字节来写)。a的取值是目的寄存器的地址,比如复位寄存器地址是0x56,则a=0x56(即0101 0110),b的取值就是要写入的目的寄存器的数据。从数据手册上可以看到如果要复位AD5410,则向复位寄存器里面写入0x0001,所以a=0x56,b=0x0001。写数据时需注意latch引脚的电平,写24个bit结束后拉高,在之前拉高的话则写数据会失败,如果不是24个bit,而是25个bit后才拉高的话写数据也失败。写bit时是下降沿写入,即clk为高后准备好bit,然后再将clk拉低,形成一个下降沿。
向复位寄存器写数据的程序如下:
DA_control(0x56,0x0001);
void DA_control(unsigned char addr,unsigned int data) { DA_latch_low; //latch为低电平 DA_SendByte(addr); DA_SendByte(data/256); DA_SendByte(data); DA_latch_high; //latch为高电平 }
void DA_SendByte(unsigned char byte) { unsigned char i; for ( i = 0; i < 8; i++) { DA_CLK_LOW; if ( byte & 0x80 ) DA_SIMO_HIGH; else DA_SIMO_LOW; DA_CLK_HIGH; byte <<= 1; DA_CLK_LOW; } } 同理,可以写控制寄存器和数据寄存器。
第二部分读数据
读寄存器数据编程大方向:选择要读的寄存器——读寄存器数据。
选择要读的寄存器就是向状态寄存器里面写数据,比如我需要读控制寄存器的数据,我就要先想状态寄存器里面写入读控制寄存器命令,然后对AD5410进行一个空操作(即AD5410的SDI接收到24个0-bit),这个时候在AD5410的SDO端口可以看到控制寄存器的数据。
读控制寄存器数据编程如下:
DA_Read_Register(0x02);
DA_Read_only(); //这个时候在AD5410的SDO端口可以看到控制寄存器的数据
void DA_Read_Register(unsigned char addr) {
DA_latch_low; DA_SendByte(0x02); //DA_SendByte的程序跟上面的一样 DA_SendByte(0x00); DA_SendByte(addr); DA_latch_high; } void DA_Read_only(void) { DA_latch_low; DA_SendByte(0x00); DA_SendByte(0x00); DA_SendByte(0x00); DA_latch_high; }
最后总结一下我们使用个片子出现过的问题
1、我们硬件上使用的片子上推荐的连接方式,Rset接的外部电流电阻,但是我们没有使用推荐的15k低温漂电阻,用的12k的,导致我们初始态多了1mA的电流,把电阻换掉就好了。
2、我们一开始测试时将Iout引脚悬空,这会导致fault低电平,所以Iout需接负载或接地。
最后说一句:ADI的客户服务态度真是非常好,很耐心,而且MM声音好听。
|