2019年TI杯“电磁炮”题我的方案

题目要求很明显,一如既往,分为基础题和发挥部分,额,发挥部分还是有点水平的,基础部分基本上可以拿满

实际上电磁炮部分不需要自己设计,网上有很多成品,不贵,可以直接买回来,如果不嫌麻烦,可以自己做,电路也没什么技术水平,为了美观的话,还是考虑集成一波,画个板子,建议将炮管独立,因为还有云台部分

这就是为何要将炮管独立的原因,因为要随云台运转,对了云台也直接买,简单的舵机控制问题,总结起来发射部分基础题需要以下器件:
1.电磁炮
2.继电器
3.云台
4.Adruino控制器
5.稳压供电源CC30V(电磁炮部分)
6.稳压供电源CC05-03V(控制器部分)

电磁炮部分独立供电的原因是,担心容性储能元件的快速充放电影响控制电路的稳定,反正有继电器,不影响

设计分为以下的几个大部分进行完成:

云台转动驱动

实际上就是写一个函数,两个参数,这两个参数就是舵机的转角是多少(先矫正好舵机的0°角)并以此为参考,即炮台的正位置,下方舵机的-90°即最左侧,+90°即最右侧,上方舵机实际上类似,-90°对应水平角朝下,+90°则朝上,Arduino的两个端口即可完成驱动,如果STM32那么资源更加充足

void Server_ctrl(int angel_1,int angel_2)
{
  int pwm1,pwm2;
  ...
  ...
  TIM_SetCompare2(TIM3,pwm1);
  ...
}

详细代码不解释,简单的舵机控制,不过今天还真长见识了,你知道舵机为啥取50Hz的频率么?参考在此!(上述驱动代码需要注意的是占空比和角度间的换算,不过良心的舵机商家应该已经附赠换算公式了,自制一个码表也行,数据量也很有限,之所以提一下是因为需要写入设计报告的)

电磁炮发射硬件和软件部分

发射其实不难,因为只要充电完毕,本就可以一键发射,但是,由于设计的要求,采用继电器控制通断,借助控制器的电平高低,通断电路,控制发射,也需要写成单独的函数,不过这个基本上是简单的IO口控制问题了

void Gun_shot(int true)
{
  if(true==1)
  {
    GPIO_SetBits(GUN_GPIO_PORT,GUN_GPIO_PIN);
  }
  else
  {
    ...
    ...
  }
}

需要注意的是,发射后若干时间(1s足矣)即关闭继电器,让电磁炮蓄能,以备再次发射,保留手动发射按钮,即完成基本要求第一项,得分!

键盘输入与定距离发射

实际上键盘输入不需要说了,有现成的驱动函数,键入d值再确定即可,问题是控制器读入这个值之后,怎么控制电磁炮运转呢?首先应当清楚的是,我们不可能通过调节电磁炮的充能多少来控制距离,这不现实,至少我是这么认为的,那么只有另外一个方式了,还有上端舵机可以调节倾角!有一点可以肯定的是,每次充能都是满电,原则上可以认为,每次弹珠弹射的落点,在竖直倾角不变的情况下是大致差不了多少的!靶子还有30cm的半径,或者说是60cm的直径!嗯哼???

看这红圈儿的要求,怎么感觉都是一种铺垫疯狂暗示啊!!!

smacap_Bright

这张图基本已经够用了,当200cm<=d<=300cm的时候,根据误差要求进行细分的话,应该是1号圆和2号圆的交界符合200<=d<=250的所有靶心情况,同样3号圆和2号圆交接的地方符合250<=d<=300的所有靶心情况,嗯,分析结束

综合前述的能量不变情况,实际上,这么大的误差距离,只要测好一个靠谱的倾角,基本上第二题也可以完结了,得分!

基本题目第三题,貌似就是第二题的增强,只是多了一个水平转动,还是输入的,注意,基本要求规定靶心位置在200cm~300cm,不然需要划分更多的圆形相交区域!

根据基本第二题的方式,画圆标定,由于按照环数积分,至少不能脱靶,为了准度同时为了便于标定计算,取直径40cm画圆标定,原因有二,其一,直径标定越小,原则上脱靶可能性越低,因为靶子半径30cm,其二,不易过小,因为准度本身就不确定,所以择优选取,40cm为佳

smacap_Bright

我取六个小圆,半径20cm,保证不会脱靶,同时一定程度上提高精度,剩余的就是按照标定,根据不同的d距离,调整大炮倾角,相较于基本第二题,划分显然更加详细

200<=d<=220
220<=d<=240
240<=d<=260
260<=d<=280
280<=d<=300
单位:cm

依据距离范围,选定不同的倾角,至于 α 则是手动键入,驱动前述已经完成,距离d则是此次关键了,也在上面的分析里完成,得分!

总体的基本部分控制代码综合简述:

void main()
{
  /*使用拨码开关选择*/
  int Booma_choose;
  while(1)
  {
    d = 0;
    α = 0;
    Booma_choose = Get_choice();
    if(Booma_choose==1&&Key_ON)
    {
      /*基本题1*/
      Delay_3s();
      Gun_shot(1);
      Delay_3s();
      Reset_Gun_Mode();
    }
    if(Booma_choose==2)
    {
      /*基本题2*/
      while(!Get_man());
      while(!Key_ON);
      if(200<=d&&d<=250)
      {
        Server_ctrl(0,45);
        Delay_3s();
        Gun_shot(1);
        Delay_3s();
        Reset_Gun_Mode();
      }
      if(250<=d&&d<=300)
      {
        Server_ctrl(0,30);
        Delay_3s();
        Gun_shot(1);
        Delay_3s();
        Reset_Gun_Mode();
      }

    }

    if(Booma_choose==3)
    {
      /*基本题3*/
      while(!Get_man());
      while(!Key_ON);
      
      Server_ctrl(α,0);
      Delay_3s();
      if(200<=d&&d<=220)
      {
        Server_ctrl(0,60);
        Delay_3s();
        Gun_shot(1);
        Delay_3s();
        Reset_Gun_Mode();
      }
      ...
      ...


      ...
      if(280<=d&&d<=300)
      {
        Server_ctrl(0,30);
        Delay_3s();
        Gun_shot(1);
        Delay_3s();
        Reset_Gun_Mode();
      }

    }


  }
}

结果???

完成题目的所有基本要求,主程序控制代码待优化!

Me:唯我超电磁炮永世长存!

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注


皖ICP备2021003932号
召唤伊斯特瓦尔