PS2游戏摇杆原理及控制实现

21ic电子网 2020-09-12 00:00
摇杆一般在航模中的无人机、电玩、遥控车、云台等设备上应用广泛,很多带有屏幕的设备也经常使用摇杆作为菜单选择的输入控制。

本篇介绍双轴按键摇杆的使用。

产品说明

PS2游戏双轴摇杆传感器模块由采用原装优质金属PS2摇杆电位器制作,具有2轴(X,Y)模拟输出,1路(Z)按钮数字输出;
方便配合Arduino传感器扩展板使用。

产品特性

双轴按键摇杆主要由两个电位器和一个按键开关组成,两个电位器随着摇杆扭转角度分别输出X、Y轴上对应的电压值,在Z轴方向上按下摇杆可触发轻触按键。

在配套机械结构的作用下,无外力扭动的摇杆初始状态下,两个电位器都处在量程的中间位置。

它就是两个电位器和按键的组合体。

使用方法

PS2游戏摇杆可以被视为一个按钮和两个电位计的组合。

实现的结构类似下面图中所示:

这个图对于理解PS2的按键原理有帮助,但是图的质量不是很好,网上找不到更好的图片了,对付看吧。

电位器的两端,1脚和3脚之间接上电源,本设计中相当于接上3.3V和GND。

摆动PS2游戏摇杆相当于上图中可动臂转动,随着接触刷改变接触位置,滑动变阻器(电位器)的引脚2处的输出电压即发生变化。

X,Y轴为模拟输入信号而Z轴是数字输入信号,因此,x和y端口连接到ADC引脚,而z端口连接到数字端口。

所以我们一共需要使用STM32的三个GPIO引脚,其中两个模拟信号输入引脚和一个数字信号输入引脚。

PS2游戏摇杆正常状态(不受力状态)检测电压常态时为1.65V附近,最大值3.3V,最小值0V,用STM32自带ADC模数转换模块的两个通道分别检测电压值的变化就可以知道摇杆指向的位置了。

由于STM32单片机的ADC是12位精度,AD值在[0, 4095]之间,理论上X、Y轴输出中间值2048,但由于电位器及结构差异,原点值会有偏差,有些应用中需要进行校准。

程序中最主要的部分是按键扫描函数,我们分别采集摇杆的X轴和Y轴模拟输入,通过测试我们选取模拟量ADC值中的0~100、1900~2150、4850~4095三个区间,作为按键的三个状态,当扭动摇杆采集回的数据小于100或者大于4850,就认为这个轴向上进行了按键触发。

使用变量VRx(VRy)保存按键按下状态,只有当模拟量再次进入小于100或者大于4850时才会再次触发一次按键返回。

由上可知,要获得按键状态的难点就是如何获得VRx、VRy引脚的ADC值。

STM32自带ADC功能,查看芯片手册,手册上引脚中带有如下标识的引脚即有ADC功能。

对照下面的图:

我们可知,PC0、PC1、PC2三个引脚可以选择ADC1、ADC2或ADC3任意一个,初始化选中的ADC,然后获取通道11的值,即可得到PC1引脚的模拟量值,获取通道12的值,即可得到PC2引脚的模拟量值。

我们下面实现的代码选用的是ADC1。

硬件连接
按键摇杆端 STM32端
GND GND
+5V +3.3V
VRx PC1
VRy PC2
SW PC0
ADC功能实现步骤:

1. ADC功能初始化

void  Adc_Init(void)
{  
 ADC_InitTypeDef ADC_InitStructure; 
 GPIO_InitTypeDef GPIO_InitStructure;

 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC |RCC_APB2Periph_ADC1 , ENABLE );   //使能ADC1通道时钟
 
 RCC_ADCCLKConfig(RCC_PCLK2_Div6);   //设置ADC分频因子6 72M/6=12,ADC最大时间不能超过14M

 //PC1 PC2
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_2;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;  //模拟输入引脚
 GPIO_Init(GPIOC, &GPIO_InitStructure);

 ADC_DeInit(ADC1);  //复位ADC1,将外设 ADC1 的全部寄存器重设为缺省值

 ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC工作模式:ADC1和ADC2工作在独立模式
 ADC_InitStructure.ADC_ScanConvMode = DISABLE; //模数转换工作在单通道模式
 ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //模数转换工作在单次转换模式
 ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //转换由软件而不是外部触发启动
 ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //ADC数据右对齐
 ADC_InitStructure.ADC_NbrOfChannel = 1//顺序进行规则转换的ADC通道的数目
 ADC_Init(ADC1, &ADC_InitStructure); //根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器   
  
 ADC_Cmd(ADC1, ENABLE); //使能指定的ADC1
 
 ADC_ResetCalibration(ADC1); //使能复位校准  
  
 while(ADC_GetResetCalibrationStatus(ADC1)); //等待复位校准结束
 
 ADC_StartCalibration(ADC1);  //开启AD校准
 
 while(ADC_GetCalibrationStatus(ADC1));  //等待校准结束
}

2. 获取ADC值函数

//获得ADC值
//ch:通道值 0~3
u16 Get_Adc(u8 ch)   
{
   //设置指定ADC的规则组通道,一个序列,采样时间
 ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 ); //ADC1,ADC通道,采样时间为239.5周期          
  
 ADC_SoftwareStartConvCmd(ADC1, ENABLE);  //使能指定的ADC1的软件转换启动功能 
  
 while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束

 return ADC_GetConversionValue(ADC1); //返回最近一次ADC1规则组的转换结果
}

u16 Get_Adc_Average(u8 ch,u8 times)
{
 u32 temp_val=0;
 u8 t;
 for(t=0;t<times;t++)
 {
  temp_val+=Get_Adc(ch);
  delay_ms(5);
 }
 return temp_val/times;

3. main函数,while循环中,循环获得VRx、VRy引脚的电压值,并打印输出

#include "stm32f10x.h"  
#include "delay.h"
#include "usart.h" 

#include "common.h"

#include "adc.h"
#include "key.h"

int main(void)  

 int times = 0
 u8 i = 0;
 u8 key=0XFF;
 u16 VRx,VRy;
 u8 dtbuf[50];     
 
 //初始化
 //延时函数初始化   
 delay_init();
    
 uart_init(115200);    //串口1:Debug,初始化为115200 
 
 Adc_Init();
 KEY_Init();
 
 printf("System Init OK ...\r\n");
 
 while(1
 {
  
  times++; 
  
  VRx = Get_Adc_Average(11,10); //PC1 
  
  VRy = Get_Adc_Average(12,10); //PC2
  
  if((VRx >= 2100 || VRx <= 1900) || (VRy >= 2100 || VRy <= 1900))
  {
   sprintf(dtbuf, "VRx:%04d--VRy:%04d \r\n", VRx,VRy);   
   printf(dtbuf);
  }  

  key = KEY_Scan(0);
  
  if(key)   
  { 
   switch(key)    
   { 
    case KEY_SW_PRES:
     {     
      printf("KEY_SW_PRES...\r\n");
     }
     break;     
    default:
     break;
   }   
   
  }  
  
    delay_ms(10); 
 }  
}

结果展示

由上我们可以看出,上下左右改变摇杆的位置,XY轴的AD值是变化的,按下SW按键,也能正常检测出按下的状态,所以一个PS2按键传感器可以当做多个按键使用。


21ic电子网 即时传播最新电子科技信息,汇聚业界精英精彩视点。
评论 (0)
  • 2025年全球人形机器人产业迎来爆发式增长,政策与资本双重推力下,谷歌旗下波士顿动力、比亚迪等跨国企业与本土龙头争相入局,产业基金与风险投资持续加码。仅2025年上半年,中国机器人领域就完成42笔战略融资,累计金额突破45亿元,沪深两市机器人指数年内涨幅达68%,印证了资本市场对智能终端革命的强烈预期。值得关注的是,国家发展改革委联合工信部发布《人形机器人创新发展行动计划》,明确将仿生感知系统、AI决策中枢等十大核心技术纳入"十四五"国家重大专项,并设立500亿元产业引导基金。技术突破方面,本土
    电子资讯报 2025-04-27 17:08 217浏览
  • 一、智能家居的痛点与创新机遇随着城市化进程加速,现代家庭正面临两大核心挑战:情感陪伴缺失:超60%的双职工家庭存在“亲子陪伴真空期”,儿童独自居家场景增加;操作复杂度攀升:智能设备功能迭代导致用户学习成本陡增,超40%用户因操作困难放弃高阶功能。而WTR096-16S录音语音芯片方案,通过“语音交互+智能录音”双核驱动,不仅解决设备易用性问题,更构建起家庭成员间的全天候情感纽带。二、WTR096-16S方案的核心技术突破1. 高保真语音交互系统动态情绪语音库:支持8种语气模板(温柔提醒/紧急告警
    广州唯创电子 2025-04-28 09:24 106浏览
  • 探针台作为半导体制造与测试的核心设备,通过精密定位与多环境适配能力,支撑芯片研发、生产及验证全流程。以下是其关键应用领域与技术特性:一、核心功能支撑1.‌电性能测试与分析‌l 在晶圆切割前,探针台直接接触芯片电极,测量阈值电压、漏电流、跨导等200余项参数,用于评估良品率及优化工艺设计。l 支持单晶体管I-V曲线测量,定位栅极氧化层厚度偏差(精度达0.2nm),为器件性能分析提供数据基础。2.‌纳米级定位与测量‌l 定位精度达±0.1μm,满足5nm及以下制程芯片的
    锦正茂科技 2025-04-27 13:09 138浏览
  •   北京华盛恒辉电磁环境适应性测试系统是针对复杂电磁环境进行仿真、测试与评估的关键设备,以下从系统功能、技术架构、应用场景、核心优势、发展趋势五个维度展开全面解析:   应用案例   目前,已有多个电磁环境适应性测试系统在实际应用中取得了显著成效。例如,北京华盛恒辉和北京五木恒润电磁环境适应性测试系统。这些成功案例为电磁环境适应性测试系统的推广和应用提供了有力支持。   一、系统功能   复杂电磁环境构建   全生命周期测试能力   实时监测与反馈   二、技术架构   模块化设
    华盛恒辉l58ll334744 2025-04-26 17:21 195浏览
  • 在电子电路设计和调试中,晶振为电路提供稳定的时钟信号。我们可能会遇到晶振有电压,但不起振,从而导致整个电路无法正常工作的情况。今天凯擎小妹聊一下可能的原因和解决方案。1. 误区解析在硬件调试中,许多工程师在测量晶振时发现两端都有电压,例如1.6V,但没有明显的压差,第一反应可能是怀疑短路。晶振电路本质上是一个交流振荡电路。当晶振未起振时,两端会静止在一个中间电位,通常接近电源电压的一半。万用表测得的是稳定的直流电压,因此没有压差。这种情况一般是:晶振没起振,并不是短路。2. 如何判断真
    koan-xtal 2025-04-28 05:09 106浏览
  • 速卖通,作为阿里巴巴集团旗下的跨境电商平台,于2010年横空出世,彼时正值全球电商市场蓬勃发展,互联网的普及让跨境购物的需求日益增长,速卖通顺势而为,迅速吸引了全球目光。它以“让天下没有难做的生意”为使命,致力于打破国界限制,搭建起中国商家与全球消费者之间的桥梁。在其发展的黄金时期,速卖通取得的成绩令人瞩目。在欧洲市场,速卖通一度成为第一大电商平台。根据第三方机构《欧洲跨境商务》的评选,速卖通凭借出色的服务和消费者口碑,在“欧洲十大跨境电商平台”中脱颖而出,力压来自美国的亚马逊和eBay等电商巨
    用户1742991715177 2025-04-26 20:23 162浏览
  • 晶振在使用过程中可能会受到污染,导致性能下降。可是污染物是怎么进入晶振内部的?如何检测晶振内部污染物?我可不可以使用超声波清洗?今天KOAN凯擎小妹将逐一解答。1. 污染物来源a. 制造过程:生产环境不洁净或封装密封不严,可能导致灰尘和杂质进入晶振。b. 使用环境:高湿度、温度变化、化学物质和机械应力可能导致污染物渗入。c. 储存不当:不良的储存环境和不合适的包装材料可能引发化学物质迁移。建议储存湿度维持相对湿度在30%至75%的范围内,有助于避免湿度对晶振的不利影响。避免雨淋或阳光直射。d.
    koan-xtal 2025-04-28 06:11 89浏览
  • 探针台作为高精度测试设备,在光电行业的关键器件研发、性能测试及量产质量控制中发挥核心作用,主要涵盖以下应用场景与技术特性:一、光电元件性能测试1.‌光电器件基础参数测量‌l 用于LED、光电探测器、激光器等元件的电流-电压(I-V)特性、光功率、响应速度等参数测试,支撑光通信、显示技术的器件选型与性能优化。l 支持高频信号测试(如40GHz以上射频参数),满足高速光调制器、光子集成电路(PIC)的带宽与信号完整性验证需求。2.‌光响应特性分析‌l 通过电光转换效率测
    锦正茂科技 2025-04-27 13:19 112浏览
  •     今天,纯电动汽车大跃进牵引着对汽车电气低压的需求,新需求是48V。车要更轻,料要堆满。车身电子系统(电子座舱)从分布改成集中(域控),电气上就是要把“比12V系统更多的能量,送到比12V系统数量更少的ECU去”,所以,电源必须提高电压,缩小线径。另一方面,用比传统12V,24V更高的电压,有利于让电感类元件(螺线管,电机)用更细的铜线,缩小体积去替代传统机械,扩大整车电气化的边界。在电缆、认证行业60V标准之下,48V是一个合理的电压。有关汽车电气低压,另见协议标准第
    电子知识打边炉 2025-04-27 16:24 162浏览
  •  集成电路封装测试是确保芯片性能与可靠性的核心环节,主要包括‌晶圆级测试(CP测试)‌和‌封装后测试(FT测试)‌两大阶段,流程如下:一、晶圆级测试(CP测试)1.‌测试目的‌:在晶圆切割前筛选出功能缺陷或性能不达标的晶粒(Die),避免后续封装环节的资源浪费,显著降低制造成本。2.‌核心设备与操作‌l ‌探针台(Prober)‌:通过高精度移动平台将探针与晶粒的Pad jing准接触,实现电气连接。l ‌ATE测试机‌:提供测试电源、信号输入及功能向量,接收晶粒反
    锦正茂科技 2025-04-27 13:37 161浏览
我要评论
0
2
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦