总结:传感器工作原理代码段介绍 电机初始化 延迟初始化 电机引脚初始化 跟踪引脚初始化。 电机引脚初始化函数定义了引脚的结构,打开要使用的时钟,关闭引脚的特殊功能,并配置引脚驱动电机的参数。 设置红外传感器引脚参数。
前言:传感器工作原理:
代码部分:
main.c
#include "motor.h"#include #include "lay.h"#include "stm32f10x.h"#include "followline.h"#include "Ultrasound.h" U8 UART3_DATA, UART1_DATA; U8 UART3_RCV[20], UART3_RCV_COUNT; U8 UART1_RCV[50], UART1_RCV_COUNT, UART1_FINISH; VOID (VOID) { Motor_PW m_time4_init (71,999); // 延时初始化 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引脚初始化函数/************************************************ ****************************************************/voidmotor_GPIO_init(void){//定义引脚结构体 GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitTypeDef GPIO_InitStruct_C,GPIO_InitStruct_B;//打开时钟使用 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC, ); PeriphClockCmd(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 = IO_Pin ;GPIO_InitStruct.GPIO_Speed = GPIO_SPEED_ 50MHz; // 初始化PB6/7管脚gpio_init(GPIOB,&GPIO_INITSTRUCT)。 // 所有管道均设置为零 GPIO_RESETBIT(GPIOB、GPIO_PIN_8)。 GPIO_RESETBITS IP,gpio_pin_9);gpio_resetbits(gpioB,gpio_pin_4);gpio_resetbits(GPIOB,GPIO_Pin_5);}/**************************** ****************************************************** ************** ********** ****** ******************/ //TIME4初始化函数/***** ************ ****** ******************** ************ *********** ******* ******************/空白motor_pwm_TIME4_init(int presc,int arr){ //定时器定义TIM_TimeBaseInitTypeDef结构体 TIM_TimeBaseInitStruct; //定义定时器PWM输出通道结构体。 主体 TIM_OCInitTypeDefinition TIM_OCInitStruct; //打开TIME4时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); //设置TIME4结构体的参数 TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMo de_Up; _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; InitStruct.TIM _Pulse =0; //TIME4通道1初始化TIM_OC1Init (TIM4, &TIM_OCInitStruct); //启用 TIME4 通道 1 的预载寄存器 TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable); //初始化 TIM4 通道 2 TIM_OC2Init(TIM4, &TIM_OCInitStruct); //启用预载寄存器 TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable); TIM_OC2PreloadConfig( TIM4、TIME4 TI 用于通道 2)M_OCPreload_Enable); //启用 TIME4 TIM_Cmd(TIM4, ENABLE);}/************************************ *** ***** * ********************************************* ************* ***** **********************/void Car_gostright(int Speed)//直行function {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);OB,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 =1GPIO_SetBits(GPIOB ,GPIO_Pin_9);GPIO_ResetBits(GPIOB,GPIO_Pin_4);//左电机缩回 4=0,5=1GPIO_SetBits(GPIOB,GPIO_Pin_5);}void Cra_right_revolve(int Speed_left3 ,int Speed_right3)/ /汽车以直角右转 {speed_left(speed_left3) ;speed_right(GPIO_ResetBits(GPIOB,GPIO_Pin_8);//右电机向前移动 8=0,9=1GPIO_SetBits(GPIOB,GPIO_Pin_9);GPIO_ResetBits(GPIOB,GPIO_Pin_4);//左电机向后移动 4=0,5 =1GPIO_SetBits(GPIOB) , speed speed GPIO_Pin_5);}//1秒延时函数/**************************************** ********************************************************* ****************************************************** *********/void Late_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 " lay.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);voidmotor_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 Late_s(int s);#endif
follow.c
#include "followline.h" #include “电机.h”void Car_flow( 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);lay_ms(80) ; }否则如果((L1==1&&R1==1 )||(R1==1))//左转 {Car_left(0,250);lay_ms(80);}else if((L1==1&&L2==1&&R1==0&&R2==1 ) )||(L1==1))//右转 {Car_right(250,0);lay_ms(80);}else if((L1==0&&L2==0&&R1==0&&R2==1)||( L2 = =0&&R2==1))//左直角旋转 {Cra_left_revolve(250,250);lay_ms(80);}else if((L1==1&&L2==0&&R1==0&&R2==0)||(R2= =0&&L2 = =1))//右转{Cra_right_revolve(250,250);lay_ms(80);}else if(L1==1&&L2==1&&R1==1&&R2==1)//左转{Cra_right_revolve(250,250) ); 延迟 _ms(80);}else{Car_gostright(250); Late_ms(80);}}}
follow.h
#ifndef __FOLLOWLINE_H__#define __FOLLOWLINE_H__#include "stm32f10x_gpio.h"//4传感器读取值#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
写在最后! ! 一般逻辑是没问题的。 关键调试参数并不总是改变程序逻辑。 您可以调整传感器的灵敏度并改变速度。
评论前必须登录!
注册