基于STM32和AD5791实现单路超高精度可调电压电路的设计

2.3 数模转换输出

数模转换输出,主要涉及3个子程序,芯片上电初始化子程序,芯片控制寄存器初始化子程序和电压输出子程序3个部分。下面给出AD5791读写函数和测试的例子。

u32 AD5791_Read(void)//读取的24bit的数据

{

unsigned int i,j;

u32 data,c;

data=0;

AD5791_sync_0();

AD5791_sclk_0();

for(i=0;i《24;i++)

{

j=3;

data=data《《1;

AD5791_sclk_1();

while(j--);

c=GET_AD5791_SO();

AD5791_sclk_0();

data=data|c;

}

AD5791_sclk_0();

AD5791_sync_1();

return(data);

}

void AD5791_Write(unsigned long OutData) //写一

个24 bit的数值

{

unsigned char i;

unsigned long value;

value = OutData & 0x00ffffff; //取低24bit

value = value《《8; //左移8位,ok

AD5791_ldac_1();

AD5791_sclk_1();

AD5791_sync_1();

AD5791_sync_0();

for ( i = 0; i 《 24; i ++ )

{

AD5791_sclk_1();

ad5791delay();

if((value & 0x80000000) == 0x80000000)

{

AD5791_sdin_1();

}

else

{

AD5791_

sdin_0();

}

ad5791delay();

AD5791_sclk_0();

ad5791delay();

value = value 《《 1;

}

AD5791_sync_1();

ad5791delay();

AD5791_ldac_0();

ad5791delay();

AD5791_ldac_1();

ad5791delay();

}

/*入口参数:outvalue 输出的电

压的值*/

void test_ad5791(double outvalue)

{

double temp=0.0;

long temp1=0;

Ad5791_gpio_init(); //AD5791 I/O口初始化

Ad5791_clr_init();//AD5791 清零

Reset_ad5791(); //AD5791 复位

Write_ad5791_control_register();//写AD5791的控

制寄存器

temp=((outvalue+5.0)*1048575.0)/10.0;//计

算DAC输出值

temp1=(long)temp | 0x00100000;

Write_ad5791_dac_register(temp1);//写AD5791的

dac寄存器,同时输出相应电压

}

程序中对AD5791芯片进行相应初始化以及写AD5791的相应寄存器都采用I/O模拟相应时序的方法。其中写模式的时序如图3所示。写数据时,注意先写高位,再写低位,必须严格按照时序来写入。

基于STM32和AD5791实现单路超高精度可调电压电路的设计

3、结束语

本系统成功实现了基于STM32处理器和AD5791的20位高精度电压输出系统,给出了全新实用的硬件和软件设计,适用于对输出高精度模拟电压有需要的智能仪表场合中。该系统精度高,漂移低,可靠性高,可以应用于医疗仪器、测试测量仪表、工业控制以及高端科学和航空航天仪器中,具有很好的应用前景。