基于STM32模擬電磁炮設(shè)計(jì)_STM32F103ZET6(程序+原理圖+PCB+論文報(bào)告)
原理圖:Altium Designer
程序編譯器:keil 5
編程語(yǔ)言:C語(yǔ)言
編號(hào)C0029
設(shè)計(jì)說(shuō)明:
該系統(tǒng)方案主要由 STM32f103zet6單片機(jī)最小系統(tǒng)控制電路、儲(chǔ)能電路、電壓檢測(cè)電路、電磁炮發(fā)射電路、舵機(jī)云臺(tái)、TFT顯示屏、虛擬鍵盤等部分組成。
利用電磁感應(yīng)原理產(chǎn)生電磁場(chǎng)給彈丸一個(gè)磁場(chǎng)力,由液晶屏上的虛擬按鍵手動(dòng)輸入靶中心與定標(biāo)點(diǎn)的距離 及與中心軸線的偏離角度,驅(qū)動(dòng)舵機(jī)云臺(tái)調(diào)節(jié)電磁炮仰角及水平方向,由STM32f103zet6控制器計(jì)算彈道,控制器實(shí)時(shí)測(cè)量1500uf 電容充電電壓,待電容充電達(dá)到計(jì)算電壓后控制云臺(tái)到達(dá)指定位置,使電容對(duì)電磁炮線圈瞬間放電,產(chǎn)生強(qiáng)大的磁場(chǎng),發(fā)射彈丸命中目標(biāo)。同時(shí)可以在液晶屏顯示靶子中心坐標(biāo)位置、仰角信息及電容電壓等信息。
原理圖:
源程序:
#include “sys.h”
#include “delay.h”
#include “stm32f10x_adc.h”
#include “stm32f10x_rcc.h”
#include “port_init.h”
#include “key.h”
#include “lcd.h”
#include “usart.h”
#include “timer_pwm.h”
#include “24cxx.h”
#include “adc.h”
#include “touch.h”
void Delay(u32 count)
{
u32 i=0;
for(;i<count;i++);
}
//清空屏幕并在右上角顯示"RST"
void Load_Drow_Dialog(void)
{
LCD_Clear(WHITE); //清屏
POINT_COLOR=BLUE; //設(shè)置字體為藍(lán)色
LCD_ShowString(lcddev.width-24,0,200,16,16,“ok”);//顯示清屏區(qū)域
POINT_COLOR=RED; //設(shè)置畫筆藍(lán)色
}
//兩個(gè)數(shù)之差的絕對(duì)值
//x1,x2:需取差值的兩個(gè)數(shù)
//返回值:|x1-x2|
u16 my_abs(u16 x1,u16 x2)
{
if(x1>x2)return x1-x2;
else return x2-x1;
}
//5個(gè)觸控點(diǎn)的顏色
const u16 POINT_COLOR_TBL[CT_MAX_TOUCH]={RED,GREEN,BLUE,BROWN,GRED};
//電阻觸摸屏測(cè)試函數(shù)
void rtp_test(void)
{
u8 key;
u8 i=0;
while(1)
{
key=KEY_Scan(0);
tp_dev.scan(0);
if(tp_dev.sta&TP_PRES_DOWN) //觸摸屏被按下
{
if(tp_dev.x[0]<lcddev.width&&tp_dev.y[0]<lcddev.height)
{
if(tp_dev.x[0]>(lcddev.width-24)&&tp_dev.y[0]<16)Load_Drow_Dialog();//清除
else TP_Draw_Big_Point(tp_dev.x[0],tp_dev.y[0],RED); //畫圖
}
}else delay_ms(10); //沒(méi)有按鍵按下的時(shí)候
if(keyKEY0_PRES) //KEY0按下,則執(zhí)行校準(zhǔn)程序
{
LCD_Clear(WHITE);//清屏
TP_Adjust(); //屏幕校準(zhǔn)
Load_Drow_Dialog();
}
i++;
if(i%200)LED1=!LED1;
}
}
//主函數(shù)
int main(void)
{
u16 led0pwmval=50;
u8 dir=1;
delay_init(); //延時(shí)函數(shù)初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設(shè)置中斷優(yōu)先級(jí)分組為組2:2位搶占優(yōu)先級(jí),2位響應(yīng)優(yōu)先級(jí)
uart_init(115200); //串口初始化為115200
delay_ms(300) ; //上電緩沖
Adc_Init(); //ADC初始化
delay_ms(300) ; //上電緩沖
port_Init(); //LED端口初始化
delay_ms(300) ; //上電緩沖
LCD_Init(); //液晶屏初始化
delay_ms(300) ; //上電緩沖
KEY_Init();
TIM5_PWM_Init(1999,719); //不分頻。PWM頻率=100000/2000=50hz 20ms分成2000分2ms占200份 200/180
// protect=0; //斷開(kāi)升壓電源
tp_dev.init(); //觸摸屏初始化
delay_ms(300) ; //上電緩沖
POINT_COLOR=BLUE;//設(shè)置字體為紅色 simulated electromagnetic curved cannon
delay_ms(300) ; //上電緩沖
LCD_ShowString(0,0,240,16,16,“Anyang Institute Of Technology”);
LCD_ShowString(0,15,240,16,16,“Electromagnetic Curved Cannon”); //Design of Simulated Electromagnetic Curved Cannon Based on STM32
LCD_ShowString(55,30,200,16,16,“Design by Yibo_Liu”);
LCD_ShowString(10,50,200,16,16,“Input coor:( , )”);
LCD_ShowString(10,70,200,16,16,“Vol set value : V”); //Real value
LCD_ShowString(10,90,200,16,16,“Vol Real value: V”); //Real value
Servo_work(142,150) ; //初始化云臺(tái) 原來(lái)左右是150
virtual_keyboard_init(); //虛擬鍵盤
while(1)
{
coordinate_transformation() ; //將按鍵值轉(zhuǎn)換為坐標(biāo)值,進(jìn)行計(jì)算脈沖寬度和電容電壓 子程序
launch_jud(); //準(zhǔn)備發(fā)射子程序
// Servo_work(150,150) ; //歸位
}
}
論文報(bào)告:
百度云下載鏈接:
https://pan.baidu.com/s/1adjxcHvdFvpS4LuL0nWA_A?pwd=chqk