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

📄 ad_da.c

📁 12位AD(TLC2543),12位DA(MAX538)底层驱动函数
💻 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 + -