一、单端、推挽、桥式拓扑结构变压器对比
单端正激式
单端:通过一只开关器件单向驱动脉冲变压器。
正激:脉冲变压器的原/付边相位关系,确保在开关管导通,驱动脉冲变压器原边时,变压器付边同时对负载供电。
该电路的最大问题是:开关管T交替工作于通/断两种状态,当开关管关断时,脉冲变压器处于“空载”状态,其中储存的磁能将被积累到下一个周期,直至电感器饱和,使开关器件烧毁。图中的D3与N3构成的磁通复位电路,提供了泄放多余磁能的渠道。
单端反激式
反激式电路与正激式电路相反,脉冲变压器的原/付边相位关系,确保当开关管导通,驱动脉冲变压器原边时,变压器付边不对负载供电,即原/付边交错通断。
脉冲变压器磁能被积累的问题容易解决,但是,由于变压器存在漏感,将在原边形成电压尖峰,可能击穿开关器件,需要设置电压钳位电路予以保护D3、N3构成的回路。
从电路原理图上看,反激式与正激式很相象,表面上只是变压器同名端的区别,但电路的工作方式不同,D3、N3的作用也不同。
推挽(变压器中心抽头)式
这种电路结构的特点是:对称性结构,脉冲变压器原边是两个对称线圈,两只开关管接成对称关系,轮流通断,工作过程类似于线性放大电路中的乙类推挽功率放大器。
主要优点:高频变压器磁芯利用率高(与单端电路相比)、电源电压利用率高(与后面要叙述的半桥电路相比)、输出功率大、两管基极均为低电平,驱动电路简单。
主要缺点:变压器绕组利用率低、对开关管的耐压要求比较高(至少是电源电压的两倍)。
全桥式
这种电路结构的特点是:由四只相同的开关管接成电桥结构驱动脉冲变压器原边。
图中T1、T4为一对,由同一组信号驱动,同时导通/关端;T2、T3为另一对,由另一组信号驱动,同时导通/关端。两对开关管轮流通/断,在变压器原边线圈中形成正/负交变的脉冲电流。
主要优点:与推挽结构相比,原边绕组减少了一半,开关管耐压降低一半。
主要缺点:使用的开关管数量多,且要求参数一致性好,驱动电路复杂,实现同步比较困难。这种电路结构通常使用在1KW以上超大功率开关电源电路中。
半桥式
电路的结构类似于全桥式,只是把其中的两只开关管(T3、T4)换成了两只等值大电容C1、C2。
主要优点:
- 具有一定的抗不平衡能力,对电路对称性要求不很严格
- 适应的功率范围较大,从几十瓦到千瓦都可以
- 开关管耐压要求较低
- 电路成本比全桥电路低
这种电路常常被用于各种非稳压输出的DC变换器,如电子荧光灯驱动电路中。
二、如何进行阻抗匹配?
一件器材的输出阻抗和所连接的负载阻抗之间所应满足的某种关系,以免接上负载后对器材本身的工作状态产生明显的影响。
什么是阻抗
在电学中,常把对电路中电流所起的阻碍作用叫做阻抗。阻抗单位为欧姆,常用Z表示,是一个复数:
Z= R+i( ωL–1/(ωC))
具体说来阻抗可分为两个部分,电阻(实部)和电抗(虚部)。
其中电抗又包括容抗和感抗,由电容引起的电流阻碍称为容抗,由电感引起的电流阻碍称为感抗。
阻抗匹配的理想模型
信号源与传输线之间匹配,分为两种情况:
- 使信号源无反射,方法是接入信号源与传输线之间接入匹配装置
- 信号源共轭匹配,方法是信号源与被匹配电路之间接入匹配装置,这种情况下多属于有源电路设计
射频工程师大都遇到过匹配阻抗的问题,通俗的讲,阻抗匹配的目的是确保能实现信号或能量从“信号源”到“负载”的有效传送。
如下图所示,其最最理想模型当然是希望信号源Source端的输出阻抗为50欧姆,传输线的阻抗为50欧姆,负载Load端的输入阻抗也是50欧姆,一路50欧姆下去,这是最理想的模型。
然而实际情况是:源端阻抗不会是50ohm,负载端阻抗也不会是50ohm,这个时候就需要若干个阻抗匹配电路。
而匹配电路就是由电感和电容所构成,这个时候我们就需要使用电容和电感来进行阻抗匹配电路调试,以达到RF性能最优。
阻抗匹配的方法
阻抗匹配的方法主要有两个,一是改变阻抗力,二是调整传输线。
改变阻抗力就是通过电容、电感与负载的串并联调整负载阻抗值,以达到源和负载阻抗匹配。
调整传输线是加长源和负载间的距离,配合电容和电感把阻抗力调整为零。
此时信号不会发生发射,能量都能被负载吸收。
高速PCB布线中,一般把数字信号的走线阻抗设计为50欧姆。一般规定同轴电缆基带50欧姆,频带75欧姆,对绞线(差分)为85-100欧姆。
阻抗匹配(Impedance matching)其实是微波电子学里的一部分,主要用于传输线上,是为了达到所有高频微波信号都能传至负载点的目的,不会有信号反射回源点。
大体上,阻抗匹配有两种:
- 一种是通过改变阻抗力(lumped-circuit matching)
- 调整传输线(transmission line matching)
要匹配一组线路,首先把负载点的阻抗值除以传输线的特性阻抗值来归一化,然后把数值划在史密夫图表上。
改变阻抗力 把电容或电感与负载串联起来,即可增加或减少负载的阻抗值,在图表上的点会沿著代表实数电阻的圆圈走动。如果把电容或电感接地,首先图表上的点会以图中心旋转180度,然后才沿电阻圈走动,再沿中心旋转180度。重复以上方法直至电阻值变成1,即可直接把阻抗力变为零完成匹配。
调整传输线
由负载点至来源点加长传输线,在图表上的圆点会沿著图中心以逆时针方向走动,直至走到电阻值为1的圆圈上,即可加电容或电感把阻抗力调整为零,完成匹配。 阻抗匹配则传输功率大,对于一个电源来讲,当它的内阻等于负载时,输出功率最大,此时阻抗匹配。最大功率传输定理,如果是高频的话,就是无反射波。对于普通的宽频放大器,输出阻抗50Ω,功率传输电路中需要考虑阻抗匹配,可是如果信号波长远远大于电缆长度,即缆长可以忽略的话,就无须考虑阻抗匹配了。阻抗匹配是指在能量传输时,要求负载阻抗要和传输线的特征阻抗相等,此时的传输不会产生反射,这表明所有能量都被负载吸收了。反之则在传输中有能量损失。高速PCB布线时,为了防止信号的反射,要求是线路的阻抗为50欧姆。这是个大约的数字,一般规定同轴电缆基带50欧姆,频带75欧姆,对绞线则为 100欧姆,只是取个整而已,为了匹配方便。
三、恒流电路的三种设计方案
作为硬件研发工程师相信对恒流电路不会陌生,本文介绍下三种恒流电路的原理图。
三极管恒流电路
三极管恒流电路
三极管的恒流电路,主要是利用Q2三极管的基级导通电压为0.6~0.7V这个特性;当Q2三极管导通,Q1三极管基级电压被拉低而截止,负载R1不工作;负载R1流过的电流等于R6电阻的电流(忽略Q1与Q2三极管的基级电流),R6电阻的电流等于R6电阻两端的0.6~0.7V电压除以R6电阻阻值(固定不变),因此流过R1负载的电流即为恒定不变,即使R1负载的电源端VCC电压是可变的,也能达到恒流的电路效果。
运放恒流电路
运放恒流电路
运放的恒流电路,主要是利用运放的“电压跟随特性”,即运放的两个输入引脚Pin3与Pin2电压相等电路特性;当在电阻R4输入Vin稳定电源电压时,电阻R7两端的电压也为Vin不变,因此无论外界电路如何变化,流过R7电阻的电流是不变的;同三极管恒流电路原理分析一样,R2负载的电流等于R7电阻的电流,所以即使R2负载的电源为可变电压电源,R2负载的电流也是保持固定不变,达到恒流的效果。
除去运用三极管与运放设计的恒流电路,介绍另外一种恒流电路设计方案,主要是利用稳压二极管的稳压特性。
稳压二极管恒流电路
稳压二极管恒流电路
稳压二极管的恒流电路中,三极管Q4的基级电压被限定在稳压二极管工作的稳定电压Uzd下,因此R10电阻的电压等于Uzd减去三极管基级与发射级的导通压降0.7V,即U=Uzd-0.7保持恒定不变,所以流过R10电阻的电流在VCC电源即使可变的条件下也是固定不变,也就是R8负载的电流保持不变,达到恒流的效果。
四、在晶振两边各接一对地电容的原因
很多开发者对晶振两边要各接一个对地电容的做法表示不理解,因为这个电容有时可以去掉。参考很多书籍,却发现书中讲解的很少,提到最多的往往是:对地电容具稳定作用或相当于负载电容等,都没有很深入地去进行理论分析。
另外一方面,很多爱好者都直接忽略了晶体旁边的这两个电容,他们认为按参考设计做就行了。但事实上,这是MCU的振荡电路,又称“三点式电容振荡电路”,如下图所示。
MCU三点式电容振荡电路
其中,Y1是晶体,相当于三点式里面的电感;C1和C2是电容,而5404和R1则实现了一个NPN型三极管(大家可以对照高频书里的三点式电容振荡电路)。
接下来将为大家分析一下这个电路
首先,上面电路图中5404必须搭一个电阻,不然它将处于饱和截止区,而不是放大区,因为R1相当于三极管的偏置作用,能让5404处于放大区域并充当一个反相器,从而实现NPN三极管的作用,且NPN三极管在共发射极接法时也是一个反相器。
其次将用通俗的方法为大家讲解一下这个三点式振荡电路的工作原理。
众所周知,一个正弦振荡电路的振荡条件为:系统放大倍数大于1,这个条件较容易实现;但另一方面,还需使相位满足360°。而问题就在于这个相位:由于5404是一个反相器,因此已实现了180°移相,那么就只需C1、C2和Y1再次实现 180°移相就可以了。恰好,当C1、C2和Y1形成谐振时,就能实现180移相;最简单的实现方式就是以地作为参考,谐振的时候,由于C1、C2中通过的电流相同,而地则在C1、C2之间,所以恰好电压相反,从而实现180移相。
再则,当C1增大时,C2端的振幅增强;当C2降低时,振幅也增强。有时即使不焊接C1、C2也能起振,但这种现象不是由不焊接C1、C2的做法造成的,而是由芯片引脚的分布电容引起,因为C1、C2的电容值本来就不需要很大,这一点很重要。
那么,这两个电容对振荡稳定性到底有什么影响呢?
由于5404的电压反馈依靠C2,假设C2过大,反馈电压过低,这时振荡并不稳定;假设C2过小,反馈电压过高,储存能量过少,则容易受外界干扰,还会辐射影响外界。而C1的作用与C2的则恰好相反。在布板的时候,假设为双面板且比较厚,那么分布电容的影响则不是很大;但假设为高密度多层板时,就需要考虑分布电容,尤其是VCO之类的振荡电路,更应该考虑分布电容。
因此,那些用于工控的项目,建议最好不要使用晶体振荡,而是直接接一个有源的晶振。
很多时候大家会采用32.768K的时钟晶体来做时钟,而不是通过单片机的晶体分频来做时钟,其中原因想必很多人也不明白,其实上这是和晶体的稳定度有关:频率越高的晶体,Q值一般难以做高,频率稳定度也比较差;而 32.768K晶体在稳定度等各方面的性能表现都不错,还形成了一个工业标准,比较容易做高。另外值得一提的是,32.768K是16 bit数据的一半,预留最高1 bit进位标志,用作定时计数器内部数字计算处理也非常方便。
五、EMC防护中的滤波电容
为什么总是在电路里摆两个0.1uF和0.01uF的电容?
旁路和去耦
旁路电容(Bypass Capacitor)和去耦电容(Decoupling Capacitor)这两个概念在电路中是常见的,但是真正理解起来并不容易。
要理解这两个词汇,还得回到英文语境中去。
Bypass在英语中有抄小路的意思,在电路中也是这个意思,如下图所示。
couple在英语中是一对的意思,引申为配对、耦合的意思。如果系统A中的信号引起了系统B中的信号,那么就说A与B系统出现了耦合现象(Coupling),如下图所示。而Decoupling就是减弱这种耦合的意思。
电路中的旁路和去耦
如下图中,直流电源Power给芯片IC供电,在电路中并入了两个电容。
旁路
如果Power受到了干扰,一般是频率比较高的干扰信号,可能使IC不能正常工作。在靠近Power处并联一个电容C1,因为电容对直流开路,对交流呈低阻态。频率较高的干扰信号通过C1回流到地,本来会经过IC的干扰信号通过电容抄近路流到了GND。这里的C1就是旁路电容的作用。
去耦
由于集成电路的工作频率一般比较高,IC启动瞬间或者切换工作频率时,会在供电导线上产生较大的电流波动,这种干扰信号直接反馈到Power会使其产生波动。在靠近IC的VCC供电端口并联一个电容C2,因为电容有储能作用,可以给IC提供瞬时电流,减弱IC电流波动干扰对Power的影响。这里的C2起到了去耦电容的作用。
为什么要用两个电容
回到本文最开始提到的问题,为什么要用0.1uF和0.01uF的两个电容?
电容阻抗和容抗计算公式分别如下:
容抗与频率和电容值成反比,电容越大、频率越高则容抗越小。可以简单理解为电容越大,滤波效果越好。那么有了0.1uF的电容旁路,再加一个0.01uF的电容不是浪费吗?
实际上,对一个特定电容,当信号频率低于其自谐振频率时呈容性,当信号频率高于其自谐振频率时呈感性。当用0.1uF和0.01uF的两个电容并联时,相当于拓宽了滤波频率范围。
六、画PCB板时阻抗设计的重要性
什么是阻抗
在电学中,常把对电路中电流所起的阻碍作用叫做阻抗。阻抗单位为欧姆,常用Z表示,是一个复数:
Z= R+i( ωL–1/(ωC))
具体说来阻抗可分为两个部分,电阻(实部)和电抗(虚部)。
其中电抗又包括容抗和感抗,由电容引起的电流阻碍称为容抗,由电感引起的电流阻碍称为感抗。
阻抗匹配的理想模型
射频工程师大都遇到过匹配阻抗的问题,通俗的讲,阻抗匹配的目的是确保能实现信号或能量从“信号源”到“负载”的有效传送。
其最最理想模型当然是希望Source端的输出阻抗为50欧姆,传输线的阻抗为50欧姆,Load端的输入阻抗也是50欧姆,一路50欧姆下去,这是最理想的。
然而实际情况是:源端阻抗不会是50ohm,负载端阻抗也不会是50ohm,这个时候就需要若干个阻抗匹配电路。
而匹配电路就是由电感和电容所构成,这个时候我们就需要使用电容和电感来进行阻抗匹配电路调试,以达到RF性能最优。
阻抗匹配的方法
阻抗匹配的方法主要有两个,一是改变阻抗力,二是调整传输线。
改变阻抗力就是通过电容、电感与负载的串并联调整负载阻抗值,以达到源和负载阻抗匹配。
调整传输线是加长源和负载间的距离,配合电容和电感把阻抗力调整为零。
此时信号不会发生发射,能量都能被负载吸收。
高速PCB布线中,一般把数字信号的走线阻抗设计为50欧姆。一般规定同轴电缆基带50欧姆,频带75欧姆,对绞线(差分)为85-100欧姆。
阻抗匹配应用举例——振铃现象
曾经做一个项目,在电信号测量时,遇到过振铃这种问题,。
由于任何传输线都不可避免地存在着引线电阻、引线电感和杂散电容,因此,一个标准的脉冲信号在经过较长的传输线后,极易产生上冲和振铃现象。大量的实验表明,引线电阻可使脉冲的平均振幅减小;而杂散电容和引线电感的存在,则是产生上冲和振铃的根本原因。在脉冲前沿上升时间相同的条件下,引线电感越大,上冲及振铃现象就越严重;杂散电容越大,则是波形的上升时间越长;而引线电阻的增加,将使脉冲振幅减小。
如果信号传输过程中感受到阻抗的变化,就会发生信号的反射。这个信号可能是驱动端发出的信号,也可能是远端反射回来的反射信号。根据反射系数的公式,当信号感受到阻抗变小,就会发生负反射,反射的负电压会使信号产生下冲。信号在驱动端和远端负载之间多次反射,其结果就是信号振铃。大多数芯片的输出阻抗都很低,如果输出阻抗小于PCB走线的特性阻抗,那么在没有源端端接的情况下,必然产生信号振铃。
在实际电路中,采用下列几种方法来来减小和抑制上冲及振铃。
(1)串联电阻。利用具有较大电阻的传输线或是人为地串入适当的阻尼电阻,可以减小脉冲的振幅,从而达到减小上冲和振铃程度的目的。但当传入电阻的数值过大时,不仅脉冲幅度减小过多,而且使脉冲的前沿产生延迟。因此,串入的阻尼电阻值应适当,并且应选用无感电阻,电阻的连接位置应靠近接收端。
(2)减小引线电感。设法减小线路及传输线的引线电感是最基本的方法,总的原则是:
- 尽量缩短引线长度
- 加粗导线和印制铜箔的宽度
- 减小信号的传输距离
- 采用引线电感小的元器件,尤其是传输前沿很陡的脉冲信号时更应注意这些问题
(3)由于负载电路的等效电感和等效电容同样可以影响发送端,使之脉冲波形产生上冲和振铃,因此,应尽量减小负载电路的等效电感和电容。尤其是负载电路的接地线过长时,形成的地线电感和杂散电容相当可观,其影响不容忽视。
(4)逻辑数字电路中的信号线可增加上拉电阻和交流终端负载,如图6所示。上拉电阻(可取)的接入,可将信号的逻辑高电平上拉到5V。交流终端负载电路的接入不影响支流驱动能力,也不会增加信号线的负载,而高频振铃现象却可得到有效的抑制。
上述振铃除了与电路条件有关外,还与脉冲前沿的上升时间密切相关。即使电路条件相同,当脉冲前沿上升时间很短时,上冲的峰值将大大增加。一般对于前沿上升时间在1以下的脉冲,均考虑产生上冲及振铃的可能。因此,在脉冲信号频率的选择问题上,应考虑在满足系统速度要求的前提下,能选用较低频率的信号绝不选用高频信号;如无必要,也不应过分要求脉冲的前沿非常陡峭。这对从根本上消除上冲和振铃视听有利的。
Smith圆图在RF匹配电路调试中的应用
Smith圆图上可以反映出如下信息: 阻抗参数Z,导纳参数Y,品质因子Q,反射系数,驻波系数,噪声系数,增益,稳定因子,功率,效率,频率信息等抗等参数。
是不是一脸懵,我们还是来看阻抗圆图吧:
阻抗圆图的构图原理是利用输入阻抗与电压反射系数之间的一一对应关系,将归一化输入阻抗表示在反射系数极坐标系中,其特点归纳如下:
- 上半圆阻抗为感抗,下半圆阻抗为容抗
- 实轴为纯电阻,单位圆为纯电抗
- 实轴的右半轴皆为电压波腹点(除开路点),左半轴皆为电压波节点(除短路点)
- 匹配点(1,0),开路点(∞,∞)和短路点(0,0)
- 两个特殊圆:最大的为纯电抗圆,与虚轴相切的为匹配圆
- 两个旋转方向:逆时针转为向负载移动,顺时针转为向波源移动
导纳圆图与阻抗圆图互为中心对称,同一张圆图,即可以当作阻抗圆图来用,也可以当作导纳圆图来用,但是在进行每一次操作时,若作为阻抗圆图用则不能作为导纳圆图。
Smith圆图中,能表示出一些很有意思的特征:
在负载之前串联或并联一个可变电感/电容,电路图如下图左侧4个图所示,将得到Smith圆图上右侧的几条曲线。
对应Smith阻抗圆及导纳圆,其运动轨迹如下:
- 使用Smith阻抗圆时,串联电感顺时针转,串联电容逆时针转
- 使用Smith导纳圆时,并联电感,逆时针转,并联电容顺时针转
七、去耦电容的作用
首先要解释一下耦合,耦合就是互相影响,正如变压器的原边会影响副边,同时副边也会影响原边,这就让人想起金庸小说里的七伤拳,伤人伤己。
那么去耦,就是减少耦合,减少互相影响。其实这里的去耦电容跟滤波电容的意思是一样的
笔者认为,如果耦合的反义词是滤波的话,往往会让人摸不着头脑,所以需要再起一个名词叫去耦,这样刚好满足人们语言表达的需求。
去耦电容的作用
如上图所示,一个LDO的输入和输出各加了两个电容,分别是104和10uF。
显然电容是具有滤波的作用,但是这跟模电上的RC、LC、RLC滤波不一样,只有一个C,这样也能滤波的,滤波的频率叫自谐振频率。
上图中,NPO电容的自谐振频率呈V字形,而Z5V电容则呈U字形,说明了NPO电容的滤波特性更好,同时,也最容易滤掉虚线对应的频率,就是自谐振频率。
此外,电容工作在虚线左边的频率范围内,呈电容的特性,而虚线右边,则呈电感的特性,下面有解释。
为什么一个电容也会谐振?
由电容的等效电路。
由于电容的制造工艺、材料等原因,实际的电容应该等效成上图所示,但是用在频率较低的电路上,Rs、Rp、Ls影响非常小,所以只把它当成一个Cp,而把其它的忽略掉。
如果电容工作在频率较高的电路上,就不能把Rs、Rp、Ls忽略了,这时利用上图的等效电路和拉氏变换,可以推导出电容的自谐振频率。而且,如果工作的频率超过电容的自谐振频率,那么感抗wLs会远大于容抗1/(wCp),这时,感抗起主导作用,容抗的影响非常小,可以忽略容抗时,电容会呈现感性。
这就让人想起了共振,如微波炉中的微波频率和水分子发生共振,说明了水分子也有自谐振频率。
谐振跟共振,其实是一个意思。
如何计算电容的自谐振频率?
在实际应用中,我们不可能对每个电容都测一下分布参数,弄等效电路的。一般是用经验公式:自谐振频率f0≈1/C。
怎样知道用多大的去耦电容?
可以用示波器测出LDO输入和输出的干扰信号的频率,再用公式C≈1/f0算出容值。一般要求没那么严格,直接加10uF和104,可以适用于一般的应用场合。
为什么要加一大一小两个电容?
由公式f0≈1/C可以得出,小电容滤高频干扰;大电容滤低频干扰。
为什么小电容要靠近芯片,而大电容则可以远一点?
小电容滤高频干扰,这个高频干扰不一定是由芯片外部输入进来的,也可以由芯片内部产生的。
像CPU、FPGA等,内部若干个MOS管像开关一样在导通、截止,这就形成了很多方波信号,再用傅立叶级数把它展开,就会产生很多奇次谐波。这些谐波的频率很高,属于高频干扰。如果高频干扰在整块电路板上传播,那就相当危险了,应该尽早的把它滤掉,所以要尽量靠近芯片。而低频干扰的影响力没那么大,可以远一点。
此外,大电容还充当了电池的作用,正如,关电视机的时候,电源指示灯要过一会才灭,就是因为这些大电容在给它放电。
去耦电容在多远的距离会失去滤波的作用?
这涉及到去耦半径的计算,有兴趣的读者,可以参考《信号完整性分析》。
为什么有些芯片的电源管脚上会放很多去耦电容?
怎样知道该用多少个电容?
上图就是有名的zedboard上面,ZYNQ附近的去耦电容,像个八卦阵一样,非常优雅的设计。
但是这里却不像我们用单片机、或者LDO那样,加104和10uF那么简单。
上面也说到,CPU、FPGA,内部的MOS管不断地导通、截止,其实这就是动态负载,那么由欧姆定律,U=IR,可以得出,当R突然变小,U不变(先假设电压不变),I突然变得很大(想象一下,上亿个MOS管在同时工作,尽管一个MOS管吸取的电流非常小,但是量多了,总体吸取的电流是非常大的)。
再由功率守恒,P=UI,当P一定的时候(电源芯片提供的功率是不变的),I变大,U变小。这说明了,在电源芯片提供的功率范围内,电源电压是不变的;但是,超出了电源芯片的功率的话,电源电压是随着负载而变的,这也是正好解释了过载现象,只是这里是一个瞬间的过程。
所以才需要加很多去耦电容,去抑制电源电压的瞬间变化(也叫暂态)。加多少个电容,是由瞬态功率决定的。
八、STM32最小系统电路
STM32最小系统硬件组成
最小系统为单片机工作的最低要求,不含外设控制,原理简单,分析最小系统是STM32入门的基础。
组成:
- 电源
- 复位
- 时钟
- 调试/下载接口
- 启动
电源
3.3V的电源从这里接入,其中电容起到滤波的作用。
复位电路
当RESET引脚被拉低产生外部复位时,产生复位脉冲,从而使系统复位。
有三种复位方式:
- 上电复位
- 手动复位
- 程序自动复位
上电复位,在上电瞬间,电容充电,RESET出现短暂的低电平,该低电平持续时间由电阻和电容共同决定,需求的复位信号持续时间约在1ms左右,计算方式如下:
t = 1.1RC(固定计算公式)
1.1*10K*0.1uF=1.1ms
手动复位:按键按下时,RESET与地导通,从而产生一个低电平,实现复位。
时钟
晶振的作用是为最小系统提供最基本的时钟信号,电容的作用是保证晶振输出的震荡频率更加稳定。
BOOT启动电路
STM32 芯片的 BOOT0 和 BOOT1 引脚,可使用跳线帽设置它们的电平从而控制芯片的启动方式,它支持从内部 FLASH 启动、系统存储器启动以及内部 SRAM 启动方式。
一般使用JTAG或者SWD调试下载程序,会下载到闪存里,所以可以直接将BOOT0引脚和BOOT1引脚置为低电平。
STM32三种启动模式对应的存储介质均是芯片内置的,它们是:
- 用户闪存 = 芯片内置的Flash。
- SRAM = 芯片内置的RAM区,就是内存啦。
- 系统存储器 = 芯片内部一块特定的区域,芯片出厂时在这个区域预置了一段Bootloader,就是通常说的ISP程序。这个区域的内容在芯片出厂后没有人能够修改或擦除,即它是一个ROM区,它是使用USART1作为通信口。
调试接口
STM32有两种调试接口,JTAG为5针, SWD为2线串行(一共四线)
此外还有采用USB进行程序烧写和数据输出:和电脑USB口连接也可以进行小负载驱动供电。
通常采用CH340G的芯片:实现USB转串口。使用该芯片将电脑的USB映射为串口使用,注意电脑上应安装串口驱动程序,否则不能正常识别。
九、STM32的半主机机制
半主机机制的作用
半主机是用于ARM目标的一种机制,可将来自STM32单片机应用程序的输入输出请求传送至运行仿真器的PC主机。使用此机制可以启用C库中的函数,如printf()和scanf(),来使用PC主机的屏幕和键盘。这样就可以看到单片机的输入输出,方便进行调试。注意:这种机制的运行需要仿真器,否则无法运行。
简单的来说,半主机模式就是通过仿真器实现开发板在电脑上的输入和输出。
开发时单片机需要独立运行,开发者就应该去掉仿真器,把printf函数通过单片机的外设来实现,例如通过开发板的串口。
非半主机机制下printf函数的实现方法
Use MicroLIB(微库)
因为使用微库的话,不会使用半主机模式。
如下图,在点开MDK软件的魔术棒,勾选Target选项卡中的“Use MicroLIB”。这样就可以使用printf()函数,通过USART输出数据到电脑串口助手。相关推荐:STM32打印数据到串口助手。
在主程序中添加代码
不使用Use MicroLIB(微库),就要在工程中加入以下代码, 以支持printf函数 。代码是写在USART的初始化文件中,记得修改USARTx,换成你要输出的USART端口号。
/******************************************************************************
* 【功 能】 printf函数重定向支持代码
* 加入以下代码, 使用printf函数时, 不再需要选择use MicroLIB
* 参 数:
* 返回值:
******************************************************************************/
#pragma import(__use_no_semihosting) //为确保没有从C库链接使用半主机的函数
struct __FILE { int handle; }; // 标准库需要的支持函数
FILE __stdout; // FILE 在stdio.h文件
void _sys_exit(int x) // 定义_sys_exit()以避免使用半主机模式
{ x = x; }
int fputc(int ch, FILE *f) // 重定向fputc函数,使printf的输出,由fputc输出到UART, 这里使用串口1(USART1)
{
//if(xFlag.PrintfOK == 0) return 0; // 判断USART是否已配置,防止在配置前调用printf被卡死
while((USARTx ->SR&0X40)==0); // 等待上一次串口数据发送完成
USARTx ->DR = (u8) ch; // 写DR,串口1将发送数据
return ch;
}
十、STM32通过PWM控制电机速度
做STM32智能小车的实验中会用到定时器PWM输出,来改变直流电机的转速。分享本文了解如何通过PWM实现对电机速度的控制。
PWM控制电机速度的基本原理
PWM(Pulse Width Modulation),也就是脉冲宽度调制。
PWM中有一个比较重要的概念,占空比:是一个脉冲周期内有效电平在整个周期所占的比例。
为了实现IO口上电压的持续性变化,可以调节PWM的占空比。这也能够使外设的功率进行持续性变化,最终控制直流电机转速的快慢。如何调节PWM波形的输出就是重点。相关推荐:STM32中PWM的配置与应用详解。
上图中的ARR是我们给定时器的一个预装载值,CCRx的上下变化是产生PWM波的关键。我们假设ARR大于CCRx的部分输出为高电平(即t1-t2、t3-t4、t5-t6),ARR小于CCRx的部分输出为低电平(即0-t1、t2-t3、t4-t5),则改变CCRx的值就能改变输出PWM的占空比。因此,想要控制PWM的输出波形,重要的就是如何设置ARR与CCRx这两个寄存器的值了。
STM32定时器中断
为了便于理解接下来关于PWM应用的内容,先插一段定时器中断的知识。
产生定时中断是定时器的用法之一,与定时器用来进行PWM输出和输入捕获相比,定时器中断更容易理解、掌握。
原理简介
使用通用定时器进行中断的原理,其实和开发板Systick定时器进行中断延时很相似(Stm32入门——Systick定时器),即:用psc(预分频系数)设置好定时器时钟后,arr(预装载值)在每个时钟周期内减1,当arr减为0时触发中断然后进入中断处理程序进行中断处理。以下代码为例:
void TIM3_Int_Init(u16 arr,u16 psc)
{
RCC->APB1ENR|=1<<1; //TIM3时钟使能
TIM3->ARR=arr; //设定计数器自动重装值
TIM3->PSC=psc; //预分频器设置
TIM3->DIER|=1<<0; //允许更新中断
TIM3->CR1|=0x01; //使能定时器3
MY_NVIC_Init(1,3,TIM3_IRQn,2);//抢占1,子优先级3,组2
}
RCC->APB1ENR|=1<<1
解释一下上面这行代码,由于定时器3(TIM3)是挂在APB1上的外设,所以要打开APB1,这里的预分频器值psc是来设置TIM3的时钟频率的,如果系统时钟(SYSTICK)频率为72MHz、psc为7199,则TIM3的时钟频率就为:
72MHz/(7199+1)Hz = 10KHz //这里的“+1”是手册中规定的。
10KHz是什 么意思呢?就是一秒钟会产生10K个周期,那么一个周期的时间长度就是1/10KHz,如果你想将定时器中断的时间间隔设置为0.5秒,那么你将arr设置为5000即可,因为arr每减1就需要一个周期的时间,减5000次就经过了5000*(1/10KHz)=0.5秒。
TIM3->DIER|=1<<0
再解释下上面这一行,设置允许更新中断,即arr减到0以后可以触发更新中断,还有其他类型的中断。
MY_NVIC_Init(1,3,TIM3_IRQn,2);//抢占1,子优先级3,组2
看上面这行代码,中断优先级有抢占优先级和响应(即子优先级)优先级两种,抢占优先级即:若程序1正在使用CPU,这时如果程序2要求使用CPU,并且程序2的抢占优先级高,则CPU被程序2抢占;若两者抢占优先级相同,则就算程序2的响应优先级高于程序1,CPU也不能被抢占;若程序1正在使用CPU,程序2和程序3的抢占优先级等于或低于程序1,且程序2的响应优先级高于程序三,则待CPU空出后,程序2先运行,程序3最后运行。TIM3_IRQn是指定将要运行的中断处理程序号。“组2”是设置中断优先级分组的,这是因为寄存器提供了四位来设置优先级,组2代表的是前两位给抢占优先级,后两位给响应优先级。
PWM模式、有效电平
前面介绍完中断,再说一下PWM工作原理。相关文章:浅析PWM控制电机转速的原理。
假设上图中ARR大于CCRx时输出为高电平,ARR小于CCRx时输出为低电平,但在实际运用中可能并非如此,有可能是相反的情况——ARR大于CCRx时输出为低电平,ARR小于CCRx时输出为高电平,至于到底是哪种情况,还要看PWM是哪种模式、有效电平又设置的是何种极性了。
- 模式1:ARR小于CCRx时输出为“有效”电平,ARR大于CCRx时输出为“无效”电平。
- 模式2:ARR小于CCRx时输出为“无效”电平,ARR大于CCRx时输出为“有效”电平。
这里说的是“有效”和“无效”,而不是“高”和“低”,也就是说有效电平可高可低,并非一定就是高电平。PWM模式、效电平极性,需要程序员自己配置相关的寄存器来实现。通过下面的代码来讲解。
TIM1_PWM_Init(899,0);//不分频。PWM频率=72000/(899+1)=80Khz
上一小节讲过关于定时器参数的设置。使用定时器1的通道1来输出一路PWM波,这里的899设置的就是ARR的值,至于那个0是用来设置TIM1的频率的,不分频就代表TIM1的时钟频率和系统时钟相同,这里假设为72MHz。
void TIM1_PWM_Init(u16 arr,u16 psc)
{
//此部分需手动修改IO口设置
RCC->APB2ENR|=1<<11; //TIM1时钟使能
GPIOA->CRH&=0XFFFFFFF0; //PA8清除之前的设置
GPIOA->CRH|=0X0000000B; //复用功能输出
TIM1->ARR=arr; //设定计数器自动重装值
TIM1->PSC=psc; //预分频器设置
TIM1->CCMR1|=7<<4; //CH1 PWM2模式
TIM1->CCMR1|=1<<3; //CH1预装载使能
TIM1->CCER|=0<<1; //OC1 输出使能
//TIM1->CCER|=1<<1;
TIM1->BDTR|=1<<15; //MOE 主输出使能
TIM1->CR1=0x0080; //ARPE使能
TIM1->CR1|=0x01; //使能定时器1
}
下文具体分析上面的代码。
前面4-6行是用来配置GPIO口的。
TIM1->ARR=arr; //设定计数器自动重装值
TIM1->PSC=psc; //预分频器设置
这两行就是我上门提到的设置定时器的频率和重装载值。
TIM1->CCMR1|=7<<4; //CH1 PWM2模式
TIM1->CCMR1|=1<<3; //CH1预装载使能
TIM1->CCER|=0<<1; //OC1 输出使能
这三行是用来设置PWM输出模式和设置通道的,通道是什么呢?简单地讲就是输出PWM波的GPIO口,代码一开始不是设置了PA8这个GPIO口嘛,这个PA8就是通道1。使用通道的话要先进行输入输出方向、通道使能的设置。
TIM1->CCER|=1<<1;
这行代码是用来设置“有效电平”极性的,根据手册,当TIM1->CCER[1]这位置1时,有效电平为低电平,置0时有效电平为高电平,而默认情况下置0。
TIM1->BDTR|=1<<15; //MOE 主输出使能
这行代码只要对高级定时器进行设置,普通定时器无需设置。
TIM1->CR1=0x0080; //ARPE使能
这行代码是用来使能ARPE,ARPE是什么呢,就是当它被置1时,你自己设置的CCRx会立即生效,如果它被置为0,那么你自己设置的CCRx值不会立即生效(可能之前ARPE已经有值了),而是当之前设置的CCRx生效后才会使用你最新设置的CCRx值。
上面的代码里没有对CCRx进行设置,这是因为CCRx常常是一个变化的值,你可以在主函数中用一个for循环+if判断语句对它进行++或–的操作,从而达到连续改变CCRx值得目的,例如:
for(i=0;i<300;i++){
TIM1->CCR1=i;
if(i==300){
i=0;
}
}
PWM波的周期是由定时器时钟频率和预装载值两者决定的,预装载值就是ARR。
预装载值PSC设置为899,那么,当定时器的当前值val从0增加到899时,一共经过了900个时钟周期,这900个时钟周期会产生一个PWM波形,也就是说900个定时器时钟周期才相当于一个PWM周期,那么PWM的频率就为72MHz/900=80KHz,周期为1/80KHz。