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