一、适用场景
适用场景:遥控小车/机器人方向控制、游戏手柄原型、云台/舵机控制、模拟摇臂与人机交互输入、示教示例(比例输入)、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);

 六、讲解视频

https://www.bilibili.com/video/BV1KtWcz4Ehn/?spm_id_from=333.1387.homepage.video_card.click&vd_source=f7dfe1b14f260b9cc3a146d2dbfd0719

https://www.bilibili.com/video/BV1mgWPzvEDa/?spm_id_from=333.1387.homepage.video_card.click&vd_source=f7dfe1b14f260b9cc3a146d2dbfd0719

https://www.bilibili.com/video/BV1tgWPzvEjM/?spm_id_from=333.1387.homepage.video_card.click&vd_source=f7dfe1b14f260b9cc3a146d2dbfd0719

Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐