📄 ad_da.c
字号:
//***************************************************************************************************
//描 述:AD,DA操作实现函数定义 *
//文 件 名:ad_da.c *
//日 期:2007年7月11日 *
//***************************************************************************************************
/*
12位AD(TLC2543),12位DA(MAX538)底层驱动函数
修改历史记录列表:
<修改日期> <修改内容简述>
2007/07/11 建立
*/
//***************************************************************************************************
#include "ad_da.h"
//***************************************************************************************************
//函数原型: void write_dac538(INT8U object,INT16U data) *
//参数说明: object ; 要操作的对象 *
// 0 ---- 设置电流; 非0 ---- 设置电压 *
// data ; 待写入的16位串行数据,前4位是伪数据,后12位送入DAC寄存器 *
//返 回 值: 无 *
//说 明: DA转换器MAX538的底层操作函数 *
//***************************************************************************************************
void write_dac538(INT8U object,INT16U data)
{
INT8U temp;
if(object != 0)
{
r_w_bit_8243(2,3,0); //清 8243 P63,使能 输出 电压基准 的 DA转换器(MAX538)
}
else
{
r_w_bit_8243(2,2,0); //清 8243 P62,使能 输出 电流基准 的 DA转换器(MAX538)
}
//先送 MSB
for(temp = 0; temp < 16; temp++,data <<= 1)
{
delay_us(da_delay); //延时
r_w_bit_8243(2,1,0); //清 8243 P61,使 DA转换器(MAX538) SCLK = 0
delay_us(da_delay); //延时
if(data & 0x8000) //为高
{
r_w_bit_8243(2,0,1); //置位 8243 P60,使 DA转换器(MAX538) DIN = 1
}
else //为低
{
r_w_bit_8243(2,0,0); // 清 8243 P60,使 DA转换器(MAX538) DIN = 0
}
delay_us(da_delay); //延时
r_w_bit_8243(2,1,1); //置位 8243 P61,使 DA转换器(MAX538) SCLK = 1
}
delay_us(da_delay); //延时
r_w_bit_8243(2,1,0); //清除 8243 P61,使 DA转换器(MAX538) SCLK = 0,恢复 SCLK 为低电平
delay_us(da_delay); //延时
if(object != 0)
{
r_w_bit_8243(2,3,1); //置位 8243 P63,禁能 输出 电压基准 的 DA转换器(MAX538)
}
else
{
r_w_bit_8243(2,2,1); //置位 8243 P62,禁能 输出 电流基准 的 DA转换器(MAX538)
}
// r_w_bit_8243(2,0,0); //清除 8243 P60,使 DA转换器(MAX538) DIN = 0,恢复 DIN 为低电平
}
//***************************************************************************************************
//函数原型: void set_dac(INT8U object,INT16U da_value) *
//参数说明: object ; 要操作的对象 *
// 0 ---- 设置电流; 非0 ---- 设置电压 *
// da_value ; 要设置的 DA 输出值,单位毫安,其对应的10进制数表示实际电流电压值 *
//返 回 值: 无 *
//说 明: 设置 DA 输出值,单位毫安,其对应的10进制数表示实际电流电压值 *
//***************************************************************************************************
void set_dac(INT8U object,INT16U da_value)
{
if(object != 0) //设置电压
{
da_value = (INT16U)((FLOAT32)da_value / 2.207);
}
else //设置电流
{
da_value = (INT16U)((FLOAT32)da_value / 1.66);
}
write_dac538(object,da_value); //写 MAX538
}
//***************************************************************************************************
//函数原型: INT16U r_w_adc2543(INT8U port) *
//参数说明: port ; 要采样的通道号(0~10) *
//返 回 值: AD 采样值 *
//说 明: 从 TLC2543 读取 前一次转换的 AD 采样值 *
//***************************************************************************************************
INT16U r_w_adc2543(INT8U port)
{
INT8U temp,temp1;
INT16U ad = 0;
r_w_8255(3,0x02); //SCLK=0, 向8255控制寄存器写(0010),复位PC1
cs_2543_enable(); //CS=0, TLC2543 片选使能
port <<= 4; //D7~D4通道选择位;D3~D2为0,12位数据长度;
//D1为0,数据以MSB导前格式输出;D0为0,输出数据转化为单极性数据
delay_us(ad_delay); //延时
//为了减少由于CS的噪声引起的误差,在CS↓后内部电路在响应控制输入信号之前等待一个设置
// 时间。所以,在最小的设置时间消逝以前不要企图输入地址。
//要 等待 吗 ?????? 调试中修改
for(temp = 0; temp < 12; temp++)
{
//读 DOUT
temp1 = r_w_8255(6,0); //读 8255 端口C
if(temp1 & BIT4) //TLC2543 DOUT 为1
{
ad |= 0x01;
}
//写 DIN
if(port & 0x80)
{
r_w_8255(3,0x01); //DIN=1, 向8255控制寄存器写(0001),置位PC0
}
else
{
r_w_8255(3,0x00); //DIN=0, 向8255控制寄存器写(0000),复位PC0
}
r_w_8255(3,0x03); //SCLK=1, 向8255控制寄存器写(0011),置位PC1,产生上升沿,锁存DIN
delay_us(ad_delay); //延时
r_w_8255(3,0x02); //SCLK=0, 向8255控制寄存器写(0010),复位PC1
delay_us(ad_delay); //延时
port <<= 1;
ad <<= 1;
}
cs_2543_disable(); //CS=1, TLC2543 片选禁能
ad >>= 1;
//delay_
return (ad);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -