掌握脉宽调制调速的原理与方法,学习频率/周期测量的方法,了解闭环控制的原理。
单片机测控实验系统
直流电机调速实验模块
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的个数增加。改变值正比于测量出的差值。也可自行使用其他更加复杂的算法。
PID调节介绍:https://blog.csdn.net/liudongdong19/article/details/79839062
ORG 0000H ;上电 & 复位 入口地址
LJMP START
ORG 0003H ;外部 INT0 中断向量入口地址
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电平高低
JZ MOT,LP0 //修改
MOV R2,60H ;若MOT=1,给R2赋高电平计数值
LJMP RETURN0
LP0:
MOV R2,61H ;若MOT=0,给R2赋低电平计数值
RETURN0:
MOV TH0,#9CH //
MOV TL0,#9CH //修改
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 ;R0R3,跳转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
MOV R6,#0
MOV R5,#0
MOV R4,#0
MOV R0,#0 //清0,重新计数 修改
SJMP RETRURN1
LP1:
LCALL DSL
MOV R6,#0
MOV R5,#0
MOV R4,#0
MOV R0,#0
RETURN1:
MOV TH1,#3CH
MOV TL1,#0B0H //重装计数 修改
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
转载:https://www.cnblogs.com/liujw2114/p/5971075.html