本文為大大維原創,最早於博客園發表,轉載請注明出處!!!
一、實驗目的和要求
掌握脈寬調制調速的原理與方法,學習頻率/周期測量的方法,了解閉環控制的原理。
二、實驗設備
單片機測控實驗系統
直流電機調速實驗模塊
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
LJMP START
ORG 0003H
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電平高低
MOV R2,60H ;若MOT=1,給R2賦高電平計數值
LJMP RETURN0
LP0:
MOV R2,61H ;若MOT=0,給R2賦低電平計數值
RETURN0:
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 ;R0<R3,跳轉ZENG
JNC JIAN ;R0>R3,跳轉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
LP1:
LCALL DSL
MOV R6,#0
MOV R5,#0
MOV R4,#0
MOV R0,#0
RETURN1:
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
七、一點想法
在本次實驗中,PWM脈寬調制是通過改變低電平(0,存在61H中)和高電平(1,存在60H中)的輸入比例實現的。初始時,高低電平均為100次(可以隨便設置,高低電平次數也可以不同),比例為1:1。當當前轉速低於目標轉速時,增加低電平輸入次數,減少高電平輸入次數(兩者總和不變,還是200次),增加了低電平的占空比,轉速提高。當當前轉速高於目標轉速時,減少低電平輸入次數,增加高電平輸入次數(兩者總和不變,還是200次),降低了低電平的占空比,轉速降低。
60H+61H的和(高低電平輸入總和)影響轉速調整精度和速度,值越大,精度越高(擺動越小),轉速調整越慢;相反,值越小,轉速調整越快,但精度越低(擺動越大)。
轉速調整的速度和精度還可以通過每次轉速調整時,60H(高電平輸入次數)和61H(低電平輸入次數)調整的幅度來調控。幅度越大,轉速調整越快,但精度越低,幅度越小,精度越高,轉速調整越慢。
60H和61H中的數可以隨便(為正即可)取,但在整個過程中,61H+60H的值一定為一個定值,這樣才能確定改變的是占空比。
八、附錄
實驗電路原理圖:點擊查看
