主题 | 内容 | 教学目的/扩展视频 |
---|---|---|
ADC读模拟量摇杆 | 电路原理,跳线设置,摇杆结构分析,读出数据。 | 了解摇杆的结构,能读出AD值。 |
师从洋桃电子,杜洋老师
本文深入剖析了STM32模拟摇杆的驱动实现,通过硬件结构图解与软件流程分析,构建了从物理信号到数字处理的完整知识体系。
提供的数据处理方案与扩展应用示例,为开发高精度控制设备奠定了坚实基础。
📑文章目录

一、模拟摇杆硬件全解析
1.1 摇杆结构图解
- X/Y轴电位器:随摇杆位置改变阻值(0-10KΩ典型值)
- Z轴开关:轻触开关,按压时导通
1.2 典型参数表
参数 | 规格 | 说明 |
---|---|---|
工作电压 | 3.3V-5V | 与ADC参考电压匹配 |
输出范围 | 0-3.3V(满量程) | 对应ADC值0-4095 |
机械寿命 | 100万次 | 微动开关耐久性 |
分辨率 | 12位 | STM32 ADC性能 |
二、硬件连接方案
2.1 电路拓扑图
3.3V
│
├───[X轴电位器]──ADC_IN6(PA6)
│
├───[Y轴电位器]──ADC_IN7(PA7)
│
└───[微动开关]───PB2(上拉输入)
│
GND
2.2 分压电路原理
X轴输出电压 = 3.3V * (Rx / (Rx + R_fixed))
Y轴输出电压 = 3.3V * (Ry / (Ry + R_fixed))
其中:
- Rx/Y:电位器实时阻值
- R_fixed:固定分压电阻(通常10KΩ)
三、软件驱动架构
3.1 系统流程图
3.2 关键代码解析
3.2.1 ADC配置(adc.c)
void ADC_Configuration(void){
// 通道配置(双通道)
ADC_RegularChannelConfig(ADC1, ADC_Channel_6, 1, ADC_SampleTime_28Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_7, 2, ADC_SampleTime_28Cycles5);
// DMA循环模式配置
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
DMA_InitStructure.DMA_BufferSize = 2; // 双通道缓冲
}
3.2.2 按键检测(JoyStick.c)
if(GPIO_ReadInputDataBit(JoyStickPORT,JoyStick_KEY)==0){
// 摇杆按下处理
}
四、数据采集与处理
4.1 ADC原始值转换
// 获取X轴位置(PA6)
uint16_t x_pos = ADC_DMA_IN[0];
// 获取Y轴位置(PA7)
uint16_t y_pos = ADC_DMA_IN[1];
// 转换为电压值
float x_voltage = (x_pos / 4095.0) * 3.3;
float y_voltage = (y_pos / 4095.0) * 3.3;
4.2 摇杆状态判断
状态 | X值范围 | Y值范围 | 应用场景 |
---|---|---|---|
中心位 | 2000-2200 | 2000-2200 | 待机状态 |
向上 | <1000 | - | 菜单选择 |
向下 | >3000 | - | 确认操作 |
向左 | - | <1000 | 返回操作 |
向右 | - | >3000 | 前进操作 |
五、高级应用扩展
5.1 数据滤波处理
// 滑动平均滤波示例
#define FILTER_SIZE 5
uint16_t x_buf[FILTER_SIZE], y_buf[FILTER_SIZE];
void update_filter(){
static uint8_t index = 0;
x_buf[index] = ADC_DMA_IN[0];
y_buf[index] = ADC_DMA_IN[1];
index = (index+1) % FILTER_SIZE;
}
uint16_t get_filtered_x(){
uint32_t sum = 0;
for(int i=0; i<FILTER_SIZE; i++) sum += x_buf[i];
return sum / FILTER_SIZE;
}
5.2 摇杆校准功能
// 校准参数存储
typedef struct{
uint16_t x_min;
uint16_t x_max;
uint16_t y_min;
uint16_t y_max;
} CalibData;
void auto_calibration(){
CalibData calib;
calib.x_min = 4095;
calib.x_max = 0;
// 采集极值更新校准参数
// ...
}
六、常见问题排查
现象 | 可能原因 | 解决方案 |
---|---|---|
数值不变化 | 电位器接触不良 | 更换摇杆组件 |
数值跳变剧烈 | 电源干扰 | 增加滤波电容 |
按键检测不稳定 | 上拉电阻失效 | 检查GPIO配置 |
数据偏移 | 未校准 | 执行自动校准程序 |
七、应用场景拓展
7.1 游戏控制器
+-------------+
| STM32 |
| 控制器核心 |
+-----+-------+
|
[摇杆数据]--->|蓝牙/WiFi模块
|
+-----+-------+
| 手机/PC端 |
| 游戏应用 |
+-------------+
7.2 工业遥控器
// 转换为比例控制信号
float control_x = (x_pos - 2048) / 2048.0; // -1.0~+1.0
float control_y = (y_pos - 2048) / 2048.0;
通过本文可以全面掌握模拟摇杆的驱动原理与实现方法。建议使用3D打印定制摇杆帽,并通过修改滤波算法优化控制精度。模拟摇杆作为经典的人机交互设备,在物联网和工业控制领域仍有广阔应用前景!
八、相关资源
[1] 洋桃电子B站课程-STM32入门100步
[2] STM32官方文档手册
[3] STM32F103固件函数库用户手册(中文)
[4] 模拟摇杆ADC读取程序
[5] 模拟摇杆的ADC驱动.pptx
💬 技术讨论(请在评论区留言~)
📌 下期预告:下一期将探讨MP3播放芯片,欢迎持续关注!
点击查阅🔍往期【STM32专栏】文章
版权声明:本文采用[CC BY-NC-SA 4.0]协议,转载请注明来源
实测开发版:洋桃1号开发版(基于STM32F103C8T6)
更新日志:
- v1.0 初始版本(2025-03-15)