AD7715在精密分析仪器中的应用研究
2.3 调试和软件实现
AD7715的最高更新率可以达到500Hz,即理论上2ms可以完成1次A/D转换,但实际上如果考虑到通道切换的因素后,这个速率是不可能的。因为通道轮流切换后,A/D内部的信号需要重新建立,通道间信号差异越大,两次连续转换间误差也越大。这个问题在其它类型的ADC中也存在。有两种方法可以使AD7715在恒定的时间后获得正确的输出:一是使用设置寄存器中的FSYNC(同步)位,二是使用通信寄存器中的STBY(备用)位,我们采用后面一种方法。
另外一个问题就是串口数据,AD7715输出数据和接收命令都是高位在先,而51系列串口的数据时序是低位在先;所以不论是写8位的命令,还是读取16位的转换结果,数据要经过高低位的颠倒处理。
关于校准方式,一般采用自校准就够了,不是特殊情况一般不用进行系统标准。校准一定在有效的复位后进行,否则不能成功。
至于编程和调试,建议使用C语言,这已是潮流所趋。我们这个系统的工作方式类似于两个任务并发执行,每个通道最多一次要转换1800个数据供分析,用汇编来写程序是力不从心的。而对于AD7715的编程,一个好的调试工具是必须的,特别需要能观察时序的手段。图3~图5是逻辑分析仪采取的波形,分别是自校准时序、写命令时序和一次完整转换后读取16位结果的时序。
void initial_7715(){
SCON=0x00; /*串口写*/
initialize_ad(); /*初始化AD7715的通信口*/
writereg(0x10);/*下面写设置寄存器*/(写入时序见图4)
writereg(0x7c);/*自标定,2.4576MHz,500Hz更新率,单极性,非缓冲模式*/
while(!IN_PORT & 0x80)); /*等待自标定结束*/(图3中J3.3所示高电平时间)
while(IN_PORT & 0x80);
}
void writereg(UNCHAR bytepoint){
RUN=0; /*AD7715 CS=0*/
SBUF=exchange(bytepoint); /*字节首尾交换*/
while(!TI);
TI=0;RUN=1;
}
float readdata 16(){
UNCHAR temp1;
UNINT temp2;
writereg(0x04); /*进入stby方式,且下次写通信寄存器*/
writereg(0x38); /*退出standby方式,设置读操作,3/rate时间后出结果*/
while(!(IN_PORT & 0x80));
while(IN_PORT & 0x80); /*等待读时刻到来*/
RUN=
《AD7715在精密分析仪器中的应用研究(第3页)》