基于AD7705的32路信号采集软件设计
CSDN话题挑战赛第2期
参赛话题:学习笔记
软件设计
软件设计包括3个子模块:SPI初始化模块、AD7705驱动模块、定时器模块。工作过程:首先通过ATmega16的SPI接口驱动AD7705,完成AD7705通道设置、时钟设置、更新速率以及校准模式等,然后启动ATmega16的定时器,在定时器中断函数中查询AD7705的状态,如转换完成则读取转换结果,否则继续等待直到转换完成,如此不断读出所需的转换结果。程序流程如图5所示。
程序流程框图
图
程序流程框图
SPI初始化模块
对ATmega16的SPI接口进行配置:
void spi_init(void)
{
DDRB|=(1<
DDRB&=~(1<
PORTB|=(1<
SPCR=(1<
}
AD7705驱动模块
该模块程序完成对AD7705的配置任务,需要注意的是读写寄存器之前必须先选择要操作的寄存器。
向AD7705写入1字节函数,入口参数data为需写入的字节数据:
void wr_7705( unsigned char data)
{
SPDR = data; / /启动数据传输
while ( ! ( SPSR & ( 1 < < SPIF) ) ) / /等待传输
结束;
}
读出AD7705 数据函数,返回值为读出的2字节数据:
unsigned int rd_7705( void)
{
unsigned int temp; / /定义临时变量
wr_7705( 0x38) ; / /选择读数据寄存器,1 通道
SPDR = 1; / /启动数据传输
while ( ! ( SPSR & ( 1 < < SPIF) ) ) / /等待传输结
束
{
;
}
temp = SPDR < < 8; / /读取高字节
SPDR = 1; / /启动数据传输
while ( ! ( SPSR & ( 1 < < SPIF) ) ) / /等待传输结束
{
;
}
temp|=SPDR;//读取低字节
return(temp);
}
AD7705初始化函数:
void init_7705(void)
{
wr_7705(0x20);//选择时钟寄存器,下一操作是写
wr_7705(0x00);//20Hz的更新速率
wr_7705(0x10);//选择设置寄存器,下一操作是写
wr_7705(0x44);//自校准模式,增益为1,单极性
}
定时器模块
利用定时器1按一定的时间间隔读取AD7705的转换结果。读取数据之前必须确定数据寄存器的状态,有两种不同的方式:第1种是查询DRDY引脚,如果处于低电平,表示已经转换完成,可以读取;第2种是查询通信寄存器中的DRDY位,如果是0表示可以读取数据:
定时器1初始化函数:
定时器1溢出中断函数:
结语
本文总结了基于AD7705的32通道模拟量采集系统设计,经过试验证明,该采集系统不仅减少仪表设计调试时间,而且结合测量仪器可以构建灵活的测量系统,节约仪器购置成本,提高工作效率。