STM32F103校内赛-摇杆遥控器

 STM32F103摇杆和按键学习

       现在回忆我暑假回家自学STM32F103摇杆,只能说当时的我简直菜的离谱,我现在回看我自己找的摇杆程序,理解个差不多,但是有一点我很难受,就是我那时候竟然能忍受很乱的程序界面,我觉得不管程序是好是坏,都应该整齐,让人看到后想看,我觉得这不是强迫症,这真的需要一个很好的习惯,我个人认为一个整齐的程序,可以在看或者写程序的时候有一定的帮助,潜移默化的帮助。程序整齐我会一直坚持下去。下面我回顾一下我但是自学的摇杆程序吧。

        首先,摇杆如何控制,它有X轴,Y轴,但是STM32F1怎样获取摇杆每个轴上的值呢?肯定要借助STM32的ADC(模数转换),和电磁巡线是一个道理,都需要采值和滤波,这样基础的就解决了。对了,摇杆也是可以按的,但是我没看懂程序,我的程序是我在网上自己找的,然后拿来有用,反正当时觉得有效果,就啥都不管了,现在看来,我但是看不懂的那部分主要就是摇杆按下这一块,压根不需要。那除了摇杆的按键这部分程序不需要,那摇杆就很简单了。正是我没有用摇杆按键的程序,我也不知道它的效果咋样,我就不写它了,我不保证那块代码是可以能用的。

        main.c函数里面把该初始化的函数初始化后,在while(1)里加入摇杆采值的函数、摇杆每个固定范围的标识符函数、遥控器自身按键上执行的按键程序,让它们不断循环。说一下摇杆每个固定范围标识符函数,但是摇杆ADC值范围分割了一下,我当时只是把X,Y轴分段了,中间值一个范围,然后每个轴的正负方向在极限值分割了两下啊,这一每个轴除了中间状态,就有三个档位了,每个档位都要设置一个字符,摇杆移动到一个范围都相当于按下一个按键,就有一个字符被发送,这个函数就是酱紫。

        ADC函数我在自动车电磁巡线就说过了,一模一样的。直接上摇杆的程序吧。

        里面还加入了串口传输数据哦。

u16 VRx,VRy;
void yg_init()
{
	VRx = Get_ADC_Average(1); //PA1 
	VRy = Get_ADC_Average(2); //PA2
}  
//摇杆范围分割
int Flag ;  //标志位Flag
void key_run(void)
{
	if(VRx>=3900 && (VRy >=1700  && VRy <= 2300))  //全速900向前
	{
			Flag = 1;
			USART_SendData(USART1,'1');	
	}
	if((VRx >=3500 && VRx<3900) && (VRy >=1700  && VRy <= 2300))  //600向前
	{
			Flag = 1;
			USART_SendData(USART1,'2');
	}
	if((VRx >2300 && VRx <3500) && (VRy >=1700  && VRy <= 2300))  //低速350向前
	{
			Flag = 1;
			USART_SendData(USART1,'3');
	}
	if((VRx >= 600 && VRx < 1700) && (VRy >=1700  && VRy <= 2300))  //低速350向后
	{
			Flag = 1;
			USART_SendData(USART1,'4');	
	}
	if((VRx > 100&& VRx < 600) && (VRy >=1700  && VRy <= 2300))  //600向后
	{
			Flag = 1;
			USART_SendData(USART1,'5');
	}
	if(VRx <= 100 && (VRy >=1700  && VRy <= 2300))  //全速向后
	{
			Flag = 1;
			USART_SendData(USART1,'6');	
	}
	
	if((VRx >=1700 && VRx <= 2300)&& VRy>=3900)  //原地左转 左轮倒转800 右轮正转800
	{
			Flag = 1;
			USART_SendData(USART1,'a');
	}
	if((VRx >=1700 && VRx <= 2300)&& (VRy>3300 && VRy<3900))  //原地左转 左轮倒转600 右轮正转600
	{
			Flag = 1;
			USART_SendData(USART1,'b');
	}
	if((VRx >=1700 && VRx <= 2300)&& (VRy>2300 && VRy<=3300))  //原地左转 左轮倒转300 右轮正转300
	{
			Flag = 1;
			USART_SendData(USART1,'c');
	}
	if((VRx >=1700 && VRx <= 2300)&& (VRy>800 && VRy<1700))  //原地右转 左轮正转300 右轮倒转300
	{
			Flag = 1;
			USART_SendData(USART1,'d');
	}
	if((VRx >=1700 && VRx <= 2300)&& (VRy>100 && VRy<=800))  //原地右转 左轮正转600 右轮倒转600
	{
			Flag = 1;
			USART_SendData(USART1,'e');
	}
	if((VRx >=1700 && VRx <= 2300)&& VRy<=100)  //原地右转 右轮倒转800 左轮正转800
	{
			Flag = 1;
			USART_SendData(USART1,'f');
	}
	
	if((VRx >=1700 && VRx <= 2300)&& (VRy >= 1700 && VRy <= 2300))  //停止 摇杆处于中间状态
	{
			Flag = 1;
			USART_SendData(USART1,'0');                               
	}
}

        下面是遥控器的按键程序,我只实例一个按键的程序了!

        对了,按键使用时是要消抖的,需要加10ms的延时,摇杆是不需要的,在以后的项目里很多都需要消抖的,比如串口传输数据等等。

void key_init(void)
{    
	GPIO_InitTypeDef GPIO_InitStructure;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO ,ENABLE);//GPIOA

	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
}
int flag ;
void   key_run1(void)
{
	if(KEY3== 0)
	{
		delay_ms(10);
		if(KEY3== 0)
		{
			flag = 1;
			USART_SendData(USART1,'l');
		}
	}

	if(KEY3 == 1)
	{	
		flag = 0;
		USART_SendData(USART1,'0');
	}
}

        我们的遥控器控制就是这样了,还是很简单的,到这里校内赛的学习和设计过程就结束了。学无止境啊!!!

  • 5
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值