• 单片机与控制实验(3)——直流电机脉宽调制调速


    本文为大大维原创,最早于博客园发表,转载请注明出处!!!

     

    一、实验目的和要求

      掌握脉宽调制调速的原理与方法,学习频率/周期测量的方法,了解闭环控制的原理。

    二、实验设备

      单片机测控实验系统
      直流电机调速实验模块
      Keil开发环境
      STC-ISP程序下载工具

    三、实验内容  

      1. 编写程序,能够在数码管上显示一个数值。
      2. 固定向P1.1输出0,然后测量每秒钟电机转动的转数,将其显示在数码管,每秒刷新一次即可。
      3. 使用脉宽调制的方法,动态调整向P1.1输出的内容,使得电机转速能够稳定在一个预定值附近,同时实时显示当前转速。
      4. 根据输入修改电机转速目标值,设置两个转速目标值:低转速和高转速。
      5. 每隔一秒钟读取两个开关的状态,如果S1按下,动态调整输出,使得电机转速能够稳定到低转速目标值附近,如果S2按下,动态调整输出,使得电机转速能够稳定到高转速目标值附近。交替显示目标值和当前转速值。

     

    四、实验步骤

    1. 建立工程,实现实验内容1

      参考辅助材料,学习8031汇编语言使用和直流电机原理。  

    2. 编写中断程序,测量电机转速

      本程序需要使用定时器定时,并使用中断来同步。中断程序的典型例子如下: 

    ORG 0000H
    LJMP START
    ORG 000BH
    LJMP T0IN ;中断向量表
    ORG 0040H
    START: ...;初始化
    ...
    T0IN: ...;中断程序
    ... 
    RETI ;中断返回
    END

    3. 完成控制转速程序

      按照脉宽调制的原理,再添加一个快速的定时中断(0.1ms左右),在这个中断里面动态改变P1.1的输出,宏观上输出有效(0)的比例就是预定的控制变量。这个控制变量增大,电机转速就应该提高,但由于各种内部和外部因素,它们之间不存在简单的函数关系,因此必须根据测量出来的实际转速进行动态调整。

      首先将电机转速控制在一个预定数值附近,在每一个1秒钟中断测量出当前转速之后,将其与目标值相对比,如果不够则增加控制变量,否则减少之,这样就能逐步达到稳定转速的目的。同时将速度显示出来。

    4. 完成整体实验内容

      在上面程序的基础上,再加上根据开关状态改变预定转速的代码。同时,在主程序中交替显示目标值和当前转速值,显示一个内容之后等待一段时间(可以由延时代码实现),然后再显示另一个并延时。要显示的内容都是在中断中被修改的。

     

    五、实验原理

    本实验示意电路原理图(图中的P1.3应改为P1.1):

      对于直流电机来说,其转速由输入电压决定,因此具有平滑调速的效果;相比而言,交流电机的转速由交流电频率和电机结构决定,难以改变速度。当然,交流电机构造简单,没有换向器,所以容易制造高转速、高电压、大电流、大容量的电机;而直流电机一般用在负荷小,但要求转速连续可调的场合,如伺服电机。

      脉宽调制(Pulse Width Modulation,PWM)是一种能够通过开关量输出达到模拟量输出效果的方法。使用PWM可以实现频率调制、电压调制等效果,并且需要的外围器件较少,特别适合于单片机控制领域。这里只关心通过PWM实现电压调制,从而控制直流电机转速的效果。也称作脉宽调制调速。

      PWM的基本原理是通过输出一个很高频率的0/1信号,其中1的比例为δ(也叫做占空比),在外围积分元件的作用下,使得总的效果相当于输出δ×A(A为高电平电压)的电压。通过改变占空比就可以调整输出电压,从而达到模拟输出并控制电机转速的效果。

      使用单片机实现PWM,就是根据预定的占空比δ来输出0和1,这里δ就是控制变量。最简单的办法就是以某个时间单位(如0.1ms,相当于10kHz)为基准,在前N段输出1,后M-N段输出0,总体的占空比就是N/M。这种方法由于0和1分布不均匀,所以要求基准频率要足够高,否则会出现颠簸现象。

      要达到更稳定的效果,可以采用累加进位法如果将总的周期内的0和1均匀分散开。设置一个累加变量x,每次加N,若结果大于M,则输出1,并减去M;否则输出0。这样整体的占空比也是N/M。在实验中取M=256可以使程序更加简单。

      另外,由于本实验板的设计,输出0使电机工作。因此对于本实验,上面所说的0和1要翻转过来用。

      在本实验板中,电机每转动一次,与之相连的偏心轮将遮挡光电对管一次,因此会产生一个脉冲,送到INT0。要测量转速,既可以测量相邻两次中断之间的时间;也可以测量一秒种之内发生的中断次数。显然,后一种方法更加简单。

      进行转速控制时,涉及到三个变量:预期转速,实际转速和控制变量。这里控制变量就是占空比。我们并不能够预先精确知道某个控制变量的值会导致多少的实际转速,因为这里有很多内部和外部因素起作用(如摩擦力,惯性等),但可以确定就是随着控制变量的增加,实际转速会增加。

      反馈控制的基本原理就是根据实际结果与预期结果之间的差值,来调节控制变量的值。当实际转速高于预期转速时,我们需要减少控制变量,以降低速度;反之则需要调高控制变量。

      本实验的转速控制可以使用简单的比例控制算法,也就是当转速S大于预定值时,将输出0的个数减少;当转速小于预定值时,将输出0的个数增加。改变值正比于测量出的差值。也可自行使用其他更加复杂的算法。

      实验中采用的电机最大转速在200转/s左右,转速小于40转/s左右将不稳定,可能会停转。

     

     

    六、实验代码  

     

    ORG 0000H
    LJMP START
    ORG 0003H
    LJMP OUTINT
    ORG 000BH
    LJMP TIME0
    ORG 001BH
    LJMP TIME1
    ORG 0030H

     

    P4SW EQU 0BBH
    P4 EQU 0C0H
    CLK EQU P4.4
    DAT EQU P4.5
    S1 EQU P3.6
    S2 EQU P3.7
    MOT EQU P1.1
    START:
    ;对P4口进行初始化设置
    MOV DPTR,#TAB
    MOV P4SW,#70H

    MOV R0,#0 ;计转速
    MOV R1,#0 ;产生1s定时用

    ;R6、R5、R4数码管显示控制
    MOV R6,#0 ;数码管个位
    MOV R5,#0 ;数码管十位
    MOV R4,#0 ;数码管百位

    MOV R7,#0 ;交替显示时用
    MOV 60H,#100 ;存高电平
    MOV 61H,#100 ;存低电平

    MOV R2,61H ;R2用于快速定时中断中给MOT送值时计数,赋初值为低电平的个数

    MOV 62H,#200 ;按下s1时的目标值(最大值)
    MOV 63H,#100 ;按下s2时的目标值(最小值)
    MOV 64H,#150 ;不按键时的转速

    MOV R3,64H ;计目标值(初始值为不按键时的转速)
    ;---------------------------------------------------------------------
    ;TMOD说明、T1/T0初值计算:
    ;---------------------------------------------------------------------
    ; T1 | T0
    ;TMOD D7 D6 D5 D4 D3 D2 D1 D0
    ;(89H) GATE C/T M1 M0 GATE C/T M1 M0
    ; 0 0 0 1 0 0 1 0
    ; |定时模式| 方式1 |由软件启动| | 方式2
    ;---------------------------------------------------------------------
    MOV TMOD,#12H
    ;---------------------------------------------------------------------
    ;T0初值计算(快速定时中断,动态改变MOT的输出,0.1ms,方式2),Tosc=12MHz
    ;X=(2^8-(0.1ms)/12*Tosc)=256-100=156=9CH
    ;---------------------------------------------------------------------
    MOV TH0,#9CH
    MOV TL0,#9CH
    ;---------------------------------------------------------------------
    ;T1初值计算(定时中断,数码管显示控制,1s,方式1),Tosc=12MHz
    ;X=(2^16-(1s)/12*Tosc)=65536-1000000<0
    ;折中方法:每20次产生1s定时初值,一次间隔50ms
    ;X=(2^16-(50ms)/12*Tosc)=65536-50000=15536=3CB0H
    ;---------------------------------------------------------------------
    MOV TH1,#3CH
    MOV TL1,#0B0H

    ;中断开关
    SETB EA
    SETB EX0
    SETB IT0
    SETB ET0
    SETB TR0
    SETB ET1
    SETB TR1

    CLR MOT ;电机初始状态设置为低电平

    L1:
    SJMP L1 ;死循环,用于查询

    ;---------------------------------------------------------------------
    ;每个1ms调整MOT口输出一次,一次调整一个脉冲
    ;60H存高电平输出次数,61H存低电平输出次数
    ;每隔1s调整60H,61H的值一次,来动态调整电机转速
    ;---------------------------------------------------------------------
    TIME0:
    ;保存程序状态
    PUSH ACC
    PUSH PSW
    DJNZ R2,RETURN0 ;R2用于快速定时中断中给MOT送值时计数

    CPL MOT ;取反MOT
    JNB MOT,LP0 ;判断MOT电平高低
    MOV R2,60H ;若MOT=1,给R2赋高电平计数值
    LJMP RETURN0
    LP0:
    MOV R2,61H ;若MOT=0,给R2赋低电平计数值

    RETURN0:
    POP PSW
    POP ACC
    RETI

     

    TIME1:
    ;保存程序状态
    PUSH ACC
    PUSH PSW
    INC R1 ;R1自增
    CJNE R1,#20,RETURN1 ;不等于20(小于20)直接return1,TIME1执行20次,产生1秒中断
    MOV R1,#0
    MOV R3,64H

    ;在1s中断中应该执行的操作
    JNB S1,MAX ;s1按下,R3置为MAX
    JNB S2,MIN ;s2按下,R3置为MIN
    SJMP LOOP
    MAX:
    MOV R3,62H
    SJMP LOOP
    MIN:
    MOV R3,63H
    SJMP LOOP

    ;转速调整
    LOOP:
    MOV A,R0 ;R0计转速
    SUBB A,R3 ;A-R3影响Cy
    JC ZENG ;R0<R3,跳转ZENG
    JNC JIAN ;R0>R3,跳转JIAN
    SJMP SHOW ;跳转交替显示

    ZENG:
    INC 61H ;增加低电平
    DEC 60H ;减少高电平
    SJMP SHOW

    JIAN:
    INC 60H ;增加高电平
    DEC 61H ;减少低电平
    SJMP SHOW

    ;交替显示
    SHOW:
    INC R7
    CJNE R7,#2,LP1 ;R7=1显示当前转速,R7=2显示目标转速
    MOV R7,#0

     

    ;显示目标转速
    MOV A,R3 
    MOV B,#100
    DIV AB ;商A,余数B
    MOV 65H,A ;百位
    MOV A,B
    MOV B,#10
    DIV AB
    MOV 66H,A ;十位
    MOV 67H,B ;个位
    MOV R6,67H ;目标转速
    MOV R5,66H
    MOV R4,65H

    LP1:
    LCALL DSL

    MOV R6,#0
    MOV R5,#0
    MOV R4,#0
    MOV R0,#0

    RETURN1:
    POP PSW
    POP ACC
    RETI

    OUTINT:
    INC R0
    INC R6
    CJNE R6,#10,COUNT_EXIT

    INC R5
    MOV R6,#0
    CJNE R5,#10,COUNT_EXIT

    INC R4
    MOV R5,#0
    CJNE R4,#10,COUNT_EXIT
    MOV R4,#0
    COUNT_EXIT:
    RETI

    DSL:
    MOV A,R6
    MOVC A,@A+DPTR
    LCALL DISPLAY
    MOV A,R5
    MOVC A,@A+DPTR
    LCALL DISPLAY
    MOV A,R4
    MOVC A,@A+DPTR
    LCALL DISPLAY
    RET ;中断函数内,此处必须是RET,RETI结束中断

    DISPLAY:
    MOV R0,#8
    DS_L:
    CLR CLK
    RLC A
    MOV DAT,C
    SETB CLK
    DJNZ R0,DS_L
    RET

     

    TAB:
    DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
    END

     

    七、一点想法

      在本次实验中,PWM脉宽调制是通过改变低电平(0,存在61H中)和高电平(1,存在60H中)的输入比例实现的。初始时,高低电平均为100次(可以随便设置,高低电平次数也可以不同),比例为1:1。当当前转速低于目标转速时,增加低电平输入次数,减少高电平输入次数(两者总和不变,还是200次),增加了低电平的占空比,转速提高。当当前转速高于目标转速时,减少低电平输入次数,增加高电平输入次数(两者总和不变,还是200次),降低了低电平的占空比,转速降低。

      60H+61H的和(高低电平输入总和)影响转速调整精度和速度,值越大,精度越高(摆动越小),转速调整越慢;相反,值越小,转速调整越快,但精度越低(摆动越大)。

      转速调整的速度和精度还可以通过每次转速调整时,60H(高电平输入次数)和61H(低电平输入次数)调整的幅度来调控。幅度越大,转速调整越快,但精度越低,幅度越小,精度越高,转速调整越慢。

      60H和61H中的数可以随便(为正即可)取,但在整个过程中,61H+60H的值一定为一个定值,这样才能确定改变的是占空比。

    八、附录

     实验电路原理图:点击查看

  • 相关阅读:
    Chrony时间同步
    使用cfssl生成自签证书
    Docker运行时资源限制
    Docker的OverlayFS存储驱动
    Docker文件挂载总结
    Docker配置文件deamon.json详解
    Docker网络模式详解
    Dcoker命令使用详解
    Docker架构分解
    《数据采集和分析平台》笔记
  • 原文地址:https://www.cnblogs.com/liujw2114/p/5971075.html
Copyright © 2020-2023  润新知