一份很用心的H桥驱动扫盲教程

本文介绍了H桥的基本原理及其在直流电机控制中的应用。详细解释了H桥如何通过不同的开关状态实现电机的正转、反转及调速。此外,还提供了一个基于Arduino和L298N的电机控制示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是H桥?

H桥是一个比较简单的电路,通常它会包含四个独立控制的开关元器件(例如MOS-FET),它们通常用于驱动电流较大的负载,比如电机,至于为什么要叫H桥(H-Bridge),因为长得比较像字母H,具体如下图所示;

在这里插入图片描述

这里有四个开关元器件Q1,Q2,Q3,Q4,另外还有一个直流电机M,D1,D2,D3,D4是MOS-FET的续流二极管;

开关状态

下面以控制一个直流电机为例,对H桥的几种开关状态进行简单的介绍,其中正转和反转是人为规定的方向,实际工程中按照实际情况进行划分即可;

正转

通常H桥用来驱动感性负载,这里我们来驱动一个直流电机;

  • 打开Q1和Q4;
  • 关闭Q2和Q3;

此时假设电机正转,这电流依次经过Q1,M,Q4,在图中使用黄色线段进行标注,具体如下图所示;

在这里插入图片描述

                            正转

反转

另外一种状态则是电机反转;此时四个开关元器件的状态如下;

  • 关闭Q1和Q4;
  • 打开Q2和Q3;

此时电机反转(与前面介绍的情况相反),这电流依次经过Q2,M,Q3,在图中使用黄色线段进行标注,具体如下图所示;

在这里插入图片描述

                            反转

调速

如果要对直流电机调速,其中的一种方案就是;

  • 关闭Q2,Q3;
  • 打开Q1,Q4上给它输入50%占空比的PWM波形,这样就达到了降低转速的效果,如果需要增加转速,则将输入PWM的占空比设置为100%;

具体如下所示;
在这里插入图片描述

停止状态

这里以电机从正转切换到停止状态为例;

  • 正转情况下;Q1和Q4是打开状态;
  • 这时候如果关闭Q1和Q4,直流电机内部可以等效成电感,也就是感性负载,电流不会突变,那么电流将继续保持原来的方向进行流动,这时候我们希望电机里的电流可以快速衰减;
    这里有两种办法:

第一种:关闭Q1和Q4,这时候电流仍然会通过反向续流二极管进行流动,此时短暂打开Q1和Q3从而达到快速衰减电流的目的;
在这里插入图片描述

第二种:准备停止的时候,关闭Q1,打开Q2,这时候电流并不会衰减地很快,电流循环在Q2,M,Q4之间流动,通过MOS-FET的内阻将电能消耗掉;

在这里插入图片描述

应用

实际使用的时候,用分立元件制作H桥是很麻烦的,市面上已经有很多比较常用的IC方案,比如常用的L293D、L298N、TA7257P、SN754410等。接上电源、电机,通过输入控制信号就可以驱动电机了;

下面是某宝上的L298N模块,比较常见,对于新手玩家非常友好,接线也十分简单;

在这里插入图片描述
                            L298N模块
这个模块有一个板载5V稳压器,该稳压器可使用跳线的方式进行使能。

如果电机电源电压高达12V,我们可以启用5V稳压器,并且5V引脚可以用作输出,例如给Arduino板供电。

但是,如果电动机电压大于12V,则必须断开跳线,因为这些电压会损坏板载5V稳压器。

在这种情况下,5V引脚将用作输入,因为我们需要将其连接到5V电源,以使IC正常工作。

我们在这里可以注意到,该IC的电压降约为2V。因此,如果使用12V电源,则电动机端子上的电压约为10V,这意味着我们将无法从12V直流电动机中获得最大速度。

这里使用Arduino为例,这是网上找的一个Demo整体的框架如下图所示;

在这里插入图片描述
                            架构

#define enA 9
#define in1 6
#define in2 7
#define button 4

int rotDirection = 0;
int pressed = false;

void setup() {
  pinMode(enA, OUTPUT);
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
  pinMode(button, INPUT);
  // Set initial rotation direction
  digitalWrite(in1, LOW);
  digitalWrite(in2, HIGH);
}

void loop() {
// Read potentiometer value
  int potValue = analogRead(A0); 
  // Map the potentiometer value from 0 to 255
  int pwmOutput = map(potValue, 0, 1023, 0 , 255); 
  // Send PWM signal to L298N Enable pin
  analogWrite(enA, pwmOutput); 

  // Read button - Debounce
  if (digitalRead(button) == true) {
    pressed = !pressed;
  }
  while (digitalRead(button) == true);
  delay(20);

  // If button is pressed - change rotation direction
  if (pressed == true  & rotDirection == 0) {
    digitalWrite(in1, HIGH);
    digitalWrite(in2, LOW);
    rotDirection = 1;
    delay(20);
  }
  // If button is pressed - change rotation direction
  if (pressed == false & rotDirection == 1) {
    digitalWrite(in1, LOW);
    digitalWrite(in2, HIGH);
    rotDirection = 0;
    delay(20);
  }
}

简单描述一下:首先我们需要定义程序所需的引脚和变量。

在setup()中,我们需要设置引脚模式和电机的初始旋转方向。

在loop()中,我们先读取电位器值,然后将从中获得的值从0到1023变化,线性映射到PWM信号的0到255的值,将其从0到100%的占空比。

然后使用analogWrite()函数将PWM信号发送到L298N板的Enable引脚,该引脚实际上驱动电动机。

接下来,我们检查是否按下了按钮,如果是的话,我们将输入1和输入2的状态反置,从而改变电动机的旋转方向。该按钮将用作切换按钮,每次按下该按钮都会改变电动机的旋转方向。

某宝上这种小车很多,如下图所示;主控可以换成51单片机或者STM32,当然Arduino也没问题,使用L298N就可以快速搭建一个小车了;

在这里插入图片描述
                            某宝的小车

总结

本文简单介绍了H桥的原理,并以直流电机为例简单介绍了驱动的状态,整体比较简单,适合新手玩家,最后给出了基于Arduino和L298N的驱动示例,仅供参考,感兴趣可以去某宝逛逛,enjoy。

ttk.treeview是Python中的一个GUI控件,用于在GUI应用程序中显示树形数据结构。以下是ttk.treeview的基本界面设计步骤: 1. 导入必要的模块和库,如tkinter和ttk。 2. 创建一个树形结构数据,并将其转换为ttk.treeview格式。 3. 创建一个ttk.treeview控件。 4. 添加列标题。 5. 将数据添加到ttk.treeview中。 6. 设计ttk.treeview的样式和外观,如背景颜色、字体、行高等。 7. 为ttk.treeview添加事件处理程序,如鼠标单击、双击、右击等事件。 以下是一个简单的例子,展示了如何使用ttk.treeview来显示一个树形结构数据: ```python import tkinter as tk from tkinter import ttk def main(): # 创建树形结构数据 data = { 'root': { 'node1': { 'leaf1': None, 'leaf2': None }, 'node2': { 'leaf3': None, 'leaf4': None } } } # 创建ttk.treeview控件 root = tk.Tk() tree = ttk.Treeview(root) # 添加列标题 tree['columns'] = ('count') tree.heading('#0', text='Name', anchor='w') tree.column('#0', anchor='w') tree.heading('count', text='Count') tree.column('count', anchor='center') # 将数据添加到ttk.treeview中 add_node(tree, '', data['root']) # 设置ttk.treeview的样式和外观 style = ttk.Style() style.configure('Treeview', rowheight=25) # 显示ttk.treeview控件 tree.pack() root.mainloop() def add_node(tree, parent, node): # 添加当前节点 if node is not None: tree.insert(parent, 'end', text=node, values=(len(node))) # 添加当前节点的子节点 for key, value in node.items(): add_node(tree, node, value) if __name__ == '__main__': main() ``` 这个例子中,我们首先创建了一个树形结构数据,并将其转换为ttk.treeview格式。然后,我们创建了一个ttk.treeview控件,并添加了列标题。接着,我们将数据添加到ttk.treeview中,并设置了ttk.treeview的样式和外观。最后,我们显示了ttk.treeview控件。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值