51单片机控制L298N驱动小车行驶、步进电机与SG-90舵机实现精确角度转动实验(具体请参看代码)

引言

精确控制小车的运动方向和角度对于自动化和机器人技术至关重要。本文将介绍如何使用51单片机结合L298N电机驱动模块控制直流电机,并通过SG-90舵机实现小车转向的精确角度控制,同时详细解释PWM(脉冲宽度调制)在这一过程中的应用。

背景知识

PWM(脉冲宽度调制)

PWM是一种模拟信号控制技术,通过改变方波信号的占空比来控制模拟设备的功率。在电机控制中,PWM用于调节电机的速度和方向,以及舵机的角度。

51单片机(具备三个定时器)

51单片机是一款经典的微控制器,具有丰富的I/O端口和内置定时器,非常适合用于控制电机和舵机。

L298N电机驱动模块(双桥结构)

L298N是一款双全桥驱动模块,适用于驱动两个直流电机,支持PWM调速。

MG310直流电机(带霍尔编码传感器)

MG310直流电机是一款小型电机,适用于小车等移动平台的驱动。

SG-90舵机

SG-90舵机是一款180度旋转的舵机,适用于实现精确的角度控制。

材料和工具

  • 51单片机开发板(具备三个定时器)
  • L298N电机驱动模块
  • MG310直流电机 x2
  • SG-90舵机 x1
  • 小车底盘
  • 杜邦线
  • 电源适配器
  • Keil uVision IDE或其他C语言开发环境

实验步骤

硬件连接

  1. 直流电机连接:将两个MG310直流电机连接到L298N电机驱动模块的电机接口。
  2. 舵机连接:将SG-90舵机的电源、信号和地线分别连接到51单片机的I/O端口。
  3. 电源连接:为所有组件提供稳定的电源。

软件配置

  1. 定时器配置

    • 定时器0和1用于产生PWM信号,控制直流电机的速度和方向。
    • 定时器2用于产生周期性脉冲,控制SG-90舵机的角度。
  2. I/O端口配置:配置用于控制电机方向和舵机信号的I/O端口。

编程指南

初始化代码

//电机驱动模块
void PWM_Init()
{
    TMOD &= 0xF0;  // 清除TIMER0设置
    TMOD |= 0x02;  // 设置TIMER0为模式2(8位自动重装模式)
    TH0 = 256 - PWM_duty1;  // 设定初始值
    TL0 = 256 - PWM_duty1;  // 设定初始值
    ET0 = 1;  // 使能TIMER0中断
    TR0 = 1;  // 启动TIMER0

    TMOD &= 0x0F;  // 清除TIMER1设置
    TMOD |= 0x20;  // 设置TIMER1为模式2(8位自动重装模式)
    TH1 = 256 - PWM_duty2;  // 设定初始值
    TL1 = 256 - PWM_duty2;  // 设定初始值
    ET1 = 1;  // 使能TIMER1中断
    TR1 = 1;  // 启动TIMER1

    EA = 1;   // 开启总中断
}


//舵机
void Timer2_Init() {
    T2CON = 0x00;  // Timer2 in 16-bit auto-reload mode
    TH2 = 0xFF;    // Set initial values for high and low bytes
    TL2 = 0xA4;    // This sets a delay of about 20ms
    RCAP2H = 0xFF; // Reload value for high byte
    RCAP2L = 0xA4; // Reload value for low byte
    ET2 = 1;       // Enable Timer2 interrupt
    TR2 = 1;       // Start Timer2
    EA = 1;        // Enable global interrupts
}

控制函数实现

  • 电机控制:通过设置MOTOR_A_DIR和MOTOR_B_DIR来控制电机的转向,通过定时器0和1的PWM输出来控制电机的速度。
  • 舵机控制:通过定时器2产生特定宽度的脉冲,控制SG-90舵机转动到指定角度。

测试和调试

  1. 电机测试:测试直流电机的正反转和速度控制。
  2. 舵机测试:测试舵机在不同角度的控制响应。
  3. 小车集成测试:将电机和舵机集成到小车上,测试小车的直线运动、转向和角度控制。

结论

本文详细介绍了如何使用51单片机控制L298N电机驱动模块、步进电机和SG-90舵机,实现小车的精确角度转动和运动控制。通过PWM的应用,读者将掌握电机和舵机的控制原理,为开发更复杂的自动化和机器人项目打下坚实的基础。

附录

  • 完整代码:提供实验中使用的完整C语言代码。

【免费】51单片机控制L298N驱动小车行驶、步进电机与SG-90舵机实现精确角度转动实验_四路l298n电机驱动模块使用方法资源-CSDN文库icon-default.png?t=N7T8https://download.csdn.net/download/Xiaoxi76440/89363616?spm=1001.2014.3001.5503

  • 参考资料:推荐阅读的相关资料和在线资源。
  • 13
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是基于51单片机控制舵机转动任意角度的详细代码: ```C #include <reg51.h> // 引入51单片机头文件 sbit servo = P1^0; // 定义舵机控制引脚 void main() { unsigned int angle = 0; // 定义角度变量 TMOD = 0x01; // 设置定时器0为模式1 TH0 = 0xFC; // 设定初值,使定时器每10ms中断一次 TL0 = 0x67; TR0 = 1; // 启动定时器0 while(1) { if (angle == 0) { // 如果角度为0,舵机转到初始位置 servo = 1; delay(20); // 延时20ms servo = 0; delay(180); // 延时180ms } else if (angle == 90) { // 如果角度90舵机转到中间位置 servo = 1; delay(15); // 延时15ms servo = 0; delay(185); // 延时185ms } else if (angle == 180) { // 如果角度为180,舵机转到最大位置 servo = 1; delay(10); // 延时10ms servo = 0; delay(190); // 延时190ms } else { // 如果角度为其他值,计算脉冲宽度并转动舵机 unsigned int pulse_width = (unsigned int)(angle / 180.0 * 2000.0 + 500.0); // 计算脉冲宽度 servo = 1; delay_us(pulse_width); // 延时脉冲宽度微秒 servo = 0; delay_us(20000 - pulse_width); // 延时20ms减去脉冲宽度微秒 } } } void timer0_isr() interrupt 1 { // 定时器0中断服务程序 TH0 = 0xFC; // 重新赋初值 TL0 = 0x67; } void delay(unsigned int ms) { // 毫秒级延时函数 unsigned int i, j; for(i = ms; i > 0; i--) { for(j = 110; j > 0; j--); } } void delay_us(unsigned int us) { // 微秒级延时函数 unsigned int i, j; for(i = us; i > 0; i--) { for(j = 2; j > 0; j--); } } ``` 上述代码中,使用定时器0每10ms中断一次,并在中断服务程序中重新赋初值,以保证控制舵机的脉冲宽度准确。然后使用一个无限循环,根据角度值计算脉冲宽度并转动舵机。其中,0度、90度和180度的脉冲宽度已经确定,其他角度的脉冲宽度通过公式计算得到。延时函数分别为毫秒级和微秒级,用于控制舵机转动和脉冲宽度延时。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值