智能尋跡避障小車電機(jī)控制系統(tǒng)設(shè)計(jì)_第1頁
智能尋跡避障小車電機(jī)控制系統(tǒng)設(shè)計(jì)_第2頁
智能尋跡避障小車電機(jī)控制系統(tǒng)設(shè)計(jì)_第3頁
智能尋跡避障小車電機(jī)控制系統(tǒng)設(shè)計(jì)_第4頁
智能尋跡避障小車電機(jī)控制系統(tǒng)設(shè)計(jì)_第5頁
已閱讀5頁,還剩17頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、第一章 智能尋跡避障小車電機(jī)控制系統(tǒng)設(shè)計(jì) 1任務(wù) 任務(wù)一:產(chǎn)生智能尋跡避障小車電機(jī)的基本控制信號; 任務(wù)二:編制智能尋跡避障小車基本巡航動作的控制函數(shù); 2要求 (1)能控制智能尋跡避障小車電機(jī)的旋轉(zhuǎn)方向和速度; (2)能控制智能尋跡避障小車實(shí)現(xiàn)基本巡航動作; 1.1 項(xiàng)目描述 本項(xiàng)目的主要內(nèi)容是: 對 C51 單片機(jī)編程, 使之產(chǎn)生控制電機(jī)旋轉(zhuǎn)方向和轉(zhuǎn)速的各種基 本控制信號,然后在此基礎(chǔ)上編制出能夠控制智能尋跡避障小車實(shí)現(xiàn)前進(jìn)、后退、左轉(zhuǎn)彎、 右轉(zhuǎn)彎等基本巡航動作的控制函數(shù)。 控制電機(jī)旋轉(zhuǎn)是智能尋跡避障小車實(shí)現(xiàn)各種導(dǎo)航控制的重要基礎(chǔ), 在本書后續(xù)項(xiàng)目模塊 中都要用到對電機(jī)的控制, 因此本章所

2、設(shè)計(jì)出的電機(jī)控制函數(shù)將作為功能模塊被后續(xù)設(shè)計(jì)案 例直接調(diào)用;通過該項(xiàng)目的學(xué)習(xí)與實(shí)踐,可以讓讀者獲得如下知識和技能: 掌握單片機(jī) I/O 端口的基本應(yīng)用方法; 學(xué)會單片機(jī)C語言的基本編程方法; 掌握直流伺服電機(jī)的基本工作原理和控制方法; 掌握直流減速電機(jī)的基本工作原理和控制方法; 掌握H電橋驅(qū)動直流電機(jī)的工作原理與控制方法,即直流電機(jī)驅(qū)動芯片L293工作原理; 能夠編制控制輪式教育機(jī)器人實(shí)現(xiàn)基本巡航動作的控制函數(shù); 1.2 必備知識 1.2.1 伺服電機(jī) 伺服:一詞源于希臘語“奴隸”的意思。人們想把“伺服機(jī)構(gòu)”當(dāng)個(gè)得心應(yīng)手的馴服 工具,服從控制信號的要求而動作。在信號來到之前,轉(zhuǎn)子靜止不動;信號

3、來到之后,轉(zhuǎn) 子立即轉(zhuǎn)動;當(dāng)信號消失,轉(zhuǎn)子能即時(shí)自行停轉(zhuǎn)。由于它的“伺服”性能,因此而得名。 標(biāo)準(zhǔn)的伺服電機(jī)有三條控制線,分別為:電源、地線及控制線。電源線與地線用于提 供內(nèi)部的電機(jī)及控制線路所需的能源,控制信號要求是一個(gè)周期性的正向脈沖信號,這個(gè) 周期性脈沖信號的高電平時(shí)間通常在1ms-2ms之間,而低電平時(shí)間應(yīng)在 5ms到20ms之間。 本書向讀者介紹的伺服電機(jī)是 PARALLAX公司生產(chǎn)的連續(xù)旋轉(zhuǎn)伺服電機(jī),它的控制信號 時(shí)序是:低電平時(shí)間固定為 20ms,高電平為1.3ms 1.7ms之間。圖1.1為PARALLAX司 生產(chǎn)的直流伺服電機(jī)外形圖。 圖1.1直流伺服電機(jī)外形圖 1.2.2

4、直流電機(jī) 方案二中采用的是直流減速電機(jī),在此只介紹該電機(jī)的控制方法,對于其內(nèi) 部結(jié)構(gòu)不作介紹。該電機(jī)外形示意圖如圖 1.2所示,它有紅、黑兩根控制線,電 機(jī)狀態(tài)控制電平如表1-1所示。 表1-1電機(jī)控制電平與狀態(tài)對應(yīng)表 紅線控制端 黑線控制端 電機(jī)狀態(tài) 0 1 順轉(zhuǎn) 1 0 逆轉(zhuǎn) 1 1 停轉(zhuǎn) 直流電機(jī)的控制信號由單片機(jī)輸出送至電機(jī)驅(qū)動芯片L293后,經(jīng)L293內(nèi) 部H電橋電路驅(qū)動電機(jī)運(yùn)轉(zhuǎn)。 圖1.2直流電機(jī)外形圖 1.2.3直流電機(jī)H橋驅(qū)動電路工作原理 本設(shè)計(jì)中直流電機(jī) H橋驅(qū)動電路由驅(qū)動芯片L293D完成,在L293D內(nèi)部形成一個(gè) H橋 型的驅(qū)動驅(qū)動電路,類似如圖1.3所示。圖中用開關(guān)模擬

5、電機(jī)信號通斷,在實(shí)際的控制中是 采用晶體三極管來完成此功能,可參見圖1.4所示的電機(jī)控制示意圖。此處只是為簡述控制 原理,所以用開關(guān)模擬電機(jī)工作過程。 VCC (5 圖1.3 H 橋驅(qū)動直流電機(jī)電路 從圖中可以看出,其形狀類似于字母“H,而作為負(fù)載的直流電機(jī)是像“橋”一樣架在 上面的,所以稱之為“ H橋驅(qū)動”。4個(gè)開關(guān)所在位置就稱為“橋臂”。 從電路中不難看出,假設(shè)開關(guān) A、D接通,電機(jī)為正向轉(zhuǎn)動,則開關(guān) B、C接通時(shí),直流 電機(jī)將反向轉(zhuǎn)動。從而實(shí)現(xiàn)了電機(jī)的正反向驅(qū)動。借助這4個(gè)開關(guān)還可以產(chǎn)生電機(jī)的另外2 個(gè)工作狀態(tài): (1)剎車 一一將B、D開關(guān)(或 A C)接通,則電機(jī)慣性轉(zhuǎn)動產(chǎn)生的電勢將

6、被短 路,形成阻礙運(yùn)動的反電勢,形成“剎車”作用。 (2)惰行 一一4個(gè)開關(guān)全部斷開,則電機(jī)慣性所產(chǎn)生的電勢將無法形成電路,從而 也就不會產(chǎn)生阻礙運(yùn)動的反電勢,電機(jī)將慣性轉(zhuǎn)動較長時(shí)間。 POJ 1A 2 p k3 1Y PLO 1 P0.1 2A 3卜 AT89C52 圖1.4 電機(jī)控制示意圖電路 1.2.4 延時(shí)函數(shù) 在實(shí)際的單片機(jī)應(yīng)用系統(tǒng)開發(fā)過程中,由于程序功能的需要,經(jīng)常編寫各種延時(shí)程 序,延時(shí)時(shí)間從數(shù)微秒到數(shù)秒不等。 實(shí)現(xiàn)延時(shí)通常有兩種方法:一種是硬件延時(shí),要用到單片機(jī)的定時(shí)器/計(jì)數(shù)器,這種方 法可以提高 CPU的工作效率,同時(shí)也能做到精確延時(shí);另一種是軟件延時(shí),這種方法主要 采用循環(huán)

7、體進(jìn)行,本項(xiàng)目開發(fā)過程中采用的是軟件延時(shí)的方法,在后續(xù)各項(xiàng)目模塊中經(jīng)常 作為延時(shí)功能調(diào)用的幾個(gè)延時(shí)函數(shù)原形如下: void delay_n 卩s(uint/i)延時(shí)微秒級函數(shù) i=i/10 ; while(-i); void delay_nms(uint n)/ 延時(shí)毫秒級函數(shù) n=n+1 ; while(-n) delay_n 卩 s(90;) void delayms(uint x)/ 延時(shí)函數(shù) 12 兆晶振 1000 為一秒; 11.0592兆晶振922為一秒(會有一定誤差) uchar i; while(x-) for(i=0;i123;i+); 上述函數(shù)設(shè)計(jì)的基本原理是通過執(zhí)行循環(huán)體

8、來消耗時(shí)間從而達(dá)到延時(shí)的目的,其中 delay_nms()是毫秒級的延時(shí),而delay_n氣)是微秒級的延時(shí)。例如:如果你想延時(shí) 1毫 秒,可以使用語句 delay_nms(1);延時(shí)100微秒則可使用語句 delay_n宙(100);來完成。 注意:上述延時(shí)函數(shù)是在外部晶振為12MHZ的情況下設(shè)計(jì)的,如果外部晶振頻率不是 12MHz,調(diào)用這兩個(gè)函數(shù)所產(chǎn)生的真正延時(shí)就會發(fā)生變化。對于許多C51開發(fā)者特別是初 學(xué)者編制非常精確的延時(shí)函數(shù)有一定難度,關(guān)于延時(shí)函數(shù)的編程經(jīng)驗(yàn)和技巧此處不作詳細(xì) 介紹,讀者目前只要會將這兩個(gè)函數(shù)作為功能模塊調(diào)用就行了 1.3案例設(shè)計(jì) 1.3.1系統(tǒng)設(shè)計(jì)方案 本項(xiàng)目向讀者

9、詳細(xì)介紹了兩種實(shí)現(xiàn)方案,其中學(xué)員實(shí)操采用方案二進(jìn)行。同時(shí)該項(xiàng)目 設(shè)計(jì)為本書后續(xù)設(shè)計(jì)案例的基礎(chǔ)控制模塊,后續(xù)的尋跡、避障等功能模塊實(shí)在該項(xiàng)目上擴(kuò)展 實(shí)現(xiàn)的。 方案一:該設(shè)計(jì)方案采用 CPU對執(zhí)行機(jī)構(gòu)輸出控制, 不涉及到對外部數(shù)據(jù)信息的采集, 因此,系統(tǒng)采用“CPU+執(zhí)行機(jī)構(gòu)”的總體設(shè)計(jì)方案,其中CPU采用目前性價(jià)比較高的 STC89C52 單片機(jī),并以此為核心構(gòu)建最小控制系統(tǒng),執(zhí)行機(jī)構(gòu)的動力裝置采用PARALLAX司生產(chǎn)的 連續(xù)旋轉(zhuǎn)伺服電機(jī),其優(yōu)點(diǎn)是編程控制方便且不需額外增加驅(qū)動電路,系統(tǒng)總體框圖如圖 1.5所示。 圖1.5 方案一系統(tǒng)框圖 方案二:采用“單片機(jī)最小系統(tǒng) +電機(jī)驅(qū)動芯片+直流電機(jī)

10、”的設(shè)計(jì)方案,設(shè)計(jì)方案中 的電機(jī)采用直流減速電機(jī),該電機(jī)具有控制原理簡單、性價(jià)比高,易于控制等特點(diǎn),被廣泛 應(yīng)用于各種智能玩具小車設(shè)計(jì)之中;電機(jī)驅(qū)動采用集成芯片L293完成,該芯片運(yùn)用 H電橋 驅(qū)動直流電機(jī)的控制原理實(shí)現(xiàn)對直流電機(jī)旋轉(zhuǎn)方向和速度的控制。系統(tǒng)總體框圖如圖1.6所 示。 圖1.6方案二統(tǒng)框圖 1.3.2硬件電路設(shè)計(jì) 方案一: 該設(shè)計(jì)方案的硬件電路如圖1.7所示:它是在單片機(jī)最小系統(tǒng)的基礎(chǔ)上直接 連接伺服電機(jī)構(gòu)成的,其中左電機(jī)的控制信號由P1_0提供,右電機(jī)的控制信號由P1_1提 供,直接對該兩個(gè)端口編程,便可實(shí)現(xiàn)對伺服電機(jī)旋轉(zhuǎn)方向和速度控制。 5V 左輪驅(qū)動電機(jī) 右輪驅(qū)動電機(jī) GN

11、D 4 12MHZ I C20PFT 18 19 20 P1.0 P1.1 VCC AT89C51 RST XTA1 XTA2 GND GND GND 圖1.7方案一系統(tǒng)原理圖 萬案二: 該設(shè)計(jì)方案的硬件電路如圖1.8所示:電機(jī)控制信號由單片機(jī)的P0.0P0.3 輸出送到電機(jī)驅(qū)動芯片的 2腳與7腳以及10腳與15腳,再從芯片的3腳與6腳(左電機(jī)控 制)以及11腳與14腳(右電機(jī)控制)輸出驅(qū)動電機(jī)工作。 133系統(tǒng)軟件設(shè)計(jì) 任務(wù)一:產(chǎn)生智能尋跡避障小車電機(jī)的基本控制信號 方案一:本任務(wù)是對單片機(jī)編程,在指定的單片機(jī)引腳P1_0輸出伺服電機(jī)的各種控制 信號。 1、源程序 sfr P1 = 0 x9

12、0;P1 口 C51 定義; sbit P1_0 = P1A0;/特殊功能位定義 #defi ne uint un sig ned int void delay_n卩 s(uint/)延時(shí) n 函數(shù) i=i/10 ; while(-i); void delay_nms(uint n) / 延時(shí) nms 函數(shù) n=n+1 ; while(-n) delay_n 卩 s(90;) int main(void)/ 主函數(shù) while(1) P1_0輸出高電平 / 延時(shí) 1。5ms P1_0輸出低電平 /延時(shí)20ms P1_0=1; delay_n 卩 s(150O) P1_0=0; delay_nm

13、s(20); 2、程序運(yùn)行及調(diào)試 在智能尋跡避障小車控制板上按圖1.7連接伺服電機(jī)控制電路,編譯以上程序,將產(chǎn) 生的可執(zhí)行文件燒寫到控制板上的單片機(jī)程序存儲器,具體操作步驟如下: 步驟1:啟動Keil uVision4 IDE,完成對上面程序的編輯,編譯和調(diào)試,產(chǎn)生可執(zhí)行的HEX 文件。 步驟2:將ISP下載線一端連接到 PC機(jī)的并行接口上,另一端(小端)連接到智能尋跡避 障小車的程序下載口上。 打開ISP下載軟件將步驟1獲得的HEX文件下載到智能尋跡避障小車的單片機(jī)內(nèi)部程 序存儲器,開啟電源,運(yùn)行程序,用示波器測量P1_0引腳,可測出使伺服電機(jī)轉(zhuǎn)速為零的 控制信號,其波形如圖 1.9所示。

14、Vdd(5v) Vss(0v) 20ms 圖1.9 使伺服電機(jī)轉(zhuǎn)速為零的控制信號時(shí)序圖 將程序中的 delay_n卩s(1500)改成delay_n卩s(1300),即延時(shí)1.3ms,再重復(fù)以上步 驟,可用示波器測得使伺服電機(jī)使電機(jī)順時(shí)針全速旋轉(zhuǎn)的控制信號,其波形如圖1.10所 示。 4 * 1.3ms*| 嚴(yán) 1.3ms Vdd(5v) Vss(0v) 20ms 圖1.10 使電機(jī)順時(shí)針全速旋轉(zhuǎn)的控制脈沖序列 將程序中的 delay_n卩s(1500)改成delay_n卩s(1700),即延時(shí)1.7ms,再重復(fù)以上步 驟,可用示波器測得使伺服電機(jī)逆時(shí)針全速旋轉(zhuǎn)的控制信號,其波形如圖1.11所

15、示。 巧 +1.7ms巧 + 1.7ms Vdd(5v) pq Vss(Ov) 20ms 圖1.11使伺服電機(jī)逆時(shí)針全速旋轉(zhuǎn)的脈沖序列 在1.3ms 1.5ms 1.7ms時(shí)間范圍內(nèi)改變延時(shí)函數(shù)的延時(shí)量,可獲得控制伺服電機(jī)不 同旋轉(zhuǎn)方向和轉(zhuǎn)速的各種波形。 步驟3:對伺服電機(jī)進(jìn)行零點(diǎn)標(biāo)定 所謂伺服電機(jī)零點(diǎn)標(biāo)定是指當(dāng)發(fā)送一個(gè)使伺服電機(jī)轉(zhuǎn)速為零的控制信號給伺服電機(jī)時(shí), 讓電機(jī)保持靜止不動的過程,伺服電機(jī)在出廠時(shí)沒有預(yù)先標(biāo)定,因此需要調(diào)整。具體做法是: 將步驟2產(chǎn)生的使電機(jī)轉(zhuǎn)速為零的控制程序加載到單片機(jī)程序存儲器,開機(jī)運(yùn)行,若電 機(jī)有旋轉(zhuǎn),說明未標(biāo)定,用螺絲刀調(diào)整伺服電機(jī)上的電位器,同時(shí)觀察電機(jī)的旋轉(zhuǎn)

16、情況, 直到電機(jī)停止轉(zhuǎn)動,表明已經(jīng)標(biāo)定。 電機(jī)標(biāo)定后,用步驟 2產(chǎn)生的各種控制信號測試電機(jī)的旋轉(zhuǎn)方向和速度,觀察電機(jī)的運(yùn) 行情況,可以實(shí)現(xiàn)對電機(jī)的不同旋轉(zhuǎn)方向和速度的控制。 3、程序設(shè)計(jì)思路 基本思路是:根據(jù)伺服電機(jī)的控制信號的時(shí)序要求,調(diào)用延時(shí)函數(shù)控制單片機(jī)引腳高低 電平的持續(xù)時(shí)間,并用循環(huán)執(zhí)行的方式使單片機(jī)引腳不斷的輸出伺服電機(jī)控制信號。 產(chǎn)生伺服電機(jī)基本控制信號的程序流程圖1.12所示: 圖1.12主函數(shù)流程圖 即利用延時(shí)函數(shù)將指定的引腳的低電平持續(xù)時(shí)間固定為20ms,而高電平持續(xù)時(shí)間根 據(jù)需要在“1.3ms 1.5ms 1.7ms”時(shí)間范圍內(nèi)改變,然后循環(huán)執(zhí)行,就可獲得能夠控制伺 服電

17、機(jī)不同旋轉(zhuǎn)方向和轉(zhuǎn)速的各種控制脈沖信號。 方案二:對單片機(jī)P0.0、P0.1(左電機(jī))和P0.2、P0.3(右電機(jī))編程,程序設(shè)計(jì)以左電 機(jī)為例。 1、源程序 #include #define uint unsigned int #define uchar unsigned char sbit zuo1=P0A1;/左電機(jī)端口定義 sbit zuo2=P0A0; sbit you1=P0A3; /右電機(jī)端口定義 sbit you2=P0A2; void delay(uint x) uchar i; while(x-) for(i=0;i123;i+); void qian() / 左邊往前 /

18、 右邊往前 zuo1=0; zuo2=1; you1=0; you2=1; main() while(1) qian(); delay(922*5); 2、程序運(yùn)行及調(diào)試 在智能尋跡避障小車控制板上按圖 1.8 連接伺服電機(jī)控制電路,編譯以上程序,將產(chǎn) 生的可執(zhí)行文件燒寫到控制板上的單片機(jī)程序存儲器,具體操作步驟如下: 步驟1:啟動Keil uVision4 IDE,完成對上面程序的編輯,編譯和調(diào)試,產(chǎn)生可執(zhí)行的HEX 文件。 步驟2:將STC下載線一端連接到 PC機(jī)的并行接口上,另一端(小端)連接到智能尋跡避 障小車的程序下載口上。 打開STC下載軟件將步驟1獲得的HEX文件下載到智能尋跡避

19、障小車的單片機(jī)內(nèi)部程 序存儲器,開啟電源,運(yùn)行程序,此時(shí)左右電機(jī)順時(shí)針旋轉(zhuǎn),小車前進(jìn)。 將上述程序中的前進(jìn)函數(shù)中的左右端口控制電平按表 1-1 所示的修改, 編輯、編譯后便 可以得到電機(jī)逆轉(zhuǎn)(后退)、停轉(zhuǎn)(原地不動)的控制函數(shù)。 任務(wù)二:編制智能尋跡避障小車基本巡航動作的控制函數(shù) 方案一: 本任務(wù)是在伺服電機(jī)基本控制信號的基礎(chǔ)上設(shè)計(jì)出智能尋跡避障小車的基本巡航動作 的控制函數(shù),并按一定的算法調(diào)用這些控制函數(shù),使智能尋跡避障小車完成比較復(fù)雜的運(yùn)動。 1源程序 程序名:Co ntrol.c 功 能:控制輪式教育機(jī)器人實(shí)現(xiàn)前后左右運(yùn)動的基本動作 =*/ #i nclude #defi ne uint

20、 un sig ned int #defi ne uchar un sig ned char void delay_n 卩 s(uint i); / 函數(shù)聲明 void delay_ nms(uint n); void Forward(void); void Left_Tur n( void); void Right_Tur n( void); void Backward(void); uchar Navigatio n10=F,L,F,F,R,B,L,B,B,Q; mai n( void)/ 主函數(shù) int addr=0; while(Navigatio naddr!=Q) switch(N

21、avigati on addr) case F:Forward();break; case L:Left_Tur n( );break; case R:Right_Turn();break; case B:Backward();break; addr+; void delay_n卩 s(uint /)延時(shí) n 卩 s i=i/10; while(-i); void delay_nms(uint n) / 延時(shí) n ms n=n+1; while(-n) delay_n 卩 s(900); void Forward(void)/ 前進(jìn)子函數(shù) uchar i; for(i=1;i=65;i+) P

22、1_1=1; delay_n 卩 s(1700); P1_ 仁0; P1_0=1; delay_n 卩 s(1300); P1_0=0; delay_ nm s(20); void Left_Turn(void)/ 左轉(zhuǎn)彎子函數(shù) uchar i; for(i=1;i=26;i+) P1_1=1; delay_n 卩 s(1300); P1_ 仁0; P1_0=1; delay_n 卩 s(1300); P1_0=0; delay_ nm s(20); void Right_Turn(void)/ 右轉(zhuǎn)彎子函數(shù) uchar i; for(i=1;i=26;i+) P1_1=1; delay_n

23、卩 s(1700); P1_ 仁0; P1_0=1; delay_n 卩 s(1700); P1_0=0; delay_ nm s(20); void Backward(void)/ 后退子函數(shù) uchar i; for(i=1;i=65;i+) P1_1=1; delay_n 卩 s(1300); P1_ 仁0; P1_0=1; delay_n 卩 s(1700); P1_0=0; delay_ nm s(20); 2、運(yùn)行程序 這里仍然按圖1.7連接伺服電機(jī)控制電路,編譯以上程序,將產(chǎn)生的可執(zhí)行文件燒寫到 智能尋跡避障小車控制板上的單片機(jī)程序存儲器,開機(jī)運(yùn)行,可以看到小車能按如下規(guī)律 運(yùn)動

24、,即:前進(jìn)t左轉(zhuǎn)彎t前進(jìn)t前進(jìn)t右轉(zhuǎn)彎t后退t左轉(zhuǎn)彎t后退t后退t停止,仔 細(xì)觀察可以發(fā)現(xiàn),它的運(yùn)動軌跡接近一個(gè)矩形。 3、程序設(shè)計(jì)思路 主函數(shù)按數(shù)組設(shè)定的次序依次調(diào)用前進(jìn),左轉(zhuǎn)彎、右轉(zhuǎn)彎和后退等四個(gè)基本控制函 數(shù),這四個(gè)函數(shù)是在任務(wù)一介紹過的伺服電機(jī)基本控制信號的基礎(chǔ)上設(shè)計(jì)的,下面我們重 點(diǎn)以“前進(jìn)子函數(shù)”為例介紹其基本設(shè)計(jì)思路,為了便于分析,這里再把程序中的“前進(jìn) 子函數(shù)”單獨(dú)列出如下: void Forward(void)/ 前進(jìn)子函數(shù) uchar i; for(i=1;i=65;i+) P1_1=1; delay_n 卩 s(1700); P1_ 仁0; P1_0=1; delay_n

25、 卩 s(1300); P1_0=0; delay_ nm s(20); 仔細(xì)分析以上程序,根據(jù)P1_0和P1_1引腳的高低電平持續(xù)時(shí)間,可以畫出讓輪式教育 機(jī)器人前進(jìn)的左右電機(jī)控制脈沖時(shí)序圖,如下: Vdd(5v) Vss(0v) + 1.3ms4 左電機(jī)控制脈沖 +1.3ms H21.7ms ! Vdd(5v) v 1.7ms Vss(Ov) 21.3ms 1.7ms 圖1.13 前進(jìn)控制信號時(shí)序圖 對照任務(wù)一中介紹過的伺服電機(jī)正轉(zhuǎn)、反轉(zhuǎn)控制信號,我們發(fā)現(xiàn),以上控制小車前進(jìn) 的脈沖信號有兩個(gè)問題需要進(jìn)一步解釋。 第一:因?yàn)樗欧姍C(jī)安裝在車架上的朝向剛好相反,其中一個(gè)電機(jī)如果原來是正轉(zhuǎn), 那

26、么掉轉(zhuǎn)朝向之后就變成了反轉(zhuǎn),所以要使兩個(gè)電機(jī)帶動兩個(gè)輪子朝一致的方向轉(zhuǎn)動,就 必須讓兩個(gè)伺服電機(jī)的旋轉(zhuǎn)方向?yàn)橐徽环础?第二:因?yàn)槭艿絾纹瑱C(jī)的編程限制,兩個(gè)電機(jī)的控制脈沖并沒有在時(shí)間上保持絕對的 同步(如圖1.13所示),這樣看起來似乎一個(gè)電機(jī)要先動作,而另一個(gè)電機(jī)稍微有點(diǎn)滯后, 并且由此引起的低電平持續(xù)時(shí)間也不再是前面介紹的20ms。不過這點(diǎn)小誤差在程序?qū)嶋H運(yùn) 行中的影響可以被忽略。 圖1.13只給出了控制小車前進(jìn)的一個(gè)控制脈沖,為驅(qū)使小車向前行進(jìn)一段距離,程序 中用for循環(huán)語句產(chǎn)生65個(gè)這樣的脈沖序列,在具體應(yīng)用中,可以根據(jù)實(shí)際需要改變循環(huán) 次數(shù),以達(dá)到改變小車行進(jìn)距離的目的。用同樣的思

27、路,讀者不難分析本案例中的左轉(zhuǎn) 彎、右轉(zhuǎn)彎和后退等基本動作控制函數(shù)。 萬案二: 本任務(wù)是在直流減速電機(jī)基本控制信號的基礎(chǔ)上設(shè)計(jì)出智能尋跡避障小車的 基本巡航動作的控制函數(shù),主要完成智能尋跡避障小車前進(jìn)、后退、停止等基本巡航動作。 #i nclude #defi ne uint un sig ned int #defi ne uchar un sig ned char sbit zuo1=P0A1; sbit zuo2=P0A0; sbit you1=P0A3; sbit you2=P0A2; void delay( uint x) uchar i; while(x-) for(i=0;i123

28、;i+); void qia n() zuo1=0; zuo2=1; you1=0; you2=1; void hou() zuo1=1; zuo2=0; you1=1; you2=0; void zuo() zuo1=1; zuo2=0; you1=0; you2=1; void you() zuo1=0; zuo2=1; you1=1; you2=0; void ting() zuo1=1; zuo2=1; you1=1; you2=1; main() while(1) qian(); delay(922*5); hou(); delay(922*4); ting(); / 左邊往前 /

29、右邊往前 / 左邊往后 / 右邊往后 / 左邊往后 / 右邊往前 / 左邊往前 / 右邊往后 delay(922*3); 2、運(yùn)行程序 這里仍然按圖1.8連接直流減速電機(jī)控制電路,編譯以上程序,將產(chǎn)生的可執(zhí)行文件燒 寫到智能尋跡避障小車控制板上的單片機(jī)程序存儲器,開機(jī)運(yùn)行,可以看到小車能按如下 規(guī)律運(yùn)動,即:前進(jìn) 5秒t后退4秒t停止3秒;如此周而復(fù)始循環(huán)。 3、程序設(shè)計(jì)思路 主函數(shù)按事先設(shè)定的次序依次調(diào)用前進(jìn),延時(shí)、后退,延時(shí)、停止,延時(shí)函數(shù);讓智能 尋跡避障小車完成規(guī)定動作。即主要測試電機(jī)的前進(jìn)、后退、停止功能是否控制正常, 讀者 可以將左轉(zhuǎn)彎、右轉(zhuǎn)彎函數(shù)加入主函數(shù)中加以調(diào)用,看功能是否實(shí)

30、現(xiàn)。 1.4相關(guān)知識 通過上述設(shè)計(jì)案例的學(xué)習(xí)和實(shí)踐,在對單片機(jī)輸出接口的應(yīng)用有了直觀認(rèn)識之后,我 們下面再來詳細(xì)學(xué)習(xí)有關(guān)單片輸入/輸出口機(jī)(I/O 口)的基本結(jié)構(gòu)及原理,以及特殊功能 寄存器(sfr )的Cx51定義方法。 1.4.1 89C51并行IO 口的內(nèi)部結(jié)構(gòu)及原理 89C51單片機(jī)總共有4個(gè)8位的并行IO接口,分別是P0, P1, P2和P3(本案例用到P1 口), 共32根I/O 口線,實(shí)際上4個(gè)并行I/O 口就是特殊功能寄存器 SFR之中的4個(gè),每個(gè)I/O 口 主要由4部分構(gòu)成:端口鎖存器、輸入緩沖器、輸出驅(qū)動器和端口引腳,下面分別介紹其內(nèi) 部結(jié)構(gòu)及原理: 地址/數(shù)據(jù)控制 VCC

31、 円口艘再鶴伽神冊蠟枸 (a)P0 口的位結(jié)構(gòu) (b)P1 口的位結(jié)構(gòu) 讀鎖存器 讀鎖存器 寫入 (c)P2 口的位結(jié)構(gòu) 內(nèi)部總線 寫入 讀引腳 (d)P3 D Q 鎖存器 CP Q 第二輸入功能 VCC T1 口的位結(jié)構(gòu) P1.X 圖1.14 89C51 各I/O 口的位結(jié)構(gòu) 1、P0 口:圖1.14中的(a)是P0 口中一位結(jié)構(gòu)圖。其中包含一個(gè)輸出鎖存器、兩個(gè) 三態(tài)緩沖器、一個(gè)輸出驅(qū)動電路和一個(gè)輸出控制電路。輸出驅(qū)動電路由兩個(gè)場效應(yīng)管T1和 T2組成,其工作狀態(tài)受輸出控制電路的控制??刂齐娐钒ㄒ粋€(gè)與門、一個(gè)反相器和模擬 轉(zhuǎn)換開關(guān)MUX模擬開關(guān)的位置由來自 CPU的控制信號決定,當(dāng)控制信號

32、為低電平時(shí),它把 輸出級與鎖存器的 Q端接通。同時(shí),因?yàn)榕c門輸出為低電平,輸出級中的場效應(yīng)管T1處于 截止?fàn)顟B(tài),因此是輸出級是漏級開路的開漏電路。這種情況P0 口可用做一般的I/O線。其 輸出和輸入操作如下: 當(dāng)CPU向端口輸出數(shù)據(jù)時(shí),寫脈沖加在觸發(fā)器的時(shí)鐘端CL上,此時(shí)與內(nèi)部總線相連的 D端的數(shù)據(jù)經(jīng)反向后出現(xiàn)在 Q端上,再經(jīng)T2管反相,于是在P0 口這一位引腳上出現(xiàn)的數(shù)據(jù) 正好是內(nèi)部總線上的數(shù)據(jù)(當(dāng)P0 口作輸出口使用時(shí), 輸出級屬開漏電路, 在驅(qū)動NMO電路 時(shí)應(yīng)外接上拉電阻) 。 當(dāng)輸入操作時(shí), 端口中的兩個(gè)三態(tài)緩沖器用于讀操作。 圖中下面一個(gè)緩沖器用于讀端口 引腳數(shù)據(jù)。 當(dāng)執(zhí)行一般的端

33、口輸入指令時(shí), 讀引腳脈沖把三態(tài)緩沖器打開, 于是端口上的數(shù) 據(jù)將經(jīng)過緩沖器輸送到內(nèi)部總線;上面一個(gè)緩沖器讀取鎖存器中Q端的數(shù)據(jù)。Q端的數(shù)據(jù)實(shí) 際上與引腳的數(shù)據(jù)是一致的, 結(jié)構(gòu)上的這種安排是為了適應(yīng)所謂 “讀修改寫” 這類指令 的需要。這類指令的特點(diǎn)是:先讀端口, 隨之可以對讀入的數(shù)據(jù)進(jìn)行修改, 然后再寫到端口 上。例如,邏輯與指令(ANL PO, A),此指令的功能是先把 P0 口的數(shù)據(jù)讀入 CPU隨后同 累加器A中的數(shù)據(jù)按位進(jìn)行邏輯與操作(即對讀入的數(shù)據(jù)作修改)最后把結(jié)果寫回P0 口。 對于“讀一修改一寫” 這類指令,不直接讀引腳上的數(shù)據(jù)而讀鎖存器Q端上的數(shù)據(jù)是為 了避免可能錯(cuò)讀引腳上的電

34、平信號。 例如,用一條口線去驅(qū)動一個(gè)晶體管的基極, 當(dāng)向此口 線寫 1 時(shí), 晶體管導(dǎo)通并把引腳上的電平拉低。這時(shí),若從引腳上讀取數(shù)據(jù),就把該數(shù)據(jù)錯(cuò) 讀為0 (實(shí)際上應(yīng)是1),而從鎖存器 Q端讀入,則得到正確的結(jié)果。 由圖1.14( a)可知,當(dāng)讀引腳操作(輸入)時(shí),弓I腳上的外部信號既加在三態(tài)緩沖器 2的輸入端上,又加在輸出級場效應(yīng)管(T2)的漏級上,若此時(shí) T2是導(dǎo)通的(例如曾輸出 過數(shù)據(jù) 0),則引腳上的電位被鉗在 0 電平上。為使引腳上輸入的邏輯電平能正確地讀入, 在輸出數(shù)據(jù)時(shí),要先向鎖存器寫1,使其Q端為0,使輸出級T1和T2兩個(gè)管子均被截止, 引腳處于懸浮狀態(tài),作高阻抗輸入。因此,

35、作為一般的I/O 口使用時(shí),P0 口也是一個(gè)準(zhǔn)雙 向口。當(dāng)P0 口作為地址/數(shù)據(jù)總線分時(shí)使用時(shí), 這時(shí)控制信號為高電平, 轉(zhuǎn)換開關(guān)MUX把反 相器輸出端與T2接通,同時(shí)把與門開鎖。輸出的地址或數(shù)據(jù)信號通過與門驅(qū)動T1管,同時(shí) 通過反相器驅(qū)動 T2管,完成信息傳送。 2、P1 口: P1 口是一個(gè)準(zhǔn)雙向口,作通用的I/O 口使用。其結(jié)構(gòu)如圖 1.14 (b)所示, 在輸出驅(qū)動部分接有內(nèi)部提升電阻。當(dāng)用做輸出線時(shí),將1 寫入鎖存器,使輸出驅(qū)動器 T 管截止,輸出線由內(nèi)部提升電阻拉成高電平(輸出1);將0寫入鎖存器時(shí),T導(dǎo)通,輸出0。 P1 口作為輸入線時(shí),必須先將 1 寫入鎖存器,使 T 截止,把

36、該口線由內(nèi)部提升電路拉成高 電平。于是,當(dāng)外部輸入為高電平信號時(shí),該口線為 1;輸入為低電平信號時(shí),該口線為 0, 從而使輸入端的電瓶隨輸入信號改變,讀入正確的數(shù)據(jù)信息。P1 口作為是輸入時(shí),可被任 何TTL電路和MOS電路所驅(qū)動。由于具有內(nèi)部提升電阻, 也可以直接被集電極開路或漏極開 路的電路驅(qū)動而不必外加提升電路。 CPU讀P1 口有兩種情況:讀引腳和讀鎖存器狀態(tài)。讀引腳時(shí),打開三態(tài)門2,讀入引 腳上的輸入狀態(tài)(如 MOXA,P1指令);讀鎖存器狀態(tài)時(shí),打開三態(tài)門 1,與p0 口的I/O功 能一樣, P1 口可以進(jìn)行“讀修改寫”操作。 3、P2 口: P2 口為準(zhǔn)雙向口。每一位的結(jié)構(gòu)如圖

37、1.14中(c)所示。P2 口可以作為通 用的I/O 口使用,外接I/O設(shè)備,也可以作為擴(kuò)展系統(tǒng)時(shí)的地址總線口(輸出高8位地址), 由控制信號控制轉(zhuǎn)換開關(guān)來實(shí)現(xiàn)。當(dāng)轉(zhuǎn)換開關(guān)(MUX)倒向左邊時(shí),P2 口作通用I/O 口使 用,作用和P1 口相同。當(dāng)作為地址總線口使用時(shí), MUX在CPU的控制下倒向右邊, 從而在 P2 口的引腳上輸出地址(A15A8)。P2 口的地址信息來源于 PCH DPH。對于8031單片機(jī) 來說,P2 口通常只作為地址總線口使用,而不作 I/O 口線直接與外部設(shè)備連接。 4、P3 口: P3 口為雙功能口,其每一位的結(jié)構(gòu)如圖1.14中(d)所示。當(dāng)它作為第一 功能口(通用

38、的I/O 口)使用時(shí),工作原理與 P1 口和P2 口類似,但第二輸出功能線保持為 高電平,使與非門3對鎖存器輸出端(Q端)是暢通的(與非門3的輸出只取決于 Q的狀態(tài))。 當(dāng)P3 口作為第二功能使用時(shí),相應(yīng)位的鎖存器必須為“1”狀態(tài),使與非門3的輸出電路由 第二輸出功能線的狀態(tài)來確定,或使此口線允許輸入第二功能信號。對P3 口不管是作通用 輸入口或作第二功能輸入口,相應(yīng)位的鎖存器和第二輸出功能端都必須為1。在P3 口的引 腳信號輸入通道中有兩個(gè)緩沖器2和4 ,第二輸入功能信號取自緩沖器4的輸出端,通用 輸入信號取自緩沖器 2的輸出端。P3 口的第二功能定義見表 8-1 表1-2 P3 口的第二功

39、能 通道位 第二功能 注釋 P3.0 RXD 串行輸入口 P3.1 TXD 串行輸岀口 P3.2 INT0 外部中斷0輸入 P3.3 INT1 外部中斷1輸入 P3.4 T0 計(jì)數(shù)器0計(jì)數(shù)輸入 P3.5 T1 計(jì)數(shù)器1計(jì)數(shù)輸入 P3.6 WR 外部數(shù)據(jù)RAM寫選通信號 P3.7 RD 外部數(shù)據(jù)RAM寫選通信號 1.4.2 89C51特殊功能寄存器(SFR)的C51定義方法 1、89C51特殊功能寄存器(SFR)及其Cx51定義方法 89C51單片機(jī)片內(nèi)有21個(gè)特殊功能寄存器(SFR)分散在片內(nèi)RAM區(qū)的高128字節(jié)中, 地址為80H0FFH,對SFR的操作,只能用直接尋址方式。89C51單片機(jī)

40、中,除了程序計(jì)數(shù) 器PC和4組通用存器組之外,其他所有的寄存器,均稱為SFR并位于片內(nèi)特殊寄存器區(qū), 每個(gè)SFR和其他地址見表1-3。SFR中有11個(gè)寄存器具有位尋地址能力。這些寄存器的字節(jié) 地址都能被8整除,即字節(jié)地址是以 8或0為尾數(shù)的。89C51單片機(jī)的SFR如表1-3所列: 表1-389C51特殊功能寄存器一覽表 SFR MSB位地址/位定義 LSB 字節(jié) 地址 B F0H ACC E0H PSW D7 D6 D5 D4 D3 D2 D1 D0 D0H CY AC F0 RS1 RS0 OV F1 P IP BF BE BD DC BB DA A9 B8 B8H -一- -一- -一-

41、 PS PT1 PX1 PT0 PX0 P3 B7 B6 B5 B4 B3 B2 B1 B0 B0H P3.7 P3.6 P3.5 P3.4 P3.3 P3.2 P3.1 P3.0 IE AF AE AD AC AB AA A9 A8 A8H EA -一- -一- ES ET1 EX1 ET0 EX0 P2 A0H SBUF 99H SCON 9F 9E 9D 9C 9B 9A 99 98 98H SM0 SM1 SM2 REN TB8 RB8 TI RI P1 90H TH1 8DH TH0 8CH TL1 8BH TL0 8AH TMOD GATE C/T M1 M0 GATE C/T M

42、1 M0 89H TCON 8F 8E 8D 8C 8B 8A 89 88 88H TF1 TR1 F0 R0 IE1 IT1 IE0 IT0 PCON SMOD -一- -一- -一- GF1 GF0 FD IDL 87H DPH 83H DPL 82H SP 81H P0 80H 為了能直接訪問這些特殊功能寄存器,KFIL CX51提供了一種自主的定義形式方法。這 種定義方法與標(biāo)準(zhǔn) C語言不兼容,只適用于對 89C51系列單片機(jī)進(jìn)行 C編程。 這種定義的方法是引入關(guān)鍵字sfr”,語法為:sfr sfr-name=int constant ; 例如: sfr SCON=OX98/串口控制寄存

43、地址 98H sfr TMOD=OX89 ;/定時(shí)器/計(jì)數(shù)器方式控制寄存器地址89H 注意:sfr必須跟一個(gè)特殊寄存器名,”=”后面的地址必須是常數(shù),不允許帶有運(yùn)算的表 達(dá)式,這個(gè)常數(shù)值的范圍必須在特殊功能寄存器地址范圍內(nèi),位于0X800XFF之間。 對SFR的16數(shù)據(jù)的訪問,在新的 89C51系列產(chǎn)品中,SFR在功能上經(jīng)常組合為 16位值。 當(dāng)SFR的高端地址直接位于其低端地址之后時(shí),對SFR16值可以進(jìn)行直接訪問。例如 8052 的定時(shí)器2就是這種情況,為了有效地訪問這類 SFR可使用關(guān)鍵字” sfr16”。16位SFR定 義的語法與8位SFR相同,16位SFR的低端地址必須作為” fr1

44、6 ”的定義地址。 例如:sfr16 T2=oxCC/定義2:T2低8位地址=0CCH, T2高8位地址=OCDH 定義中名字后面不是賦值語句,而是一個(gè)SFR地址,高字節(jié)必須位于低字之后。這種定義適 用于所有新的SFR但不能用于定時(shí)器/計(jì)數(shù)器0和1。 在典型的89C51應(yīng)用問題中,經(jīng)常需要單獨(dú)訪問 SFR中的位,CX51的擴(kuò)充功能之成為可能。特殊位(sbit)r的定義像SFR 樣不與標(biāo)準(zhǔn) C兼容,使用關(guān)鍵字” sbit”可以訪問位尋址對象。 與SFR定義一樣,用關(guān)鍵字” sbit”定義某些特殊位,并接受任何符號名, ”=”號后將絕對 地址賦給變量名。這種地址分配有 3 種方法。 方法一:sfr

45、-n ameAi nt-c on sta nt 當(dāng)特殊寄存器的地址這字節(jié)(8位)時(shí),可使用這種方法。sfr-name必須是已定義的 SFR的名 字。*后的語句定義了基地址上的特殊位置。該位置必須是07的數(shù)。例如: sfr PSW=0Xd0; /定義PSW寄存器地址為 0XD0 sbit OV=PSWA2 /定義OV為位為PSW2, 地址為 0XD2 sbit TCY=PSWA7 /定義CY位為PSW.7地址為0XD7 方法二: int-constantAint-constant 這種方法以一個(gè)整常數(shù)作為基地址,該值必須在0X80OXFF之間,并能被8整除,確定 位置的方法同上。 例如:sbit

46、 OV=0XDOA20V位于地址為0XD2 sbit CY=OXDOA7CY 位地址為 0XD7 方法三: int-constant 這種方法將位的絕對地址賦給變量,地址必須位于0X800XF F之間,例如: sbit OV=OXD2; sSbit CY=OXD7; 特殊功能位代表了一個(gè)獨(dú)立的定義類,不能與其他位定義和位域互換。 2、89C51并行接口及其CX51定義方法 前面提到89C51單片機(jī)芯片內(nèi)帶有 4個(gè)8位的并行口,共 32根I/O線,對I/O 口的操作實(shí) 際上就是對PO, P1, P2和P3四個(gè)寄存器進(jìn)行操作,而PO, P1, P2和P3四個(gè)寄存器也屬 于特殊功能寄存器(SFR,因此89C51并

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論