一、项目概述
CH552多功能音量调节旋钮是一款基于南京沁恒CH552G芯片 的嵌入式设备,旨在通过旋转编码器实现精准音量调节 ,并扩展多媒体控制、灯光反馈、触觉反馈 等功能。项目核心目标是通过CH552的USB HID协议模拟多媒体键盘,实现对电脑/手机音量的无缝控制,同时提供直观的交互体验(如旋转灯光方向、振动反馈)。
该方案具有低成本、易开发、功能可扩展的特点,适合DIY爱好者、小型电子设备集成等场景。
二、核心功能与特点
-
基础音量调节 :通过旋转编码器实现音量增加/减少,支持细粒度调节(如1%步进)。
-
多媒体控制 :集成播放/暂停、上一曲/下一曲等功能,通过按键或旋转组合键触发。
-
灯光反馈 :内置WS2812B RGB灯珠,旋转时灯光方向随旋转方向改变(如顺时针旋转时灯光向右流动),提升交互体验。
-
触觉反馈 :采用双振动马达(不同封装),通过PWM控制振动强度,模拟真实旋钮的"段落感"。
-
USB HID兼容 :支持Windows 10/11 、macOS等系统,即插即用,无需额外驱动。
三、系统架构与硬件设计
1. 系统架构
c
+-------------------+ +-------------------+ +-------------------+
| 输入模块 | | 控制核心 | | 输出模块 |
| (EC11旋转编码器) |<--->| (CH552G芯片) |<--->| (USB HID设备) |
+-------------------+ +-------------------+ +-------------------+
| | | | | | | | | | | | |
| | | | | | | | | | +---->+-------------------+
| | | | | | | | | +-------->| 灯光模块 |
| | | | | | | | +------------>| 振动模块 |
| | | | | | | +---------------->| 电源模块 |
| | | | | | +-------------------->| USB接口 |
| | | | | +-------------------------------->| |
| | | | +------------------------------------>| |
| | | +---------------------------------------->| |
| | +-------------------------------------------->| |
| +--------------------------------------------------->| |
+--------------------------------------------------->| |
2. 硬件选型与连接
(1)核心芯片:CH552G
-
选择理由 :CH552G是增强型8051内核 8位单片机,内置USB Device控制器 、16KB Flash 、1KB RAM ,支持HID协议,无需外部晶振(内部24MHz RC振荡器),适合轻量级USB设备开发。
-
关键资源:
-
GPIO:用于连接旋转编码器、按键、灯珠、马达;
-
外部中断 :用于检测旋转编码器的A/B相信号;
-
PWM:用于控制振动马达的强度;
-
USB:用于与主机通信(HID设备)。
-
(2)输入模块:EC11旋转编码器
-
功能 :检测旋转方向与角度,输出A/B相脉冲信号。
-
连接方式:
-
A相 :接CH552的P3.2(外部中断0,下降沿触发);
-
B相 :接CH552的P3.3(普通GPIO,用于判断旋转方向);
-
按键 :接CH552的P3.4(用于触发"播放/暂停"等功能)。
-
(3)输出模块
-
灯光模块 :WS2812B RGB灯珠 (4颗),接CH552的P1.0(PWM输出,通过单总线控制);
-
振动模块 :双振动马达 (0408空心杯+1027扁平),接CH552的P1.1 (PWM1)、P1.2(PWM2);
-
USB接口 :Type-C (键线分离),接CH552的USB_DP/USB_DM(USB 2.0全速)。
(4)电源模块
-
输入:5V DC(通过Type-C接口);
-
稳压 :CH552内置5V→3.3V LDO,无需外部稳压器;
-
滤波 :在电源输入端并联10μF电解电容+0.1μF陶瓷电容(去耦)。
四、软件设计与实现
1. 开发环境
-
IDE:Keil uVision5(支持C51语言);
-
编译器:SDCC(开源C51编译器);
-
下载工具:WCHISPTool(用于烧录固件);
-
库依赖:CH552官方SDK(提供USB HID、GPIO、PWM等驱动)。
2. 核心代码实现
(1)旋转编码器信号处理
通过外部中断0 (A相下降沿触发)检测旋转方向,结合B相电平判断是顺时针 还是逆时针:
c
#include "ch552.h"
#include "gpio.h"
#include "usb.h"
#define ENCODER_A P3_2 // 旋转编码器A相(外部中断0)
#define ENCODER_B P3_3 // 旋转编码器B相
#define BUTTON P3_4 // 旋转编码器按键
volatile int encoder_count = 0; // 旋转计数(用于音量调节)
volatile bit encoder_dir = 0; // 旋转方向(0=逆时针,1=顺时针)
// 外部中断0服务函数(A相下降沿触发)
void EXTI0_ISR(void) interrupt 0 {
if (ENCODER_B == 1) {
encoder_dir = 1; // 顺时针
encoder_count++;
} else {
encoder_dir = 0; // 逆时针
encoder_count--;
}
// 触发音量调节(通过USB HID发送多媒体按键)
if (encoder_count >= 5) { // 每5个脉冲调节1%音量
USB_SendMediaKey(MEDIA_VOLUME_UP);
encoder_count = 0;
} else if (encoder_count <= -5) {
USB_SendMediaKey(MEDIA_VOLUME_DOWN);
encoder_count = 0;
}
}
(2)USB HID多媒体控制
通过CH552的USB Device控制器 模拟多媒体键盘 ,发送音量调节 、播放/暂停等HID报告:
c
// HID报告描述符(精简版,支持音量调节、播放/暂停)
const uint8_t HID_ReportDesc[] = {
0x05, 0x0C, // Usage Page (Consumer)
0x09, 0x01, // Usage (Consumer Control)
0xA1, 0x01, // Collection (Application)
0x85, 0x01, // Report ID (1)
0x15, 0x00, // Logical Minimum (0)
0x25, 0x01, // Logical Maximum (1)
0x75, 0x01, // Report Size (1 bit)
0x95, 0x08, // Report Count (8 bits)
0x09, 0xB5, // Usage (Scan Next Track)
0x09, 0xB6, // Usage (Scan Previous Track)
0x09, 0xE2, // Usage (Mute)
0x09, 0xE9, // Usage (Volume Increment)
0x09, 0xEA, // Usage (Volume Decrement)
0x81, 0x02, // Input (Data, Var, Abs)
0xC0 // End Collection
};
// 发送多媒体按键
void USB_SendMediaKey(uint8_t key) {
uint8_t report[2] = {0x01, key}; // Report ID=1,key=多媒体按键码
USB_WriteEndpoint(ENDPOINT_IN, report, 2);
}
(3)灯光与振动反馈
-
灯光反馈 :通过PWM控制WS2812B灯珠的亮度与颜色,旋转时灯光方向随旋转方向改变:
cvoid UpdateLEDs(bit dir) { static uint8_t led_pos = 0; if (dir == 1) { // 顺时针 led_pos = (led_pos + 1) % 4; } else { // 逆时针 led_pos = (led_pos - 1 + 4) % 4; } // 设置WS2812B灯珠颜色(如绿色) WS2812B_SetColor(led_pos, 0x00, 0xFF, 0x00); }
振动反馈 :通过PWM控制振动马达的强度,模拟"段落感":
c
void UpdateVibration(bit dir) {
if (dir == 1) { // 顺时针
PWM_SetDuty(PWM1, 50); // 50%占空比
} else { // 逆时针
PWM_SetDuty(PWM2, 30); // 30%占空比
}
Delay_ms(100); // 振动持续100ms
PWM_SetDuty(PWM1, 0);
PWM_SetDuty(PWM2, 0);
}
参考代码 CH552 的多功能音量调节旋钮项目资料 www.youwenfan.com/contentcss/183112.html
五、系统调试与优化
1. 硬件调试
-
旋转编码器 :用示波器检测A/B相信号,确认旋转时输出正交脉冲(相位差90°);
-
USB通信 :用Bus Hound工具监控USB数据包,确认HID报告正确发送;
-
灯光与振动:测试不同旋转方向时,灯光与振动是否符合预期。
2. 软件优化
-
中断处理 :将旋转编码器的A相信号 设置为下降沿触发,减少中断次数(每旋转一格触发1次);
-
去抖处理 :在旋转编码器的B相 添加软件去抖(如延迟10ms再读取),避免误触发;
-
低功耗 :在空闲时进入睡眠模式(CH552支持USB远程唤醒),降低功耗。
六、应用场景与扩展方向
1. 应用场景
-
桌面音响:集成到桌面音响中,作为音量调节旋钮;
-
电脑外设 :作为多媒体键盘的补充(如配合键盘使用);
-
DIY设备:用于DIY智能音箱、智能灯光控制器等。
2. 扩展方向
-
添加OLED显示 :通过I2C接口连接OLED屏,显示当前音量、歌曲信息等;
-
支持蓝牙 :通过CH552的UART接口连接蓝牙模块(如HC-05),实现无线控制;
-
自定义功能 :通过上位机软件设置旋转方向的灯光/振动效果,满足个性化需求。
七、总结
CH552多功能音量调节旋钮是一款低成本、易开发 的嵌入式设备,通过旋转编码器 实现精准音量调节,结合USB HID 模拟多媒体键盘,提供灯光+振动 的双重反馈。该方案充分利用了CH552的USB Device 、外部中断 、PWM等资源,适合DIY爱好者、小型电子设备集成等场景。