【嵌入式简单外设篇】-双轴摇杆模块
本文介绍了双轴摇杆模块的应用场景、硬件连接及代码实现。该模块适用于机器人方向控制、游戏手柄等场景,通过两个电位器输出X/Y轴模拟电压信号,并可通过ADC采样读取。硬件接线需连接VCC、GND及两个ADC通道。文章提供了标准库和HAL库的示例代码,演示了如何读取摇杆位置数据并通过串口输出。此外还介绍了内部按键检测方法,并给出相关教学视频链接供深入学习。
一、适用场景
适用场景:遥控小车/机器人方向控制、游戏手柄原型、云台/舵机控制、模拟摇臂与人机交互输入、示教示例(比例输入)、PID 调参时人工操控、RC 模拟器输入、按键/摇杆联动实验等。双轴摇杆是学习 ADC、滤波、死区处理与 PWM/舵机控制的最佳入门外设之一。

二、器材清单
双轴模拟摇杆模块 ×1
STM32F103VET6 ×1
若干杜邦线(母对母/公对公,根据引脚)
5V/3.3V电源
三、工作原理(要点)
硬件构成:摇杆内部两只电位器(X、Y)分别作为可变分压器,产生与摇杆位置成比例的模拟电压(约 0 ~ VCC,中心约 VCC/2)。按下摇杆通常会闭合内部按键(SW)。
ADC 读取:把 VRx、VRy 接入 MCU 的 ADC 通道,定期采样得到两路数值。按键接数字 GPIO(带上拉或下拉)读取按键事件。
四、接线示意
VCC → +5V
GND → GND
标准库
PA0 →VRX
PA1 →VRY
HAL库
PA0 →VRX
PA1 →VRY
五、示例代码
//标准库
char showlight[20];
uint16_t ADCXvalue ,ADCYvalue;//创建X,Y变量
int z=0;
uint16_t ADC_Getvalue(uint8_t ADC_Channel)//输入通道获取值
{
//ADC通道配置 输入通道可以获取值
ADC_RegularChannelConfig(ADC1,ADC_Channel,1,ADC_SampleTime_55Cycles5);//在序列1写入通道0 时间55.5个ADC时间
ADC_SoftwareStartConvCmd(ADC1,ENABLE);//软件触发转换
while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)==RESET);//获取标志位状态 规则组转换完成标志位 0转换未完成 1 转换完成
return ADC_GetConversionValue(ADC1);
}
int main()
{
USART_Config();
SysTick_Init();
adc_Init();
while(1)
{
if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_7) == SET)
{
z=0;
}else
{
z=1;
}
ADCXvalue=ADC_Getvalue(ADC_Channel_0);//返回值是通道0
ADCYvalue=ADC_Getvalue(ADC_Channel_1);//返回值是通道1
sprintf((char *)showlight,"X:%d,Y:%d,Z:%d\n",ADCXvalue,ADCYvalue,z);
Usart_SendString(USART1,showlight);
Delay_us(1000000);
}
// return 0;
}
//HAL库

// 读取 X 轴 ADC 通道
ADC_ChannelConfTypeDef sConfig = {0};
sConfig.Channel = ADC_CHANNEL_0;
sConfig.Rank = ADC_REGULAR_RANK_1;
sConfig.SamplingTime = ADC_SAMPLETIME_28CYCLES_5;
HAL_ADC_ConfigChannel(&hadc1, &sConfig);
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1, 10);
adcValX = HAL_ADC_GetValue(&hadc1);
volt1 = adcValX * 3.3f / 4095.0f;
// 读取 Y 轴 ADC 通道
sConfig.Channel = ADC_CHANNEL_1;
HAL_ADC_ConfigChannel(&hadc1, &sConfig);
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1, 10);
adcValY = HAL_ADC_GetValue(&hadc1);
volt2 = adcValY * 3.3f / 4095.0f;
/* 格式化并通过 UART1 发送 */
int len = snprintf(msg, sizeof(msg),
"X: %4lu (%.2f V) Y: %4lu (%.2f V)\r\n",
adcValX, volt1,adcValY,volt2);
HAL_UART_Transmit(&huart1, (uint8_t*)msg, len, HAL_MAX_DELAY);
/* 延时 100ms */
HAL_Delay(100);
六、讲解视频
openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。
更多推荐



所有评论(0)