电位器是一种机械装置,使用它可以根据所需值设置电阻,从而改变通过它的电流。电位器有很多应用,但大多数情况下电位器用作音频放大器的音量控制器。
电位器不控制信号的增益,但它形成了一个分压器,这就是输入信号衰减的原因。因此,在这个项目中,我将向您展示如何使用 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);
}
}