Skip to content

智能小车

智能车官网:http://www.smartcarrace.com/

秘书长 卓晴老师csdn:https://blog.csdn.net/zhuoqingjoking97298

卓晴老师微信公众号:TsinghuaJoking

电机

电机种类

1.直流有刷电机

特点:

  • 结构简单,成本低,控制方便(直接通过电压调节转速)
  • 存在电刷磨损问题,寿命较短,效率较低

适用场景:

  • 教育类智能小车(如Arduino、树莓派项目)的轮子驱动。
  • 适合对成本和简易性要求高的场景。

2.直流减速电机(带齿轮箱)

特点:

  • 在普通直流电机基础上增加减速齿轮箱,降低转速、提高扭矩。
  • 体积稍大,但更适合驱动负载较重的智能小车。

适用场景:
- 需要低速高扭矩的场合(如爬坡、载重小车)。
- 常见于竞速机器人或需要稳定驱动的项目。

3.步进电机

特点:

  • 通过脉冲信号控制旋转角度,定位精度高,无需编码器即可实现位置控制。
  • 低速时扭矩大,但高速性能较差,可能存在失步问题。

适用场景:
- 需要精确控制移动距离的应用(如机械臂、传送带)。
- 在智能小车中较少用于驱动轮子,更多用于特殊功能部件(如云台、传感器扫描机构)。

4.伺服电机(舵机)

特点:
- 集成控制电路,可精确控制旋转角度(通常0°~180°)。
- 扭矩较小,适合小范围运动控制。

适用场景:
- 智能小车的转向控制(如舵机转向轮)。
- 机械臂关节、摄像头角度调整等需要角度反馈的场景。

5.直流无刷电机

特点:
- 高效率、长寿命(无电刷磨损),支持高速运转。
- 控制复杂,需配套电子调速器(ESC),成本较高。

适用场景:
- 高端智能小车或竞赛级模型(如高速竞速车、无人机载具)。
- 需要长时间运行或高功率输出的场景。

如何选择

选择电机的关键因素:

  1. 扭矩与转速:根据小车负载和移动速度需求选择。
  2. 控制方式:PWM控制(直流电机)、脉冲信号(步进电机)或角度反馈(伺服电机)。
  3. 电源与效率:电池供电的小车需考虑电机效率(无刷电机更省电)。
  4. 成本与复杂度:教育项目倾向低成本方案(直流电机),工业项目可能选无刷电机。

典型应用示例:

  • 轮式驱动:直流减速电机(如L298N驱动模块控制的电机)。
  • 转向控制:舵机(如SG90小型伺服电机)。
  • 精准移动:步进电机(如28BYJ-48型步进电机)。
  • 高性能需求:无刷电机搭配电子调速器(如航模无刷电机)。

驱动芯片

参数 TB6612FNG DRV8833 L298N
最大电压 15V 11V 46V
持续输出电流 1.2A(单通道) 1.5A(单通道) 2A(单通道)
峰值电流 3.2A(短时) 2A(短时) 3A(短时)
控制方式 PWM/方向控制 PWM/相位使能 PWM/方向控制
效率 >90%(低发热) >85% ~70%(高发热)
封装 HSSOP24(紧凑型) WQFN16(微型) Multiwatt15(散热片)
优势 1、支持双通道独立控制,可驱动2个直流电机或1个步进电机。
2、内置短路保护、过热保护及低电压检测。
3、低电压工作范围(2.5V-15V),兼容3.3V/5V逻辑电平。
1、超小封装,适合空间敏感型设计(如机器人、微型无人机)。
2、支持双路H桥,可并联输出以提高电流(最高3A)。
3、低静态功耗(<1μA),适合电池供电设备。
1、高电压耐受性(最高46V),适合大功率电机驱动。
2、模块化设计自带散热片,扩展接口丰富(如外接电流检测)。
3、成本低廉,适合教育及原型开发。
劣势 1、最大电压受限,不适合高压电机场景。 1、电压范围较窄,高温环境下易触发保护。 1、效率低、发热严重,需额外散热措施。
芯片 适用场景 不适用场景
TB6612FNG 移动机器人、微型智能车、高精度舵机控制 高压大电流电机(如工业电机)
DRV8833 微型无人机、便携式设备、低功耗IoT终端 高功率电机、高温环境
L298N 教育实验、低成本机器人、大扭矩电机驱动 高精度控制、电池敏感型设备

选型建议:

  • 优先TB6612FNG:需高效率和可靠保护的场景(如竞赛机器人)。
  • 优先DRV8833:空间和功耗敏感型设计(如穿戴设备)。
  • 优先L298N:低成本、大功率原型开发(如学生项目)。

总结:

三者差异核心在于 效率、功率密度与成本:

  • TB6612FNG在平衡性上最优,DRV8833胜在微型化,L298N则以高性价比适配大功率需求。
  • 实际选型需结合电压、电流、空间及散热条件综合评估。

电机驱动

电机驱动板可以通过如下两种方式对直流电机的速度和旋转方向进行控制

  1. H 桥 – 控制电机旋转方向(前进、后退、停止)
  2. PWM – 控制电机速度

L298N驱动原理

L298N是 常用的直流电机驱动芯片

对于需要大电流的外部硬件,不能直接由单片机为其提供驱动电流,必须添加相应的驱动模块,单片机的IO引脚作为数字控制信号,通过驱动模块控制外部硬件的工作,由驱动模块负责为外部硬件提供驱动电流。

L298N芯片中集成了桥A和桥B两个全桥驱动电路,可以分别控制一个直流电机的运动。

image-20250306105459554

H桥

image-20250306105123635

H桥 ,英文名H-Bridge,是一个经典的直流电机控制电路。电路包含四个开关Q1、Q2、Q3、Q4,D1、D2、D3、D4是MOS-FET的续流二极管,负载电机M处于中心,形成H形结构,可以通过同时激活两个特定的开关来改变电流的方向,从而实现对电机的旋转方向进行控制。

PWM调速

脉冲宽度调制(Pulse Width Modulation),简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。

PWM的频率:

是指1秒钟内信号从高电平到低电平再回到高电平的次数(一个周期),也就是说一秒钟PWM有多少个周期。

单位: Hz

控制电机PWM频率也是有讲究的,太低电机转得不流畅,太高会产生高频干扰,所以频率一般选取15KHz左右。

PWM调速:

占空比(Duty Cycle) 是一个脉冲周期内,高电平的时间与整个周期时间的比例

单位: % (范围:0%-100%)

image-20250306105947760

单片机的IO口输出的是数字信号,IO口只能输出高电平和低电平。

通过改变IO口输出的方波的占空比,从而获得使用 数字信号模拟成的模拟电压 信号。

编程调试

电机加减速 ——> 改变PWM的占空比,利用定时器中断,实现PWM。

1.PWM的周期、频率计算

假设单片机的晶振是12MHz,一个机器周期为:\(12/12*10^6=1us\)(一个机器周期=12个晶振周期)

设定时器每 \(100us\) 触发一次中断,100次中断做为一个PWM的周期,PWM的周期为:\(100us*100=10ms\),频率为:\(1/10ms=100Hz\)

2.定时器初值计算

使用定时器0的8位重装模式,如果定时100us,则初值:TL0=TH0=28-100=156(0x9C)

3.占空比调节

pwm_duty变量范围0-100,对应0%-100%占空比,通过外部输入如按键,或者内部计算可动态修改该值。

代码DEMO:

#include <reg52.h>  // 包含8051寄存器定义

// 硬件定义
sbit PWM_OUT = P1^0;  // PWM输出引脚(接电机驱动信号端)
sbit MOTOR_A = P1^1;  // 电机方向控制A
sbit MOTOR_B = P1^2;  // 电机方向控制B

// 全局变量
unsigned char pwm_duty = 50;  // 初始占空比50%
unsigned int timer_cnt = 0;   // 定时器中断计数器

/* 定时器0初始化 */
void Timer0_Init(void)
{
    TMOD |= 0x02;  // 模式2,8位自动重装
    TH0 = 0x9C;    // 100us中断周期(12MHz晶振)
    TL0 = 0x9C;
    ET0 = 1;       // 允许定时器0中断
    EA = 1;        // 开总中断
    TR0 = 1;       // 启动定时器
}

/* PWM输出中断服务程序 */
void Timer0_ISR(void) interrupt 1
{
    timer_cnt++;
    if(timer_cnt >= 100) timer_cnt = 0;  // 1kHz周期(100*100us)
    PWM_OUT = (timer_cnt < pwm_duty) ? 1 : 0;
}

/* 电机方向控制 */
void Motor_DirCtrl(unsigned char dir)
{
    switch(dir) {
        case 0:  // 正转
            MOTOR_A = 1;
            MOTOR_B = 0;
            break;
        case 1:  // 反转
            MOTOR_A = 0;
            MOTOR_B = 1;
            break;
        default:  // 停止
            MOTOR_A = 0;
            MOTOR_B = 0;
    }
}

void main(void)
{
    Timer0_Init();  // 初始化PWM
    Motor_DirCtrl(0);  // 默认正转

    while(1) {
        // 此处可添加占空比控制逻辑
        // 例如通过按键调整pwm_duty值(0-100)
    }
}

优化建议:

void main(void)
{
    Timer0_Init();  // 初始化PWM
    Motor_DirCtrl(0);  // 默认正转

    while(1)
    {
        // 限制占空比范围
        if(pwm_duty > 100) pwm_duty = 100;
        if(pwm_duty < 0) pwm_duty = 0;

        // 可添加软启动功能
        static char step = 1;
        pwm_duty += step;
        if(pwm_duty >= 100 || pwm_duty <= 0) step = (-1) * step;
        Delay_ms(50);  // 速度渐变间隔
    }
}
  1. 电机功率较大时需添加光耦隔离
  2. PWM频率建议在5-20kHz之间减少电机啸叫,一般为15KHz
  3. 使用STC12C5A60S2等增强型芯片可直接硬件PWM