一、准备工作:
有关CUBEMX的初始化配置,参见我的另一篇blog:【STM32+HAL】CUBEMX初始化配置
有关定时器触发ADC模式配置,详见【STM32+HAL】ADC采集波形实现
二、所用工具:
1、芯片: STM32F407VET6
2、CUBEMX
3、IDE: MDK-Keil软件
4、STM32F4xxHAL库
三、实现功能:
读取x,y轴的偏移量(模拟量),以及z轴(数字量——按下为低电平)
" 特别提醒,通常我们买来的双轴按键PS2摇杆,上图中的R1位置的电阻是没有焊上的,实际该电阻是一个上拉电阻,如果我们没有焊的话是无法进行Z轴检测的。如果我们需要进行Z轴检测,我们需要在R1的位置焊上一个10KΩ电阻。”
四、HAL库配置:
1、ADC1开启
ADC1-IN1为x轴
3、ADC2开启
ADC2-IN2为轴
3、中断配置
adc可不开启中断,亲测有效
4、gpio配置
至此,HAL库配置完毕
五、keil填写代码:
1、初始化
#include "stdio.h"
int fputc(int ch, FILE *f)
{
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
return ch;
}
int fgetc(FILE *f)
{
uint8_t ch = 0;
HAL_UART_Receive(&huart1, &ch, 1, 0xffff);
return ch;
}
#define SAMP 20
uint16_t adc1[SAMP]={0},adc2[SAMP]={0};
printf("Hello World\r\n");
HAL_Delay(300);
HAL_ADC_Start_DMA(&hadc1,(uint32_t *)adc1,SAMP);
HAL_ADC_Start_DMA(&hadc2,(uint32_t *)adc2,SAMP);
2、串口打印x,y轴坐标值
for(int i=0;i<20;i++)
printf("%d,%d\r\n",adc1[i],adc2[i]);
3、检测z轴是否按下
if(HAL_GPIO_ReadPin(Z_AXIS_GPIO_Port,Z_AXIS_Pin) == GPIO_PIN_SET)
HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_SET);
else
HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_RESET);
六、巨人之肩
【STM32外设系列】双轴按键PS2摇杆
七、源码提供
资源【STM32+HAL】三轴按键PS2摇杆
八、结语
本人能力有限,代码未必是最优解,若有可改进之处望在评论区留言,采纳有赏~