目录

设计目标:

设计思路:

设计方案:

电机驱动

1)时钟配置

2)SYS配置

3)PWM信号输出

4)电机控制思路

5)电机驱动代码

电脑通讯

1)CubeMx配置

2)电脑通讯代码

HC05蓝牙通讯

1)HC05原理讲解

2)HC05蓝牙通讯代码

OpenMv处理

1)OpenMv道路识别

2)OpenMv的串口通讯

设计问题及解决:

1、STM32F429只引出了USART1引脚。

2、蓝牙模块连接的时候有效距离很短。


设计目标:

项目在2021年电子设计竞赛的国赛题目上进行了一些改动、

基本功能:其需要运输物品到指定位置(6个虚线位置),运输完成后将回到起始点。

新加功能:通过从另一片MCU远程提供目标点位置,在车上放物品后可以自动前往目标位置,同时远程MCU可以显示小车运动轨迹。

设计思路:

设计分为两块,分别为:

1、STM32F103:图形界面显示地图信息、触摸屏提供目标位置、HC05蓝牙通讯向小车传输目标点位置。

2、STM32F429:控制两类电机驱动L298N、AT8236、HC05蓝牙通讯接收目标点位置、OpenMv H7用于识别道路中的特殊位置如:十字路口、丁字路口等。

设计方案:

  • 电机驱动

为了保证小车速度,四轮均单独使用一对PWM信号,故采用两个驱动,驱动应尽量一致,但由于实验中有一驱动烧毁故采用不同的驱动实现。

小车电机型号为:

虽然AT8236拥有编码器控制模块,但电机并非编码电机,估值采用四路信号输出PWM信号控制电机转动。

从IN1、IN2、IN3、IN4分别与STM32F429的四个GPIO口相连,输出PWM信号,从而控制电机正反转及转动速度。使用STM32CubeMx配置GPIO口输出PWM信号,具体操作如下:

1)时钟配置

  1. 配置RCC中高速时钟HSE使用Crystal/Ceramic Resonator

        b)时钟树配置

2)SYS配置

其中Debug必须选用Serial Wire,否则会有板子下载后将无法找到板子从而无法再次下载的问题。

从OUT1、OUT2、OUT3、OUT4分别与小车电机的红黑线相连,从而保证小车可以正转,也可以反转。

3)PWM信号输出

采用TIM4和TIM5输出八路PWM信号,其中频率为:

96MHz/(95+1)/(254+1)=3.9KHZ,初始化占空比设置为0。

4)电机控制思路

电机控制的总体流程如下

电机控制的具体流程为:

在电机控制存在一个死循环,在死循环中不断地接收OpenMv的道路信息,更新车轮转速,进而达到寻线的目的,其中采用PID算法控制电机转速,由于题目中的路段基本都为直线和一些特殊交叉道路,故项目使用固定转弯时间来控制器转弯,转弯后继续寻线。

5)电机驱动代码

此时根据CubeMx生成代码加入motor.c和motor.h文件,用于控制小车电机。部分代码如下:

//motor.h
void control_motor(int pwm_left, int pwm_right);
void stop_car();
void track_and_run();
void trun_left();
void trun_right();
void go();
void turn_180();
void go_home(int state);
void control_motor_all(int pwm_leftf, int pwm_leftr,int pwm_rightf,int pwm_rightr);
void run_way1(int state);
void run_way2(int state);
void run_way3(int state);
void run_way4(int state);
void run_way5(int state);
void run_way6(int state);
//motor.c
//定义输出的PWM输出通道
#define MOTOR_L &htim5
#define MOTOR_LF_F TIM_CHANNEL_4
#define MOTOR_LF_B TIM_CHANNEL_3
#define MOTOR_LR_F TIM_CHANNEL_2
#define MOTOR_LR_B TIM_CHANNEL_1
#define MOTOR_R &htim4
#define MOTOR_RF_F TIM_CHANNEL_4
#define MOTOR_RF_B TIM_CHANNEL_3
#define MOTOR_RR_F TIM_CHANNEL_2
#define MOTOR_RR_B TIM_CHANNEL_1//定义PWM信号的最大最小值
#define pwm_max 255
#define pwm_min -255
#include "motor.h"
#include "tim.h"int value=0;//表示从Openmv得到的路况信息
int turn_now=0;//无用
int stop_car_flag=0;//1表示停车
int stop_state=0;//停止线的数目
int T_num[4] = {0,0,0,0};//十字、T型、左上、右上
uint8_t PIC_buffer=1;//缓冲区,无用
extern int Move_modle;
extern int YL_start;
//int a=0;//电机四轮驱动函数
void control_motor_all(int pwm_leftf, int pwm_leftr,int pwm_rightf,int pwm_rightr)
{if (pwm_leftf > 0) {__HAL_TIM_SetCompare(MOTOR_L,MOTOR_LF_F, pwm_leftf);__HAL_TIM_SetCompare(MOTOR_L,MOTOR_LR_F, pwm_leftr);__HAL_TIM_SetCompare(MOTOR_L,MOTOR_LF_B, 0);__HAL_TIM_SetCompare(MOTOR_L,MOTOR_LR_B, 0);}else {__HAL_TIM_SetCompare(MOTOR_L,MOTOR_LF_F, 0);__HAL_TIM_SetCompare(MOTOR_L,MOTOR_LR_F, 0);__HAL_TIM_SetCompare(MOTOR_L,MOTOR_LF_B, -pwm_leftf);__HAL_TIM_SetCompare(MOTOR_L,MOTOR_LR_B, -pwm_leftr);}if (pwm_rightf > 0) {__HAL_TIM_SetCompare(MOTOR_R,MOTOR_RF_F, pwm_rightf);__HAL_TIM_SetCompare(MOTOR_R,MOTOR_RR_F, pwm_rightr);__HAL_TIM_SetCompare(MOTOR_R,MOTOR_RF_B, 0);__HAL_TIM_SetCompare(MOTOR_R,MOTOR_RR_B, 0);}else {__HAL_TIM_SetCompare(MOTOR_R,MOTOR_RF_F, 0);__HAL_TIM_SetCompare(MOTOR_R,MOTOR_RR_F, 0);__HAL_TIM_SetCompare(MOTOR_R,MOTOR_RF_B, -pwm_rightf);__HAL_TIM_SetCompare(MOTOR_R,MOTOR_RR_B, -pwm_rightr);}}
//停车
void stop_car()
{__HAL_TIM_SetCompare(MOTOR_L,MOTOR_LF_F, 0);__HAL_TIM_SetCompare(MOTOR_L,MOTOR_LR_F, 0);__HAL_TIM_SetCompare(MOTOR_L,MOTOR_LF_B, 0);__HAL_TIM_SetCompare(MOTOR_L,MOTOR_LR_B, 0);__HAL_TIM_SetCompare(MOTOR_R,MOTOR_RF_F, 0);__HAL_TIM_SetCompare(MOTOR_R,MOTOR_RR_F, 0);__HAL_TIM_SetCompare(MOTOR_R,MOTOR_RF_B, 0);__HAL_TIM_SetCompare(MOTOR_R,MOTOR_RR_B, 0);
}
//检测PWM信号是否在给定范围之内
int check_pwm(int value)
{if(value>pwm_max)return pwm_max;if(value<pwm_min)return pwm_min;return value;
}//主控函数
void track_and_run(int state) {if(Move_modle==1){run_way1(state);}else if(Move_modle==2){run_way2(state);}else if(Move_modle==3){run_way3(state);}else if(Move_modle==4){run_way4(state);}else if(Move_modle==5){run_way5(state);}else if(Move_modle==6){run_way6(state);}}void trun_right()
{HAL_Delay(160);turn_now=1;control_motor_all(235,200,-215 ,-200);HAL_Delay(240);
}void go()
{//int tracker_offset=-340;float tracker_KP;int tracker_val;float left_mult,right_mult;int pwm_base = 80;int pwm_left, pwm_right;//tracker_val = track_degrees;tracker_val = value;left_mult=1.0;right_mult=0.7;tracker_KP=4;pwm_left = (int)(pwm_base - tracker_val * tracker_KP*left_mult);pwm_left = check_pwm(pwm_left);pwm_right = (int)(pwm_base + tracker_val * tracker_KP*right_mult );pwm_right = check_pwm(pwm_right);control_motor(pwm_left,pwm_right);
}void run_way1(int state)
{if (stop_car_flag==0 &&YL_start==1)//去的走法{if (state==0){go();}else if(state==1){//printf("%d\n%d\n%d\n",0xf1,1,0xf3);trun_left();}else if(state==2 ){stop_car();}else if(state==3 )//左边上边{stop_car();}else if(state==4 )//右边上边{stop_car();}}else if (stop_car_flag==1 &&YL_start==2)//回的走法{if (state==0){go();}else if(state==1){//printf("%d\n%d\n%d\n",0xf1,1,0xf3);trun_right();}else if(state==2 ){stop_car();}else if(state==3 )//左边上边{stop_car();}else if(state==4 )//右边上边{stop_car();}}else //回来后停车{stop_car();}
}
  • 电脑通讯

1)CubeMx配置

STM32F429中使用USART3实现,原理图如下:

只需要在CubeMx中打开串口模式为Asynchronous即可完成串口调用

2)电脑通讯代码

USART的代码由CubeMx自动生成,其中需要自己添加重定向函数,并将Keil中魔术棒中Target一栏下Use MicroLIB勾选,即可通过printf()函数从串口输出数据。

由于使用的STM32F429只引出了USART1的RX和TX,故对之后的串口通讯也从USART1的RX和TX输入输出数据,故在此声明了回调函数收集OpenMv的数据。printf可以将数据从TX输出,USART1_RXbuff接受了RX传输的数据。

/* USER CODE BEGIN 0 */
int fputc(int ch ,FILE *f)//重定向
{HAL_UART_Transmit (&huart1 ,(uint8_t *)&ch , 1,HAL_MAX_DELAY );return ch ;
}//UART
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{uint16_t tempt;if(huart->Instance==USART1){tempt=USART1_RXbuff;Openmv_Receive_Data(tempt);HAL_UART_Receive_IT(&huart1,(void *)&USART1_RXbuff,1);}    }/* USER CODE END 0 */
  • HC05蓝牙通讯

1)HC05原理讲解

HC05是一种比较集成的蓝牙模块,我们只需要调用串口就可以完成其传输功能,但必须将HC05进入AT模式调节对应参数。

  1. 长按按钮后接通VCC、GND、RXD、TXD即可进入AT模式,此时通过串口助手发送“AT+回车“,收到ok返回即进入AT模式。
  2. 在AT模式中主要设置连接密码,主从机地址等。具体参考文章:https://blog.csdn.net/seek97/article/details/81333701
  3. 拔掉电源后重新插入即可进入正常工作模式,此时会和设置好的蓝牙地址自动进行连接。
  4. 真正实现通讯还需要打开单片机的USART,通过RXD和TXD收发数据,此过程即简单的串口通讯过程,与电脑通讯类似,不再赘述。

2)HC05蓝牙通讯代码

此部分代码和电脑端通讯代码是一样的,printf可以将数据从TX输出,USART1_RXbuff接受了RX传输的数据。

/* USER CODE BEGIN 0 */
int fputc(int ch ,FILE *f)//重定向
{HAL_UART_Transmit (&huart1 ,(uint8_t *)&ch , 1,HAL_MAX_DELAY );return ch ;
}//UART
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{uint16_t tempt;if(huart->Instance==USART1){tempt=USART1_RXbuff;Openmv_Receive_Data(tempt);HAL_UART_Receive_IT(&huart1,(void *)&USART1_RXbuff,1);}    }
  • OpenMv处理

1)OpenMv道路识别

以往小车识别道路需要识别黑色路线,而2021年国赛题目中需要识别红色道路,这要求OpenMv的图片格式必须为RGB565格式,同时在识别道路的时候采用阈值排除黑色边框的干扰。

2)OpenMv的串口通讯

OpenMv的串口通讯拥有现成的函数,项目将其封装处理后可以通过帧头+内容+帧尾的形式收发数据。

#串口输出函数
def sending_data(Data1):global uart;#frame=[0x2C,18,cx%0xff,int(cx/0xff),cy%0xff,int(cy/0xff),0x5B];#data = bytearray(frame)data = ustruct.pack("<bbbb",      #格式为俩个字符俩个短整型(2字节)0xF0,0xF2,Data1,0xFF)uart.write(data);   #必须要传入一个字节数组#串口输入函数
def receive_data(Data):global LYstateglobal Move_modelglobal Move_model_if Data !=' ':#可能有一些异常数据if LYstate==0 and Data=='241':#帧头LYstate=1elif LYstate==1:if Data=='243':#帧尾LYstate=0else:Move_model_=DataLYstate=2elif LYstate==2 and Data=='243':Move_model=Move_model_LYstate=0else:LYstate=0

OpenMv和单片机的通讯仍然只需要采用RXD和TXD传输数据即可。

设计问题及解决:

1、STM32F429只引出了USART1引脚。

从OpenMv的TXD给STM32F429的RXD传输数据,这部分用于识别道路并控制电机转动。

从STM32F429的TXD通过蓝牙模块给STM32F103的RXD传输数据,这部分将小车目前状况放回到操纵者手中。

从STM32F103的TXD通过蓝牙模块给OpenMv的RXD传输数据,这部分用于远程遥控小车系统。

2、蓝牙模块连接的时候有效距离很短。

发现是VCC输入3.3V导致,输入5V的VCC可以正常工作。

2022暑期学校——简单实现2021年电子设计竞赛国赛题目相关推荐

  1. 电子设计之国赛准备-----(前言)

    电子设计之国赛准备-----(前言) 今年算是大一学期刚刚结束,留校参加院队集训然后进行为时四天三夜的全国大学生电子设计竞赛,期间又累又闲,有苦有乐,也学习到不少的东西,为此整理电子设计国赛准备中的一 ...

  2. 2007年大学生电子设计大赛国赛电源类题目设计报告

    项目背景      21世纪是信息化的时代,信息化的快速发展使得人们对于电子设备.产品的依赖性越来越大,而这些电子设备.产品都离不开电源.开关电源相对于线性电源具有效率.体积.重量等方面的优势,尤其是 ...

  3. 2017年全国大学生电子设计竞赛综合测评题目解析——Multisim仿真

    2017年综合测评仿真电路讲解: 题目和结果链接: 常用电路Multisim仿真--方波.三角波振荡电路: 常用电路Multisim仿真--有源低通滤波器设计: 常用电路Multisim仿真--数字芯 ...

  4. 2019全国计算机大赛二等奖,喜讯!这次是2019年TI杯全国大学生电子设计竞赛全国二等奖...

    12月21日,2019年TI杯全国大学生电子设计竞赛福建赛区颁奖大会在福州大学举行.大会对福建赛区获得全国大学生电子设计竞赛国赛和省赛奖项的队伍进行了表彰.在今年的比赛中,信息科学与技术学院参赛队伍获 ...

  5. 电子设计竞赛(6)-逆变电路

    点击上方"大鱼机器人",选择"置顶/星标公众号" 干货福利,第一时间送达! 逆变电源在全国大学生电子设计竞赛电源类题目中占十分重要的地位.每一个参加全国大学生电 ...

  6. 2022暑期学校C++课程设计课题

    2022暑期学校C++课程设计课题 6.1 银行定期储蓄管理系统 课程设计任务书 一. 任务 开发<银行定期储蓄管理系统>软件. 二. 基本要求 使用面向对象的系统分析和设计,开发基于MF ...

  7. 2022年全国大学生电子设计竞赛推荐处理器-瑞萨RZ/G2L

    2022年全国大学生电子设计竞赛--信息科技前沿专题邀请赛(瑞萨杯)将于2022年4月30日启动. 主题为:网络化语音图像检测与识别. 2022年竞赛由瑞萨公司提供RZ/G2L开发套件,RZ/G2L ...

  8. B题-具有自动泊车功能的电动车赛题解析TI杯2022年省级大学生电子设计竞赛联赛(10月)

    1.赛题解析-具有自动泊车功能的电动车(B题) 2.完成本赛题必备的元器件清单 3.赛题实现与动作分解视频演示 4.任务实现软件部分讲解 5.倒车/侧方入库相关的参数调节方法 6.常见问题整理 无名小 ...

  9. 2021年全国大学生电子设计竞赛重新启动通知及进度安排

    大家好,我是张巧龙,昨天晚上收到了电赛重新启动的通知. 2021年全国大学生电子设计竞赛 重新启动通知及进度安排 (电组字[2021]03号) 各赛区组织委员会.各有关高等学校: 根据全国疫情变化情况 ...

  10. 照度稳定可调 LED 台灯(K 题)【高职高专组】-- 2021 年全国大学生电子设计竞赛

    照度稳定可调 LED 台灯(K 题)[高职高专组]-- 2021 年全国大学生电子设计竞赛 一 任务 二 要求 1.基本要求 2.发挥部分 三 说明 四 评分标准 优秀作品开源参考(来源立创开源平台) ...

最新文章

  1. ArcPy学习入门(三):ArcPy 函数列表
  2. JAVA SE学习day_04:RandomAccessFile
  3. List泛型集合总结(一)
  4. JMeter使用碰到的问题
  5. c语言 文件 long double 读取,读取*.wav音频文件
  6. 关于Android中Service的手动、自动以及其在特殊条件下的重启
  7. python中的functools模块
  8. AndroidOS体系结构
  9. 4月02日 提取汉字首字母,并大写的类
  10. 时序竞态(竞态条件)
  11. java开发简历编写_如何通过几个简单的步骤编写出色的初级开发人员简历
  12. VMware vSphere Client客户端安装图解教程
  13. JimuReport积木报表 — API数据源报表带参制作
  14. Python中的时间转换和时间获取
  15. NetFPGA平台介绍
  16. [蓝桥] 基础练习 十六进制转十进制
  17. KnockOutJS入门
  18. 全球网络安全论坛(GCF)将于2022年2月举行,众多全球领袖将亲临现场
  19. 大数据时代的 3V + 3高
  20. python的标准库turtle_Python标准库使用之使用turtle绘制奥林匹克五环

热门文章

  1. 小红书前端开发面试经验分享
  2. 更新:电脑微信多开v3.5
  3. 使用fopen/fwrite/fread/fseek/fclose对文件从头读写整型数
  4. SAP的系统审计以及SM19的使用
  5. 大数据/数据挖掘/推荐系统/机器学习相关资源
  6. 用科学计算器求均值与方差(超详细)(概率论中使用)
  7. matlab将声音和噪声叠加,基于MATLAB有噪声语音信号的处理(最终稿)最新版
  8. 超详细电脑安装win10专业版
  9. VS2013创建Windows服务
  10. html实现旋转时钟