?? 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 + -