51單片機輕松入門—基于STC15W4K系列(C語言版)
李友全 編著:http://www.zg4o1577.cn/bbs/dpj-37954-1.html
第10章 數模轉換器DAC 1 D/A輸出電路圖 2 TLC5615基本測試實驗 3 TLC5615產生波形實驗 4 TLC5615播放音樂實驗 數模轉換就是將單片機輸出的數字信號轉換為模擬信號(比如正弦波、鋸齒波), 簡稱為D/A,實現數字信號轉換為模擬信號的器件稱為數模轉換器,簡稱DAC, DAC一般是由專用集成電路完成的。 1 D/A輸出電路圖 1號單片機與D/A輸出芯片TLC5615連接電路如圖所示 。
0.png (190.41 KB, 下載次數: 170)
下載附件
2016-3-28 03:24 上傳
TLC5615的1、2、3腳用于與單片機進行通信(SPI接口),6腳是基準電壓輸入, 7腳是模擬信號輸出。圖中的MC1403是一個廉價的電壓基準芯片,簡單的說就是一 個穩壓精度比L7805之類更高的穩壓塊 2 TLC5615基本測試實驗 #include "STC15W4K.H" // 注意宏定義后面沒分號 #include sbit CS=P5^5; sbit CLK=P4^0; sbit DIN=P3^4; void DaConv(unsigned int value) { // 此函數內容固定,單片機晶振頻率在5-35MHz范圍內直接復制使用即可 } void main() { unsigned int value; // 待轉換的數據 while(1) { value=511; // 這里輸入0--1023的數據觀察D/A轉換輸出電壓 DaConv(value); // 執行D/A轉換,無任何返回值。 } } 實驗結果如表所示,輸出電壓X = 2·Vref·Value /1023。
0.png (118.12 KB, 下載次數: 153)
下載附件
2016-3-28 03:25 上傳
3 TLC5615產生鋸齒波、三角波、正弦波實驗 例10.4 TLC5615產生1000Hz鋸齒波、三角波、正弦波,R/C時鐘22.1184MHz。
1.png (115.47 KB, 下載次數: 152)
下載附件
2016-3-28 03:25 上傳
觀察上圖波形,橫軸是時間,可用單片機定時器定時中斷進行控制,縱軸是模擬電壓值, 用TLC5615進行D/A轉換輸出即可。 要讓TLC5615輸出鋸齒波、三角波、正弦波等波形,我們可以對波形的一個周期抽樣一些 點進行D/A轉換輸出,把抽樣點建立成表格,定時器每中斷一次查表轉換輸出一個值。 比如我們將正弦函數從0°~360°范圍內按10°一個步進值進行等分,可得0、10、20、 30、…340、350,共36個點,這就確定了表格數組大小為36個整數, 第1點輸出電壓值:511×sin(0)+512=512 // 511用于波形向上平移。 第2點輸出電壓值:511×sin(10)+512=601 // 511用于波形向上平移。 第3點輸出電壓值:511×sin(20)+512=687 // 511用于波形向上平移。 unsigned int code SinTable[] = // 正弦波表格 { 512,601,687,768,840,903,955,992,1015,1023,1015,992,955,903,840,768,687,601,512, 423,337,257,183,121,69,32,9,1,9,32,69,121,183,257,337,423, };
%E7%AC%AC10%E7%AB%A0-%E6%95%B0%E6%A8%A1%E8%BD%AC%E6%8D%A2%E5%99%A8dac-9.jpg (9.45 KB, 下載次數: 142)
下載附件
2016-3-28 03:29 上傳
%E7%AC%AC10%E7%AB%A0-%E6%95%B0%E6%A8%A1%E8%BD%AC%E6%8D%A2%E5%99%A8dac-10.jpg (9.88 KB, 下載次數: 155)
下載附件
2016-3-28 03:29 上傳
%E7%AC%AC10%E7%AB%A0-%E6%95%B0%E6%A8%A1%E8%BD%AC%E6%8D%A2%E5%99%A8dac-11.jpg (10.59 KB, 下載次數: 142)
下載附件
2016-3-28 03:29 上傳
主要程序代碼如下:
void Timer0() interrupt 1 { static unsigned char counter=0; |
|
P35=!P35; | // | 觀察定時器定時時間用的 | TH0=0xff; | // | TH0=0xff; | TL0=0xCD; | // | TL0=0x2c; | DaConv(SinTable[counter]); | // | D/A輸出 | counter++; |
|
|
counter%=36; // counter在0到36之間循環變化使波形循環輸出 } void main() { Timer0_Init(); // 初始化并啟動定時器0 while(1); // 通過定時器0來控制產生電壓的時間間隔 } 當需要更換輸出波形時,只需要修改DaConv(SinTable[counter]);語句中的表格名稱即可,實測 D/A輸出波形如圖10-7所示。 4 TLC5615播放音樂實驗 將音樂文件(比如MP3文件)通過其它輔助軟件轉換成單片機內部的表格數組,然后通過不斷查 表+D/A的方式即可播放出音樂,通過調節TLC5615的輸入基準電壓就可調節輸出音量的大小。 主要代碼如下: void Timer0() interrupt 1 { static unsigned int counter=0; TH0=0xFE; TL0=0x33; DaConv(((unsigned int)wav[counter])<<1); // 將wav數組中的數據擴大2倍后寫入TLC5615 counter++; // 擴大2倍是為了使TLC5615的音頻輸出電壓范圍在0-2.5V之間 counter%=WAV_LEN; // counter在0到WAV_LEN-1之間循環變化使聲音循環播放 } void main() { Timer0_Init(); // 初始化并啟動定時器0 while(1); // 通過定時器0來控制產生電壓的時間間隔 }
|