前言:傳感器作業原理:

代碼部分:
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
寫在最后!!!一般邏輯沒問題,主要除錯引數,不要一直修改程式邏輯, 調調傳感器靈敏度啊,或則改改速度啊,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/297921.html
標籤:其他
下一篇:STM32--CAN通訊實驗
