已回答假定已回答

[征文+原创] 电流输出型DA转换器AD5545的原理,应用及编程2

shane 在 2013-1-14 詢問的問題

图7

通道地址编码

软件实现:MCU用MSP430F149,DA转换器用上述提及的AD5545,SPI时序用软件模拟的方式实现。电路设计中SPI接口的CS由P1.0控制、CLK由P3.3控制、SDI由P3.1控制。自己认为,在软件设计中,难的是对数据的处理,尤其是2位地址+16位数据构成的18位格式的数据。不过好在,在AD5545的datasheet上下面一段话:

If

the applied microcontroller outputs serial data in different lengths than

AD5545,such as 8-bit bytes,three right justified data bytes can be written to

the AD5545。The AD5545 ignores the six MSB and recognizes the 18 LSB as valid

data 。After loading the serial register ,the rising edge of CS transfers the

serial register data to the DAC register and updates the output;

 

即碰到MCU的位数和AD5545位数不匹配的情况,比如8位的MCU。传送的18位数据通常通过传送3个8位数据来实现。AD5545(自动)忽略前6个MSB,只接受后18个LSB数据,当所有数据都送入串行移位寄存器后,在CS的上升沿将数据送入DAC寄存器,同时更新输出(模拟值A)。

对于AD5545这款DAC的操作,自己认为,归根结底还是如何把数据从MCU送给它,尤其是碰到像上述提及的位数不匹配的情况,因此编写了两个程序段,分别用于发送8位数据和用于转换18位格式数据。(每个程序段中,中间有所省略,相信读者可以自行补全)[code]void

AD5545SendByte(uchar SByte)

{

……

for(i=0;i<8;i++)

{

P3OUT

&= ~(AD5545_CLK); //时钟CLK低电平

if(SByte & BIT7) //判断高位是否为1

P3OUT |=

AD5545_SDI; //为1,发送1

else

P3OUT &= ~(AD5545_SDI);

//否则,发送0

delayus(5); //延时一点时间

P3OUT |= AD5545_CLK;

//时钟CLK高电平(上升沿)

delayus(5); //延时一点时间

SByte <<= 1;

//数据左移1位

}

}

[/code]/******************************************************

描述:DA转换器AD5545BRUZ转换函数

AD5545自动忽略前6位MSB,只接受18位LSB

******************************************************/[code]void

AD5545_Convert(long int DA_Value,uchar DA_CS_num,uchar

AD5545_chnum)

{

……

if(AD5545_chnum == 0)

DA_Value = 0x010000 |

DA_Value;//AD5545_chnum=0,use ChA

else if(AD5545_chnum == 1)

DA_Value =

0x020000 | DA_Value;//AD5545_chnum=1,use ChB

else

DA_Value = 0x030000 |

DA_Value;//AD5545_chnum=2,use ChA and ChB simultaneity

lo_byte =

(uchar)(DA_Value & 0xff); //取出低字节,即16位数据的低8位

mi_byte = (uchar)(DA_Value

>> 8); //取出中间字节,即16位数据的高8位

hi_byte = (uchar)(DA_Value >> 16);

//取出高字节,即24位数据格式中的最高8位

AD5545_enable(DA_CS_num);

//选通通道的DA

AD5545SendByte(hi_byte);……

AD5545SendByte(mi_byte);……

AD5545SendByte(lo_byte);……

AD5545_disenable(DA_CS_num);

//禁止通道的DA

}

[/code]对双极性输出电路结果的测

結果