项目五:基于stm32f103的寻迹小车

Posted 鑫仔_要变强

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了项目五:基于stm32f103的寻迹小车相关的知识,希望对你有一定的参考价值。

前言:传感器工作原理:

代码部分: 

 

main.c

#include "motor.h"
#include <stdio.h>
#include "delay.h"
#include "stm32f10x.h"
#include "followline.h"
#include "ultrasonic.h"

u8 UART3_data,UART1_data;
u8 UART3_rcv[20],UART3_rcv_count;
u8 UART1_rcv[50],UART1_rcv_count,Uart1_finish;

int main(void)
{
	    motor_pwm_TIME4_init(71,999);//电机PWM初始化
	    delay_init();//延迟初始化
	    motor_GPIO_init();//电机管脚初始化、寻迹管脚初始化。

	//int right_2=0,right_1=0 ,left_2=0,left_1=0;
	
	while(1)
	{
		Car_fllow();
    
	}
}  

motor.c

#include "motor.h"

//电机GPIO管脚初始化函数
/**********************************************************************************/
void motor_GPIO_init(void)
{
	
	//定义管脚的结构体
	GPIO_InitTypeDef GPIO_InitStruct;
	GPIO_InitTypeDef  GPIO_InitStruct_C,GPIO_InitStruct_B;
	
	//打开所要使用的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC, ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
	
	//将管脚PB4特殊功能关掉
	GPIO_PinRemapConfig(GPIO_Remap_SWJ_NoJTRST,ENABLE);
	
	//配置PB4\\5\\8\\9管脚的参数,用于驱动电机。
	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_8|GPIO_Pin_9;
	GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
	//配置PC13\\14\\15管脚的参数,红外传感器。
	GPIO_InitStruct_C.GPIO_Mode=GPIO_Mode_IN_FLOATING;
	GPIO_InitStruct_C.GPIO_Pin=GPIO_Pin_14|GPIO_Pin_15|GPIO_Pin_13;
	配置PB12管脚的参数,红外传感器。
	GPIO_InitStruct_B.GPIO_Mode=GPIO_Mode_IN_FLOATING;
	GPIO_InitStruct_B.GPIO_Pin=GPIO_Pin_12;
	
	//初始化PB4\\5\\8\\9的管脚
	GPIO_Init(GPIOB, &GPIO_InitStruct);
	GPIO_Init(GPIOC, &GPIO_InitStruct_C);
	GPIO_Init(GPIOB, &GPIO_InitStruct_B);
	//配置PB6\\7管脚的参数,用于产生PWM波
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	//初始化PB6\\7的管脚
	GPIO_Init(GPIOB, &GPIO_InitStruct);
	//管脚全部先置零
	GPIO_ResetBits(GPIOB,GPIO_Pin_8);
  GPIO_ResetBits(GPIOB,GPIO_Pin_9);
	GPIO_ResetBits(GPIOB,GPIO_Pin_4);
  GPIO_ResetBits(GPIOB,GPIO_Pin_5);
	
}
/***************************************************************************************************************/

//TIME4的初始化函数
/********************************************************************************************/
void motor_pwm_TIME4_init(int presc,int arr)
{
	 //定义定时器的结构体
	 TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
	 //定义定时器PWM输出通道的结构体
	 TIM_OCInitTypeDef TIM_OCInitStruct;
	 //打开TIME4的时钟
	 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
	 //配置TIME4结构体的参数
	 TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1 ;
	 TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;
	 TIM_TimeBaseInitStruct.TIM_Prescaler = presc;
	 TIM_TimeBaseInitStruct.TIM_Period =arr; 	 
	 TIM_TimeBaseInit(TIM4, &TIM_TimeBaseInitStruct);
	 //配置TIME4通道结构体的参数
	 TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;
	 TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;
	 TIM_OCInitStruct.TIM_OutputState =TIM_OutputState_Enable ;
	 TIM_OCInitStruct.TIM_Pulse =0;
	  //TIME4通道1初始化
   TIM_OC1Init(TIM4, &TIM_OCInitStruct);
	 //使能TIME4通道1的预存寄存器
	 TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable);
   //TIME4通道2初始化
   TIM_OC2Init(TIM4, &TIM_OCInitStruct);
	 //使能TIME4通道2的预存寄存器
   TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable);
   //使能TIME4
	 TIM_Cmd(TIM4, ENABLE);
}
/*******************************************************************************************************/

void Car_gostright(int speed)//直行函数
	{
		speed_left(speed);
		speed_right(speed);
		GPIO_SetBits(GPIOB, GPIO_Pin_9);
   GPIO_ResetBits(GPIOB,GPIO_Pin_8);
	 GPIO_SetBits(GPIOB, GPIO_Pin_4);
   GPIO_ResetBits(GPIOB,GPIO_Pin_5);
	}

void Car_back(int speed)//后退
{
		speed_left(speed);
		speed_right(speed);
		GPIO_SetBits(GPIOB,GPIO_Pin_8);//左边电机
		GPIO_ResetBits(GPIOB,GPIO_Pin_9);
		GPIO_ResetBits(GPIOB,GPIO_Pin_4);//右边电机
		GPIO_SetBits(GPIOB,GPIO_Pin_5);




}
void Car_left(int speed_left,int speed_right)//小车左转
{
	
	speed_left(speed_left);
	speed_right(speed_right);
	GPIO_ResetBits(GPIOB, GPIO_Pin_9);
  GPIO_ResetBits(GPIOB,GPIO_Pin_8);
	GPIO_SetBits(GPIOB, GPIO_Pin_4);
  GPIO_ResetBits(GPIOB,GPIO_Pin_5);

}


void Car_right(int speed_left1,int speed_right1)//小车右转
{
	speed_left(speed_left1);
	speed_right(speed_right1);
	GPIO_SetBits(GPIOB, GPIO_Pin_9);
  GPIO_ResetBits(GPIOB,GPIO_Pin_8);
	GPIO_ResetBits(GPIOB, GPIO_Pin_4);
  GPIO_ResetBits(GPIOB,GPIO_Pin_5);
}	

void Car_stop(void)
{
	GPIO_ResetBits(GPIOB,GPIO_Pin_8);//左边电机
	GPIO_ResetBits(GPIOB,GPIO_Pin_9);
	GPIO_ResetBits(GPIOB,GPIO_Pin_4);//右边电机
	GPIO_ResetBits(GPIOB,GPIO_Pin_5);
}

void Cra_left_revolve(int speed_left2,int speed_right2)//小车左直角转弯
{
	speed_left(speed_left2);
	speed_right(speed_right2);
	GPIO_ResetBits(GPIOB,GPIO_Pin_8);//右边电机前进 8=0,9=1
	GPIO_SetBits(GPIOB,GPIO_Pin_9);
	GPIO_ResetBits(GPIOB,GPIO_Pin_4);//左边电机后退4=0,5=1
	GPIO_SetBits(GPIOB,GPIO_Pin_5);
}	

void Cra_right_revolve(int speed_left3,int speed_right3)//小车右直角转弯
{
	speed_left(speed_left3);
	speed_right(speed_right3);
	GPIO_ResetBits(GPIOB,GPIO_Pin_8);//右边电机前进 8=0,9=1
	GPIO_SetBits(GPIOB,GPIO_Pin_9);
	GPIO_ResetBits(GPIOB,GPIO_Pin_4);//左边电机后退4=0,5=1
	GPIO_SetBits(GPIOB,GPIO_Pin_5);
}	


//延迟一秒函数
/****************************************************************************************************************/
void delay_s(int s)
{
	for(;s>0;s--)
	{
	delay_ms(1000);
	}
}
/****************************************************************************************************************/

motor.h

#ifndef __MOTOR_H__
#define __MOTOR_H__

//需要调用的库
#include "stm32f10x_rcc.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_tim.h"
#include "delay.h"

//宏定义
#define PERIOD 10  //周期为10ms,频率为1Khz

#define speed_left(speed)  {TIM_SetCompare2(TIM4, speed);}
#define speed_right(speed)  {TIM_SetCompare1(TIM4, speed);}

//自定义的函数
void motor_GPIO_init(void);
void motor_pwm_TIME4_init(int presc,int arr);
void Car_stop(void);
void Car_gostright(int speed);//小车直走
void Car_back(int speed);//小车后退
void Car_left(int speed_left,int speed_right);//小车左转
void Car_right(int speed_left1,int speed_right1);//小车右转
void Cra_left_revolve(int speed_left2,int speed_right2);//小车原地左转
void Cra_right_revolve(int speed_left2,int speed_right2);//小车原地右转
void Car_fllow(void);
void delay_s(int s);

#endif

follow.c

#include "followline.h"
#include "motor.h"
void Car_fllow(void)
{
	while(1)
	{
	int L1=1,L2=1,R1=1,R2=1;
	L1=GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_13);
	L2=GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_14);
	R1=GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_15);
	R2=GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_12);
	if(L1==1&&L2==0&&R1==0&&R2==1)//直行
	{
		Car_gostright(250);
		delay_ms(80);
	}
	else if((L1==1&&R1==1 )||(R1==1))//左转
	{
		
		Car_left(0,250);
		delay_ms(80);
	}
	else if((L1==1&&L2==1&&R1==0&&R2==1)||(L1==1))//右转
	{
		Car_right(250,0);
		delay_ms(80);
	}
	else if((L1==0&&L2==0&&R1==0&&R2==1)||(L2==0&&R2==1))//左直角转弯
	{
		Cra_left_revolve(250,250);
		delay_ms(80);
	}
	else if((L1==1&&L2==0&&R1==0&&R2==0)||(R2==0&&L2==1))//右直角转弯
	{
		Cra_right_revolve(250,250);
		delay_ms(80);
	}
	else if(L1==1&&L2==1&&R1==1&&R2==1)//左直角转弯
	{
	  Cra_right_revolve(250,250);
		delay_ms(80);
	}
	else
	{
		Car_gostright(250);
	  delay_ms(80);
	}
	
}
}

 follow.h

#ifndef __FOLLOWLINE_H__
#define __FOLLOWLINE_H__

#include "stm32f10x_gpio.h"

//读取四个传感器的值
#define right_2  GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_12)
#define right_1  GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_15)
#define left_2   GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_14)
#define left_1   GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_13)

void followline_gpio_init(void);
void Car_fllow(void);
//void followline_function(int conut1,int count2);
 
#endif

写在最后!!!一般逻辑没问题,主要调试参数,不要一直修改程序逻辑, 调调传感器灵敏度啊,或则改改速度啊。

以上是关于项目五:基于stm32f103的寻迹小车的主要内容,如果未能解决你的问题,请参考以下文章

STM32开发STM32F103 功能应用 —— NTC 温度采集

STM32F103五分钟入门系列时钟框图+相关寄存器总结+系统时钟来源代码(寄存器)

基于STM32F103c8t6的智能垃圾桶项目

基于STM32F103c8t6的智能垃圾桶项目

基于STM32F103c8t6的智能垃圾桶项目

STM32F103五分钟入门系列(十六)输入捕获(精雕细琢-.-)