電位器是一種機(jī)械裝置,使用它可以根據(jù)所需值設(shè)置電阻,從而改變通過它的電流。電位器有很多應(yīng)用,但大多數(shù)情況下電位器用作音頻放大器的音量控制器。
電位器不控制信號(hào)的增益,但它形成了一個(gè)分壓器,這就是輸入信號(hào)衰減的原因。因此,在這個(gè)項(xiàng)目中,我將向您展示如何使用 IC PT2258 構(gòu)建您的數(shù)字音量控制器,并將其與 Arduino 接口以控制放大器電路的音量。
集成電路PT2258
正如我之前提到的,PT2258 是一款用作 6通道電子音量控制器的 IC,該 IC 采用專為多通道音頻-視頻應(yīng)用而設(shè)計(jì)的 CMOS 技術(shù)。
該 IC 提供 I2C 控制接口,衰減范圍為 0 至 -79dB,1dB/步長,采用 20 引腳 DIP 或 SOP 封裝。
一些基本功能包括,
6 個(gè)輸入和輸出通道(適用于 5.1 家庭音頻系統(tǒng))
可選 I2C 地址(用于菊花鏈應(yīng)用)
高通道分離(用于低噪聲應(yīng)用)
信噪比 》 100dB
工作電壓為 5 至 9V
PT2258 IC 工作原理
該 IC 通過 SCL 和 SDA 線從微控制器發(fā)送和接收數(shù)據(jù)。SDA 和 SCL 構(gòu)成總線接口。這些線必須通過兩個(gè) 4.7K 電阻拉高,以確保穩(wěn)定運(yùn)行。
在我們進(jìn)入實(shí)際的硬件操作之前,這里是IC的詳細(xì)功能描述。如果你不想知道這一切,你可以跳過這部分,因?yàn)樗械墓δ懿糠侄加?Arduino 庫管理。
數(shù)據(jù)驗(yàn)證
當(dāng) SCL 信號(hào)為 HIGH 時(shí),SDA 線上的數(shù)據(jù)被認(rèn)為是穩(wěn)定的。
SDA 線的 HIGH 和 LOW 狀態(tài)僅在 SCL 為 LOW 時(shí)改變。
啟動(dòng)和停止條件
啟動(dòng)條件被激活時(shí)
SCL 設(shè)置為 HIGH 和
SDA 從 HIGH 狀態(tài)變?yōu)?LOW 狀態(tài)。
停止條件被激活時(shí)
SCL 設(shè)置為 HIGH 和
SDA 從低狀態(tài)轉(zhuǎn)變?yōu)楦郀顟B(tài)
筆記!此信息對(duì)于調(diào)試信號(hào)非常有用。
數(shù)據(jù)格式
傳輸?shù)?SDA 線的每個(gè)字節(jié)由 8 位組成,形成一個(gè)字節(jié)。每個(gè)字節(jié)后面必須跟一個(gè)確認(rèn)位。
致謝
確認(rèn)確保穩(wěn)定和正確的操作。在確認(rèn)時(shí)鐘脈沖期間,微控制器將 SDA 引腳拉高,此時(shí)外圍設(shè)備(音頻處理器)將 SDA 線拉低(低)。
外圍設(shè)備(PT2258)現(xiàn)在被尋址,它必須在接收到一個(gè)字節(jié)后產(chǎn)生一個(gè)確認(rèn),否則,SDA 線將在第九(9)個(gè)時(shí)鐘脈沖期間保持高電平。如果發(fā)生這種情況,主發(fā)送器將生成 STOP 信息以中止傳輸。
這消除了有效數(shù)據(jù)傳輸?shù)谋匾浴?/p>
地址選擇
該 IC 的 I2C 地址取決于 CODE1 (Pin No.17) 和 CODE2 (Pin No.4) 的狀態(tài)。
邏輯高 = 1
邏輯低 = 0
接口協(xié)議
接口協(xié)議由以下部分組成:
一個(gè)起始位
一個(gè)芯片地址字節(jié)
ACK=確認(rèn)位
一個(gè)數(shù)據(jù)字節(jié)
停止位
IC上電后,需要等待至少200ms才能傳輸?shù)谝粋€(gè)數(shù)據(jù)位,否則可能會(huì)導(dǎo)致數(shù)據(jù)傳輸失敗。
延遲之后,首先要做的是通過 I2C 線發(fā)送“0XC0”來清除寄存器,這樣可以確保正常運(yùn)行。
上述步驟清空了整個(gè)寄存器,現(xiàn)在我們需要給寄存器設(shè)置一個(gè)值,否則,寄存器存儲(chǔ)垃圾值,我們得到一個(gè)雀斑的輸出。
為保證音量調(diào)節(jié)合適,需要依次發(fā)送 10dB 的倍數(shù)和 1dB 的代碼到衰減器,否則 IC 會(huì)出現(xiàn)異常。下圖更清楚地說明了這一點(diǎn)。
以上兩種方法都可以正常工作。
為確保正常運(yùn)行,請(qǐng)確保 I2C 數(shù)據(jù)傳輸速度不超過 100KHz。
這就是您可以向 IC 傳輸一個(gè)字節(jié)并衰減輸入信號(hào)的方式。上面的部分是學(xué)習(xí) IC 的功能,但正如我之前所說,我們將使用 Arduino 庫與管理所有硬代碼的 IC 進(jìn)行通信,我們只需要進(jìn)行一些函數(shù)調(diào)用。
原理圖
上圖顯示了基于 PT2258 的音量控制電路的測試原理圖。它取自數(shù)據(jù)表并根據(jù)需要進(jìn)行修改。
為了演示,電路是在上面顯示的示意圖的幫助下在無焊面包板上構(gòu)建的。
所需組件
PT2258 集成電路 – 1
Arduino Nano 控制器 – 1
通用面包板 - 1
螺絲端子 5mm x 3 – 1
按鈕 – 1
4.7K 電阻,5% - 2
150K 電阻,5% - 4
10k 電阻,5% - 2
10uF 電容 – 6
0.1uF 電容 – 1
跳線 - 10
Arduino代碼
#include
#include#include
接下來,使用您喜歡的文本編輯器打開PT2258.cpp文件,我使用的是 Notepad++。
可以看到wire庫的“w”是小寫字母,與最新的Arduino版本不兼容,需要換成大寫的“W”,就這樣。
可在本節(jié)末尾找到 PT2258 音量控制器的完整代碼。這里解釋了程序的重要部分。
我們通過包含所有必需的庫文件來開始代碼。Wire 庫用于在 Arduino 和 PT2258 之間進(jìn)行通信。PT2258 庫包含所有關(guān)鍵的 I2C 時(shí)序信息和確認(rèn)。ezButton庫用于與按鈕交互。
不要使用下面的代碼圖像,而是從代碼文件中復(fù)制所有代碼實(shí)例,并像我們以前在其他項(xiàng)目中那樣將它們格式化
#include#include #include
接下來,為兩個(gè)按鈕和 PT2258 庫本身制作對(duì)象。
PT2258 PT2258; ezButton button_1(2); ezButton button_2(4);
接下來,定義音量級(jí)別。這是該 IC 啟動(dòng)時(shí)的默認(rèn)音量級(jí)別。
國際體積 = 40;
接下來,啟動(dòng) UART,并設(shè)置 I2C 總線的時(shí)鐘頻率。
序列號(hào).開始(9600); Wire.setClock(100000);
設(shè)置I2C時(shí)鐘非常重要,否則IC將無法工作,因?yàn)樵揑C支持的最大時(shí)鐘頻率為100KHz。
接下來,我們使用if else語句做一些整理工作,以確保 IC 與 I2C 總線正確通信。
如果 (!pt2258.init()) Serial.printIn("PT2258 啟動(dòng)成功"); 別的 Serial.printIn(“啟動(dòng) PT2258 失敗”);
接下來,我們設(shè)置按鈕的去抖動(dòng)延遲。
Button_1.setDebounceTime(50); Button_2.setDebounceTime(50);
最后,通過設(shè)置默認(rèn)通道音量和引腳號(hào)來啟動(dòng) PT2258 IC。
/* 使用默認(rèn)音量和 Pin 啟動(dòng) PT*/ Pt2258.setChannelVolume(音量,4); Pt2258.setChannelVolume(音量,5);
這標(biāo)志著Void Setup()部分的結(jié)束。
在循環(huán)部分,我們需要從按鈕類中調(diào)用循環(huán)函數(shù);這是圖書館的規(guī)范。
Button_1.loop(); //庫規(guī)范 Button_2.loop(); //庫規(guī)范
下面的if部分是為了降低音量。
/* 如果條件為真,則按下按鈕 1 */ 如果 (button_1.ispressed()) { 音量++;// 增加音量計(jì)數(shù)器。 // 這個(gè) if 語句確保交易量不超過 79 如果(音量 >= 79) { 體積 = 79; } Serial.print(“卷:”); // 打印音量級(jí)別 Serial.printIn(volume); /* 設(shè)置通道 4 的音量 在 PT2558 IC 的 PIN 9 中 */ Pt2558.setChannelVolume(音量,4); /* 設(shè)置通道 5 的音量 PT2558 IC的PIN 10是哪個(gè) */ Pt2558.setChannelVolume(音量,5); }
下面的if部分是為了增加音量。
// 按鈕 2 也是如此 如果 (button_2.isPressed()) { 體積 - ; // 這個(gè) if 語句確保音量不低于零。 如果(音量 <= 0) 音量 = 0; Serial.print(“卷:”); Serial.printIn(volume); Pt2258.setChannelVolume(音量,4); Pt2558.setChannelVolume(音量,5); }
測試數(shù)字音頻音量控制電路
為了測試電路,使用了以下設(shè)備
具有 13-0-13 分接頭的變壓器
2 4Ω 20W 揚(yáng)聲器作為負(fù)載。
音源(電話)
我弄亂了機(jī)械電位器,并用兩條小跨接電纜短接了兩條引線?,F(xiàn)在,借助兩個(gè)按鈕,可以控制放大器的音量。
#include
#include
#include
PT2258 PT2258;// PT2258 對(duì)象
ezButton button_1(2); //Button_1 對(duì)象
ezButton button_2(4); //Button_2 對(duì)象
整數(shù)體積 = 40;// 默認(rèn)音量/起始音量
無效設(shè)置(){
序列號(hào).開始(9600);//UART開始
Wire.setClock(100000); // 將 I2C 時(shí)鐘設(shè)置為 100KHz
/* 檢查 MCU 是否可以與 PT 通話 */
如果(!pt2258.init())
Serial.println("PT2258 啟動(dòng)成功");
別的
Serial.println("啟動(dòng) PT2258 失敗");
/* 設(shè)置按鈕去抖動(dòng)延遲*/
button_1.setDebounceTime(50);
button_2.setDebounceTime(50);
/* 使用默認(rèn)音量和 Pin 啟動(dòng) PT*/
pt2258.setChannelVolume(音量, 4);
pt2258.setChannelVolume(音量, 5);
}
無效循環(huán)(){
button_1.loop(); //庫規(guī)范
button_2.loop(); //庫規(guī)范
/* 如果條件為真,則按下按鈕 1*/
if (button_1.isPressed())
{
音量++;// 增加音量計(jì)數(shù)器。
// 這個(gè) if 語句確保交易量不超過 79
如果(音量 >= 79)
{
體積 = 79;
}
Serial.print("音量:"); // 打印音量級(jí)別
Serial.println(卷);
/*設(shè)置通道4的音量
在 PT2258 IC 的 PIN 9 中
*/
pt2258.setChannelVolume(音量, 4);
/*設(shè)置通道5的音量
PT2258 IC的10腳是哪個(gè)
*/
pt2258.setChannelVolume(音量, 5);
}
//按鈕2也是如此
如果 (button_2.isPressed())
{
體積 - ;
// 這個(gè) if 語句確保音量不低于零。
如果(音量 <= 0)
體積 = 0;
Serial.print("音量:");
Serial.println(卷);
pt2258.setChannelVolume(音量, 4);
pt2258.setChannelVolume(音量, 5);
}
}
-
電位器
+關(guān)注
關(guān)注
14文章
1003瀏覽量
66672 -
音量控制器
+關(guān)注
關(guān)注
0文章
9瀏覽量
8734 -
PT2258
+關(guān)注
關(guān)注
0文章
2瀏覽量
5619
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論