项目五:基于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 温度采集