精华内容
下载资源
问答
  • 直流电机驱动电路设计

    千次阅读 2014-04-02 14:35:20
    直流电机驱动电路设计 一、直流电机驱动电路的设计目标 在直流电机驱动电路的设计中,主要考虑一下几点: 功能:电机是单向还是双向转动?需不需要调速?对于单向的电机驱动,只要用一个大功率三极管或场...

    直流电机驱动电路设计

    一、直流电机驱动电路的设计目标

    在直流电机驱动电路的设计中,主要考虑一下几点:

    功能:电机是单向还是双向转动?需不需要调速?对于单向的电机驱动,只要用一个大功率三极管或场效应管或继电器直接带动电机即可,当电机需要双向转动时,可以使用由4个功率元件组成的H桥电路或者使用一个双刀双掷的继电器。如果不需要调速,只要使用继电器即可;但如果需要调速,可以使用三极管,场效应管等开关元件实现PWM(脉冲宽度调制)调速。

    性能:对于PWM调速的电机驱动电路,主要有以下性能指标。

    1)输出电流和电压范围,它决定着电路能驱动多大功率的电机。

    2)效率,高的效率不仅意味着节省电源,也会减少驱动电路的发热。要提高电路的效率,可以从保证功率器件的开关工作状态和防止共态导通(H桥或推挽电路可能出现的一个问题,即两个功率器件同时导通使电源短路)入手。

    3)对控制输入端的影响。功率电路对其输入端应有良好的信号隔离,防止有高电压大电流进入主控电路,这可以用高的输入阻抗或者光电耦合器实现隔离。

    4)对电源的影响。共态导通可以引起电源电压的瞬间下降造成高频电源污染;大的电流可能导致地线电位浮动。

    5)可靠性。电机驱动电路应该尽可能做到,无论加上何种控制信号,何种无源负载,电路都是安全的。

    二、三极管-电阻作栅极驱动1.输入与电平转换部分

    电机1

    1.输入与电平转换部分:

    输入信号线由DATA引入,1脚是地线,其余是信号线。注意1脚对地连接了一个2K欧的电阻。当驱动板与单片机分别供电时,这个电阻可以提供信号电流回流的通路。当驱动与单片机共用一组电源时,这个电阻可以防止大电流沿着连线流入单片机主板的地线造成干扰。或者说,相当于把驱动板的地线与单片机的地线隔开,实现“一点接地”。

    高速运放KF347(也可以用TL084)的作用是比较器,把输入逻辑信号同来自指示灯和一个二极管的2.7V基准电压比较,转换成接近功率电源电压幅度的方波信号。KF347的输入电压范围不能接近负电源电压,否则会出错。因此在运放输入端增加了防止电压范围溢出的二极管。输入端的两个电阻一个用来限流,一个用来在输入悬空时把输入端拉到低电平。

    不能用LM339或其他任何开路输出的比较器代替运放,因为开路输出的高电平状态输出阻抗在1千欧以上,压降较大,后面一级的三极管将无法截止。

    2.栅极驱动部分:

    后面三极管和电阻,稳压管组成的电路进一步放大信号,场效应管的栅极并利用场效应管本身的栅极电容(大约1000pF)进行延时,防止H桥上下两臂的场效应管同时导通(“共态导通”)造成电源短路。当运放输出端为低电平(约为1V至2V,不能完全达到零)时,下面的三极管截止,场效应管导通。上面的三极管导通,场效应管截止,输出为高电平。当运放输出端为高电平(约为VCC-(1V至2V),不能完全达到VCC)时,下面的三极管导通,场效应管截止。上面的三极管截止,场效应管导通,输出为低电平。

    上面的分析是静态的,下面讨论开关转换的动态过程:三极管导通电阻远小于2千欧,因此三极管由截止转换到导通时场效应管栅极电容上的电荷可以迅速释放,场效应管迅速截止。但是三极管由导通转换到截止时场效应管栅极通过2千欧电阻充电却需要一定的时间。相应的,场效应管由导通转换到截止的速度要比由截止转换到导通的速度快。假如两个三极管的开关动作是同时发生的,这个电路可以让上下两臂的场效应管先断后通,消除共态导通现象。

    实际上,运放输出电压变化需要一定的时间,这段时间内运放输出电压处于正负电源电压之间的中间值。这时两个三极管同时导通,场效应管就同时截止了。所以实际的电路比这种理想情况还要安全一些。

    场效应管栅极的12V稳压二极管用于防止场效应管栅极过压击穿。一般的场效应管栅极的耐压是18V或20V,直接加上24V电压将会击穿,因此这个稳压二极管不能用普通的二极管代替,但是可以用2千欧的电阻代替,同样能得到12V的分压。

    3.场效应管输出部分:

    大功率场效应管内部在源极和漏极之间反向并联有二极管,接成H桥使用时,相当于输出端已经并联了消除电压尖峰用的四个二极管,因此这里就没有外接二极管。输出端并联一个小电容(out1和out2之间)对降低电机产生的尖峰电压有一定的好处,但是在使用PWM时有产生尖峰电流的副作用,因此容量不宜过大。在使用小功率电机时这个电容可以略去。如果加这个电容的话,一定要用高耐压的,普通的瓷片电容可能会出现击穿短路的故障。

    输出端并联的由电阻和发光二极管,电容组成的电路指示电机的转动方向.

    4.性能指标:

    电源电压15~30 V,最大持续输出电流5A/每个电机,短时间(10秒)可以达到10A,PWM频率最高可以用到30KHz(一般用1到10KHz)。电路板包含4个逻辑上独立的,输出端两两接成H桥的功率放大单元,可以直接用单片机控制。实现电机的双向转动和调速。

    5.布线:

    大电流线路要尽量的短粗,并且尽量避免经过过孔,一定要经过过孔的话要把过孔做大一些(>1mm)并且在焊盘上做一圈小的过孔,在焊接时用焊锡填满,否则可能会烧断。另外,如果使用了稳压管,场效应管源极对电源和地的导线要尽可能的短粗,否则在大电流时,这段导线上的压降可能会经过正偏的稳压管和导通的三极管将其烧毁。在一开始的设计中,NMOS管的源极于地之间曾经接入一个0.15欧的电阻用来检测电流,这个电阻就成了不断烧毁板子的罪魁祸首。当然如果把稳压管换成电阻就不存在这个问题了。

    在2004年的Robocon比赛中,我们主要采用了这个电路用以电机驱动。

    三、低压驱动电路的简易栅极驱动

    一般功率场效应管的最高栅源电压为20V左右,所以在24V应用中要保证栅源电压不能超过20V,增加了电路的复杂程度。但在12V或更低电压的应用中,电路就可以大大简化。

    电机2

    左图就是一个12V桥的一边,上面电路的三极管部分被两二极管和两个电阻代替。(注意,跟上图逻辑是反的)由于场效应管栅极电容的存在,通过R3,R4向栅极电容充电使场效应管延缓导通而通过二极管直接将栅极电容放电使场效应管即截止,从而避免了共态导通。这个电路要求在IN端输入的是边缘陡峭的方波脉冲,因此控制信号从单片机或者其他开路输出的设备接入后,要经过施密特触发器(比如555)或者推挽输出的高速比较器才能接到IN端。如果输入边缘过缓,二极管延时电路也就失去了作用。

    R3,R4的选取与IN信号边沿升降速度有关,信号边缘越陡峭,R3,R4可以选的越小,开关速度也就可以做的越快。Robocon比赛使用的升压电路(原理相似)中,IN前用的是555。

    四、边沿延时驱动电路

    在前级逻辑电路里,有意地对控制PMOS的下降沿和控制NMOS的上升沿进行延时,再整形成方波,也可以避免场效应管的共态导通。另外,这样做可以使后级的栅极驱动电路简化,可以是低阻推挽驱动栅极,不必考虑栅极电容,可以较好的适应不同的场效应管。2003年Robocon比赛采用的就是这种驱动电路。下图是两种边沿的延时电路:

    电机3

    电机4

    下图是对应的NMOS,PMOS栅极驱动电路:

    电机5

    电机6

    这个栅极驱动电路由两级三极管组成:前级提供驱动场效应管栅极所需的正确电压,后级是一级射极跟随器,降低输出阻抗,消除栅极电容的影响。为了保证不共态导通,输入的边沿要比较陡,上述先延时再整形的电路就可以做到。

    五、其它几种驱动电路

    1. 继电器+半导体功率器件的想法

    继电器有着电流大,工作稳定的优点,可以大大简化驱动电路的设计。在需要实现调速的电机驱动电路中,也可以充分利用继电器。有一个方案就是利用继电器来控制电流方向来改变电机转向,而用单个的特大电流场效应管(比如IRF3205,一般只有N型特大电流的管子)来实现PWM调速,如下右图所示。这样是实现特别大电流驱动的一个方法。换向的继电器要使用双刀双掷型的,接线如下左图,线圈接线如下中图:

    电机7

    电机8

    电机9

    2. 几种驱动芯片

    1) L298

    2) A3952

    3) A3940

    4) L6203

    六、PWM调速的实现

    1. 使用定时器的算法

    //butcher补充一下吧

    //算法原理

    //编程实现要点

    //优缺点

    2. 使用循环移位的算法

    产生PWM信号可以由定时器来完成,但是由于51内部只提供了两个定时器,因此如果要向三个或更多的直流电机输出不同占空比的信号要反复设置定时器,实现较为复杂,我们采用一种比较简单的方法不仅可以实现对更多的直流电机提供不同的占空比输入信号,而且只占用一个定时器资源。这种方法可以简单表述如下:

    在内存的某段空间内存放各个直流电机所需的输入信号占空比信息,如果占空比为1则保存0FFH(11111111B);占空比为0.5则保存0F0H(11110000B)或任何2进制数中包括4个0和4个1。即

    占空比=1的个数/8

    具体选取什么样的二进制数要看输出频率的要求。若要对此直流电机输出PWM信号,只要每个时间片移位一次取出其中固定的一位(可以用位寻址或进位标志C实现)送到电机端口上即可。另外,移位算法是一种对以前结果依赖的算法,所以最好定期检查或重置被移位的数,防止移错导致一直错下去。

    这种算法的优点是独立进程,可以实现对多个电机的控制,缺点是占用资源较大,PWM频率较低。

    3. 模拟电路PWM的实现

    电机10


    上图为一个使用游戏手柄或者航模摇杆上的线性电位器(或线性霍尔元件)控制两个底盘驱动电机的PWM生成电路。J1是手柄的插座,123和456分别是x,y两个方向的电位器。U1B提供半电源电压,U1A是电压跟随。x,y分量经过合成成为控制左右轮两个电机转速的电压信号。在使用中,让L=(x+1)y/(x+1.4),R=(x-1)y/(x-0.6),经过试验有不错的效果(数字只是单位,不是电压值)。经过U1C和U1D组成的施密特振荡器把电压转换为相应的PWM信号,用来控制功率驱动电路。以U1D为例,R1,R2组成有回差的施密特电路,上下门限受输入电压影响,C1和R3组成延时回路,如此形成振荡的脉宽受输入电压控制。Q1,Q2是三极管,组成反相器,提供差分的控制信号。具体振荡过程参见对555振荡器的分析。

    七、步进电机驱动

    1. 小功率4相步进电机的驱动

    下面是一种驱动电路框图:

    电机11

    达林顿管阵列ULN2803分别从锁存器取出第0,2,4,6位和1,3,5,7位去驱动两个步进电机。四相步进电机的通电顺序可以有几种:A,B,C,D(4相4拍);AB,BC,CD,DA(4相双4拍);A,AB,B,BC,C,CD,D,DA(4相8拍)。为了兼顾稳定性,转矩和功耗,一般采用4相8拍方式。所有这些方式都可以通过循环移位实现(也要有定期监控),为了使4相8拍容易实现,锁存器与驱动部分采用了交叉连接。

    步进电机工作在四相八拍模式(即正转的输入信号为1000→1100→0100→0110→0010→0011→0001→1001→1000),对应每个步进电机要有四个信号输入端,理论上向端口输出信号可以控制两个步进电机的工作。寄存器循环移位奇偶位分别作两个步进电机的驱动端的做法,其思想如下:

    LOOP: MOV A,#1110000B ;在A寄存器中置入11100000

    RR A ;右移位

    AJMP LOOP ;循环右移位

    这样在寄存器A中存储的值会有如下循环11100000→01110000→00111000→00011100→00001110→00000111→10000011→11000001→11100000,其奇数位有如下循环1000→1100→0100→0110→0010→0011→0001→1001→1000,其偶数位有如下循环1100→0100→0110→0010→0011→0001→1001→1000→1100.将A输出到P0端口,则奇数位和偶数位正是我们所需要的步进电机输入信号。

    而事实上每个电机的动作是不同的,为此我们在RAM中为每个电机开辟一个byte的状态字节用以循环移位。在每一个电机周期里,根据需要对每个电机的byte进行移位,并用ANL指令将两个电机的状态合成到一个字节里输出此时的A同时可以控制两个电机了。

    步进电机的速度由驱动脉冲的频率决定,移位的周期不同,电机的速度也就不同了。前面提到的电机周期,应该取各种可能的周期的最大公约数。换句话说,一旦电机周期取定,每个电机移位的周期应该是它的倍数。在程序中,对每个电机的相应时刻设定相应的分频比值,同时用一个变量进行加一计数:每到一个电机周期若计数变量<分频比值,则计数变量加1;若相等,则移位,计数变量清零。这样就实现了分频调速,可以让多个电机同时以不同的速度运转。另外,也可以采用传统的查表方式进行驱动,程序稍长,但也比较稳定,这种方法非常适合三相步进电机。

    UCN5804B/LB是Allegro公司生产的4相步进电机驱动专用芯片,它集成了控制逻辑,脉冲分配和功率推动,通过几个管脚的电平来设定转动方式,方向,通过改变外时钟频率来改变转动速度,这给完成复杂的动作和测试步进电机参数带来了极大的方便。

    2. 步进电机的智能驱动方案

    步进有可以精确控制的优点,但是功耗大,效率低,力矩小。如果选用大功率步进电机,为了降低功耗,可以采取PWM恒流控制的方法。基本思路是,用带反馈的高频PWM根据输出功率的要求对每相恒流驱动,总体电流顺序又符合转动顺序。需要力矩小的时候应及时减小电流,以降低功耗。该方案实现的电路,可以采用独立的单片机或CPLD加场效应管驱动电路以及电流采样反馈电路。

    八、几种IRF场效应管的参数

    电机12


    展开全文
  • 电机上下限位换向电路设计

    千次阅读 2014-04-18 15:34:39
    直线推杆电机,电机初始位置在0cm,上电,推杆伸出,直到x cm处,电机自动断电。此时反接电源,电机缩回...这个控制电路是怎么设计的?直线推杆电机是用的12v直流电机,减速齿轮,再用螺杆把旋转运动转换为直线运动。

    直线推杆电机,电机初始位置在0cm,上电,推杆伸出,直到 x cm处,电机自动断电。此时反接电源,电机缩回,到0位置处,电机又自动断电。再换向,又能伸出。如此往复。。。这个控制电路是怎么设计的?直线推杆电机是用的12v直流电机,减速齿轮,再用螺杆把旋转运动转换为直线运动。


    展开全文
  • 每次做项目总是会涉及到服务器与下位机之间的通讯,往往会涉及到客户端、服务器、前端、后台、下位机这些概念,对于做电子研发的初级工程师来说,往往会理不清这些概念,所以这篇文章打算简单的介绍下这些术语,分析...

    一、概述
    每次做项目总是会涉及到服务器与下位机之间的通讯,往往会涉及到客户端、服务器、前端、后台、下位机这些概念,对于做电子研发的初级工程师来说,往往会理不清这些概念,所以这篇文章打算简单的介绍下这些术语,分析他们之间的关系。另外,这篇文章作为自己的一篇技术笔记,仅供参考,如有错误之处,还望指正。

    客户端:可以向服务器发起请求的一方叫做客户端,比如一款APP
    服务端:顾名思义,能够响应客户端请求的一方叫做服务器,比如云服务器
    前端:与用户进行直接交互的网页或者界面
    后台:能够对数据进行管理的模块,比如数据库系统
    下位机:属于被动控制的一方,往往是某一设备,与上位机概念对应
    上位机:主动控制的一方叫做上位机,比如APP或者一款PC机上运行的软件

    虽然介绍完这些概念,但感觉还是比较抽象,那么它们之间到底是如何联系的呢?下面以一个具体的案例进行分析。

    二、案例
    现在电影院大多都有“娃娃机”这样的设备,用户扫码登录后可以通过手机界面按下“开机”指令,然后就成功开启一台设备,用户可以操作“已开启”的设备抓取“娃娃”。
    在以上案例中,主要流程:
    1.首先用户通过手机界面按下开机指令,然后客户端将指令作为一个“开机请求”发 送给服务器。
    2.服务器通过接收解析得到请求内容后,会去调用后台CGI程序对数据库进行操作,比如会先访问数据库,查询当前设备的状态,然后在状态“合法”的情况下发送开机指令给下位机,下位机执行并且将执行结果返回,这个查询操作是后台程序完成的,不是服务器执行的,只不过后台程序在操作完成后会将处理结果返回给服务器。
    3.服务器在接收到CGI程序返回的处理结果(成功或失败)后,再将结果返回给客户端,客户端再将结果显示在前端界面。
    以上是整个操作的大体流程,在这个流程中,手机界面就是“前端”,用户通过前端页面发起开机请求,那么这个请求是谁发出去的呢?是客户端。发给谁呢?是服务端。服务端接收到请求后会自己处理请求吗?不不不,不会,它会调用一个后台程序去处理请求,然后等待后台程序将结果返回,比如它调用一个exe程序对数据库进行状态查询操作并且执行开机指令,然后这个exe程序将处理结果返回给服务器,服务器再将结果返回给客户端。这个exe程序就是后台程序了,通常也会用php去实现对数据库的操作(增删改查)。或许有人会问,为什么服务器自己不能处理请求,反而会调用一个后台程序去操作呢?这不多此一举吗?你想,服务器它会只与一个客户端通讯吗?肯定不是,服务端往往需要快速并且“同时”响应多个客户端请求,这就要求它不能为某一个请求花费太多时间,如果每个客户端请求都要服务器去处理,那么服务器的延时可想而知。通常服务器会开启“多线程”模式,在线程中调用后台程序去处理请求,然后后台程序将处理结果返回。以上介绍了前端、客户端、服务器、后台这些对象之间的关系,那么我们一直谈论的下位机呢?下位机在整个系统中处于什么位置?如果从控制方和被控制方来说,前面所说的客户端可以理解为上位机,就是控制方,那么下位机就是被控制方,比如这个案例中的“娃娃机”。下位机往往需要与服务器通讯,并且可以受控地完成一系列动作,比如“开机动作”或者在本案例中受手柄控制做出相应动作。下位机的设计往往会包含硬件电路设计和单片机软件编程。下位机与服务器之间通讯可以采用TCP协议(工作在传输层),数据透传模式,而客户端与服务器通讯会采用应用层协议,比如HTTP,HTTPS或者Websocket。
    好了,以上就是关于前端、客户端、服务器、后台、上位机、下位机的一些基本概念和它们之间关系。

    展开全文
  • 本文介绍如何使用STM32F103单片机,通过官方固件库,设置高级定时器TIM1输出嵌入死区的互补PWM,来驱动直流电机的程序设计与电路设计。硬件电路采用IR2110S芯片作为mos管的驱动,驱动IRF840组成的H桥。IR2110S芯片...

    本文介绍如何使用STM32F103单片机,通过官方固件库,设置高级定时器TIM1输出嵌入死区的互补PWM,来驱动直流电机的程序设计与电路设计。硬件电路采用IR2110S芯片作为mos管的驱动,驱动IRF840组成的H桥。IR2110S芯片使用中,有一个比较难理解的点——自举电容,本文对其原理也有涉及。
    原理图文件
    电机驱动电路简化原理图
    上图是系统的简化原理图,左侧是单片机。中间是IR2110S芯片,为了方便讲解,把芯片内部结构列出一些。右侧是MOS管组成的H桥。其中M是直流电机,有正反转。其中VCC是15V,MOTOR_VCC是24V,电压可以改变,最大不超过500V。单片机一般是3.3V或5V,无法直接驱动电机。可以借助H桥来实现对直流电机的控制。
    H桥由于形似H得名。
    VT1,VT4导通,电机正转
    VT2,VT3导通,电机翻转
    VT1,VT3导通,短路,板子烧坏
    VT2,VT4,导通短路。
    所以,驱动电机的问题就变成了MOS管导通的问题。
    实际电路中我选用了IRF840,这是N沟道的MOS管。N-MOS导通的条件:VGS大于一定值
    对于IRF840,VGS>10V
    IRF840数据手册说明
    所以MOS管导通的问题就变成了VGS>10V的问题

    如果,VT1与VT3都独立配置一个电源,独立配置一套驱动,导通问题就变得简单了。但是,电路设计会变得复杂。
    我们使用1个驱动芯片IR2110S,一路驱动电源。
    简单介绍下IR2110S芯片
    IR2110是独立一桥臂双通道,栅极驱动,高压,高速单片机专用功率器件集成驱动电路。2片IR2110就能构成H桥驱动电路。
    IR2110S是3.3V版本
    感兴趣的可以自己来做个阅读理解。
    IR2110芯片简介
    简单来说,IR2110是个3.3V控制10-20V的一个驱动。开关速度也很快,120ns
    内部结构
    IR2110内部结构
    右上角的两个MOS管,中间是非门连接,不会同时导通。
    中间一系列怎么变化,我也不是很清楚。
    HIN是1,VM1导通,VM2截止。VB与HO连在一起
    HIN是0,VM1截止,VM2导通。VS与HO连在一起
    LIN是1,VM3导通,VM4截止。VCC与LO连在一起
    LIN是0,VM3截止,VM4导通。LO与COM连在一起
    先看下桥臂。左侧下桥臂导通,很简单:
    LIN为高,VM3导通,VCC接在LO上(暂时忽略二极管压降),VGS= VCC,导通
    LIN输入高电平

    上桥臂导通的情况,先假设没有电容。
    VM1导通时,VCC接在HO上,为G极提供了接近15V的电压。但是,VS的电压是多少?不知道。
    如果,VT3导通,VS就是0,VT1也导通了,烧坏。
    如果VT4导通,VS通过电机接地(电机内部可以先等效为电阻)。但是VT1导通以后,VS接近24V,HO只有15V,VT1又截止了。电机还是不能工作。
    我们面临的问题是,上桥臂没有地。怎么办?
    VCC接在G上
    这个时候,就需要自举电容。
    VT4导通,VS接地。电容一端是地,一端是15V,所以VCC通过D给C充电。
    又因为VM1导通,所以C横跨在GS上。所以,C可以作为电压源,为GS供电。这是一个悬浮的电压源。
    VT1导通后,VS接近24V,不再是地。所以VCC15无法为G提供足够的电压。
    自举电容可以放电维持VT1工作,电容存有15V的电,可以保持MOS管的导通。由于电容两极的压差不能突变,而电容下边变成了对地24V(暂不考虑MOS管压降),所以这一瞬间,电容上边的电压是对地39V。这时,VCC无法为电容充电。由于二极管的存在,电容的电不会倒灌给VCC。
    电容电量又是有限的,放电会导致电容的电压降低。等到两级压差不到10V的时候,VT1又不工作了。并且,此时IR2110芯片内部的欠压检测逻辑就会工作,把HO拉到VS,让VGS=0。
    所以,自举电容电压小于10V之前,要充电。如果HIN一直是高电平,电容就没有充电的机会,等到自举电容的的电压跌落到某个阈值以下,HO就变为低电平。
    此时可以关掉VT1,也就是断开VM1,VB与HO断开,不论是VCC还是电容都不再为G极提供电源。如果此时打开VT3,让VS接地,则电容一边是高电平,一边是低电平,开始充电。然后再断开VT3,打开VM1,VT4保持不变,让电容放电维持VT1导通,就可以循环往复,保持电机运行。
    即,VT1的导通要依靠电容放电来维持。HIN不能为持续的高电平,占空比也不能达到100,或低频的PWM(频率低,一个周期内放电时间长)。必须是高频的PWM,保证自举电容有周期性的,足够的充电时间,才能维持较高的悬浮电源电压。
    除此之外,还要注意死区问题,由于绝对不可以把同侧桥臂的上下半桥同时打开,而IR2110S,MOS管与电机切换状态都存在延时,导致从程序命令某半桥关断,到实际关断,有一段时间的延迟。例如,在延迟期间,上半桥正在关闭,下半桥暂时还不能打开,直到上半桥完全关闭,下半桥才能打开。中间等待的这段时间,就是死区。死区时间与硬件密切相关。笔者手上就有两个不同型号的电机,一个在3us的死区时可以工作,另一个则不可以。
    所以,写程序要注意到上下桥不能同时导通,高频,不能是100的占空比,以及死区这几个问题。接下来尝试用STM32的高级定时器,输出嵌入死区的互补PWM。
    以下是定时器1的初始化代码,使用两个通道输出PWM,一个周期是100us,频率是10KHz,3us的死区时间。默认通道一的占空比是50%,通道2的占空比是0%,让电机以47%(占空比减去死区)的速度正转。
    通道2输出占空比是0,可以让右侧上半桥总是截止,下半桥总是导通。下半桥没有自举电容。如此一来,只需要左侧上半桥导通,就可以让电机正转。控制左侧桥臂的占空比,就能控制电机的占空比。
    定时器1的通道1引脚是PA8PB13,通道2的输出引脚是PA9PB14。

    void PWM_Configuration(void)
    {
        GPIO_InitTypeDef    GPIO_InitStructure;
        TIM_TimeBaseInitTypeDef TIM_BaseInitStructure;
        TIM_OCInitTypeDef TIM_OCInitStructure;
        TIM_BDTRInitTypeDef TIM_BDTRInitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
        //开启TIM和相应端口时钟
        //启动GPIO
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA  | RCC_APB2Periph_GPIOB,
                         ENABLE);
        //启动AFIO
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
        //启动TIM1
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
    
        //GPIO做相应设置,为AF输出             //PA8,PB13一组互补输出  A9,PB14一组互补输出
        //PA.8/9口设置为TIM1的OC1输出口
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
        //PB.13/14口设置为TIM1_CH1N和TIM1_CH2N输出口
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
        GPIO_SetBits(GPIOA, GPIO_Pin_8 | GPIO_Pin_9);
        GPIO_SetBits(GPIOB, GPIO_Pin_13 | GPIO_Pin_14);
    
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);    
        NVIC_InitStructure.NVIC_IRQChannel =  TIM1_UP_IRQn;    
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;       
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;  
        NVIC_Init(&NVIC_InitStructure);
    
        //TIM1基本计数器设置(设置PWM频率)10KHz 
        TIM_BaseInitStructure.TIM_Period = 100-1;      //10khz  好计算。按照1%的精确度,理论最大72000/100 = 720KHz
        TIM_BaseInitStructure.TIM_Prescaler = 72-1;
        TIM_BaseInitStructure.TIM_ClockDivision = 0;
        TIM_BaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;//向上计数
        TIM_BaseInitStructure.TIM_RepetitionCounter = 0;
        TIM_TimeBaseInit(TIM1, &TIM_BaseInitStructure);
        //启用ARR的影子寄存器(直到产生更新事件才更改设置)
        TIM_ARRPreloadConfig(TIM1, ENABLE);
    
        //TIM1_OC1模块设置(设置1通道占空比)
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;//TIM脉冲宽度调制模式1
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//输出通道使能
        TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;//互补输出
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
        TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;//TIM输出比较极性高
        //TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
        TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;
        TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;
        TIM_OCInitStructure.TIM_Pulse = 50;//待装入捕获比较寄存器的脉冲值
        TIM_OC1Init(TIM1, &TIM_OCInitStructure);
    
        //启用CCR1寄存器的影子寄存器(直到产生更新事件才更改设置)
        TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);
    
        
        //TIM1_OC2模块设置(设置2通道占空比)
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
        TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
        TIM_OCInitStructure.TIM_Pulse = 0;
        TIM_OC2Init(TIM1, &TIM_OCInitStructure);
        //启用CCR2寄存器的影子寄存器(直到产生更新事件才更改设置)
        TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable);
    
        //OCx输出信号与参考信号相同,只是它的上升沿相对参考信号的上升沿有一个延迟
        //OCxN输出信号与参考信号相同,只是它的上升沿相对参考信号的下降沿有一个延迟
    
        //死区设置
        TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;
        TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;
        TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_2;
        //bit7~5 = 111,则deadtime = (32 + (bit4~bit0)* 16*1/fosc)ns = (32+31)*16*1/72000000 = 14us
        TIM_BDTRInitStructure.TIM_DeadTime = 0xab; //这里调整死区大小0-0xff3us
        TIM_BDTRInitStructure.TIM_Break = TIM_Break_Disable;
        TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_High;
        TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;
        TIM_BDTRConfig(TIM1, &TIM_BDTRInitStructure);
    
        //TIM1_OC通道输出PWM
        TIM_CtrlPWMOutputs(TIM1, ENABLE);
    
        //TIM1开启
        TIM_Cmd(TIM1, ENABLE);
    }
    
    

    带死区的上下半桥驱动信号波形
    从上图中,可以清楚地看到,单片机输出的上、下桥臂控制信号,不存在同时为高电平的时候,也就是同侧上下桥臂不会同时导通。切换状态时,某半桥臂的控制信号拉低3us以后,另半桥臂的控制信号才能拉高,这就是所谓的带死区的互补PWM。
    输出的电机控制电压
    上图是输出的电机控制电压。可以看出周期是100us,高电平持续时间大约一半。
    初始化之后,在程序运行时,可以调用

    TIM_SetAutoreload(TIM1,xx);
    

    来设置自动重装值。在初始化的时候把此值设置为了100,如果改为80,效果如下:
    72分频80自动重装值波形
    可以看出,一个周期变成了80us。
    也可以使用函数

                    TIM_SetCompare1(TIM1,xx);
                    TIM_SetCompare2(TIM1,xx);
    

    来分别为通道1与通道2设置比较值。例如,把比较值设置为80,而自动重装值还是100,那么占空比就是80%了。
    80%占空比
    下边是用按键控制电机的一个小demo。实现了按键1启停,按键2切换正反转,按键34增减转速的功能。

    int main(void)
    {    
        static u8 motorValue = 50,oldvalue = 50;
        static u8 startStop = 1,dir = 1;//startStop = 1启动  =0停止 dir =1 正转
        volatile u8 key = 0;
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
        LED_Init();
        KEY_Init();
        delay_init();
        PWM_Configuration();
        Motor_IO_Init();
        LED1 = LED_ON;
        while(1)    
        {
            key = KEY_Scan(0);
            if(key)
            {
                switch(key)
                {
                    case KEY1_PRES:
                            startStop = !startStop;
                    break;
                    case KEY2_PRES:
                            dir = !dir;
                    break;
                    case KEY3_PRES:
                            motorValue += 5;
                    break;
                    case KEY4_PRES:
                            motorValue -= 5;
                    break;
                    default:
                            break;
                }
                if(motorValue>249)//<0
                    motorValue = 0;
                else if(motorValue >94)
                    motorValue = 94;
                if (startStop)
                {
                    if(dir)
                    {
                        TIM_SetCompare2(TIM1,0);
                        delay_ms(500);
                        TIM_SetCompare1(TIM1,motorValue);
                    }
                    else
                    {
                        TIM_SetCompare1(TIM1,0);
                        delay_ms(500);
                        TIM_SetCompare2(TIM1,motorValue);            
                    }
                }
                else
                {
                    TIM_SetCompare1(TIM1,0);
                    TIM_SetCompare2(TIM1,0);
                }            
            }
    
        }
    }
    //S1 启动&停止  S2翻转   S3+5   S4-5
    
    

    完整的原理图文件在这里

    新增了一个用集成芯片的驱动方案链接

    展开全文
  • 本文主要介绍了基于Internet联网的一种报警主机硬件电路设计,系统主要介绍了系统的详细设计过程,系统主要包括Atmega128外围电路,ENC28J60以太网接口电路,键盘/显示接口部分,电源部分,主机通信的串口部分,调试...
  • 当前比较流行的arduino开发,联动做一个Demo。上位机:C#上位机通过串口发送接收控制协议,来...下位机:arduino下位机主控,接受上位机串口协议控制GPIO硬件引脚;硬件电路:面包板LED串220R电路,以arduino引脚驱动;
  • 拔河游戏的逻辑电路设计和实现

    千次阅读 2020-05-16 20:59:58
    比赛开始后,各自迅速不断地按动按键,以此产生脉冲,谁按得快,亮点就向该方移动(甲为左),当任何一方的终端点亮时,该方胜利,此时,二级管的状态保持,双方按键无效,复位后亮点移至中间,开始轮比赛 ...
  • 16海明解码电路设计(计算机数据表示实验)

    万次阅读 多人点赞 2020-04-12 19:39:23
    首先了解实验大体的要求,该实验要求我们对22海明编码进行解码成原来的16,且判断是否出错,有一错,两错,还有无错。对于一错,我们要进行纠正。 1.判断是否出错 设置有六指错字,Gi(i=1,2,3,4,5...
  • 三天研读《中兴电路设计规范》精华总结

    万次阅读 多人点赞 2020-05-16 18:25:52
    本博客将简述中兴通讯股份有限公司在原理图设计中需要注意的一些事项,其中包含了中兴设计开发部积累的大量硬件开发知识和经验,可以作为学习使用。硬件工程师可以学习并掌握检查条目的内容以及对条目的详细说明,...
  • 还有,因为本人知识非常有限,也不是专门做电路设计的,如果有什么错漏的地方非常欢迎大家指正,请大家轻喷轻喷,多多包涵^_^。 一、按键电路的常用设计参考 1、R1上拉电阻将不确定的信号通过一个...
  • 同步状态的verilog HDL实现: 1、状态编码:  二进制编码:比较简单,使用状态向量较少,但是状态间可能会有毛刺。  格雷码:减少了状态间的变化,降低了功耗有减少了毛刺,但是不适用于很多状态的跳转...
  • 利用QuartusⅡ实现A/D转换器ADC0809的采样控制电路状态机设计;给出仿真波形。最后进行引脚锁定并进行测试,硬件验证设计电路对ADC0809的控制功能。 三、实验仪器与器材 计算机1台,GW48-PK2S实验箱1台,QuartusⅡ...
  • 电子电路课程设计——8数字抢答器设计论文

    千次阅读 多人点赞 2010-11-04 21:56:00
              江苏广播电视大学   (电子电路课程设计——8数字抢答器设计论文)     班级:  姓名:  指导老师:  日期:2010...
  • 数字电路设计之数字电路工程师面试集锦

    千次阅读 多人点赞 2014-11-07 22:43:29
    数字电路  1、同步电路和异步电路的区别是什么?(仕兰微电子)  2、什么是同步逻辑和异步逻辑?(汉王笔试)  同步逻辑是时钟之间有固定的因果关系。异步逻辑是各时钟之间没有固定的因果关系。  3、什么是...
  • 二、内核(上位机安卓板、下位机驱动板) 三、零部件(弹簧,线束,电源,灯箱等,看扩展) 四、触摸显示屏(红外触摸,液晶显示器) 一、机壳找钣金厂有设计图都可以帮你实现,这一块不在我们开发范围,不多...
  • 直流电机驱动电路

    千次阅读 2015-01-02 15:49:53
    一、 直流电机驱动电路设计目标 在直流电机驱动电路设计中,主要考虑一下几点: 功能:电机是单向还是双向转动?需不需要调速?对于单向的电机驱动,只要用一个大功率三极管或场效应管或继电器直接带动...
  • 实现一个从“下位机到蓝牙模块通讯到Android客户端”的完整物联网项目。CSDN视频地址链接:http://edu.csdn.net/course/detail/5945 历经一个月,终于把这门课程完完整整的录制出来,这个项目也是我在大学期间的一个...
  • SDRAM电路设计详解

    千次阅读 2016-05-10 10:57:04
     UDQM、LDQM:数据输入输出屏蔽引脚。 用于在读模式控制输出缓冲,在...介绍SDRAM电路设计之前先了解SDRAM的寻址原理。SDRAM内部是一个存储阵列,可以把它想象成一个表格,和表格的检索原理一样,先指定行,
  • 一开始是想使用老师说所的触发器和门电路设计电路图的,但是在完成的过程中,因为对于触发器并不是十分的熟悉,在完成电路的连接之后,始终无法获得正确的答案,无奈之选择另辟蹊径,直接选择输入和输出的对应...
  • 温度指示报警电路设计报告

    千次阅读 2021-01-02 01:29:14
    设计主要运用基本的模拟电子技术基础和传感器原理的知识,从基本的元器件出发,实现了超温报警电路设计。秉承的主要思想是达到课程要求和尽可能多的利用自己所学的知识。 本文介绍一种运算放大器温度指示及报警...
  • 以ADC0809为例,设计一个ADC采样控制电路,采用有限状态的方式。 传统的ADC采样控制的方法是用单片机控制,单片机控制ADC采样具有编程简单,控制灵活的优点,但是采样速度慢,CPU控制的低速极大地限制了ADC器件...
  • 高速采样保持电路设计

    千次阅读 2019-09-02 15:39:52
    影响接收速度、性能的一个重要电路单元AD转换部分是非常重要的,而AD转换前端的采样保持电路又直接关系到AD芯片的转换速度和精确度。近年来,随着超宽带技术的不断发展,接收信号的带宽宽,变化快,给采样系统提出...
  • 简易洗衣机控制电路

    千次阅读 2008-11-24 10:55:00
    1 原理电路设计洗衣机控制电路是用来控制洗衣机电机的正转反转暂停三个状态的。该电路可以控制洗衣机的定时启动...将其功能用框图表示如图1.1 洗衣机控制电路框图1.1设计方案的选择 第一部分方案:本电路的计数系
  • 重量则不断降低,使本已很复杂的”手机”设计又造成巨大压力,做为TVS的供应商我们应给予技术支持把最新.体积最小的.功能齐全的TVS组合芯片介绍给广大用户。   数字移动电话的电路基本由射频/数字信号处理/终端...
  • 简易测温电路课程设计报告

    千次阅读 多人点赞 2018-07-14 10:13:56
     简易测温电路 2018 年 01 月 15日 目录 1. 设计任务描述 ………………………………………………… - 1 - 1.1 设计任务 ………………………………………………… - 1 - 1.2 设计要求 ……………………………………...
  • “用可编程逻辑器件FPGA实现组合逻辑电路设计”实验报告 一.实验目的 1.掌握中规模数字集成器件的逻辑功能及使用方法 2.熟悉组合逻辑电路的设计方法 3.了解数字可编程器件的应用设计 4.学会QUARTUS软件的基本...
  • 射频电子电路设计图集---研读

    千次阅读 2018-07-28 09:24:44
     射频LNA设计要求:低噪声放大器(LNA)作为射频信号传输链路的第一级,它的噪声系数特性决定了整个射频电路前端的噪声性能,因此作为高性能射频接收电路的第一级LNA的设计必须满足:(1)较高的线性度以抑制干扰和...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 41,181
精华内容 16,472
关键字:

下位机电路设计