转:L298N的原理图以及程序实现

最近在做寻迹小车,电机驱动遇到问题,博主有关L298N的介绍写的很不错,收藏一波!

				版权声明:本文为博主原创文章,未经博主允许不得转载。					https://blog.csdn.net/P_xiaojia/article/details/79310858				</div>
							            <div id="content_views" class="markdown_views prism-atom-one-dark">
						<!-- flowchart 箭头图标 勿删 -->
						<svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path></svg>
						<p><strong>一、L298N的一些基本参数</strong> <br>

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

使用方法:

输出A: 通道A输出 ,连接电机

输出B: 通道B输出 ,连接电机

12V供电: 主电源正极输入

供电GND: 主电源正负极极输入

5V输出: 5v电压输出端,可用于给MCU供电

ENA: 通道A使能

ENB: 通道B使能

IN1~IN4: 逻辑输入IN1IN2控制通道A,逻辑输入IN3IN4控制通道B

板载5V跳线帽: 接上后板载5V输出有效

二、实际接线图
由上述模块参数可知:
主电源的电压输入范围+5V~+35V,如果想通过模块输出5V电压来驱动你的MCU
则主电源的电压输入范围+7V~+35V

1.版内电压驱动
很多开发板上都会带有5V和3.3V的直流电压输出,可用此作为主电源的输入
为什么需要升压模块呢?
原因有两个:(1)开发板的5V输出口不一定有5V,可能只有4.?
(2)模块不一定刚好5V就能动,我的是5.3多才会转
这里写图片描述
2.外接电源驱动
此方法电源和MCU需要共地
这里写图片描述

三、程序逻辑控制方法
这里写图片描述
51编程:
这里写图片描述
这里写图片描述
这里写图片描述

Stm32 编程:
1.先配置I/O口
这里写图片描述
2.如何在stm32内像51程序一样控制?
这里写图片描述
首先定义宏
这里写图片描述
那么PAout()哪里来?
这里写图片描述
这里写图片描述
关于地址映射这部分内容,具体实现请参考正点原子的例程。

四、常见问题:
1.电机不会转动?
(1)有响声但是齿轮不转,可能是电压不够,加大电压
(2)接线存在错误,没有与MCU共地等
(3)逻辑端编程错误,没有正确的使能
2.关于ENA和ENB上面的跳线帽要不要拔去?
这取决于你的程序是怎么输出PWM波的,如果是像我上面的程序那样通过ENA来接收PWM控制的,跳线帽就要拔了,接自己的I/O输出。如果是通过IN1和IN2来控制的则不用拔。

源代码:https://download.csdn.net/download/p_xiaojia/10599257

  • 52
    点赞
  • 394
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
抱歉,我是一个语言模型AI,无法提供仿真和具体编程的服务。不过,以下是一个可能的程序框架,你可以参考一下: ```c #include "reg52.h" #include "intrins.h" typedef unsigned char uchar; typedef unsigned int uint; #define IN1 P2_0 #define IN2 P2_1 #define IN3 P2_2 #define IN4 P2_3 void delayms(uint xms) { uint i, j; for (i = xms; i > 0; i--) for (j = 112; j > 0; j--) ; } void motor_forward() { IN1 = 0; IN2 = 1; IN3 = 0; IN4 = 1; } void motor_backward() { IN1 = 1; IN2 = 0; IN3 = 1; IN4 = 0; } void motor_left() { IN1 = 1; IN2 = 0; IN3 = 0; IN4 = 1; } void motor_right() { IN1 = 0; IN2 = 1; IN3 = 1; IN4 = 0; } void motor_stop() { IN1 = 0; IN2 = 0; IN3 = 0; IN4 = 0; } void main() { while (1) { // 实现蓝牙通信,接收控制指令 // 根据指令控制小车运动 // 例如,收到指令"1",就让小车向前走 // 收到指令"2",就让小车向后走 // 收到指令"3",就让小车左 // 收到指令"4",就让小车右 // 收到指令"5",就让小车停止 // 具体的指令和实现方式,可以根据需要自行定义和修改 } } ``` 此外,为了实现上述程序,你需要根据实际情况,进行硬件的连接。以下是可能的连接方式: ```c // 由于在程序中使用了P2口,因此需要在头文件中声明相应的寄存器地址 sfr P2 = 0xA0; void main() { while (1) { // 实现蓝牙通信,接收控制指令 // 根据指令控制小车运动 // 例如,收到指令"1",就让小车向前走 motor_forward(); // 收到指令"2",就让小车向后走 motor_backward(); // 收到指令"3",就让小车左 motor_left(); // 收到指令"4",就让小车右 motor_right(); // 收到指令"5",就让小车停止 motor_stop(); // 具体的指令和实现方式,可以根据需要自行定义和修改 } } ``` 祝你顺利完成!
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值