基于STM32F103的红外循迹 超声波避障小车

这篇具有很好参考价值的文章主要介绍了基于STM32F103的红外循迹 超声波避障小车。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

单片机:stm32f103

传感器:普通红外(我用了4个)

超声波:HC-SR04

舵机:SG90

目标:可以循黑线(十字直行)、并避障

如果硬件配置和我一样以下代码可直接使用,用我配置的引脚即可。

亲测好用。

复制代码的同时请点个赞,多谢!

一、超声波代码

.c

#include "Ultrasonic.h"
#include "stm32f10x.h"
#include "delay.h"
#include "usart.h"
/*记录定时器溢出次数*/
uint overcount=0;

/*设置中断优先级*/
void NVIC_Config(void)
{
    NVIC_InitTypeDef NVIC_InitStructure;//定义中断初始化结构体
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//选择中断分组
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;//设置 抢占优先级
    NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;//设置子优先级
    NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn;//设置子优先级
    NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
    NVIC_Init(&NVIC_InitStructure);//中断初始化
}
/*初始化模块的GPIO以及初始化定时器TIM2*/
void Ultrasonic_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;//中断初始化
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;//定义定时器初始化结构体
    RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE);//开GPIO 外设时钟 
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);//开Timer外设时钟
    /*TRIG触发信号*/
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//配置输出口速率 
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//配置输出模式为推挽
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4;//设置为引脚PA.4 
    GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化PA.4

    /*ECOH回响信号*/
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;//配置输入模式 
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3;//设置引脚号PA.3 
    GPIO_Init(GPIOA, & GPIO_InitStructure);//初始化PA.3

    /*定时器TIM2初始化*/
    TIM_DeInit(TIM2);
    TIM_TimeBaseInitStructure.TIM_Period=999;//定时周期为1000
    TIM_TimeBaseInitStructure.TIM_Prescaler=71; //分频系数72 
    TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;//不分频 
    TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;//计 数器向上计数模式 
    TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);//初始化Timer2
  TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//开启更新中断 
    
  NVIC_Config();//初始化中断分组配置 
    TIM_Cmd(TIM2,DISABLE);//关闭定时器使能

}
float Senor_Using(void)
{
    float length=0,sum=0;
    u16 tim;
    uint i=0;
    /*测5次数据计算一次平均值*/
    while(i!=3)
    {
        PAout(4)=1; //拉高信号,作为触发信号
        delay_us(20); //高电平信号超过10us
        PAout(4)=0;
        /*等待回响信号*/
        while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_3)==RESET);
        TIM_Cmd(TIM2,ENABLE);//回响信号到来,开启定时器计数

        i+=1; //每收到一次回响信号+1,收到5次就计算均值
        while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_3)==SET);//回响信号消失
        TIM_Cmd(TIM2,DISABLE);//关闭定时器

        tim=TIM_GetCounter(TIM2);//获取计TIM2数寄存器中的计数值,一边计算回响信号时间

        length=(tim+overcount*1000)/58.0;//通过回响信号计算距离

        sum=length+sum;
        TIM2->CNT=0; //将TIM2计数寄存器的计数值清零
        overcount=0; //中断溢出次数清零
        delay_ms(10);
    }
    length=sum/3;
    return length;//距离作为函数返回值
}
void TIM2_IRQHandler(void) //中断,当回响信号很长是,计数值溢出后重复计数,用中断来保存溢出次数
{
    if(TIM_GetITStatus(TIM2,TIM_IT_Update)!=RESET)
     {
    TIM_ClearITPendingBit(TIM2,TIM_IT_Update);//清除中断标志
    overcount++;

     }
}

.h

#ifndef __Ultrasonic_H
#define    __Ultrasonic_H

#include "stm32f10x.h"
#include "delay.h"

#include "sys.h"
#define uint unsigned int
#define TRIG_Send PAout(4)//定义触发信号TRIG引脚
#define ECHO_Receive PAin(3) //定义回响信号ECHO引脚


void Ultrasonic_Init(void);  //超声波模块相关配置初始化
float Senor_Using(void);  //测距函数,返回值即为距离
void NVIC_Config(void);   //中断配置
#endif

二、舵机控制

.c

#include "SteeringMotor.h" 
#include "delay.h"
//初始化PA2引脚
void Steer_pwm_init(void)
{ 
    GPIO_InitTypeDef GPIO_InitStructure; //声明一个结构体变量,用来初始化GPIO
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;//声明一个结构体变量,用来初始化定时器
    TIM_OCInitTypeDef TIM_OCInitStructure;//根据TIM_OCInitStruct中指定的参数初始化外设TIMx
    /* 开启时钟 */
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
    /* 配置GPIO的模式和IO口 */
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;// PB0
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽输出
    GPIO_Init(GPIOB,&GPIO_InitStructure);
    /*TIM2定时器初始化*/
    TIM_TimeBaseInitStructure.TIM_Period = 199; //PWM 频率=72000/(199+1)=36Khz//设置自动重装载寄存器周期的值
    TIM_TimeBaseInitStructure.TIM_Prescaler = 7199;//设置用来作为TIMx时钟频率预分频值
    TIM_TimeBaseInitStructure.TIM_ClockDivision = 0;//设置时钟分割:TDTS= Tck_tim
    TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
    //TIM向上计数模式
    TIM_TimeBaseInit(TIM3, & TIM_TimeBaseInitStructure);
    /*PWM初始化*/ //根据TIM_OCInitStruct中指定的参数初始化外设TIMx
    TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;
    TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;//PWM输出使能
    TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;
    TIM_OC3Init(TIM3,&TIM_OCInitStructure);//Timer2 CH3
    //注意此处初始化时TIM_OC1Init而不是TIM_OCInit,否则会出错。因为固件库的版本不一样。
    TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);//使能或者失能TIMx在CCR3上的预装载寄存器
    TIM_Cmd(TIM3,ENABLE);//使能或者失能TIMx外设
}
int steeringmotor(void)
{
    delay_init();
//    TIM2_PWM_Init(199,7199);//初始化PWM的周期
//    while(1)
//    {
//        delay_ms(10);
//        TIM_SetCompare3(TIM3,5);//设定占空比,舵机角度为0°中
//        delay_ms(1000);
//        TIM_SetCompare3(TIM3,15);//设定占空比,舵机角度为90°右
//        delay_ms(1000);
//        TIM_SetCompare3(TIM3,25); //设定占空比,舵机角度为180°左
//  }
}

.h

#ifndef __SteeringMotor_H
#define __SteeringMotor_H
#include "sys.h"
#include "stm32f10x.h"
void Steer_pwm_init(void); //舵机pwm初始化
#define   Steer_Right_90    TIM_SetCompare3(TIM3, 9)        //右转90度
#define   Steer_Right_45        TIM_SetCompare3(TIM3, 7)        //右转45度
#define   Steer_Front            TIM_SetCompare3(TIM3, 17)        //舵机摆正
#define   Steer_Left_45          TIM_SetCompare3(TIM3, 23)        //左转45度
#define   Steer_Left_90          TIM_SetCompare3(TIM3, 26 )  //左转90度
#endif

三、红外循迹代码

.c

#include "sensor.h"
void xunji_config(void)    
{
  GPIO_InitTypeDef GPIO_InitStructure;    
  RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE); // 使能PC端口时钟
  RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC, ENABLE); // 使能PC端口时钟
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_12 | GPIO_Pin_13  | GPIO_Pin_14 | GPIO_Pin_15;    //选择对应的引脚
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//配置GPIO模式,输入上拉       
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOB, &GPIO_InitStructure);  //初始化PB端口

   GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_3;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//配置GPIO模式,输入上拉       
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
   GPIO_Init(GPIOC, &GPIO_InitStructure);  //初始化PC端口
}
void Read_xunji_Date(void)
{
 xunji_1;
 xunji_2;
 xunji_3;
 xunji_4;
 xunji_5;
}

.h

#ifndef __sensor_H
#define    __sensor_H
#include "stm32f10x.h"
#define xunji_1 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_12)
#define xunji_2 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_13)
#define xunji_3 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)
#define xunji_4 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_15)
#define xunji_5 GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_3)
void xunji_config(void);
void Read_xunji_Date(void);  //读循迹模块返回的值
#endif

四、PWM控制小黄电机

.c

#include "motor.h"//1右前 2右后  3左前 4左后
#include "delay.h"
void CarGo(void)
{
  TIM_SetCompare1(TIM4 , 975);  //数值越大速度越慢
  TIM_SetCompare2(TIM4 , 1199);//后
  TIM_SetCompare3(TIM4 , 975);  
  TIM_SetCompare4(TIM4 , 1199);    //后
}
void CarGo2(void)
{
  TIM_SetCompare1(TIM4 , 920);  //数值越大速度越慢
  TIM_SetCompare2(TIM4 , 1199);//后
  TIM_SetCompare3(TIM4 , 920);  
  TIM_SetCompare4(TIM4 , 1199);    //后
}

void CarStop(void)
{
  TIM_SetCompare1(TIM4 , 1199);
  TIM_SetCompare2(TIM4 , 1199);
  TIM_SetCompare3(TIM4 , 1199);    
  TIM_SetCompare4(TIM4 , 1199);
}

void CarBack(void)
{
  TIM_SetCompare1(TIM4 , 1199);
  TIM_SetCompare2(TIM4 , 900);
  TIM_SetCompare3(TIM4 , 1199);    
  TIM_SetCompare4(TIM4 , 900);
}

void CarRight(void)
{
  TIM_SetCompare1(TIM4 , 900);
  TIM_SetCompare2(TIM4 , 1199);//右后
  TIM_SetCompare3(TIM4 , 790);//前左
  TIM_SetCompare4(TIM4 , 1199);//后
}

void CarBigRight(void)
{
  TIM_SetCompare1(TIM4 , 1199);
  TIM_SetCompare2(TIM4 , 975);//450
  TIM_SetCompare3(TIM4 , 740);
  TIM_SetCompare4(TIM4 , 1199);
}
void CarBigRight2(void)
{
  TIM_SetCompare1(TIM4 , 1199);
  TIM_SetCompare2(TIM4 , 850);//450
  TIM_SetCompare3(TIM4 , 740);
  TIM_SetCompare4(TIM4 , 1199);
}
void CaryuandiRight(void)
{
  TIM_SetCompare1(TIM4 , 1199);
  TIM_SetCompare2(TIM4 , 1199);
  TIM_SetCompare3(TIM4 , 450);
  TIM_SetCompare4(TIM4 , 1199);
}

void CarLeft(void)
{
  TIM_SetCompare1(TIM4 , 790);//右前
  TIM_SetCompare2(TIM4 , 1199);
  TIM_SetCompare3(TIM4 , 900);
  TIM_SetCompare4(TIM4 , 1199);//左  后
}

void CarBigLeft(void)
{
  TIM_SetCompare1(TIM4 , 715);
  TIM_SetCompare2(TIM4 , 1199);
  TIM_SetCompare3(TIM4 , 1199);
  TIM_SetCompare4(TIM4 , 890);
}
void CarBigLeft2(void)
{
  TIM_SetCompare1(TIM4 , 590);
  TIM_SetCompare2(TIM4 , 1199);
  TIM_SetCompare3(TIM4 , 1199);
  TIM_SetCompare4(TIM4 , 620);
}
void CarSpecialGo(void)
{
    TIM_SetCompare1(TIM4 , 900);  //数值越大速度越慢
  TIM_SetCompare2(TIM4 , 1199);//后
  TIM_SetCompare3(TIM4 , 1000);  
  TIM_SetCompare4(TIM4 , 1199);    //后
}
void CarSpecialPlusGo(void)
{
    TIM_SetCompare1(TIM4 , 880);  //数值越大速度越慢
  TIM_SetCompare2(TIM4 , 1199);//后
  TIM_SetCompare3(TIM4 , 1000);  
  TIM_SetCompare4(TIM4 , 1199);    //后
}
void CarSpecialLeft(void)
{
  TIM_SetCompare1(TIM4 , 700);//右前
  TIM_SetCompare2(TIM4 , 1199);//右后
  TIM_SetCompare3(TIM4 , 1199);//左前
  TIM_SetCompare4(TIM4 , 900);//左后
}
void CarSpecialRight(void)
{
  TIM_SetCompare1(TIM4 , 1199);//右前
  TIM_SetCompare2(TIM4 , 900);//右后
  TIM_SetCompare3(TIM4 , 750);//左前
  TIM_SetCompare4(TIM4 , 1199);//左后
}

void TIM4_PWM_Init(void)  //TIM4的pwm设置和相应的引脚设置
{
  GPIO_InitTypeDef GPIO_InitStructure;

  TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  TIM_OCInitTypeDef TIM_OCInitStructure; 
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4 , ENABLE);
  RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
  
  
  TIM_TimeBaseStructure.TIM_Period = 1199;
  TIM_TimeBaseStructure.TIM_Prescaler = 1999;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  TIM_TimeBaseInit(TIM4 , &TIM_TimeBaseStructure);
  
  //端口复用
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;   //初始化要用的B6/B7口
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;     
  GPIO_Init(GPIOB, &GPIO_InitStructure);   
  
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;   //初始化要用的口
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;     
  GPIO_Init(GPIOB, &GPIO_InitStructure);   
    
    
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 ;          //PB.10端口配置
    GPIO_Init(GPIOB, &GPIO_InitStructure);          //根据设定参数初始化GPIOB.10 
    GPIO_ResetBits(GPIOB,GPIO_Pin_10);                         
    
    
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;           //PB.11端口配置
    GPIO_Init(GPIOB, &GPIO_InitStructure);          //根据设定参数初始化GPIOB.11 
    GPIO_ResetBits(GPIOB,GPIO_Pin_11);        
        
  
  //PWM通道1
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  TIM_OCInitStructure.TIM_Pulse = 0;
  TIM_OC1Init(TIM4 , &TIM_OCInitStructure);
  TIM_OC1PreloadConfig(TIM4 , TIM_OCPreload_Enable);
  
  //PWM通道2
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  TIM_OCInitStructure.TIM_Pulse =0;
  TIM_OC2Init(TIM4 , &TIM_OCInitStructure);
  TIM_OC2PreloadConfig(TIM4 , TIM_OCPreload_Enable);
  
  //PWM通道3
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  TIM_OCInitStructure.TIM_Pulse = 0;
  TIM_OC3Init(TIM4 , &TIM_OCInitStructure);
  TIM_OC3PreloadConfig(TIM4 , TIM_OCPreload_Enable);
  
  //PWM通道4
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  TIM_OCInitStructure.TIM_Pulse = 0;
  TIM_OC4Init(TIM4 , &TIM_OCInitStructure);
  TIM_OC4PreloadConfig(TIM4 , TIM_OCPreload_Enable);
  TIM_Cmd(TIM4 , ENABLE);
}

.h

#ifndef __MOTER_H
#define    __MOTER_H


#include "stm32f10x.h"
#define ENA PBout(11)  
#define ENB PBout(10)

void TIM4_PWM_Init(void);
void CarGo(void);
void CarGo2(void);
void CarStop(void);
void CarBack(void);
void CarLeft(void);
void CaryuandiRight(void);
void CarBigLeft(void);  //大左转
void CarBigLeft2(void); 
void CarRight(void);
void CarBigRight(void);   //大右转
void CarBigRight2(void);
void CarSpecialLeft(void);
void CarSpecialGo(void);
void CarSpecialPlusGo(void);
void CarSpecialRight(void);
    #endif



五、main函数

1、解释

我的主函数有些啰嗦,以前写的,懒得改了。

大意就是:

分为两部分

第一部分代码表示循迹的时候可以避障

第一部分代码表示仅仅循迹

逻辑部分仅供参考!建议按自己的逻辑改改!!

已知:仅仅在直行的时候遇到一次障碍物

所以:我的避障在直行判断里面

if(b==0)(此为第一部分代码。b是标志位,目的是只执行一次避障)

{

if(直行判断)

{

直行

if(距离<30)(请按照实际情况修改参数)

{

避障逻辑(请按照实际情况修改逻辑)

b++;

}

}

if(其他判断)

{左、右转弯等等

}

}

if(b==1)(此为第二部分代码。b是标志位,目的是只执行一次避障)

{

正常循迹判断

}

2、代码

#include "led.h"
#include "delay.h"
#include "sys.h"
#include "Ultrasonic.h"
#include "motor.h"
#include "sensor.h"
#include "SteeringMotor.h" 


 int main(void)
{
//    float  length_res[5]={0};  //用来存放测距结果
    int a=0,b=0,c=0,d=0;
    char str[20];//用来存放浮点数字符
    SystemInit();    // 配置系统时钟为72M 
  delay_init();    //延时初始化        
    xunji_config();   //循迹初始化
  Ultrasonic_Init();
    TIM4_PWM_Init();
  Steer_pwm_init();
    while(1)
    {
         Read_xunji_Date(); //读循迹线值
                 //车前4个循迹模块从右到左分别是xunji_4,xunji_3,xunji_2,xunji_1
                //xunji_x=1白亮      x 2 3 x
if(b==0)
        {
            if(xunji_1==1&&xunji_2==0&&xunji_3==1&&xunji_4==1)//0100
                {
                CarRight(); //如果第二个读取到黑线,右转
                continue;
                }
                if(xunji_1==0&&xunji_2==1&&xunji_3==1&&xunji_4==1)//1000
                {
                CarBigRight();  //如果第一个读取到黑线,大右转
                continue;
                }
             if(xunji_1==1&&xunji_2==1&&xunji_3==0&&xunji_4==1)//0010
                {                  
                 CarLeft();//如果第三个读取到黑线,左转
                 continue; 
                }
                
                if(xunji_1==1&&xunji_2==1&&xunji_3==1&&xunji_4==0)//0001
                {
                CarBigLeft();   //如果第四个读取到黑线,大左转
                continue;                
                }
                
             if(xunji_1==1&&xunji_2==1&&xunji_3==1&&xunji_4==1)//0001
                {
                CarGo();    //如果都读取到白线,直走
                 if(Senor_Using()<30.00)//大 不撞
                    {
                        a++;
                        if(a==1)
                        {
                                        Steer_Front;
                                        delay_ms(700);    
                                        CarStop();
                                        delay_ms(700);        
                                        Steer_Right_90 ;
                                        delay_ms(700);
                                        CarSpecialLeft();
                                        delay_ms(530);                
                                        do
                                    {
                                        CarSpecialPlusGo();
                                        delay_ms(700);
                                    }while(Senor_Using()<50.00);
                                     CarStop();
                                     delay_ms(700);
                                     CarSpecialRight();
                                     delay_ms(670);
                                        do
                                    {
                                        CarSpecialPlusGo();
                                        delay_ms(1000);
                                    }while(Senor_Using()<50.00);
                                     CarStop();
                                     delay_ms(700);
                                     CarSpecialRight();   
                                     delay_ms(650);
                                    do
                                    {
                                        CarSpecialGo();
                                        delay_ms(100);
                                    }while(xunji_1== 1&&xunji_2==1&&xunji_3==1&&xunji_4==1&&xunji_5==0);
                                     CarStop();
                                    delay_ms(1000);
                                    Steer_Front;    
                                    delay_ms(700);         
                                     CarSpecialLeft();
                                     delay_ms(500);
                                    b++;
                        }
                    }
                }
                if(xunji_1==0&&xunji_2==0&&xunji_3==1&&xunji_4==1)
                {
                    CarBigRight();    //如果右侧都黑且左侧都白,大右
                    continue;
                }    
                    if(xunji_3==0&&xunji_4==0&&xunji_1==1&&xunji_2==1)
                    {
                            CarBigLeft();//如果左侧都黑且右侧都白,大左
                        continue;
                    }
                    if(xunji_3==0&&xunji_4==0&&xunji_1==1&&xunji_2==0)
                    {
                            CarBigLeft();//如果左侧都黑且右侧都白,大左
                        continue;
                    }
                    if(xunji_1==0&&xunji_2==0&&xunji_3==0&&xunji_4==1)
                {
                    CarBigRight();    //如果右侧都黑且左侧都白,大右
                    continue;
                }    

             if(xunji_1==0&&xunji_4==0&&xunji_3==1&&xunji_2==1)
             {
                        CarGo();
                }
              if(xunji_1==1&&xunji_4==1&&xunji_3==0&&xunji_2==0)
             {
                        CarGo();
                }
         }
if(b==1)
            {
                if(xunji_1==1&&xunji_2==0&&xunji_3==1&&xunji_4==1)//0100
                {
                CarRight(); //如果第二个读取到黑线,右转
                continue;
                }
                if(xunji_1==0&&xunji_2==1&&xunji_3==1&&xunji_4==1)//1000
                {
              CarBigRight2(); //如果第一个读取到黑线,大右转
                delay_ms(10);
                }
             if(xunji_1==1&&xunji_2==1&&xunji_3==0&&xunji_4==1)//0010
                {                  
                 CarLeft();//如果第三个读取到黑线,左转
                 continue; 
                }
                
                if(xunji_1==1&&xunji_2==1&&xunji_3==1&&xunji_4==0)//0001
                {
               CarBigLeft2();   //如果第四个读取到黑线,大左转
                    delay_ms(10);                
                }
                
             if(xunji_1==1&&xunji_2==1&&xunji_3==1&&xunji_4==1)//0001
                {
                CarGo2();    //如果都读取到白线,直走
                }
                if(xunji_1==0&&xunji_2==0&&xunji_3==1&&xunji_4==1)
                {
                    CarBigRight2();    //如果右侧都黑且左侧都白,大右
                        delay_ms(10);
                }    
                    if(xunji_3==0&&xunji_4==0&&xunji_1==1&&xunji_2==1)
                    {
                            CarBigLeft2();//如果左侧都黑且右侧都白,大左
                            delay_ms(10);
                    }
                    if(xunji_3==0&&xunji_4==0&&xunji_1==1&&xunji_2==0)
                    {
                            CarBigLeft2();//如果左侧都黑且右侧都白,大左
                            delay_ms(10);
                    }
                    if(xunji_1==0&&xunji_2==0&&xunji_3==0&&xunji_4==1)
                {
                    CarBigRight2();    //如果右侧都黑且左侧都白,大右
                        delay_ms(10);
                }    

             if(xunji_1==0&&xunji_4==0&&xunji_3==1&&xunji_2==1)
             {
                        CarGo2();
                }
              if(xunji_1==1&&xunji_4==1&&xunji_3==0&&xunji_2==0)
             {
                        CarGo2();
                }
        }
  }

}


.文章来源地址https://www.toymoban.com/news/detail-454164.html

到了这里,关于基于STM32F103的红外循迹 超声波避障小车的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32F103C8T6智能小车舵机超声波避障

    目录 一、定时器 计数和定时器中断  输出比较(PWM) 二、 舵机 三、超声波测距 四、主函数 总结 推荐的STM32学习链接:  [6-1] TIM定时中断_哔哩哔哩_bilibili [6-1] TIM定时中断是STM32入门教程-2022持续更新中的第13集视频,该合集共计29集,视频收藏或关注UP主,及时了解更多相关视

    2024年02月15日
    浏览(47)
  • STM32蓝牙小车、红外循迹小车、超声波避障小车项目设计

    本文旨在分享我学习STM32的过程中,为了强化学习成果,试着制作一些实训项目。最开始做的就是STM32蓝牙小车、STM32红外循迹小车、STM32超声波避障小车。 相信看完本文的你,一定可以亲手制作一辆属于自己的智能小车! 注:文末附源码工程,需要的读者可以至文末下载 如

    2024年01月20日
    浏览(42)
  • stm32f103基于pid的蓝牙循迹小车

    目录 前言 一、霍尔编码器以及定时器计数原理 二、使用pwm占空比对电机速度进行控制 三、使用systick的中断函数进行pid和速度的计算,还有oled的显示 四、常用的测速方法:  五、pid原理 六、oled的实现 七、蓝牙通信 八、3路循迹模块 总结   经过一个月对stm32的学习,终于完

    2024年02月16日
    浏览(45)
  • [STM32F103C8T6]基于stm32的循迹,跟随,避障智能小车

    目录 1.小车驱动主要是通过L9110S模块来驱动电机 motor.c 2.我们可以加入串口控制电机驱动(重写串口接收回调函数,和重定向printf) Uart.c main.c  3.点动功能 uart.c main.c 为什么使用的是HAL_Delay()要设置滴答定时器的中断优先级呢? 4.小车PWM调速,  6.跟随功能 7.避障功能 超声波测距

    2024年02月13日
    浏览(57)
  • 基于STM32的智能循迹避障小车实验(超声波部分)

    接上一篇基于STM32的智能循迹避障小车实验(舵机旋转部分) 最后这部分我们实现超声波部分和最后代码的整合 本部分实验采用的是 超声波模块 HC-SR04 ,它长这样:   买这个的时候最好再买一个支架,可以直接架在舵机上,探查周围的距离。 超声波模块有 4 个引脚 ,分别

    2024年02月07日
    浏览(47)
  • 基于STM32f103c8t6的简单红外巡迹避障小车制作

    (1)电源 电源模块选用的是18650锂电池(充电器及电池底座)、3.3v稳压模块。 (2)车模 淘宝最常见的智能车底。 (3)电机 买的智能车带有四个电机,选用L298N电机驱动板对电机进行驱动。 (4)巡迹及避障 巡迹选用四路红外模块实现,避障选用超声波模块HC-SR04实现。 (

    2023年04月15日
    浏览(45)
  • STM32系列(HAL库)——F103C8T6通过HC-SR04超声波模块实现测距

    (1)编程平台:Keil5 (2)CubeMX (3)XCOM(串口调试助手) (1)某宝买的超声波模块   (2)F1的板子,本例使用经典F103C8T6 (3)ST-link 下载器 (4)USB-TTL模块 (5)杜邦线若干 (1)模块简介:         超声波是振动频率高于20kHz的机械波。它具有频率高、波长短、绕射现象小、方向性好、能够成为射

    2024年02月02日
    浏览(50)
  • 基于FPGA的蓝牙遥控,超声波避障,红外循迹的智能小车

            闲来无事整个小车玩玩,设想的小车可以有蓝牙模块来控制模式切换,通过发送指令来更改相对应的功能,当避障的时候可以自动规避障碍物,当处于红外循迹时,可以跟随规划的轨迹前线,当手动遥控时可以控制前进后退左右转向停止等功能。         先介绍一下

    2024年02月07日
    浏览(49)
  • 基于STM32F407实现超声波测距(SR04)

    今天要实现的功能是超声波测距,这一功能在很多的地方都能用到,比如:在智能小车上可以添加超声波避障功能。今天需要用到SR04超声波模块,在使用这一模块的时候我很会接触到时序图。 模块如图所示: 模块有四个引脚 VCC 供 5V电源, GND 为地线, TRIG 触 发 控 制 信 号

    2024年02月11日
    浏览(57)
  • STM32f103入门(4)对射式红外传感器计次(外部中断)

    中断:在主程序运行过程中,出现了特定的中断触发条件 (中断源),使得CPU暂停当前正在运行的程序,转而去处理中断程序处理完成后又返回原来被暂停的位置继续运行 中断优先级:当有多个中断源同时申请中断时,CPU会根据中断源的轻重缓急进行裁决,优先响应更加紧急的中

    2024年02月11日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包