当前位置: 首页 > news >正文

用L9110S驱动模块和51单片机,从零搭建一辆能前后左右跑的小车(附完整代码)

用L9110S驱动模块和51单片机打造智能小车全攻略

第一次看到自己组装的小车在地面上灵活地前进、后退、转弯,那种成就感是难以言喻的。作为电子爱好者入门项目,智能小车制作不仅能让你掌握51单片机的基本编程,还能深入理解电机驱动原理。本文将带你从零开始,用最常见的L9110S驱动模块和STC89C52单片机,打造一辆能完成基本运动的小车。

1. 项目准备与硬件认识

1.1 所需材料清单

在开始前,确保你已准备好以下组件:

  • 核心控制器:STC89C52单片机开发板(或其他51系列)
  • 电机驱动:L9110S驱动模块(至少1个,建议2个)
  • 动力部分:直流减速电机(2个,带轮子)
  • 电源系统:18650锂电池两节(带电池盒)
  • 连接材料:杜邦线若干、锡焊工具
  • 车体结构:亚克力小车底盘(或自制木板底盘)

小技巧:初次尝试建议购买现成的小车底盘套件,可以省去机械结构调试的时间。

1.2 L9110S驱动模块详解

L9110S是一款专为控制和驱动电机设计的H桥集成电路,主要特点包括:

特性参数说明
工作电压2.5V-12V适合多种电机
峰值电流800mA驱动小型电机足够
控制方式双路H桥可独立控制两个电机
封装形式SOP8模块化设计方便使用

模块引脚功能示意图:

VCC -- 电源正极 (3.3-5V) GND -- 电源负极 A-1A -- 电机A控制线1 A-1B -- 电机A控制线2 B-1A -- 电机B控制线1 B-1B -- 电机B控制线2

注意:虽然开发板上有5V输出,但建议使用独立电源为L9110S供电,避免单片机电源不稳定导致复位。

2. 硬件连接与电路搭建

2.1 电机与驱动模块连接

正确的接线是项目成功的关键。按照以下步骤操作:

  1. 电机焊接

    • 将左侧电机两根线焊接到L9110S的A-1A和A-1B
    • 将右侧电机两根线焊接到B-1A和B-1B
    • 建议:用不同颜色线区分,方便后续调试
  2. 电源系统连接

    • 锂电池正极 → L9110S的VCC
    • 锂电池负极 → L9110S的GND → 单片机GND(共地)
  3. 控制信号连接

    • L9110S的A-1A → 单片机P3.4
    • L9110S的A-1B → 单片机P3.5
    • L9110S的B-1A → 单片机P3.2
    • L9110S的B-1B → 单片机P3.3
// 引脚定义示例 sbit LEFT_MOTOR_PIN1 = P3^4; // 左电机控制线1 sbit LEFT_MOTOR_PIN2 = P3^5; // 左电机控制线2 sbit RIGHT_MOTOR_PIN1 = P3^2; // 右电机控制线1 sbit RIGHT_MOTOR_PIN2 = P3^3; // 右电机控制线2

2.2 电机转向测试

在组装完整车前,建议先测试电机转向是否正确:

void testMotors() { // 左电机正转测试 LEFT_MOTOR_PIN1 = 0; LEFT_MOTOR_PIN2 = 1; delay(1000); // 左电机反转测试 LEFT_MOTOR_PIN1 = 1; LEFT_MOTOR_PIN2 = 0; delay(1000); // 右电机同理... // 停止所有电机 LEFT_MOTOR_PIN1 = LEFT_MOTOR_PIN2 = 0; RIGHT_MOTOR_PIN1 = RIGHT_MOTOR_PIN2 = 0; }

如果电机转向与预期相反,只需交换控制线的接线顺序即可。

3. 运动控制程序设计

3.1 基础运动函数封装

良好的代码结构会让后续扩展更容易。创建motor.h头文件声明以下函数:

// 电机初始化 void Motor_Init(); // 基础运动控制 void Move_Forward(); // 前进 void Move_Backward(); // 后退 void Turn_Left(); // 原地左转 void Turn_Right(); // 原地右转 void Stop_Motors(); // 停止

对应的motor.c实现:

#include "motor.h" #include "reg52.h" // 引脚定义 sbit LEFT_A = P3^4; sbit LEFT_B = P3^5; sbit RIGHT_A = P3^2; sbit RIGHT_B = P3^3; void Motor_Init() { LEFT_A = LEFT_B = RIGHT_A = RIGHT_B = 0; } void Move_Forward() { LEFT_A = 0; LEFT_B = 1; // 左电机正转 RIGHT_A = 0; RIGHT_B = 1; // 右电机正转 } void Move_Backward() { LEFT_A = 1; LEFT_B = 0; // 左电机反转 RIGHT_A = 1; RIGHT_B = 0; // 右电机反转 } void Turn_Left() { LEFT_A = 1; LEFT_B = 0; // 左电机反转 RIGHT_A = 0; RIGHT_B = 1; // 右电机正转 } void Turn_Right() { LEFT_A = 0; LEFT_B = 1; // 左电机正转 RIGHT_A = 1; RIGHT_B = 0; // 右电机反转 } void Stop_Motors() { LEFT_A = LEFT_B = RIGHT_A = RIGHT_B = 0; }

3.2 运动组合与延时控制

通过组合基础运动函数和延时,可以实现更复杂的运动轨迹:

void Square_Path() { for(int i=0; i<4; i++) { Move_Forward(); delay(1000); // 前进1秒 Turn_Right(); delay(500); // 右转0.5秒 } Stop_Motors(); }

进阶技巧:使用定时器中断实现更精确的时间控制,避免delay函数占用CPU。

4. 系统优化与扩展

4.1 电源管理优化

长时间运行时,电源稳定性至关重要:

  • 为单片机单独添加0.1uF去耦电容
  • 电机电源回路增加100uF电解电容
  • 考虑使用开关稳压模块(如LM2596)提供稳定5V电压

4.2 PWM速度控制

通过PWM调节电机速度,使小车运动更平滑:

void Set_Motor_Speed(uint8_t left, uint8_t right) { // 需要配置定时器产生PWM信号 // 左电机速度控制 PWM_LEFT = left; // 右电机速度控制 PWM_RIGHT = right; }

配置定时器代码示例:

void Timer0_Init() { TMOD &= 0xF0; // 设置定时器模式 TMOD |= 0x01; // 定时器0工作方式1 TH0 = 0xFF; // 初始值 TL0 = 0x9C; ET0 = 1; // 开启定时器中断 EA = 1; // 开启总中断 TR0 = 1; // 启动定时器 }

4.3 扩展思路

完成基础功能后,可以考虑以下扩展:

  • 增加红外或超声波避障功能
  • 通过蓝牙模块实现手机遥控
  • 添加巡线传感器实现自动循迹
  • 扩展编码器实现精确里程计算
// 蓝牙控制示例框架 void Bluetooth_Control() { if(received_data == 'F') Move_Forward(); else if(received_data == 'B') Move_Backward(); // 其他指令处理... }

调试小车时常见问题:

  1. 电机不转 → 检查电源和接地
  2. 只有一个电机工作 → 检查信号线连接
  3. 转向相反 → 交换电机两根控制线
  4. 单片机频繁复位 → 加强电源滤波
http://www.jsqmd.com/news/745438/

相关文章:

  • 简单三步:B站缓存视频m4s转MP4完整指南
  • 为什么Dism++是Windows系统维护的终极解决方案?
  • 全面解析HS2-HF_Patch:如何为Honey Select 2打造专业级游戏体验优化方案
  • 别再只用公开数据集了!手把手教你用YOLOv5和LabelImg搞定自己的‘对焦测试员’检测模型
  • 1Fichier下载管理器:智能代理绕过与批量下载的终极解决方案
  • YahooFinanceApi 架构深度解析:.NET 金融数据获取的完整企业级解决方案
  • 车载安卓系统如何选型固件加固?高通8155、RK3588平台实战适配与安全设计
  • BLE安全入门:别再混淆配对、绑定和连接了!从手机连手表实例看懂Legacy与Secure Connections
  • 从硅片到二极管:用大白话和动画图解PN结的单向导电性
  • 全新 Pro 级影视视频系统网站源码(内含 9 套精美模板随意切换)
  • League Akari:英雄联盟玩家的本地智能助手完全指南
  • 基于MCP协议构建AI驱动的自动化部署与测试工作流
  • BaiduNetdiskPlugin-macOS:macOS平台百度网盘下载优化方案
  • 别再只会用默认参数了!iperf3网络测速保姆级教程,从TCP/UDP到带宽限制全搞定
  • 智能温控革命:Fan Control如何成为Windows散热优化的终极解决方案
  • 芯片FAE vs. AE vs. Sales:一张图看懂技术岗的“鄙视链”与职业跃迁路径
  • UnityExplorer终极指南:解锁Unity游戏实时调试的5大核心功能
  • 基于Telegram与OpenAI API构建私有ChatGPT机器人:从部署到优化全指南
  • APK Installer技术深度解析:Windows平台安卓应用安装的架构创新与实践指南
  • 告别硬件I2C的烦恼:用STM32普通IO口模拟SMBus驱动BQ4050的完整配置流程
  • 思源宋体终极指南:7种粗细样式打造专业中文排版的完整解决方案
  • 为企业内部知识库问答系统集成可靠的大模型能力
  • 别再一条条敲命令了!手把手教你修改Anaconda的.condarc文件,一劳永逸换清华源
  • 别再只用Zabbix了!手把手教你用SNMPv3安全监控Linux服务器(CentOS 7/8实战)
  • 3步搭建实时手语翻译系统:让AI成为听障人士的沟通桥梁
  • 告别手工解析!用Qt和AsterixInspector源码快速构建航空报文解析库(支持Cat21/Cat62)
  • 5步彻底解决ComfyUI组件冲突:从诊断到预防完整指南
  • 热点中心与扩散采样在蛋白质设计中的应用
  • One-Token Rollout:LLM监督微调的高效策略梯度方法
  • LinkSwift:2025年最实用的网盘直链解析工具,告别下载限速困扰