题目要求很明显,一如既往,分为基础题和发挥部分,额,发挥部分还是有点水平的,基础部分基本上可以拿满
实际上电磁炮部分不需要自己设计,网上有很多成品,不贵,可以直接买回来,如果不嫌麻烦,可以自己做,电路也没什么技术水平,为了美观的话,还是考虑集成一波,画个板子,建议将炮管独立,因为还有云台部分
这就是为何要将炮管独立的原因,因为要随云台运转,对了云台也直接买,简单的舵机控制问题,总结起来发射部分基础题需要以下器件:
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的直径!嗯哼???
看这红圈儿的要求,怎么感觉都是一种铺垫,疯狂暗示啊!!!
这张图基本已经够用了,当200cm<=d<=300cm的时候,根据误差要求进行细分的话,应该是1号圆和2号圆的交界符合200<=d<=250的所有靶心情况,同样3号圆和2号圆交接的地方符合250<=d<=300的所有靶心情况,嗯,分析结束
综合前述的能量不变情况,实际上,这么大的误差距离,只要测好一个靠谱的倾角,基本上第二题也可以完结了,得分!
基本题目第三题,貌似就是第二题的增强,只是多了一个水平转动,还是输入的,注意,基本要求规定靶心位置在200cm~300cm,不然需要划分更多的圆形相交区域!
根据基本第二题的方式,画圆标定,由于按照环数积分,至少不能脱靶,为了准度同时为了便于标定计算,取直径40cm画圆标定,原因有二,其一,直径标定越小,原则上脱靶可能性越低,因为靶子半径30cm,其二,不易过小,因为准度本身就不确定,所以择优选取,40cm为佳
我取六个小圆,半径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:唯我超电磁炮永世长存!