⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ad_da_module.c

📁 16位AD(ADS1110),12位DA(DAC7512)底层驱动
💻 C
📖 第 1 页 / 共 2 页
字号:
			break;
	 	default:
			break;
	}

	switch(PGA)
	{
		case 1:			//1PGA
			p = 0;
			break;
		case 2:			//2PGA
			p = 1;
			break;
		case 4:			//4PGA
			p = 2;
			break;
		case 8:			//8PGA
			p = 3;
			break;
	 	default:
			break;
  	}

	writedata = writedata & 0xf0;	//保留高4位
	writedata = writedata + s + p;

	Start_I2C();					//启动I2C总线

	WriteByte_I2C(0x90);			//发送写命令及ADS1110的I2C总线地址
	if ( GetAck_I2C() )
	{
		Stop_I2C();					//没有应答,停止总线
		return 1;
	}

	WriteByte_I2C(writedata);		//发送数据
	if ( GetAck_I2C() )
	{
		Stop_I2C();					//没有应答,停止总线
		return 1;
	}

	Stop_I2C();						//发送完毕,停止I2C总线,返回
	return 0;
}

//***************************************************************************************************
//函数原型:	bit ReadADC(unsigned int *readdata)	                                  					*
//功    能:	主机通过I2C总线从ADS1110读出AD转换值			                                      	*
//参数说明:	*readdata;	读取的AD转换值 , 2个字节	    	                                      	*
//返 回 值:	                                                                                      	*
//			0;读出成功																			  	*
//			1;读出失败																				*
//***************************************************************************************************
bit ReadADC(unsigned int *readdata)
{
	unsigned int temp1,temp2;

	Start_I2C();					//启动I2C总线

	WriteByte_I2C(0x91);			//发送读命令及ADS1110的I2C总线地址
	if ( GetAck_I2C() )
	{
		Stop_I2C();					//没有应答,停止总线
		return 1;
	}

	temp1 = ReadByte_I2C();
	PutAck_I2C(0); 					//发非应答位

	temp2 = ReadByte_I2C();
	PutAck_I2C(0);					//发非应答位

	Stop_I2C();						//接收完毕,停止I2C总线

	*readdata = temp1 * 256 + temp2;


	//######################################测试#####################################################################################
	printf ("%d,", *readdata );
	//######################################测试#####################################################################################

	
	return 0;
}

//***************************************************************************************************
//函数原型:	void WriteDAC(unsigned int dacdata)	                                  					*
//功    能:	主机通过I2C总线设置 DAC7512 的输出模拟量.			                                  	*
//参数说明:	dacdata ; DAC7512 输出模拟量 的设置值                                                	*
//    		  共16位,其中 DB15-DB14 为空闲位, DB13-DB12 是工作模式选择位, 一般设为 0000H        	*
//                        DB11-DB0 是数据位, 最高位在前                                         	*
//返 回 值:	无                                                                                    	*
//***************************************************************************************************
void WriteDAC(unsigned int dacdata)
{
	unsigned char 	i,dach,dacl,dacsend;

	dach = dacdata / 256;			//DAC7512 输入 数字量 高字节
	dacl = dacdata % 256;			//DAC7512 输入 数字量 低字节

	DAC_SYNC	= 1;				//SYNC 置高电平, 并至少保持 33ns
	Delay_us(1);
	DAC_SYNC = 0;					//启动 写周期

//****************************发送数据(高字节)给DAC7512
	for(i=0;i<8;i++)
	{
		DAC_SCLK = 1;
		Delay_us(1);
		//********************
		dacsend = dach & 0x80;
		if(dacsend == 0x80)
				DAC_DIN=1;
		else 	DAC_DIN=0;
		dach = dach << 1;
		//********************
		DAC_SCLK = 0;				//下降沿
		Delay_us(1);
	}
//****************************发送数据(低字节)给DAC7512	
	for(i=0;i<8;i++)
	{	
		DAC_SCLK=1;
		Delay_us(1);
		//********************
		dacsend = dacl & 0x80;
		if(dacsend == 0x80)
				DAC_DIN=1;
		else 	DAC_DIN=0;
		dacl = dacl << 1;
		//********************
		DAC_SCLK = 0;				//下降沿
		Delay_us(1);
	}
}

//***************************************************************************************************
//函数原型:	bit Deal_ADC(unsigned int *ad_value)         		                                  	*
//功    能:	从ADS1110读出AD转换值并进行标度变换									                 	*
//参数说明:	*ad_value;	经过标度变换的AD转换值 , 2个字节   	                                      	*
//    		    例如 ;  1234(十进制数)表示 1234mv 或 mA										       	*
//返 回 值:		                                                                                   	*
//			0;读出成功																			  	*
//			1;读出失败																			  	*
//说    明: 标度变换后的AD值 = (AD读出值)/(SPS*PGA) ,单位 mv 或 mA								  	*
//***************************************************************************************************
bit Deal_ADC(unsigned int *ad_value)
{
	unsigned int  TempData;
	unsigned char ReadAD_OverTime = 0;	//读 AD 错误超时标志
	
	while( ReadADC(&TempData) && (ReadAD_OverTime < 5) )	//读AD转换值 失败,并且未超时(超过5次)
	{
		ReadAD_OverTime++;					//超时标志+1
		Delay_us(5);
 	}

	if( ReadAD_OverTime > 5 ) 				//错误 超过 5次
 	{
		*ad_value = 2048;//4.2增加			//DA输出为 2048 ,说明读出 错误############################################################

 		return 1;							//读AD转换值 失败
 	}
 	
	if( TempData > 2048)//4.1增加			//防止显示 负数
	{
		TempData = 0;
	}

	*ad_value = (TempData * 3) / (SPS * PGA);		//进行标度变换
						//4.3修改  *3是为了使AD读出值 数值上 = 端口输入电压

	

	//######################################测试#####################################################################################
	printf ("%d\n", *ad_value );
	//######################################测试#####################################################################################

	

	
	return 0;
}

//***************************************************************************************************
//函数原型:	void Deal_DAC(unsigned int da_value)	       		                        	  		*
//功    能:	设置(经过标度变换的设置值,为十进制表示) DAC7512 的输出模拟量		                 	*
//参数说明:	da_value ; DAC7512 输出模拟量 的设置值(已经过标度变换)                          		*
//    		    例如 ; 1234(十进制数)表示 1234mv 或 mA										       	*
//返 回 值:	无																					  	*
//说    明: DA输出值 = da_value*4096/5000 = da_value*512/625 = 0.8192*da_value ,单位 mv 或 mA	  	*
//***************************************************************************************************
void Deal_DAC(unsigned int da_value)
{
	unsigned long xdata TempData1,TempData2;

	if(da_value > 1000)//4.4修改 	暂时只能设置最大充放电电流为1000mA
	{
		da_value = 1000;
		;//设置值超限,置一个 错误标志 $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
	}

	TempData1 	= da_value;					//unsigned int  隐式转换成 unsigned long

	TempData2	= (TempData1 * 512 * 5) / 625;//4.4修改,增加*5			//进行标度变换

	da_value 	= TempData2 - 1;		 	//unsigned long 隐式转换成 unsigned int  , -1是防止设置值为5000时,DA出错
									
	WriteDAC(da_value);						//设置 DA 输出值
}
/*
//***************************************************************************************************
//函数原型:	void hex_to_decimalist(unsigned int *value)	       		              					*
//功    能:	十六进制数转化为十进制数		                 										*
//参数说明:	无																				       	*
//返 回 值:	无																					  	*
//说    明: 无																					  	*
//***************************************************************************************************
void hex_to_decimalist(unsigned int *value)
{
	unsigned int  TempData,TempData1,TempData2;

	TempData = *value;

	TempData1 =  TempData  / 1000;				//得出千位数字
	TempData  =  TempData - TempData1 * 1000;
	TempData2 =  TempData1;

	TempData1 =  TempData  / 100;				//得出百位数字
	TempData  =  TempData - TempData1 * 100;
	TempData2 =  TempData1 + (TempData2 << 4);
	
	TempData1 =  TempData  / 10;				//得出十位数字
	TempData2 =  TempData1 + (TempData2 << 4);
	
	TempData1 =  TempData  % 10;				//得出个位数字
	TempData2 =  TempData1 + (TempData2 << 4);
	
	*value    = TempData2;
}
//---------------------------------------------------------------------------------------------------
*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -