用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 电机与驱动模块连接正确的接线是项目成功的关键。按照以下步骤操作电机焊接将左侧电机两根线焊接到L9110S的A-1A和A-1B将右侧电机两根线焊接到B-1A和B-1B建议用不同颜色线区分方便后续调试电源系统连接锂电池正极 → L9110S的VCC锂电池负极 → L9110S的GND → 单片机GND共地控制信号连接L9110S的A-1A → 单片机P3.4L9110S的A-1B → 单片机P3.5L9110S的B-1A → 单片机P3.2L9110S的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; // 右电机控制线22.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 i0; i4; 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(); // 其他指令处理... }调试小车时常见问题电机不转 → 检查电源和接地只有一个电机工作 → 检查信号线连接转向相反 → 交换电机两根控制线单片机频繁复位 → 加强电源滤波