单片机与控制实验(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
LJMPSTART
ORG0003H
LJMPOUTINT
ORG000BH
LJMPTIME0
ORG001BH
LJMPTIME1
ORG 0030H
P4SW EQU 0BBH
P4 EQU 0C0H
CLKEQUP4.4
DATEQUP4.5
S1EQUP3.6
S2 EQU P3.7
MOT EQU P1.1
START:
;对P4口进行初始化设置
MOVDPTR,#TAB
MOVP4SW,#70H
MOVR0,#0;计转速
MOVR1,#0;产生1s定时用
;R6、R5、R4数码管显示控制
MOV R6,#0;数码管个位
MOV R5,#0;数码管十位
MOV R4,#0;数码管百位
MOVR7,#0;交替显示时用
MOV60H,#100;存高电平
MOV61H,#100;存低电平
MOVR2,61H;R2用于快速定时中断中给MOT送值时计数,赋初值为低电平的个数
MOV62H,#200;按下s1时的目标值(最大值)
MOV63H,#100;按下s2时的目标值(最小值)
MOV64H,#150;不按键时的转速
MOV R3,64H ;计目标值(初始值为不按键时的转速)
;---------------------------------------------------------------------
;TMOD说明、T1/T0初值计算:
;---------------------------------------------------------------------
;T1"T0
;TMOD D7D6D5D4D3D2D1D0
;(89H)GATEC/TM1M0GATEC/TM1M0
;00010010
;|定时模式| 方式1 |由软件启动|| 方式2
;---------------------------------------------------------------------
MOVTMOD,#12H
;---------------------------------------------------------------------
;T0初值计算(快速定时中断,动态改变MOT的输出,0.1ms,方式2),Tosc=12MHz
;X=(2^8-(0.1ms)/12*Tosc)=256-100=156=9CH
;---------------------------------------------------------------------
MOVTH0,#9CH
MOVTL0,#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
;---------------------------------------------------------------------
MOVTH1,#3CH
MOVTL1,#0B0H
;中断开关
SETBEA
SETBEX0
SETBIT0
SETBET0
SETBTR0
SETBET1
SETBTR1
CLRMOT;电机初始状态设置为低电平
L1:
SJMPL1;死循环,用于查询
;---------------------------------------------------------------------
;每个1ms调整MOT口输出一次,一次调整一个脉冲
;60H存高电平输出次数,61H存低电平输出次数
;每隔1s调整60H,61H的值一次,来动态调整电机转速
;---------------------------------------------------------------------
TIME0:
;保存程序状态
PUSHACC
PUSHPSW
DJNZ R2,RETURN0;R2用于快速定时中断中给MOT送值时计数
CPLMOT;取反MOT
JNBMOT,LP0;判断MOT电平高低
MOVR2,60H;若MOT=1,给R2赋高电平计数值
LJMPRETURN0
LP0:
MOV R2,61H;若MOT=0,给R2赋低电平计数值
RETURN0:
POPPSW
POPACC
RETI
TIME1:
;保存程序状态
PUSHACC
PUSHPSW
INCR1;R1自增
CJNER1,#20,RETURN1;不等于20(小于20)直接return1,TIME1执行20次,产生1秒中断
MOVR1,#0
MOVR3,64H
;在1s中断中应该执行的操作
JNBS1,MAX;s1按下,R3置为MAX
JNBS2,MIN;s2按下,R3置为MIN
SJMPLOOP
MAX:
MOVR3,62H
SJMPLOOP
MIN:
MOVR3,63H
SJMPLOOP
;转速调整
LOOP:
MOVA,R0;R0计转速
SUBBA,R3;A-R3影响Cy
JCZENG;R0
SJMPSHOW;跳转交替显示
ZENG:
INC61H;增加低电平
DEC60H;减少高电平
SJMPSHOW
JIAN:
INC60H;增加高电平
DEC61H;减少低电平
SJMPSHOW
;交替显示
SHOW:
INCR7
CJNER7,#2,LP1;R7=1显示当前转速,R7=2显示目标转速
MOVR7,#0
;显示目标转速
MOV A,R3
MOV B,#100
DIV AB ;商A,余数B
MOV65H,A;百位
MOVA,B
MOV B,#10
DIV AB
MOV 66H,A;十位
MOV 67H,B;个位
MOV R6,67H;目标转速
MOVR5,66H
MOV R4,65H
LP1:
LCALLDSL
MOVR6,#0
MOVR5,#0
MOVR4,#0
MOVR0,#0
RETURN1:
POPPSW
POPACC
RETI
OUTINT:
INCR0
INCR6
CJNER6,#10,COUNT_EXIT
INCR5
MOVR6,#0
CJNER5,#10,COUNT_EXIT
INCR4
MOVR5,#0
CJNER4,#10,COUNT_EXIT
MOVR4,#0
COUNT_EXIT:
RETI
DSL:
MOVA,R6
MOVC A,@A+DPTR
LCALL DISPLAY
MOVA,R5
MOVC A,@A+DPTR
LCALL DISPLAY
MOVA,R4
MOVC A,@A+DPTR
LCALL DISPLAY
RET;中断函数内,此处必须是RET,RETI结束中断
DISPLAY:
MOVR0,#8
DS_L:
CLRCLK
RLCA
MOV DAT,C
SETB CLK
DJNZ R0,DS_L
RET
TAB:
DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
END
七、一点想法
在本次实验中,PWM脉宽调制是通过改变低电平(0,存在61