基于stm32f103c8t6的智能小车

本文介绍了如何使用STM32单片机制作一辆智能小车,涉及步进电机的驱动、5路灰度传感器进行循迹以及舵机控制。通过简单的脉冲信号和GPIO控制实现电机转动,利用灰度传感器检测黑线进行路径调整。代码示例展示了电机驱动和循迹逻辑的实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

学了stm32后,自己动手完成一辆智能小车的制作,主要内容有5步进电机驱动、路灰度循迹、舵机控制等。

目录

所用到的硬件有:

首先是如何驱动步进电机

步进电机驱动方法

代码编写:

电机驱动板的接线

​编辑  

使能驱动

5路灰度传感器工作原理

循迹逻辑

代码编写:

总结



所用到的硬件有:

  1. stm32f103c8t6单片机
  2. 5路数字灰度传感器模块
  3. 42步进电机
  4. LV8731V步进电机驱动模块

首先是如何驱动步进电机

步进电机驱动方法

        最​基本的方法有3种,单4拍法、双4拍法、单双8拍法。但我们在这里不细讲,只讲我们怎么做能让步进电机动起来。

        要想让步进电机动起来,关键是要给它脉冲信号。我们可以通过PWM来输出脉冲信号,当然我们可以用更简单的for循环+GPIO高低电平+延时实现脉冲信号的输出以驱动步进电机。

        我们现在采用的思路是更简单的后者。

代码编写:

void Car_Go()
{
		GPIO_WriteBit(MOTOR_GPIO_PORT, DA, Bit_RESET);    //DA表示电机A的方向引脚,使用时,我这边是置低电平为前进方向
		GPIO_WriteBit(MOTOR_GPIO_PORT, DB, Bit_SET);	  //大家可根据自己的实际情况调整电机转动方向
		GPIO_WriteBit(MOTOR_GPIO_PORT, DC, Bit_SET);	  
		GPIO_WriteBit(MOTOR_GPIO_PORT, DD, Bit_RESET);    
	for (int a=0;a<500;a++)
	{
		GPIO_WriteBit(MOTOR_GPIO_PORT, VA, Bit_SET);	  //VA表示电机A的速度引脚
		GPIO_WriteBit(MOTOR_GPIO_PORT, VB, Bit_SET);	  //需要置高电平一段时间再置为低电平一段时间以输出脉冲信号
		GPIO_WriteBit(MOTOR_GPIO_PORT, VC, Bit_SET);		
		GPIO_WriteBit(MOTOR_GPIO_PORT, VD, Bit_SET);
		delay(2);										  //延时2ms
		GPIO_WriteBit(MOTOR_GPIO_PORT, VA, Bit_RESET);
		GPIO_WriteBit(MOTOR_GPIO_PORT, VB, Bit_RESET);
		GPIO_WriteBit(MOTOR_GPIO_PORT, VC, Bit_RESET);
		GPIO_WriteBit(MOTOR_GPIO_PORT, VD, Bit_RESET);
		delay(2);										  //延时2ms
	}
}

延时函数可这样写:

void delay(int n)
{
    volatile int i;
    while (n--)
    {
        i = 12000;
        while (i--);
    }
}

电机驱动板的接线

        LV8731V驱动接线相对来说,比较简单,直接按照对应的接线端口插上去即可。如图:

  

使能驱动

        现在要想让电机动起来还需要使能我们的LV8731V驱动板,也就要给驱动板上的ST引脚置高电平

5路灰度传感器工作原理

        其实很简单 未碰到黑线(红灯亮):对应引脚状态 = 0
                           碰到黑线(红灯灭):对应引脚状态 = 1

循迹逻辑

        当小车向偏右离(黑线)时,左侧循迹红灯灭,引脚状态为1,表示车辆向右偏离黑线,车辆需要向左行驶以调整车辆沿着黑线行驶。

代码编写:

void Find(void)
{
	

	if(L2==0&&L1==0&&M!=0&&R1==0&&R2==0&&S==0)  //左右都没有检测到黑线
  {
    Car_Go();
  }

  else if(L2!=0&&L1==0&&R1==0&&R2==0)  //左边检测到黑线
  {
	 Car_Turn_Left();
  }
  else if(L2==0&&L1!=0&&R1==0&&R2==0)  //左边检测到黑线
  {
    Car_Turn_Left();
  }

   else if(L2==0&&L1==0&&R1!=0&&R2==0)  //右边检测到黑线
  {
	      Car_Turn_Right();
  }
   else if(L2==0&&L1==0&&R1==0&&R2!=0)  //右边检测到黑线
  {
	  Car_Turn_Right();
    
  }
   else if(L2!=0&&L1!=0&&R1!=0&&R2!=0)  
  {
	  Car_Go();
  }
   else if(L2==0&&L1==0&&M==0&&R1==0&&R2==0)  
  {
    
  }
  
  else
  {
	  Car_Go();
  }
}
  

舵机控制方面呢,我们下次再讲^-^

源码已上传,欢迎大家下载~(点击下方可查看)

https://download.csdn.net/download/jxdexg/89157633

总结

        本次项目主要运用到的知识:GPIO的使用,delay延时函数的编写,利用for循环驱动步进电机,读取IO口引脚状态,if分支语句判断循迹状态。

    最后,感谢大家的阅读,祝大家学习愉快。

        如有错误,敬请斧正~

        编写不易,多多支持~

   

        

### 五路灰度循迹小车在十字路口的行为与原理 对于五路数字灰度传感器而言,当识别到黑线时返回的数字量为0,而识别到白色则返回1[^1]。这意味着,在遇到不同颜色交界处(如十字路口),传感器会根据地面的颜色变化产生不同的信号。 #### 十字路口行为分析 在十字路口场景下,假设黑色代表道路边界,白色或其他浅色表示可通行区域: - 当车辆沿一条路径行驶并接近十字路口时,部分传感器可能会突然从检测到黑色变为白色,这表明遇到了新的分支方向。 - 如果所有五个传感器都读取到了白色的数值,则意味着小车正处于交叉口中心位置;此时可以根据预设逻辑决定前进方向,比如直行、左转或右转。 #### 控制策略实现方法 为了使小车能够顺利处理十字路口的情况,通常采用以下几种方式之一来编程控制其动作: 1. **基于计数器的方法** 可以为每种可能的方向设置特定的状态机状态,并利用计数器记录经过黑白边缘的数量以判断当前所处的位置以及即将采取的动作。 2. **模式匹配算法** 将各个时刻接收到的数据序列化并与已知的标准模型相比较,从而推断出最佳行动方案。例如,如果连续几个周期内中间三个通道始终处于高电平(即白色),那么很可能是在一个宽阔的地方,可能是十字路口中央。 3. **PID控制器调节速度差** 结合左右两侧轮子的速度差异来进行微调,确保即使存在轻微偏差也能保持稳定轨迹。特别是在转弯过程中尤为重要,因为需要精确控制转向角度和曲率半径。 ```c if (sensor_values[2] == 1 && sensor_values[3] == 1 && sensor_values[4] == 1) { // 中间三个传感器均检测到白色,认为到达十字路口 decide_next_direction(); } ```
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱学习de祥哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值