请凭借自主思想观看,避免重复错误,被我带偏
参考链接:
pt100:PT100测温设计总结 - 知乎 (zhihu.com)
ad7124:CN0383_cn (analog.com)
AD7124-8BCPZ_(ADI(亚德诺))AD7124-8BCPZ中文资料_价格_PDF手册-立创电子商城 (szlcsc.com)
目的:实现0.1℃级别的测温
难点:1、恒流源电路设计复杂;2、pt100电流≤5mA,假设采用2mA,0摄氏度时电压才200mV,每增加1℃,增加0.77mV(0.385*2mA)
方案:大力出奇迹,花钱解决,就是采用ad7124,缺点就是贵
AD7124寄存器
重点:寄存器有点多,并且对其不了解,所以太多还没搞懂
void SPI_Ad7124_Init(void)
{
// wm_spi_cs_config(spi_cs);
// wm_spi_ck_config(spi_ck);
// wm_spi_di_config(spi_di);
// wm_spi_do_config(spi_do);
// int clk=1000000;
// int type=0;//2
// tls_spi_trans_type(type);
// tls_spi_setup(TLS_SPI_MODE_3, TLS_SPI_CS_LOW, clk);
// tls_open_peripheral_clock(TLS_PERIPHERAL_TYPE_LSPI);
// printf("\n\n%d\r:%s.... RUN\r\n",tls_os_get_time(),__FUNCTION__);
tls_gpio_cfg(spi_cs, WM_GPIO_DIR_OUTPUT, WM_GPIO_ATTR_PULLHIGH);
tls_gpio_cfg(spi_ck, WM_GPIO_DIR_OUTPUT, WM_GPIO_ATTR_PULLHIGH);
tls_gpio_cfg(spi_di, WM_GPIO_DIR_INPUT, WM_GPIO_ATTR_FLOATING);
tls_gpio_cfg(spi_do, WM_GPIO_DIR_OUTPUT, WM_GPIO_ATTR_PULLHIGH);
tls_gpio_cfg(spi_sync, WM_GPIO_DIR_OUTPUT, WM_GPIO_ATTR_PULLHIGH);
tls_gpio_cfg(spi_reset, WM_GPIO_DIR_OUTPUT, WM_GPIO_ATTR_PULLLOW);
tls_gpio_write(spi_sync,1);
//reset
SPI_Ad7124_Reset();
Ad7124_DELAY;//必须
Spi_Ad7124_ReadRaw(0);
//通道 channel0x09 15:通道使能 14-12:setup 11-10:00 9-5:ainp/4-0:ainm ain2/ain3
Spi_Ad7124_WriteRaw(0x9, 0x8043);//[15]:1 [14:12]:000 [9:5]:00010 [4:0]:00011 0x8043 1000 0000 0100 0011
//配置 reg_config0x19 极性/开路电流幅度/REFIN、AIN缓冲使能/REF_SEL0/PGA32
Spi_Ad7124_WriteRaw(0x19, 0x1e5);//[8]:1 [7]:1 [6]:1 [5]:1 [4:3]:00 [2:0]:101 0x1e5 1 1110 0101
//fiter过滤器 0x21 23-21:过滤器类型000:sinc4 010:sinc3 100:sinc4快速 101:sinc3快速 111:后置滤波器使能
//20:REJ60 19-17:POST_FITER 011:sps25 62dB 16:Single_cycle单周期转换使能 15-11:00000 10-0:FS滤波器输出速率选择1-2047
Spi_Ad7124_WriteRaw(0x21, 0x160080);// 0001 0110 00000000 10000000
//Spi_Ad7124_WriteRaw(0x21, 0x1c0080); // 0001 1100 00000000 10000000
//Spi_Ad7124_WriteRaw(0x21, 0x60080); // 0110 00000000 10000000
//gain增益 0x32
//Spi_Ad7124_WriteRaw(0x32, 0x1e5);
//offset失调 0x29
//Spi_Ad7124_WriteRaw(0x29, 0x1e5);
//诊断
//adc控制 0x1 12:DOUT_RDY_DEL/11:CONT_READ连续读取/10:data_status/9:cs_en/8:ref_en内部基准电压使能/7-6:功耗模式/5-2:工作模式连续读取/1-0:clk_sel
Spi_Ad7124_WriteRaw(0x1, 0x04c0);//[11]:0 [10]:1 [7:6]:11 [5:2]:0000 [1:0]:00 0x4c0 0100 1100 0000
//IO_CONTROL 0x3 0x3:24-20数字输出Px/19-16数字输出Px使能/15:PDSW电桥/14:0/13-11:Iout1电流100=500uA/10-8:Iout0电流100=500uA/7-4:Iout1_ch 000:AIN0/3-0:Iout0_ch 0001:AIN1
Spi_Ad7124_WriteRaw(0x3, 0x2401); //[13:11]:100 [10:8]:100 [7:4]:0000 [3:0]:0001 0x2401 0010 0100 0000 0001
//Spi_Ad7124_WriteRaw(0x4, 0x8c0);//内部偏置电压ain15-0
printf("\n%d\r:%s....reg:0x9 0x8043 data:0x%x \r\n",tls_os_get_time(),__FUNCTION__,Spi_Ad7124_ReadRaw(0x9));
printf("\n%d\r:%s....reg:0x19 0x1e5 data:0x%x \r\n",tls_os_get_time(),__FUNCTION__,Spi_Ad7124_ReadRaw(0x19));
printf("\n%d\r:%s....reg:0x1 0x14c0 data:0x%x \r\n",tls_os_get_time(),__FUNCTION__,Spi_Ad7124_ReadRaw(0x1));
printf("\n%d\r:%s....reg:0x3 0x2401 data:0x%x \r\n",tls_os_get_time(),__FUNCTION__,Spi_Ad7124_ReadRaw(0x3));
}
void SPI_Ad7124_Reset(void)
{
Ad7124_CS_Enable;
for(u8 i=0;i<9;i++)
SPI_Ad7124_SendByte(0xff);
Ad7124_DELAY;
Ad7124_CS_Disable;
}
void SPI_Ad7124_SendByte( u8 byte )
{
//tls_spi_write(byte,1);
for(u8 i=0;i<8;i++){
Ad7124_Sclk_L;
if(byte&0x80)
Ad7124_Dout_H;
else Ad7124_Dout_L;
Ad7124_Sclk_H;
byte<<=1;
}
}
u8 SPI_Ad7124_ReadByte( void )
{
u8 SPI_Data=0;
//tls_spi_read((u8 *)&SPI_Data,1);
for(u8 i=0;i<8;i++){
SPI_Data<<=1;
Ad7124_Sclk_L;
if(Ad7124_Din)
SPI_Data++;
Ad7124_Sclk_H;
}
Ad7124_DELAY;
return SPI_Data;
}
u32 Spi_Ad7124_ReadRaw(u8 ucAddress )
{
#if 0
u8 ucReturn[3]={0};
//ucAddress|=0x40;//read cmd
Ad7124_CS_Enable;
SPI_Ad7124_SendByte(ucAddress|0x40);
ucReturn[0] = SPI_Ad7124_ReadByte();
ucReturn[1] = SPI_Ad7124_ReadByte();
if(ucAddress==1 || ucAddress==4 || (ucAddress>8 && ucAddress<0x21))
;//printf("16wei");
else{
//printf("24wei");
ucReturn[2] = SPI_Ad7124_ReadByte();
}
Ad7124_CS_Disable;
printf("\n%d\r:%s....add:0x%x data:0x%x 0x%x 0x%x\r\n",tls_os_get_time(),__FUNCTION__,
ucAddress,ucReturn[0],ucReturn[1],ucReturn[2]);
#else
u32 ucReturn=0;
//ucAddress|=0x40;//read cmd
Ad7124_CS_Enable;
SPI_Ad7124_SendByte(ucAddress|0x40);
ucReturn = SPI_Ad7124_ReadByte();
if(ucAddress==0 || ucAddress==5||ucAddress==8){
Ad7124_CS_Disable;
//printf("\n%d\r:%s....add:0x%x data:0x%x \r\n",tls_os_get_time(),__FUNCTION__,ucAddress,ucReturn);
return ucReturn;
}
ucReturn=ucReturn<<8;
ucReturn += SPI_Ad7124_ReadByte() ;
if(ucAddress==1 || ucAddress==4 || (ucAddress>8 && ucAddress<0x21)){
Ad7124_CS_Disable;
//printf("\n%d\r:%s....add:0x%x data:0x%x \r\n",tls_os_get_time(),__FUNCTION__,ucAddress,ucReturn);
return ucReturn;
}
else{
ucReturn=ucReturn<<8;
ucReturn += SPI_Ad7124_ReadByte();
}
Ad7124_CS_Disable;
//printf("\n%d\r:%s....add:0x%x data:0x%x \r\n",tls_os_get_time(),__FUNCTION__,ucAddress,ucReturn);
return ucReturn;
#endif
}
void Spi_Ad7124_WriteRaw( u8 ucAddress, u32 ucValue )
{
u8 ucAddr;
u8 a[3];
a[2]=(ucValue&0x00ff0000)>>16;
a[1]=(ucValue&0x0000ff00)>>8;
a[0]=(ucValue&0xff);
Ad7124_CS_Enable;
SPI_Ad7124_SendByte ( ucAddress );
if(ucAddress==1 || ucAddress==4 || (ucAddress>8 && ucAddress<0x21))
;//printf("16wei");
else{
//printf("24wei");
SPI_Ad7124_SendByte (a[2]);
}
SPI_Ad7124_SendByte (a[1]);
SPI_Ad7124_SendByte (a[0]);
//printf("\n\n%d\r:%s....add:0x%x 0x%x data:0x%x\r\n",tls_os_get_time(),__FUNCTION__,ucAddress,ucAddr,ucValue);
Ad7124_CS_Disable;
}
void Ad7124_convert(void )
{
u8 reg=2;
float Rref=5100,R,V,Temp;
float Vref=Rref*0.5/1000;
u8 AD_Gain=32;
u32 data=0;
double a=3.9083/1000;
double b=-5.775/10000000;
double c=-4.183/1000000000000;
while(1){
data=0;V=0;R=0;
//tls_gpio_write(WM_IO_PB_25, 1);
//tls_os_time_delay(500);
//tls_gpio_write(WM_IO_PB_25, 0);
tls_os_time_delay(200);
//Spi_Ad7124_ReadRaw(0);
//printf("\n%d\r:%s....reg:0x%x ID:0x%x \r\n",tls_os_get_time(),__FUNCTION__,5,Spi_Ad7124_ReadRaw(0x5));
//printf("\n%d\r:%s....err_reg:0x%x data:0x%x \r\n",tls_os_get_time(),__FUNCTION__,6,Spi_Ad7124_ReadRaw(0x6));
//printf("\n%d\r:%s....reg:0x%x data:0x%x \r\n",tls_os_get_time(),__FUNCTION__,0x21,Spi_Ad7124_ReadRaw(0x21));
if((Spi_Ad7124_ReadRaw(0)&0x80)==0){
//printf("0x%x",Spi_Ad7124_ReadRaw(0));
data=Spi_Ad7124_ReadRaw(reg);
R=(data*Rref)/(AD_Gain*16777216);
Temp=(sqrt(a*a-4*b*(1-R/100))-a)/(2*b);
V=Vref/AD_Gain*data/(2*0x800000);
tls_os_queue_send(Mytemp_queue,&Temp,0);
printf("Temp:%lf %.3f\r\n",Temp,Temp);
}
}
}