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);

	//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);
			
		}
	}
}

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值