一、实验目的和要求
掌握脉宽调制调速的原理与方法,学习频率/周期测量的方法,了解闭环控制的原理。
二、实验设备
单片机测控实验系统
直流电机调速实验模块
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的个数增加。改变值正比于测量出的差值。也可自行使用其他更加复杂的算法。
ORG 0000H ;上电 & 复位 入口地址LJMP STARTORG 0003H ;外部 INT0 中断向量入口地址LJMP OUTINTORG 000BHLJMP TIME0ORG 001BHLJMP TIME1ORG 0030H P4SW EQU 0BBHP4 EQU 0C0HCLK EQU P4.4DAT EQU P4.5S1 EQU P3.6S2 EQU P3.7MOT EQU P1.1START: ;对P4口进行初始化设置MOV DPTR,#TABMOV P4SW,#70HMOV 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,#9CHMOV 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 EASETB EX0SETB IT0SETB ET0SETB TR0SETB ET1SETB TR1CLR MOT ;电机初始状态设置为低电平L1:SJMP L1 ;死循环,用于查询;---------------------------------------------------------------------;每个1ms调整MOT口输出一次,一次调整一个脉冲;60H存高电平输出次数,61H存低电平输出次数;每隔1s调整60H,61H的值一次,来动态调整电机转速;---------------------------------------------------------------------TIME0:;保存程序状态PUSH ACCPUSH PSWDJNZ R2,RETURN0 ;R2用于快速定时中断中给MOT送值时计数CPL MOT ;取反MOT;JNB MOT,LP0 ;判断MOT电平高低JZ MOT,LP0 //修改MOV R2,60H ;若MOT=1,给R2赋高电平计数值LJMP RETURN0LP0:MOV R2,61H ;若MOT=0,给R2赋低电平计数值RETURN0:MOV TH0,#9CH //MOV TL0,#9CH //修改POP PSWPOP ACCRETI TIME1:;保存程序状态PUSH ACCPUSH PSWINC R1 ;R1自增,计数CJNE R1,#20,RETURN1 ;不等于20(小于20)直接return1,TIME1执行20次,产生1秒中断MOV R1,#0MOV R3,64H;在1s中断中应该执行的操作JNB S1,MAX ;s1按下,R3置为MAXJNB S2,MIN ;s2按下,R3置为MINSJMP LOOPMAX:MOV R3,62HSJMP LOOPMIN:MOV R3,63HSJMP LOOP;转速调整LOOP:MOV A,R0 ;R0计转速SUBB A,R3 ;A-R3影响CyJC ZENG ;R0《R3,跳转ZENGJNC JIAN ;R0》R3,跳转JIANSJMP SHOW ;跳转交替显示ZENG:INC 61H ;增加低电平DEC 60H ;减少高电平SJMP SHOWJIAN:INC 60H ;增加高电平DEC 61H ;减少低电平SJMP SHOW;交替显示SHOW:INC R7CJNE R7,#2,LP1 ;R7=1显示当前转速,R7=2显示目标转速///修改MOV R7,#0 ;显示目标转速MOV A,R3 MOV B,#100DIV AB ;商A,余数BMOV 65H,A ;百位MOV A,BMOV B,#10DIV ABMOV 66H,A ;十位MOV 67H,B ;个位MOV R6,67H ;目标转速MOV R5,66HMOV R4,65HMOV R6,#0MOV R5,#0MOV R4,#0MOV R0,#0 //清0,重新计数 修改SJMP RETRURN1LP1:LCALL DSLMOV R6,#0MOV R5,#0MOV R4,#0MOV R0,#0RETURN1:MOV TH1,#3CH MOV TL1,#0B0H //重装计数 修改POP PSWPOP ACCRETIOUTINT:INC R0INC R6CJNE R6,#10,COUNT_EXITINC R5MOV R6,#0CJNE R5,#10,COUNT_EXITINC R4MOV R5,#0CJNE R4,#10,COUNT_EXITMOV R4,#0COUNT_EXIT: RETI ;电机转速的显示DSL:MOV A,R6MOVC A,@A+DPTRLCALL DISPLAYMOV A,R5MOVC A,@A+DPTRLCALL DISPLAYMOV A,R4MOVC A,@A+DPTRLCALL DISPLAYRET ;中断函数内,此处必须是RET,RETI结束中断;段码管显示函数DISPLAY: MOV R0,#8DS_L:CLR CLKRLC AMOV DAT,CSETB CLKDJNZ R0,DS_LRET TAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90HEND
一、实验目的和要求
掌握脉宽调制调速的原理与方法,学习频率/周期测量的方法,了解闭环控制的原理。
二、实验设备
单片机测控实验系统
直流电机调速实验模块
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的个数增加。改变值正比于测量出的差值。也可自行使用其他更加复杂的算法。
ORG 0000H ;上电 & 复位 入口地址LJMP STARTORG 0003H ;外部 INT0 中断向量入口地址LJMP OUTINTORG 000BHLJMP TIME0ORG 001BHLJMP TIME1ORG 0030H P4SW EQU 0BBHP4 EQU 0C0HCLK EQU P4.4DAT EQU P4.5S1 EQU P3.6S2 EQU P3.7MOT EQU P1.1START: ;对P4口进行初始化设置MOV DPTR,#TABMOV P4SW,#70HMOV 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,#9CHMOV 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 EASETB EX0SETB IT0SETB ET0SETB TR0SETB ET1SETB TR1CLR MOT ;电机初始状态设置为低电平L1:SJMP L1 ;死循环,用于查询;---------------------------------------------------------------------;每个1ms调整MOT口输出一次,一次调整一个脉冲;60H存高电平输出次数,61H存低电平输出次数;每隔1s调整60H,61H的值一次,来动态调整电机转速;---------------------------------------------------------------------TIME0:;保存程序状态PUSH ACCPUSH PSWDJNZ R2,RETURN0 ;R2用于快速定时中断中给MOT送值时计数CPL MOT ;取反MOT;JNB MOT,LP0 ;判断MOT电平高低JZ MOT,LP0 //修改MOV R2,60H ;若MOT=1,给R2赋高电平计数值LJMP RETURN0LP0:MOV R2,61H ;若MOT=0,给R2赋低电平计数值RETURN0:MOV TH0,#9CH //MOV TL0,#9CH //修改POP PSWPOP ACCRETI TIME1:;保存程序状态PUSH ACCPUSH PSWINC R1 ;R1自增,计数CJNE R1,#20,RETURN1 ;不等于20(小于20)直接return1,TIME1执行20次,产生1秒中断MOV R1,#0MOV R3,64H;在1s中断中应该执行的操作JNB S1,MAX ;s1按下,R3置为MAXJNB S2,MIN ;s2按下,R3置为MINSJMP LOOPMAX:MOV R3,62HSJMP LOOPMIN:MOV R3,63HSJMP LOOP;转速调整LOOP:MOV A,R0 ;R0计转速SUBB A,R3 ;A-R3影响CyJC ZENG ;R0《R3,跳转ZENGJNC JIAN ;R0》R3,跳转JIANSJMP SHOW ;跳转交替显示ZENG:INC 61H ;增加低电平DEC 60H ;减少高电平SJMP SHOWJIAN:INC 60H ;增加高电平DEC 61H ;减少低电平SJMP SHOW;交替显示SHOW:INC R7CJNE R7,#2,LP1 ;R7=1显示当前转速,R7=2显示目标转速///修改MOV R7,#0 ;显示目标转速MOV A,R3 MOV B,#100DIV AB ;商A,余数BMOV 65H,A ;百位MOV A,BMOV B,#10DIV ABMOV 66H,A ;十位MOV 67H,B ;个位MOV R6,67H ;目标转速MOV R5,66HMOV R4,65HMOV R6,#0MOV R5,#0MOV R4,#0MOV R0,#0 //清0,重新计数 修改SJMP RETRURN1LP1:LCALL DSLMOV R6,#0MOV R5,#0MOV R4,#0MOV R0,#0RETURN1:MOV TH1,#3CH MOV TL1,#0B0H //重装计数 修改POP PSWPOP ACCRETIOUTINT:INC R0INC R6CJNE R6,#10,COUNT_EXITINC R5MOV R6,#0CJNE R5,#10,COUNT_EXITINC R4MOV R5,#0CJNE R4,#10,COUNT_EXITMOV R4,#0COUNT_EXIT: RETI ;电机转速的显示DSL:MOV A,R6MOVC A,@A+DPTRLCALL DISPLAYMOV A,R5MOVC A,@A+DPTRLCALL DISPLAYMOV A,R4MOVC A,@A+DPTRLCALL DISPLAYRET ;中断函数内,此处必须是RET,RETI结束中断;段码管显示函数DISPLAY: MOV R0,#8DS_L:CLR CLKRLC AMOV DAT,CSETB CLKDJNZ R0,DS_LRET TAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90HEND
举报