單片機與控制實驗(3)——直流電機脈寬調(diào)制調(diào)速
一、實驗目的和要求
掌握脈寬調(diào)制調(diào)速的原理與方法,學習頻率/周期測量的方法,了解閉環(huán)控制的原理。
二、實驗設備
單片機測控實驗系統(tǒng)
直流電機調(diào)速實驗模塊
Keil開發(fā)環(huán)境
STC-ISP程序下載工具
三、實驗內(nèi)容
1. 編寫程序,能夠在數(shù)碼管上顯示一個數(shù)值。
2. 固定向P1.1輸出0,然后測量每秒鐘電機轉(zhuǎn)動的轉(zhuǎn)數(shù),將其顯示在數(shù)碼管,每秒刷新一次即可。
3. 使用脈寬調(diào)制的方法,動態(tài)調(diào)整向P1.1輸出的內(nèi)容,使得電機轉(zhuǎn)速能夠穩(wěn)定在一個預定值附近,同時實時顯示當前轉(zhuǎn)速。
4. 根據(jù)輸入修改電機轉(zhuǎn)速目標值,設置兩個轉(zhuǎn)速目標值:低轉(zhuǎn)速和高轉(zhuǎn)速。
5. 每隔一秒鐘讀取兩個開關的狀態(tài),如果S1按下,動態(tài)調(diào)整輸出,使得電機轉(zhuǎn)速能夠穩(wěn)定到低轉(zhuǎn)速目標值附近,如果S2按下,動態(tài)調(diào)整輸出,使得電機轉(zhuǎn)速能夠穩(wěn)定到高轉(zhuǎn)速目標值附近。交替顯示目標值和當前轉(zhuǎn)速值。
四、實驗步驟
1. 建立工程,實現(xiàn)實驗內(nèi)容1
參考輔助材料,學習8031匯編語言使用和直流電機原理?! ?/p>
2. 編寫中斷程序,測量電機轉(zhuǎn)速
本程序需要使用定時器定時,并使用中斷來同步。中斷程序的典型例子如下:
ORG 0000H
LJMP START
ORG 000BH
LJMP T0IN ;中斷向量表
ORG 0040H
START: ...;初始化
...
T0IN: ...;中斷程序
...
RETI ;中斷返回
END
3. 完成控制轉(zhuǎn)速程序
按照脈寬調(diào)制的原理,再添加一個快速的定時中斷(0.1ms左右),在這個中斷里面動態(tài)改變P1.1的輸出,宏觀上輸出有效(0)的比例就是預定的控制變量。這個控制變量增大,電機轉(zhuǎn)速就應該提高,但由于各種內(nèi)部和外部因素,它們之間不存在簡單的函數(shù)關系,因此必須根據(jù)測量出來的實際轉(zhuǎn)速進行動態(tài)調(diào)整。
首先將電機轉(zhuǎn)速控制在一個預定數(shù)值附近,在每一個1秒鐘中斷測量出當前轉(zhuǎn)速之后,將其與目標值相對比,如果不夠則增加控制變量,否則減少之,這樣就能逐步達到穩(wěn)定轉(zhuǎn)速的目的。同時將速度顯示出來。
4. 完成整體實驗內(nèi)容
在上面程序的基礎上,再加上根據(jù)開關狀態(tài)改變預定轉(zhuǎn)速的代碼。同時,在主程序中交替顯示目標值和當前轉(zhuǎn)速值,顯示一個內(nèi)容之后等待一段時間(可以由延時代碼實現(xiàn)),然后再顯示另一個并延時。要顯示的內(nèi)容都是在中斷中被修改的。
五、實驗原理
本實驗示意電路原理圖(圖中的P1.3應改為P1.1):
對于直流電機來說,其轉(zhuǎn)速由輸入電壓決定,因此具有平滑調(diào)速的效果;相比而言,交流電機的轉(zhuǎn)速由交流電頻率和電機結構決定,難以改變速度。當然,交流電機構造簡單,沒有換向器,所以容易制造高轉(zhuǎn)速、高電壓、大電流、大容量的電機;而直流電機一般用在負荷小,但要求轉(zhuǎn)速連續(xù)可調(diào)的場合,如伺服電機。
脈寬調(diào)制(Pulse Width Modulation,PWM)是一種能夠通過開關量輸出達到模擬量輸出效果的方法。使用PWM可以實現(xiàn)頻率調(diào)制、電壓調(diào)制等效果,并且需要的外圍器件較少,特別適合于單片機控制領域。這里只關心通過PWM實現(xiàn)電壓調(diào)制,從而控制直流電機轉(zhuǎn)速的效果。也稱作脈寬調(diào)制調(diào)速。
PWM的基本原理是通過輸出一個很高頻率的0/1信號,其中1的比例為δ(也叫做占空比),在外圍積分元件的作用下,使得總的效果相當于輸出δ×A(A為高電平電壓)的電壓。通過改變占空比就可以調(diào)整輸出電壓,從而達到模擬輸出并控制電機轉(zhuǎn)速的效果。
使用單片機實現(xiàn)PWM,就是根據(jù)預定的占空比δ來輸出0和1,這里δ就是控制變量。最簡單的辦法就是以某個時間單位(如0.1ms,相當于10kHz)為基準,在前N段輸出1,后M-N段輸出0,總體的占空比就是N/M。這種方法由于0和1分布不均勻,所以要求基準頻率要足夠高,否則會出現(xiàn)顛簸現(xiàn)象。
要達到更穩(wěn)定的效果,可以采用累加進位法如果將總的周期內(nèi)的0和1均勻分散開。設置一個累加變量x,每次加N,若結果大于M,則輸出1,并減去M;否則輸出0。這樣整體的占空比也是N/M。在實驗中取M=256可以使程序更加簡單。
另外,由于本實驗板的設計,輸出0使電機工作。因此對于本實驗,上面所說的0和1要翻轉(zhuǎn)過來用。
在本實驗板中,電機每轉(zhuǎn)動一次,與之相連的偏心輪將遮擋光電對管一次,因此會產(chǎn)生一個脈沖,送到INT0。要測量轉(zhuǎn)速,既可以測量相鄰兩次中斷之間的時間;也可以測量一秒種之內(nèi)發(fā)生的中斷次數(shù)。顯然,后一種方法更加簡單。
進行轉(zhuǎn)速控制時,涉及到三個變量:預期轉(zhuǎn)速,實際轉(zhuǎn)速和控制變量。這里控制變量就是占空比。我們并不能夠預先精確知道某個控制變量的值會導致多少的實際轉(zhuǎn)速,因為這里有很多內(nèi)部和外部因素起作用(如摩擦力,慣性等),但可以確定就是隨著控制變量的增加,實際轉(zhuǎn)速會增加。
反饋控制的基本原理就是根據(jù)實際結果與預期結果之間的差值,來調(diào)節(jié)控制變量的值。當實際轉(zhuǎn)速高于預期轉(zhuǎn)速時,我們需要減少控制變量,以降低速度;反之則需要調(diào)高控制變量。
本實驗的轉(zhuǎn)速控制可以使用簡單的比例控制算法,也就是當轉(zhuǎn)速S大于預定值時,將輸出0的個數(shù)減少;當轉(zhuǎn)速小于預定值時,將輸出0的個數(shù)增加。改變值正比于測量出的差值。也可自行使用其他更加復雜的算法。
實驗中采用的電機最大轉(zhuǎn)速在200轉(zhuǎn)/s左右,轉(zhuǎn)速小于40轉(zhuǎn)/s左右將不穩(wěn)定,可能會停轉(zhuǎn)。
六、實驗代碼
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;計轉(zhuǎn)速
MOVR1,#0;產(chǎn)生1s定時用
;R6、R5、R4數(shù)碼管顯示控制
MOV R6,#0;數(shù)碼管個位
MOV R5,#0;數(shù)碼管十位
MOV R4,#0;數(shù)碼管百位
MOVR7,#0;交替顯示時用
MOV60H,#100;存高電平
MOV61H,#100;存低電平
MOVR2,61H;R2用于快速定時中斷中給MOT送值時計數(shù),賦初值為低電平的個數(shù)
MOV62H,#200;按下s1時的目標值(最大值)
MOV63H,#100;按下s2時的目標值(最小值)
MOV64H,#150;不按鍵時的轉(zhuǎn)速
MOV R3,64H ;計目標值(初始值為不按鍵時的轉(zhuǎn)速)
;---------------------------------------------------------------------
;TMOD說明、T1/T0初值計算:
;---------------------------------------------------------------------
;T1"T0
;TMOD D7D6D5D4D3D2D1D0
;(89H)GATEC/TM1M0GATEC/TM1M0
;00010010
;|定時模式| 方式1 |由軟件啟動|| 方式2
;---------------------------------------------------------------------
MOVTMOD,#12H
;---------------------------------------------------------------------
;T0初值計算(快速定時中斷,動態(tài)改變MOT的輸出,0.1ms,方式2),Tosc=12MHz
;X=(2^8-(0.1ms)/12*Tosc)=256-100=156=9CH
;---------------------------------------------------------------------
MOVTH0,#9CH
MOVTL0,#9CH
;---------------------------------------------------------------------
;T1初值計算(定時中斷,數(shù)碼管顯示控制,1s,方式1),Tosc=12MHz
;X=(2^16-(1s)/12*Tosc)=65536-1000000<0
;折中方法:每20次產(chǎn)生1s定時初值,一次間隔50ms
;X=(2^16-(50ms)/12*Tosc)=65536-50000=15536=3CB0H
;---------------------------------------------------------------------
MOVTH1,#3CH
MOVTL1,#0B0H
;中斷開關
SETBEA
SETBEX0
SETBIT0
SETBET0
SETBTR0
SETBET1
SETBTR1
CLRMOT;電機初始狀態(tài)設置為低電平
L1:
SJMPL1;死循環(huán),用于查詢
;---------------------------------------------------------------------
;每個1ms調(diào)整MOT口輸出一次,一次調(diào)整一個脈沖
;60H存高電平輸出次數(shù),61H存低電平輸出次數(shù)
;每隔1s調(diào)整60H,61H的值一次,來動態(tài)調(diào)整電機轉(zhuǎn)速
;---------------------------------------------------------------------
TIME0:
;保存程序狀態(tài)
PUSHACC
PUSHPSW
DJNZ R2,RETURN0;R2用于快速定時中斷中給MOT送值時計數(shù)
CPLMOT;取反MOT
JNBMOT,LP0;判斷MOT電平高低
MOVR2,60H;若MOT=1,給R2賦高電平計數(shù)值
LJMPRETURN0
LP0:
MOV R2,61H;若MOT=0,給R2賦低電平計數(shù)值
RETURN0:
POPPSW
POPACC
RETI
TIME1:
;保存程序狀態(tài)
PUSHACC
PUSHPSW
INCR1;R1自增
CJNER1,#20,RETURN1;不等于20(小于20)直接return1,TIME1執(zhí)行20次,產(chǎn)生1秒中斷
MOVR1,#0
MOVR3,64H
;在1s中斷中應該執(zhí)行的操作
JNBS1,MAX;s1按下,R3置為MAX
JNBS2,MIN;s2按下,R3置為MIN
SJMPLOOP
MAX:
MOVR3,62H
SJMPLOOP
MIN:
MOVR3,63H
SJMPLOOP
;轉(zhuǎn)速調(diào)整
LOOP:
MOVA,R0;R0計轉(zhuǎn)速
SUBBA,R3;A-R3影響Cy
JCZENG;R0
SJMPSHOW;跳轉(zhuǎn)交替顯示
ZENG:
INC61H;增加低電平
DEC60H;減少高電平
SJMPSHOW
JIAN:
INC60H;增加高電平
DEC61H;減少低電平
SJMPSHOW
;交替顯示
SHOW:
INCR7
CJNER7,#2,LP1;R7=1顯示當前轉(zhuǎn)速,R7=2顯示目標轉(zhuǎn)速
MOVR7,#0
;顯示目標轉(zhuǎn)速
MOV A,R3
MOV B,#100
DIV AB ;商A,余數(shù)B
MOV65H,A;百位
MOVA,B
MOV B,#10
DIV AB
MOV 66H,A;十位
MOV 67H,B;個位
MOV R6,67H;目標轉(zhuǎn)速
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;中斷函數(shù)內(nèi),此處必須是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脈寬調(diào)制是通過改變低電平(0,存在61