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