制作攻略:基于STM32F103C8T6的六路寻迹小车

文章目录

  • 前言

  • 一、所需材料

  • 二、组装步骤

  • 三、代码讲解

  • 总结


  • 前言

    寻迹小车是一个入门级别的东西,可以通过制作一辆寻迹小车熟悉单片机的一些基础操作,比如运用GPIO口、串口通信等单片机知识。寻迹我采用的是数字量,并没有使用模拟量。数字量会更加容易上手。做寻迹小车最花费时间的地方就是调PWM,需要我们自己一点点去改去试,所以需要有耐心一点。话不多说,进入正文

    一、所需材料

    1、STM32F103C8T6最小系统板

    具体引脚图我会跟代码放在同一个文件夹

     

     2、L298N电机驱动

    可以换成TB6612,性能会比这个好一点

     3、降压模块LM2596S*2

    一个降压到3.3v给单片机供电

    一个作为可调给电机驱动和寻迹供电

     4、寻迹模块(最好采用4个)

    博主这里只用到了六路,中间两个没用

    可以换成TCRT5000,更加便宜噢

     

     5、电池7.4v

    记得买一个接线式DC公头

    6、STLINKv2仿真编程器

    一定要注意好引脚之间的对接,有个小技巧就是都接好后,可以用黑胶带把杜邦线连在一起,下次再插入就可以更准确更快了

    7、电机、轮子、底板、电机支架

     

     

    8、黑胶带、铜柱、杜邦线

    黑胶布用来自制赛道

    9、螺丝刀

    电子人人手一个,为了以后更好地打螺丝

    二、组装步骤

    详细步骤可以参考博主同学:无言侠的博客

    以下是具体链接:

    Arduino循迹小车教程二—-组装篇_无言侠的博客-CSDN博客_arduino循迹小车组装说明书

    其中我们的寻迹模块使用并不相同,寻迹模块可以参考无言侠的,也可以使用博主的

    三、代码讲解

    完整代码文件我会放在文章的最后。

    1.寻迹函数

    .c文件

    void xunji_Init(void)
    {
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
    	
    	GPIO_InitTypeDef GPIO_InitStructure;
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_5|GPIO_Pin_9;
    	GPIO_Init(GPIOB, &GPIO_InitStructure);
    }

    .h文件

    #ifndef __XUNJI_H
    #define __XUNJI_H
    
    
    void xunji_Init(void);
    
    
    #endif

    2.PWM函数

    具体PWM的理解,需要自己去学习噢

    .c文件

    void PWM_Init(void)
    {
    	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE);
    	
    	GPIO_InitTypeDef GPIO_InitStructure;
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_1|GPIO_Pin_0;
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    	GPIO_Init(GPIOA, &GPIO_InitStructure);
    	
    	TIM_InternalClockConfig(TIM2);
    	
    	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
    	TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
    	TIM_TimeBaseInitStructure.TIM_Period = 900 - 1;		//ARR
    	TIM_TimeBaseInitStructure.TIM_Prescaler = 0;		//PSC
    	TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
    	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);
    	
    	TIM_OCInitTypeDef TIM_OCInitStructure;
    	TIM_OCStructInit(&TIM_OCInitStructure);
    	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
    	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
    	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    	TIM_OCInitStructure.TIM_Pulse = 899;		//CCR
    	
    	TIM_OC1Init(TIM2, &TIM_OCInitStructure);
    	TIM_OC2Init(TIM2, &TIM_OCInitStructure);
    	TIM_OC3Init(TIM2, &TIM_OCInitStructure);
    	TIM_OC4Init(TIM2, &TIM_OCInitStructure);
    	
    	TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);
    	TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable); 
    	TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Enable); 
    	TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Enable);
    	
    	TIM_Cmd(TIM2, ENABLE); 
    }
    
    void PWM_SetCompare1(uint16_t Compare)
    {
    	TIM_SetCompare1(TIM2, Compare);
    }
    
    void PWM_SetCompare2(uint16_t Compare)
    {
    	TIM_SetCompare2(TIM2, Compare);
    }
    
    
    void PWM_SetCompare3(uint16_t Compare)
    {
    	TIM_SetCompare3(TIM2, Compare);
    }
    
    void PWM_SetCompare4(uint16_t Compare)
    {
    	TIM_SetCompare4(TIM2, Compare);
    }
    

    .h文件

    #ifndef __PWM_H
    #define __PWM_H
    
    void PWM_Init(void);
    void PWM_SetCompare1(uint16_t Compare);
    void PWM_SetCompare2(uint16_t Compare);
    void PWM_SetCompare3(uint16_t Compare);
    void PWM_SetCompare4(uint16_t Compare);
    
    
    #endif
    

    3、电机函数

    .c文件

    #include "stm32f10x.h"                  // Device header
    #include "PWM.h"
    //A3-D0,A2-D1,A1-D2,A0-D1
    void Motor_Init(void)
    {
    	PWM_Init();
    }
    
    void go(void)
    {
    	PWM_SetCompare1(900);
    	PWM_SetCompare2(700);
    	PWM_SetCompare3(900);
    	PWM_SetCompare4(700);
    }
    void smallright(void)
    {
    	PWM_SetCompare1(900);
    	PWM_SetCompare2(400);
    	PWM_SetCompare3(700);
    	PWM_SetCompare4(900);
    }
    
    void middleright(void)
    {
    	PWM_SetCompare1(900);
    	PWM_SetCompare2(320);
    	PWM_SetCompare3(700);
    	PWM_SetCompare4(900);
    }
    
    void bigright(void)
    {
    	PWM_SetCompare1(900);
    	PWM_SetCompare2(5);
    	PWM_SetCompare3(900);
    	PWM_SetCompare4(800);
    }
    
    void smallleft(void)
    {
    	PWM_SetCompare1(900);
    	PWM_SetCompare2(700);
    	PWM_SetCompare3(320);
    	PWM_SetCompare4(900);
    }
    
    void middleleft(void)
    {
    	PWM_SetCompare1(900);
    	PWM_SetCompare2(700);
    	PWM_SetCompare3(350);
    	PWM_SetCompare4(900);
    }
    
    void bigleft(void)
    {
    	PWM_SetCompare1(800);
    	PWM_SetCompare2(900);
    	PWM_SetCompare3(0);
    	PWM_SetCompare4(900);
    }
    
    void stop(void)
    {
    	PWM_SetCompare1(0);
    	PWM_SetCompare2(0);
    	PWM_SetCompare3(0);
    	PWM_SetCompare4(0);
    }
    

    .h文件

    #ifndef __MOTOR_H
    #define __MOTOR_H
    
    void Motor_Init(void);
    void go(void);
    void smallright(void);
    void smallleft(void);
    void middleright(void);
    void middleleft(void);
    void bigright(void);
    void bigleft(void);
    void stop(void);
    
    #endif
    

    4、主函数

    int main(void)
    {
    	xunji_Init();
    	Motor_Init();
    	
    	while (1)
    	{
    		RIGHT1 = GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_4);
    		RIGHT2 = GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5);
    		RIGHT3 = GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_6);
    		LEFT1 = GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7);
    		LEFT2 = GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_8);
    		LEFT3 = GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_9);
    		if(RIGHT1==0 && RIGHT2==0 && RIGHT3==0 && LEFT1==0 && LEFT2==0 && LEFT3==0)
    		{
    			go();
    		}
    		if(RIGHT1==0 && RIGHT2==0 && RIGHT3==1 && LEFT1==0 && LEFT2==0 && LEFT3==0)
    		{
    			smallright();
    		}
    		if(RIGHT1==0 && RIGHT2==1 && RIGHT3==0 && LEFT1==0 && LEFT2==0 && LEFT3==0)
    		{
    			middleright();
    		}
    		if(RIGHT1==1 && RIGHT2==0 && RIGHT3==0 && LEFT1==0 && LEFT2==0 && LEFT3==0)
    		{
    			bigright();
    		}
    		if(RIGHT1==0 && RIGHT2==0 && RIGHT3==0 && LEFT1==1 && LEFT2==0 && LEFT3==0)
    		{
    			smallleft();
    		}
    		if(RIGHT1==0 && RIGHT2==0 && RIGHT3==0 && LEFT1==0 && LEFT2==1 && LEFT3==0)
    		{
    			middleleft();
    		}
    		if(RIGHT1==0 && RIGHT2==0 && RIGHT3==0 && LEFT1==0 && LEFT2==0 && LEFT3==1)
    		{
    			bigleft();
    		}
    		if(RIGHT1==1 && RIGHT2==1 && RIGHT3==1 && LEFT1==1 && LEFT2==1&& LEFT3==1)
    		{
    			stop();
    		}
    	}
    }

    总结

    链接:https://pan.baidu.com/s/1KTNfWI-aIuWDQmojF1umhA 
    提取码:xk30

    想学arduino制作寻迹小车的可以无言侠噢!

    勤动手,每天设立一个小目标,很快就能做到自己想要做到的事。

    欢迎指教!

    物联沃分享整理
    物联沃-IOTWORD物联网 » 制作攻略:基于STM32F103C8T6的六路寻迹小车

    发表评论