2019年电赛电磁炮,冲刺国赛

news/2024/10/30 19:37:19/

        先自报家门吧,本人大二,来自双一流大学,具体那个大学就不介绍了,在大一的时候就进入了专业实验室,本参与实验的培训,学习了很多关于单片机的知识,在今年,学校组织参加电赛,经过两轮的重重筛选,进入了最后的队伍,第二轮电赛我们抽到的题目是电磁炮,我从底层开始写代码,因为之前参加过机甲大师赛,对freerots操作系统情有独钟,所以在刚开始,就准备用这个操作系统写代码,但是很遗憾没有移植成功,所以就用蓝牙串口接收的数据作为任务切换的指令,主控用的stm32f103c8t6最小系统板。经过两天辛苦编写,终于完成了基本框架,然后进入了最终的调试阶段。

        我的实现逻辑是用TOF激光测距进行距离的测试,作为充电时间判断依据,本来打算用matlab进行数据拟合,这里为了方便就直接乘以一个系数就作为了判断依据。tof的数据解析代码如下。

unsigned char ucRxFinish=0;
static unsigned char ucCnt=0,ucLen=0;
unsigned char ucRxData[100];
void USART2_IRQHandler(void)                	//串口1中断服务程序
{unsigned char temp=0;u16 C=0;if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)  {temp=USART_ReceiveData(USART2);if(ucCnt==0)ucRxData[ucCnt++]=temp;else	if((ucCnt==1)&(temp==0x03))ucRxData[ucCnt++]=temp;else if(ucCnt==2){ucRxData[ucCnt++]=temp; ucLen=ucRxData[2];}else if((ucCnt>2)&(ucCnt<=(ucLen+4)))ucRxData[ucCnt++]=temp;if(ucCnt==(ucLen+5)){  C=ModbusCRC(ucRxData,ucLen+3);if(C==((ucRxData[ucLen+3]<<8)|ucRxData[ucLen+4])){ucRxFinish=1;	ucCnt=0;ucLen=0;}			else {ucCnt=0;ucLen=0;}				}}USART_ClearITPendingBit(USART2, USART_IT_RXNE);
}   		 

tof用的串口2,串口2的初始化代码

void USART2_Config(void)
{//GPIO端口设置GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);	//使能USART1,GPIOA时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);//USART1_TX   GPIOA.2GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PA.2GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	//复用推挽输出GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10//USART1_RX	  GPIOA3初始GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;//PA3GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.3//Usart1 NVIC 配置NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;		//子优先级3NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能NVIC_Init(&NVIC_InitStructure);	//根据指定的参数初始化VIC寄存器//USART 初始化设置USART_InitStructure.USART_BaudRate = 115200;//串口波特率USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	//收发模式USART_Init(USART2, &USART_InitStructure); //初始化串口1USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//开启串口接受中断USART_Cmd(USART2, ENABLE);                    //使能串口1 

这里是直接复制串口一的初始化修改的,所以有些注释没有改,能用就行!

这是我写的第一篇博客,希望大家见谅,逻辑有些不清晰,我还是重硬件初始化讲起吧!

 

如上是硬件部分。

ADC本来是打算用来测电压的,但是由于电磁炮电容的电压太大了,而且还是交流电,交流转直流然后降压下来太麻烦了,所以在程序里面并没有用。

delay就不要说了,延时函数,key是按键。

pwm是给舵机配置的,这里用了三个串口,relay是继电器的文件,用继电器控制电磁炮的充电和放电。

PWM初始化代码:

void TIM4_Init(void)
{GPIO_InitTypeDef GPIO_InitStructure;   //声明一个结构体变量,用来初始化GPIOTIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;//声明一个结构体变量,用来初始化定时器TIM_OCInitTypeDef TIM_OCInitStructure;//根据TIM_OCInitStruct中指定的参数初始化外设TIMx/* 开启时钟 */RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);/*  配置GPIO的模式和IO口 */GPIO_InitStructure.GPIO_Pin=GPIO_Pin_7|GPIO_Pin_8;// PB7GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽输出GPIO_Init(GPIOB,&GPIO_InitStructure);//TIM4定时器初始化TIM_TimeBaseInitStructure.TIM_Period = 1999; //PWM 频率=72000/(199+1)=36Khz//设置自动重装载寄存器周期的值TIM_TimeBaseInitStructure.TIM_Prescaler = 71;//设置用来作为TIMx时钟频率预分频值TIM_TimeBaseInitStructure.TIM_ClockDivision = 0;//设置时钟分割:TDTS = Tck_timTIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;	//TIM向上计数模式TIM_TimeBaseInit(TIM4, & TIM_TimeBaseInitStructure);//PWM初始化	  //根据TIM_OCInitStruct中指定的参数初始化外设TIMxTIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;TIM_OCInitStructure.TIM_Pulse = 0;TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;//PWM输出使能TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low;TIM_OC3Init(TIM4,&TIM_OCInitStructure);//注意此处初始化时TIM_OC1Init而不是TIM_OCInit,否则会出错。因为固件库的版本不一样。TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Enable);//使能或者失能TIMx在CCR1上的预装载寄存器TIM_OC2Init(TIM4,&TIM_OCInitStructure);//注意此处初始化时TIM_OC1Init而不是TIM_OCInit,否则会出错。因为固件库的版本不一样。TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable);//使能或者失能TIMx在CCR1上的预装载寄存器TIM_Cmd(TIM4,ENABLE);//使能或者失能TIMx外设TIM_SetCompare3(TIM4,1000);TIM_SetCompare2(TIM4,1100);
}

继电器初始化:

#include "relay.h"void RELAY_Init()
{GPIO_InitTypeDef  GPIO_InitStructure; 	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //APB2外设时钟使能      RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);//启动AFIO重映射功能时钟    GPIO_InitStructure.GPIO_Pin = RELAY1 | RELAY2; //选择端口号(0~15或all)                        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //选择IO接口工作方式       GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置IO接口速度(2/10/50MHz)    GPIO_Init(GPIOA, &GPIO_InitStructure);//必须将禁用JTAG功能才能做GPIO使用
//	GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);// 改变指定管脚的映射,完全禁用JTAG+SW-DP
//	GPIO_ResetBits(GPIOA,RELAY1 | RELAY2); //都为低电平(0) 初始为关继电器	
}void RELAY_1(u8 c) //继电器的控制程序(c=0继电器放开,c=1继电器吸合)
{GPIO_WriteBit(GPIOA,RELAY1,(BitAction)(c));//通过参数值写入接口
}
void RELAY_2(u8 c)//继电器的控制程序(c=0继电器放开,c=1继电器吸合)
{ GPIO_WriteBit(GPIOA,RELAY2,(BitAction)(c));//通过参数值写入接口
}

串口那些就不用说了嘛。这是硬件篇,今天就先写到这。明天写逻辑层。


http://www.ppmy.cn/news/213001.html

相关文章

模拟电磁炮国一设计资料【2019电赛H题国一作品】

经历重重测试&#xff0c;从初赛杀进综测再到去上海复测&#xff0c;真是一路坎坷啊&#xff01;回顾电赛准备阶段&#xff0c;在实验室基地的我们熬了多少个夜&#xff0c;废寝忘食的学习…仅仅是为了能更有信心的面对电赛&#xff1b;在电赛的四天三夜中我们经历了太多&#…

2019年全国大学生电子竞赛 | 电磁炮制作教程

​ 需要此套件的联系我。 原文链接&#xff1a;https://mp.weixin.qq.com/s/T6xCl9XbWBi3ap1FagtjIA

STM32模拟电磁炮设计_STM32F103ZET6(程序+原理图+PCB+论文报告)

本设计&#xff1a; 基于STM32模拟电磁炮设计_STM32F103ZET6&#xff08;程序原理图PCB论文报告&#xff09; 原理图&#xff1a;Altium Designer 程序编译器&#xff1a;keil 5 编程语言&#xff1a;C语言 编号C0029 设计说明&#xff1a; 该系统方案主要由 STM32f103zet6单片…

【电赛合集】19电磁炮.zip、17板球.zip、15风力摆.zip、13倒立摆.zip、(1994-2021)全国大学生电子设计竞赛历年真题.zip

【电赛合集】19电磁炮.zip、17板球.zip、15风力摆.zip、13倒立摆.zip、&#xff08;1994-2021&#xff09;全国大学生电子设计竞赛历年真题.zip 电赛宝藏链接&#xff1a; 四天三夜&#xff0c;那布满着未知与紧迫感的气息让荷尔蒙无比兴奋&#xff0c;挑战着脑力与体力的极限…

2019电赛 H题-电磁炮 视觉部分

2019电赛-H题-电磁炮-视觉自瞄部分; 硬件平台: Jetson Nano, Realsense D435 实现功能&#xff1a;识别到引导标志反馈坐标及距离&#xff0c;串口输出 #include <iostream>using namespace std; #include <sstream> #include <iostream> #include <fs…

2019全国大学生电子设计竞赛备赛笔记--风力摆--板球--模拟曲射电磁炮

2019年TI杯国赛控制题H题电磁炮&#xff0c;这年大一&#xff0c;参加电赛&#xff0c;备赛时间不算长&#xff0c;知识储备也不足&#xff0c;但还是收获颇丰&#xff0c;以至于回想起来整个大二忙活的时间&#xff0c;还没电赛备赛那段时间学到的多。 &#xff08;不涉及具体…

含有外部电路设置的电磁炮Maxwell瞬态仿真

含有外部电路的电磁炮Maxwell瞬态仿真 由于很多教学中都没有讲到ANSYS的外部电路编辑器&#xff0c;因此博主在这写下&#xff0c;大家相互学习。salute!本教程是不会教基础操作&#xff0c;基础操作可以去b站找一下基础教程&#xff0c;本博客着重在Maxwell circuir editor的…