w801+ad7124+pt100
请凭借自主思想观看,避免重复错误,被我带偏
参考链接:
pt100:PT100测温设计总结 - 知乎 (zhihu.com)
ad7124:CN0383_cn (analog.com)
月骑荞面山的博客_CSDN博客-原创文章领域博主
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);//resetSPI_Ad7124_Reset();Ad7124_DELAY;//必须Spi_Ad7124_ReadRaw(0);//通道 channel0x09 15:通道使能 14-12:setup 11-10:00 9-5:ainp/4-0:ainm ain2/ain3Spi_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/PGA32Spi_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-2047Spi_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_selSpi_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:AIN1Spi_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-0printf("\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 0u8 ucReturn[3]={0};//ucAddress|=0x40;//read cmdAd7124_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]);
#elseu32 ucReturn=0;//ucAddress|=0x40;//read cmdAd7124_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);}}
}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
