stm32f103 简易4路红外寻迹小车(2)----2023西南交大电赛校赛(pcb原理图,代码及分析)

这篇具有很好参考价值的文章主要介绍了stm32f103 简易4路红外寻迹小车(2)----2023西南交大电赛校赛(pcb原理图,代码及分析)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一。材料准备。

二。PCB原理图 

三。逻辑状态图

四。代码部分

五。文件下载:


电赛循迹小车,稀烂胶带胶兵在行动,stm32的学习,stm32,单片机,嵌入式硬件

接上:stm32f103 简易4路红外寻迹小车(1)----2023西南交大电赛校赛(含stm32中文资料)

小车测试视频:

stm32小车寻迹小车

一。材料准备。

材料资料图片见上:stm32f103 简易4路红外寻迹小车(1)----2023西南交大电赛校赛(含stm32中文资料)

电赛循迹小车,稀烂胶带胶兵在行动,stm32的学习,stm32,单片机,嵌入式硬件

电机驱动MX1919L

VCC统一接stm32系统板的3.3v。VDD接7.4V电源。电容连接如图。左侧和右侧两轮分别接2通道。

利用pwm波改变占空比控制电机转速,逻辑输入接可以产生pwm的PA6,PA7,PB0,PB1(TIM3),复用推挽输出。

电赛循迹小车,稀烂胶带胶兵在行动,stm32的学习,stm32,单片机,嵌入式硬件

电赛循迹小车,稀烂胶带胶兵在行动,stm32的学习,stm32,单片机,嵌入式硬件

红外寻迹模块

接PB4,PB5,PB6,PB7。浮空输入

二。PCB原理图 

电赛循迹小车,稀烂胶带胶兵在行动,stm32的学习,stm32,单片机,嵌入式硬件

电赛循迹小车,稀烂胶带胶兵在行动,stm32的学习,stm32,单片机,嵌入式硬件

电赛循迹小车,稀烂胶带胶兵在行动,stm32的学习,stm32,单片机,嵌入式硬件

学校发了最小系统板所有没有自己做驱动板直接把最小系统板插上去用了。

三。逻辑状态图

电赛循迹小车,稀烂胶带胶兵在行动,stm32的学习,stm32,单片机,嵌入式硬件

四。代码部分

pwm.c 

启用TIM3时钟 输出pwm波使用的是TIM3的4个通道(A6 A7 B0 B1)分别连接电机驱动的Vina1 Vinb1 Vina2 Vinb2。

设置为复用推挽输出。

#include "stm32f10x.h"
#include "pwm.h"
#include "delay.h"

void pwm_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
	
RCC_APB1PeriphClockCmd (RCC_APB1Periph_TIM3,ENABLE);
RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE);

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
	
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStructure);
	
}
//T(s)周期/溢出时间=(arr溢出值+1)(psc分频系数+1)/Tclk  
//Tlck为通用定时器的时钟,如果APB1没有分频,则就为系统时钟,72Mhz
//PWM时钟频率=1/T
//TIM_SetCompare3(TIM3,1500);//改变比较值TIM3->CCR2达到调节占空比的效果
void pwm(u16 arr,u16 ccr){
//2个结构体的定义
	TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
	TIM_OCInitTypeDef TIM_OCInitStructure;

	TIM_DeInit(TIM3);//TIM3设置为缺省值
	TIM_TimeBaseStructure.TIM_Period= arr-1; //自动重装载寄存器的值 因为从0开始计到arr-1 共arr个数 
	TIM_TimeBaseStructure.TIM_Prescaler= 1;//时钟预分频数
	TIM_TimeBaseStructure.TIM_ClockDivision=0x0;//采样分频
	TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//向上计数
	TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);
	
	TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1 ;        //TIM的PWM1模式         PWM1  PMW2
	TIM_OCInitStructure.TIM_OutputState= TIM_OutputState_Enable;
	TIM_OCInitStructure.TIM_Pulse=ccr-1;                  //设置占空比
    TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;//TIM输出比较极性高    High  Low
	
	TIM_OC1Init(TIM3,&TIM_OCInitStructure);              
	TIM_OC1PreloadConfig(TIM3,TIM_OCPreload_Enable);
	
	TIM_OC2Init(TIM3,&TIM_OCInitStructure);
	TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable);
	
	TIM_OC3Init(TIM3,&TIM_OCInitStructure);
	TIM_OC3PreloadConfig(TIM3,TIM_OCPreload_Enable);
	
	TIM_OC4Init(TIM3,&TIM_OCInitStructure);
	TIM_OC4PreloadConfig(TIM3,TIM_OCPreload_Enable);
	
	TIM_ARRPreloadConfig(TIM3,ENABLE);//使能定时器TIM3在ARR上的预装载寄存器
    TIM_Cmd (TIM3,ENABLE);//使能定时器3
}

xunkun.c  读取红外信号

TC表示从左到右红外显示的红外寻迹信号 如1111 表示全部检测的黑线

#include "xunkun.h"
//#define LL1 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1)//读取 PB4
//#define LL2 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_2)//读取 PB5
//#define RR2 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_3)//读取 PB6
//#define RR1 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_4)//读取 PB7
//#define TC   1000*LL1+100*LL2+10*RR2+1*RR1
void xunkun_init(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;                                     
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB ,ENABLE);
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
	GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_IN_FLOATING;  
	GPIO_Init(GPIOB,&GPIO_InitStructure);                        
}

diankun.c   电机驱动调速部分,TIM_SetCompareX(TIMX,X);改变TIMX时钟的某一通道的ccr,从而改变占空比。

电赛循迹小车,稀烂胶带胶兵在行动,stm32的学习,stm32,单片机,嵌入式硬件

#include "stm32f10x.h"
#include "diankun.h"
#include "delay.h"
void diankun_Z1(void){//快速直走
	 TIM_SetCompare1(TIM3,1);
	 TIM_SetCompare2(TIM3,2000);
	 TIM_SetCompare3(TIM3,1);
	 TIM_SetCompare4(TIM3,2000);
	  delay_ms(10);}
void diankun_L1(void){//快速左转
	 TIM_SetCompare1(TIM3,1);
	 TIM_SetCompare2(TIM3,1750);
	 TIM_SetCompare3(TIM3,1);
	 TIM_SetCompare4(TIM3,2000);
	  delay_ms(10);}
void diankun_L2(void){//中速左转
	 TIM_SetCompare1(TIM3,1);
	 TIM_SetCompare2(TIM3,1500);
	 TIM_SetCompare3(TIM3,1);
	 TIM_SetCompare4(TIM3,2000);
	 delay_ms(10);}
void diankun_L3(void){//慢速左转
	 TIM_SetCompare1(TIM3,1);
	 TIM_SetCompare2(TIM3,1000);
	 TIM_SetCompare3(TIM3,1);
	 TIM_SetCompare4(TIM3,2000);
	 delay_ms(10);}
void diankun_R1(void){//快速右转
	 TIM_SetCompare1(TIM3,1);
	 TIM_SetCompare2(TIM3,2000);
	 TIM_SetCompare3(TIM3,1);
	 TIM_SetCompare4(TIM3,1750);
     delay_ms(10);}
void diankun_R2(void){//中速右转
	 TIM_SetCompare1(TIM3,1);
	 TIM_SetCompare2(TIM3,2000);
	 TIM_SetCompare3(TIM3,1);
	 TIM_SetCompare4(TIM3,1500);
	 delay_ms(10);}
void diankun_R3(void){//慢速右转
	 TIM_SetCompare1(TIM3,1);
	 TIM_SetCompare2(TIM3,2000);
	 TIM_SetCompare3(TIM3,1);
	 TIM_SetCompare4(TIM3,1000);
	 delay_ms(10);}
void diankun_LL(void){//向左旋转
	 TIM_SetCompare1(TIM3,1500);
	 TIM_SetCompare2(TIM3,1);
	 TIM_SetCompare3(TIM3,1);
	 TIM_SetCompare4(TIM3,1650);
	 delay_ms(8);}
void diankun_LL2(void){//向左旋转
	 TIM_SetCompare1(TIM3,1500);
	 TIM_SetCompare2(TIM3,1500);
	 TIM_SetCompare3(TIM3,1);
	 TIM_SetCompare4(TIM3,2000);
	 delay_ms(8);}
void diankun_RR(void){//向右旋转
	 TIM_SetCompare1(TIM3,1);
	 TIM_SetCompare2(TIM3,1650);
	 TIM_SetCompare3(TIM3,1500);
	 TIM_SetCompare4(TIM3,1);
	 delay_ms(8);}
void diankun_RR2(void){//向右旋转
	 TIM_SetCompare1(TIM3,1);
	 TIM_SetCompare2(TIM3,2000);
	 TIM_SetCompare3(TIM3,1500);
	 TIM_SetCompare4(TIM3,1500);
	 delay_ms(8);}
void diankun_X1(void){//快速制动
	 TIM_SetCompare1(TIM3,1800);
	 TIM_SetCompare2(TIM3,1800);
	 TIM_SetCompare3(TIM3,1800);
	 TIM_SetCompare4(TIM3,1800);
	 delay_ms(10);}

main.c   

SD识别赛道,用与入库出库和更圆滑的通过弧线弯道,本代码是小车开始识别不到黑线则判定为竞速赛道,这里也可以使用开关来调节小车模式

RL是记录小车最左侧和最右侧的最后一次检测信号,用于当小车冲出赛道(识别不到黑线)应该向什么方向旋转。

#include "stm32f10x.h"
#include "sys.h"
#include "delay.h"
#include "pwm.h"
#include "diankun.h"
#include "xunkun.h"
int main(void)
{
	xunkun_init();
	pwm_init();
	pwm(2000,1);//初始pwm值
	u8 RL=0;//R=0,L=1,确定0000前最后一次转弯方向
	u8 SD=0;//识别是否为竞速赛道
	delay_ms(20);//等待设备稳定

	if(TC==0){//0000识别赛道起点
		diankun_RR();
		SD=1;//改变RR和LL为RR2和LL2
		delay_ms(450);}
 while(1){ 
	 //入库
	  if(TC==1111&&SD==1){//1111
			 diankun_Z1();
	         delay_ms(80);			 
			 if(TC==0) {
		    diankun_RR();
			delay_ms(560);	
		   while(1) diankun_X1();}}
	 //旋转
	  if(TC==0){//0000
			if(SD==0)diankun_X1();
		  while(TC==0&&SD==0){ 
			  if(RL) diankun_LL(); 
			  else   diankun_RR();}
	      while(TC==0&&SD==1){ 
			  if(RL) diankun_LL2(); 
			  else   diankun_RR2();} }
	  //直走
	  if(TC==1001||TC==110|TC==1111){//1001,0110,1111
		  diankun_Z1();}
	  //右转
	  if(TC==1011||TC==111){//1011,0111  
		  RL=0;
		  diankun_R1();}
	  if(TC==11||TC==1010){//0011,1010
		  RL=0;
		  diankun_R2();}
	  if(TC==1){//0001
		  RL=0;
		  diankun_R3();}
	  if(TC==10){//0010
		  diankun_R1();}
	  //左转
	  if(TC==1101||TC==1110){//1101,1110 
		  RL=1;
		  diankun_L1();} 
	  if(TC==1100||TC==101){//1100,0101 
		  RL=1;
		  diankun_L2();}
	  if(TC==1000){//1000
		  RL=1;
		  diankun_L3();}
	  if(TC==100){//0100
		  diankun_L1();}
      }}

五。文件下载:(代码+pcb原理图)

https://pan.baidu.com/s/1YfZJb8128TMIqJpYZ9hwDA   提取码:0435

第一次参加单片机比赛 第一次学习stm32 虽然最后小车还是拿了校一 但是学习较浅 代码不足之处还请见谅。

后面省赛国赛我还会继续分享自己的历程,多多支持我这个初学者哦。文章来源地址https://www.toymoban.com/news/detail-585752.html

到了这里,关于stm32f103 简易4路红外寻迹小车(2)----2023西南交大电赛校赛(pcb原理图,代码及分析)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 从零开始制作STM32F103RCT6小车(一)

            仅以此系列给实验室的学弟学妹作为小车制作教程来使用,后续的内容我会在这个暑假陆续更新出来,本篇的内容是新建一个适用于STM32F103RCT6的工程         接下来的操作几乎是基于STM32F1xx系列的固件库,这里我给大家列出链接 STM32F1xx系列固件库               

    2023年04月08日
    浏览(63)
  • 移植FreeRTOS的STM32F103双轮平衡小车(开源,代码文末)

    耗时大概三四天吧,主要时间还是花在硬件方面上, 目录 引言 1、系统概述 1.1、设计任务 1.2、设计要求 1.3、硬件清单 2、方案设计与论证 2.1、芯片选择方案芯片 2.2 、系统概述 2.3、设计要求 2.4、系统总体设计 2.5、重要功能模块程序实现原理分析 2.5.1、MPU6050模块的介绍 小

    2024年01月20日
    浏览(45)
  • [STM32F103C8T6]基于stm32的循迹,跟随,避障智能小车

    目录 1.小车驱动主要是通过L9110S模块来驱动电机 motor.c 2.我们可以加入串口控制电机驱动(重写串口接收回调函数,和重定向printf) Uart.c main.c  3.点动功能 uart.c main.c 为什么使用的是HAL_Delay()要设置滴答定时器的中断优先级呢? 4.小车PWM调速,  6.跟随功能 7.避障功能 超声波测距

    2024年02月13日
    浏览(57)
  • 基于STM32F103的树莓派ROS小车——全局路径规划之Dijkstra算法

    Dijkstra Dijkstra算法概念: 基本思想:由近到远把所有点的最短路径算出来。 算法解析:从起点向四周辐射,由近到远一层一层遍历所有的点,直到包含目标点所在层级。然后将所有可行路径进行计算比较,筛选出绝对最佳路径。 优点:最终得到的路径一定是最佳路径。 缺点

    2024年02月15日
    浏览(39)
  • STM32F103C8T6智能小车舵机超声波避障

    目录 一、定时器 计数和定时器中断  输出比较(PWM) 二、 舵机 三、超声波测距 四、主函数 总结 推荐的STM32学习链接:  [6-1] TIM定时中断_哔哩哔哩_bilibili [6-1] TIM定时中断是STM32入门教程-2022持续更新中的第13集视频,该合集共计29集,视频收藏或关注UP主,及时了解更多相关视

    2024年02月15日
    浏览(47)
  • STM32基于hal库的智能小车—红外寻迹

    材料: (1)stm32f407zgt6最小系统开发板 (2)l298n电机驱动模块1个 (3)四个电机 (4)循迹红外模块3个 一、组装 (1)L298N电机驱动模块与stm32开发板接线如下图: 说明:PWM接线把跳线帽扒开接外面引脚 CH1接ENA,CH2接ENB。 (2)寻迹红外接线: 二、主要程序 1、STM32CUBEMX配置如下:

    2024年02月01日
    浏览(47)
  • ESP8266 模块简易驱动程序 -- 基于 STM32F103 及原子云固件实现云功能

    本简易驱动程序是基于 正点原子 的ESP8266模块,主要用于实现连接 原子云 的功能。MCU选用的是 STM32F103ZET6 注:原子云固件添加了 AT+ATKCLDSTA 和 AT+ATKCLDCLS 两条指令 用于连接正点原子自家的原子云平台,原厂的AT指令不受任何影响 本程序主要实现了如下功能: 设定工作模式 连

    2023年04月23日
    浏览(46)
  • STM32超级蓝牙小车——基于STM32F103C8T6的多功能蓝牙小车(PID循迹、跟踪、有源蜂鸣器播放音乐、蓝牙遥控、AD采集+DMA转运等超多元素小车)

    一、项目时间:2023.7.24~11.26 二、实现效果:通过蓝牙控制小车运动与模式转换                         模式一:循迹模式                         模式二:跟踪模式                         模式三:音乐模式                         模式四:控制运动模式 三、使

    2024年02月04日
    浏览(56)
  • 基于STM32F103C8T6(HAL库)的HC-SR501红外人体传感及HC-SR04超声波测距

    一、基于STM32F103C8T6最小系统板和STM32CubeMX实现LED灯循环闪烁 二、基于STM32F103C8T6和STM32CubeMX实现UART串口通信数据收发 三、实战小例程 基于STM32F103C8T6最小系统板和STM32CubeMX驱动WS2812B光立方 四、基于STM32F103C8T6最小系统板HAL库CubeMX驱动HC-SR501红外人体传感模块 五、基于STM32F103C8

    2023年04月17日
    浏览(108)
  • stm32f103VET6和stm32f103c8t6有什么区别?

    我来终结下这个问题。 这两款单片机我都用过,其中无际单片机特训营其中一款wifi报警主机项目就是用了stm32f103c8t6。  stm32f103VET6和stm32f103c8t6都是STMicroelectronics公司推出基于ARM Cortex-M3内核的单片机。 它们在硬件规格和性能上存在一些差异,下面我详细讲解下它们的差异之处

    2024年02月15日
    浏览(65)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包