AD7705性价比比较高的16位ad使用比较简单 用做单通道的时候基本不怎么需要设置 做双通道的时候,发现的点问题,而这几点问题在网上的前辈那也没有特别说明 这里提出来供用的着AD7705的参考下 1.关于时钟寄存器AD7705只有一个时钟寄存器而不是两个。2.4576MHZ是标准频率,如果用4.9152MHZ的时候,要将CLKDIV位置位 也就是2分频到2.4576具体设置看手册 2.关于数据寄存器AD7705也只有一个数据寄存器,一段时间内只能对一路AD输入做数据转换。数据转换范围 单极性0--Vref/Gain对应0--0xffff(65535) 双极性-Vref/Gain--0对应0--0x8000(32768)0-Vref/Gain对应0x8000(32768)--0xffff(65535) 3.关于设置寄存器同样也只有一个,要用哪个通道就要先设置这个通道对应的寄存器值 4.校准寄存器虽然有4对但只是对应外部校准的所以在用自校准,通道切换的时候也要重新自校准一下,校准的时候DRDY为高电平,校准完后为低电平 校准完后第一次读的数据不怎么准应该读第二次转换出来的数据。 下边是我单通道切换转换的程序: #includeiom16v.h> //SPI引脚定义PB口 #defineCS_DRDY 3 #defineCS_CS4 #defineCS_MOSI5 #defineCS_MISO 6 #defineCS_SCK7 externvoidSpiInit(void);//SPI初始化M16 externvoidInitAD7705(void);//AD7705初始化 externunsignedintReadDataCH1(void);//读取转换数据 externunsignedintReadDataCH2(void);//读取转换数据 #include"AD7705.H" //定义位操作 #defineSET_BIT(x,y)((x)|=(0x0001(y))) #defineCLR_BIT(x,y)((x)=~(0x0001(y))) #defineCPL_BIT(x,y)((x)^=(0x0001(y))) #defineGET_BIT(x,y)(((x)(1(y)))==0?0:1) #defineLET_BIT(x,y,z)((x)=(x)(~(1(y)))|((z)(y))) //**********************短延时程序50us**************************// voiddelay50us(unsignedintt) { unsignedintj; for(;t>0;t--) for(j=0;j70;j++); } //SPI初始化M16 voidSpiInit(void) { //cs置为输出方可不影响SPI总线 DDRB|=(1CS_MOSI)|(1CS_SCK)|(1CS_CS); //使能spi设置为主机时钟极性为空闲时高平上升沿采样下降沿设置分频系数为128分频 SPCR|=(1SPE)|(1MSTR)|(1SPR0); SPSR=0x00;//setupSPI SET_BIT(PORTB,CS_DRDY);//设置REDY信号输入端口上拉电阻使能 SET_BIT(PORTB,CS_MISO);//设置MISO信号输入端口上拉电阻使能 } //SPI发送接收数据 unsignedcharTransmitterSpi(unsignedcharcData) { SPDR=cData; while(!(SPSR(1SPIF))); returnSPDR; } //复位AD7705 voidResetAD(void) { unsignedchari; for(i=10;i>0;i--)//持续DIN高电平写操作,恢复AD7705接口 { TransmitterSpi(0xff); } } //AD7705初始化 voidInitAD7705(void) { CLR_BIT(PORTB,CS_CS);//CS置为输出低电平,使能AD7705 ResetAD(); TransmitterSpi(0x20);//通讯寄存器//通道1,下一个写时钟寄存器自校准 TransmitterSpi(0x00);//时钟寄存器//写时钟寄存器设置2.459Mhz更新速率为20hz TransmitterSpi(0x10);//通讯寄存器//通道1,下一个写设置寄存器 TransmitterSpi(0x48);//设置寄存器//自校准,增益1,双极,缓冲 delay50us(100);//延时 TransmitterSpi(0x21);//通讯寄存器//通道2,下一个写时钟寄存器自校准 TransmitterSpi(0x00);//时钟寄存器//写时钟寄存器设置2.459Mhz更新速率为20hz TransmitterSpi(0x11);//通讯寄存器//通道2,下一个写设置寄存器 TransmitterSpi(0x48);//设置寄存器//自校准,增益1,双极,缓冲 delay50us(100); } //***************************按照通道1读取****************************// unsignedintReadDataCH1(void) { unsignedintgetData=0; unsignedcharbufR[5]; TransmitterSpi(0x10);//通讯寄存器//通道1,下一个写设置寄存器 TransmitterSpi(0x48);//设置寄存器//自校准,增益1,双极,缓冲 while(PINB(1CS_DRDY));//等待校准完成READY信号变为低电平 TransmitterSpi(0x38);//发送0x38读取CH1数据寄存器 while(PINB(1CS_DRDY));//等待READY信号变为低电平 bufR[0]=TransmitterSpi(0xff);//转换结果高位 bufR[1]=TransmitterSpi(0xff);//转换结果低位 getData=(bufR[0]8)|bufR[1];//获得数据16位 returngetData; //返回数据 } //***************************按照通道2读取****************************// unsignedintReadDataCH2(void) { unsignedintgetData=0; unsignedcharbufR[5]; TransmitterSpi(0x11);//通讯寄存器//通道1,下一个写设置寄存器 TransmitterSpi(0x48);//设置寄存器//自校准,增益1,双极,缓冲 while(PINB(1CS_DRDY));//等待校准完成READY信号变为低电平 TransmitterSpi(0x39);//发送0x01读取AD7705数据寄存器 while(PINB(1CS_DRDY));//等待READY信号变为低电平 bufR[0]=TransmitterSpi(0xff);//转换结果高位 bufR[1]=TransmitterSpi(0xff);//转换结果低位 getData=(bufR[0]8)|bufR[1];//读取数据前16位 returngetData; } voidmain(void) { unsignedcharadi; unsignedintgetData,getData2; SpiInit(); InitAD7705(); while(1) { if(adi++>=1)adi=0; if(adi==0)getData=ReadDataCH1(); if(adi==1)getData2=ReadDataCH2(); } }……