直流电机脉宽调制调速

一、实验目的和要求

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

二、实验设备

  单片机测控实验系统
  直流电机调速实验模块
  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):

直流电机脉宽调制调速_第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

你可能感兴趣的:(51单片机,硬件模块)