📄 [技术问答 模拟技术] ad7705的源程序==www_ic37_com.htm
字号:
<P style="TEXT-INDENT: 2em">}</P>
<P style="TEXT-INDENT: 2em">//如果校准系数不可用则读取第二份</P>
<P style="TEXT-INDENT: 2em">if( 1 == readtimes )</P>
<P style="TEXT-INDENT: 2em">{</P>
<P style="TEXT-INDENT: 2em">eeprom_busy_wait();</P>
<P style="TEXT-INDENT: 2em">eeprom_read_block(
&coefficient[0], (void*)(ADDR_EEPROM_2+(cali_scale-1)*10),
8 );</P>
<P style="TEXT-INDENT: 2em">crcvalue = <A
title="checksum PDF资料和全国供应商"
href="http://www.ic37.com/checksum-p.htm"
target=_blank>checksum</A>( &coefficient[0], 6 );
//将6个值调用CRC校验函数得到校验</P>
<P style="TEXT-INDENT: 2em">if(
(coefficient[7]*256+coefficient[6]) != crcvalue )</P>
<P style="TEXT-INDENT: 2em">{</P>
<P style="TEXT-INDENT: 2em">readtimes++;</P>
<P style="TEXT-INDENT: 2em">}</P>
<P style="TEXT-INDENT: 2em">}</P>
<P style="TEXT-INDENT: 2em">//如果校准系数不可用则读取第三份</P>
<P style="TEXT-INDENT: 2em">if( 2 == readtimes )</P>
<P style="TEXT-INDENT: 2em">{</P>
<P style="TEXT-INDENT: 2em">eeprom_busy_wait();</P>
<P style="TEXT-INDENT: 2em">eeprom_read_block(
&coefficient[0], (void*)(ADDR_EEPROM_3+(cali_scale-1)*10),
8 );</P>
<P style="TEXT-INDENT: 2em">}</P>
<P style="TEXT-INDENT: 2em">ADDR409_MASK; //切换到第一通道进行校准</P>
<P style="TEXT-INDENT: 2em">AD_CS0;</P>
<P style="TEXT-INDENT: 2em">_delay_us(5);</P>
<P style="TEXT-INDENT: 2em">reset_<A
title="AD7705 PDF资料和全国供应商"
href="http://www.ic37.com/AD7705-p.htm"
target=_blank>AD7705</A>();</P>
<P style="TEXT-INDENT: 2em">//CLOCK寄存器设置,无分频,50HZ输出更新速率</P>
<P style="TEXT-INDENT: 2em">write_<A
title="AD7705 PDF资料和全国供应商"
href="http://www.ic37.com/AD7705-p.htm"
target=_blank>AD7705</A>_byte( WR_CLOCK_REG );</P>
<P style="TEXT-INDENT: 2em">write_<A
title="AD7705 PDF资料和全国供应商"
href="http://www.ic37.com/AD7705-p.htm"
target=_blank>AD7705</A>_byte( CLOCK_REG_SET );</P>
<P style="TEXT-INDENT: 2em">if( ZERO_CALIBRATION == command[3]
) //校准命令为零校准</P>
<P style="TEXT-INDENT: 2em">{</P>
<P style="TEXT-INDENT: 2em">//写设置寄存器,选择零校准</P>
<P style="TEXT-INDENT: 2em">write_<A
title="AD7705 PDF资料和全国供应商"
href="http://www.ic37.com/AD7705-p.htm"
target=_blank>AD7705</A>_byte( WR_SETUP_REG );</P>
<P style="TEXT-INDENT: 2em">write_<A
title="AD7705 PDF资料和全国供应商"
href="http://www.ic37.com/AD7705-p.htm"
target=_blank>AD7705</A>_byte( text_of_setup[cali_scale-1] |
SYS_ZERO_CALI );</P>
<P style="TEXT-INDENT: 2em">//等待校准完成,系统校准延时时间</P>
<P style="TEXT-INDENT: 2em">start_timer0();</P>
<P style="TEXT-INDENT: 2em">while( time_count <
time_sys_cali );</P>
<P style="TEXT-INDENT: 2em">stop_timer0();</P>
<P style="TEXT-INDENT: 2em">while( AD_DRDY
);//若将滤波器同步位FSYNC置为1,AD_DRDY信号将不会变低,这里将一直是死循环</P>
<P style="TEXT-INDENT: 2em">//读OFFSET寄存器</P>
<P style="TEXT-INDENT: 2em">write_<A
title="AD7705 PDF资料和全国供应商"
href="http://www.ic37.com/AD7705-p.htm"
target=_blank>AD7705</A>_byte( RD_OFFSET_REG );</P>
<P style="TEXT-INDENT: 2em">temp = read_<A
title="AD7705 PDF资料和全国供应商"
href="http://www.ic37.com/AD7705-p.htm"
target=_blank>AD7705</A>_dword();</P>
<P style="TEXT-INDENT: 2em">if( cali_scale == scale)</P>
<P style="TEXT-INDENT: 2em">{</P>
<P style="TEXT-INDENT: 2em">ZS = temp; //如果是当前量程零校准还要更新ZS</P>
<P
style="TEXT-INDENT: 2em">//如果是当前量程的校准,还要将NO_CALI_TYPE赋值为1表示已经经过零校准</P>
<P style="TEXT-INDENT: 2em">//更新上电没有校准时readEEPROM()函数的运行状态</P>
<P style="TEXT-INDENT: 2em">NO_CALI_TYPE =
NO_FULL_CALIBRATION;</P>
<P style="TEXT-INDENT: 2em">}</P>
<P style="TEXT-INDENT: 2em">coefficient[0] = (unsigned char)(
temp%256 );</P>
<P style="TEXT-INDENT: 2em">coefficient[1] = (unsigned char)(
(temp/256)%256 );</P>
<P style="TEXT-INDENT: 2em">coefficient[2] = (unsigned char)(
(temp/65536)%256 );</P>
<P style="TEXT-INDENT: 2em">}</P>
<P style="TEXT-INDENT: 2em">else if( FULL_CALIBRATION ==
command[3] )//系统满量程校准</P>
<P style="TEXT-INDENT: 2em">{</P>
<P style="TEXT-INDENT: 2em">//计算ZS,一定要作强制类型转换,否则将出现错误</P>
<P style="TEXT-INDENT: 2em">temp = (unsigned long
int)(coefficient[0]) + (unsigned long
int)(coefficient[1])*256</P>
<P style="TEXT-INDENT: 2em">+ (unsigned long
int)(coefficient[2])*65536;</P>
<P style="TEXT-INDENT: 2em">//将ZS写入到<A
title="AD7705 PDF资料和全国供应商"
href="http://www.ic37.com/AD7705-p.htm"
target=_blank>AD7705</A>的OFFSET寄存器</P>
<P style="TEXT-INDENT: 2em">write_<A
title="AD7705 PDF资料和全国供应商"
href="http://www.ic37.com/AD7705-p.htm"
target=_blank>AD7705</A>_byte( WR_OFFSET_REG );</P>
<P style="TEXT-INDENT: 2em">write_<A
title="AD7705 PDF资料和全国供应商"
href="http://www.ic37.com/AD7705-p.htm"
target=_blank>AD7705</A>_dword( temp );</P>
<P style="TEXT-INDENT: 2em">//写设置寄存器,选择满量程校准</P>
<P style="TEXT-INDENT: 2em">write_<A
title="AD7705 PDF资料和全国供应商"
href="http://www.ic37.com/AD7705-p.htm"
target=_blank>AD7705</A>_byte( WR_SETUP_REG );</P>
<P style="TEXT-INDENT: 2em">write_<A
title="AD7705 PDF资料和全国供应商"
href="http://www.ic37.com/AD7705-p.htm"
target=_blank>AD7705</A>_byte( text_of_setup[cali_scale-1] |
SYS_FULL_CALI );</P>
<P style="TEXT-INDENT: 2em">//等待校准完成,系统校准延时时间</P>
<P style="TEXT-INDENT: 2em">start_timer0();</P>
<P style="TEXT-INDENT: 2em">while( time_count <
time_sys_cali );</P>
<P style="TEXT-INDENT: 2em">stop_timer0();</P>
<P style="TEXT-INDENT: 2em">while( AD_DRDY
);//若将滤波器同步位FSYNC置为1,AD_DRDY信号将不会变低,这里将一直是死循环</P>
<P style="TEXT-INDENT: 2em">//读FULL寄存器</P>
<P style="TEXT-INDENT: 2em">write_<A
title="AD7705 PDF资料和全国供应商"
href="http://www.ic37.com/AD7705-p.htm"
target=_blank>AD7705</A>_byte( RD_FULL_REG );</P>
<P style="TEXT-INDENT: 2em">temp = read_<A
title="AD7705 PDF资料和全国供应商"
href="http://www.ic37.com/AD7705-p.htm"
target=_blank>AD7705</A>_dword();</P>
<P style="TEXT-INDENT: 2em">if( cali_scale == scale )</P>
<P style="TEXT-INDENT: 2em">{</P>
<P style="TEXT-INDENT: 2em">GS = temp;
//如果是当前量程满量程校准还要更新GS</P>
<P
style="TEXT-INDENT: 2em">//如果是当前量程的校准,还要将NO_CALI_TYPE赋值为2表示已经经过零校准</P>
<P
style="TEXT-INDENT: 2em">//更新上电没有校准的情况,让readEEPROM()函数退出循环状态</P>
<P style="TEXT-INDENT: 2em">NO_CALI_TYPE =
ALREADY_CALIBRATION;</P>
<P style="TEXT-INDENT: 2em">}</P>
<P style="TEXT-INDENT: 2em">coefficient[3] = (unsigned char)(
temp%256 );</P>
<P style="TEXT-INDENT: 2em">coefficient[4] = (unsigned char)(
(temp/256)%256 );</P>
<P style="TEXT-INDENT: 2em">coefficient[5] = (unsigned char)(
(temp/65536)%256 );</P>
<P style="TEXT-INDENT: 2em">}</P>
<P style="TEXT-INDENT: 2em">else</P>
<P style="TEXT-INDENT: 2em">{</P>
<P style="TEXT-INDENT: 2em">AD_CS1;</P>
<P style="TEXT-INDENT: 2em">_delay_us(5);</P>
<P style="TEXT-INDENT: 2em">return;</P>
<P style="TEXT-INDENT: 2em">}</P>
<P style="TEXT-INDENT: 2em">AD_CS1;</P>
<P style="TEXT-INDENT: 2em">_delay_us(5);</P>
<P style="TEXT-INDENT: 2em">crcvalue = <A
title="checksum PDF资料和全国供应商"
href="http://www.ic37.com/checksum-p.htm"
target=_blank>checksum</A>(&coefficient[0],6);
//将6个校准值调用CRC校验函数得到校验码</P>
<P style="TEXT-INDENT: 2em">coefficient[6] = (unsigned
char)(crcvalue%256);//取校验值的高8位和低8位</P>
<P style="TEXT-INDENT: 2em">coefficient[7] = (unsigned
char)(crcvalue/256); </P>
<P style="TEXT-INDENT: 2em">//保存第一份校准系数</P>
<P style="TEXT-INDENT: 2em">eeprom_busy_wait();</P>
<P style="TEXT-INDENT: 2em">eeprom_write_block(
&coefficient[0], (void*)(ADDR_EEPROM_1+(cali_scale-1)*10),
8 );</P>
<P style="TEXT-INDENT: 2em">//保存第二份校准系数</P>
<P style="TEXT-INDENT: 2em">eeprom_busy_wait();</P>
<P style="TEXT-INDENT: 2em">eeprom_write_block(
&coefficient[0], (void*)(ADDR_EEPROM_2+(cali_scale-1)*10),
8 );</P>
<P style="TEXT-INDENT: 2em">//保存第三份校准系数</P>
<P style="TEXT-INDENT: 2em">eeprom_busy_wait();</P>
<P style="TEXT-INDENT: 2em">eeprom_write_block(
&coefficient[0], (void*)(ADDR_EEPROM_3+(cali_scale-1)*10),
8 );</P>
<P style="TEXT-INDENT: 2em">Txout( &coefficient[0]
);//输出校准数据给上位机</P>
<P style="TEXT-INDENT: 2em">return;</P>
<P style="TEXT-INDENT: 2em">}</P>
<P
style="TEXT-INDENT: 2em">//------------------------------------------------------------------------------------------</P>
<P style="TEXT-INDENT: 2em">//函数:start_<A
title="AD7705 PDF资料和全国供应商"
href="http://www.ic37.com/AD7705-p.htm"
target=_blank>AD7705</A></P>
<P style="TEXT-INDENT: 2em">//功能:先写offset寄存器,再写full
scale寄存器,然后启动7705进行单次转换</P>
<P style="TEXT-INDENT: 2em">//参数:uint8_t channel--
要进行A/D转换的通道号</P>
<P style="TEXT-INDENT: 2em">//uint8_t cali--
是第几次测量,电阻需要测量2次</P>
<P style="TEXT-INDENT: 2em">//返回:无</P>
<P style="TEXT-INDENT: 2em">//变量:无</P>
<P style="TEXT-INDENT: 2em">//备注:</P>
<P
style="TEXT-INDENT: 2em">//------------------------------------------------------------------------------------------</P>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -