📄 ad_da_module.c
字号:
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 + -