概述
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');
}
}
我们的遥控器控制就是这样了,还是很简单的,到这里校内赛的学习和设计过程就结束了。学无止境啊!!!
最后
以上就是优雅曲奇为你收集整理的STM32F103校内赛-摇杆遥控器 STM32F103摇杆和按键学习的全部内容,希望文章能够帮你解决STM32F103校内赛-摇杆遥控器 STM32F103摇杆和按键学习所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复