精华内容
下载资源
问答
  • 89C51单片机控制开关电源,十分详细
  • 文中在简单介绍高频开关电源的工作原理基础上, 以通信用-48V开关电源为功率转换部分, 89C51单片机控制核心,对开关电源控制部分进行优化设计,详细阐述了其工作原理, 并通过软件编程实现了对开关电源的智能控制
  • 关于单片机控制开关电源 有细节说明 PCB 欢迎来学习 单片机电源控制 限行哦in观点与阿
  • 摘要:为研究模拟PWM与数字电路相结合后的优点,本文设计实现了一个由51单片机控制的输出可调的高效开关稳压电源。通过理论分析设计了基于BOOST升压电路的DC-DC变换器、PWM控制芯片及其外围电路、单片机最小系统以及...
  • 摘要:文中在简单介绍高频开关电源的工作原理基础上,以通信用-48V开关电源为功率转换部分,89C51单片机控制核心,对开关电源控制部分进行优化设计,详细阐述了其工作原理,并通过软件编程实现了对开关电源的...
  • 摘要:文中在简单介绍高频开关电源的工作原理基础上,以通信用-48V开关电源为功率转换部分,89C51单片机控制核心,对开关电源控制部分进行优化设计,详细阐述了其工作原理,并通过软件编程实现了对开关电源的...
  • 指出最优设计方案, 并举出实例———一种基于单片机89C51 与典型PWM控制芯片TL494 相结合而实现输出电压可调的开关稳压电源电路, 对设计基于单片机控制开关电源有很好的参考价值。
  • 为了使智能开关电源能可靠、安全地工作,本系统设置了多重监测和保护系统,主要包括过流保护和短路保护。单片机系统通过电流传感器检测开关功率管的输出电流,当电流超过给定值,单片机系统切断开关激励信号并发出...
  • 本文设计实现了-个由51单片机控制的输出可调的高效开关稳压电源。通过理论分析设计了基于BOOST升压电路的DC-DC变换器、PWM控制芯片及其外围电路、单片机最小系统以及键盘/显示电路。通过仿真和实际电路调试使该电源...
  • 我想做一个开关51单片机控制家庭电源 应该选择什么型号的继电器 还有可以用1个uln2803驱动8个继电器吗 谢谢啦!!!
  • 基于单片机控制开关电源设计

    千次阅读 2020-09-26 06:01:09
      电源技术是一种应用功率半导体器件,综合电力变换技术、现代电子技术、自动控制技术的多学科的边缘交叉技术。随着科学技术的发展,电源技术又与现代控制理论、材料科学、电机工程、微电子技术等许多领域密切相关...

    文末下载完整资料

    1 概述
    1.1 课题来源及意义
      电源技术是一种应用功率半导体器件,综合电力变换技术、现代电子技术、自动控制技术的多学科的边缘交叉技术。随着科学技术的发展,电源技术又与现代控制理论、材料科学、电机工程、微电子技术等许多领域密切相关。目前电源技术已逐步发展成为一门多学科互相渗透的综合性技术学科。他对现代通讯、电子仪器、计算机、工业自动化、电力工程、国防及某些高新技术提供高质量、高效率、高可靠性的电源起着关键作用。
      当代许多高新技术均与市电的电压、电流、频率、相位、和波形等基本参数的变换和控制相关,电源技术能够实现对这些参数的精确控制和高效率的处理,特别是能够实现大功率电能的频率变换,从而为多项高新技术的发展提供有力的支持。因此,电源技术不但本身是一项高新技术,而且还是其他多项高新技术的发展基础。电源技术及其产业的进一步发展必将为大幅度节约电能、降低材料消耗以及提高生产效率提供重要的手段,并为现代生产和现代生活带来深远的影响。

    1.2 课题基本要求
    (1)设计、制作开关电源;
    (2)使用单片机构成嵌入式控制系统,通过键盘预置输入电压,可显示预置电压和输出电压;
    (3)掌握开关电源的设计方法;
    (4)掌握单片机软件编程方法;
    (5)掌握PID控制原理;

    1.3 课题相关背景
      我国的三极管直流变换器及开关电源的研制工作开始于60年代初期,到了60年代中期进入了实用阶段,紧跟着70年代初开始研制无工频变压器开关电源。1974年研制成功了工作频率为10千赫兹、输出电压为5v的无工频开关电源。近30年来,许多研究所、工厂及高校已研制出多种型号的开关电源,并广泛的应用于电子计算机、通信、家电等许多方面,取得了很好的效果。工作频率为100千赫兹-200千赫兹的高频开关电源于80年代初期开始研制,90年代初试制成功,目前已经是非常成熟的电子产品。按调制方式划分可以分为:
    (1)脉宽调制型:振荡频率保持不变,通过改变脉冲的宽度来改变和调节输出电压的大小。通过采样电路、耦合电路构成闭合回路,来稳定输出电压。缩写为PWM(Pulse Width Modulation)。
    (2)频率调制型:占空比保持不变或关断时间不变,改变振荡器的频率来稳定并调节输出电压幅度。缩写为PFM(Pulse Frequency modulation)。
    (3)混合调制型:通过调节导通时间的振荡频率来完成稳定并输出电压幅度。
    通常采用的是脉宽调制型和混合调制型两种调制方式。在脉宽调制中因为频率不变,所以无论是对电路中的磁性元件及晶体管的测试和设计都很方便,而且对射频干扰的抑制也变得比较容易。混合调制则因其线路简单,也得到了广泛的应用。相对而言,频率调制较少采用。本文中采用的是脉宽调制型。

    2 开关电源方案设计
    2.1 开关电源工作原理
      开关电源是指调整管工作在开关方式,即导通和截止状态的稳压电源,缩写为SPS(Switching Power Supply)。开关电源的核心部分是一个直流变换器。利用直流变换器可以把一种直流电压变成极性、数值不同的多种直流电压。
      图2.1所示电路的工作过程为:假设基准电压为5v,由于电网波动导致输入电压减小,那么输出电压也将会减少,此时,所采样的电压将减小,假设为4.9v,误差为0.1v,经过比较放大后,脉冲调制电路根据这个误差,提高占空比使输出电压增大,同理,当由于电网波动导致输出电压增大时,脉冲调制电路降低占空比使输出电压减小,以此来控制输出电压的稳定。
    在这里插入图片描述
      按电源电路中功率管的工作方式划分,电源可以分为开关电源与线性电源两大类。线性电源是发展较早的一种电源,其功率管工作在线性放大区。开关电源是在线性电源的基础之上发展起来的,并在很大程度上克服了线性电源的缺陷,但其自身也有一定的不足。

    2.2 开关电源与线性电源的比较
    2.2.1线性电源的缺点
    (1)功耗大,效率低,效率一般只有35%-45%;(2)体积大、重量大,不能小型化;(3)必须有较大容量的滤波电容。
    造成这些缺点的原因是:(1)线性电源中功率晶体管V在整个工作过程中,一直工作在晶体管特征曲线的线性放大区。功率晶体管本身的功耗与输出电流成正比。这样功率晶体管的功耗就会随电源的输出功率的增加而增大。为了保证功率晶体管能正常工作,除选用功率大的管子外,还必须给管子加上较大的散热片。(2)线性电源使用了50赫兹的工频变压器,他的效率只有80%-90%。这样不但增加了电源的体积和重量,而且也大大降低了电源的效率,就必须增大滤波电容的容量。
    2.2.2开关电源的优点
    (1)功耗小,效率高。图2.1中,开关管V在脉冲信号的控制下,交替工作在导通-截止和截止-导通的开关状态,转换速度快,频率一般在50到200千赫兹。这就使得功率开关管的损耗较小,电源的效率可以大幅度提高,其效率可以达到80%以上。
    (2)体积小,重量轻。由于没有采用大型的工频变压器,并且在开关管上的耗散功率大幅度降低后,又省去较大的散热片,因此开关电源的体积和重量都可以得到减小。
    (3)稳压范围宽。开关电源的输出电压是由控制信号的占空比或者激励信号的频率来调节的,输入电压的变化可以通过变频或者调宽来进行补偿。在工频电网电压有较大变化或负载有较大变化时,它仍能保证有较稳定的输出电压,所以稳压范围宽、稳压效果好。
    (4)滤波的效率大为提高,使滤波电容的容量和体积大为减小。例如,若开关电源的工作频率为25千赫兹,是线性稳压电源频率500倍(25000/50赫兹),这使滤波电容的容量可以相应的缩小500倍,这使滤波电路中元件的体积和重量得以减少,同时也节省了成本。

    2.3 方案论证
      单片机控制的开关电源,从对输出电压控制的角度分析,可以有几种可行的方案。
    2.3.1方案1
      方案1:单片机通过数模转换输出一个电压,用作电源的基准电压,电源可以通过键盘预置输出电压,单片机不加入反馈控制,电源仍要使用专门的PWM控制芯片,工作过程为:当通过键盘预置电压时,单片机通过D/A芯片输出一个电压作为控制芯片的基准电压,这个基准电压可以使得控制芯片按照预置电压值,来输出控制脉冲,以输出期望输出电压。
    2.3.2方案2
      方案2:在方案1的基础上,单片机扩展模数转换器,不断的检测电源的输出电压,根据电源输出电压与设定值的差值,调整后,通过D/A芯片输出一个基准电压,控制专门的PWM控制芯片,间接的控制电源工作。
    2.3.3 方案3
      方案3:单片机扩展A/D转换器,不断检测输出端的电压,并根据电源输出电压与键盘预置电压的差值,输出一个PWM脉冲,直接控制电源的工作。
    2.3.4方案分析
      方案1分析:单片机没有加入反馈控制,只是输出一个基准电压,这样单片机的作用非常的小,而且仍要使用专门的控制芯片,价格比较贵,电源成本增加,削弱了单片机的作用,不宜采用。
      方案2分析:单片机加入了反馈控制,作用得以利用,但是需要扩展A/D和D/A芯片,而且还是需要专门的PWM控制芯片,成本比方案1更高,更不宜采用。
    方案3分析:这个方案,单片机不仅加入了反馈控制系统,而且作为控制核心,单片机得以充分利用,而且省去了D/A芯片,成本大大降低,是真正的单片机控制。
      综上所述,本设计选择第三种控制方案,单片机使用89C51,A/D芯片采用ADC0832,采用4位数码管显示采样值,键盘预置电压,设计任务要求输出可调,所以设定值需要从键盘输入,实现输入不同的电压,输出便可以输出不同的电压。

    2.3.5总体结构设计
      系统工作原理图如图2.2所示:市电经过整流滤波后,一路电压经过7805稳压得到一个+5v电压,该电压作为单片机的工作电源,另外一路电压直接作为开关变换电路的输入电压。单片机根据键盘输入值和取样值之间的差值,修改脉冲占空比,并输出控制功率开关管,以便得到期望的输出电压值,并根据模/数转换器所采样的电压和键盘输入比较,根据差值调用PID算法再次修改脉宽使输出电压稳定。开关变换器采用磁铁心电感作为储能元件,在功率开关管导通时,电感储能,在开关管截止时,电感释放能量给负载。单片机定时采样输出端的电压,通过ADC0832送进单片机进行处理,单片机根据处理结果输出更新的控制信号,经过光电耦合器滤除干扰后输出控制信号控制功率开关管工作状态。在本系统中,用户可以根据需要从键盘输入期望的电压,单片机会根据键盘输入与采样电压的差值,更新脉宽,使电源输出相应电压,更新脉宽后,单片机会马上调用PID控制算法,对输出电压进行稳定控制。
      闭环时,电源自动进行脉宽调制,当系统读取到键盘预置的电压变化时,先将键盘输入值和从输出端的取样值相比较,假设当前键盘输入为10v,从输出端取样的值为6v,差值为4v,则系统会根据这个差值,更新脉宽使得输出端电压上升为10v;同样,当键盘输入为6v,输出端取样值为10v,差值为-4v,系统会根据算法,将占空比减小以使输出电压变小,这就是系统脉宽调制过程。
    同时,电源可以自动稳压,假定在某一正常状态下,输出为V0,反馈电压问Vf(Vf=V0),用户设定电压为Vs,当V0=Vs时,偏差为0,单片机不进行脉宽更新,当电网波动导致输出增加时,即V0>Vs时,单片机采样的电压也增加,单片机根据偏差修改占空比使导通时间变小,从而使电压下降,同样当电网波动使输出电压下降时,即V0<Vs时,单片机修改脉宽使导通时间变长,从而使输出电压上升,如此循环来进行稳压。

    在这里插入图片描述
    2.6 开关变换器结构分析与选择
      开关电源的核心是高频开关变换电路和脉冲控制电路。高频变换电路把直流输入变换成高频脉冲输出。输出电压平均值 ,控制电路根据反馈电压控制高频开关管的导通时间( )与截止时间( ),达到控制输出电压目的。隔离电路采用高频变换器件和高频隔离变压器。
    开关电源的四中组态为:
    (1)Buck变换器;
    (2)Boost变换器;
    (3)Buck-Boost变换器;
    (4)CUK变换器。
    2.6.1降压变换电路分析
      这种开关型电源是直流供电,经过开关电路得到单方向方波,再经过滤波后又得到与输入电压不同的稳定的直流。它们的输出电压总是比输入电压低。
    当开关管饱和导通时,电能储存在电感中,同时也流向负载。当开关元件被控制截止时,由于电感上的电流不能跳变,储存于电感中的能量继续供给负载,此时,续流二极管正向导通,构成闭合回路。电容起到平滑输出的作用。电路中开关管和负载电阻是串联的,所以也称它为串联开关电源。
    在这里插入图片描述


    全套资料免费下载:
    关注v-x-公-众-号:【嵌入式基地
    后-台-回-复:【毕业设计】 即可获资料
    回复【编程】即可获取
    包括有:C、C++、C#、JAVA、Python、JavaScript、PHP、数据库、微信小程序、人工智能、嵌入式、Linux、Unix、QT、物联网、算法导论、大数据等资料
    在这里插入图片描述

    展开全文
  • 提出了基于单片机控制的程控开关电源解决方案,给出的主电路采用典型单端反激电路模式,控制电路采用51单片机为核心芯片,结合AD采样解决了控制功率开关管导通与关断信号PWM的控制问题。实现了开关电源输出电压为0.1 V...
  • 如何利用单片机设计汽车开关电源,实际应用
  • 本系统采用BUCK变换器实现DC-DC变换,以基于ARM的最小系统为控制单元,通过对输出电压不断地采样,反馈输出变化,调整占空比使输出稳定,并且可通过按键、数码显示实现输出电压数控。此外,系统加以输入过压、输入过...
  • 基于51单片机的数控电源设计来源:mahuaxiao作者:华仔浏览:1099时间:2016-08-10 14:18标签:摘要:介绍了以51系列单片机为控制单元,以数模转换器DAC0832输出参考电压,以该参考电压控制电压转换模块LM350的输出...

    基于51单片机的数控电源设计

    来源:mahuaxiao

    作者:华仔

    浏览:1099

    时间:2016-08-10 14:18

    标签:

    摘要:

    介绍了以51系列单片机为控制单元,以数模转换器DAC0832输出参考电压,以该参考电压控制电压转换模块LM350的输出电压大小。该电路设计简单,应用广泛,精度较高等特点。关键词:单片机(MCU),数模转换器(DA),掉电存储器(EEPROM)。引言目前所使用的直流可调电源中,几乎都为旋纽开关调节电压,调节精度不高,而且经常跳变,使用麻烦。利用数控电源,可以达到每步0.1V的精度,输出电压范围0~15V,电流可以达到2A。系统结构图1

    介绍了以51系列单片机为控制单元,以数模转换器DAC0832输出参考电压,以该参考电压控制电压转换模块LM350的输出电压大小。该电路设计简单,应用广泛,精度较高等特点。   关键词:单片机(MCU),数模转换器(DA),掉电存储器(EEPROM)。

    引言

    目前所使用的直流可调电源中,几乎都为旋纽开关调节电压,调节精度不高,而且经常跳变,使用麻烦。利用数控电源,可以达到每步0.1V的精度,输出电压范围0~15V,电流可以达到2A。

    系统结构

    图1:硬件系统结构图

    对选用芯片说明

    DAC0832是一款常用的数摸转换器,它有两种连接模式,一种是电压输出模式,另外一种是电流输出模式,为了设计的方便,选用电压输出模式,如电路图所示,Iout1和Iout2之间接一参考电压,VREF输出可控制电压信号。它有三种工作方式:不带缓冲工作方式,单缓冲工作方式,双缓冲工作方式。该电路采用单缓冲模式,由电路图可知,由于/WR2=/XFER=0,DAC寄存处于直通状态。又由于ILE=1,故只要在选中该片(/CS=0)的地址时,写入(/WR=0)数字量,则该数字信号立即传送到输入寄存器,并直通至DAC寄存器,经过短暂的建立时间,即可以获得相应的模拟电压,一旦写入操作结束,/WR1和/CS立即变为高电平,则写入的数据被输入寄存器锁存,直到再次写入刷新。

    AT24C02是一款常用的可掉电保存数据的ROM,2K比特容量,采用I2C总线操作,关于它的具体操作方法参考相关资料。

    图2:主硬件电路图

    图3:参考电压电路图

    硬件电路设计

    采用常用的51芯片作为控制器,P0口和DAC0832的数据口直接相连,DA的/CS和/WR1连接后接P2.0,/WR2和/XEFR接地,让DA工作在单缓冲方式下。DA的11脚接参考电压,参考电压电路如图2所示,通过调节可调电阻调节LM336的输出电压为5.12V,所以在DAC的8脚输出电压的分辨率为5.12V/256=0.02V,也就是说DA输入数据端每增加1,电压增加0.02V。

    DA的电压输出端接放大器OP07的输入端,放大器的放大倍数为 R8/(R8+R9)=1K/(1K+4K)=5,输出到电压模块LM350的电压分辨率=0.02V×5=0.1V。所以,当MCU输出数据增加1的时候,最终输出电压增加0.1V,当调节电压的时候,可以以每次0.1V的梯度增加或者降低电压。

    本电路设计三个按键,KEY1为翻页按键,最近设置的电压大小保存在EEROM里面,比如10个电压,按一下KEY1,电压变为下一个,省去了反复设置电压的麻烦,KEY2为电压+,KEY3为电压+,按一下KEY2,当前电压增加0.1V,按一下KEY3,当前电压减小0.1V。

    限于篇幅原因,未画出数码管显示电路,该系统使用3个数码管,可以显示三位数,一个小数位,比如可以显示12.5V,采用动态扫描驱动方式。本主电路的原理是通过MCU控制DA的输出电压大小,通过放大器放大,给电压模块作为最终输出的参考电压,真正的电压,电流还是由电压模块LM350输出。

    为了达到2A的输出电流,LM350必须选用金属外壳封装,并且带稍大面积的散热片。

    软件流程

    软件系统

    软件的设计主要完成三方面的功能:

    1.设置电压并且保存,主要是对EEROM的操作。

    2.把设置的电压送到DA,主要是对DA的操作。

    3.中断显示,把设置的电压显示到LED数码管上。

    该数控电压源实现保存最近10电压功能,当打开电源的时候,它显示和输出的必须是上次使用电压大小,所以在EEROM中使用11个地址保存数据,第一个地址保存当前电压编号,大小为1~10。第2个地址~第11个地址连续保存10个电压大小数据。电压编号的大小分别对应到相应地址电压大小。

    对软件流程做一下说明:当电源打开的时候,MCU进行复位,寄存器清零。接着电源应该显示和输出上次关机前的电压大小,这时候MCU先读取EEPROM中保存的电压编号,根据电压编号读出对应电压,把该数据送到DA,在转换成BCD码送到显示部分。这时候程序循环检测是否有按键信号,如果KEY1按下,电压编号指向下一个,保存该电压编号,读对应电压,把他送到DA并且显示。如果KEY2按下,当前电压数据加1,相对应输出电压(POWER—OUT引脚)增加0.1V,保存设置电压数据。如果KEY3按下,电压数据减1,输出电压

    减少0.1V,保存设置电压数据。

    结语

    该数控电压源经过时间实际使用说明,具有精度高,使用方便,硬件电路简单等特点。如果要作成产品,还需要增加电流测量和显示部分,对这部分电路请参考相关资料。本文主要对如何控制功率输出电压大小做出个例子,该电路对测量领域,以及马达调速方面都可以扩展使用。

    参考文献:

    1. 陆坤.奚大顺等《电子设计技术》电子科技大学出版社. 1997.5

    2. 马忠梅.籍顺心等 《单片机的C语言应用程序设计》北京航空航天大学出版社 2001.5

    分享到:

    eb16ac850798d72e084e2c3ed33ff707.png

    展开全文
  • 单片机控制开关电源源程序

    热门讨论 2013-09-11 18:13:26
    最好用的程序,曾经在国家比赛获得二等奖!
  • 文章详细叙述了密码电源开关的硬件结构和软件设计流程,通过论述表明,用单片机控制的密码电源开关具有结构灵活、开发经济、工作稳定等优势。    关键词:密码电源开关;硬件结构;软件设计    随着现代技术的...
  • 今天分享一个基于51单片机的简易数控可调电源的仿真。数控电源其实就是将传统模拟可调恒压恒流线性电源的恒压环路和恒流环路通过单片机+运放来实现。首先电源在开机的时候是处于待机状态的,电源无输出,按一下输出...

    今天分享一个基于51单片机的简易数控可调电源的仿真。

    8fc92e6b1acbcd3b45714da19a99359e.png

    数控电源其实就是将传统模拟可调恒压恒流线性电源的恒压环路和恒流环路通过单片机+运放来实现。首先电源在开机的时候是处于待机状态的,电源无输出,按一下输出按钮,单片机会把预置好的一个值输出给运放处理后送给电源调整管让电源有输出,同时输出部分的稳压环路和恒流环路会采集数据送到单片机中进行负反馈处理,然后去控制调整管的开关,从而达到稳压和恒流的功能。

    今天要分享的基于51单片机的简易数控直流电源可以实现1.5V-4.9V的直流电压输出调节,输出电压精度为0.1V,电压调节的步进值为0.1V。

    5b4deb569cf2725deb5234698c6cca67.png

    仿真图如上图所示。主控芯片为AT89C51单片机,该仿真利用直流稳压器LM317作为直流电压输出芯片,通过单片机对数字电位器MCP41010的数值进行调整进而达到控制输出电压的目的。为了使输出电压能够准确,该仿真利用ADC0804对LM317芯片的输出电压进行采集,从而构成电压闭环,使输出电压更加准确。仿真中采用了三个独立的7段式数码管用于显示实时的输出电压,利用两个独立按键完成对输出电压的加减调节。

    fd7820e9dd72cdb0b95dbeb93e2b2e6a.png

    LM317是应用最为广泛的电源集成电路之一,它不仅具有固定式三端稳压电路的最简单形式,又具备输出电压可调的特点。此外,还具有调压范围宽、稳压性能好、噪声低、纹波抑制比高等优点。LM317是可调节3端正电压稳压器,在输出电压范围1.2伏到37伏时能够提供超过1.5安的电流,此稳压器非常易于使用。

    bcb9ff75ceb6cde63a48a7f904de96bf.png

    LM317的标准应用电路如上图,在该仿真中,将传统的电位器改为数字电位器,通过调节数字电位器的阻值就可以改变芯片的输出电压。

    MCP41010是Microchip公司生产的一种集成数字电位器。它在单一芯片上集成一个10 kΩ数字电位器,电位器的滑动端共有256个离散的调节节点,并有一个8 b的E2PROM数据寄存器,直接控制滑刷在电位器上滑动端的位置。用户可以通过相应指令往数据寄存器写8位字,调节精度可达256。MCP41010芯片具有工业标准的SPI同步串口,可以实现寄存器操作,从而改变滑刷的位置。在使用的时候只需要使用51单片机的3个IO就可以完成对该芯片的控制操作。

    ADC0804是51单片机设计中比较常见的一个8位ADC,在这里就不作过多介绍。下面介绍一下仿真过程。

    2175305dadb9297b12e12ad85e0d2c86.png

    仿真的动态图如上图所示。仿真运行后,数码管显示1.5V,可以看到LM317右侧的电压表显示为1.54V,电压表显示的是LM317的实际输出电压,而数码管显示的是调整电压。右上角的两个独立按键可以对输出电压进行调整。

    91c7348bbe73991dfa99f0cae2a3449b.png

    8b891010223a0c38c51de10174a66f09.png

    12181e1b713edf76be1d7a7629db1914.png

    目标输出1.7V时,实际输出为1.74V;目标输出为3.8V时,实际输出为3.84V;目标输出为4.9V时,实际输出为4.93V。输出电压基本可以满足目标电压(当电压从4.9V直接变为1.5V或从1.5V直接变为4.9V时输出电压会有一个缓慢下降或上升的过程,这主要是因为该仿真时采用闭环调节的方式,这个缓慢下降的过程就是闭环调节的过程,过程的时间与调节速度有关系)。

    c44be7d3b15b1f7e2f27014139a48a3e.png

    贴一张程序图,有需要的小伙伴可以在公众号界面私信“51单片机简易可调电源”既可以获取仿真及源码。

    展开全文
  • 本文专门开发了以51系列单片机控制单元,以 TL494 作为核心部件,以AT89C52 单片机作为控制部件的开关稳压电源。该稳压电源具有在一定范围内可调、结构简单 , 工作可靠的特点 ,该电路设计简单,应用广泛,精度较高...
  • 本文设计的数控开关电源由两部分组成。开关电源部分采用基于PWM控制的不对称半桥功率变换器,由模拟控制芯片KA3525产生PWM信号经驱动电路实现对功率变换电路的输出电压控制,实现电压的稳定输出。
  • 在ATSE(CB型)控制器的设计中,根据应用的场合和需要...本文中ATSE控制器的设计,采用的是智能控制器,以51单片机为核心[4],完成控制器的设计,实现ATSE的功能。文中从硬件和软件设计两部分来说明ATSE控制器的设计。
  •    从本文开始,在之后的一段时间里,我会通过本系列文章,详细介绍如何从零开始用51单片机去实现智能小车的控制,本文作为本系列的第一篇文章,主要介绍如何让小车动起来。 一、硬件的选择    1、底盘和电机  ...

       从本文开始,在之后的一段时间里,我会通过本系列文章,详细介绍如何从零开始用51单片机去实现智能小车的控制,本文作为本系列的第一篇文章,主要介绍如何让小车动起来。

    本系列文章链接:

    -----------------------------------------------------------------------------

       详细介绍如何从零开始制作51单片机控制的智能小车(一)———让小车动起来
       详细介绍如何从零开始制作51单片机控制的智能小车(二)———超声波模块、漫反射光电管、4路红外传感器的介绍和使用
       详细介绍如何从零开始制作51单片机控制的智能小车(三)———用超声波模块和漫反射光电传感器实现小车的自动避障
       详细介绍如何从零开始制作51单片机控制的智能小车(四)———通过蓝牙模块实现数据传输以及通过手机蓝牙实现对小车运动状态的控制
       详细介绍如何从零开始制作51单片机控制的智能小车(五)———对本系列第四篇文章介绍的手机蓝牙遥控加减速异常的错误的介绍及纠正

    -----------------------------------------------------------------------------

    一、硬件的选择

       1、底盘和电机

       底盘的形状呢,大家可以按照自己的需要自主选取,至于电机关注一下工作电压,转速,电机类型就差不多,对于新手,可以尝试以下样式(4WD智能小车底盘,附带4个直流减速电机,电机接线需要自己焊接),也就是本文例子采用的底盘和电机,组装简单,使用方便,特别适合新手。

    在这里插入图片描述

       2、电机驱动模块

        L298N电机驱动模块,绝对是新手的首选,但是此系列也包含了很多类型,本文采用的是L298N双H桥驱动 红色版 ,除了性能外,我选择它是因为它具备了5v的输出接口,可以用来给单片机供电。大家可以用两个这种驱动,也可以用一个,另一个用个便宜点的。
        由于家中有一个如下式样的L298N驱动,所以为了不让资源浪费,另一个,我就用如下型号的L298N驱动。

       3、单片机最小系统

        关于最小系统,大家只要选用自己熟悉的就行了,没什么特别的讲究,我采用的样式如下(芯片采用的是STC89C52)

       4、电源

        这一部分大家根据需要自己选择即可,选的时候注意一下电压和容量就行,我选用的是常见的 9v 650mAh(容量不是很大,但是这种电池比较常见,充一次电跑2~3小时应该不是问题),我选的是USB充电款,充电很方便,电池盒我选用的是如下的这种拆卸方便的款式,缺点就是不附带电源开关。

       5、杜邦线

        这是必备的辅件,就不多说了,公对公,母对母,公对母(这一种一般用的多一些)都要买一些,家里常备物品。

    二、硬件的连接

        本文涉及到的硬件连接为单片机、电源、 电机、 两个电机驱动L298N之间的连接,在这里我介绍一种参考的连接方式,大家可以自己设计连接方案
        如上图所示,四个电机的正负极分别接两个L298N的绿色电机接口,至于到底哪个接正极,哪个接负极,根据你电机安装的方式而定,建议先把电机的两根线焊上,然后把底盘安装起来,这样电机的安装方式就确定了,先随便把两个L298N的4个绿色电机接口跟电机相接,等到把其他信号线接好后,再判断对错并调节,调节方法如下:在程序中让小车往前跑,观察车轮的转向,往前转的车轮的线不用变,把往后转的电机对应的L298N绿色接口的两根线换一下就行了。
       如上图所示,L298N的左边数第一个蓝色端口 是5V输出,把其中一个L298N的该接口接到单片机的5v接口上,另一L298N该接口可以空着,左边数第二个蓝色端口是GND需要同时与单片机的GND与电源的负极相接,左边数第三个蓝色端口是L298N的电源输入端口,与电源的正极相接,我采用的是9v的电源。
       剩下的就是L298N的信号线与单片机的连接了,介绍如上图所示,在这里我采用的是双驱的接法,也就是左边两个点击用同一个信号控制,右边两个电机用同一个信号控制,单片机的I/O口自行选择,与程序配合起来就行,我选用的是 ENA接P16 ENB 接P17 IN1接P34 IN2接P35 IN3接P36 IN4接P37 若改为4驱所需的I/O将扩大一倍。

       收到部分读者说这部分连线还是不太明白,于是我简单画了以下的草图,帮助大家理解上面的内容(字不好看,请见谅)

       实物图片如下:

    三、程序的编写

       1、工程的建立

       编译环境根据自己习惯和需要选择,本文以KEIL C51为例,由于本次设计的小车控制并不复杂,所以我把工程中用到的所有头文件、函数的定义、sbit定义的位变量都放到了一个头文件中,取名为car.h(名字大家随意取即可),C文件呢我建议大家把各个部分别写在不同的文件中,比如我把与电机驱动有关的函数放到了motor_control.c(名字任意取)文件中,控制方案和延时函数,中断函数放到了主函数main.c(名字任意取)文件中,后续随着功能增加还会增设其他的C文件,只要所有的C文件均包含以上共同的头文件car.h,也就互相建立了联系。

       2、根据L298N与单片机的接线,编写电机控制函数

       虽然说本文选用的车型四个电机可以独立控制,但是为了简单化,方便化,我们让左边的两个电机采用共同的信号控制,右边的两个电机采用共同的信号控制,大家若需要可以自主改为4路独立的信号控制,根据本文第二部分——硬件的连接部分的介绍,我们选用了单片机的P34 P35 I/O口作为左电机的方向控制信号,单片机的P36 P37 I/O口作为右电机的方向控制信号,单片机的P16 I/O口作为左电机的PWM输出控制信号,单片机的P17 I/O口作为右电机的PWM输出控制信号。
       以上6个I/O口的位定义如下(为方便各文件调用,我们把它放到统一的h文件car.h中)
    sbit Left_moto_pwm=P1^6 ;
    sbit Right_moto_pwm=P1^7;
    sbit p34=P3^4;
    sbit p35=P3^5; 
    sbit p36=P3^6;
    sbit p37=P3^7;
    
        左右电机的状态控制函数如下:
    void Left_moto_go()  //左电机正转
    {p34=0;p35=1;} 
    void Left_moto_back() //左电机反转
    {p34=1;p35=0;} 
    void Left_moto_stp()  //左电机停转
     {p34=1;p35=1;} 
    void Right_moto_go()  //右电机正转
    {p36=0;p37=1;} 
    void Right_moto_back() //右电机反转
    {p36=1;p37=0;}  
    void Right_moto_stp()  //右电机停转
    {p36=1;p37=1;} 
    
    

      4、PWM调速输出函数的编写:

        对于新手来说,如果理解不了以下两个函数,那只需要知道如何使用就行了,即通过修改push_val_left的值就可以调节左电机的转速,通过修改push_val _right的值就可以调节右电机的转速,push_val_left和push_val_right的值均位于1到10之间,值越大电机转速越快
    bit Left_moto_stop =1;
    bit Right_moto_stop =1;
    unsigned char pwm_val_left =0;
    unsigned char push_val_left =0; 
    unsigned char pwm_val_right =0;
    unsigned char push_val_right=0;
    
    
    void pwm_out_left_moto(void)     //左电机调速
    { 
    if(Left_moto_stop) 
    { 
    if(pwm_val_left<=push_val_left) 
    Left_moto_pwm=1; 
    else 
    Left_moto_pwm=0; 
    if(pwm_val_left>=10) 
    pwm_val_left=0; 
    } 
    else 
    Left_moto_pwm=0; 
    } 
    
    void pwm_out_right_moto(void)   //右电机调速
    { 
    if(Right_moto_stop) 
    { 
    if(pwm_val_right<=push_val_right) 
    Right_moto_pwm=1; 
    else 
    Right_moto_pwm=0; 
    if(pwm_val_right>=10) 
    pwm_val_right=0; 
    } 
    else 
    Right_moto_pwm=0; 
    } 
    

      5、小车姿态控制函数的编写:

       理解了 左右电机的状态控制函数,编写小车姿态控制函数就很简单了,大家稍微想一下小车左右轮的状态,小车会怎么运行,就理解了,比如 左右电机都正转,那小车运行状态肯定是前行。每个函数的前两行是左右电机转速的设置。
    
    unsigned char Left_Speed_Ratio;  //左电机转速的设定值
    unsigned char Right_Speed_Ratio; //右电机转速的设定值
    
    
    
    void run(void)     //小车前行
    { 
    push_val_left =Left_Speed_Ratio;    
    push_val_right =Right_Speed_Ratio; 
    Left_moto_go(); 
    Right_moto_go(); 
     } 
    
     
    
    void back(void)   //小车后退
    { 
    push_val_left =Left_Speed_Ratio; 
    push_val_right =Right_Speed_Ratio; 
    Left_moto_back();
    Right_moto_back();
     } 
    
    
    
    void left(void)   //小车左转
    { 
    push_val_left =Left_Speed_Ratio; 
    push_val_right =Right_Speed_Ratio;
    Right_moto_go(); 
    Left_moto_stp();
    } 
    
     void right(void) //小车右转
    { 
    push_val_left =Left_Speed_Ratio;
    push_val_right =Right_Speed_Ratio;
    Right_moto_stp();
    Left_moto_go();
    } 
    
    void stop(void)  //小车停止
    { 
    push_val_left =Left_Speed_Ratio; 
    push_val_right =Right_Speed_Ratio; 
    Left_moto_stp();
    Right_moto_stp();
     } 
    
    void rotate(void) //小车原地转圈
    { 
    push_val_left =Left_Speed_Ratio; 
    push_val_right =Right_Speed_Ratio; 
    Left_moto_back();
    Right_moto_go();
     } 
    

      6、与定时器中断有关函数的编写

    void Timer0Init()    //定时器初始化函数
    {
    	TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。
    
    	TH0=0XFC;	//给定时器赋初值,定时1ms
    	TL0=0X18;	
    	ET0=1;//打开定时器0中断允许
    	EA=1;//打开总中断
    	TR0=1;//打开定时器			
    }
    
    
    
    void timer0()interrupt 1 using 2  //定时器中断函数,此处配置为1ms产生一次中断,对PWM的输出进行控制
    { 
    TH0=0XFC;	//给定时器赋初值,定时1ms
    TL0=0X18;
    time++; 
    pwm_val_left++; 
    pwm_val_right++; 
    pwm_out_left_moto(); 
    pwm_out_right_moto(); 
    } 
     
    

      7、延时函数的编写

       关于延时函数,大家只要会用就行,可以用单片机小精灵等辅助软件生成,以下为延时1秒的函数
    void delay1s(void)   
    {
        unsigned char a,b,c;
        for(c=167;c>0;c--)
            for(b=171;b>0;b--)
                for(a=16;a>0;a--);
        _nop_();  
    }
    

      8、主函数内容的编写

       关于主函数的内容,首先要调用定时器中断初始化函数,其次要设置左右电机的速度参数,本文的主要内容是让车动起来,所以主函数内要调用本部分第5步中编写的小车姿态控制函数,对其进行检验,为了便于观察两个状态之间加了5秒的延时,代码如下:
    void main()
    	{
    	Timer0Init();  
    	Left_Speed_Ratio=5;   //设置左电机车速为最大车速的50%
    	Right_Speed_Ratio=5;	设置右电机车速为最大车速的50%
    	while(1)
    		{
    	run();
    	delay1s(); delay1s();  delay1s();  delay1s();  delay1s();
    	back();
    	delay1s(); delay1s();  delay1s();  delay1s();  delay1s();
        left();
        delay1s(); delay1s();  delay1s();  delay1s();  delay1s();
        right();
        delay1s(); delay1s();  delay1s();  delay1s();  delay1s();
    	stop();		
    	delay1s(); delay1s();  delay1s();  delay1s();  delay1s();
        rotate();
    	delay1s(); delay1s();  delay1s();  delay1s();  delay1s();		
    					
    		}
    }
    

    四、本文例子完整的C文件和H文件代码

       1、motor_control.c文件完整代码如下:

    #include <car.h>
    
    
    unsigned char pwm_val_left =0;
    unsigned char push_val_left =0; 
    unsigned char pwm_val_right =0;
    unsigned char push_val_right=0;
    unsigned char Left_Speed_Ratio;
    unsigned char Right_Speed_Ratio;
    
    bit Left_moto_stop =1;
    bit Right_moto_stop =1;
    
    
    void Left_moto_go()  //左电机正转
    {p34=0;p35=1;} 
    void Left_moto_back() //左电机反转
    {p34=1;p35=0;} 
    void Left_moto_stp()  //左电机停转
     {p34=1;p35=1;} 
    void Right_moto_go()  //右电机正转
    {p36=0;p37=1;} 
    void Right_moto_back() //右电机反转
    {p36=1;p37=0;}  
    void Right_moto_stp()  //右电机停转
    {p36=1;p37=1;} 
    
    
    void pwm_out_left_moto(void)    //左电机PWM
    { 
    if(Left_moto_stop) 
    { 
    if(pwm_val_left<=push_val_left) 
    Left_moto_pwm=1; 
    else 
    Left_moto_pwm=0; 
    if(pwm_val_left>=10) 
    pwm_val_left=0; 
    } 
    else 
    Left_moto_pwm=0; 
    } 
    
    void pwm_out_right_moto(void)    //右电机PWM
    { 
    if(Right_moto_stop) 
    { 
    if(pwm_val_right<=push_val_right) 
    Right_moto_pwm=1; 
    else 
    Right_moto_pwm=0; 
    if(pwm_val_right>=10) 
    pwm_val_right=0; 
    } 
    else 
    Right_moto_pwm=0; 
    } 
    
    
    void run(void)     //小车前行
    { 
    push_val_left =Left_Speed_Ratio;    
    push_val_right =Right_Speed_Ratio; 
    Left_moto_go(); 
    Right_moto_go(); 
     } 
    
     
    
    void back(void)   //小车后退
    { 
    push_val_left =Left_Speed_Ratio; 
    push_val_right =Right_Speed_Ratio; 
    Left_moto_back();
    Right_moto_back();
     } 
    
    
    
    void left(void)   //小车左转
    { 
    push_val_left =Left_Speed_Ratio; 
    push_val_right =Right_Speed_Ratio;
    Right_moto_go(); 
    Left_moto_stp();
    } 
    
     void right(void) //小车右转
    { 
    push_val_left =Left_Speed_Ratio;
    push_val_right =Right_Speed_Ratio;
    Right_moto_stp();
    Left_moto_go();
    } 
    
    void stop(void)  //小车停止
    { 
    push_val_left =Left_Speed_Ratio; 
    push_val_right =Right_Speed_Ratio; 
    Left_moto_stp();
    Right_moto_stp();
     } 
    
    void rotate(void) //小车原地转圈
    { 
    push_val_left =Left_Speed_Ratio; 
    push_val_right =Right_Speed_Ratio; 
    Left_moto_back();
    Right_moto_go();
     } 
    
    

       2、main.c文件完整代码如下:

    #include <car.h>
    
    extern unsigned char Left_Speed_Ratio;
    extern unsigned char Right_Speed_Ratio;
    unsigned int time=0; 
    extern unsigned char pwm_val_left;
    extern unsigned char pwm_val_right;
    
    void delay1s(void)   
    {
        unsigned char a,b,c;
        for(c=167;c>0;c--)
            for(b=171;b>0;b--)
                for(a=16;a>0;a--);
        _nop_();  
    }
    
    void Timer0Init()
    {
    	TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。
    
    	TH0=0XFC;	//给定时器赋初值,定时1ms
    	TL0=0X18;	
    	ET0=1;//打开定时器0中断允许
    	EA=1;//打开总中断
    	TR0=1;//打开定时器			
    }
    
    
    
    void timer0()interrupt 1 using 2 
    { 
    TH0=0XFC;	//给定时器赋初值,定时1ms
    TL0=0X18;
    time++; 
    pwm_val_left++; 
    pwm_val_right++; 
    pwm_out_left_moto(); 
    pwm_out_right_moto(); 
    } 
    
    void main()
    	{
    	Timer0Init();  
    	Left_Speed_Ratio=5;   //设置左电机车速为最大车速的50%
    	Right_Speed_Ratio=5;	设置右电机车速为最大车速的50%
    	while(1)
    		{
    	run();
    	delay1s(); delay1s();  delay1s();  delay1s();  delay1s();
    	back();
    	delay1s(); delay1s();  delay1s();  delay1s();  delay1s();
        left();
        delay1s(); delay1s();  delay1s();  delay1s();  delay1s();
        right();
        delay1s(); delay1s();  delay1s();  delay1s();  delay1s();
    	stop();		
    	delay1s(); delay1s();  delay1s();  delay1s();  delay1s();
        rotate();
    	delay1s(); delay1s();  delay1s();  delay1s();  delay1s();		
    					
    		}
    }
    
    
    

       3、car.h文件完整代码如下:

    #ifndef __car_H
    #define __car_H
    
    #include <reg52.h>
    #include <intrins.h>
    
    sbit Left_moto_pwm=P1^6 ;
    sbit Right_moto_pwm=P1^7;
    sbit p34=P3^4;
    sbit p35=P3^5; 
    sbit p36=P3^6;
    sbit p37=P3^7;
    
    
    void Left_moto_go() ;
    void Left_moto_back() ;
    void Left_moto_stp() ;
    void Right_moto_go();
    void Right_moto_back(); 
    void Right_moto_stp(); 
    void delay(unsigned int k) ;
    void delay1s(void) ;
    void pwm_out_left_moto(void) ;
    void pwm_out_right_moto(void);
    void run(void);
    void back(void);
    void left(void);
    void right(void);
    void stop(void);
    void rotate(void);
    
    

    五、本文例子实物视频演示

           实物视频演示视频链接

        点击上面的链接即可查看本文介绍内容的视频演示,内容依次为(即主函数中程序的内容):前进5秒 、后退5秒、左转5秒、右转5秒、停转5秒、转圈5秒。附视频网址:

        https://www.bilibili.com/video/bv1N5411x7zL

       本文到这里就结束了,本文完整的工程文件我会放在附件里,需要者自取,我放的时候都是免费的,但是过段时间它会自己涨…,欢迎大家继续阅读本系列的后续文章“详细介绍如何从零开始制作51单片机控制的智能小车(二)———超声波模块、漫反射光电管、4路红外传感器的介绍和使用”

       本系列文章的附件已经支持自主下载,附件获取方式如下(推荐通过Gitee免费下载):
    https://blog.csdn.net/qq_44339029/article/details/114887405

       欢迎大家积极交流,本文未经允许谢绝转载

    展开全文
  • 脉冲宽度调制是一种模拟控制方式,其根据相应载荷的变化来调制晶体管基极或MOS管栅极的偏置,来实现晶体管或MOS管导通时间的改变,从而实现开关稳压电源输出的改变。这种方式能使电源的输出电压在工作条件变化时保持...
  • 本文专门开发了以51系列单片机控制单元,以 TL494 作为核心部件,以AT89C52 单片机作为控制部件的开关稳压电源。该稳压电源具有在一定范围内可调、结构简单 , 工作可靠的特点 ,该电路设计简单,应用广泛,精度较高...
  • 51单片机控制TB6600驱动器驱动42步进电机

    万次阅读 多人点赞 2019-05-28 00:30:32
    51单片机控制TB6600驱动器驱动42步进电机功能实现目标硬件简介硬件连接程序代码功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个...
  • 本文墓于89C51单片机设计了电机励磁回路用双路输出数字开关电源, 首先介绍了Buck DC/DC变换器主电路工作原理;其次提出了关健电路的硬件设计和系统结构框图, 分析了双路输出数字开关电源的软件设计,给出了主程序和...
  • 51单片机控制LCD1602模块

    万次阅读 多人点赞 2018-01-28 22:41:37
    51单片机控制LCD1602模块视频播放:LCD1602视频(1)LCD1602概述先来看看LCD1602什么意思?Liquid Crystal Display(LCD)表示液晶显示,1602 表示一行可以显示16个字符,一共有两行。现在我们来看看如何使用简单的IO...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,106
精华内容 1,242
关键字:

51单片机控制电源开关