2019电赛总结
一开始,我们队的leader就决定做控制类,今年电赛这几天还是有点累的, 三个晚上都直接趴在桌子上睡的,事实证明在桌子上也是可以睡着的~很多时候都是强睁着眼睛的,他们不休息,我几乎也都是陪着,作为一个集体,就算是能力达不到,精神上也是要支持的!我担任的工作是论文,以及各种琐事,在清单出来之后,我们准备了很多东西,然后我就挑了简单的云台,调试完成,赛前前一夜,才开始准备按键程序,然后也尴尬地没调出来。<-----基本功问题
总得来说能够实现的部分还是比较顺利,出现的问题基本都能解决,因为东西之前没有准备齐,时间问题,我们只完成了基础部分~~下面说几点遇到的问题
电磁炮电路——初射
升压电路部分,把12v电压升到220v/110v,(内含整流桥),后级是一个四个耐压值250v,容值680μf的电容串联,在电容的两个端分别放了一个继电器,一个继电器控制充电与否,一个控制放电与否,这两个继电器连接到单片机上面。这个方案,leader很快想到,然后验证下来也没有问题。
硬件调试问题
第一个程序是我事先写好了舵机控制云台的程序,用的mini板测试,初次把程序烧到我们比赛用的板子的时候,遇到的第一个问题是下载失误,极性接反了,后来用示波器测量引脚没有波形,又换了几个定时器通道,都是有波形的,所以后来发现了可能是板子坏了,换了板子之后,再次测试之前的程序,有波形了,出现的问题又是带不动,后来,通过在开发板上的测试,通过,知道问题出现在硬件上,12v的直流电源通过7805降的5v电压有问题,(产品质量问题),后来换了一个7805,测试通过。讲真,这个问题很难被发现哒。
电磁炮的最后搭建
线圈一定要多一点,炮弹塞入炮口的时候在线圈的下半部分,因为要加速到线圈的中间,然后射出去。
stm32按键程序
这个程序我并没能写出来,最后依然是大佬赶出来的~~
#include "sys.h"
#include "delay.h"
void KeyBoard_Init()
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_10MHz;
GPIO_Init(GPIOA,&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPD;
GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_SetBits(GPIOA, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3);
GPIO_ResetBits(GPIOA, GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7);
}
u8 Read_KeyValue(void)
{
u8 KeyValue=0;
if((GPIO_ReadInputData(GPIOA)&0xff)!=0x0f)
{
delay_ms(10);
if((GPIO_ReadInputData(GPIOA)&0xff)!=0x0f)
{
GPIO_SetBits(GPIOA, GPIO_Pin_0);
GPIO_ResetBits(GPIOA, GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3);
switch(GPIO_ReadInputData(GPIOA)&0xff)
{
case 0x11: KeyValue = 1; break;
case 0x21: KeyValue = 5; break;
case 0x41: KeyValue = 9; break;
case 0x81: KeyValue = 13;break;
}
GPIO_SetBits(GPIOA, GPIO_Pin_1);
GPIO_ResetBits(GPIOA, GPIO_Pin_0 | GPIO_Pin_2 | GPIO_Pin_3);
switch(GPIO_ReadInputData(GPIOA)&0xff)
{
case 0x12: KeyValue = 2; break;
case 0x22: KeyValue = 6; break;
case 0x42: KeyValue = 10;break;
case 0x82: KeyValue = 14;break;
}
GPIO_SetBits(GPIOA, GPIO_Pin_2);
GPIO_ResetBits(GPIOA, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_3);
switch(GPIO_ReadInputData(GPIOA)&0xff)
{
case 0x14: KeyValue = 3; break;
case 0x24: KeyValue = 7; break;
case 0x44: KeyValue = 11;break;
case 0x84: KeyValue = 15;break;
}
GPIO_SetBits(GPIOA, GPIO_Pin_3);
GPIO_ResetBits(GPIOA, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2);
switch(GPIO_ReadInputData(GPIOA)&0xff)
{
case 0x18: KeyValue = 4; break;
case 0x28: KeyValue = 8; break;
case 0x48: KeyValue = 12;break;
case 0x88: KeyValue = 16;break;
}
GPIO_SetBits(GPIOA, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3);
GPIO_ResetBits(GPIOA, GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7);
// while((GPIO_ReadInputData(GPIOA)&0xff)!=0x0f);
return KeyValue;
}
}
return 0;
}
这个是不能放在定时器中断里面,不然会出现死循环
其他
然后补充一下多级菜单就可以了,这里及其考验逻辑能力,基本逻辑控制能力很重要!!!