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