摘要:前言传感器工作原理代码部分电机初始化延迟初始化电机管脚初始化寻迹管脚初始化。电机管脚初始化函数定义管脚的结构体打开所要使用的时钟将管脚特殊功能关掉配置管脚的参数,用于驱动电机。配置管脚的参数红外传感器。
前言:传感器工作原理:
代码部分:
main.c
#include "motor.h"#include #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.ucloud.cn/yun/119236.html
基于STM32f103c8t6和L292N驱动设计避障小车(核心函数的建立为自己所写) 一.项目感触 完成这个项目自己一开始也是无法从本身上出发,看着这个最小系统板和这个电机驱动模块上面想着怎样实现让这两块板子实现四个电机上面转动呢,还要加入避障模块,自己一开始一头雾水,于是开始了漫长的借鉴之路,首先作为一个开发者,我觉得学习的地方首选是B站,所以我找了相关的做智能小车的视频 首先是B站智能小车教...
摘要:灰度传感器利用不同颜色的检测面对光的反射程度不同的原理进行颜色深浅检测。这就是我们用的数字量灰度传感器。数字量的灰度传感器如果加入的是单片机处理数据,那么可以把得到的原始数据加入滤波算法数据混合算法得到一个波动小适应环境强的数字传感器。 文章目录 引言 1.寻迹传感器工作原理介绍 2.使用方...
摘要:文章目录一原理二实现显示中文滚动显示显示字符串读取温湿度显示温湿度三结果开机显示欢迎信息循环读取温湿度以及滚动显示我的四总结五参考六源码一原理的定义就是串行外围设备接口。 ...
摘要:带中文字库的是一种具有位位并行线或线串行多种接口方式,内部含有国标一级二级简体中文字库的点阵图形液晶显示模块其显示分辨率为。贴片按键模块支持标准的协议,完整的协议栈。以最低成本提供最大实用性,为功能嵌入其他系统提供无限可能。 项目简介 开发环境: Keil5.14,CubeMX6.0.1,主...
阅读 2653·2021-11-25 09:43
阅读 671·2021-11-12 10:36
阅读 4619·2021-11-08 13:18
阅读 2173·2021-09-06 15:00
阅读 3107·2019-08-30 15:56
阅读 929·2019-08-30 13:57
阅读 1987·2019-08-30 13:48
阅读 1416·2019-08-30 11:13