Based on Fuzzy Control Theorem and TPWM Method for DC ... ·...

76
自動控制工程學系專題製作 具模糊控制理論與雙脈寬調變法 之直流馬達驅動電路設計 Based on Fuzzy Control Theorem and TPWM Method for DC Motor Driver Circuit Design 指導教授:洪三山 生:林世杰 林計德 中華民國九十四年三月十五日

Transcript of Based on Fuzzy Control Theorem and TPWM Method for DC ... ·...

Page 1: Based on Fuzzy Control Theorem and TPWM Method for DC ... · 使吾人想設計一模糊控制器來做為馬達轉速的閉迴路控制,以解決非線性系統的 問題。除此之外,flcs

逢 甲 大 學 自動控制工程學系專題製作

專 題 論 文

具模糊控制理論與雙脈寬調變法 之直流馬達驅動電路設計

Based on Fuzzy Control Theorem and TPWM Method for DC Motor Driver

Circuit Design

指導教授洪三山

學 生林世杰

林計德

中華民國九十四年三月十五日

I

誌 謝

專題研究計畫的完成需要來自各方的支持並非一個人所能獨力完成在

透過老師的建議與指導以及同學的幫忙協助下本專題才得以完成首先感謝

學生的指導老師洪三山老師引領入門除了知識的傳授更教了不少做人處事的

方法在老師的指導風格下從不設限學生的研究範圍或給予壓力讓學生得以

發揮所長激發創意並訓練出獨立思考與解決問題的能力老師悉心教導的用

心與苦心師恩浩蕩學生必點滴銘記在心同時還要感謝陳杏圓老師在研究

的過程中觸發了學生的一些靈感讓本專題內容更加完善

此外感謝阿亮學長詳細教授馬達與模糊控制相關的各種知識也要感謝同

儕冠亨清宏永祥嘉麒禹廷書綺耿綸柏宇同學們感謝你們在製作

專題時給予適時的幫助在學生這段求學路途上協助與生活陪伴你們的友情讓

學生詠懷在心

學生僅將這幾年來獲得的所有榮譽與成果歸功於學生最親愛的家人與同

學陪學生一路成長給學生不間斷的支持與鼓勵在此學生向所有親人師長及

所有同學致上最誠摯的謝意

II

中文摘要

雙脈波寬度調變式〈Two Pulse Width Modulation〉驅動電路為數位邏輯電

路在實用上可開發成積體電路模組〈module〉縮小佔用空間維修替換簡便

結合微電腦控制其應用發展領域更顯寬廣主要特色不論電動機是正反轉

或速度快慢亦或停止均消耗定額功率因此輸出轉矩保持在額定值系

統於寬廣的速度變換範圍內仍具有良好的伺服性能電機的旋轉扭力不因速度

及負載而受影響使伺服控制達到某一預定的特性範圍

馬達的轉速會因其驅動機構的慣性影響不可能「說停就停」也會因為摩

擦力等影響不可能「說動就動」故對其操控指令一定會有延遲的現象發生

這些因素使馬達不是一個典型的線性系統故傳統的 PID 控制器就不是最好的

選擇再加上近年來模糊控制系統〈Fuzzy Logic Control SystemFLCS〉的發展

使吾人想設計一模糊控制器來做為馬達轉速的閉迴路控制以解決非線性系統的

問題除此之外FLCS 在上升時間安定時間和超越量上的要求也都優於傳統

的 PID 控制器

主旨為具模糊控制理論為基礎之雙脈寬調變直流馬達驅動電路之設計有

別於傳統上之 PID 脈寬調變控制技術而達到轉速控制的回授系統

III

Abstract

Use Two Pulse Width Modulation(TPWM) driver circuit by Fuzzy Logic

Control System(FLCS) to replace conventional PWM circuit with PID control system

has many advantages

TPWM is digital logic circuit which can be developed into integrated circuit

micro chips for easy maintenance and installation When incorporate with micro

computing TPWM has wide range of applications The major advantages of the

TPWM driver circuit by FLCS are

When performing on and off forward reverse or variable speed TPWM requires

the same power and will not effect torque in performing desirous of speed under

different loading

Convention motor circuit does not compete spinning motorrsquos inertia when

control to stop therefore the motor takes some time to slow to a stop Also due to

same factor the conventional motor circuit can not accelerate the motor to desirous of

speed in the same instant the motor is turned on Whereas TPWM circuit can make

the motor stop in instant and spin up to desirous of speed when turned on without

convention motor circuitrsquos delay

Convention PID controller for motors is not the best control system because the

motor is not a linear system as PID controller assumed Recent development on FLCS

is specialize in solving this conflict because its performance of rise time setting time

and overshoot are all better than PID controller

Based on fuzzy control theorem and TPWM method for dc motor driver circuit

design is different from conventional PWM circuit with PID controller in order to get

up to the speed feed back control system

IV

目錄

誌 謝 I

中文摘要 II

Abstract III

目錄 IV

圖目錄 VI

表目錄 VIII

第一章 緒論 1

11 前言 1 12 研究動機 2 13 研究方法 3 14 研究目標 4

第二章 原理探討 5

21 模糊控制與理論 5 211 模糊理論概述 5 212 模糊集合 6 213 歸屬函數 7 214 模糊推論與模糊規則 10 215 模糊控制器 11

22 直流馬達數學模型 14

第三章 系統功能分析與製作規劃 17

31 專題製作流程 17 32 雙脈寬調變法之直流馬達驅動電路設計 18

321 脈寬調變電路 18 322 橋型驅動功率放大電路 23 323 間距脈波產生電路 26

33 編碼器 27 34 LM2917 FV 電路設計 29 35 單晶片介面電路 31

351 AD 轉換31 36 電源供應系統 33 37 馬達轉速的量測 34

V

第四章 軟體規劃與製作 36

41 PWM 之軟體設計 36 411 PWM 軟體流程 36

42 模糊控制之程式規劃與撰寫 37 421 歸屬函數 38 422 模糊規則庫 41 423 模糊控制器之軟體設計流程 42

43 LCD 顯示轉速43 431 LCD 顯示幕之軟體流程 44

第五章 結論 46

參考文獻 48

附錄 A 專題硬體展示圖 50

附錄 B PWM 與模糊控制之程式53

附錄 C LCD 顯示之程式 62

VI

圖目錄

圖 11 單象限控速系統運作於第一象限2 圖 211 正規且凸模糊集合7 圖 212 正規非凸的模糊集合7 圖 22 吊鐘型歸屬函數8 圖 23 三角型歸屬函數9 圖 24 梯型歸屬函數9 圖 25 模糊控制系統的構造11 圖 26 模糊系統的基本架構13 圖 27 直流馬達等效電路簡圖14 圖 28 直流馬達數學模式方塊圖16 圖 31 專題製作流程圖17 圖 32 脈寬調變電路18 圖 33 三角波產生電路19 圖 34 三角波輸出波形21 圖 35 脈寬調變電路22 圖 36 三角波與反相輸入電壓比較22 圖 37 PWM 輸出波形 23 圖 38 橋型驅動功率放大電路24 圖 39 橋型驅動功率放大電路實體圖24 圖 3101 呈現不感帶的轉移函數25 圖 3102 輸出電壓波形25 圖 311 間距脈波產生電路26 圖 312 間距脈波27 圖 313 光學式轉動編碼器的原理圖28 圖 314 編碼器的輸出信號波形28 圖 315 FV 電路 29 圖 316 頻率對電壓曲線31 圖 317 直流電源電路33 圖 318 直流電源電路實體圖34 圖 319 PWM 輸出對應 encoder 週期 35 圖 41 PWM 軟體設計流程圖 36 圖 42 停止時之歸屬函數38 圖 43 正轉〈慢〉之歸屬函數38 圖 44 正轉〈快〉之歸屬函數39 圖 45 逆轉〈慢〉之歸屬函數39 圖 46 逆轉〈快〉之歸屬函數40

VII

圖 47 輸出之歸屬函數40 圖 48 推論後的三維空間圖41 圖 49 Fuzzy Controller 程式流程圖 42 圖 410 LCD 顯示幕之程式流程圖44 圖 A-1 硬體整體圖 50 圖 A-2 硬體整體鳥瞰圖 50 圖 A-3 硬體側視圖 51 圖 A-4 操作與顯示面板 51 圖 A-5 間距脈波電路與 FV 電路 51 圖 A-6 橋型驅動功率放大電路 52 圖 A-7 操作與控制面板 52

VIII

表目錄

表 31 頻率與轉換電壓之關係30 表 33 PWM 輸出對應 encoder 週期 34 表 41 模糊控制規則表41

1

第一章 緒論

11 前言

在現代的工程應用裡馬達扮演一個非常重要的角色它在機械設備中就好

像人的心臟一樣提供了機械運轉所需要的動力源以做為能量轉換或控制機能

的實行在眾多的馬達種類當中直流馬達不僅具有許多良好的特性例如高

啟動轉矩較易線性控制hellip等且其週邊控制元件充足控制理論發展成熟所

以被廣泛的應用在工業日常生活上馬達的速度控制被廣泛的應用在各種加工

機械航空機械農業機械交通工具等用途

直流電動機之轉速控制目前最常被使用的一種方法為脈波寬度調變〈PWM〉

驅動電路並結合傳統的 PID 控制器脈寬調變是一種以固定的頻率波寬可

調的輸出開閉供應的直流電壓使馬達感受到的平均電壓可以調整進而控制馬

達的轉速

我們日常生活中處處存在著非線性的現象但是我們較熟悉處理的卻是線

性的系統對於傳統 PID 控制器來說必須先知道受控系統〈plant〉的數學模

型否則無法導出其控制演算法則且其強健性與容錯性較低然而對於非線性

系統則不適合此法因此近年來對於非線性系統的研究工作已有許多學者嘗試

應用模糊理論〈Fuzzy Theory〉類神經網路〈Artificial Neural Networks〉基因

演算法〈Genetic Algorithms〉等非傳統方法且已有不錯之成效因此以模糊控

制理論之方法取代傳統的 PID 控制器來控制馬達轉速

對於一個非線性時變系統〈Nonlinear Time Variant System〉模糊控制理論

不但能簡化數學模型並且可以結合人類的操作經驗有效的達成控制目標模

糊控制能將操作者的專家經驗換成控制器設計人員的設計理念勢必擁有比一般

傳統的控制器更加的強健性與容錯性

2

12 研究動機

現今直流馬達的轉速控制多廣泛使用脈波寬度調變式〈Pulse Width

Modulation簡稱 PWM 驅動電路〉此種電路是以控制固定頻率的開閉供應直流

電壓以得到波寬可調的輸出使馬達的平均電壓可以調整進而轉移到馬達的

平均功率而達到轉速的控制但是由於 PWM 為一種單象限控制只運作於第一

象限這種系統本身無法產生負轉矩未加上逆向開關前亦無法反向因此無法

作用於第三象限系統加上動力制動後方可以有限度地產生逆向轉矩而運作於

第二象限〈見圖 11〉然而這也只是一種被動控制區間﹝1﹞

主動控制區動力制動

(被動運作)

Ⅱ Ⅰ

Ⅲ Ⅳ

ω

TCWCCW

圖 11 單象限控速系統運作於第一象限

本研究主要目的之一就是針對 PWM 之缺失提出了改良的方法於前級驅

動電路產生正反方向的兩個脈波信號再經驅動功率放大之後使馬達產生正

反轉向的兩拉力此即為雙脈波寬度調變式(Two Pulse Width Modulation簡稱

TPWM)本控制主要特色不論電動機正轉反轉速度快慢或停住均消

耗定額功率〈即馬達無時無刻都在運轉且輸出轉矩為額定值〉系統於寬廣的

速度變化範圍內仍具有良好的伺服性能馬達的旋轉扭力不會因速度及負載的

變化而受影響使伺服控制系統達到某一預定的特性範圍﹝2﹞

3

此外馬達的轉速會因其驅動機構的慣性影響不可能「說停就停」也

會因為摩擦力等影響不可能「說動就動」故對其操控指令一定會有延遲的

現象發生這些因素使馬達不是一個典型的線性系統故傳統的 PID 控制器就

不是最好的選擇再加上近年來模糊控制系統〈Fuzzy Logic Control System

FLCS〉的發展﹝3﹞使吾人想設計一模糊控制器來做為馬達轉速的閉迴路控

制以解決非線性系統的問題除此之外FLCS 在上升時間安定時間和超

越量上的要求也都優於傳統的 PID 控制器[4]

目前雖然有很多從事於馬達轉速控制的相關研究但是多採用脈波寬度調

變法且其尚有缺失待改良因此吾人想採用雙脈波寬度調變雖然有關此法

的研究並不多見但 TPWM 卻具有 PWM 所沒有的優點再加上近來發展愈

盛的模糊控制理論較傳統 PID 控制器的優點相信馬達轉速以 TPWM 驅動電

路之模糊控制是值得去加以研究和探討的

13 研究方法

本專題計畫其研究方法主要分為兩大類一為硬體結構電路設計另一為

Fuzzy 控制器之軟體製作硬體結構方面主要設計一比較放大器使其誤差值經

此電路與三角波比較而輸出 A 驅動信號脈波與 B 驅動信號脈波然後再由驅動

功率放大電路將信號脈波放大後控制馬達正逆轉此外為了確保功率放大電

路之安全性需在其之前加上一間距產生電路以防止其電路損毀

感測器方面則利用編碼器〈encoder〉感測出馬達的轉速然後再經由 FV

將其轉換為電壓此電壓再由 AD 轉換為數位信號送入單晶片 8051經由模

糊控制規則庫判斷並做出決策以達到馬達轉速的控制

4

14 研究目標

本專題研究目標如下

〈1〉 完成相關文獻資料之蒐集整理與討論

〈2〉 完成 AB 信號產生電路設計

〈3〉 完成間距脈波產生電路設計

〈4〉 完成驅動功率放大電路設計〈橋型驅動功率放大〉

〈5〉 完成 FV 電路設計

〈6〉 完成 AD 訊號轉換

〈7〉 編寫模糊控制法則與介面軟體設計

5

第二章 原理探討

21 模糊控制與理論

在傳統的控制領域裏控制系統動態模式的精確與否是影響控制優劣的最主

要關鍵系統動態的資訊越詳細則越能達到精確控制的目的然而對於複雜

的系統由於變數太多往往難以正確的描述系統的動態於是工程師便利用各

種方法來簡化系統動態以達成控制的目的但卻不盡理想換言之傳統的控

制理論對於明確系統有強而有力的控制能力但對於過於複雜或難以精確描述的

系統則顯得無能為力了因此便嘗試著以模糊數學來處理這些控制問題模糊

控制是屬於非線性式的控制在受控系統無法以線性數學模式精確描述的情況

下經由適當調整控制規則應具有比傳統控制方法更佳的控制性能

211 模糊理論概述

1965 年美國加州柏克萊分校的 LotfiAZadeh 教授首先在他主編的

「Information and Control」刊物上提出「Fuzzy Set」論文此為模糊邏輯理論的

創始模糊理論在經過了三十幾年的演化改進後無論是在應用或理論架構上

皆已日趨完備尤其近年來因人工智慧的迅速發展模糊理論儼然成為人工智慧

不可或缺的理論根基

Zadeh 教授曾提出一個互克性原理﹝5﹞「當系統的複雜性增長時對系統

特性做精確且有意義描述的能力亦相對降低最後精確性與有意義性將變成完全

互相排斥的特性」很高的複雜性意味著只能在一個刻意壓縮的低維因素空間觀

察而無法對問題的全部因素都進行考察使得原本是明確的概念變的模糊

Fuzzy 理論正是為了掌握這類具模糊特質的事物而發展出來的所以它的應用較

偏重於人類的經驗及對問題特性的掌握程度不主張用繁雜的數學分析及數學模

式來解決問題

Fuzzy 理論把傳統數學從二值邏輯〈binary logic〉擴展到連續多值〈continuous

6

multi-value〉利用歸屬函數〈membership function〉描述一個概念的程度亦及

使用 0 和 1 之間的數值來表示一個元素屬於某一概念的程度這個值稱為元素對

集合的歸屬度〈membership grade〉當歸屬度為 1 時表示該元素百分之百屬於

這個概念當歸屬度為 0 時則表示該元素完全不屬於這個概念介於兩者之間

的就是完全屬於和完全不屬於之間的灰色地帶

模糊理論的工程應用大約始於 1974 年倫敦大學的 EHMamdani 教授他根

據 Zadeh 提出的語言分析法〈linguistic approach〉及模糊推論〈fuzzy inference〉

運用 IF-THEN 形式的法則來敘述操作員的控制策略成功地應用在蒸汽機自動

運轉上﹝6﹞從此模糊理論的應用便迅速發展以在控制方面的研究成果最為

顯著模糊理論其實是一門相當生活化的學問由於使用語言變量描述因此更

具親和力與一般性人類日常生活所遇所用的一些敘述即大都是模糊的例如

那個人ldquo很高車開的ldquo很快等等其中ldquo很高ldquo很快並不是一個

明確值而只是描述事件的程度但是根據這些描述人類卻能很輕易的接收

212 模糊集合

模糊集合〈fuzzy set〉可視為傳統集合的擴張在模糊集合的世界中稱傳

統集合為明確集合〈crisp set〉所謂模糊集合是指用來表示界限或邊界不分明的

模糊概念的集合許多日常生活中的概念常常都不是清晰明確的這些可說是模

糊概念例如很高很快等這類概念無法用傳統的二值集合論即 0 或 1 表示

而Zadeh教授提出的Fuzzy集合論可以將這些概念由傳統集合論的特徵函數從非

0 即 1 的二值選擇推廣為從 0 到 1 之間的任何值做選擇得到新型的特徵函數

稱為歸屬函數

模糊集合由歸屬函數表示相對於明確集合的特徵函數其值只有 0 或 1 兩個

值即其值為在實軸閉區間[01]之中的任一實數模糊集合可以彌補明確集

合描述時所產生的不合理現象因此模糊集合比傳統的明確集合更具客觀性

7

213 歸屬函數

歸屬函數〈membership function〉為 0 到 1 之間的數值吾們可以藉由歸屬

函數來描述 Fuzzy 集合的特質它是 Fuzzy 理論的最基本觀念透過歸屬函數我

們才能對 Fuzzy 集合進行量化也才可能利用精確的數學方法分析處理模糊性資

歸屬函數在 Fuzzy 控制的應用範疇內都要具備凸〈convex〉及正規〈normal〉

等基本特性〈如圖 21〉歸屬度函數的定義可以分為數值及函數兩種數值定義

方式又稱為離散化歸屬函數它是直接給定有限 Fuzzy 集合內每個元素的歸屬

度並以向量的形式表現出來函數定義方式又稱為連續化歸屬函數它是以不

同形式的函數來描述 Fuzzy 集合

圖 211 正規且凸模糊集合

1

0 圖 212 正規非凸的模糊集合

8

一個模糊集合的歸屬函數可以有許多方式但是目前最廣泛使用的有吊鐘

型三角型梯型等歸屬函數

〈1〉吊鐘形歸屬函數

吊鐘形歸屬函數定義如下

μA=bell(xabc)= b

acx 2

1

1minus

+

〈21〉

圖 22 吊鐘型歸屬函數

〈2〉三角形歸屬函數

三角形歸屬函數可由三個參數(abc)來加以決定

=Aμ trangle(xabc)

⎪⎪⎪

⎪⎪⎪

ltleminusminus

ltleminusminus

=

other

cxbcbcx

bxaabax

0

〈22〉

其中a為歸屬函數左邊界b為歸屬函數中心值c為歸屬函數右邊界

9

圖 23 三角型歸屬函數

〈3〉梯型歸屬函數

梯型歸屬函數可由四個參數加以決定

=Aμ trapezoid(xabcd)

⎪⎪⎪⎪

⎪⎪⎪⎪

leleminusminus

ltle

ltleminusminus

=

other

dxcdcdx

cxb

bxaabax

0

1 〈23〉

圖 24 梯型歸屬函數

10

214 模糊推論與模糊規則

模糊推論〈fuzzy inference〉是根據知識庫保存的規則(rule)和給予的事實

推導出新的結論與傳統推論不同的地方是Fuzzy推論不只可以處理明確命題也

可以處理Fuzzy命題Fuzzy推論是依據近似推理〈approximate reasoning〉的概念

發展出來的比傳統推論的嚴正推理〈exact reasoning〉更合理也更具彈性近

似推理是兩種嚴正推理General Modus Ponens〈簡稱GMP〉及Genera Modus

Tollens〈簡稱GMT〉的一般化此原理是從傳統二值邏輯中的肯定律〈modus

ponens〉和否定律〈modus tollens〉推廣而來其中GMP又可稱為前向推理而

GMT則可稱為反向推理

〈1〉 GMP〈General Modus Ponens〉

規則IF x is A THEN y is B

事實x is Arsquo

結論y ix Brsquo 〈24〉

〈2〉 GMT〈General Modus Tollens〉

規則IF x is A THEN y is B

事實y is Brsquo

結論x is Arsquo 〈25〉

上式中IF x is A THEN y is B即為模糊規則〈fuzzy rules〉AArsquoBBrsquo

分別是定義在論域X及Y的模糊集合xy代表輸入變數及輸出變數的語言變數

一般來說「x is A」稱為前件部〈antecedent〉而「Y is B」則稱為後件部

〈consequence〉Fuzzy知識庫〈Fuzzy Knowledge Base簡稱FKB〉即由這些模

糊規則所組成的規則庫〈rule base〉和存放描述領域知識的Fuzzy變數及語言變數

的資料庫〈data base〉所組成所以FKB是用來描述受控對象所涉及的領域知

11

識和操控目標的一些定性及定量的資訊模糊知識庫和模糊推論是構成Fuzzy規

則系統核心的兩個重要部門﹝7﹞

模糊推論是模糊系統的核心根據知識庫的模糊法則進行模糊理論的合成運

算來模擬人類的思考決策模式一般來說規則的建立是採取十分主觀直覺的

方式依據相關領域專家的經驗與知識透過詢問進而將其知識經驗歸納條列出

重點再轉換成模糊規則的形式表現出來但是並非所有的專家或操作員都能

將自身的經驗知識以言詞的方式充分的表達出來且未必能整理成條列的模糊規

則所以知識規則的萃取工作往往是在建構模糊系統時最常遭遇到的困難之

215 模糊控制器

模糊控制是智慧型控制〈intelligent control〉系統的一種典型其基本特點

是不完全依賴受控對象的數學模型主要是利用人的操作經驗知識和推理技

術以及控制系統的某些訊息和性能得出對應的控制動作模糊控制是以並行

〈parallel〉方式處理規則的推理工作〈如圖25〉其近似推理會包容每個對操

控系統有貢獻的規則即使某些貢獻程度很小的規則也不會忽略

圖 25 模糊控制系統的構造

12

一個控制器的輸入通常是確定數值而非模糊輸出也是如此才能對被控對象

發生作用但是模糊邏輯控制器〈Fuzzy Logic Controller簡稱FLC〉則是以語

言化的控制規則為主體為了能夠把輸入的確定值與語言化之後的控制規則結

合必須把輸入的確定值模糊化〈fuzzification〉以便對應到FLC語言變數的論

域範圍中同樣的經過規則庫推理出來的結果是對應到輸出語言變數的論域

中所以也必須對其做解模糊化〈defuzzification〉的工作才能達成實際的控制

目標

一般模糊控制器的架構包含了五個主要部分定義變數模糊化知識庫

模糊推論及解模糊化

〈1〉 定義輸入及輸出變數

決定程序被觀察的狀況及考慮控制的動作輸入變數可以是擷取

自受控系統的觀測量也可以是推導出來的資料輸出變數則為操控

受控系統的操作量例如在一般控制問題上輸入變數通常為輸出

誤差e與輸出誤差之變化率e而控制變數則為下一個狀態之輸入

u其中eeu統稱為模糊變數

〈2〉 模糊化

將量測值轉換為語言變數的過程將外界所輸入的確定數值經由

一比例映射傳送到輸入變數所對應的模糊論域然後再利用模糊化

函數將此輸入資料轉換成適當的口語值以供模糊運算使用此口語

化變數稱之為模糊子集合

〈3〉 知識庫

模糊知識庫是模糊控制的依據由它來定義所有使用到的語言控

制法則及相關各項參數知識庫可說是整個控制系統資料核心其包

含了兩個部分資料庫〈data base〉與規則庫〈rules base〉

1 資料庫

提供處理模糊數據之相關定義資料庫所存放的資料是關

13

於如何將明確的資料轉換成模糊數值而資料的存放方式是以

歸屬函數表示該選用哪一種歸屬函數依實際的需要選定

以三角形歸屬函數最常被使用因其運算最為容易且又能充分

的表達模糊概念

2 規則庫

利用語言化的條件式控制規則描述控制目標和策略通常

控制規則可以由操控人員的經驗或專家的知識推導出來多個

控制規則所組成的集合就是規則庫

〈4〉 模糊推論

模糊推論為模糊控制最重要的核心其最主要的工作就是做實際

的決策過程處理模糊推論具有模擬人類做決策判斷的能力其基本

理論就是根據人類特有的近似推理方式如之前已說明的GMP和

GMTGMP為前向推理而GMT為逆向推理因為模糊推論為前向

運算因此GMP非常適合使用為模糊控制的推論機構

〈5〉 解模糊化

將推論完成所得到的模糊輸出量轉換成實際的明確數值以便和

外界溝通解模糊化的方法有很多例最大歸屬度法重心法高

度法面積法等

圖 26 模糊系統的基本架構

14

22 直流馬達數學模型

圖27為直流馬達等效電路簡圖其中

iV = 輸入電壓 ai = 電樞電流

zR = 電樞電阻 gT = 轉矩

aL = 電樞電感 bE = 反電動勢

φ = 空氣隙磁通量 ω = 轉子角速度

B = 黏滯摩擦係數 J = 轉動慣量

圖 27 直流馬達等效電路簡圖

由克希荷夫電壓定律知

( ) ( ) ( )tEdt

tdiLtiRV b

aaaai ++= 〈26〉

由於反電動勢 bE 與轉軸的角速度 ( )tω 及空氣隙磁通量φ之乘積成正比即

( ) ( ) ( )tKtKtE emb ωφω == 〈27〉

15

又轉矩的平衡方程式為

( ) ( ) ( )dt

tdJtBtTgωω += 〈28〉

且馬達轉矩 gT 與電樞電流 ( )tia 及空氣隙磁通量φ乘積成正比即

( ) ( ) ( )tiKtiKtT ataag == φ 〈29〉

取〈26〉~〈29〉式之拉氏變換得

( ) ( ) ( ) ( )sEssILsIRsV baaaai ++= 〈210〉

( ) ( )sKsE eb Ω= 〈211〉

( ) ( ) ( )sJssBsTg Ω+Ω= 〈212〉

( ) ( )sIKsT atg = 〈213〉

則馬達輸入電流與轉速為

( ) ( ) ( )( ) ( )( )

sR

sEsV

sLRsEsV

sIe

a

bi

aa

bia τ+

minus

=+minus

=1

〈214〉

( ) ( ) ( )

sB

sT

sJBsT

sm

gg

τ+=

+=Ω

1 〈215〉

其中a

ae R

L=τ 為電樞電流的電氣時間常數 BJ

m =τ 為馬達轉動的機械時間

常數

直流馬達轉速對輸入電壓的轉移函數 ( )sG 為

( ) ( )( ) ( )( ) etaa

t

i KKBJsRsLK

sVssG

+++=

Ω=

( )( ) etmea

t

KKssBRK

+++=

ττ 11 〈216〉

16

在一般情況電樞電感很小所以 eτ 可以忽略不計因此上式成為一階落後

方程式

( ) ( )( ) ( ) m

m

etma

t

i sTK

KKsBRK

sVssG

+=

++=

Ω=

11 τ 〈217〉

其中

eta

mam KKBR

BRT

+=

τ

eta

tm KKBR

KK

+=

所以直流馬達數學模式可以以圖28表之﹝8﹞

圖 28 直流馬達數學模式方塊圖

17

第三章 系統功能分析與製作規劃

31 專題製作流程

如圖 31 所示本專題主要分為兩條路徑進行一為硬體另一則為軟體程

式撰寫本章著重硬體的規劃設計軟體則在第四章中介紹在完成 AB 信號

產生電路驅動功率放大電路與間距脈波產生電路設計與製作後須先接上馬達

做一連串的測試〈此時系統並無回受控制〉測試間距脈波是否太長或太短硬

體電路是否有缺失hellip等等另一方面也著手撰寫模糊控制程式並將其與硬體電

路結合最後做閉迴路系統的整合測試若發現系統的運作結果並不如預期

則需分別從硬體與軟體兩方面去改良

直流馬達轉速之模糊控制

文獻蒐集與整理

AB信號產生電路設計與製作

驅動功率放大電路設計與製作

間距脈波產生電路設計與製作

測試間距脈波是否太長或太短

系統測試測試馬達轉速是否

達到控制目的

結束與論文寫作

重新設計間距脈波長度

Yes

No

系統整合與修正

輸出信號與Fuzzy控制器之連結設計

規劃輸出與輸入歸屬函數

規劃模糊知識庫

撰寫主程式並加入模糊知識庫

程式編譯及連結

軟硬體整合測試馬達是否運作

程式調整及最佳化

No

YesYes

No

圖 31 專題製作流程圖

18

32 雙脈寬調變法之直流馬達驅動電路設計

本專題製作的雙脈寬調變法之直流馬達驅動電路設計大致可以分為二大部

分第一雙脈寬調變法之電路設計第二橋型驅動功率放大電路

雙脈寬調變〈Two Pulse Width Modulation簡稱TPWM〉之電路設計主要

是先製作一脈寬調變〈Pulse Width Modulation簡稱PWM〉波形然後再將此

波形各別經由一緩衝器〈buffer〉和反向器〈inverter〉則可產生AB驅動信號

脈波此即為TPWM

321 脈寬調變電路

如圖32先利用兩顆op產生三角波電路再利用一個比較器比較三角波

和誤差值之大小

150k

1M

20k

+12V

-12V

+12V

-12V10k

+12V

-12V

10k

+12V

-12V-

+-

+

-

+ PWMLM324

LM324

LM324

2200pF

圖 32 脈寬調變電路

〈1〉 三角波產生電路

三角波產生電路通常至少需要兩個運算放大器其電路如圖33OP1

為一個反相積分器OP2為一個史密特磁滯比較器將OP2的輸出方波經

19

OP1反相積分以後得到Vo1三角波此三角波又同時加到OP2控制其狀

態的改變

當方波產生器的輸出是正的則三角波產生器的輸出是斜向負相似

地當方波產生器的輸出是負則三角波產生器的輸出是斜向正這個動

作將產生三角波的輸出同時也輸出方波﹝9﹞

+VCC

-VCC

-

+

R1

R2

R3

+VCC

-VCC

-

+

OP1

OP2

Vo2Vo1

圖 33 三角波產生電路

對OP2而言是磁滯比較必須先找到OP2的 THV 和 TLV

232

21

32

3oo v

RRR

vRR

Rv

++

+=+ 〈31〉

當 0=+v 時

23

21 oo v

RR

v minus= 〈32〉

表要達到OP2的 0=+v 必須有這麼大的 1ov

當 12 sato Ev = 時

TLsato VERR

v =minus= 13

21 〈33〉

當 22 sato Ev minus= 時

THsato VERR

v =+= 23

21 〈34〉

20

對OP1而言是反相積分器 2ov 為其輸入 1ov 為其輸出則

tCIt

Rv

Ct

CRv

dtvCR

v oooo

11

2

11

22

111

11minus=minus=minus=minus= int 〈35〉

因為

1

2

Rvv

I o minusminus= 0=minusv 〈因為虛接地〉 〈36〉

所以

1

2

Rv

I o= 〈37〉

又因運算放大器的輸入阻抗非常大則流經 1C 的電流也為 I 相當於以定

電流對電容C 充電

當 12 sato Ev = 時 1ov 為下降斜波

tR

EC

v sato

1

1

11

1minus= 〈38〉

當 22 sato Ev minus= 時 1ov 上升斜波

( )

tRE

Cv sat

o1

2

11

1 minusminus= 〈39〉

由此可知三角波的上升與下降斜波乃因 1C 的充電與放電且時間

常數為 11CR

三角波週期分析如下

1 上升斜波的時間 1T

tCR

vv o

o1

1

21 minus= 11

2

1 CRvv

to

ominus=

1Tt = TLTHo VVv minus=1 22 sato Ev =

11111

21

sat

TLTH

sat

TLTH

EVV

CRCRE

VVT

minus=

minusminus= 〈310〉

2 下降斜波的時間 2T

tCR

vv o

o1

1

21 minus= 11

2

1 CRvv

to

ominus=

21

2Tt = THTLo VVv minus=1 12 sato Ev =

1

11111

1sat

TLTH

sat

THTL

EVV

CRCRE

VVT

minus=

minusminus= 〈311〉

3 週期 21 TTT +=

若 1satE = 2satE = satE 且3

22RR

VV TLTH =minus satE

3

2114

RR

CRT=

若R3 = nR2

則nCR

T 114=

114 CR

nf = 〈312〉

《實驗結果》

必須注意的是三角波的頻率太低將導致馬達的轉動產生脈動現象

故將工作頻率設計在1kHz以上

Ω= k1501R Ω= k102R

Ω= k203R pFC 22001 =

所得到的三角波頻率為

15kHz10220010001504

00010100020

f 12- =timestimestimestimes

timestimes

=

圖 34 三角波輸出波形

22

〈2〉 脈寬調變電路〈PWM〉

+12V

-12V

10k

+12V

-12V -

+ PWM輸出LM324三角波輸入

圖 35 脈寬調變電路

PWM系統往往連接至直流電源供應放大器的工作是以固定的頻率開

閉直流供應電壓其激發角是可以調整的因此得到波寬可調的輸出

將固定頻率的三角波與反向輸入的電壓做比較便可輸出一脈寬〈見圖

36〉反向電阻值的不同將導致反向輸入電壓不同故其輸出為一可調但

頻率固定的脈寬也正因為如此故稱為脈寬調變〈PWM〉由於輸出的

dutycycle不同故馬達將接收到不同的平均電壓因而可以藉由PWM控制

馬達的轉速

反相輸入電壓

PWM

圖 36 三角波與反相輸入電壓比較

23

PWM的優點在於馬達驅動電路的電晶體之控制信號改以脈波列來控

制使電晶體操作成類似開關的動作不是完全導通就是完全截止故電晶

體不是一直操作於作用區所以其功率消耗不大整體效率較高

《實驗結果》

圖 37 PWM 輸出波形

322 橋型驅動功率放大電路

如圖38所示主要由四個功率電晶體組成利用不同的電晶體對使直流

馬達做正逆轉控制當Q5Q8導通使馬達正轉當Q6Q7導通馬達則逆

轉電路中的電晶體扮演開關的作用

此種電路簡單只要一組直流電源供應且電晶體分擔了部份的電壓保護

電晶體迅速工作於截止與飽和狀態之間故沒有功率散逸損失之虞

但是在設計時切勿使Q5Q6同時導通以免燒毀電路上之元件因為在

AB兩脈波短暫的交變時間內由於電晶體本身之最小延遲時間有可能使Q5

Q6同時ON與Q7Q8在很短時間同時ON因此在15kHz交變下容易燒毀功

率電晶體

因此設計一間距脈波電路主要之功用使Q5Q6和Q7Q8均不同時導通

24

以拉長AB兩者交換時間

M

20k

10k

20k

10k

+24V

A 信號 B 信號

2N3055 2N3055

2N2955 2N2955

1N40021N4002

C1815 C1815

C1815 C1815

Q5

Q8Q6

Q7

圖 38 橋型驅動功率放大電路

圖 39 橋型驅動功率放大電路實體圖

25

此外若考慮電晶體BE間的電壓則電路會出現約 plusmn 06V的不感帶〈ded

band〉即電晶體的 oV 對 inV 間的關係如圖3101假使 inV 電壓為正弦波則 oV 變

成如圖3102為了改善這種缺失吾人利用兩個二極體接在電路上如圖38

用來補償電晶體BE間的壓降﹝10﹞

約06V

Dead band

Vo

Vin

圖 3101 呈現不感帶的轉移函數

圖 3102 輸出電壓波形

26

323 間距脈波產生電路

RCext15

Cext14 74123

A3

B2

Q13

CLR1

Q4

7486100k

2200pF

10k

10000pF

+5V

間距脈波輸出

圖 311 間距脈波產生電路

間距脈波的產生方式是根據脈寬調變〈PWM〉後的訊號再經由積分電路的

電阻兩端取出且經由兩倍頻器〈74LS86〉檢示出PWM的正負緣脈波最後

再利用單穩態IC〈74LS123〉將檢出信號之脈寬拉長至01ms此即為間距脈波

74LS123有兩個輸入端子A及B分別為下降波緣輸入端子及上升波緣輸入端

子當輸入A之脈波由ldquoH變成ldquoL之瞬間Q輸出變為ldquoH其持續時間長

短由RC時間常數決定反之當輸入B之脈波由ldquoL變成ldquoH之瞬間Q輸出

變成ldquoH維持一定時間

74LS123的輸出脈波之寬度是由電阻及電容之時間常數所決定概略計算公

式如下

CR045T timestimes=

電容 C 必須大於 1000pF

27

《實驗結果》

R=24kΩ C=10000pF

所以得到間距脈波為

( )msec0110810000p24k045T cong=timestimes= μ

圖 312 間距脈波

研究經分析後發現

1 間距 T 愈大愈能確保電路之安全性愈有保護作用

2 間距 T 愈大相對的使驅動信號脈波減少愈多造成馬達旋轉扭力大

大減弱

3 適當的間距 T不但不會影響馬達的輸出轉矩而且兼具保護電路的

效果

33 編碼器

轉動編碼器不只可以作為轉速的感測也能做位置的感測又適合於數位處

理故被廣泛使用若就信號來看轉動編碼器可分為增量型與絕對型若以檢

測的方式來分可分為光學式和磁式兩種在本專題中所使用的編碼器為光學式

增量型編碼器﹝11﹞

光學式轉動編碼器的原理如圖 313在附有細縫轉盤的兩側分別裝置發光元

28

件與受光元件如果只有一組光電檢測元件則輸出信號就只有一相的脈波信

號此種裝置稱為脈波產生器圖 314 為增量型轉碼器的輸出信號它是利用

兩組光電元件所產生的脈波信號A 相和 B 相間有相位差正轉時 A 相領前 B

相逆轉時 B 相領前 A 相因此利用此兩相做檢測馬達為正轉或逆轉的工作

並利用 A 相或 B 相的頻率檢測出目前的轉速

吾人計算出編碼器每一轉可以產生約 200 個脈波故檢測 A 相或 B 相其頻

率為 N則轉速應為 60200

timesN

〈rpm〉

圖 313 光學式轉動編碼器的原理圖

圖 314 編碼器的輸出信號波形

29

34 LM2917 FV 電路設計

對 LM2907 而言磁滯比較器和電流汞是構成頻率對電壓轉換的基本架構

並且預留一個運算放大器及一個電晶體供各種不同的使用圖 315 為吾人所設

計的 FV 電路圖中 C1 用以抑制電流汞動作時所產生的漣波變化正常使用時

此電容應大於 10C若 C1 太大也將造成轉換速度下降

因為單晶片 8051 之輸入電壓最高為 5V故必須設計其馬達最高轉速頻率所

轉成的電壓必須在 5V 以內由於馬達轉速頻率範圍極大故吾人給予 LM2917

+12V 的電壓以擴大它可以轉換的電壓範圍並將所需維持在 5V 內

a1

14

b1

1

a1

13

b1

2

a1

12

b1

3

a1

11

b1

4

1

a1

10

b1

5

a1

8

b1

7

a1

9

b1

6

L2917

Encoder輸 入

1uF

+12V

FV輸出1000pF

45k 10kC1

C2

圖 315 FV 電路

30

《實驗結果》

根據統計結果每 50mV 相對於 100Hz如此一來吾人想得知馬達目前

的轉速只要將單晶片所接收到的電壓值經過換算即可得知目前 encoder 所量測

的頻率吾人知道 encoder 一圈可產生 200 個脈波故馬達的轉速便可經過下列

公式換算得知

轉速〈rpm〉 60200

times=f

其中 =f encoder 所量測到的頻率

表 31 頻率與轉換電壓之關係

頻率

(Hz) 1 2 3 4 5 6 7 8 9

電壓(V) 0006 0006 0007 0008 0009 0009 0009 0009 001

頻率

(Hz) 10 20 30 40 50 60 70 80 90

電壓(V) 008 009 010 010 011 011 012 012 013

頻率

(Hz) 100 200 300 400 500 600 700 800 900

電壓(V) 013 018 023 028 033 038 043 049 054

頻率

(Hz) 1000 2000 3000 4000 5000 6000 7000 8000 9000

電壓(V) 059 109 16 209 257 304 3508 4006 45

31

圖 316 頻率對電壓曲線

35 單晶片介面電路

單晶片介面包括了二大部分分別為單晶片 8051AD converter

〈1〉8051 單晶片

為本控制系統的核心一切動作皆經由它控制

〈2〉AD converter

將類比開關所送出來的類比訊號經由 ADC 0804 轉換成數位訊號傳送

到單晶片的輸入埠

351 AD 轉換

以單晶片 8051 控制 ADC0804則單晶片 8051 必須下達ldquo開始轉換rdquo的命令

給 ADC0804然後 ADC0804 就開始讀入類比輸入端的電壓在內部開始轉換

經過一段轉換時間後〈約 100μ s〉ADC0804 就將轉換完成的值放在其內部的三

態輸出栓鎖緩衝器裡然後將轉換完成輸出腳〈INTR〉降為 low以通知單晶片

可以去讀轉換完成資料

當WR和CS 同時為ldquo0rdquo時表示對 ADC0804 下達ldquo開始轉換rdquo命令再經過

32

一段轉換時間〈100μ s〉後轉換完成ADC0804 會將其轉換完成的數位資料放

在其內部 8 位元緩衝區裡且將 INTR 降為ldquo0rdquo因此單晶片只要下達ldquo開始轉換rdquo

命令後去檢查 INTR 的狀態就可以知道是否轉換完畢其方法有兩種

1 輪詢法〈polling〉

2 中斷法〈interrupt〉

所謂輪詢法就是將 ADC0804 的 INTR接到 CPU 的一條 IO 線上然後以軟體指

令主動偵測其狀態當偵測到為ldquo0rdquo時就可以去讀出 ADC0804 裡的緩衝區的轉

換值

中斷法是一個很理想的 IO 方式因為不像輪詢法必須讓 CPU 等 ADC0804

轉換當 CPU 下達ldquo開始轉換rdquo命令後就可以做其他工作當 ADC0804 轉換完

畢後 INTR會降為ldquo0rdquo可以利用此信號去中斷 CPU再由中斷副程式去讀入

轉換值即可因此大大提高了程式的效率

當 CPU 接收到 ADC0804 發出ldquo轉換完畢rdquo的信號〈 INTR =0〉後就可以去

讀出轉換值其讀出的方法是將CS 與RD設為ldquo0rdquo即可讀到轉換值這個讀值的

動作又會使得 INTR恢復成ldquo1rdquo

1 CPU 下達ldquo開始轉換rdquo命令〈CS =0WR =0〉

2 ADC0804ldquo轉換完畢rdquo 〈 INTR =0〉

3 CPU 讀取轉換值〈 RD =0CS =0〉

4 讀完後 INTR =1

ADC0804 主要規格摘要如下

1 +5V 單電源工作電壓

2 類比電壓輸入範圍 0~+5V

33

3 參考電壓為 25V

4 轉換時間為 100μ s〈 CLKf =640kHz〉

5 解析度為 8 位元

6 誤差plusmn 1LSB

7 讀取時間 135ns

36 電源供應系統

本專題中所有電路及硬體設備所需的電源採用交流電源 110V 經由 PT-31

變壓器後再經過橋式整流後提供了直流電源而因為各個電路所需電源不同

因此製作了多組的變壓電路如下

1電壓源 DC5V選擇了 7805 的穩壓 IC 搭配電容得到了+5V 的電壓源

供〈1〉8051 微處理器 〈2〉ADC 0804 〈3〉74LS8674LS12374LS04

74LS02CD4013 〈4〉馬達 Encoder

2電壓源 DC12V使用 7812 穩壓 IC 搭配電容得到+12V 的電壓源供

LM2917 使用

3電壓源 DC24V利用 7824 的穩壓 IC 搭配電容獲得+24V 的直流電壓

源供電路之橋型驅動功率放大之電晶體使用

Vin1

+12V2

GND3

LM7812

2200uF 10000pF 2200uF 10000pF

+12V outputAC

圖 317 直流電源電路

34

圖 318 直流電源電路實體圖

37 馬達轉速的量測

表 33 PWM 輸出對應 encoder 週期

PWM dutycycle encoder 週期 PWM dutycycle encoder 週期

40 sμ 172 sμ 440 sμ 0 sμ

80 sμ 188 sμ 480 sμ 0 sμ

120 sμ 204 sμ 520 sμ 0 sμ

160 sμ 230 sμ 560 sμ 0 sμ

200 sμ 272 sμ 600 sμ 0 sμ

240 sμ 328 sμ 640 sμ 0 sμ

280 sμ 416 sμ 680 sμ 1320 sμ

320 sμ 540 sμ 720 sμ 750 sμ

360 sμ 800 sμ 760 sμ 510 sμ

400 sμ 1320 sμ 800 sμ 400 sμ

35

圖 319 PWM 輸出對應 encoder 週期

由統計可知道此馬達並不是一顆線性馬達故相信若使用模糊控制理論來

作為其回授控制系統的控制器一定能達到比傳統控制器的性能還要好而且若能

在模糊控制裡加上 PID 控制器的觀念一定能在系統的響應時間上升時間

安定時間和超越量達到最佳的控制另一方面馬達在其反方向的內阻較大需

要更大的力量才能使馬達驅動

36

第四章 軟體規劃與製作

41 PWM 之軟體設計

因為之前所介紹的硬體方式是以調整可變電阻來達到轉速的調整因此無法

得知所給予的脈寬長度和轉速大小尤其在回授時也不易給予適當的訊號來調整

轉速因此改良之方法就是以8051之軟體撰寫方式來產生固定的脈寬也就等

於給予轉速的命令而在其回授控制時也只要在內部程式给予適當的指令便可

達到脈寬長度的調整以達到閉迴路之受控系統

411 PWM 軟體流程

設定Timer0模式為0

TH0 = temp 32 TL0 = temp 32

temp = 8192 ndash j4 Key = 0

檢查是否有鍵值

將鍵值存入Key

Yes

No

設定Key值所對應的 j值

If P30 == 1Then P30 = 0 temp = 8192 ndash j4Else P30 = 1 temp=8192ndash880+j4

TH0 = temp 32 TL0 = temp 32

Start Timer0中斷副程式

啟動Timer0

等待Timer0中斷

返回主程式

圖 41 PWM 軟體設計流程圖

37

在此總共設計了五個按鈕分別代表不同的轉速停止正轉〈慢〉正轉

〈快〉逆轉〈慢〉和逆轉〈快〉使用Timer0是因為8051之計時中斷比延遲程

式來的準確故可以達到準確的計時程式設計理念中並沒有將中斷致能清除

因此Timer0會一直處於計時的狀態程式執行時將一邊檢查鍵值〈KeyStatus〉一

邊進行計時當計時完畢便呼叫中斷副程式然後執行改變Port 30的輸出狀

態若是為high則變為low反之若是為low即變為high同時並重設計時時間

Timer0繼續計時

當鍵值改變時計時的時間也會跟著改變如此一來Timer0將ㄧ直重覆上

述動作直到電源切掉Timer0才會停止計時

42 模糊控制之程式規劃與撰寫

本專題目標在完成了先前所規劃的硬體電路之後接著就是要達成利用模糊

控制理論來設計控制器在此採用了單晶片8051目的是為了以硬體實現方式來

代替電腦模擬期望能夠按照原訂計畫完成本專題「具模糊控制理論與雙脈寬調

變法之直流馬達驅動電路設計」

單晶片 8051 模糊控制的程式撰寫採下列幾個步驟依序完成

1 設定變數轉速誤差〈dspeed〉目前轉速〈sspeed〉

2 模糊化採用三角形歸屬函數採用三角形歸屬函數的原因

〈1〉 三角形函數為一連續函數

〈2〉 三角形函數為線性的函數所以計算速度較快

〈3〉 是具有發散也有收斂的函數和指數函數一樣接近

事實

3 模糊推論模糊規則將其所有可能發生情況以 IFhellipTHENhellip表示

並建立控制規則表

4 解模糊化採用重心法

38

421 歸屬函數

設定變數為目前轉速〈sspeed〉與轉速誤差〈dspeed〉因此此模糊控制器共

有兩個輸入訊號與一輸出訊號輸出訊號為脈寬長度該加或是減多少又因為有

五種不同的轉速因此各分別設計了不同的歸屬函數如下

1 當轉速 = 0

ml h

s s p e e d

d s p e e d

r p m0 5 0 1 0 0- 5 0- 1 0 0

mv l l h v h

r p m0- 3 0- 6 0- 1 0 0 3 0 6 0 1 0 0 圖 42 停止時之歸屬函數

2 正轉〈慢〉

ml hsspeed

dspeed

rpm150 225 300750

mvl l h vh

rpm150100500 200 250 300

圖 43 正轉〈慢〉之歸屬函數

39

3 正轉〈快〉

ml hsspeed

dspeed

rpm520 670 820370220

mvl l h vh

rpm500400300200 600 700 800

圖 44 正轉〈快〉之歸屬函數

4 逆轉〈慢〉

ml hsspeed

dspeed

rpm100 250 400500

mvl l h vh

rpm10050250 200 300 400 圖 45 逆轉〈慢〉之歸屬函數

40

5 逆轉〈快〉

ml hsspeed

dspeed

rpm300 450 600150

mvl l h vh

rpm450350250150 550 650 750

750

圖 46 逆轉〈快〉之歸屬函數

6 輸出

OutputMVL L H VH

rpm0-50-150-250 50 150 250

圖 47 輸出之歸屬函數

41

422 模糊規則庫

表 41 為吾人所設計的模糊控制規則庫並利用 Matlab 之 Fuzzy ToolBox 來

建立此規則庫以進行模擬推論圖 48 為當馬達輸入指令為正轉慢時推論後所得

到的三維空間圖

表 41 模糊控制規則表

Dspeed

vl l m h vh

l H M L VL VL

m VH H M L VL sspeed

h VH VH H M L

圖 48 推論後的三維空間圖

42

423 模糊控制器之軟體設計流程

Start 外部中斷副程式

ADCWR = 0 ADCWR = 1

〈令AD開始轉換〉

檢查鍵值以得到對應的歸屬函數

取得目前轉速與

轉速誤差

Fuzzy Rules決策

得到輸出訊號

Delay 10ms

ADC = 0 讀取AD值 ADCRD = 0

將AD值換算成轉速

ADCWR = 0 ADCWR = 1

〈AD開始轉換〉

返回主程式

致能外部中斷

圖 49 Fuzzy Controller 程式流程圖

當控制器一開始動作時便先執行AD轉換的工作當AD轉換完成時其

INTR的接腳便會觸發8051的外部中斷INTR0於是程式便發生外部中斷執行

外部中斷副程式的指令

43

在外部中斷副程式中AD將ㄧ直進行轉換與讀取的工作同時並將轉換後

的值直接換算成目前轉速與轉速誤差以供模糊控制器使用換算目前encoder

的頻率其公式為

160-V2000 times=頻率 〈4-1〉

式4-1之公式是根據表31所導出來的其中V為encoder之頻率轉成電壓之值

又假設所讀取的AD轉換值為value因為

AD的解析度 = bit256

5V+ = 511 ( Vbit ) 〈4-2〉

故value值與電壓V之關係為

511 value V times= 〈4-3〉

所以encoder之頻率與value值的關係為

頻率= 2000times ⎟⎠⎞

⎜⎝⎛ times

511 value - 160 〈4-4〉

故目前轉速為

sspeed = ( )rpm 60 200

times頻率 〈4-5〉

另ㄧ方面在主程式中程式會先去檢查鍵值也就等於檢查輸入指令以

找出符合使用的歸屬函數並將AD所獲得的轉速對應到歸屬函數中然後執行

決策判斷即進入規則庫中尋找出適當的決策判斷最後將此決策送入PWM程

式裡進行脈寬長度的調整使馬達在合理的要求下達到理想的轉速控制不會

因為外在環境的影響而使馬達轉速受到干擾

43 LCD 顯示轉速

此專題最後再增加一LCD顯示幕以顯示目前的轉速否則在程式設計完成

後人卻因無法以肉眼得知目前轉速而不能肯定馬達轉速是否有達到控制的目

標因此增加一顯示幕LCD是有必要的不僅隨時得知目前的轉速還能知道

44

設計出來的軟體其控制性是否夠好夠穩定

431 LCD 顯示幕之軟體流程

Start

設定LCD模組的初始狀態

設定外部中斷INTR0

與Timer0

設定TH0 = (65536 ndash 5000) 256 TL0 = (65536 ndash 5000)256

令ADCWR = 0 ADCWR = 1 AD開始轉換

等待中斷

外部中斷副程式

ADCRD = 0 讀取AD值 ADCRD = 1

將AD值換算成速度

ADCWR = 0 ADCWR = 1 AD開始轉換

Timer0中斷副程式

顯示LCD第一行

ldquoMotor Speed =

顯示LCD第二行ldquoxxxxxxx rpm其中 xxxxxx為外部中斷副程式所換算出的轉速

重設TH0與TL0

返回主程式返回主程式

圖 410 LCD 顯示幕之程式流程圖

此程式主要由兩個部分完成一為外部中斷副程式另ㄧ為 Timer0 中斷副

程式當主程式完成外部與 Timer0 兩個中斷的設定後隨即命令 AD 開始轉換

之後便一直停在 while〈1〉的迴圈裡不做任何動作而由兩個中斷副程式來完

成整個轉換與顯示的工作

45

外部中斷副程式主要負責 AD 的轉換讀取與轉速換算的工作AD 第一

次的轉換由主程式來下達命令當轉換完成後AD 的 INTR 接腳將觸發外部中

斷〈INTR0〉副程式此時程式便進入外部中斷副程式執行讀取 AD 值與轉速

換算的工作當這些工作完成時外部中斷副程式再次下達 AD 開始轉換的命

令而離開中斷副程式當 AD 再次轉換完成時又將再次執行中斷副程式

如此週而復始中斷副程式將ㄧ直進行讀取換算與轉換的工作

而 Timer0 中斷副程式主要負責 LCD 顯示之工作當主程式所設定的計時時

間計數完時程式便進入 Timer0 中斷副程式一旦進入 Timer0 中斷副程式程

式將執行 LCD 的顯示然後再重設 Timer0 的計數時間Timer0 將重新計數當

計數完時程式又將再度進入 Timer0 中斷副程式執行因為程式中並無清除

Timer0 的中斷致能故 Timer0 中斷副程式和外部中斷副程式ㄧ樣週而復始的

執行其副程式的工作

46

第五章 結論

本計劃主旨為具模糊控制理論與雙脈寬調變法之直流馬達驅動電路設計主

要是針對傳統電路設計之缺點提出改良之方法以TPWM取代PWM電路以模

糊理論基礎設計之控制器替代傳統PID控制器

TPWM轉速控制優於PWM之處在於

1 TPWM只需使用單電源即可達到正轉和逆轉的轉速控制而PWM必須

加上逆向開關或是雙電源才能使馬達產生正轉和逆轉

2 TPWM可控制馬達處於停止狀態無論在正向或逆向加上負載皆無法使

馬達產生轉動

3 馬達消耗定額功率輸出轉矩為額定值

4 馬達由停止到某定轉速時反應時間較快

模糊控制器優於PID控制器

1 不須導出繁雜的數學模型

2 適用於非線性系統

3 強健性與容錯性較高

本專題至此雖說大致的目標都已達到但是此系統仍然有許多不完美而需要

改進的地方例如在實驗過程中發現整個轉速的控制在回授上其反應時間

有點慢探討其原因有可能是控制器之程式上的問題

1 因為使用C語言撰寫程式故其執行速度較慢

2 程式可能寫的太累贅

3 模糊控制規則庫建立不良

若想改善這些問題可以嘗試著將C語言改為組合語言來撰寫並盡量減少

47

不必要的指令相信此動作一定能大大提昇程式的執行速度其次就是多做測

試利用測試中所學到的經驗來幫助模糊控制規則庫的改寫同時也能從測試中

發現更多的問題若是都能對問題加以一一解決的話相信必定能將此控制系統

做的更盡善盡美

48

參考文獻

﹝1﹞ 李適中直流馬達速度控制伺服控制〈基礎篇〉全華科技圖書股份有

限公司民 74

﹝2﹞ 廖錦文ldquo直流電動機之雙脈寬調變是〈TPWM〉驅動電路研究電

子技術月刊第 69 期pp94-1021992

﹝3﹞ 楊英魁孫宗瀛鄭魁香林建德蔣旭堂模糊控制理論與技術全華

科技圖書股份有限公司民 85

﹝4﹞ 林敦煌陳憬德直流馬達定位及轉速的模糊控制逢甲大學自動控制工

程學系學士論文民 87

﹝5﹞ LAZadehldquo Fuzzy Sets Information and Control Vol8 pp338-353

1965

﹝6﹞ EHMamdani and SAsslianldquo A fuzzy logic controller for a dynamic

plant Internation Journal of Man-Machine Studies Vol7 pp1-13 1975

﹝7﹞ 孫宗瀛楊英魁Fuzzy 控制理論實作與應用全華科技圖書股份有

限公司民 83 年

﹝8﹞ 許中平黃煌嘉直流電動機控制電路設計全華科技圖書股份有限公司

民 75

﹝9﹞ 盧明智黃敏祥OP Amp 應用+實驗模擬全華科技圖書股份有限公司

民 83

﹝10﹞陳文耀電動機控制工程復文書局2003

﹝11﹞許中平林全福電動機運轉控制技術全華科技圖書股份有限公司民

77

﹝12﹞楊明豐8051 單晶片 C 語言設計實務碁峯資訊2003 年

﹝13﹞蔡朝洋單晶片微電腦 80518951 原理與應用全華科技圖書股份有限公

司民 91

49

﹝14﹞王文俊認識 Fuzzy全華科技圖書股份有限公司民 90

50

附錄 A 專題硬體展示圖

圖 A-1 硬體整體圖

圖 A-2 硬體整體鳥瞰圖

51

圖 A-3 硬體側視圖

圖 A-4 操作與顯示面板

圖 A-5 間距脈波電路與 FV 電路

52

圖 A-6 橋型驅動功率放大電路

圖 A-7 操作與控制面板

53

附錄 B PWM 與模糊控制之程式

include reg51h include stdioh sbit ADCRD = P3^1 設定 RD 控制線接腳為 P31 sbit ADCWR = P3^3 設定 WR 控制線接腳為 P33 sbit P2_0 = 0xA0 接腳定義 sbit P2_1 = 0xA1 接腳定義 sbit P3_0 = 0xB0 接腳定義 sbit P3_1 = 0xB1 接腳定義 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P3_6 = 0xB6 接腳定義 void KeyStatus(void) 函數原型宣告 void feedback(void) 函數原型宣告 void compute_grade(void) 函數原型宣告 void delay1ms(int count) 函數原型宣告 void convert() 函數原型宣告 void condition() 函數原型宣告 void CW(void) 函數原型宣告 int j i 對應 PWM 的寬度 unsigned int temp 所設計的計時器時間 int sample = 1000 取樣率設定消除顯示值跳動 long int value r1 讀取 ADC0804 數位資料 long int set n condition select long int r grade_reg[2] grade[15] error1 error2 long int a1 b1 I long int membership[5][3]membership1[3][3] 定義歸屬函數 long int membership2[3][3] = -10-50-5050510 long int error[2] int Rule[15][3] = 113213313 定義判斷規則庫 212223323 311232333 411241342 511251351

54

main() 主程式 j = PWM = 110 設定 PWM 初始值 IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x00 設定計時器 0 工作於模式 0 temp=8192-j4 設定計時器 0 初值 TH0 = temp 32 TL0 = temp 32 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 P3_4 = 1 P3_5 = 0 P3_6 = 0 ADCWR = 0 令 ADC0804 的 WR = 0 ADCWR = 1 令 ADC0804 的 WR = 1 while (1) KeyStatus() 檢查鍵值 void KeyStatus(void) 檢查鍵值並給對應的 PWM 值 char KeyScan(void) 按鍵掃描函數宣告 unsigned char KeyStatus unsigned char Key = 0 KeyStatus=KeyScan() 呼叫按鍵掃描函數 if (KeyStatus = 0) 已有按鍵輸入 Key = KeyStatus Key = 鍵值 if (Key == 0x01) 假如輸入為按鍵 1 i = 110 PWM 為 110us j = i P3_4 = 1 LED 亮第一顆〈表馬達停止〉 P3_5 = 0 P3_6 = 0

55

else if (Key == 0x02 ) 假如輸入為按鍵 2 i = 140 PWM 為 140us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x04 ) 假如輸入為按鍵 3 i = 180 PWM 為 180us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x08 ) 假如輸入為按鍵 4 i = 80 PWM 為 80us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 else if (Key == 0x10 ) 假如輸入為按鍵 5 i = 40 PWM 為 40us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 PWM = j delay1ms(10) 呼叫延遲函數 feedback() 模糊控制判斷

56

void To_int(void) interrupt 1 Timer0 中斷函數 if (P3_0 == 0) 假如 PWM 輸出為 Low P3_0 = 1 變更 PWM 輸出為 High temp=8192-j4 設定 High 的時間 else 若 PWM 輸出為 High P3_0 = 0 變更 PWM 輸出為 Low temp=8192-880+j4 設定 Low 的時間 TH0 = temp 32 Timer0 的計時時間 TL0 = temp 32 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 char KeyScan(void) 檢查鍵值 char KeyStatus 按鍵狀態 P0=0xff 設定 P0 為輸入模式 KeyStatus=~P0 讀取按鍵狀態 return(KeyStatus) 將鍵值送回程式 void feedback(void) 模糊判斷 void Fuzzycontroller() 函數原型宣告 void condition1() 函數原型宣告

57

void condition2() 函數原型宣告 error1 = ((value)40-160)03 輸入變數 1 delay10ms(10) 延遲 10ms error2 = ((value)40-160)03 輸入變數 2 if (key == 0x01 ) 當按鍵 1找出對應的歸屬函數 並做出模糊控制判斷

int membership[5][3]= -100-60-30-60-300-30030030603060100

int membership1[3][3]=-100-500-50050050100 Fuzzycontroller() condition() if (key == 0x02 ) 當按鍵 2找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

05010050100150100150200150200250200250300 int membership1[3][3]=07515075150225150225300 Fuzzycontroller() condition() else if (key == 0x04) 當按鍵 3找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

200320400300400500400500600500600700600700800 int membership1[3][3]=220370520370520670520670820 Fuzzycontroller() condition() else if (key == 0x08) 當按鍵 4找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

02550255010050100200100200300200300400 int membership1[3][3]=05010050100250100250400 Fuzzycontroller() condition()

58

else if (key == 0x10) 當按鍵 5找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

150250350250350450350450550450550650550650750 int membership1[3][3]=150300450300450600450600750 Fuzzycontroller() condition2() void Fuzzycontroller() 模糊控制判斷 void compute_grade() 函數原型宣告 void compute_grade1() 函數原型宣告 a1 = 0 b1 = 001 I = 0 for (n=0 nlt=14 n++) r = error1 set = Rule[n][0]-1 compute_grade() 計算輸入變數 1 與

模糊程度的歸屬函數 condition = 1 r = error2 set = Rule[n][1]-1 compute_grade1() 計算輸入變數 2 與 模糊程度的歸屬函數 grade[n] = MIN(grade_reg[0] grade_reg[1]) a1 = a1 + (grade[n]membership2[Rule[n][2]-1][1]) b1 = b1 + grade[n] I = a1 b1 得到模糊控制判斷的結果 void compute_grade() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership[set][0]) || (r gt membership[set][2])) 當輸入變數不在 歸屬函數內

59

grade_reg[condition] = 0 else if ((r gt membership[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership[set][2]-r) (membership[set][2] - membership[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership[set][0]) (membership[set][1] - membership[set][0]) void compute_grade1() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership1[set][0]) || (r gt membership1[set][2])) 當輸入變數不在 歸屬函數內 grade_reg[condition] = 0 else if ((r gt membership1[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership1[set][2]-r) (membership1[set][2]-membership1[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership1[set][0]) (membership1[set][1]-membership1[set][0])

60

void condition() P2_0 = 1 設定 P20 為輸入模式 P2_1 = 1 設定 P21 為輸入模式 if ( (P2_0 == 1) ampamp (P2_1 == 0)) 當馬達為正轉時 if ( I gt 0 ) 若模糊判斷結果為正 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 若模糊判斷結果為零 PWM = PWM + 0 PWM 寬度不變 if ( I lt 0 ) 若模糊控制結果小於零 PWM = PWM + 1 PWM 寬度加 1 else if ( (P2_0 == 0) ampamp (P2_1 == 1) ) 若馬達為反轉 if ( I lt 0 ) 模糊控制小於零 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 模糊控制等於零 PWM = PWM + 0 PWM 寬度不變 if ( I gt 0 ) 模糊控制大於零 PWM = PWM + 1 PWM 寬度加 1 CW() 判斷 PWM 寬度上下限

61

void CW() 判斷 PWM 寬度上下限 if ( PWM gt= 215 ) 若 PWM 寬度 gt= 最大寬度 j = 215 PWM 寬度維持於 215us if ( PWM lt= 5 ) 若 PWM 寬度 lt= 最小寬度 j = 5 PWM 寬度維持在 5us if ( PWM gt 5 ampamp PWM lt 215 ) PWM 寬度介於最大與最小間 j = PWM PWM 依模糊控制判斷結果增減 void delay1ms(int count) 延遲 1ms int x y for ( x = 0 x lt count x++ ) for ( y = 0 y lt 122 y++ ) void convert() 數位資料換算成馬達轉速 r1 = ((value)40)-160

62

附錄 C LCD 顯示之程式

includereg51h 含 8051 所有暫存器宣告 include mathh define RS P3_5 LCD 指令資料選擇控制 define RW P3_4 LCD 讀寫控制腳 define Enable P3_3 LCD 致能接腳 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P0_0 = 0x80 接腳定義 sbit P0_1 = 0x81 接腳定義 sbit P0_2 = 0x82 接腳定義 sbit P0_3 = 0x83 接腳定義 sbit P0_4 = 0x84 接腳定義 sbit P0_5 = 0x85 接腳定義 sbit P0_6 = 0x86 接腳定義 sbit ADCRD = P3^7 設定 RD 控制線接腳為 P37 sbit ADCWR = P3^6 設定 WR 控制線接腳為 P36 void delay(void) 函數原型宣告 void delay10ms(int count) 函數原型宣告 void display(void) 函數原型宣告 void InitialLCD(void) 函數原型宣告 void WriteIns(char) 函數原型宣告 void WriteData(char) 函數原型宣告 void WriteString(charchar) 函數原型宣告 void CheckBusy(void) 函數原型宣告 void convert(void) 函數原型宣告 char MSG0[] = Motor Speed = 定義字串 MSG0 char MSG2[] = rpm 定義字串 MSG2 unsigned char MSG1[8]=0000000 定義字串 MSG1 unsigned long int value 讀取 ADC0804 數位資料 int sample = 1000 取樣率設定消除顯示值跳動 long int rpm

63

main() 主程式 InitialLCD() 初始化 LCD IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x01 設定計時器 0 工作於模式 1 TH0 = (65536-5000)256 設定計時器 0 初值 TL0 = (65536-5000)256 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 while(1) 等待中斷 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 while (--sample == 0) 取樣率減 1 sample = 1000 重設取樣率 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 void T0_int(void) interrupt 1 LCD 顯示動態掃描 display() 動態掃描顯示 TH0 = (65536-65535)256 重設計時初值 TL0 = (65536-65535)256

64

void InitialLCD(void) 設定 LCD 模組初始狀態 delay() 延遲函數 WriteIns(0x38) 設定 LCD 模組為 WriteIns(0x38) 2 行顯示 WriteIns(0x38) 8 位元介面 WriteIns(0x38) 5x7 點字型 WriteIns(0x08) 關閉顯示器 WriteIns(0x01) 清除 LCD 螢幕 WriteIns(0x0c) 令顯示器 ON但游標不顯示 WriteIns(0x06) 令 LCD 模組每接收到 1Byte 資料 AC 值自動加 1 void display() 掃描顯示 WriteIns(0x80) 設定 LCD 座標 WriteString(13MSG0) 將字串 MSG0 寫入 LCD 中 WriteIns(0xc0) 設定 LCD 座標 WriteString(8MSG1) 將字串 MSG1 寫入 LCD 中 WriteIns(0xc8) 設定 LCD 座標 WriteString(4MSG2) 將字串 MSG2 寫入 LCD 中 void convert(void) 換算轉速 long int freq freq = ((value)4000) - 16000 數位資料換成頻率公式 rpm = freq3 頻率換算轉速公式 MSG1[0] = (rpm1000000)+0x30 將結果存入字串 MSG1 中 MSG1[1] = ((rpm1000000)100000)+0x30 MSG1[2] = ((rpm100000)10000)+0x30 MSG1[3] = ((rpm10000)1000)+0x30 MSG1[4] = 0x2e MSG1[5] = ((rpm1000)100)+0x30 MSG1[6] = ((rpm100)10)+0x30 MSG1[7] = rpm10+0x30

65

void WriteIns(char instruction) 寫命令至 LCD 中 RS = 0 選擇指令暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = instruction 輸出命令至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteData(char i) 寫資料至 LCD 中 RS = 1 選擇資料暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = i 輸出資料至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteString(countMSG) 寫字串至 LCD 中 char count 字串長度 char MSG[] 字串資料 char i 定義位元組變數 for(i=0 iltcount i++) count 個位元組 WriteData(MSG[i]) 寫入一位元組的資料至 LCD 中 void CheckBusy(void) char i=0x80 檢查忙碌旗標 while(iamp0x80) 忙錄旗標 BF = 1 RS = 0 選擇指令暫存器 RW = 1 讀取 Enable = 1 致能 LCD i = P2 讀取 LCD 指令暫存器內的資料

66

Enable = 0 除能 LCD delay() 延遲函數 void delay() 延遲 5ms int i for(i=0 ilt250 i++)

  • 畢業專題封面pdf
  • File0004pdf
  • 最終版pdfpdf
Page 2: Based on Fuzzy Control Theorem and TPWM Method for DC ... · 使吾人想設計一模糊控制器來做為馬達轉速的閉迴路控制,以解決非線性系統的 問題。除此之外,flcs

I

誌 謝

專題研究計畫的完成需要來自各方的支持並非一個人所能獨力完成在

透過老師的建議與指導以及同學的幫忙協助下本專題才得以完成首先感謝

學生的指導老師洪三山老師引領入門除了知識的傳授更教了不少做人處事的

方法在老師的指導風格下從不設限學生的研究範圍或給予壓力讓學生得以

發揮所長激發創意並訓練出獨立思考與解決問題的能力老師悉心教導的用

心與苦心師恩浩蕩學生必點滴銘記在心同時還要感謝陳杏圓老師在研究

的過程中觸發了學生的一些靈感讓本專題內容更加完善

此外感謝阿亮學長詳細教授馬達與模糊控制相關的各種知識也要感謝同

儕冠亨清宏永祥嘉麒禹廷書綺耿綸柏宇同學們感謝你們在製作

專題時給予適時的幫助在學生這段求學路途上協助與生活陪伴你們的友情讓

學生詠懷在心

學生僅將這幾年來獲得的所有榮譽與成果歸功於學生最親愛的家人與同

學陪學生一路成長給學生不間斷的支持與鼓勵在此學生向所有親人師長及

所有同學致上最誠摯的謝意

II

中文摘要

雙脈波寬度調變式〈Two Pulse Width Modulation〉驅動電路為數位邏輯電

路在實用上可開發成積體電路模組〈module〉縮小佔用空間維修替換簡便

結合微電腦控制其應用發展領域更顯寬廣主要特色不論電動機是正反轉

或速度快慢亦或停止均消耗定額功率因此輸出轉矩保持在額定值系

統於寬廣的速度變換範圍內仍具有良好的伺服性能電機的旋轉扭力不因速度

及負載而受影響使伺服控制達到某一預定的特性範圍

馬達的轉速會因其驅動機構的慣性影響不可能「說停就停」也會因為摩

擦力等影響不可能「說動就動」故對其操控指令一定會有延遲的現象發生

這些因素使馬達不是一個典型的線性系統故傳統的 PID 控制器就不是最好的

選擇再加上近年來模糊控制系統〈Fuzzy Logic Control SystemFLCS〉的發展

使吾人想設計一模糊控制器來做為馬達轉速的閉迴路控制以解決非線性系統的

問題除此之外FLCS 在上升時間安定時間和超越量上的要求也都優於傳統

的 PID 控制器

主旨為具模糊控制理論為基礎之雙脈寬調變直流馬達驅動電路之設計有

別於傳統上之 PID 脈寬調變控制技術而達到轉速控制的回授系統

III

Abstract

Use Two Pulse Width Modulation(TPWM) driver circuit by Fuzzy Logic

Control System(FLCS) to replace conventional PWM circuit with PID control system

has many advantages

TPWM is digital logic circuit which can be developed into integrated circuit

micro chips for easy maintenance and installation When incorporate with micro

computing TPWM has wide range of applications The major advantages of the

TPWM driver circuit by FLCS are

When performing on and off forward reverse or variable speed TPWM requires

the same power and will not effect torque in performing desirous of speed under

different loading

Convention motor circuit does not compete spinning motorrsquos inertia when

control to stop therefore the motor takes some time to slow to a stop Also due to

same factor the conventional motor circuit can not accelerate the motor to desirous of

speed in the same instant the motor is turned on Whereas TPWM circuit can make

the motor stop in instant and spin up to desirous of speed when turned on without

convention motor circuitrsquos delay

Convention PID controller for motors is not the best control system because the

motor is not a linear system as PID controller assumed Recent development on FLCS

is specialize in solving this conflict because its performance of rise time setting time

and overshoot are all better than PID controller

Based on fuzzy control theorem and TPWM method for dc motor driver circuit

design is different from conventional PWM circuit with PID controller in order to get

up to the speed feed back control system

IV

目錄

誌 謝 I

中文摘要 II

Abstract III

目錄 IV

圖目錄 VI

表目錄 VIII

第一章 緒論 1

11 前言 1 12 研究動機 2 13 研究方法 3 14 研究目標 4

第二章 原理探討 5

21 模糊控制與理論 5 211 模糊理論概述 5 212 模糊集合 6 213 歸屬函數 7 214 模糊推論與模糊規則 10 215 模糊控制器 11

22 直流馬達數學模型 14

第三章 系統功能分析與製作規劃 17

31 專題製作流程 17 32 雙脈寬調變法之直流馬達驅動電路設計 18

321 脈寬調變電路 18 322 橋型驅動功率放大電路 23 323 間距脈波產生電路 26

33 編碼器 27 34 LM2917 FV 電路設計 29 35 單晶片介面電路 31

351 AD 轉換31 36 電源供應系統 33 37 馬達轉速的量測 34

V

第四章 軟體規劃與製作 36

41 PWM 之軟體設計 36 411 PWM 軟體流程 36

42 模糊控制之程式規劃與撰寫 37 421 歸屬函數 38 422 模糊規則庫 41 423 模糊控制器之軟體設計流程 42

43 LCD 顯示轉速43 431 LCD 顯示幕之軟體流程 44

第五章 結論 46

參考文獻 48

附錄 A 專題硬體展示圖 50

附錄 B PWM 與模糊控制之程式53

附錄 C LCD 顯示之程式 62

VI

圖目錄

圖 11 單象限控速系統運作於第一象限2 圖 211 正規且凸模糊集合7 圖 212 正規非凸的模糊集合7 圖 22 吊鐘型歸屬函數8 圖 23 三角型歸屬函數9 圖 24 梯型歸屬函數9 圖 25 模糊控制系統的構造11 圖 26 模糊系統的基本架構13 圖 27 直流馬達等效電路簡圖14 圖 28 直流馬達數學模式方塊圖16 圖 31 專題製作流程圖17 圖 32 脈寬調變電路18 圖 33 三角波產生電路19 圖 34 三角波輸出波形21 圖 35 脈寬調變電路22 圖 36 三角波與反相輸入電壓比較22 圖 37 PWM 輸出波形 23 圖 38 橋型驅動功率放大電路24 圖 39 橋型驅動功率放大電路實體圖24 圖 3101 呈現不感帶的轉移函數25 圖 3102 輸出電壓波形25 圖 311 間距脈波產生電路26 圖 312 間距脈波27 圖 313 光學式轉動編碼器的原理圖28 圖 314 編碼器的輸出信號波形28 圖 315 FV 電路 29 圖 316 頻率對電壓曲線31 圖 317 直流電源電路33 圖 318 直流電源電路實體圖34 圖 319 PWM 輸出對應 encoder 週期 35 圖 41 PWM 軟體設計流程圖 36 圖 42 停止時之歸屬函數38 圖 43 正轉〈慢〉之歸屬函數38 圖 44 正轉〈快〉之歸屬函數39 圖 45 逆轉〈慢〉之歸屬函數39 圖 46 逆轉〈快〉之歸屬函數40

VII

圖 47 輸出之歸屬函數40 圖 48 推論後的三維空間圖41 圖 49 Fuzzy Controller 程式流程圖 42 圖 410 LCD 顯示幕之程式流程圖44 圖 A-1 硬體整體圖 50 圖 A-2 硬體整體鳥瞰圖 50 圖 A-3 硬體側視圖 51 圖 A-4 操作與顯示面板 51 圖 A-5 間距脈波電路與 FV 電路 51 圖 A-6 橋型驅動功率放大電路 52 圖 A-7 操作與控制面板 52

VIII

表目錄

表 31 頻率與轉換電壓之關係30 表 33 PWM 輸出對應 encoder 週期 34 表 41 模糊控制規則表41

1

第一章 緒論

11 前言

在現代的工程應用裡馬達扮演一個非常重要的角色它在機械設備中就好

像人的心臟一樣提供了機械運轉所需要的動力源以做為能量轉換或控制機能

的實行在眾多的馬達種類當中直流馬達不僅具有許多良好的特性例如高

啟動轉矩較易線性控制hellip等且其週邊控制元件充足控制理論發展成熟所

以被廣泛的應用在工業日常生活上馬達的速度控制被廣泛的應用在各種加工

機械航空機械農業機械交通工具等用途

直流電動機之轉速控制目前最常被使用的一種方法為脈波寬度調變〈PWM〉

驅動電路並結合傳統的 PID 控制器脈寬調變是一種以固定的頻率波寬可

調的輸出開閉供應的直流電壓使馬達感受到的平均電壓可以調整進而控制馬

達的轉速

我們日常生活中處處存在著非線性的現象但是我們較熟悉處理的卻是線

性的系統對於傳統 PID 控制器來說必須先知道受控系統〈plant〉的數學模

型否則無法導出其控制演算法則且其強健性與容錯性較低然而對於非線性

系統則不適合此法因此近年來對於非線性系統的研究工作已有許多學者嘗試

應用模糊理論〈Fuzzy Theory〉類神經網路〈Artificial Neural Networks〉基因

演算法〈Genetic Algorithms〉等非傳統方法且已有不錯之成效因此以模糊控

制理論之方法取代傳統的 PID 控制器來控制馬達轉速

對於一個非線性時變系統〈Nonlinear Time Variant System〉模糊控制理論

不但能簡化數學模型並且可以結合人類的操作經驗有效的達成控制目標模

糊控制能將操作者的專家經驗換成控制器設計人員的設計理念勢必擁有比一般

傳統的控制器更加的強健性與容錯性

2

12 研究動機

現今直流馬達的轉速控制多廣泛使用脈波寬度調變式〈Pulse Width

Modulation簡稱 PWM 驅動電路〉此種電路是以控制固定頻率的開閉供應直流

電壓以得到波寬可調的輸出使馬達的平均電壓可以調整進而轉移到馬達的

平均功率而達到轉速的控制但是由於 PWM 為一種單象限控制只運作於第一

象限這種系統本身無法產生負轉矩未加上逆向開關前亦無法反向因此無法

作用於第三象限系統加上動力制動後方可以有限度地產生逆向轉矩而運作於

第二象限〈見圖 11〉然而這也只是一種被動控制區間﹝1﹞

主動控制區動力制動

(被動運作)

Ⅱ Ⅰ

Ⅲ Ⅳ

ω

TCWCCW

圖 11 單象限控速系統運作於第一象限

本研究主要目的之一就是針對 PWM 之缺失提出了改良的方法於前級驅

動電路產生正反方向的兩個脈波信號再經驅動功率放大之後使馬達產生正

反轉向的兩拉力此即為雙脈波寬度調變式(Two Pulse Width Modulation簡稱

TPWM)本控制主要特色不論電動機正轉反轉速度快慢或停住均消

耗定額功率〈即馬達無時無刻都在運轉且輸出轉矩為額定值〉系統於寬廣的

速度變化範圍內仍具有良好的伺服性能馬達的旋轉扭力不會因速度及負載的

變化而受影響使伺服控制系統達到某一預定的特性範圍﹝2﹞

3

此外馬達的轉速會因其驅動機構的慣性影響不可能「說停就停」也

會因為摩擦力等影響不可能「說動就動」故對其操控指令一定會有延遲的

現象發生這些因素使馬達不是一個典型的線性系統故傳統的 PID 控制器就

不是最好的選擇再加上近年來模糊控制系統〈Fuzzy Logic Control System

FLCS〉的發展﹝3﹞使吾人想設計一模糊控制器來做為馬達轉速的閉迴路控

制以解決非線性系統的問題除此之外FLCS 在上升時間安定時間和超

越量上的要求也都優於傳統的 PID 控制器[4]

目前雖然有很多從事於馬達轉速控制的相關研究但是多採用脈波寬度調

變法且其尚有缺失待改良因此吾人想採用雙脈波寬度調變雖然有關此法

的研究並不多見但 TPWM 卻具有 PWM 所沒有的優點再加上近來發展愈

盛的模糊控制理論較傳統 PID 控制器的優點相信馬達轉速以 TPWM 驅動電

路之模糊控制是值得去加以研究和探討的

13 研究方法

本專題計畫其研究方法主要分為兩大類一為硬體結構電路設計另一為

Fuzzy 控制器之軟體製作硬體結構方面主要設計一比較放大器使其誤差值經

此電路與三角波比較而輸出 A 驅動信號脈波與 B 驅動信號脈波然後再由驅動

功率放大電路將信號脈波放大後控制馬達正逆轉此外為了確保功率放大電

路之安全性需在其之前加上一間距產生電路以防止其電路損毀

感測器方面則利用編碼器〈encoder〉感測出馬達的轉速然後再經由 FV

將其轉換為電壓此電壓再由 AD 轉換為數位信號送入單晶片 8051經由模

糊控制規則庫判斷並做出決策以達到馬達轉速的控制

4

14 研究目標

本專題研究目標如下

〈1〉 完成相關文獻資料之蒐集整理與討論

〈2〉 完成 AB 信號產生電路設計

〈3〉 完成間距脈波產生電路設計

〈4〉 完成驅動功率放大電路設計〈橋型驅動功率放大〉

〈5〉 完成 FV 電路設計

〈6〉 完成 AD 訊號轉換

〈7〉 編寫模糊控制法則與介面軟體設計

5

第二章 原理探討

21 模糊控制與理論

在傳統的控制領域裏控制系統動態模式的精確與否是影響控制優劣的最主

要關鍵系統動態的資訊越詳細則越能達到精確控制的目的然而對於複雜

的系統由於變數太多往往難以正確的描述系統的動態於是工程師便利用各

種方法來簡化系統動態以達成控制的目的但卻不盡理想換言之傳統的控

制理論對於明確系統有強而有力的控制能力但對於過於複雜或難以精確描述的

系統則顯得無能為力了因此便嘗試著以模糊數學來處理這些控制問題模糊

控制是屬於非線性式的控制在受控系統無法以線性數學模式精確描述的情況

下經由適當調整控制規則應具有比傳統控制方法更佳的控制性能

211 模糊理論概述

1965 年美國加州柏克萊分校的 LotfiAZadeh 教授首先在他主編的

「Information and Control」刊物上提出「Fuzzy Set」論文此為模糊邏輯理論的

創始模糊理論在經過了三十幾年的演化改進後無論是在應用或理論架構上

皆已日趨完備尤其近年來因人工智慧的迅速發展模糊理論儼然成為人工智慧

不可或缺的理論根基

Zadeh 教授曾提出一個互克性原理﹝5﹞「當系統的複雜性增長時對系統

特性做精確且有意義描述的能力亦相對降低最後精確性與有意義性將變成完全

互相排斥的特性」很高的複雜性意味著只能在一個刻意壓縮的低維因素空間觀

察而無法對問題的全部因素都進行考察使得原本是明確的概念變的模糊

Fuzzy 理論正是為了掌握這類具模糊特質的事物而發展出來的所以它的應用較

偏重於人類的經驗及對問題特性的掌握程度不主張用繁雜的數學分析及數學模

式來解決問題

Fuzzy 理論把傳統數學從二值邏輯〈binary logic〉擴展到連續多值〈continuous

6

multi-value〉利用歸屬函數〈membership function〉描述一個概念的程度亦及

使用 0 和 1 之間的數值來表示一個元素屬於某一概念的程度這個值稱為元素對

集合的歸屬度〈membership grade〉當歸屬度為 1 時表示該元素百分之百屬於

這個概念當歸屬度為 0 時則表示該元素完全不屬於這個概念介於兩者之間

的就是完全屬於和完全不屬於之間的灰色地帶

模糊理論的工程應用大約始於 1974 年倫敦大學的 EHMamdani 教授他根

據 Zadeh 提出的語言分析法〈linguistic approach〉及模糊推論〈fuzzy inference〉

運用 IF-THEN 形式的法則來敘述操作員的控制策略成功地應用在蒸汽機自動

運轉上﹝6﹞從此模糊理論的應用便迅速發展以在控制方面的研究成果最為

顯著模糊理論其實是一門相當生活化的學問由於使用語言變量描述因此更

具親和力與一般性人類日常生活所遇所用的一些敘述即大都是模糊的例如

那個人ldquo很高車開的ldquo很快等等其中ldquo很高ldquo很快並不是一個

明確值而只是描述事件的程度但是根據這些描述人類卻能很輕易的接收

212 模糊集合

模糊集合〈fuzzy set〉可視為傳統集合的擴張在模糊集合的世界中稱傳

統集合為明確集合〈crisp set〉所謂模糊集合是指用來表示界限或邊界不分明的

模糊概念的集合許多日常生活中的概念常常都不是清晰明確的這些可說是模

糊概念例如很高很快等這類概念無法用傳統的二值集合論即 0 或 1 表示

而Zadeh教授提出的Fuzzy集合論可以將這些概念由傳統集合論的特徵函數從非

0 即 1 的二值選擇推廣為從 0 到 1 之間的任何值做選擇得到新型的特徵函數

稱為歸屬函數

模糊集合由歸屬函數表示相對於明確集合的特徵函數其值只有 0 或 1 兩個

值即其值為在實軸閉區間[01]之中的任一實數模糊集合可以彌補明確集

合描述時所產生的不合理現象因此模糊集合比傳統的明確集合更具客觀性

7

213 歸屬函數

歸屬函數〈membership function〉為 0 到 1 之間的數值吾們可以藉由歸屬

函數來描述 Fuzzy 集合的特質它是 Fuzzy 理論的最基本觀念透過歸屬函數我

們才能對 Fuzzy 集合進行量化也才可能利用精確的數學方法分析處理模糊性資

歸屬函數在 Fuzzy 控制的應用範疇內都要具備凸〈convex〉及正規〈normal〉

等基本特性〈如圖 21〉歸屬度函數的定義可以分為數值及函數兩種數值定義

方式又稱為離散化歸屬函數它是直接給定有限 Fuzzy 集合內每個元素的歸屬

度並以向量的形式表現出來函數定義方式又稱為連續化歸屬函數它是以不

同形式的函數來描述 Fuzzy 集合

圖 211 正規且凸模糊集合

1

0 圖 212 正規非凸的模糊集合

8

一個模糊集合的歸屬函數可以有許多方式但是目前最廣泛使用的有吊鐘

型三角型梯型等歸屬函數

〈1〉吊鐘形歸屬函數

吊鐘形歸屬函數定義如下

μA=bell(xabc)= b

acx 2

1

1minus

+

〈21〉

圖 22 吊鐘型歸屬函數

〈2〉三角形歸屬函數

三角形歸屬函數可由三個參數(abc)來加以決定

=Aμ trangle(xabc)

⎪⎪⎪

⎪⎪⎪

ltleminusminus

ltleminusminus

=

other

cxbcbcx

bxaabax

0

〈22〉

其中a為歸屬函數左邊界b為歸屬函數中心值c為歸屬函數右邊界

9

圖 23 三角型歸屬函數

〈3〉梯型歸屬函數

梯型歸屬函數可由四個參數加以決定

=Aμ trapezoid(xabcd)

⎪⎪⎪⎪

⎪⎪⎪⎪

leleminusminus

ltle

ltleminusminus

=

other

dxcdcdx

cxb

bxaabax

0

1 〈23〉

圖 24 梯型歸屬函數

10

214 模糊推論與模糊規則

模糊推論〈fuzzy inference〉是根據知識庫保存的規則(rule)和給予的事實

推導出新的結論與傳統推論不同的地方是Fuzzy推論不只可以處理明確命題也

可以處理Fuzzy命題Fuzzy推論是依據近似推理〈approximate reasoning〉的概念

發展出來的比傳統推論的嚴正推理〈exact reasoning〉更合理也更具彈性近

似推理是兩種嚴正推理General Modus Ponens〈簡稱GMP〉及Genera Modus

Tollens〈簡稱GMT〉的一般化此原理是從傳統二值邏輯中的肯定律〈modus

ponens〉和否定律〈modus tollens〉推廣而來其中GMP又可稱為前向推理而

GMT則可稱為反向推理

〈1〉 GMP〈General Modus Ponens〉

規則IF x is A THEN y is B

事實x is Arsquo

結論y ix Brsquo 〈24〉

〈2〉 GMT〈General Modus Tollens〉

規則IF x is A THEN y is B

事實y is Brsquo

結論x is Arsquo 〈25〉

上式中IF x is A THEN y is B即為模糊規則〈fuzzy rules〉AArsquoBBrsquo

分別是定義在論域X及Y的模糊集合xy代表輸入變數及輸出變數的語言變數

一般來說「x is A」稱為前件部〈antecedent〉而「Y is B」則稱為後件部

〈consequence〉Fuzzy知識庫〈Fuzzy Knowledge Base簡稱FKB〉即由這些模

糊規則所組成的規則庫〈rule base〉和存放描述領域知識的Fuzzy變數及語言變數

的資料庫〈data base〉所組成所以FKB是用來描述受控對象所涉及的領域知

11

識和操控目標的一些定性及定量的資訊模糊知識庫和模糊推論是構成Fuzzy規

則系統核心的兩個重要部門﹝7﹞

模糊推論是模糊系統的核心根據知識庫的模糊法則進行模糊理論的合成運

算來模擬人類的思考決策模式一般來說規則的建立是採取十分主觀直覺的

方式依據相關領域專家的經驗與知識透過詢問進而將其知識經驗歸納條列出

重點再轉換成模糊規則的形式表現出來但是並非所有的專家或操作員都能

將自身的經驗知識以言詞的方式充分的表達出來且未必能整理成條列的模糊規

則所以知識規則的萃取工作往往是在建構模糊系統時最常遭遇到的困難之

215 模糊控制器

模糊控制是智慧型控制〈intelligent control〉系統的一種典型其基本特點

是不完全依賴受控對象的數學模型主要是利用人的操作經驗知識和推理技

術以及控制系統的某些訊息和性能得出對應的控制動作模糊控制是以並行

〈parallel〉方式處理規則的推理工作〈如圖25〉其近似推理會包容每個對操

控系統有貢獻的規則即使某些貢獻程度很小的規則也不會忽略

圖 25 模糊控制系統的構造

12

一個控制器的輸入通常是確定數值而非模糊輸出也是如此才能對被控對象

發生作用但是模糊邏輯控制器〈Fuzzy Logic Controller簡稱FLC〉則是以語

言化的控制規則為主體為了能夠把輸入的確定值與語言化之後的控制規則結

合必須把輸入的確定值模糊化〈fuzzification〉以便對應到FLC語言變數的論

域範圍中同樣的經過規則庫推理出來的結果是對應到輸出語言變數的論域

中所以也必須對其做解模糊化〈defuzzification〉的工作才能達成實際的控制

目標

一般模糊控制器的架構包含了五個主要部分定義變數模糊化知識庫

模糊推論及解模糊化

〈1〉 定義輸入及輸出變數

決定程序被觀察的狀況及考慮控制的動作輸入變數可以是擷取

自受控系統的觀測量也可以是推導出來的資料輸出變數則為操控

受控系統的操作量例如在一般控制問題上輸入變數通常為輸出

誤差e與輸出誤差之變化率e而控制變數則為下一個狀態之輸入

u其中eeu統稱為模糊變數

〈2〉 模糊化

將量測值轉換為語言變數的過程將外界所輸入的確定數值經由

一比例映射傳送到輸入變數所對應的模糊論域然後再利用模糊化

函數將此輸入資料轉換成適當的口語值以供模糊運算使用此口語

化變數稱之為模糊子集合

〈3〉 知識庫

模糊知識庫是模糊控制的依據由它來定義所有使用到的語言控

制法則及相關各項參數知識庫可說是整個控制系統資料核心其包

含了兩個部分資料庫〈data base〉與規則庫〈rules base〉

1 資料庫

提供處理模糊數據之相關定義資料庫所存放的資料是關

13

於如何將明確的資料轉換成模糊數值而資料的存放方式是以

歸屬函數表示該選用哪一種歸屬函數依實際的需要選定

以三角形歸屬函數最常被使用因其運算最為容易且又能充分

的表達模糊概念

2 規則庫

利用語言化的條件式控制規則描述控制目標和策略通常

控制規則可以由操控人員的經驗或專家的知識推導出來多個

控制規則所組成的集合就是規則庫

〈4〉 模糊推論

模糊推論為模糊控制最重要的核心其最主要的工作就是做實際

的決策過程處理模糊推論具有模擬人類做決策判斷的能力其基本

理論就是根據人類特有的近似推理方式如之前已說明的GMP和

GMTGMP為前向推理而GMT為逆向推理因為模糊推論為前向

運算因此GMP非常適合使用為模糊控制的推論機構

〈5〉 解模糊化

將推論完成所得到的模糊輸出量轉換成實際的明確數值以便和

外界溝通解模糊化的方法有很多例最大歸屬度法重心法高

度法面積法等

圖 26 模糊系統的基本架構

14

22 直流馬達數學模型

圖27為直流馬達等效電路簡圖其中

iV = 輸入電壓 ai = 電樞電流

zR = 電樞電阻 gT = 轉矩

aL = 電樞電感 bE = 反電動勢

φ = 空氣隙磁通量 ω = 轉子角速度

B = 黏滯摩擦係數 J = 轉動慣量

圖 27 直流馬達等效電路簡圖

由克希荷夫電壓定律知

( ) ( ) ( )tEdt

tdiLtiRV b

aaaai ++= 〈26〉

由於反電動勢 bE 與轉軸的角速度 ( )tω 及空氣隙磁通量φ之乘積成正比即

( ) ( ) ( )tKtKtE emb ωφω == 〈27〉

15

又轉矩的平衡方程式為

( ) ( ) ( )dt

tdJtBtTgωω += 〈28〉

且馬達轉矩 gT 與電樞電流 ( )tia 及空氣隙磁通量φ乘積成正比即

( ) ( ) ( )tiKtiKtT ataag == φ 〈29〉

取〈26〉~〈29〉式之拉氏變換得

( ) ( ) ( ) ( )sEssILsIRsV baaaai ++= 〈210〉

( ) ( )sKsE eb Ω= 〈211〉

( ) ( ) ( )sJssBsTg Ω+Ω= 〈212〉

( ) ( )sIKsT atg = 〈213〉

則馬達輸入電流與轉速為

( ) ( ) ( )( ) ( )( )

sR

sEsV

sLRsEsV

sIe

a

bi

aa

bia τ+

minus

=+minus

=1

〈214〉

( ) ( ) ( )

sB

sT

sJBsT

sm

gg

τ+=

+=Ω

1 〈215〉

其中a

ae R

L=τ 為電樞電流的電氣時間常數 BJ

m =τ 為馬達轉動的機械時間

常數

直流馬達轉速對輸入電壓的轉移函數 ( )sG 為

( ) ( )( ) ( )( ) etaa

t

i KKBJsRsLK

sVssG

+++=

Ω=

( )( ) etmea

t

KKssBRK

+++=

ττ 11 〈216〉

16

在一般情況電樞電感很小所以 eτ 可以忽略不計因此上式成為一階落後

方程式

( ) ( )( ) ( ) m

m

etma

t

i sTK

KKsBRK

sVssG

+=

++=

Ω=

11 τ 〈217〉

其中

eta

mam KKBR

BRT

+=

τ

eta

tm KKBR

KK

+=

所以直流馬達數學模式可以以圖28表之﹝8﹞

圖 28 直流馬達數學模式方塊圖

17

第三章 系統功能分析與製作規劃

31 專題製作流程

如圖 31 所示本專題主要分為兩條路徑進行一為硬體另一則為軟體程

式撰寫本章著重硬體的規劃設計軟體則在第四章中介紹在完成 AB 信號

產生電路驅動功率放大電路與間距脈波產生電路設計與製作後須先接上馬達

做一連串的測試〈此時系統並無回受控制〉測試間距脈波是否太長或太短硬

體電路是否有缺失hellip等等另一方面也著手撰寫模糊控制程式並將其與硬體電

路結合最後做閉迴路系統的整合測試若發現系統的運作結果並不如預期

則需分別從硬體與軟體兩方面去改良

直流馬達轉速之模糊控制

文獻蒐集與整理

AB信號產生電路設計與製作

驅動功率放大電路設計與製作

間距脈波產生電路設計與製作

測試間距脈波是否太長或太短

系統測試測試馬達轉速是否

達到控制目的

結束與論文寫作

重新設計間距脈波長度

Yes

No

系統整合與修正

輸出信號與Fuzzy控制器之連結設計

規劃輸出與輸入歸屬函數

規劃模糊知識庫

撰寫主程式並加入模糊知識庫

程式編譯及連結

軟硬體整合測試馬達是否運作

程式調整及最佳化

No

YesYes

No

圖 31 專題製作流程圖

18

32 雙脈寬調變法之直流馬達驅動電路設計

本專題製作的雙脈寬調變法之直流馬達驅動電路設計大致可以分為二大部

分第一雙脈寬調變法之電路設計第二橋型驅動功率放大電路

雙脈寬調變〈Two Pulse Width Modulation簡稱TPWM〉之電路設計主要

是先製作一脈寬調變〈Pulse Width Modulation簡稱PWM〉波形然後再將此

波形各別經由一緩衝器〈buffer〉和反向器〈inverter〉則可產生AB驅動信號

脈波此即為TPWM

321 脈寬調變電路

如圖32先利用兩顆op產生三角波電路再利用一個比較器比較三角波

和誤差值之大小

150k

1M

20k

+12V

-12V

+12V

-12V10k

+12V

-12V

10k

+12V

-12V-

+-

+

-

+ PWMLM324

LM324

LM324

2200pF

圖 32 脈寬調變電路

〈1〉 三角波產生電路

三角波產生電路通常至少需要兩個運算放大器其電路如圖33OP1

為一個反相積分器OP2為一個史密特磁滯比較器將OP2的輸出方波經

19

OP1反相積分以後得到Vo1三角波此三角波又同時加到OP2控制其狀

態的改變

當方波產生器的輸出是正的則三角波產生器的輸出是斜向負相似

地當方波產生器的輸出是負則三角波產生器的輸出是斜向正這個動

作將產生三角波的輸出同時也輸出方波﹝9﹞

+VCC

-VCC

-

+

R1

R2

R3

+VCC

-VCC

-

+

OP1

OP2

Vo2Vo1

圖 33 三角波產生電路

對OP2而言是磁滯比較必須先找到OP2的 THV 和 TLV

232

21

32

3oo v

RRR

vRR

Rv

++

+=+ 〈31〉

當 0=+v 時

23

21 oo v

RR

v minus= 〈32〉

表要達到OP2的 0=+v 必須有這麼大的 1ov

當 12 sato Ev = 時

TLsato VERR

v =minus= 13

21 〈33〉

當 22 sato Ev minus= 時

THsato VERR

v =+= 23

21 〈34〉

20

對OP1而言是反相積分器 2ov 為其輸入 1ov 為其輸出則

tCIt

Rv

Ct

CRv

dtvCR

v oooo

11

2

11

22

111

11minus=minus=minus=minus= int 〈35〉

因為

1

2

Rvv

I o minusminus= 0=minusv 〈因為虛接地〉 〈36〉

所以

1

2

Rv

I o= 〈37〉

又因運算放大器的輸入阻抗非常大則流經 1C 的電流也為 I 相當於以定

電流對電容C 充電

當 12 sato Ev = 時 1ov 為下降斜波

tR

EC

v sato

1

1

11

1minus= 〈38〉

當 22 sato Ev minus= 時 1ov 上升斜波

( )

tRE

Cv sat

o1

2

11

1 minusminus= 〈39〉

由此可知三角波的上升與下降斜波乃因 1C 的充電與放電且時間

常數為 11CR

三角波週期分析如下

1 上升斜波的時間 1T

tCR

vv o

o1

1

21 minus= 11

2

1 CRvv

to

ominus=

1Tt = TLTHo VVv minus=1 22 sato Ev =

11111

21

sat

TLTH

sat

TLTH

EVV

CRCRE

VVT

minus=

minusminus= 〈310〉

2 下降斜波的時間 2T

tCR

vv o

o1

1

21 minus= 11

2

1 CRvv

to

ominus=

21

2Tt = THTLo VVv minus=1 12 sato Ev =

1

11111

1sat

TLTH

sat

THTL

EVV

CRCRE

VVT

minus=

minusminus= 〈311〉

3 週期 21 TTT +=

若 1satE = 2satE = satE 且3

22RR

VV TLTH =minus satE

3

2114

RR

CRT=

若R3 = nR2

則nCR

T 114=

114 CR

nf = 〈312〉

《實驗結果》

必須注意的是三角波的頻率太低將導致馬達的轉動產生脈動現象

故將工作頻率設計在1kHz以上

Ω= k1501R Ω= k102R

Ω= k203R pFC 22001 =

所得到的三角波頻率為

15kHz10220010001504

00010100020

f 12- =timestimestimestimes

timestimes

=

圖 34 三角波輸出波形

22

〈2〉 脈寬調變電路〈PWM〉

+12V

-12V

10k

+12V

-12V -

+ PWM輸出LM324三角波輸入

圖 35 脈寬調變電路

PWM系統往往連接至直流電源供應放大器的工作是以固定的頻率開

閉直流供應電壓其激發角是可以調整的因此得到波寬可調的輸出

將固定頻率的三角波與反向輸入的電壓做比較便可輸出一脈寬〈見圖

36〉反向電阻值的不同將導致反向輸入電壓不同故其輸出為一可調但

頻率固定的脈寬也正因為如此故稱為脈寬調變〈PWM〉由於輸出的

dutycycle不同故馬達將接收到不同的平均電壓因而可以藉由PWM控制

馬達的轉速

反相輸入電壓

PWM

圖 36 三角波與反相輸入電壓比較

23

PWM的優點在於馬達驅動電路的電晶體之控制信號改以脈波列來控

制使電晶體操作成類似開關的動作不是完全導通就是完全截止故電晶

體不是一直操作於作用區所以其功率消耗不大整體效率較高

《實驗結果》

圖 37 PWM 輸出波形

322 橋型驅動功率放大電路

如圖38所示主要由四個功率電晶體組成利用不同的電晶體對使直流

馬達做正逆轉控制當Q5Q8導通使馬達正轉當Q6Q7導通馬達則逆

轉電路中的電晶體扮演開關的作用

此種電路簡單只要一組直流電源供應且電晶體分擔了部份的電壓保護

電晶體迅速工作於截止與飽和狀態之間故沒有功率散逸損失之虞

但是在設計時切勿使Q5Q6同時導通以免燒毀電路上之元件因為在

AB兩脈波短暫的交變時間內由於電晶體本身之最小延遲時間有可能使Q5

Q6同時ON與Q7Q8在很短時間同時ON因此在15kHz交變下容易燒毀功

率電晶體

因此設計一間距脈波電路主要之功用使Q5Q6和Q7Q8均不同時導通

24

以拉長AB兩者交換時間

M

20k

10k

20k

10k

+24V

A 信號 B 信號

2N3055 2N3055

2N2955 2N2955

1N40021N4002

C1815 C1815

C1815 C1815

Q5

Q8Q6

Q7

圖 38 橋型驅動功率放大電路

圖 39 橋型驅動功率放大電路實體圖

25

此外若考慮電晶體BE間的電壓則電路會出現約 plusmn 06V的不感帶〈ded

band〉即電晶體的 oV 對 inV 間的關係如圖3101假使 inV 電壓為正弦波則 oV 變

成如圖3102為了改善這種缺失吾人利用兩個二極體接在電路上如圖38

用來補償電晶體BE間的壓降﹝10﹞

約06V

Dead band

Vo

Vin

圖 3101 呈現不感帶的轉移函數

圖 3102 輸出電壓波形

26

323 間距脈波產生電路

RCext15

Cext14 74123

A3

B2

Q13

CLR1

Q4

7486100k

2200pF

10k

10000pF

+5V

間距脈波輸出

圖 311 間距脈波產生電路

間距脈波的產生方式是根據脈寬調變〈PWM〉後的訊號再經由積分電路的

電阻兩端取出且經由兩倍頻器〈74LS86〉檢示出PWM的正負緣脈波最後

再利用單穩態IC〈74LS123〉將檢出信號之脈寬拉長至01ms此即為間距脈波

74LS123有兩個輸入端子A及B分別為下降波緣輸入端子及上升波緣輸入端

子當輸入A之脈波由ldquoH變成ldquoL之瞬間Q輸出變為ldquoH其持續時間長

短由RC時間常數決定反之當輸入B之脈波由ldquoL變成ldquoH之瞬間Q輸出

變成ldquoH維持一定時間

74LS123的輸出脈波之寬度是由電阻及電容之時間常數所決定概略計算公

式如下

CR045T timestimes=

電容 C 必須大於 1000pF

27

《實驗結果》

R=24kΩ C=10000pF

所以得到間距脈波為

( )msec0110810000p24k045T cong=timestimes= μ

圖 312 間距脈波

研究經分析後發現

1 間距 T 愈大愈能確保電路之安全性愈有保護作用

2 間距 T 愈大相對的使驅動信號脈波減少愈多造成馬達旋轉扭力大

大減弱

3 適當的間距 T不但不會影響馬達的輸出轉矩而且兼具保護電路的

效果

33 編碼器

轉動編碼器不只可以作為轉速的感測也能做位置的感測又適合於數位處

理故被廣泛使用若就信號來看轉動編碼器可分為增量型與絕對型若以檢

測的方式來分可分為光學式和磁式兩種在本專題中所使用的編碼器為光學式

增量型編碼器﹝11﹞

光學式轉動編碼器的原理如圖 313在附有細縫轉盤的兩側分別裝置發光元

28

件與受光元件如果只有一組光電檢測元件則輸出信號就只有一相的脈波信

號此種裝置稱為脈波產生器圖 314 為增量型轉碼器的輸出信號它是利用

兩組光電元件所產生的脈波信號A 相和 B 相間有相位差正轉時 A 相領前 B

相逆轉時 B 相領前 A 相因此利用此兩相做檢測馬達為正轉或逆轉的工作

並利用 A 相或 B 相的頻率檢測出目前的轉速

吾人計算出編碼器每一轉可以產生約 200 個脈波故檢測 A 相或 B 相其頻

率為 N則轉速應為 60200

timesN

〈rpm〉

圖 313 光學式轉動編碼器的原理圖

圖 314 編碼器的輸出信號波形

29

34 LM2917 FV 電路設計

對 LM2907 而言磁滯比較器和電流汞是構成頻率對電壓轉換的基本架構

並且預留一個運算放大器及一個電晶體供各種不同的使用圖 315 為吾人所設

計的 FV 電路圖中 C1 用以抑制電流汞動作時所產生的漣波變化正常使用時

此電容應大於 10C若 C1 太大也將造成轉換速度下降

因為單晶片 8051 之輸入電壓最高為 5V故必須設計其馬達最高轉速頻率所

轉成的電壓必須在 5V 以內由於馬達轉速頻率範圍極大故吾人給予 LM2917

+12V 的電壓以擴大它可以轉換的電壓範圍並將所需維持在 5V 內

a1

14

b1

1

a1

13

b1

2

a1

12

b1

3

a1

11

b1

4

1

a1

10

b1

5

a1

8

b1

7

a1

9

b1

6

L2917

Encoder輸 入

1uF

+12V

FV輸出1000pF

45k 10kC1

C2

圖 315 FV 電路

30

《實驗結果》

根據統計結果每 50mV 相對於 100Hz如此一來吾人想得知馬達目前

的轉速只要將單晶片所接收到的電壓值經過換算即可得知目前 encoder 所量測

的頻率吾人知道 encoder 一圈可產生 200 個脈波故馬達的轉速便可經過下列

公式換算得知

轉速〈rpm〉 60200

times=f

其中 =f encoder 所量測到的頻率

表 31 頻率與轉換電壓之關係

頻率

(Hz) 1 2 3 4 5 6 7 8 9

電壓(V) 0006 0006 0007 0008 0009 0009 0009 0009 001

頻率

(Hz) 10 20 30 40 50 60 70 80 90

電壓(V) 008 009 010 010 011 011 012 012 013

頻率

(Hz) 100 200 300 400 500 600 700 800 900

電壓(V) 013 018 023 028 033 038 043 049 054

頻率

(Hz) 1000 2000 3000 4000 5000 6000 7000 8000 9000

電壓(V) 059 109 16 209 257 304 3508 4006 45

31

圖 316 頻率對電壓曲線

35 單晶片介面電路

單晶片介面包括了二大部分分別為單晶片 8051AD converter

〈1〉8051 單晶片

為本控制系統的核心一切動作皆經由它控制

〈2〉AD converter

將類比開關所送出來的類比訊號經由 ADC 0804 轉換成數位訊號傳送

到單晶片的輸入埠

351 AD 轉換

以單晶片 8051 控制 ADC0804則單晶片 8051 必須下達ldquo開始轉換rdquo的命令

給 ADC0804然後 ADC0804 就開始讀入類比輸入端的電壓在內部開始轉換

經過一段轉換時間後〈約 100μ s〉ADC0804 就將轉換完成的值放在其內部的三

態輸出栓鎖緩衝器裡然後將轉換完成輸出腳〈INTR〉降為 low以通知單晶片

可以去讀轉換完成資料

當WR和CS 同時為ldquo0rdquo時表示對 ADC0804 下達ldquo開始轉換rdquo命令再經過

32

一段轉換時間〈100μ s〉後轉換完成ADC0804 會將其轉換完成的數位資料放

在其內部 8 位元緩衝區裡且將 INTR 降為ldquo0rdquo因此單晶片只要下達ldquo開始轉換rdquo

命令後去檢查 INTR 的狀態就可以知道是否轉換完畢其方法有兩種

1 輪詢法〈polling〉

2 中斷法〈interrupt〉

所謂輪詢法就是將 ADC0804 的 INTR接到 CPU 的一條 IO 線上然後以軟體指

令主動偵測其狀態當偵測到為ldquo0rdquo時就可以去讀出 ADC0804 裡的緩衝區的轉

換值

中斷法是一個很理想的 IO 方式因為不像輪詢法必須讓 CPU 等 ADC0804

轉換當 CPU 下達ldquo開始轉換rdquo命令後就可以做其他工作當 ADC0804 轉換完

畢後 INTR會降為ldquo0rdquo可以利用此信號去中斷 CPU再由中斷副程式去讀入

轉換值即可因此大大提高了程式的效率

當 CPU 接收到 ADC0804 發出ldquo轉換完畢rdquo的信號〈 INTR =0〉後就可以去

讀出轉換值其讀出的方法是將CS 與RD設為ldquo0rdquo即可讀到轉換值這個讀值的

動作又會使得 INTR恢復成ldquo1rdquo

1 CPU 下達ldquo開始轉換rdquo命令〈CS =0WR =0〉

2 ADC0804ldquo轉換完畢rdquo 〈 INTR =0〉

3 CPU 讀取轉換值〈 RD =0CS =0〉

4 讀完後 INTR =1

ADC0804 主要規格摘要如下

1 +5V 單電源工作電壓

2 類比電壓輸入範圍 0~+5V

33

3 參考電壓為 25V

4 轉換時間為 100μ s〈 CLKf =640kHz〉

5 解析度為 8 位元

6 誤差plusmn 1LSB

7 讀取時間 135ns

36 電源供應系統

本專題中所有電路及硬體設備所需的電源採用交流電源 110V 經由 PT-31

變壓器後再經過橋式整流後提供了直流電源而因為各個電路所需電源不同

因此製作了多組的變壓電路如下

1電壓源 DC5V選擇了 7805 的穩壓 IC 搭配電容得到了+5V 的電壓源

供〈1〉8051 微處理器 〈2〉ADC 0804 〈3〉74LS8674LS12374LS04

74LS02CD4013 〈4〉馬達 Encoder

2電壓源 DC12V使用 7812 穩壓 IC 搭配電容得到+12V 的電壓源供

LM2917 使用

3電壓源 DC24V利用 7824 的穩壓 IC 搭配電容獲得+24V 的直流電壓

源供電路之橋型驅動功率放大之電晶體使用

Vin1

+12V2

GND3

LM7812

2200uF 10000pF 2200uF 10000pF

+12V outputAC

圖 317 直流電源電路

34

圖 318 直流電源電路實體圖

37 馬達轉速的量測

表 33 PWM 輸出對應 encoder 週期

PWM dutycycle encoder 週期 PWM dutycycle encoder 週期

40 sμ 172 sμ 440 sμ 0 sμ

80 sμ 188 sμ 480 sμ 0 sμ

120 sμ 204 sμ 520 sμ 0 sμ

160 sμ 230 sμ 560 sμ 0 sμ

200 sμ 272 sμ 600 sμ 0 sμ

240 sμ 328 sμ 640 sμ 0 sμ

280 sμ 416 sμ 680 sμ 1320 sμ

320 sμ 540 sμ 720 sμ 750 sμ

360 sμ 800 sμ 760 sμ 510 sμ

400 sμ 1320 sμ 800 sμ 400 sμ

35

圖 319 PWM 輸出對應 encoder 週期

由統計可知道此馬達並不是一顆線性馬達故相信若使用模糊控制理論來

作為其回授控制系統的控制器一定能達到比傳統控制器的性能還要好而且若能

在模糊控制裡加上 PID 控制器的觀念一定能在系統的響應時間上升時間

安定時間和超越量達到最佳的控制另一方面馬達在其反方向的內阻較大需

要更大的力量才能使馬達驅動

36

第四章 軟體規劃與製作

41 PWM 之軟體設計

因為之前所介紹的硬體方式是以調整可變電阻來達到轉速的調整因此無法

得知所給予的脈寬長度和轉速大小尤其在回授時也不易給予適當的訊號來調整

轉速因此改良之方法就是以8051之軟體撰寫方式來產生固定的脈寬也就等

於給予轉速的命令而在其回授控制時也只要在內部程式给予適當的指令便可

達到脈寬長度的調整以達到閉迴路之受控系統

411 PWM 軟體流程

設定Timer0模式為0

TH0 = temp 32 TL0 = temp 32

temp = 8192 ndash j4 Key = 0

檢查是否有鍵值

將鍵值存入Key

Yes

No

設定Key值所對應的 j值

If P30 == 1Then P30 = 0 temp = 8192 ndash j4Else P30 = 1 temp=8192ndash880+j4

TH0 = temp 32 TL0 = temp 32

Start Timer0中斷副程式

啟動Timer0

等待Timer0中斷

返回主程式

圖 41 PWM 軟體設計流程圖

37

在此總共設計了五個按鈕分別代表不同的轉速停止正轉〈慢〉正轉

〈快〉逆轉〈慢〉和逆轉〈快〉使用Timer0是因為8051之計時中斷比延遲程

式來的準確故可以達到準確的計時程式設計理念中並沒有將中斷致能清除

因此Timer0會一直處於計時的狀態程式執行時將一邊檢查鍵值〈KeyStatus〉一

邊進行計時當計時完畢便呼叫中斷副程式然後執行改變Port 30的輸出狀

態若是為high則變為low反之若是為low即變為high同時並重設計時時間

Timer0繼續計時

當鍵值改變時計時的時間也會跟著改變如此一來Timer0將ㄧ直重覆上

述動作直到電源切掉Timer0才會停止計時

42 模糊控制之程式規劃與撰寫

本專題目標在完成了先前所規劃的硬體電路之後接著就是要達成利用模糊

控制理論來設計控制器在此採用了單晶片8051目的是為了以硬體實現方式來

代替電腦模擬期望能夠按照原訂計畫完成本專題「具模糊控制理論與雙脈寬調

變法之直流馬達驅動電路設計」

單晶片 8051 模糊控制的程式撰寫採下列幾個步驟依序完成

1 設定變數轉速誤差〈dspeed〉目前轉速〈sspeed〉

2 模糊化採用三角形歸屬函數採用三角形歸屬函數的原因

〈1〉 三角形函數為一連續函數

〈2〉 三角形函數為線性的函數所以計算速度較快

〈3〉 是具有發散也有收斂的函數和指數函數一樣接近

事實

3 模糊推論模糊規則將其所有可能發生情況以 IFhellipTHENhellip表示

並建立控制規則表

4 解模糊化採用重心法

38

421 歸屬函數

設定變數為目前轉速〈sspeed〉與轉速誤差〈dspeed〉因此此模糊控制器共

有兩個輸入訊號與一輸出訊號輸出訊號為脈寬長度該加或是減多少又因為有

五種不同的轉速因此各分別設計了不同的歸屬函數如下

1 當轉速 = 0

ml h

s s p e e d

d s p e e d

r p m0 5 0 1 0 0- 5 0- 1 0 0

mv l l h v h

r p m0- 3 0- 6 0- 1 0 0 3 0 6 0 1 0 0 圖 42 停止時之歸屬函數

2 正轉〈慢〉

ml hsspeed

dspeed

rpm150 225 300750

mvl l h vh

rpm150100500 200 250 300

圖 43 正轉〈慢〉之歸屬函數

39

3 正轉〈快〉

ml hsspeed

dspeed

rpm520 670 820370220

mvl l h vh

rpm500400300200 600 700 800

圖 44 正轉〈快〉之歸屬函數

4 逆轉〈慢〉

ml hsspeed

dspeed

rpm100 250 400500

mvl l h vh

rpm10050250 200 300 400 圖 45 逆轉〈慢〉之歸屬函數

40

5 逆轉〈快〉

ml hsspeed

dspeed

rpm300 450 600150

mvl l h vh

rpm450350250150 550 650 750

750

圖 46 逆轉〈快〉之歸屬函數

6 輸出

OutputMVL L H VH

rpm0-50-150-250 50 150 250

圖 47 輸出之歸屬函數

41

422 模糊規則庫

表 41 為吾人所設計的模糊控制規則庫並利用 Matlab 之 Fuzzy ToolBox 來

建立此規則庫以進行模擬推論圖 48 為當馬達輸入指令為正轉慢時推論後所得

到的三維空間圖

表 41 模糊控制規則表

Dspeed

vl l m h vh

l H M L VL VL

m VH H M L VL sspeed

h VH VH H M L

圖 48 推論後的三維空間圖

42

423 模糊控制器之軟體設計流程

Start 外部中斷副程式

ADCWR = 0 ADCWR = 1

〈令AD開始轉換〉

檢查鍵值以得到對應的歸屬函數

取得目前轉速與

轉速誤差

Fuzzy Rules決策

得到輸出訊號

Delay 10ms

ADC = 0 讀取AD值 ADCRD = 0

將AD值換算成轉速

ADCWR = 0 ADCWR = 1

〈AD開始轉換〉

返回主程式

致能外部中斷

圖 49 Fuzzy Controller 程式流程圖

當控制器一開始動作時便先執行AD轉換的工作當AD轉換完成時其

INTR的接腳便會觸發8051的外部中斷INTR0於是程式便發生外部中斷執行

外部中斷副程式的指令

43

在外部中斷副程式中AD將ㄧ直進行轉換與讀取的工作同時並將轉換後

的值直接換算成目前轉速與轉速誤差以供模糊控制器使用換算目前encoder

的頻率其公式為

160-V2000 times=頻率 〈4-1〉

式4-1之公式是根據表31所導出來的其中V為encoder之頻率轉成電壓之值

又假設所讀取的AD轉換值為value因為

AD的解析度 = bit256

5V+ = 511 ( Vbit ) 〈4-2〉

故value值與電壓V之關係為

511 value V times= 〈4-3〉

所以encoder之頻率與value值的關係為

頻率= 2000times ⎟⎠⎞

⎜⎝⎛ times

511 value - 160 〈4-4〉

故目前轉速為

sspeed = ( )rpm 60 200

times頻率 〈4-5〉

另ㄧ方面在主程式中程式會先去檢查鍵值也就等於檢查輸入指令以

找出符合使用的歸屬函數並將AD所獲得的轉速對應到歸屬函數中然後執行

決策判斷即進入規則庫中尋找出適當的決策判斷最後將此決策送入PWM程

式裡進行脈寬長度的調整使馬達在合理的要求下達到理想的轉速控制不會

因為外在環境的影響而使馬達轉速受到干擾

43 LCD 顯示轉速

此專題最後再增加一LCD顯示幕以顯示目前的轉速否則在程式設計完成

後人卻因無法以肉眼得知目前轉速而不能肯定馬達轉速是否有達到控制的目

標因此增加一顯示幕LCD是有必要的不僅隨時得知目前的轉速還能知道

44

設計出來的軟體其控制性是否夠好夠穩定

431 LCD 顯示幕之軟體流程

Start

設定LCD模組的初始狀態

設定外部中斷INTR0

與Timer0

設定TH0 = (65536 ndash 5000) 256 TL0 = (65536 ndash 5000)256

令ADCWR = 0 ADCWR = 1 AD開始轉換

等待中斷

外部中斷副程式

ADCRD = 0 讀取AD值 ADCRD = 1

將AD值換算成速度

ADCWR = 0 ADCWR = 1 AD開始轉換

Timer0中斷副程式

顯示LCD第一行

ldquoMotor Speed =

顯示LCD第二行ldquoxxxxxxx rpm其中 xxxxxx為外部中斷副程式所換算出的轉速

重設TH0與TL0

返回主程式返回主程式

圖 410 LCD 顯示幕之程式流程圖

此程式主要由兩個部分完成一為外部中斷副程式另ㄧ為 Timer0 中斷副

程式當主程式完成外部與 Timer0 兩個中斷的設定後隨即命令 AD 開始轉換

之後便一直停在 while〈1〉的迴圈裡不做任何動作而由兩個中斷副程式來完

成整個轉換與顯示的工作

45

外部中斷副程式主要負責 AD 的轉換讀取與轉速換算的工作AD 第一

次的轉換由主程式來下達命令當轉換完成後AD 的 INTR 接腳將觸發外部中

斷〈INTR0〉副程式此時程式便進入外部中斷副程式執行讀取 AD 值與轉速

換算的工作當這些工作完成時外部中斷副程式再次下達 AD 開始轉換的命

令而離開中斷副程式當 AD 再次轉換完成時又將再次執行中斷副程式

如此週而復始中斷副程式將ㄧ直進行讀取換算與轉換的工作

而 Timer0 中斷副程式主要負責 LCD 顯示之工作當主程式所設定的計時時

間計數完時程式便進入 Timer0 中斷副程式一旦進入 Timer0 中斷副程式程

式將執行 LCD 的顯示然後再重設 Timer0 的計數時間Timer0 將重新計數當

計數完時程式又將再度進入 Timer0 中斷副程式執行因為程式中並無清除

Timer0 的中斷致能故 Timer0 中斷副程式和外部中斷副程式ㄧ樣週而復始的

執行其副程式的工作

46

第五章 結論

本計劃主旨為具模糊控制理論與雙脈寬調變法之直流馬達驅動電路設計主

要是針對傳統電路設計之缺點提出改良之方法以TPWM取代PWM電路以模

糊理論基礎設計之控制器替代傳統PID控制器

TPWM轉速控制優於PWM之處在於

1 TPWM只需使用單電源即可達到正轉和逆轉的轉速控制而PWM必須

加上逆向開關或是雙電源才能使馬達產生正轉和逆轉

2 TPWM可控制馬達處於停止狀態無論在正向或逆向加上負載皆無法使

馬達產生轉動

3 馬達消耗定額功率輸出轉矩為額定值

4 馬達由停止到某定轉速時反應時間較快

模糊控制器優於PID控制器

1 不須導出繁雜的數學模型

2 適用於非線性系統

3 強健性與容錯性較高

本專題至此雖說大致的目標都已達到但是此系統仍然有許多不完美而需要

改進的地方例如在實驗過程中發現整個轉速的控制在回授上其反應時間

有點慢探討其原因有可能是控制器之程式上的問題

1 因為使用C語言撰寫程式故其執行速度較慢

2 程式可能寫的太累贅

3 模糊控制規則庫建立不良

若想改善這些問題可以嘗試著將C語言改為組合語言來撰寫並盡量減少

47

不必要的指令相信此動作一定能大大提昇程式的執行速度其次就是多做測

試利用測試中所學到的經驗來幫助模糊控制規則庫的改寫同時也能從測試中

發現更多的問題若是都能對問題加以一一解決的話相信必定能將此控制系統

做的更盡善盡美

48

參考文獻

﹝1﹞ 李適中直流馬達速度控制伺服控制〈基礎篇〉全華科技圖書股份有

限公司民 74

﹝2﹞ 廖錦文ldquo直流電動機之雙脈寬調變是〈TPWM〉驅動電路研究電

子技術月刊第 69 期pp94-1021992

﹝3﹞ 楊英魁孫宗瀛鄭魁香林建德蔣旭堂模糊控制理論與技術全華

科技圖書股份有限公司民 85

﹝4﹞ 林敦煌陳憬德直流馬達定位及轉速的模糊控制逢甲大學自動控制工

程學系學士論文民 87

﹝5﹞ LAZadehldquo Fuzzy Sets Information and Control Vol8 pp338-353

1965

﹝6﹞ EHMamdani and SAsslianldquo A fuzzy logic controller for a dynamic

plant Internation Journal of Man-Machine Studies Vol7 pp1-13 1975

﹝7﹞ 孫宗瀛楊英魁Fuzzy 控制理論實作與應用全華科技圖書股份有

限公司民 83 年

﹝8﹞ 許中平黃煌嘉直流電動機控制電路設計全華科技圖書股份有限公司

民 75

﹝9﹞ 盧明智黃敏祥OP Amp 應用+實驗模擬全華科技圖書股份有限公司

民 83

﹝10﹞陳文耀電動機控制工程復文書局2003

﹝11﹞許中平林全福電動機運轉控制技術全華科技圖書股份有限公司民

77

﹝12﹞楊明豐8051 單晶片 C 語言設計實務碁峯資訊2003 年

﹝13﹞蔡朝洋單晶片微電腦 80518951 原理與應用全華科技圖書股份有限公

司民 91

49

﹝14﹞王文俊認識 Fuzzy全華科技圖書股份有限公司民 90

50

附錄 A 專題硬體展示圖

圖 A-1 硬體整體圖

圖 A-2 硬體整體鳥瞰圖

51

圖 A-3 硬體側視圖

圖 A-4 操作與顯示面板

圖 A-5 間距脈波電路與 FV 電路

52

圖 A-6 橋型驅動功率放大電路

圖 A-7 操作與控制面板

53

附錄 B PWM 與模糊控制之程式

include reg51h include stdioh sbit ADCRD = P3^1 設定 RD 控制線接腳為 P31 sbit ADCWR = P3^3 設定 WR 控制線接腳為 P33 sbit P2_0 = 0xA0 接腳定義 sbit P2_1 = 0xA1 接腳定義 sbit P3_0 = 0xB0 接腳定義 sbit P3_1 = 0xB1 接腳定義 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P3_6 = 0xB6 接腳定義 void KeyStatus(void) 函數原型宣告 void feedback(void) 函數原型宣告 void compute_grade(void) 函數原型宣告 void delay1ms(int count) 函數原型宣告 void convert() 函數原型宣告 void condition() 函數原型宣告 void CW(void) 函數原型宣告 int j i 對應 PWM 的寬度 unsigned int temp 所設計的計時器時間 int sample = 1000 取樣率設定消除顯示值跳動 long int value r1 讀取 ADC0804 數位資料 long int set n condition select long int r grade_reg[2] grade[15] error1 error2 long int a1 b1 I long int membership[5][3]membership1[3][3] 定義歸屬函數 long int membership2[3][3] = -10-50-5050510 long int error[2] int Rule[15][3] = 113213313 定義判斷規則庫 212223323 311232333 411241342 511251351

54

main() 主程式 j = PWM = 110 設定 PWM 初始值 IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x00 設定計時器 0 工作於模式 0 temp=8192-j4 設定計時器 0 初值 TH0 = temp 32 TL0 = temp 32 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 P3_4 = 1 P3_5 = 0 P3_6 = 0 ADCWR = 0 令 ADC0804 的 WR = 0 ADCWR = 1 令 ADC0804 的 WR = 1 while (1) KeyStatus() 檢查鍵值 void KeyStatus(void) 檢查鍵值並給對應的 PWM 值 char KeyScan(void) 按鍵掃描函數宣告 unsigned char KeyStatus unsigned char Key = 0 KeyStatus=KeyScan() 呼叫按鍵掃描函數 if (KeyStatus = 0) 已有按鍵輸入 Key = KeyStatus Key = 鍵值 if (Key == 0x01) 假如輸入為按鍵 1 i = 110 PWM 為 110us j = i P3_4 = 1 LED 亮第一顆〈表馬達停止〉 P3_5 = 0 P3_6 = 0

55

else if (Key == 0x02 ) 假如輸入為按鍵 2 i = 140 PWM 為 140us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x04 ) 假如輸入為按鍵 3 i = 180 PWM 為 180us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x08 ) 假如輸入為按鍵 4 i = 80 PWM 為 80us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 else if (Key == 0x10 ) 假如輸入為按鍵 5 i = 40 PWM 為 40us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 PWM = j delay1ms(10) 呼叫延遲函數 feedback() 模糊控制判斷

56

void To_int(void) interrupt 1 Timer0 中斷函數 if (P3_0 == 0) 假如 PWM 輸出為 Low P3_0 = 1 變更 PWM 輸出為 High temp=8192-j4 設定 High 的時間 else 若 PWM 輸出為 High P3_0 = 0 變更 PWM 輸出為 Low temp=8192-880+j4 設定 Low 的時間 TH0 = temp 32 Timer0 的計時時間 TL0 = temp 32 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 char KeyScan(void) 檢查鍵值 char KeyStatus 按鍵狀態 P0=0xff 設定 P0 為輸入模式 KeyStatus=~P0 讀取按鍵狀態 return(KeyStatus) 將鍵值送回程式 void feedback(void) 模糊判斷 void Fuzzycontroller() 函數原型宣告 void condition1() 函數原型宣告

57

void condition2() 函數原型宣告 error1 = ((value)40-160)03 輸入變數 1 delay10ms(10) 延遲 10ms error2 = ((value)40-160)03 輸入變數 2 if (key == 0x01 ) 當按鍵 1找出對應的歸屬函數 並做出模糊控制判斷

int membership[5][3]= -100-60-30-60-300-30030030603060100

int membership1[3][3]=-100-500-50050050100 Fuzzycontroller() condition() if (key == 0x02 ) 當按鍵 2找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

05010050100150100150200150200250200250300 int membership1[3][3]=07515075150225150225300 Fuzzycontroller() condition() else if (key == 0x04) 當按鍵 3找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

200320400300400500400500600500600700600700800 int membership1[3][3]=220370520370520670520670820 Fuzzycontroller() condition() else if (key == 0x08) 當按鍵 4找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

02550255010050100200100200300200300400 int membership1[3][3]=05010050100250100250400 Fuzzycontroller() condition()

58

else if (key == 0x10) 當按鍵 5找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

150250350250350450350450550450550650550650750 int membership1[3][3]=150300450300450600450600750 Fuzzycontroller() condition2() void Fuzzycontroller() 模糊控制判斷 void compute_grade() 函數原型宣告 void compute_grade1() 函數原型宣告 a1 = 0 b1 = 001 I = 0 for (n=0 nlt=14 n++) r = error1 set = Rule[n][0]-1 compute_grade() 計算輸入變數 1 與

模糊程度的歸屬函數 condition = 1 r = error2 set = Rule[n][1]-1 compute_grade1() 計算輸入變數 2 與 模糊程度的歸屬函數 grade[n] = MIN(grade_reg[0] grade_reg[1]) a1 = a1 + (grade[n]membership2[Rule[n][2]-1][1]) b1 = b1 + grade[n] I = a1 b1 得到模糊控制判斷的結果 void compute_grade() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership[set][0]) || (r gt membership[set][2])) 當輸入變數不在 歸屬函數內

59

grade_reg[condition] = 0 else if ((r gt membership[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership[set][2]-r) (membership[set][2] - membership[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership[set][0]) (membership[set][1] - membership[set][0]) void compute_grade1() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership1[set][0]) || (r gt membership1[set][2])) 當輸入變數不在 歸屬函數內 grade_reg[condition] = 0 else if ((r gt membership1[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership1[set][2]-r) (membership1[set][2]-membership1[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership1[set][0]) (membership1[set][1]-membership1[set][0])

60

void condition() P2_0 = 1 設定 P20 為輸入模式 P2_1 = 1 設定 P21 為輸入模式 if ( (P2_0 == 1) ampamp (P2_1 == 0)) 當馬達為正轉時 if ( I gt 0 ) 若模糊判斷結果為正 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 若模糊判斷結果為零 PWM = PWM + 0 PWM 寬度不變 if ( I lt 0 ) 若模糊控制結果小於零 PWM = PWM + 1 PWM 寬度加 1 else if ( (P2_0 == 0) ampamp (P2_1 == 1) ) 若馬達為反轉 if ( I lt 0 ) 模糊控制小於零 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 模糊控制等於零 PWM = PWM + 0 PWM 寬度不變 if ( I gt 0 ) 模糊控制大於零 PWM = PWM + 1 PWM 寬度加 1 CW() 判斷 PWM 寬度上下限

61

void CW() 判斷 PWM 寬度上下限 if ( PWM gt= 215 ) 若 PWM 寬度 gt= 最大寬度 j = 215 PWM 寬度維持於 215us if ( PWM lt= 5 ) 若 PWM 寬度 lt= 最小寬度 j = 5 PWM 寬度維持在 5us if ( PWM gt 5 ampamp PWM lt 215 ) PWM 寬度介於最大與最小間 j = PWM PWM 依模糊控制判斷結果增減 void delay1ms(int count) 延遲 1ms int x y for ( x = 0 x lt count x++ ) for ( y = 0 y lt 122 y++ ) void convert() 數位資料換算成馬達轉速 r1 = ((value)40)-160

62

附錄 C LCD 顯示之程式

includereg51h 含 8051 所有暫存器宣告 include mathh define RS P3_5 LCD 指令資料選擇控制 define RW P3_4 LCD 讀寫控制腳 define Enable P3_3 LCD 致能接腳 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P0_0 = 0x80 接腳定義 sbit P0_1 = 0x81 接腳定義 sbit P0_2 = 0x82 接腳定義 sbit P0_3 = 0x83 接腳定義 sbit P0_4 = 0x84 接腳定義 sbit P0_5 = 0x85 接腳定義 sbit P0_6 = 0x86 接腳定義 sbit ADCRD = P3^7 設定 RD 控制線接腳為 P37 sbit ADCWR = P3^6 設定 WR 控制線接腳為 P36 void delay(void) 函數原型宣告 void delay10ms(int count) 函數原型宣告 void display(void) 函數原型宣告 void InitialLCD(void) 函數原型宣告 void WriteIns(char) 函數原型宣告 void WriteData(char) 函數原型宣告 void WriteString(charchar) 函數原型宣告 void CheckBusy(void) 函數原型宣告 void convert(void) 函數原型宣告 char MSG0[] = Motor Speed = 定義字串 MSG0 char MSG2[] = rpm 定義字串 MSG2 unsigned char MSG1[8]=0000000 定義字串 MSG1 unsigned long int value 讀取 ADC0804 數位資料 int sample = 1000 取樣率設定消除顯示值跳動 long int rpm

63

main() 主程式 InitialLCD() 初始化 LCD IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x01 設定計時器 0 工作於模式 1 TH0 = (65536-5000)256 設定計時器 0 初值 TL0 = (65536-5000)256 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 while(1) 等待中斷 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 while (--sample == 0) 取樣率減 1 sample = 1000 重設取樣率 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 void T0_int(void) interrupt 1 LCD 顯示動態掃描 display() 動態掃描顯示 TH0 = (65536-65535)256 重設計時初值 TL0 = (65536-65535)256

64

void InitialLCD(void) 設定 LCD 模組初始狀態 delay() 延遲函數 WriteIns(0x38) 設定 LCD 模組為 WriteIns(0x38) 2 行顯示 WriteIns(0x38) 8 位元介面 WriteIns(0x38) 5x7 點字型 WriteIns(0x08) 關閉顯示器 WriteIns(0x01) 清除 LCD 螢幕 WriteIns(0x0c) 令顯示器 ON但游標不顯示 WriteIns(0x06) 令 LCD 模組每接收到 1Byte 資料 AC 值自動加 1 void display() 掃描顯示 WriteIns(0x80) 設定 LCD 座標 WriteString(13MSG0) 將字串 MSG0 寫入 LCD 中 WriteIns(0xc0) 設定 LCD 座標 WriteString(8MSG1) 將字串 MSG1 寫入 LCD 中 WriteIns(0xc8) 設定 LCD 座標 WriteString(4MSG2) 將字串 MSG2 寫入 LCD 中 void convert(void) 換算轉速 long int freq freq = ((value)4000) - 16000 數位資料換成頻率公式 rpm = freq3 頻率換算轉速公式 MSG1[0] = (rpm1000000)+0x30 將結果存入字串 MSG1 中 MSG1[1] = ((rpm1000000)100000)+0x30 MSG1[2] = ((rpm100000)10000)+0x30 MSG1[3] = ((rpm10000)1000)+0x30 MSG1[4] = 0x2e MSG1[5] = ((rpm1000)100)+0x30 MSG1[6] = ((rpm100)10)+0x30 MSG1[7] = rpm10+0x30

65

void WriteIns(char instruction) 寫命令至 LCD 中 RS = 0 選擇指令暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = instruction 輸出命令至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteData(char i) 寫資料至 LCD 中 RS = 1 選擇資料暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = i 輸出資料至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteString(countMSG) 寫字串至 LCD 中 char count 字串長度 char MSG[] 字串資料 char i 定義位元組變數 for(i=0 iltcount i++) count 個位元組 WriteData(MSG[i]) 寫入一位元組的資料至 LCD 中 void CheckBusy(void) char i=0x80 檢查忙碌旗標 while(iamp0x80) 忙錄旗標 BF = 1 RS = 0 選擇指令暫存器 RW = 1 讀取 Enable = 1 致能 LCD i = P2 讀取 LCD 指令暫存器內的資料

66

Enable = 0 除能 LCD delay() 延遲函數 void delay() 延遲 5ms int i for(i=0 ilt250 i++)

  • 畢業專題封面pdf
  • File0004pdf
  • 最終版pdfpdf
Page 3: Based on Fuzzy Control Theorem and TPWM Method for DC ... · 使吾人想設計一模糊控制器來做為馬達轉速的閉迴路控制,以解決非線性系統的 問題。除此之外,flcs

II

中文摘要

雙脈波寬度調變式〈Two Pulse Width Modulation〉驅動電路為數位邏輯電

路在實用上可開發成積體電路模組〈module〉縮小佔用空間維修替換簡便

結合微電腦控制其應用發展領域更顯寬廣主要特色不論電動機是正反轉

或速度快慢亦或停止均消耗定額功率因此輸出轉矩保持在額定值系

統於寬廣的速度變換範圍內仍具有良好的伺服性能電機的旋轉扭力不因速度

及負載而受影響使伺服控制達到某一預定的特性範圍

馬達的轉速會因其驅動機構的慣性影響不可能「說停就停」也會因為摩

擦力等影響不可能「說動就動」故對其操控指令一定會有延遲的現象發生

這些因素使馬達不是一個典型的線性系統故傳統的 PID 控制器就不是最好的

選擇再加上近年來模糊控制系統〈Fuzzy Logic Control SystemFLCS〉的發展

使吾人想設計一模糊控制器來做為馬達轉速的閉迴路控制以解決非線性系統的

問題除此之外FLCS 在上升時間安定時間和超越量上的要求也都優於傳統

的 PID 控制器

主旨為具模糊控制理論為基礎之雙脈寬調變直流馬達驅動電路之設計有

別於傳統上之 PID 脈寬調變控制技術而達到轉速控制的回授系統

III

Abstract

Use Two Pulse Width Modulation(TPWM) driver circuit by Fuzzy Logic

Control System(FLCS) to replace conventional PWM circuit with PID control system

has many advantages

TPWM is digital logic circuit which can be developed into integrated circuit

micro chips for easy maintenance and installation When incorporate with micro

computing TPWM has wide range of applications The major advantages of the

TPWM driver circuit by FLCS are

When performing on and off forward reverse or variable speed TPWM requires

the same power and will not effect torque in performing desirous of speed under

different loading

Convention motor circuit does not compete spinning motorrsquos inertia when

control to stop therefore the motor takes some time to slow to a stop Also due to

same factor the conventional motor circuit can not accelerate the motor to desirous of

speed in the same instant the motor is turned on Whereas TPWM circuit can make

the motor stop in instant and spin up to desirous of speed when turned on without

convention motor circuitrsquos delay

Convention PID controller for motors is not the best control system because the

motor is not a linear system as PID controller assumed Recent development on FLCS

is specialize in solving this conflict because its performance of rise time setting time

and overshoot are all better than PID controller

Based on fuzzy control theorem and TPWM method for dc motor driver circuit

design is different from conventional PWM circuit with PID controller in order to get

up to the speed feed back control system

IV

目錄

誌 謝 I

中文摘要 II

Abstract III

目錄 IV

圖目錄 VI

表目錄 VIII

第一章 緒論 1

11 前言 1 12 研究動機 2 13 研究方法 3 14 研究目標 4

第二章 原理探討 5

21 模糊控制與理論 5 211 模糊理論概述 5 212 模糊集合 6 213 歸屬函數 7 214 模糊推論與模糊規則 10 215 模糊控制器 11

22 直流馬達數學模型 14

第三章 系統功能分析與製作規劃 17

31 專題製作流程 17 32 雙脈寬調變法之直流馬達驅動電路設計 18

321 脈寬調變電路 18 322 橋型驅動功率放大電路 23 323 間距脈波產生電路 26

33 編碼器 27 34 LM2917 FV 電路設計 29 35 單晶片介面電路 31

351 AD 轉換31 36 電源供應系統 33 37 馬達轉速的量測 34

V

第四章 軟體規劃與製作 36

41 PWM 之軟體設計 36 411 PWM 軟體流程 36

42 模糊控制之程式規劃與撰寫 37 421 歸屬函數 38 422 模糊規則庫 41 423 模糊控制器之軟體設計流程 42

43 LCD 顯示轉速43 431 LCD 顯示幕之軟體流程 44

第五章 結論 46

參考文獻 48

附錄 A 專題硬體展示圖 50

附錄 B PWM 與模糊控制之程式53

附錄 C LCD 顯示之程式 62

VI

圖目錄

圖 11 單象限控速系統運作於第一象限2 圖 211 正規且凸模糊集合7 圖 212 正規非凸的模糊集合7 圖 22 吊鐘型歸屬函數8 圖 23 三角型歸屬函數9 圖 24 梯型歸屬函數9 圖 25 模糊控制系統的構造11 圖 26 模糊系統的基本架構13 圖 27 直流馬達等效電路簡圖14 圖 28 直流馬達數學模式方塊圖16 圖 31 專題製作流程圖17 圖 32 脈寬調變電路18 圖 33 三角波產生電路19 圖 34 三角波輸出波形21 圖 35 脈寬調變電路22 圖 36 三角波與反相輸入電壓比較22 圖 37 PWM 輸出波形 23 圖 38 橋型驅動功率放大電路24 圖 39 橋型驅動功率放大電路實體圖24 圖 3101 呈現不感帶的轉移函數25 圖 3102 輸出電壓波形25 圖 311 間距脈波產生電路26 圖 312 間距脈波27 圖 313 光學式轉動編碼器的原理圖28 圖 314 編碼器的輸出信號波形28 圖 315 FV 電路 29 圖 316 頻率對電壓曲線31 圖 317 直流電源電路33 圖 318 直流電源電路實體圖34 圖 319 PWM 輸出對應 encoder 週期 35 圖 41 PWM 軟體設計流程圖 36 圖 42 停止時之歸屬函數38 圖 43 正轉〈慢〉之歸屬函數38 圖 44 正轉〈快〉之歸屬函數39 圖 45 逆轉〈慢〉之歸屬函數39 圖 46 逆轉〈快〉之歸屬函數40

VII

圖 47 輸出之歸屬函數40 圖 48 推論後的三維空間圖41 圖 49 Fuzzy Controller 程式流程圖 42 圖 410 LCD 顯示幕之程式流程圖44 圖 A-1 硬體整體圖 50 圖 A-2 硬體整體鳥瞰圖 50 圖 A-3 硬體側視圖 51 圖 A-4 操作與顯示面板 51 圖 A-5 間距脈波電路與 FV 電路 51 圖 A-6 橋型驅動功率放大電路 52 圖 A-7 操作與控制面板 52

VIII

表目錄

表 31 頻率與轉換電壓之關係30 表 33 PWM 輸出對應 encoder 週期 34 表 41 模糊控制規則表41

1

第一章 緒論

11 前言

在現代的工程應用裡馬達扮演一個非常重要的角色它在機械設備中就好

像人的心臟一樣提供了機械運轉所需要的動力源以做為能量轉換或控制機能

的實行在眾多的馬達種類當中直流馬達不僅具有許多良好的特性例如高

啟動轉矩較易線性控制hellip等且其週邊控制元件充足控制理論發展成熟所

以被廣泛的應用在工業日常生活上馬達的速度控制被廣泛的應用在各種加工

機械航空機械農業機械交通工具等用途

直流電動機之轉速控制目前最常被使用的一種方法為脈波寬度調變〈PWM〉

驅動電路並結合傳統的 PID 控制器脈寬調變是一種以固定的頻率波寬可

調的輸出開閉供應的直流電壓使馬達感受到的平均電壓可以調整進而控制馬

達的轉速

我們日常生活中處處存在著非線性的現象但是我們較熟悉處理的卻是線

性的系統對於傳統 PID 控制器來說必須先知道受控系統〈plant〉的數學模

型否則無法導出其控制演算法則且其強健性與容錯性較低然而對於非線性

系統則不適合此法因此近年來對於非線性系統的研究工作已有許多學者嘗試

應用模糊理論〈Fuzzy Theory〉類神經網路〈Artificial Neural Networks〉基因

演算法〈Genetic Algorithms〉等非傳統方法且已有不錯之成效因此以模糊控

制理論之方法取代傳統的 PID 控制器來控制馬達轉速

對於一個非線性時變系統〈Nonlinear Time Variant System〉模糊控制理論

不但能簡化數學模型並且可以結合人類的操作經驗有效的達成控制目標模

糊控制能將操作者的專家經驗換成控制器設計人員的設計理念勢必擁有比一般

傳統的控制器更加的強健性與容錯性

2

12 研究動機

現今直流馬達的轉速控制多廣泛使用脈波寬度調變式〈Pulse Width

Modulation簡稱 PWM 驅動電路〉此種電路是以控制固定頻率的開閉供應直流

電壓以得到波寬可調的輸出使馬達的平均電壓可以調整進而轉移到馬達的

平均功率而達到轉速的控制但是由於 PWM 為一種單象限控制只運作於第一

象限這種系統本身無法產生負轉矩未加上逆向開關前亦無法反向因此無法

作用於第三象限系統加上動力制動後方可以有限度地產生逆向轉矩而運作於

第二象限〈見圖 11〉然而這也只是一種被動控制區間﹝1﹞

主動控制區動力制動

(被動運作)

Ⅱ Ⅰ

Ⅲ Ⅳ

ω

TCWCCW

圖 11 單象限控速系統運作於第一象限

本研究主要目的之一就是針對 PWM 之缺失提出了改良的方法於前級驅

動電路產生正反方向的兩個脈波信號再經驅動功率放大之後使馬達產生正

反轉向的兩拉力此即為雙脈波寬度調變式(Two Pulse Width Modulation簡稱

TPWM)本控制主要特色不論電動機正轉反轉速度快慢或停住均消

耗定額功率〈即馬達無時無刻都在運轉且輸出轉矩為額定值〉系統於寬廣的

速度變化範圍內仍具有良好的伺服性能馬達的旋轉扭力不會因速度及負載的

變化而受影響使伺服控制系統達到某一預定的特性範圍﹝2﹞

3

此外馬達的轉速會因其驅動機構的慣性影響不可能「說停就停」也

會因為摩擦力等影響不可能「說動就動」故對其操控指令一定會有延遲的

現象發生這些因素使馬達不是一個典型的線性系統故傳統的 PID 控制器就

不是最好的選擇再加上近年來模糊控制系統〈Fuzzy Logic Control System

FLCS〉的發展﹝3﹞使吾人想設計一模糊控制器來做為馬達轉速的閉迴路控

制以解決非線性系統的問題除此之外FLCS 在上升時間安定時間和超

越量上的要求也都優於傳統的 PID 控制器[4]

目前雖然有很多從事於馬達轉速控制的相關研究但是多採用脈波寬度調

變法且其尚有缺失待改良因此吾人想採用雙脈波寬度調變雖然有關此法

的研究並不多見但 TPWM 卻具有 PWM 所沒有的優點再加上近來發展愈

盛的模糊控制理論較傳統 PID 控制器的優點相信馬達轉速以 TPWM 驅動電

路之模糊控制是值得去加以研究和探討的

13 研究方法

本專題計畫其研究方法主要分為兩大類一為硬體結構電路設計另一為

Fuzzy 控制器之軟體製作硬體結構方面主要設計一比較放大器使其誤差值經

此電路與三角波比較而輸出 A 驅動信號脈波與 B 驅動信號脈波然後再由驅動

功率放大電路將信號脈波放大後控制馬達正逆轉此外為了確保功率放大電

路之安全性需在其之前加上一間距產生電路以防止其電路損毀

感測器方面則利用編碼器〈encoder〉感測出馬達的轉速然後再經由 FV

將其轉換為電壓此電壓再由 AD 轉換為數位信號送入單晶片 8051經由模

糊控制規則庫判斷並做出決策以達到馬達轉速的控制

4

14 研究目標

本專題研究目標如下

〈1〉 完成相關文獻資料之蒐集整理與討論

〈2〉 完成 AB 信號產生電路設計

〈3〉 完成間距脈波產生電路設計

〈4〉 完成驅動功率放大電路設計〈橋型驅動功率放大〉

〈5〉 完成 FV 電路設計

〈6〉 完成 AD 訊號轉換

〈7〉 編寫模糊控制法則與介面軟體設計

5

第二章 原理探討

21 模糊控制與理論

在傳統的控制領域裏控制系統動態模式的精確與否是影響控制優劣的最主

要關鍵系統動態的資訊越詳細則越能達到精確控制的目的然而對於複雜

的系統由於變數太多往往難以正確的描述系統的動態於是工程師便利用各

種方法來簡化系統動態以達成控制的目的但卻不盡理想換言之傳統的控

制理論對於明確系統有強而有力的控制能力但對於過於複雜或難以精確描述的

系統則顯得無能為力了因此便嘗試著以模糊數學來處理這些控制問題模糊

控制是屬於非線性式的控制在受控系統無法以線性數學模式精確描述的情況

下經由適當調整控制規則應具有比傳統控制方法更佳的控制性能

211 模糊理論概述

1965 年美國加州柏克萊分校的 LotfiAZadeh 教授首先在他主編的

「Information and Control」刊物上提出「Fuzzy Set」論文此為模糊邏輯理論的

創始模糊理論在經過了三十幾年的演化改進後無論是在應用或理論架構上

皆已日趨完備尤其近年來因人工智慧的迅速發展模糊理論儼然成為人工智慧

不可或缺的理論根基

Zadeh 教授曾提出一個互克性原理﹝5﹞「當系統的複雜性增長時對系統

特性做精確且有意義描述的能力亦相對降低最後精確性與有意義性將變成完全

互相排斥的特性」很高的複雜性意味著只能在一個刻意壓縮的低維因素空間觀

察而無法對問題的全部因素都進行考察使得原本是明確的概念變的模糊

Fuzzy 理論正是為了掌握這類具模糊特質的事物而發展出來的所以它的應用較

偏重於人類的經驗及對問題特性的掌握程度不主張用繁雜的數學分析及數學模

式來解決問題

Fuzzy 理論把傳統數學從二值邏輯〈binary logic〉擴展到連續多值〈continuous

6

multi-value〉利用歸屬函數〈membership function〉描述一個概念的程度亦及

使用 0 和 1 之間的數值來表示一個元素屬於某一概念的程度這個值稱為元素對

集合的歸屬度〈membership grade〉當歸屬度為 1 時表示該元素百分之百屬於

這個概念當歸屬度為 0 時則表示該元素完全不屬於這個概念介於兩者之間

的就是完全屬於和完全不屬於之間的灰色地帶

模糊理論的工程應用大約始於 1974 年倫敦大學的 EHMamdani 教授他根

據 Zadeh 提出的語言分析法〈linguistic approach〉及模糊推論〈fuzzy inference〉

運用 IF-THEN 形式的法則來敘述操作員的控制策略成功地應用在蒸汽機自動

運轉上﹝6﹞從此模糊理論的應用便迅速發展以在控制方面的研究成果最為

顯著模糊理論其實是一門相當生活化的學問由於使用語言變量描述因此更

具親和力與一般性人類日常生活所遇所用的一些敘述即大都是模糊的例如

那個人ldquo很高車開的ldquo很快等等其中ldquo很高ldquo很快並不是一個

明確值而只是描述事件的程度但是根據這些描述人類卻能很輕易的接收

212 模糊集合

模糊集合〈fuzzy set〉可視為傳統集合的擴張在模糊集合的世界中稱傳

統集合為明確集合〈crisp set〉所謂模糊集合是指用來表示界限或邊界不分明的

模糊概念的集合許多日常生活中的概念常常都不是清晰明確的這些可說是模

糊概念例如很高很快等這類概念無法用傳統的二值集合論即 0 或 1 表示

而Zadeh教授提出的Fuzzy集合論可以將這些概念由傳統集合論的特徵函數從非

0 即 1 的二值選擇推廣為從 0 到 1 之間的任何值做選擇得到新型的特徵函數

稱為歸屬函數

模糊集合由歸屬函數表示相對於明確集合的特徵函數其值只有 0 或 1 兩個

值即其值為在實軸閉區間[01]之中的任一實數模糊集合可以彌補明確集

合描述時所產生的不合理現象因此模糊集合比傳統的明確集合更具客觀性

7

213 歸屬函數

歸屬函數〈membership function〉為 0 到 1 之間的數值吾們可以藉由歸屬

函數來描述 Fuzzy 集合的特質它是 Fuzzy 理論的最基本觀念透過歸屬函數我

們才能對 Fuzzy 集合進行量化也才可能利用精確的數學方法分析處理模糊性資

歸屬函數在 Fuzzy 控制的應用範疇內都要具備凸〈convex〉及正規〈normal〉

等基本特性〈如圖 21〉歸屬度函數的定義可以分為數值及函數兩種數值定義

方式又稱為離散化歸屬函數它是直接給定有限 Fuzzy 集合內每個元素的歸屬

度並以向量的形式表現出來函數定義方式又稱為連續化歸屬函數它是以不

同形式的函數來描述 Fuzzy 集合

圖 211 正規且凸模糊集合

1

0 圖 212 正規非凸的模糊集合

8

一個模糊集合的歸屬函數可以有許多方式但是目前最廣泛使用的有吊鐘

型三角型梯型等歸屬函數

〈1〉吊鐘形歸屬函數

吊鐘形歸屬函數定義如下

μA=bell(xabc)= b

acx 2

1

1minus

+

〈21〉

圖 22 吊鐘型歸屬函數

〈2〉三角形歸屬函數

三角形歸屬函數可由三個參數(abc)來加以決定

=Aμ trangle(xabc)

⎪⎪⎪

⎪⎪⎪

ltleminusminus

ltleminusminus

=

other

cxbcbcx

bxaabax

0

〈22〉

其中a為歸屬函數左邊界b為歸屬函數中心值c為歸屬函數右邊界

9

圖 23 三角型歸屬函數

〈3〉梯型歸屬函數

梯型歸屬函數可由四個參數加以決定

=Aμ trapezoid(xabcd)

⎪⎪⎪⎪

⎪⎪⎪⎪

leleminusminus

ltle

ltleminusminus

=

other

dxcdcdx

cxb

bxaabax

0

1 〈23〉

圖 24 梯型歸屬函數

10

214 模糊推論與模糊規則

模糊推論〈fuzzy inference〉是根據知識庫保存的規則(rule)和給予的事實

推導出新的結論與傳統推論不同的地方是Fuzzy推論不只可以處理明確命題也

可以處理Fuzzy命題Fuzzy推論是依據近似推理〈approximate reasoning〉的概念

發展出來的比傳統推論的嚴正推理〈exact reasoning〉更合理也更具彈性近

似推理是兩種嚴正推理General Modus Ponens〈簡稱GMP〉及Genera Modus

Tollens〈簡稱GMT〉的一般化此原理是從傳統二值邏輯中的肯定律〈modus

ponens〉和否定律〈modus tollens〉推廣而來其中GMP又可稱為前向推理而

GMT則可稱為反向推理

〈1〉 GMP〈General Modus Ponens〉

規則IF x is A THEN y is B

事實x is Arsquo

結論y ix Brsquo 〈24〉

〈2〉 GMT〈General Modus Tollens〉

規則IF x is A THEN y is B

事實y is Brsquo

結論x is Arsquo 〈25〉

上式中IF x is A THEN y is B即為模糊規則〈fuzzy rules〉AArsquoBBrsquo

分別是定義在論域X及Y的模糊集合xy代表輸入變數及輸出變數的語言變數

一般來說「x is A」稱為前件部〈antecedent〉而「Y is B」則稱為後件部

〈consequence〉Fuzzy知識庫〈Fuzzy Knowledge Base簡稱FKB〉即由這些模

糊規則所組成的規則庫〈rule base〉和存放描述領域知識的Fuzzy變數及語言變數

的資料庫〈data base〉所組成所以FKB是用來描述受控對象所涉及的領域知

11

識和操控目標的一些定性及定量的資訊模糊知識庫和模糊推論是構成Fuzzy規

則系統核心的兩個重要部門﹝7﹞

模糊推論是模糊系統的核心根據知識庫的模糊法則進行模糊理論的合成運

算來模擬人類的思考決策模式一般來說規則的建立是採取十分主觀直覺的

方式依據相關領域專家的經驗與知識透過詢問進而將其知識經驗歸納條列出

重點再轉換成模糊規則的形式表現出來但是並非所有的專家或操作員都能

將自身的經驗知識以言詞的方式充分的表達出來且未必能整理成條列的模糊規

則所以知識規則的萃取工作往往是在建構模糊系統時最常遭遇到的困難之

215 模糊控制器

模糊控制是智慧型控制〈intelligent control〉系統的一種典型其基本特點

是不完全依賴受控對象的數學模型主要是利用人的操作經驗知識和推理技

術以及控制系統的某些訊息和性能得出對應的控制動作模糊控制是以並行

〈parallel〉方式處理規則的推理工作〈如圖25〉其近似推理會包容每個對操

控系統有貢獻的規則即使某些貢獻程度很小的規則也不會忽略

圖 25 模糊控制系統的構造

12

一個控制器的輸入通常是確定數值而非模糊輸出也是如此才能對被控對象

發生作用但是模糊邏輯控制器〈Fuzzy Logic Controller簡稱FLC〉則是以語

言化的控制規則為主體為了能夠把輸入的確定值與語言化之後的控制規則結

合必須把輸入的確定值模糊化〈fuzzification〉以便對應到FLC語言變數的論

域範圍中同樣的經過規則庫推理出來的結果是對應到輸出語言變數的論域

中所以也必須對其做解模糊化〈defuzzification〉的工作才能達成實際的控制

目標

一般模糊控制器的架構包含了五個主要部分定義變數模糊化知識庫

模糊推論及解模糊化

〈1〉 定義輸入及輸出變數

決定程序被觀察的狀況及考慮控制的動作輸入變數可以是擷取

自受控系統的觀測量也可以是推導出來的資料輸出變數則為操控

受控系統的操作量例如在一般控制問題上輸入變數通常為輸出

誤差e與輸出誤差之變化率e而控制變數則為下一個狀態之輸入

u其中eeu統稱為模糊變數

〈2〉 模糊化

將量測值轉換為語言變數的過程將外界所輸入的確定數值經由

一比例映射傳送到輸入變數所對應的模糊論域然後再利用模糊化

函數將此輸入資料轉換成適當的口語值以供模糊運算使用此口語

化變數稱之為模糊子集合

〈3〉 知識庫

模糊知識庫是模糊控制的依據由它來定義所有使用到的語言控

制法則及相關各項參數知識庫可說是整個控制系統資料核心其包

含了兩個部分資料庫〈data base〉與規則庫〈rules base〉

1 資料庫

提供處理模糊數據之相關定義資料庫所存放的資料是關

13

於如何將明確的資料轉換成模糊數值而資料的存放方式是以

歸屬函數表示該選用哪一種歸屬函數依實際的需要選定

以三角形歸屬函數最常被使用因其運算最為容易且又能充分

的表達模糊概念

2 規則庫

利用語言化的條件式控制規則描述控制目標和策略通常

控制規則可以由操控人員的經驗或專家的知識推導出來多個

控制規則所組成的集合就是規則庫

〈4〉 模糊推論

模糊推論為模糊控制最重要的核心其最主要的工作就是做實際

的決策過程處理模糊推論具有模擬人類做決策判斷的能力其基本

理論就是根據人類特有的近似推理方式如之前已說明的GMP和

GMTGMP為前向推理而GMT為逆向推理因為模糊推論為前向

運算因此GMP非常適合使用為模糊控制的推論機構

〈5〉 解模糊化

將推論完成所得到的模糊輸出量轉換成實際的明確數值以便和

外界溝通解模糊化的方法有很多例最大歸屬度法重心法高

度法面積法等

圖 26 模糊系統的基本架構

14

22 直流馬達數學模型

圖27為直流馬達等效電路簡圖其中

iV = 輸入電壓 ai = 電樞電流

zR = 電樞電阻 gT = 轉矩

aL = 電樞電感 bE = 反電動勢

φ = 空氣隙磁通量 ω = 轉子角速度

B = 黏滯摩擦係數 J = 轉動慣量

圖 27 直流馬達等效電路簡圖

由克希荷夫電壓定律知

( ) ( ) ( )tEdt

tdiLtiRV b

aaaai ++= 〈26〉

由於反電動勢 bE 與轉軸的角速度 ( )tω 及空氣隙磁通量φ之乘積成正比即

( ) ( ) ( )tKtKtE emb ωφω == 〈27〉

15

又轉矩的平衡方程式為

( ) ( ) ( )dt

tdJtBtTgωω += 〈28〉

且馬達轉矩 gT 與電樞電流 ( )tia 及空氣隙磁通量φ乘積成正比即

( ) ( ) ( )tiKtiKtT ataag == φ 〈29〉

取〈26〉~〈29〉式之拉氏變換得

( ) ( ) ( ) ( )sEssILsIRsV baaaai ++= 〈210〉

( ) ( )sKsE eb Ω= 〈211〉

( ) ( ) ( )sJssBsTg Ω+Ω= 〈212〉

( ) ( )sIKsT atg = 〈213〉

則馬達輸入電流與轉速為

( ) ( ) ( )( ) ( )( )

sR

sEsV

sLRsEsV

sIe

a

bi

aa

bia τ+

minus

=+minus

=1

〈214〉

( ) ( ) ( )

sB

sT

sJBsT

sm

gg

τ+=

+=Ω

1 〈215〉

其中a

ae R

L=τ 為電樞電流的電氣時間常數 BJ

m =τ 為馬達轉動的機械時間

常數

直流馬達轉速對輸入電壓的轉移函數 ( )sG 為

( ) ( )( ) ( )( ) etaa

t

i KKBJsRsLK

sVssG

+++=

Ω=

( )( ) etmea

t

KKssBRK

+++=

ττ 11 〈216〉

16

在一般情況電樞電感很小所以 eτ 可以忽略不計因此上式成為一階落後

方程式

( ) ( )( ) ( ) m

m

etma

t

i sTK

KKsBRK

sVssG

+=

++=

Ω=

11 τ 〈217〉

其中

eta

mam KKBR

BRT

+=

τ

eta

tm KKBR

KK

+=

所以直流馬達數學模式可以以圖28表之﹝8﹞

圖 28 直流馬達數學模式方塊圖

17

第三章 系統功能分析與製作規劃

31 專題製作流程

如圖 31 所示本專題主要分為兩條路徑進行一為硬體另一則為軟體程

式撰寫本章著重硬體的規劃設計軟體則在第四章中介紹在完成 AB 信號

產生電路驅動功率放大電路與間距脈波產生電路設計與製作後須先接上馬達

做一連串的測試〈此時系統並無回受控制〉測試間距脈波是否太長或太短硬

體電路是否有缺失hellip等等另一方面也著手撰寫模糊控制程式並將其與硬體電

路結合最後做閉迴路系統的整合測試若發現系統的運作結果並不如預期

則需分別從硬體與軟體兩方面去改良

直流馬達轉速之模糊控制

文獻蒐集與整理

AB信號產生電路設計與製作

驅動功率放大電路設計與製作

間距脈波產生電路設計與製作

測試間距脈波是否太長或太短

系統測試測試馬達轉速是否

達到控制目的

結束與論文寫作

重新設計間距脈波長度

Yes

No

系統整合與修正

輸出信號與Fuzzy控制器之連結設計

規劃輸出與輸入歸屬函數

規劃模糊知識庫

撰寫主程式並加入模糊知識庫

程式編譯及連結

軟硬體整合測試馬達是否運作

程式調整及最佳化

No

YesYes

No

圖 31 專題製作流程圖

18

32 雙脈寬調變法之直流馬達驅動電路設計

本專題製作的雙脈寬調變法之直流馬達驅動電路設計大致可以分為二大部

分第一雙脈寬調變法之電路設計第二橋型驅動功率放大電路

雙脈寬調變〈Two Pulse Width Modulation簡稱TPWM〉之電路設計主要

是先製作一脈寬調變〈Pulse Width Modulation簡稱PWM〉波形然後再將此

波形各別經由一緩衝器〈buffer〉和反向器〈inverter〉則可產生AB驅動信號

脈波此即為TPWM

321 脈寬調變電路

如圖32先利用兩顆op產生三角波電路再利用一個比較器比較三角波

和誤差值之大小

150k

1M

20k

+12V

-12V

+12V

-12V10k

+12V

-12V

10k

+12V

-12V-

+-

+

-

+ PWMLM324

LM324

LM324

2200pF

圖 32 脈寬調變電路

〈1〉 三角波產生電路

三角波產生電路通常至少需要兩個運算放大器其電路如圖33OP1

為一個反相積分器OP2為一個史密特磁滯比較器將OP2的輸出方波經

19

OP1反相積分以後得到Vo1三角波此三角波又同時加到OP2控制其狀

態的改變

當方波產生器的輸出是正的則三角波產生器的輸出是斜向負相似

地當方波產生器的輸出是負則三角波產生器的輸出是斜向正這個動

作將產生三角波的輸出同時也輸出方波﹝9﹞

+VCC

-VCC

-

+

R1

R2

R3

+VCC

-VCC

-

+

OP1

OP2

Vo2Vo1

圖 33 三角波產生電路

對OP2而言是磁滯比較必須先找到OP2的 THV 和 TLV

232

21

32

3oo v

RRR

vRR

Rv

++

+=+ 〈31〉

當 0=+v 時

23

21 oo v

RR

v minus= 〈32〉

表要達到OP2的 0=+v 必須有這麼大的 1ov

當 12 sato Ev = 時

TLsato VERR

v =minus= 13

21 〈33〉

當 22 sato Ev minus= 時

THsato VERR

v =+= 23

21 〈34〉

20

對OP1而言是反相積分器 2ov 為其輸入 1ov 為其輸出則

tCIt

Rv

Ct

CRv

dtvCR

v oooo

11

2

11

22

111

11minus=minus=minus=minus= int 〈35〉

因為

1

2

Rvv

I o minusminus= 0=minusv 〈因為虛接地〉 〈36〉

所以

1

2

Rv

I o= 〈37〉

又因運算放大器的輸入阻抗非常大則流經 1C 的電流也為 I 相當於以定

電流對電容C 充電

當 12 sato Ev = 時 1ov 為下降斜波

tR

EC

v sato

1

1

11

1minus= 〈38〉

當 22 sato Ev minus= 時 1ov 上升斜波

( )

tRE

Cv sat

o1

2

11

1 minusminus= 〈39〉

由此可知三角波的上升與下降斜波乃因 1C 的充電與放電且時間

常數為 11CR

三角波週期分析如下

1 上升斜波的時間 1T

tCR

vv o

o1

1

21 minus= 11

2

1 CRvv

to

ominus=

1Tt = TLTHo VVv minus=1 22 sato Ev =

11111

21

sat

TLTH

sat

TLTH

EVV

CRCRE

VVT

minus=

minusminus= 〈310〉

2 下降斜波的時間 2T

tCR

vv o

o1

1

21 minus= 11

2

1 CRvv

to

ominus=

21

2Tt = THTLo VVv minus=1 12 sato Ev =

1

11111

1sat

TLTH

sat

THTL

EVV

CRCRE

VVT

minus=

minusminus= 〈311〉

3 週期 21 TTT +=

若 1satE = 2satE = satE 且3

22RR

VV TLTH =minus satE

3

2114

RR

CRT=

若R3 = nR2

則nCR

T 114=

114 CR

nf = 〈312〉

《實驗結果》

必須注意的是三角波的頻率太低將導致馬達的轉動產生脈動現象

故將工作頻率設計在1kHz以上

Ω= k1501R Ω= k102R

Ω= k203R pFC 22001 =

所得到的三角波頻率為

15kHz10220010001504

00010100020

f 12- =timestimestimestimes

timestimes

=

圖 34 三角波輸出波形

22

〈2〉 脈寬調變電路〈PWM〉

+12V

-12V

10k

+12V

-12V -

+ PWM輸出LM324三角波輸入

圖 35 脈寬調變電路

PWM系統往往連接至直流電源供應放大器的工作是以固定的頻率開

閉直流供應電壓其激發角是可以調整的因此得到波寬可調的輸出

將固定頻率的三角波與反向輸入的電壓做比較便可輸出一脈寬〈見圖

36〉反向電阻值的不同將導致反向輸入電壓不同故其輸出為一可調但

頻率固定的脈寬也正因為如此故稱為脈寬調變〈PWM〉由於輸出的

dutycycle不同故馬達將接收到不同的平均電壓因而可以藉由PWM控制

馬達的轉速

反相輸入電壓

PWM

圖 36 三角波與反相輸入電壓比較

23

PWM的優點在於馬達驅動電路的電晶體之控制信號改以脈波列來控

制使電晶體操作成類似開關的動作不是完全導通就是完全截止故電晶

體不是一直操作於作用區所以其功率消耗不大整體效率較高

《實驗結果》

圖 37 PWM 輸出波形

322 橋型驅動功率放大電路

如圖38所示主要由四個功率電晶體組成利用不同的電晶體對使直流

馬達做正逆轉控制當Q5Q8導通使馬達正轉當Q6Q7導通馬達則逆

轉電路中的電晶體扮演開關的作用

此種電路簡單只要一組直流電源供應且電晶體分擔了部份的電壓保護

電晶體迅速工作於截止與飽和狀態之間故沒有功率散逸損失之虞

但是在設計時切勿使Q5Q6同時導通以免燒毀電路上之元件因為在

AB兩脈波短暫的交變時間內由於電晶體本身之最小延遲時間有可能使Q5

Q6同時ON與Q7Q8在很短時間同時ON因此在15kHz交變下容易燒毀功

率電晶體

因此設計一間距脈波電路主要之功用使Q5Q6和Q7Q8均不同時導通

24

以拉長AB兩者交換時間

M

20k

10k

20k

10k

+24V

A 信號 B 信號

2N3055 2N3055

2N2955 2N2955

1N40021N4002

C1815 C1815

C1815 C1815

Q5

Q8Q6

Q7

圖 38 橋型驅動功率放大電路

圖 39 橋型驅動功率放大電路實體圖

25

此外若考慮電晶體BE間的電壓則電路會出現約 plusmn 06V的不感帶〈ded

band〉即電晶體的 oV 對 inV 間的關係如圖3101假使 inV 電壓為正弦波則 oV 變

成如圖3102為了改善這種缺失吾人利用兩個二極體接在電路上如圖38

用來補償電晶體BE間的壓降﹝10﹞

約06V

Dead band

Vo

Vin

圖 3101 呈現不感帶的轉移函數

圖 3102 輸出電壓波形

26

323 間距脈波產生電路

RCext15

Cext14 74123

A3

B2

Q13

CLR1

Q4

7486100k

2200pF

10k

10000pF

+5V

間距脈波輸出

圖 311 間距脈波產生電路

間距脈波的產生方式是根據脈寬調變〈PWM〉後的訊號再經由積分電路的

電阻兩端取出且經由兩倍頻器〈74LS86〉檢示出PWM的正負緣脈波最後

再利用單穩態IC〈74LS123〉將檢出信號之脈寬拉長至01ms此即為間距脈波

74LS123有兩個輸入端子A及B分別為下降波緣輸入端子及上升波緣輸入端

子當輸入A之脈波由ldquoH變成ldquoL之瞬間Q輸出變為ldquoH其持續時間長

短由RC時間常數決定反之當輸入B之脈波由ldquoL變成ldquoH之瞬間Q輸出

變成ldquoH維持一定時間

74LS123的輸出脈波之寬度是由電阻及電容之時間常數所決定概略計算公

式如下

CR045T timestimes=

電容 C 必須大於 1000pF

27

《實驗結果》

R=24kΩ C=10000pF

所以得到間距脈波為

( )msec0110810000p24k045T cong=timestimes= μ

圖 312 間距脈波

研究經分析後發現

1 間距 T 愈大愈能確保電路之安全性愈有保護作用

2 間距 T 愈大相對的使驅動信號脈波減少愈多造成馬達旋轉扭力大

大減弱

3 適當的間距 T不但不會影響馬達的輸出轉矩而且兼具保護電路的

效果

33 編碼器

轉動編碼器不只可以作為轉速的感測也能做位置的感測又適合於數位處

理故被廣泛使用若就信號來看轉動編碼器可分為增量型與絕對型若以檢

測的方式來分可分為光學式和磁式兩種在本專題中所使用的編碼器為光學式

增量型編碼器﹝11﹞

光學式轉動編碼器的原理如圖 313在附有細縫轉盤的兩側分別裝置發光元

28

件與受光元件如果只有一組光電檢測元件則輸出信號就只有一相的脈波信

號此種裝置稱為脈波產生器圖 314 為增量型轉碼器的輸出信號它是利用

兩組光電元件所產生的脈波信號A 相和 B 相間有相位差正轉時 A 相領前 B

相逆轉時 B 相領前 A 相因此利用此兩相做檢測馬達為正轉或逆轉的工作

並利用 A 相或 B 相的頻率檢測出目前的轉速

吾人計算出編碼器每一轉可以產生約 200 個脈波故檢測 A 相或 B 相其頻

率為 N則轉速應為 60200

timesN

〈rpm〉

圖 313 光學式轉動編碼器的原理圖

圖 314 編碼器的輸出信號波形

29

34 LM2917 FV 電路設計

對 LM2907 而言磁滯比較器和電流汞是構成頻率對電壓轉換的基本架構

並且預留一個運算放大器及一個電晶體供各種不同的使用圖 315 為吾人所設

計的 FV 電路圖中 C1 用以抑制電流汞動作時所產生的漣波變化正常使用時

此電容應大於 10C若 C1 太大也將造成轉換速度下降

因為單晶片 8051 之輸入電壓最高為 5V故必須設計其馬達最高轉速頻率所

轉成的電壓必須在 5V 以內由於馬達轉速頻率範圍極大故吾人給予 LM2917

+12V 的電壓以擴大它可以轉換的電壓範圍並將所需維持在 5V 內

a1

14

b1

1

a1

13

b1

2

a1

12

b1

3

a1

11

b1

4

1

a1

10

b1

5

a1

8

b1

7

a1

9

b1

6

L2917

Encoder輸 入

1uF

+12V

FV輸出1000pF

45k 10kC1

C2

圖 315 FV 電路

30

《實驗結果》

根據統計結果每 50mV 相對於 100Hz如此一來吾人想得知馬達目前

的轉速只要將單晶片所接收到的電壓值經過換算即可得知目前 encoder 所量測

的頻率吾人知道 encoder 一圈可產生 200 個脈波故馬達的轉速便可經過下列

公式換算得知

轉速〈rpm〉 60200

times=f

其中 =f encoder 所量測到的頻率

表 31 頻率與轉換電壓之關係

頻率

(Hz) 1 2 3 4 5 6 7 8 9

電壓(V) 0006 0006 0007 0008 0009 0009 0009 0009 001

頻率

(Hz) 10 20 30 40 50 60 70 80 90

電壓(V) 008 009 010 010 011 011 012 012 013

頻率

(Hz) 100 200 300 400 500 600 700 800 900

電壓(V) 013 018 023 028 033 038 043 049 054

頻率

(Hz) 1000 2000 3000 4000 5000 6000 7000 8000 9000

電壓(V) 059 109 16 209 257 304 3508 4006 45

31

圖 316 頻率對電壓曲線

35 單晶片介面電路

單晶片介面包括了二大部分分別為單晶片 8051AD converter

〈1〉8051 單晶片

為本控制系統的核心一切動作皆經由它控制

〈2〉AD converter

將類比開關所送出來的類比訊號經由 ADC 0804 轉換成數位訊號傳送

到單晶片的輸入埠

351 AD 轉換

以單晶片 8051 控制 ADC0804則單晶片 8051 必須下達ldquo開始轉換rdquo的命令

給 ADC0804然後 ADC0804 就開始讀入類比輸入端的電壓在內部開始轉換

經過一段轉換時間後〈約 100μ s〉ADC0804 就將轉換完成的值放在其內部的三

態輸出栓鎖緩衝器裡然後將轉換完成輸出腳〈INTR〉降為 low以通知單晶片

可以去讀轉換完成資料

當WR和CS 同時為ldquo0rdquo時表示對 ADC0804 下達ldquo開始轉換rdquo命令再經過

32

一段轉換時間〈100μ s〉後轉換完成ADC0804 會將其轉換完成的數位資料放

在其內部 8 位元緩衝區裡且將 INTR 降為ldquo0rdquo因此單晶片只要下達ldquo開始轉換rdquo

命令後去檢查 INTR 的狀態就可以知道是否轉換完畢其方法有兩種

1 輪詢法〈polling〉

2 中斷法〈interrupt〉

所謂輪詢法就是將 ADC0804 的 INTR接到 CPU 的一條 IO 線上然後以軟體指

令主動偵測其狀態當偵測到為ldquo0rdquo時就可以去讀出 ADC0804 裡的緩衝區的轉

換值

中斷法是一個很理想的 IO 方式因為不像輪詢法必須讓 CPU 等 ADC0804

轉換當 CPU 下達ldquo開始轉換rdquo命令後就可以做其他工作當 ADC0804 轉換完

畢後 INTR會降為ldquo0rdquo可以利用此信號去中斷 CPU再由中斷副程式去讀入

轉換值即可因此大大提高了程式的效率

當 CPU 接收到 ADC0804 發出ldquo轉換完畢rdquo的信號〈 INTR =0〉後就可以去

讀出轉換值其讀出的方法是將CS 與RD設為ldquo0rdquo即可讀到轉換值這個讀值的

動作又會使得 INTR恢復成ldquo1rdquo

1 CPU 下達ldquo開始轉換rdquo命令〈CS =0WR =0〉

2 ADC0804ldquo轉換完畢rdquo 〈 INTR =0〉

3 CPU 讀取轉換值〈 RD =0CS =0〉

4 讀完後 INTR =1

ADC0804 主要規格摘要如下

1 +5V 單電源工作電壓

2 類比電壓輸入範圍 0~+5V

33

3 參考電壓為 25V

4 轉換時間為 100μ s〈 CLKf =640kHz〉

5 解析度為 8 位元

6 誤差plusmn 1LSB

7 讀取時間 135ns

36 電源供應系統

本專題中所有電路及硬體設備所需的電源採用交流電源 110V 經由 PT-31

變壓器後再經過橋式整流後提供了直流電源而因為各個電路所需電源不同

因此製作了多組的變壓電路如下

1電壓源 DC5V選擇了 7805 的穩壓 IC 搭配電容得到了+5V 的電壓源

供〈1〉8051 微處理器 〈2〉ADC 0804 〈3〉74LS8674LS12374LS04

74LS02CD4013 〈4〉馬達 Encoder

2電壓源 DC12V使用 7812 穩壓 IC 搭配電容得到+12V 的電壓源供

LM2917 使用

3電壓源 DC24V利用 7824 的穩壓 IC 搭配電容獲得+24V 的直流電壓

源供電路之橋型驅動功率放大之電晶體使用

Vin1

+12V2

GND3

LM7812

2200uF 10000pF 2200uF 10000pF

+12V outputAC

圖 317 直流電源電路

34

圖 318 直流電源電路實體圖

37 馬達轉速的量測

表 33 PWM 輸出對應 encoder 週期

PWM dutycycle encoder 週期 PWM dutycycle encoder 週期

40 sμ 172 sμ 440 sμ 0 sμ

80 sμ 188 sμ 480 sμ 0 sμ

120 sμ 204 sμ 520 sμ 0 sμ

160 sμ 230 sμ 560 sμ 0 sμ

200 sμ 272 sμ 600 sμ 0 sμ

240 sμ 328 sμ 640 sμ 0 sμ

280 sμ 416 sμ 680 sμ 1320 sμ

320 sμ 540 sμ 720 sμ 750 sμ

360 sμ 800 sμ 760 sμ 510 sμ

400 sμ 1320 sμ 800 sμ 400 sμ

35

圖 319 PWM 輸出對應 encoder 週期

由統計可知道此馬達並不是一顆線性馬達故相信若使用模糊控制理論來

作為其回授控制系統的控制器一定能達到比傳統控制器的性能還要好而且若能

在模糊控制裡加上 PID 控制器的觀念一定能在系統的響應時間上升時間

安定時間和超越量達到最佳的控制另一方面馬達在其反方向的內阻較大需

要更大的力量才能使馬達驅動

36

第四章 軟體規劃與製作

41 PWM 之軟體設計

因為之前所介紹的硬體方式是以調整可變電阻來達到轉速的調整因此無法

得知所給予的脈寬長度和轉速大小尤其在回授時也不易給予適當的訊號來調整

轉速因此改良之方法就是以8051之軟體撰寫方式來產生固定的脈寬也就等

於給予轉速的命令而在其回授控制時也只要在內部程式给予適當的指令便可

達到脈寬長度的調整以達到閉迴路之受控系統

411 PWM 軟體流程

設定Timer0模式為0

TH0 = temp 32 TL0 = temp 32

temp = 8192 ndash j4 Key = 0

檢查是否有鍵值

將鍵值存入Key

Yes

No

設定Key值所對應的 j值

If P30 == 1Then P30 = 0 temp = 8192 ndash j4Else P30 = 1 temp=8192ndash880+j4

TH0 = temp 32 TL0 = temp 32

Start Timer0中斷副程式

啟動Timer0

等待Timer0中斷

返回主程式

圖 41 PWM 軟體設計流程圖

37

在此總共設計了五個按鈕分別代表不同的轉速停止正轉〈慢〉正轉

〈快〉逆轉〈慢〉和逆轉〈快〉使用Timer0是因為8051之計時中斷比延遲程

式來的準確故可以達到準確的計時程式設計理念中並沒有將中斷致能清除

因此Timer0會一直處於計時的狀態程式執行時將一邊檢查鍵值〈KeyStatus〉一

邊進行計時當計時完畢便呼叫中斷副程式然後執行改變Port 30的輸出狀

態若是為high則變為low反之若是為low即變為high同時並重設計時時間

Timer0繼續計時

當鍵值改變時計時的時間也會跟著改變如此一來Timer0將ㄧ直重覆上

述動作直到電源切掉Timer0才會停止計時

42 模糊控制之程式規劃與撰寫

本專題目標在完成了先前所規劃的硬體電路之後接著就是要達成利用模糊

控制理論來設計控制器在此採用了單晶片8051目的是為了以硬體實現方式來

代替電腦模擬期望能夠按照原訂計畫完成本專題「具模糊控制理論與雙脈寬調

變法之直流馬達驅動電路設計」

單晶片 8051 模糊控制的程式撰寫採下列幾個步驟依序完成

1 設定變數轉速誤差〈dspeed〉目前轉速〈sspeed〉

2 模糊化採用三角形歸屬函數採用三角形歸屬函數的原因

〈1〉 三角形函數為一連續函數

〈2〉 三角形函數為線性的函數所以計算速度較快

〈3〉 是具有發散也有收斂的函數和指數函數一樣接近

事實

3 模糊推論模糊規則將其所有可能發生情況以 IFhellipTHENhellip表示

並建立控制規則表

4 解模糊化採用重心法

38

421 歸屬函數

設定變數為目前轉速〈sspeed〉與轉速誤差〈dspeed〉因此此模糊控制器共

有兩個輸入訊號與一輸出訊號輸出訊號為脈寬長度該加或是減多少又因為有

五種不同的轉速因此各分別設計了不同的歸屬函數如下

1 當轉速 = 0

ml h

s s p e e d

d s p e e d

r p m0 5 0 1 0 0- 5 0- 1 0 0

mv l l h v h

r p m0- 3 0- 6 0- 1 0 0 3 0 6 0 1 0 0 圖 42 停止時之歸屬函數

2 正轉〈慢〉

ml hsspeed

dspeed

rpm150 225 300750

mvl l h vh

rpm150100500 200 250 300

圖 43 正轉〈慢〉之歸屬函數

39

3 正轉〈快〉

ml hsspeed

dspeed

rpm520 670 820370220

mvl l h vh

rpm500400300200 600 700 800

圖 44 正轉〈快〉之歸屬函數

4 逆轉〈慢〉

ml hsspeed

dspeed

rpm100 250 400500

mvl l h vh

rpm10050250 200 300 400 圖 45 逆轉〈慢〉之歸屬函數

40

5 逆轉〈快〉

ml hsspeed

dspeed

rpm300 450 600150

mvl l h vh

rpm450350250150 550 650 750

750

圖 46 逆轉〈快〉之歸屬函數

6 輸出

OutputMVL L H VH

rpm0-50-150-250 50 150 250

圖 47 輸出之歸屬函數

41

422 模糊規則庫

表 41 為吾人所設計的模糊控制規則庫並利用 Matlab 之 Fuzzy ToolBox 來

建立此規則庫以進行模擬推論圖 48 為當馬達輸入指令為正轉慢時推論後所得

到的三維空間圖

表 41 模糊控制規則表

Dspeed

vl l m h vh

l H M L VL VL

m VH H M L VL sspeed

h VH VH H M L

圖 48 推論後的三維空間圖

42

423 模糊控制器之軟體設計流程

Start 外部中斷副程式

ADCWR = 0 ADCWR = 1

〈令AD開始轉換〉

檢查鍵值以得到對應的歸屬函數

取得目前轉速與

轉速誤差

Fuzzy Rules決策

得到輸出訊號

Delay 10ms

ADC = 0 讀取AD值 ADCRD = 0

將AD值換算成轉速

ADCWR = 0 ADCWR = 1

〈AD開始轉換〉

返回主程式

致能外部中斷

圖 49 Fuzzy Controller 程式流程圖

當控制器一開始動作時便先執行AD轉換的工作當AD轉換完成時其

INTR的接腳便會觸發8051的外部中斷INTR0於是程式便發生外部中斷執行

外部中斷副程式的指令

43

在外部中斷副程式中AD將ㄧ直進行轉換與讀取的工作同時並將轉換後

的值直接換算成目前轉速與轉速誤差以供模糊控制器使用換算目前encoder

的頻率其公式為

160-V2000 times=頻率 〈4-1〉

式4-1之公式是根據表31所導出來的其中V為encoder之頻率轉成電壓之值

又假設所讀取的AD轉換值為value因為

AD的解析度 = bit256

5V+ = 511 ( Vbit ) 〈4-2〉

故value值與電壓V之關係為

511 value V times= 〈4-3〉

所以encoder之頻率與value值的關係為

頻率= 2000times ⎟⎠⎞

⎜⎝⎛ times

511 value - 160 〈4-4〉

故目前轉速為

sspeed = ( )rpm 60 200

times頻率 〈4-5〉

另ㄧ方面在主程式中程式會先去檢查鍵值也就等於檢查輸入指令以

找出符合使用的歸屬函數並將AD所獲得的轉速對應到歸屬函數中然後執行

決策判斷即進入規則庫中尋找出適當的決策判斷最後將此決策送入PWM程

式裡進行脈寬長度的調整使馬達在合理的要求下達到理想的轉速控制不會

因為外在環境的影響而使馬達轉速受到干擾

43 LCD 顯示轉速

此專題最後再增加一LCD顯示幕以顯示目前的轉速否則在程式設計完成

後人卻因無法以肉眼得知目前轉速而不能肯定馬達轉速是否有達到控制的目

標因此增加一顯示幕LCD是有必要的不僅隨時得知目前的轉速還能知道

44

設計出來的軟體其控制性是否夠好夠穩定

431 LCD 顯示幕之軟體流程

Start

設定LCD模組的初始狀態

設定外部中斷INTR0

與Timer0

設定TH0 = (65536 ndash 5000) 256 TL0 = (65536 ndash 5000)256

令ADCWR = 0 ADCWR = 1 AD開始轉換

等待中斷

外部中斷副程式

ADCRD = 0 讀取AD值 ADCRD = 1

將AD值換算成速度

ADCWR = 0 ADCWR = 1 AD開始轉換

Timer0中斷副程式

顯示LCD第一行

ldquoMotor Speed =

顯示LCD第二行ldquoxxxxxxx rpm其中 xxxxxx為外部中斷副程式所換算出的轉速

重設TH0與TL0

返回主程式返回主程式

圖 410 LCD 顯示幕之程式流程圖

此程式主要由兩個部分完成一為外部中斷副程式另ㄧ為 Timer0 中斷副

程式當主程式完成外部與 Timer0 兩個中斷的設定後隨即命令 AD 開始轉換

之後便一直停在 while〈1〉的迴圈裡不做任何動作而由兩個中斷副程式來完

成整個轉換與顯示的工作

45

外部中斷副程式主要負責 AD 的轉換讀取與轉速換算的工作AD 第一

次的轉換由主程式來下達命令當轉換完成後AD 的 INTR 接腳將觸發外部中

斷〈INTR0〉副程式此時程式便進入外部中斷副程式執行讀取 AD 值與轉速

換算的工作當這些工作完成時外部中斷副程式再次下達 AD 開始轉換的命

令而離開中斷副程式當 AD 再次轉換完成時又將再次執行中斷副程式

如此週而復始中斷副程式將ㄧ直進行讀取換算與轉換的工作

而 Timer0 中斷副程式主要負責 LCD 顯示之工作當主程式所設定的計時時

間計數完時程式便進入 Timer0 中斷副程式一旦進入 Timer0 中斷副程式程

式將執行 LCD 的顯示然後再重設 Timer0 的計數時間Timer0 將重新計數當

計數完時程式又將再度進入 Timer0 中斷副程式執行因為程式中並無清除

Timer0 的中斷致能故 Timer0 中斷副程式和外部中斷副程式ㄧ樣週而復始的

執行其副程式的工作

46

第五章 結論

本計劃主旨為具模糊控制理論與雙脈寬調變法之直流馬達驅動電路設計主

要是針對傳統電路設計之缺點提出改良之方法以TPWM取代PWM電路以模

糊理論基礎設計之控制器替代傳統PID控制器

TPWM轉速控制優於PWM之處在於

1 TPWM只需使用單電源即可達到正轉和逆轉的轉速控制而PWM必須

加上逆向開關或是雙電源才能使馬達產生正轉和逆轉

2 TPWM可控制馬達處於停止狀態無論在正向或逆向加上負載皆無法使

馬達產生轉動

3 馬達消耗定額功率輸出轉矩為額定值

4 馬達由停止到某定轉速時反應時間較快

模糊控制器優於PID控制器

1 不須導出繁雜的數學模型

2 適用於非線性系統

3 強健性與容錯性較高

本專題至此雖說大致的目標都已達到但是此系統仍然有許多不完美而需要

改進的地方例如在實驗過程中發現整個轉速的控制在回授上其反應時間

有點慢探討其原因有可能是控制器之程式上的問題

1 因為使用C語言撰寫程式故其執行速度較慢

2 程式可能寫的太累贅

3 模糊控制規則庫建立不良

若想改善這些問題可以嘗試著將C語言改為組合語言來撰寫並盡量減少

47

不必要的指令相信此動作一定能大大提昇程式的執行速度其次就是多做測

試利用測試中所學到的經驗來幫助模糊控制規則庫的改寫同時也能從測試中

發現更多的問題若是都能對問題加以一一解決的話相信必定能將此控制系統

做的更盡善盡美

48

參考文獻

﹝1﹞ 李適中直流馬達速度控制伺服控制〈基礎篇〉全華科技圖書股份有

限公司民 74

﹝2﹞ 廖錦文ldquo直流電動機之雙脈寬調變是〈TPWM〉驅動電路研究電

子技術月刊第 69 期pp94-1021992

﹝3﹞ 楊英魁孫宗瀛鄭魁香林建德蔣旭堂模糊控制理論與技術全華

科技圖書股份有限公司民 85

﹝4﹞ 林敦煌陳憬德直流馬達定位及轉速的模糊控制逢甲大學自動控制工

程學系學士論文民 87

﹝5﹞ LAZadehldquo Fuzzy Sets Information and Control Vol8 pp338-353

1965

﹝6﹞ EHMamdani and SAsslianldquo A fuzzy logic controller for a dynamic

plant Internation Journal of Man-Machine Studies Vol7 pp1-13 1975

﹝7﹞ 孫宗瀛楊英魁Fuzzy 控制理論實作與應用全華科技圖書股份有

限公司民 83 年

﹝8﹞ 許中平黃煌嘉直流電動機控制電路設計全華科技圖書股份有限公司

民 75

﹝9﹞ 盧明智黃敏祥OP Amp 應用+實驗模擬全華科技圖書股份有限公司

民 83

﹝10﹞陳文耀電動機控制工程復文書局2003

﹝11﹞許中平林全福電動機運轉控制技術全華科技圖書股份有限公司民

77

﹝12﹞楊明豐8051 單晶片 C 語言設計實務碁峯資訊2003 年

﹝13﹞蔡朝洋單晶片微電腦 80518951 原理與應用全華科技圖書股份有限公

司民 91

49

﹝14﹞王文俊認識 Fuzzy全華科技圖書股份有限公司民 90

50

附錄 A 專題硬體展示圖

圖 A-1 硬體整體圖

圖 A-2 硬體整體鳥瞰圖

51

圖 A-3 硬體側視圖

圖 A-4 操作與顯示面板

圖 A-5 間距脈波電路與 FV 電路

52

圖 A-6 橋型驅動功率放大電路

圖 A-7 操作與控制面板

53

附錄 B PWM 與模糊控制之程式

include reg51h include stdioh sbit ADCRD = P3^1 設定 RD 控制線接腳為 P31 sbit ADCWR = P3^3 設定 WR 控制線接腳為 P33 sbit P2_0 = 0xA0 接腳定義 sbit P2_1 = 0xA1 接腳定義 sbit P3_0 = 0xB0 接腳定義 sbit P3_1 = 0xB1 接腳定義 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P3_6 = 0xB6 接腳定義 void KeyStatus(void) 函數原型宣告 void feedback(void) 函數原型宣告 void compute_grade(void) 函數原型宣告 void delay1ms(int count) 函數原型宣告 void convert() 函數原型宣告 void condition() 函數原型宣告 void CW(void) 函數原型宣告 int j i 對應 PWM 的寬度 unsigned int temp 所設計的計時器時間 int sample = 1000 取樣率設定消除顯示值跳動 long int value r1 讀取 ADC0804 數位資料 long int set n condition select long int r grade_reg[2] grade[15] error1 error2 long int a1 b1 I long int membership[5][3]membership1[3][3] 定義歸屬函數 long int membership2[3][3] = -10-50-5050510 long int error[2] int Rule[15][3] = 113213313 定義判斷規則庫 212223323 311232333 411241342 511251351

54

main() 主程式 j = PWM = 110 設定 PWM 初始值 IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x00 設定計時器 0 工作於模式 0 temp=8192-j4 設定計時器 0 初值 TH0 = temp 32 TL0 = temp 32 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 P3_4 = 1 P3_5 = 0 P3_6 = 0 ADCWR = 0 令 ADC0804 的 WR = 0 ADCWR = 1 令 ADC0804 的 WR = 1 while (1) KeyStatus() 檢查鍵值 void KeyStatus(void) 檢查鍵值並給對應的 PWM 值 char KeyScan(void) 按鍵掃描函數宣告 unsigned char KeyStatus unsigned char Key = 0 KeyStatus=KeyScan() 呼叫按鍵掃描函數 if (KeyStatus = 0) 已有按鍵輸入 Key = KeyStatus Key = 鍵值 if (Key == 0x01) 假如輸入為按鍵 1 i = 110 PWM 為 110us j = i P3_4 = 1 LED 亮第一顆〈表馬達停止〉 P3_5 = 0 P3_6 = 0

55

else if (Key == 0x02 ) 假如輸入為按鍵 2 i = 140 PWM 為 140us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x04 ) 假如輸入為按鍵 3 i = 180 PWM 為 180us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x08 ) 假如輸入為按鍵 4 i = 80 PWM 為 80us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 else if (Key == 0x10 ) 假如輸入為按鍵 5 i = 40 PWM 為 40us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 PWM = j delay1ms(10) 呼叫延遲函數 feedback() 模糊控制判斷

56

void To_int(void) interrupt 1 Timer0 中斷函數 if (P3_0 == 0) 假如 PWM 輸出為 Low P3_0 = 1 變更 PWM 輸出為 High temp=8192-j4 設定 High 的時間 else 若 PWM 輸出為 High P3_0 = 0 變更 PWM 輸出為 Low temp=8192-880+j4 設定 Low 的時間 TH0 = temp 32 Timer0 的計時時間 TL0 = temp 32 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 char KeyScan(void) 檢查鍵值 char KeyStatus 按鍵狀態 P0=0xff 設定 P0 為輸入模式 KeyStatus=~P0 讀取按鍵狀態 return(KeyStatus) 將鍵值送回程式 void feedback(void) 模糊判斷 void Fuzzycontroller() 函數原型宣告 void condition1() 函數原型宣告

57

void condition2() 函數原型宣告 error1 = ((value)40-160)03 輸入變數 1 delay10ms(10) 延遲 10ms error2 = ((value)40-160)03 輸入變數 2 if (key == 0x01 ) 當按鍵 1找出對應的歸屬函數 並做出模糊控制判斷

int membership[5][3]= -100-60-30-60-300-30030030603060100

int membership1[3][3]=-100-500-50050050100 Fuzzycontroller() condition() if (key == 0x02 ) 當按鍵 2找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

05010050100150100150200150200250200250300 int membership1[3][3]=07515075150225150225300 Fuzzycontroller() condition() else if (key == 0x04) 當按鍵 3找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

200320400300400500400500600500600700600700800 int membership1[3][3]=220370520370520670520670820 Fuzzycontroller() condition() else if (key == 0x08) 當按鍵 4找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

02550255010050100200100200300200300400 int membership1[3][3]=05010050100250100250400 Fuzzycontroller() condition()

58

else if (key == 0x10) 當按鍵 5找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

150250350250350450350450550450550650550650750 int membership1[3][3]=150300450300450600450600750 Fuzzycontroller() condition2() void Fuzzycontroller() 模糊控制判斷 void compute_grade() 函數原型宣告 void compute_grade1() 函數原型宣告 a1 = 0 b1 = 001 I = 0 for (n=0 nlt=14 n++) r = error1 set = Rule[n][0]-1 compute_grade() 計算輸入變數 1 與

模糊程度的歸屬函數 condition = 1 r = error2 set = Rule[n][1]-1 compute_grade1() 計算輸入變數 2 與 模糊程度的歸屬函數 grade[n] = MIN(grade_reg[0] grade_reg[1]) a1 = a1 + (grade[n]membership2[Rule[n][2]-1][1]) b1 = b1 + grade[n] I = a1 b1 得到模糊控制判斷的結果 void compute_grade() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership[set][0]) || (r gt membership[set][2])) 當輸入變數不在 歸屬函數內

59

grade_reg[condition] = 0 else if ((r gt membership[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership[set][2]-r) (membership[set][2] - membership[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership[set][0]) (membership[set][1] - membership[set][0]) void compute_grade1() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership1[set][0]) || (r gt membership1[set][2])) 當輸入變數不在 歸屬函數內 grade_reg[condition] = 0 else if ((r gt membership1[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership1[set][2]-r) (membership1[set][2]-membership1[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership1[set][0]) (membership1[set][1]-membership1[set][0])

60

void condition() P2_0 = 1 設定 P20 為輸入模式 P2_1 = 1 設定 P21 為輸入模式 if ( (P2_0 == 1) ampamp (P2_1 == 0)) 當馬達為正轉時 if ( I gt 0 ) 若模糊判斷結果為正 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 若模糊判斷結果為零 PWM = PWM + 0 PWM 寬度不變 if ( I lt 0 ) 若模糊控制結果小於零 PWM = PWM + 1 PWM 寬度加 1 else if ( (P2_0 == 0) ampamp (P2_1 == 1) ) 若馬達為反轉 if ( I lt 0 ) 模糊控制小於零 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 模糊控制等於零 PWM = PWM + 0 PWM 寬度不變 if ( I gt 0 ) 模糊控制大於零 PWM = PWM + 1 PWM 寬度加 1 CW() 判斷 PWM 寬度上下限

61

void CW() 判斷 PWM 寬度上下限 if ( PWM gt= 215 ) 若 PWM 寬度 gt= 最大寬度 j = 215 PWM 寬度維持於 215us if ( PWM lt= 5 ) 若 PWM 寬度 lt= 最小寬度 j = 5 PWM 寬度維持在 5us if ( PWM gt 5 ampamp PWM lt 215 ) PWM 寬度介於最大與最小間 j = PWM PWM 依模糊控制判斷結果增減 void delay1ms(int count) 延遲 1ms int x y for ( x = 0 x lt count x++ ) for ( y = 0 y lt 122 y++ ) void convert() 數位資料換算成馬達轉速 r1 = ((value)40)-160

62

附錄 C LCD 顯示之程式

includereg51h 含 8051 所有暫存器宣告 include mathh define RS P3_5 LCD 指令資料選擇控制 define RW P3_4 LCD 讀寫控制腳 define Enable P3_3 LCD 致能接腳 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P0_0 = 0x80 接腳定義 sbit P0_1 = 0x81 接腳定義 sbit P0_2 = 0x82 接腳定義 sbit P0_3 = 0x83 接腳定義 sbit P0_4 = 0x84 接腳定義 sbit P0_5 = 0x85 接腳定義 sbit P0_6 = 0x86 接腳定義 sbit ADCRD = P3^7 設定 RD 控制線接腳為 P37 sbit ADCWR = P3^6 設定 WR 控制線接腳為 P36 void delay(void) 函數原型宣告 void delay10ms(int count) 函數原型宣告 void display(void) 函數原型宣告 void InitialLCD(void) 函數原型宣告 void WriteIns(char) 函數原型宣告 void WriteData(char) 函數原型宣告 void WriteString(charchar) 函數原型宣告 void CheckBusy(void) 函數原型宣告 void convert(void) 函數原型宣告 char MSG0[] = Motor Speed = 定義字串 MSG0 char MSG2[] = rpm 定義字串 MSG2 unsigned char MSG1[8]=0000000 定義字串 MSG1 unsigned long int value 讀取 ADC0804 數位資料 int sample = 1000 取樣率設定消除顯示值跳動 long int rpm

63

main() 主程式 InitialLCD() 初始化 LCD IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x01 設定計時器 0 工作於模式 1 TH0 = (65536-5000)256 設定計時器 0 初值 TL0 = (65536-5000)256 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 while(1) 等待中斷 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 while (--sample == 0) 取樣率減 1 sample = 1000 重設取樣率 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 void T0_int(void) interrupt 1 LCD 顯示動態掃描 display() 動態掃描顯示 TH0 = (65536-65535)256 重設計時初值 TL0 = (65536-65535)256

64

void InitialLCD(void) 設定 LCD 模組初始狀態 delay() 延遲函數 WriteIns(0x38) 設定 LCD 模組為 WriteIns(0x38) 2 行顯示 WriteIns(0x38) 8 位元介面 WriteIns(0x38) 5x7 點字型 WriteIns(0x08) 關閉顯示器 WriteIns(0x01) 清除 LCD 螢幕 WriteIns(0x0c) 令顯示器 ON但游標不顯示 WriteIns(0x06) 令 LCD 模組每接收到 1Byte 資料 AC 值自動加 1 void display() 掃描顯示 WriteIns(0x80) 設定 LCD 座標 WriteString(13MSG0) 將字串 MSG0 寫入 LCD 中 WriteIns(0xc0) 設定 LCD 座標 WriteString(8MSG1) 將字串 MSG1 寫入 LCD 中 WriteIns(0xc8) 設定 LCD 座標 WriteString(4MSG2) 將字串 MSG2 寫入 LCD 中 void convert(void) 換算轉速 long int freq freq = ((value)4000) - 16000 數位資料換成頻率公式 rpm = freq3 頻率換算轉速公式 MSG1[0] = (rpm1000000)+0x30 將結果存入字串 MSG1 中 MSG1[1] = ((rpm1000000)100000)+0x30 MSG1[2] = ((rpm100000)10000)+0x30 MSG1[3] = ((rpm10000)1000)+0x30 MSG1[4] = 0x2e MSG1[5] = ((rpm1000)100)+0x30 MSG1[6] = ((rpm100)10)+0x30 MSG1[7] = rpm10+0x30

65

void WriteIns(char instruction) 寫命令至 LCD 中 RS = 0 選擇指令暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = instruction 輸出命令至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteData(char i) 寫資料至 LCD 中 RS = 1 選擇資料暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = i 輸出資料至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteString(countMSG) 寫字串至 LCD 中 char count 字串長度 char MSG[] 字串資料 char i 定義位元組變數 for(i=0 iltcount i++) count 個位元組 WriteData(MSG[i]) 寫入一位元組的資料至 LCD 中 void CheckBusy(void) char i=0x80 檢查忙碌旗標 while(iamp0x80) 忙錄旗標 BF = 1 RS = 0 選擇指令暫存器 RW = 1 讀取 Enable = 1 致能 LCD i = P2 讀取 LCD 指令暫存器內的資料

66

Enable = 0 除能 LCD delay() 延遲函數 void delay() 延遲 5ms int i for(i=0 ilt250 i++)

  • 畢業專題封面pdf
  • File0004pdf
  • 最終版pdfpdf
Page 4: Based on Fuzzy Control Theorem and TPWM Method for DC ... · 使吾人想設計一模糊控制器來做為馬達轉速的閉迴路控制,以解決非線性系統的 問題。除此之外,flcs

III

Abstract

Use Two Pulse Width Modulation(TPWM) driver circuit by Fuzzy Logic

Control System(FLCS) to replace conventional PWM circuit with PID control system

has many advantages

TPWM is digital logic circuit which can be developed into integrated circuit

micro chips for easy maintenance and installation When incorporate with micro

computing TPWM has wide range of applications The major advantages of the

TPWM driver circuit by FLCS are

When performing on and off forward reverse or variable speed TPWM requires

the same power and will not effect torque in performing desirous of speed under

different loading

Convention motor circuit does not compete spinning motorrsquos inertia when

control to stop therefore the motor takes some time to slow to a stop Also due to

same factor the conventional motor circuit can not accelerate the motor to desirous of

speed in the same instant the motor is turned on Whereas TPWM circuit can make

the motor stop in instant and spin up to desirous of speed when turned on without

convention motor circuitrsquos delay

Convention PID controller for motors is not the best control system because the

motor is not a linear system as PID controller assumed Recent development on FLCS

is specialize in solving this conflict because its performance of rise time setting time

and overshoot are all better than PID controller

Based on fuzzy control theorem and TPWM method for dc motor driver circuit

design is different from conventional PWM circuit with PID controller in order to get

up to the speed feed back control system

IV

目錄

誌 謝 I

中文摘要 II

Abstract III

目錄 IV

圖目錄 VI

表目錄 VIII

第一章 緒論 1

11 前言 1 12 研究動機 2 13 研究方法 3 14 研究目標 4

第二章 原理探討 5

21 模糊控制與理論 5 211 模糊理論概述 5 212 模糊集合 6 213 歸屬函數 7 214 模糊推論與模糊規則 10 215 模糊控制器 11

22 直流馬達數學模型 14

第三章 系統功能分析與製作規劃 17

31 專題製作流程 17 32 雙脈寬調變法之直流馬達驅動電路設計 18

321 脈寬調變電路 18 322 橋型驅動功率放大電路 23 323 間距脈波產生電路 26

33 編碼器 27 34 LM2917 FV 電路設計 29 35 單晶片介面電路 31

351 AD 轉換31 36 電源供應系統 33 37 馬達轉速的量測 34

V

第四章 軟體規劃與製作 36

41 PWM 之軟體設計 36 411 PWM 軟體流程 36

42 模糊控制之程式規劃與撰寫 37 421 歸屬函數 38 422 模糊規則庫 41 423 模糊控制器之軟體設計流程 42

43 LCD 顯示轉速43 431 LCD 顯示幕之軟體流程 44

第五章 結論 46

參考文獻 48

附錄 A 專題硬體展示圖 50

附錄 B PWM 與模糊控制之程式53

附錄 C LCD 顯示之程式 62

VI

圖目錄

圖 11 單象限控速系統運作於第一象限2 圖 211 正規且凸模糊集合7 圖 212 正規非凸的模糊集合7 圖 22 吊鐘型歸屬函數8 圖 23 三角型歸屬函數9 圖 24 梯型歸屬函數9 圖 25 模糊控制系統的構造11 圖 26 模糊系統的基本架構13 圖 27 直流馬達等效電路簡圖14 圖 28 直流馬達數學模式方塊圖16 圖 31 專題製作流程圖17 圖 32 脈寬調變電路18 圖 33 三角波產生電路19 圖 34 三角波輸出波形21 圖 35 脈寬調變電路22 圖 36 三角波與反相輸入電壓比較22 圖 37 PWM 輸出波形 23 圖 38 橋型驅動功率放大電路24 圖 39 橋型驅動功率放大電路實體圖24 圖 3101 呈現不感帶的轉移函數25 圖 3102 輸出電壓波形25 圖 311 間距脈波產生電路26 圖 312 間距脈波27 圖 313 光學式轉動編碼器的原理圖28 圖 314 編碼器的輸出信號波形28 圖 315 FV 電路 29 圖 316 頻率對電壓曲線31 圖 317 直流電源電路33 圖 318 直流電源電路實體圖34 圖 319 PWM 輸出對應 encoder 週期 35 圖 41 PWM 軟體設計流程圖 36 圖 42 停止時之歸屬函數38 圖 43 正轉〈慢〉之歸屬函數38 圖 44 正轉〈快〉之歸屬函數39 圖 45 逆轉〈慢〉之歸屬函數39 圖 46 逆轉〈快〉之歸屬函數40

VII

圖 47 輸出之歸屬函數40 圖 48 推論後的三維空間圖41 圖 49 Fuzzy Controller 程式流程圖 42 圖 410 LCD 顯示幕之程式流程圖44 圖 A-1 硬體整體圖 50 圖 A-2 硬體整體鳥瞰圖 50 圖 A-3 硬體側視圖 51 圖 A-4 操作與顯示面板 51 圖 A-5 間距脈波電路與 FV 電路 51 圖 A-6 橋型驅動功率放大電路 52 圖 A-7 操作與控制面板 52

VIII

表目錄

表 31 頻率與轉換電壓之關係30 表 33 PWM 輸出對應 encoder 週期 34 表 41 模糊控制規則表41

1

第一章 緒論

11 前言

在現代的工程應用裡馬達扮演一個非常重要的角色它在機械設備中就好

像人的心臟一樣提供了機械運轉所需要的動力源以做為能量轉換或控制機能

的實行在眾多的馬達種類當中直流馬達不僅具有許多良好的特性例如高

啟動轉矩較易線性控制hellip等且其週邊控制元件充足控制理論發展成熟所

以被廣泛的應用在工業日常生活上馬達的速度控制被廣泛的應用在各種加工

機械航空機械農業機械交通工具等用途

直流電動機之轉速控制目前最常被使用的一種方法為脈波寬度調變〈PWM〉

驅動電路並結合傳統的 PID 控制器脈寬調變是一種以固定的頻率波寬可

調的輸出開閉供應的直流電壓使馬達感受到的平均電壓可以調整進而控制馬

達的轉速

我們日常生活中處處存在著非線性的現象但是我們較熟悉處理的卻是線

性的系統對於傳統 PID 控制器來說必須先知道受控系統〈plant〉的數學模

型否則無法導出其控制演算法則且其強健性與容錯性較低然而對於非線性

系統則不適合此法因此近年來對於非線性系統的研究工作已有許多學者嘗試

應用模糊理論〈Fuzzy Theory〉類神經網路〈Artificial Neural Networks〉基因

演算法〈Genetic Algorithms〉等非傳統方法且已有不錯之成效因此以模糊控

制理論之方法取代傳統的 PID 控制器來控制馬達轉速

對於一個非線性時變系統〈Nonlinear Time Variant System〉模糊控制理論

不但能簡化數學模型並且可以結合人類的操作經驗有效的達成控制目標模

糊控制能將操作者的專家經驗換成控制器設計人員的設計理念勢必擁有比一般

傳統的控制器更加的強健性與容錯性

2

12 研究動機

現今直流馬達的轉速控制多廣泛使用脈波寬度調變式〈Pulse Width

Modulation簡稱 PWM 驅動電路〉此種電路是以控制固定頻率的開閉供應直流

電壓以得到波寬可調的輸出使馬達的平均電壓可以調整進而轉移到馬達的

平均功率而達到轉速的控制但是由於 PWM 為一種單象限控制只運作於第一

象限這種系統本身無法產生負轉矩未加上逆向開關前亦無法反向因此無法

作用於第三象限系統加上動力制動後方可以有限度地產生逆向轉矩而運作於

第二象限〈見圖 11〉然而這也只是一種被動控制區間﹝1﹞

主動控制區動力制動

(被動運作)

Ⅱ Ⅰ

Ⅲ Ⅳ

ω

TCWCCW

圖 11 單象限控速系統運作於第一象限

本研究主要目的之一就是針對 PWM 之缺失提出了改良的方法於前級驅

動電路產生正反方向的兩個脈波信號再經驅動功率放大之後使馬達產生正

反轉向的兩拉力此即為雙脈波寬度調變式(Two Pulse Width Modulation簡稱

TPWM)本控制主要特色不論電動機正轉反轉速度快慢或停住均消

耗定額功率〈即馬達無時無刻都在運轉且輸出轉矩為額定值〉系統於寬廣的

速度變化範圍內仍具有良好的伺服性能馬達的旋轉扭力不會因速度及負載的

變化而受影響使伺服控制系統達到某一預定的特性範圍﹝2﹞

3

此外馬達的轉速會因其驅動機構的慣性影響不可能「說停就停」也

會因為摩擦力等影響不可能「說動就動」故對其操控指令一定會有延遲的

現象發生這些因素使馬達不是一個典型的線性系統故傳統的 PID 控制器就

不是最好的選擇再加上近年來模糊控制系統〈Fuzzy Logic Control System

FLCS〉的發展﹝3﹞使吾人想設計一模糊控制器來做為馬達轉速的閉迴路控

制以解決非線性系統的問題除此之外FLCS 在上升時間安定時間和超

越量上的要求也都優於傳統的 PID 控制器[4]

目前雖然有很多從事於馬達轉速控制的相關研究但是多採用脈波寬度調

變法且其尚有缺失待改良因此吾人想採用雙脈波寬度調變雖然有關此法

的研究並不多見但 TPWM 卻具有 PWM 所沒有的優點再加上近來發展愈

盛的模糊控制理論較傳統 PID 控制器的優點相信馬達轉速以 TPWM 驅動電

路之模糊控制是值得去加以研究和探討的

13 研究方法

本專題計畫其研究方法主要分為兩大類一為硬體結構電路設計另一為

Fuzzy 控制器之軟體製作硬體結構方面主要設計一比較放大器使其誤差值經

此電路與三角波比較而輸出 A 驅動信號脈波與 B 驅動信號脈波然後再由驅動

功率放大電路將信號脈波放大後控制馬達正逆轉此外為了確保功率放大電

路之安全性需在其之前加上一間距產生電路以防止其電路損毀

感測器方面則利用編碼器〈encoder〉感測出馬達的轉速然後再經由 FV

將其轉換為電壓此電壓再由 AD 轉換為數位信號送入單晶片 8051經由模

糊控制規則庫判斷並做出決策以達到馬達轉速的控制

4

14 研究目標

本專題研究目標如下

〈1〉 完成相關文獻資料之蒐集整理與討論

〈2〉 完成 AB 信號產生電路設計

〈3〉 完成間距脈波產生電路設計

〈4〉 完成驅動功率放大電路設計〈橋型驅動功率放大〉

〈5〉 完成 FV 電路設計

〈6〉 完成 AD 訊號轉換

〈7〉 編寫模糊控制法則與介面軟體設計

5

第二章 原理探討

21 模糊控制與理論

在傳統的控制領域裏控制系統動態模式的精確與否是影響控制優劣的最主

要關鍵系統動態的資訊越詳細則越能達到精確控制的目的然而對於複雜

的系統由於變數太多往往難以正確的描述系統的動態於是工程師便利用各

種方法來簡化系統動態以達成控制的目的但卻不盡理想換言之傳統的控

制理論對於明確系統有強而有力的控制能力但對於過於複雜或難以精確描述的

系統則顯得無能為力了因此便嘗試著以模糊數學來處理這些控制問題模糊

控制是屬於非線性式的控制在受控系統無法以線性數學模式精確描述的情況

下經由適當調整控制規則應具有比傳統控制方法更佳的控制性能

211 模糊理論概述

1965 年美國加州柏克萊分校的 LotfiAZadeh 教授首先在他主編的

「Information and Control」刊物上提出「Fuzzy Set」論文此為模糊邏輯理論的

創始模糊理論在經過了三十幾年的演化改進後無論是在應用或理論架構上

皆已日趨完備尤其近年來因人工智慧的迅速發展模糊理論儼然成為人工智慧

不可或缺的理論根基

Zadeh 教授曾提出一個互克性原理﹝5﹞「當系統的複雜性增長時對系統

特性做精確且有意義描述的能力亦相對降低最後精確性與有意義性將變成完全

互相排斥的特性」很高的複雜性意味著只能在一個刻意壓縮的低維因素空間觀

察而無法對問題的全部因素都進行考察使得原本是明確的概念變的模糊

Fuzzy 理論正是為了掌握這類具模糊特質的事物而發展出來的所以它的應用較

偏重於人類的經驗及對問題特性的掌握程度不主張用繁雜的數學分析及數學模

式來解決問題

Fuzzy 理論把傳統數學從二值邏輯〈binary logic〉擴展到連續多值〈continuous

6

multi-value〉利用歸屬函數〈membership function〉描述一個概念的程度亦及

使用 0 和 1 之間的數值來表示一個元素屬於某一概念的程度這個值稱為元素對

集合的歸屬度〈membership grade〉當歸屬度為 1 時表示該元素百分之百屬於

這個概念當歸屬度為 0 時則表示該元素完全不屬於這個概念介於兩者之間

的就是完全屬於和完全不屬於之間的灰色地帶

模糊理論的工程應用大約始於 1974 年倫敦大學的 EHMamdani 教授他根

據 Zadeh 提出的語言分析法〈linguistic approach〉及模糊推論〈fuzzy inference〉

運用 IF-THEN 形式的法則來敘述操作員的控制策略成功地應用在蒸汽機自動

運轉上﹝6﹞從此模糊理論的應用便迅速發展以在控制方面的研究成果最為

顯著模糊理論其實是一門相當生活化的學問由於使用語言變量描述因此更

具親和力與一般性人類日常生活所遇所用的一些敘述即大都是模糊的例如

那個人ldquo很高車開的ldquo很快等等其中ldquo很高ldquo很快並不是一個

明確值而只是描述事件的程度但是根據這些描述人類卻能很輕易的接收

212 模糊集合

模糊集合〈fuzzy set〉可視為傳統集合的擴張在模糊集合的世界中稱傳

統集合為明確集合〈crisp set〉所謂模糊集合是指用來表示界限或邊界不分明的

模糊概念的集合許多日常生活中的概念常常都不是清晰明確的這些可說是模

糊概念例如很高很快等這類概念無法用傳統的二值集合論即 0 或 1 表示

而Zadeh教授提出的Fuzzy集合論可以將這些概念由傳統集合論的特徵函數從非

0 即 1 的二值選擇推廣為從 0 到 1 之間的任何值做選擇得到新型的特徵函數

稱為歸屬函數

模糊集合由歸屬函數表示相對於明確集合的特徵函數其值只有 0 或 1 兩個

值即其值為在實軸閉區間[01]之中的任一實數模糊集合可以彌補明確集

合描述時所產生的不合理現象因此模糊集合比傳統的明確集合更具客觀性

7

213 歸屬函數

歸屬函數〈membership function〉為 0 到 1 之間的數值吾們可以藉由歸屬

函數來描述 Fuzzy 集合的特質它是 Fuzzy 理論的最基本觀念透過歸屬函數我

們才能對 Fuzzy 集合進行量化也才可能利用精確的數學方法分析處理模糊性資

歸屬函數在 Fuzzy 控制的應用範疇內都要具備凸〈convex〉及正規〈normal〉

等基本特性〈如圖 21〉歸屬度函數的定義可以分為數值及函數兩種數值定義

方式又稱為離散化歸屬函數它是直接給定有限 Fuzzy 集合內每個元素的歸屬

度並以向量的形式表現出來函數定義方式又稱為連續化歸屬函數它是以不

同形式的函數來描述 Fuzzy 集合

圖 211 正規且凸模糊集合

1

0 圖 212 正規非凸的模糊集合

8

一個模糊集合的歸屬函數可以有許多方式但是目前最廣泛使用的有吊鐘

型三角型梯型等歸屬函數

〈1〉吊鐘形歸屬函數

吊鐘形歸屬函數定義如下

μA=bell(xabc)= b

acx 2

1

1minus

+

〈21〉

圖 22 吊鐘型歸屬函數

〈2〉三角形歸屬函數

三角形歸屬函數可由三個參數(abc)來加以決定

=Aμ trangle(xabc)

⎪⎪⎪

⎪⎪⎪

ltleminusminus

ltleminusminus

=

other

cxbcbcx

bxaabax

0

〈22〉

其中a為歸屬函數左邊界b為歸屬函數中心值c為歸屬函數右邊界

9

圖 23 三角型歸屬函數

〈3〉梯型歸屬函數

梯型歸屬函數可由四個參數加以決定

=Aμ trapezoid(xabcd)

⎪⎪⎪⎪

⎪⎪⎪⎪

leleminusminus

ltle

ltleminusminus

=

other

dxcdcdx

cxb

bxaabax

0

1 〈23〉

圖 24 梯型歸屬函數

10

214 模糊推論與模糊規則

模糊推論〈fuzzy inference〉是根據知識庫保存的規則(rule)和給予的事實

推導出新的結論與傳統推論不同的地方是Fuzzy推論不只可以處理明確命題也

可以處理Fuzzy命題Fuzzy推論是依據近似推理〈approximate reasoning〉的概念

發展出來的比傳統推論的嚴正推理〈exact reasoning〉更合理也更具彈性近

似推理是兩種嚴正推理General Modus Ponens〈簡稱GMP〉及Genera Modus

Tollens〈簡稱GMT〉的一般化此原理是從傳統二值邏輯中的肯定律〈modus

ponens〉和否定律〈modus tollens〉推廣而來其中GMP又可稱為前向推理而

GMT則可稱為反向推理

〈1〉 GMP〈General Modus Ponens〉

規則IF x is A THEN y is B

事實x is Arsquo

結論y ix Brsquo 〈24〉

〈2〉 GMT〈General Modus Tollens〉

規則IF x is A THEN y is B

事實y is Brsquo

結論x is Arsquo 〈25〉

上式中IF x is A THEN y is B即為模糊規則〈fuzzy rules〉AArsquoBBrsquo

分別是定義在論域X及Y的模糊集合xy代表輸入變數及輸出變數的語言變數

一般來說「x is A」稱為前件部〈antecedent〉而「Y is B」則稱為後件部

〈consequence〉Fuzzy知識庫〈Fuzzy Knowledge Base簡稱FKB〉即由這些模

糊規則所組成的規則庫〈rule base〉和存放描述領域知識的Fuzzy變數及語言變數

的資料庫〈data base〉所組成所以FKB是用來描述受控對象所涉及的領域知

11

識和操控目標的一些定性及定量的資訊模糊知識庫和模糊推論是構成Fuzzy規

則系統核心的兩個重要部門﹝7﹞

模糊推論是模糊系統的核心根據知識庫的模糊法則進行模糊理論的合成運

算來模擬人類的思考決策模式一般來說規則的建立是採取十分主觀直覺的

方式依據相關領域專家的經驗與知識透過詢問進而將其知識經驗歸納條列出

重點再轉換成模糊規則的形式表現出來但是並非所有的專家或操作員都能

將自身的經驗知識以言詞的方式充分的表達出來且未必能整理成條列的模糊規

則所以知識規則的萃取工作往往是在建構模糊系統時最常遭遇到的困難之

215 模糊控制器

模糊控制是智慧型控制〈intelligent control〉系統的一種典型其基本特點

是不完全依賴受控對象的數學模型主要是利用人的操作經驗知識和推理技

術以及控制系統的某些訊息和性能得出對應的控制動作模糊控制是以並行

〈parallel〉方式處理規則的推理工作〈如圖25〉其近似推理會包容每個對操

控系統有貢獻的規則即使某些貢獻程度很小的規則也不會忽略

圖 25 模糊控制系統的構造

12

一個控制器的輸入通常是確定數值而非模糊輸出也是如此才能對被控對象

發生作用但是模糊邏輯控制器〈Fuzzy Logic Controller簡稱FLC〉則是以語

言化的控制規則為主體為了能夠把輸入的確定值與語言化之後的控制規則結

合必須把輸入的確定值模糊化〈fuzzification〉以便對應到FLC語言變數的論

域範圍中同樣的經過規則庫推理出來的結果是對應到輸出語言變數的論域

中所以也必須對其做解模糊化〈defuzzification〉的工作才能達成實際的控制

目標

一般模糊控制器的架構包含了五個主要部分定義變數模糊化知識庫

模糊推論及解模糊化

〈1〉 定義輸入及輸出變數

決定程序被觀察的狀況及考慮控制的動作輸入變數可以是擷取

自受控系統的觀測量也可以是推導出來的資料輸出變數則為操控

受控系統的操作量例如在一般控制問題上輸入變數通常為輸出

誤差e與輸出誤差之變化率e而控制變數則為下一個狀態之輸入

u其中eeu統稱為模糊變數

〈2〉 模糊化

將量測值轉換為語言變數的過程將外界所輸入的確定數值經由

一比例映射傳送到輸入變數所對應的模糊論域然後再利用模糊化

函數將此輸入資料轉換成適當的口語值以供模糊運算使用此口語

化變數稱之為模糊子集合

〈3〉 知識庫

模糊知識庫是模糊控制的依據由它來定義所有使用到的語言控

制法則及相關各項參數知識庫可說是整個控制系統資料核心其包

含了兩個部分資料庫〈data base〉與規則庫〈rules base〉

1 資料庫

提供處理模糊數據之相關定義資料庫所存放的資料是關

13

於如何將明確的資料轉換成模糊數值而資料的存放方式是以

歸屬函數表示該選用哪一種歸屬函數依實際的需要選定

以三角形歸屬函數最常被使用因其運算最為容易且又能充分

的表達模糊概念

2 規則庫

利用語言化的條件式控制規則描述控制目標和策略通常

控制規則可以由操控人員的經驗或專家的知識推導出來多個

控制規則所組成的集合就是規則庫

〈4〉 模糊推論

模糊推論為模糊控制最重要的核心其最主要的工作就是做實際

的決策過程處理模糊推論具有模擬人類做決策判斷的能力其基本

理論就是根據人類特有的近似推理方式如之前已說明的GMP和

GMTGMP為前向推理而GMT為逆向推理因為模糊推論為前向

運算因此GMP非常適合使用為模糊控制的推論機構

〈5〉 解模糊化

將推論完成所得到的模糊輸出量轉換成實際的明確數值以便和

外界溝通解模糊化的方法有很多例最大歸屬度法重心法高

度法面積法等

圖 26 模糊系統的基本架構

14

22 直流馬達數學模型

圖27為直流馬達等效電路簡圖其中

iV = 輸入電壓 ai = 電樞電流

zR = 電樞電阻 gT = 轉矩

aL = 電樞電感 bE = 反電動勢

φ = 空氣隙磁通量 ω = 轉子角速度

B = 黏滯摩擦係數 J = 轉動慣量

圖 27 直流馬達等效電路簡圖

由克希荷夫電壓定律知

( ) ( ) ( )tEdt

tdiLtiRV b

aaaai ++= 〈26〉

由於反電動勢 bE 與轉軸的角速度 ( )tω 及空氣隙磁通量φ之乘積成正比即

( ) ( ) ( )tKtKtE emb ωφω == 〈27〉

15

又轉矩的平衡方程式為

( ) ( ) ( )dt

tdJtBtTgωω += 〈28〉

且馬達轉矩 gT 與電樞電流 ( )tia 及空氣隙磁通量φ乘積成正比即

( ) ( ) ( )tiKtiKtT ataag == φ 〈29〉

取〈26〉~〈29〉式之拉氏變換得

( ) ( ) ( ) ( )sEssILsIRsV baaaai ++= 〈210〉

( ) ( )sKsE eb Ω= 〈211〉

( ) ( ) ( )sJssBsTg Ω+Ω= 〈212〉

( ) ( )sIKsT atg = 〈213〉

則馬達輸入電流與轉速為

( ) ( ) ( )( ) ( )( )

sR

sEsV

sLRsEsV

sIe

a

bi

aa

bia τ+

minus

=+minus

=1

〈214〉

( ) ( ) ( )

sB

sT

sJBsT

sm

gg

τ+=

+=Ω

1 〈215〉

其中a

ae R

L=τ 為電樞電流的電氣時間常數 BJ

m =τ 為馬達轉動的機械時間

常數

直流馬達轉速對輸入電壓的轉移函數 ( )sG 為

( ) ( )( ) ( )( ) etaa

t

i KKBJsRsLK

sVssG

+++=

Ω=

( )( ) etmea

t

KKssBRK

+++=

ττ 11 〈216〉

16

在一般情況電樞電感很小所以 eτ 可以忽略不計因此上式成為一階落後

方程式

( ) ( )( ) ( ) m

m

etma

t

i sTK

KKsBRK

sVssG

+=

++=

Ω=

11 τ 〈217〉

其中

eta

mam KKBR

BRT

+=

τ

eta

tm KKBR

KK

+=

所以直流馬達數學模式可以以圖28表之﹝8﹞

圖 28 直流馬達數學模式方塊圖

17

第三章 系統功能分析與製作規劃

31 專題製作流程

如圖 31 所示本專題主要分為兩條路徑進行一為硬體另一則為軟體程

式撰寫本章著重硬體的規劃設計軟體則在第四章中介紹在完成 AB 信號

產生電路驅動功率放大電路與間距脈波產生電路設計與製作後須先接上馬達

做一連串的測試〈此時系統並無回受控制〉測試間距脈波是否太長或太短硬

體電路是否有缺失hellip等等另一方面也著手撰寫模糊控制程式並將其與硬體電

路結合最後做閉迴路系統的整合測試若發現系統的運作結果並不如預期

則需分別從硬體與軟體兩方面去改良

直流馬達轉速之模糊控制

文獻蒐集與整理

AB信號產生電路設計與製作

驅動功率放大電路設計與製作

間距脈波產生電路設計與製作

測試間距脈波是否太長或太短

系統測試測試馬達轉速是否

達到控制目的

結束與論文寫作

重新設計間距脈波長度

Yes

No

系統整合與修正

輸出信號與Fuzzy控制器之連結設計

規劃輸出與輸入歸屬函數

規劃模糊知識庫

撰寫主程式並加入模糊知識庫

程式編譯及連結

軟硬體整合測試馬達是否運作

程式調整及最佳化

No

YesYes

No

圖 31 專題製作流程圖

18

32 雙脈寬調變法之直流馬達驅動電路設計

本專題製作的雙脈寬調變法之直流馬達驅動電路設計大致可以分為二大部

分第一雙脈寬調變法之電路設計第二橋型驅動功率放大電路

雙脈寬調變〈Two Pulse Width Modulation簡稱TPWM〉之電路設計主要

是先製作一脈寬調變〈Pulse Width Modulation簡稱PWM〉波形然後再將此

波形各別經由一緩衝器〈buffer〉和反向器〈inverter〉則可產生AB驅動信號

脈波此即為TPWM

321 脈寬調變電路

如圖32先利用兩顆op產生三角波電路再利用一個比較器比較三角波

和誤差值之大小

150k

1M

20k

+12V

-12V

+12V

-12V10k

+12V

-12V

10k

+12V

-12V-

+-

+

-

+ PWMLM324

LM324

LM324

2200pF

圖 32 脈寬調變電路

〈1〉 三角波產生電路

三角波產生電路通常至少需要兩個運算放大器其電路如圖33OP1

為一個反相積分器OP2為一個史密特磁滯比較器將OP2的輸出方波經

19

OP1反相積分以後得到Vo1三角波此三角波又同時加到OP2控制其狀

態的改變

當方波產生器的輸出是正的則三角波產生器的輸出是斜向負相似

地當方波產生器的輸出是負則三角波產生器的輸出是斜向正這個動

作將產生三角波的輸出同時也輸出方波﹝9﹞

+VCC

-VCC

-

+

R1

R2

R3

+VCC

-VCC

-

+

OP1

OP2

Vo2Vo1

圖 33 三角波產生電路

對OP2而言是磁滯比較必須先找到OP2的 THV 和 TLV

232

21

32

3oo v

RRR

vRR

Rv

++

+=+ 〈31〉

當 0=+v 時

23

21 oo v

RR

v minus= 〈32〉

表要達到OP2的 0=+v 必須有這麼大的 1ov

當 12 sato Ev = 時

TLsato VERR

v =minus= 13

21 〈33〉

當 22 sato Ev minus= 時

THsato VERR

v =+= 23

21 〈34〉

20

對OP1而言是反相積分器 2ov 為其輸入 1ov 為其輸出則

tCIt

Rv

Ct

CRv

dtvCR

v oooo

11

2

11

22

111

11minus=minus=minus=minus= int 〈35〉

因為

1

2

Rvv

I o minusminus= 0=minusv 〈因為虛接地〉 〈36〉

所以

1

2

Rv

I o= 〈37〉

又因運算放大器的輸入阻抗非常大則流經 1C 的電流也為 I 相當於以定

電流對電容C 充電

當 12 sato Ev = 時 1ov 為下降斜波

tR

EC

v sato

1

1

11

1minus= 〈38〉

當 22 sato Ev minus= 時 1ov 上升斜波

( )

tRE

Cv sat

o1

2

11

1 minusminus= 〈39〉

由此可知三角波的上升與下降斜波乃因 1C 的充電與放電且時間

常數為 11CR

三角波週期分析如下

1 上升斜波的時間 1T

tCR

vv o

o1

1

21 minus= 11

2

1 CRvv

to

ominus=

1Tt = TLTHo VVv minus=1 22 sato Ev =

11111

21

sat

TLTH

sat

TLTH

EVV

CRCRE

VVT

minus=

minusminus= 〈310〉

2 下降斜波的時間 2T

tCR

vv o

o1

1

21 minus= 11

2

1 CRvv

to

ominus=

21

2Tt = THTLo VVv minus=1 12 sato Ev =

1

11111

1sat

TLTH

sat

THTL

EVV

CRCRE

VVT

minus=

minusminus= 〈311〉

3 週期 21 TTT +=

若 1satE = 2satE = satE 且3

22RR

VV TLTH =minus satE

3

2114

RR

CRT=

若R3 = nR2

則nCR

T 114=

114 CR

nf = 〈312〉

《實驗結果》

必須注意的是三角波的頻率太低將導致馬達的轉動產生脈動現象

故將工作頻率設計在1kHz以上

Ω= k1501R Ω= k102R

Ω= k203R pFC 22001 =

所得到的三角波頻率為

15kHz10220010001504

00010100020

f 12- =timestimestimestimes

timestimes

=

圖 34 三角波輸出波形

22

〈2〉 脈寬調變電路〈PWM〉

+12V

-12V

10k

+12V

-12V -

+ PWM輸出LM324三角波輸入

圖 35 脈寬調變電路

PWM系統往往連接至直流電源供應放大器的工作是以固定的頻率開

閉直流供應電壓其激發角是可以調整的因此得到波寬可調的輸出

將固定頻率的三角波與反向輸入的電壓做比較便可輸出一脈寬〈見圖

36〉反向電阻值的不同將導致反向輸入電壓不同故其輸出為一可調但

頻率固定的脈寬也正因為如此故稱為脈寬調變〈PWM〉由於輸出的

dutycycle不同故馬達將接收到不同的平均電壓因而可以藉由PWM控制

馬達的轉速

反相輸入電壓

PWM

圖 36 三角波與反相輸入電壓比較

23

PWM的優點在於馬達驅動電路的電晶體之控制信號改以脈波列來控

制使電晶體操作成類似開關的動作不是完全導通就是完全截止故電晶

體不是一直操作於作用區所以其功率消耗不大整體效率較高

《實驗結果》

圖 37 PWM 輸出波形

322 橋型驅動功率放大電路

如圖38所示主要由四個功率電晶體組成利用不同的電晶體對使直流

馬達做正逆轉控制當Q5Q8導通使馬達正轉當Q6Q7導通馬達則逆

轉電路中的電晶體扮演開關的作用

此種電路簡單只要一組直流電源供應且電晶體分擔了部份的電壓保護

電晶體迅速工作於截止與飽和狀態之間故沒有功率散逸損失之虞

但是在設計時切勿使Q5Q6同時導通以免燒毀電路上之元件因為在

AB兩脈波短暫的交變時間內由於電晶體本身之最小延遲時間有可能使Q5

Q6同時ON與Q7Q8在很短時間同時ON因此在15kHz交變下容易燒毀功

率電晶體

因此設計一間距脈波電路主要之功用使Q5Q6和Q7Q8均不同時導通

24

以拉長AB兩者交換時間

M

20k

10k

20k

10k

+24V

A 信號 B 信號

2N3055 2N3055

2N2955 2N2955

1N40021N4002

C1815 C1815

C1815 C1815

Q5

Q8Q6

Q7

圖 38 橋型驅動功率放大電路

圖 39 橋型驅動功率放大電路實體圖

25

此外若考慮電晶體BE間的電壓則電路會出現約 plusmn 06V的不感帶〈ded

band〉即電晶體的 oV 對 inV 間的關係如圖3101假使 inV 電壓為正弦波則 oV 變

成如圖3102為了改善這種缺失吾人利用兩個二極體接在電路上如圖38

用來補償電晶體BE間的壓降﹝10﹞

約06V

Dead band

Vo

Vin

圖 3101 呈現不感帶的轉移函數

圖 3102 輸出電壓波形

26

323 間距脈波產生電路

RCext15

Cext14 74123

A3

B2

Q13

CLR1

Q4

7486100k

2200pF

10k

10000pF

+5V

間距脈波輸出

圖 311 間距脈波產生電路

間距脈波的產生方式是根據脈寬調變〈PWM〉後的訊號再經由積分電路的

電阻兩端取出且經由兩倍頻器〈74LS86〉檢示出PWM的正負緣脈波最後

再利用單穩態IC〈74LS123〉將檢出信號之脈寬拉長至01ms此即為間距脈波

74LS123有兩個輸入端子A及B分別為下降波緣輸入端子及上升波緣輸入端

子當輸入A之脈波由ldquoH變成ldquoL之瞬間Q輸出變為ldquoH其持續時間長

短由RC時間常數決定反之當輸入B之脈波由ldquoL變成ldquoH之瞬間Q輸出

變成ldquoH維持一定時間

74LS123的輸出脈波之寬度是由電阻及電容之時間常數所決定概略計算公

式如下

CR045T timestimes=

電容 C 必須大於 1000pF

27

《實驗結果》

R=24kΩ C=10000pF

所以得到間距脈波為

( )msec0110810000p24k045T cong=timestimes= μ

圖 312 間距脈波

研究經分析後發現

1 間距 T 愈大愈能確保電路之安全性愈有保護作用

2 間距 T 愈大相對的使驅動信號脈波減少愈多造成馬達旋轉扭力大

大減弱

3 適當的間距 T不但不會影響馬達的輸出轉矩而且兼具保護電路的

效果

33 編碼器

轉動編碼器不只可以作為轉速的感測也能做位置的感測又適合於數位處

理故被廣泛使用若就信號來看轉動編碼器可分為增量型與絕對型若以檢

測的方式來分可分為光學式和磁式兩種在本專題中所使用的編碼器為光學式

增量型編碼器﹝11﹞

光學式轉動編碼器的原理如圖 313在附有細縫轉盤的兩側分別裝置發光元

28

件與受光元件如果只有一組光電檢測元件則輸出信號就只有一相的脈波信

號此種裝置稱為脈波產生器圖 314 為增量型轉碼器的輸出信號它是利用

兩組光電元件所產生的脈波信號A 相和 B 相間有相位差正轉時 A 相領前 B

相逆轉時 B 相領前 A 相因此利用此兩相做檢測馬達為正轉或逆轉的工作

並利用 A 相或 B 相的頻率檢測出目前的轉速

吾人計算出編碼器每一轉可以產生約 200 個脈波故檢測 A 相或 B 相其頻

率為 N則轉速應為 60200

timesN

〈rpm〉

圖 313 光學式轉動編碼器的原理圖

圖 314 編碼器的輸出信號波形

29

34 LM2917 FV 電路設計

對 LM2907 而言磁滯比較器和電流汞是構成頻率對電壓轉換的基本架構

並且預留一個運算放大器及一個電晶體供各種不同的使用圖 315 為吾人所設

計的 FV 電路圖中 C1 用以抑制電流汞動作時所產生的漣波變化正常使用時

此電容應大於 10C若 C1 太大也將造成轉換速度下降

因為單晶片 8051 之輸入電壓最高為 5V故必須設計其馬達最高轉速頻率所

轉成的電壓必須在 5V 以內由於馬達轉速頻率範圍極大故吾人給予 LM2917

+12V 的電壓以擴大它可以轉換的電壓範圍並將所需維持在 5V 內

a1

14

b1

1

a1

13

b1

2

a1

12

b1

3

a1

11

b1

4

1

a1

10

b1

5

a1

8

b1

7

a1

9

b1

6

L2917

Encoder輸 入

1uF

+12V

FV輸出1000pF

45k 10kC1

C2

圖 315 FV 電路

30

《實驗結果》

根據統計結果每 50mV 相對於 100Hz如此一來吾人想得知馬達目前

的轉速只要將單晶片所接收到的電壓值經過換算即可得知目前 encoder 所量測

的頻率吾人知道 encoder 一圈可產生 200 個脈波故馬達的轉速便可經過下列

公式換算得知

轉速〈rpm〉 60200

times=f

其中 =f encoder 所量測到的頻率

表 31 頻率與轉換電壓之關係

頻率

(Hz) 1 2 3 4 5 6 7 8 9

電壓(V) 0006 0006 0007 0008 0009 0009 0009 0009 001

頻率

(Hz) 10 20 30 40 50 60 70 80 90

電壓(V) 008 009 010 010 011 011 012 012 013

頻率

(Hz) 100 200 300 400 500 600 700 800 900

電壓(V) 013 018 023 028 033 038 043 049 054

頻率

(Hz) 1000 2000 3000 4000 5000 6000 7000 8000 9000

電壓(V) 059 109 16 209 257 304 3508 4006 45

31

圖 316 頻率對電壓曲線

35 單晶片介面電路

單晶片介面包括了二大部分分別為單晶片 8051AD converter

〈1〉8051 單晶片

為本控制系統的核心一切動作皆經由它控制

〈2〉AD converter

將類比開關所送出來的類比訊號經由 ADC 0804 轉換成數位訊號傳送

到單晶片的輸入埠

351 AD 轉換

以單晶片 8051 控制 ADC0804則單晶片 8051 必須下達ldquo開始轉換rdquo的命令

給 ADC0804然後 ADC0804 就開始讀入類比輸入端的電壓在內部開始轉換

經過一段轉換時間後〈約 100μ s〉ADC0804 就將轉換完成的值放在其內部的三

態輸出栓鎖緩衝器裡然後將轉換完成輸出腳〈INTR〉降為 low以通知單晶片

可以去讀轉換完成資料

當WR和CS 同時為ldquo0rdquo時表示對 ADC0804 下達ldquo開始轉換rdquo命令再經過

32

一段轉換時間〈100μ s〉後轉換完成ADC0804 會將其轉換完成的數位資料放

在其內部 8 位元緩衝區裡且將 INTR 降為ldquo0rdquo因此單晶片只要下達ldquo開始轉換rdquo

命令後去檢查 INTR 的狀態就可以知道是否轉換完畢其方法有兩種

1 輪詢法〈polling〉

2 中斷法〈interrupt〉

所謂輪詢法就是將 ADC0804 的 INTR接到 CPU 的一條 IO 線上然後以軟體指

令主動偵測其狀態當偵測到為ldquo0rdquo時就可以去讀出 ADC0804 裡的緩衝區的轉

換值

中斷法是一個很理想的 IO 方式因為不像輪詢法必須讓 CPU 等 ADC0804

轉換當 CPU 下達ldquo開始轉換rdquo命令後就可以做其他工作當 ADC0804 轉換完

畢後 INTR會降為ldquo0rdquo可以利用此信號去中斷 CPU再由中斷副程式去讀入

轉換值即可因此大大提高了程式的效率

當 CPU 接收到 ADC0804 發出ldquo轉換完畢rdquo的信號〈 INTR =0〉後就可以去

讀出轉換值其讀出的方法是將CS 與RD設為ldquo0rdquo即可讀到轉換值這個讀值的

動作又會使得 INTR恢復成ldquo1rdquo

1 CPU 下達ldquo開始轉換rdquo命令〈CS =0WR =0〉

2 ADC0804ldquo轉換完畢rdquo 〈 INTR =0〉

3 CPU 讀取轉換值〈 RD =0CS =0〉

4 讀完後 INTR =1

ADC0804 主要規格摘要如下

1 +5V 單電源工作電壓

2 類比電壓輸入範圍 0~+5V

33

3 參考電壓為 25V

4 轉換時間為 100μ s〈 CLKf =640kHz〉

5 解析度為 8 位元

6 誤差plusmn 1LSB

7 讀取時間 135ns

36 電源供應系統

本專題中所有電路及硬體設備所需的電源採用交流電源 110V 經由 PT-31

變壓器後再經過橋式整流後提供了直流電源而因為各個電路所需電源不同

因此製作了多組的變壓電路如下

1電壓源 DC5V選擇了 7805 的穩壓 IC 搭配電容得到了+5V 的電壓源

供〈1〉8051 微處理器 〈2〉ADC 0804 〈3〉74LS8674LS12374LS04

74LS02CD4013 〈4〉馬達 Encoder

2電壓源 DC12V使用 7812 穩壓 IC 搭配電容得到+12V 的電壓源供

LM2917 使用

3電壓源 DC24V利用 7824 的穩壓 IC 搭配電容獲得+24V 的直流電壓

源供電路之橋型驅動功率放大之電晶體使用

Vin1

+12V2

GND3

LM7812

2200uF 10000pF 2200uF 10000pF

+12V outputAC

圖 317 直流電源電路

34

圖 318 直流電源電路實體圖

37 馬達轉速的量測

表 33 PWM 輸出對應 encoder 週期

PWM dutycycle encoder 週期 PWM dutycycle encoder 週期

40 sμ 172 sμ 440 sμ 0 sμ

80 sμ 188 sμ 480 sμ 0 sμ

120 sμ 204 sμ 520 sμ 0 sμ

160 sμ 230 sμ 560 sμ 0 sμ

200 sμ 272 sμ 600 sμ 0 sμ

240 sμ 328 sμ 640 sμ 0 sμ

280 sμ 416 sμ 680 sμ 1320 sμ

320 sμ 540 sμ 720 sμ 750 sμ

360 sμ 800 sμ 760 sμ 510 sμ

400 sμ 1320 sμ 800 sμ 400 sμ

35

圖 319 PWM 輸出對應 encoder 週期

由統計可知道此馬達並不是一顆線性馬達故相信若使用模糊控制理論來

作為其回授控制系統的控制器一定能達到比傳統控制器的性能還要好而且若能

在模糊控制裡加上 PID 控制器的觀念一定能在系統的響應時間上升時間

安定時間和超越量達到最佳的控制另一方面馬達在其反方向的內阻較大需

要更大的力量才能使馬達驅動

36

第四章 軟體規劃與製作

41 PWM 之軟體設計

因為之前所介紹的硬體方式是以調整可變電阻來達到轉速的調整因此無法

得知所給予的脈寬長度和轉速大小尤其在回授時也不易給予適當的訊號來調整

轉速因此改良之方法就是以8051之軟體撰寫方式來產生固定的脈寬也就等

於給予轉速的命令而在其回授控制時也只要在內部程式给予適當的指令便可

達到脈寬長度的調整以達到閉迴路之受控系統

411 PWM 軟體流程

設定Timer0模式為0

TH0 = temp 32 TL0 = temp 32

temp = 8192 ndash j4 Key = 0

檢查是否有鍵值

將鍵值存入Key

Yes

No

設定Key值所對應的 j值

If P30 == 1Then P30 = 0 temp = 8192 ndash j4Else P30 = 1 temp=8192ndash880+j4

TH0 = temp 32 TL0 = temp 32

Start Timer0中斷副程式

啟動Timer0

等待Timer0中斷

返回主程式

圖 41 PWM 軟體設計流程圖

37

在此總共設計了五個按鈕分別代表不同的轉速停止正轉〈慢〉正轉

〈快〉逆轉〈慢〉和逆轉〈快〉使用Timer0是因為8051之計時中斷比延遲程

式來的準確故可以達到準確的計時程式設計理念中並沒有將中斷致能清除

因此Timer0會一直處於計時的狀態程式執行時將一邊檢查鍵值〈KeyStatus〉一

邊進行計時當計時完畢便呼叫中斷副程式然後執行改變Port 30的輸出狀

態若是為high則變為low反之若是為low即變為high同時並重設計時時間

Timer0繼續計時

當鍵值改變時計時的時間也會跟著改變如此一來Timer0將ㄧ直重覆上

述動作直到電源切掉Timer0才會停止計時

42 模糊控制之程式規劃與撰寫

本專題目標在完成了先前所規劃的硬體電路之後接著就是要達成利用模糊

控制理論來設計控制器在此採用了單晶片8051目的是為了以硬體實現方式來

代替電腦模擬期望能夠按照原訂計畫完成本專題「具模糊控制理論與雙脈寬調

變法之直流馬達驅動電路設計」

單晶片 8051 模糊控制的程式撰寫採下列幾個步驟依序完成

1 設定變數轉速誤差〈dspeed〉目前轉速〈sspeed〉

2 模糊化採用三角形歸屬函數採用三角形歸屬函數的原因

〈1〉 三角形函數為一連續函數

〈2〉 三角形函數為線性的函數所以計算速度較快

〈3〉 是具有發散也有收斂的函數和指數函數一樣接近

事實

3 模糊推論模糊規則將其所有可能發生情況以 IFhellipTHENhellip表示

並建立控制規則表

4 解模糊化採用重心法

38

421 歸屬函數

設定變數為目前轉速〈sspeed〉與轉速誤差〈dspeed〉因此此模糊控制器共

有兩個輸入訊號與一輸出訊號輸出訊號為脈寬長度該加或是減多少又因為有

五種不同的轉速因此各分別設計了不同的歸屬函數如下

1 當轉速 = 0

ml h

s s p e e d

d s p e e d

r p m0 5 0 1 0 0- 5 0- 1 0 0

mv l l h v h

r p m0- 3 0- 6 0- 1 0 0 3 0 6 0 1 0 0 圖 42 停止時之歸屬函數

2 正轉〈慢〉

ml hsspeed

dspeed

rpm150 225 300750

mvl l h vh

rpm150100500 200 250 300

圖 43 正轉〈慢〉之歸屬函數

39

3 正轉〈快〉

ml hsspeed

dspeed

rpm520 670 820370220

mvl l h vh

rpm500400300200 600 700 800

圖 44 正轉〈快〉之歸屬函數

4 逆轉〈慢〉

ml hsspeed

dspeed

rpm100 250 400500

mvl l h vh

rpm10050250 200 300 400 圖 45 逆轉〈慢〉之歸屬函數

40

5 逆轉〈快〉

ml hsspeed

dspeed

rpm300 450 600150

mvl l h vh

rpm450350250150 550 650 750

750

圖 46 逆轉〈快〉之歸屬函數

6 輸出

OutputMVL L H VH

rpm0-50-150-250 50 150 250

圖 47 輸出之歸屬函數

41

422 模糊規則庫

表 41 為吾人所設計的模糊控制規則庫並利用 Matlab 之 Fuzzy ToolBox 來

建立此規則庫以進行模擬推論圖 48 為當馬達輸入指令為正轉慢時推論後所得

到的三維空間圖

表 41 模糊控制規則表

Dspeed

vl l m h vh

l H M L VL VL

m VH H M L VL sspeed

h VH VH H M L

圖 48 推論後的三維空間圖

42

423 模糊控制器之軟體設計流程

Start 外部中斷副程式

ADCWR = 0 ADCWR = 1

〈令AD開始轉換〉

檢查鍵值以得到對應的歸屬函數

取得目前轉速與

轉速誤差

Fuzzy Rules決策

得到輸出訊號

Delay 10ms

ADC = 0 讀取AD值 ADCRD = 0

將AD值換算成轉速

ADCWR = 0 ADCWR = 1

〈AD開始轉換〉

返回主程式

致能外部中斷

圖 49 Fuzzy Controller 程式流程圖

當控制器一開始動作時便先執行AD轉換的工作當AD轉換完成時其

INTR的接腳便會觸發8051的外部中斷INTR0於是程式便發生外部中斷執行

外部中斷副程式的指令

43

在外部中斷副程式中AD將ㄧ直進行轉換與讀取的工作同時並將轉換後

的值直接換算成目前轉速與轉速誤差以供模糊控制器使用換算目前encoder

的頻率其公式為

160-V2000 times=頻率 〈4-1〉

式4-1之公式是根據表31所導出來的其中V為encoder之頻率轉成電壓之值

又假設所讀取的AD轉換值為value因為

AD的解析度 = bit256

5V+ = 511 ( Vbit ) 〈4-2〉

故value值與電壓V之關係為

511 value V times= 〈4-3〉

所以encoder之頻率與value值的關係為

頻率= 2000times ⎟⎠⎞

⎜⎝⎛ times

511 value - 160 〈4-4〉

故目前轉速為

sspeed = ( )rpm 60 200

times頻率 〈4-5〉

另ㄧ方面在主程式中程式會先去檢查鍵值也就等於檢查輸入指令以

找出符合使用的歸屬函數並將AD所獲得的轉速對應到歸屬函數中然後執行

決策判斷即進入規則庫中尋找出適當的決策判斷最後將此決策送入PWM程

式裡進行脈寬長度的調整使馬達在合理的要求下達到理想的轉速控制不會

因為外在環境的影響而使馬達轉速受到干擾

43 LCD 顯示轉速

此專題最後再增加一LCD顯示幕以顯示目前的轉速否則在程式設計完成

後人卻因無法以肉眼得知目前轉速而不能肯定馬達轉速是否有達到控制的目

標因此增加一顯示幕LCD是有必要的不僅隨時得知目前的轉速還能知道

44

設計出來的軟體其控制性是否夠好夠穩定

431 LCD 顯示幕之軟體流程

Start

設定LCD模組的初始狀態

設定外部中斷INTR0

與Timer0

設定TH0 = (65536 ndash 5000) 256 TL0 = (65536 ndash 5000)256

令ADCWR = 0 ADCWR = 1 AD開始轉換

等待中斷

外部中斷副程式

ADCRD = 0 讀取AD值 ADCRD = 1

將AD值換算成速度

ADCWR = 0 ADCWR = 1 AD開始轉換

Timer0中斷副程式

顯示LCD第一行

ldquoMotor Speed =

顯示LCD第二行ldquoxxxxxxx rpm其中 xxxxxx為外部中斷副程式所換算出的轉速

重設TH0與TL0

返回主程式返回主程式

圖 410 LCD 顯示幕之程式流程圖

此程式主要由兩個部分完成一為外部中斷副程式另ㄧ為 Timer0 中斷副

程式當主程式完成外部與 Timer0 兩個中斷的設定後隨即命令 AD 開始轉換

之後便一直停在 while〈1〉的迴圈裡不做任何動作而由兩個中斷副程式來完

成整個轉換與顯示的工作

45

外部中斷副程式主要負責 AD 的轉換讀取與轉速換算的工作AD 第一

次的轉換由主程式來下達命令當轉換完成後AD 的 INTR 接腳將觸發外部中

斷〈INTR0〉副程式此時程式便進入外部中斷副程式執行讀取 AD 值與轉速

換算的工作當這些工作完成時外部中斷副程式再次下達 AD 開始轉換的命

令而離開中斷副程式當 AD 再次轉換完成時又將再次執行中斷副程式

如此週而復始中斷副程式將ㄧ直進行讀取換算與轉換的工作

而 Timer0 中斷副程式主要負責 LCD 顯示之工作當主程式所設定的計時時

間計數完時程式便進入 Timer0 中斷副程式一旦進入 Timer0 中斷副程式程

式將執行 LCD 的顯示然後再重設 Timer0 的計數時間Timer0 將重新計數當

計數完時程式又將再度進入 Timer0 中斷副程式執行因為程式中並無清除

Timer0 的中斷致能故 Timer0 中斷副程式和外部中斷副程式ㄧ樣週而復始的

執行其副程式的工作

46

第五章 結論

本計劃主旨為具模糊控制理論與雙脈寬調變法之直流馬達驅動電路設計主

要是針對傳統電路設計之缺點提出改良之方法以TPWM取代PWM電路以模

糊理論基礎設計之控制器替代傳統PID控制器

TPWM轉速控制優於PWM之處在於

1 TPWM只需使用單電源即可達到正轉和逆轉的轉速控制而PWM必須

加上逆向開關或是雙電源才能使馬達產生正轉和逆轉

2 TPWM可控制馬達處於停止狀態無論在正向或逆向加上負載皆無法使

馬達產生轉動

3 馬達消耗定額功率輸出轉矩為額定值

4 馬達由停止到某定轉速時反應時間較快

模糊控制器優於PID控制器

1 不須導出繁雜的數學模型

2 適用於非線性系統

3 強健性與容錯性較高

本專題至此雖說大致的目標都已達到但是此系統仍然有許多不完美而需要

改進的地方例如在實驗過程中發現整個轉速的控制在回授上其反應時間

有點慢探討其原因有可能是控制器之程式上的問題

1 因為使用C語言撰寫程式故其執行速度較慢

2 程式可能寫的太累贅

3 模糊控制規則庫建立不良

若想改善這些問題可以嘗試著將C語言改為組合語言來撰寫並盡量減少

47

不必要的指令相信此動作一定能大大提昇程式的執行速度其次就是多做測

試利用測試中所學到的經驗來幫助模糊控制規則庫的改寫同時也能從測試中

發現更多的問題若是都能對問題加以一一解決的話相信必定能將此控制系統

做的更盡善盡美

48

參考文獻

﹝1﹞ 李適中直流馬達速度控制伺服控制〈基礎篇〉全華科技圖書股份有

限公司民 74

﹝2﹞ 廖錦文ldquo直流電動機之雙脈寬調變是〈TPWM〉驅動電路研究電

子技術月刊第 69 期pp94-1021992

﹝3﹞ 楊英魁孫宗瀛鄭魁香林建德蔣旭堂模糊控制理論與技術全華

科技圖書股份有限公司民 85

﹝4﹞ 林敦煌陳憬德直流馬達定位及轉速的模糊控制逢甲大學自動控制工

程學系學士論文民 87

﹝5﹞ LAZadehldquo Fuzzy Sets Information and Control Vol8 pp338-353

1965

﹝6﹞ EHMamdani and SAsslianldquo A fuzzy logic controller for a dynamic

plant Internation Journal of Man-Machine Studies Vol7 pp1-13 1975

﹝7﹞ 孫宗瀛楊英魁Fuzzy 控制理論實作與應用全華科技圖書股份有

限公司民 83 年

﹝8﹞ 許中平黃煌嘉直流電動機控制電路設計全華科技圖書股份有限公司

民 75

﹝9﹞ 盧明智黃敏祥OP Amp 應用+實驗模擬全華科技圖書股份有限公司

民 83

﹝10﹞陳文耀電動機控制工程復文書局2003

﹝11﹞許中平林全福電動機運轉控制技術全華科技圖書股份有限公司民

77

﹝12﹞楊明豐8051 單晶片 C 語言設計實務碁峯資訊2003 年

﹝13﹞蔡朝洋單晶片微電腦 80518951 原理與應用全華科技圖書股份有限公

司民 91

49

﹝14﹞王文俊認識 Fuzzy全華科技圖書股份有限公司民 90

50

附錄 A 專題硬體展示圖

圖 A-1 硬體整體圖

圖 A-2 硬體整體鳥瞰圖

51

圖 A-3 硬體側視圖

圖 A-4 操作與顯示面板

圖 A-5 間距脈波電路與 FV 電路

52

圖 A-6 橋型驅動功率放大電路

圖 A-7 操作與控制面板

53

附錄 B PWM 與模糊控制之程式

include reg51h include stdioh sbit ADCRD = P3^1 設定 RD 控制線接腳為 P31 sbit ADCWR = P3^3 設定 WR 控制線接腳為 P33 sbit P2_0 = 0xA0 接腳定義 sbit P2_1 = 0xA1 接腳定義 sbit P3_0 = 0xB0 接腳定義 sbit P3_1 = 0xB1 接腳定義 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P3_6 = 0xB6 接腳定義 void KeyStatus(void) 函數原型宣告 void feedback(void) 函數原型宣告 void compute_grade(void) 函數原型宣告 void delay1ms(int count) 函數原型宣告 void convert() 函數原型宣告 void condition() 函數原型宣告 void CW(void) 函數原型宣告 int j i 對應 PWM 的寬度 unsigned int temp 所設計的計時器時間 int sample = 1000 取樣率設定消除顯示值跳動 long int value r1 讀取 ADC0804 數位資料 long int set n condition select long int r grade_reg[2] grade[15] error1 error2 long int a1 b1 I long int membership[5][3]membership1[3][3] 定義歸屬函數 long int membership2[3][3] = -10-50-5050510 long int error[2] int Rule[15][3] = 113213313 定義判斷規則庫 212223323 311232333 411241342 511251351

54

main() 主程式 j = PWM = 110 設定 PWM 初始值 IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x00 設定計時器 0 工作於模式 0 temp=8192-j4 設定計時器 0 初值 TH0 = temp 32 TL0 = temp 32 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 P3_4 = 1 P3_5 = 0 P3_6 = 0 ADCWR = 0 令 ADC0804 的 WR = 0 ADCWR = 1 令 ADC0804 的 WR = 1 while (1) KeyStatus() 檢查鍵值 void KeyStatus(void) 檢查鍵值並給對應的 PWM 值 char KeyScan(void) 按鍵掃描函數宣告 unsigned char KeyStatus unsigned char Key = 0 KeyStatus=KeyScan() 呼叫按鍵掃描函數 if (KeyStatus = 0) 已有按鍵輸入 Key = KeyStatus Key = 鍵值 if (Key == 0x01) 假如輸入為按鍵 1 i = 110 PWM 為 110us j = i P3_4 = 1 LED 亮第一顆〈表馬達停止〉 P3_5 = 0 P3_6 = 0

55

else if (Key == 0x02 ) 假如輸入為按鍵 2 i = 140 PWM 為 140us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x04 ) 假如輸入為按鍵 3 i = 180 PWM 為 180us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x08 ) 假如輸入為按鍵 4 i = 80 PWM 為 80us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 else if (Key == 0x10 ) 假如輸入為按鍵 5 i = 40 PWM 為 40us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 PWM = j delay1ms(10) 呼叫延遲函數 feedback() 模糊控制判斷

56

void To_int(void) interrupt 1 Timer0 中斷函數 if (P3_0 == 0) 假如 PWM 輸出為 Low P3_0 = 1 變更 PWM 輸出為 High temp=8192-j4 設定 High 的時間 else 若 PWM 輸出為 High P3_0 = 0 變更 PWM 輸出為 Low temp=8192-880+j4 設定 Low 的時間 TH0 = temp 32 Timer0 的計時時間 TL0 = temp 32 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 char KeyScan(void) 檢查鍵值 char KeyStatus 按鍵狀態 P0=0xff 設定 P0 為輸入模式 KeyStatus=~P0 讀取按鍵狀態 return(KeyStatus) 將鍵值送回程式 void feedback(void) 模糊判斷 void Fuzzycontroller() 函數原型宣告 void condition1() 函數原型宣告

57

void condition2() 函數原型宣告 error1 = ((value)40-160)03 輸入變數 1 delay10ms(10) 延遲 10ms error2 = ((value)40-160)03 輸入變數 2 if (key == 0x01 ) 當按鍵 1找出對應的歸屬函數 並做出模糊控制判斷

int membership[5][3]= -100-60-30-60-300-30030030603060100

int membership1[3][3]=-100-500-50050050100 Fuzzycontroller() condition() if (key == 0x02 ) 當按鍵 2找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

05010050100150100150200150200250200250300 int membership1[3][3]=07515075150225150225300 Fuzzycontroller() condition() else if (key == 0x04) 當按鍵 3找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

200320400300400500400500600500600700600700800 int membership1[3][3]=220370520370520670520670820 Fuzzycontroller() condition() else if (key == 0x08) 當按鍵 4找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

02550255010050100200100200300200300400 int membership1[3][3]=05010050100250100250400 Fuzzycontroller() condition()

58

else if (key == 0x10) 當按鍵 5找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

150250350250350450350450550450550650550650750 int membership1[3][3]=150300450300450600450600750 Fuzzycontroller() condition2() void Fuzzycontroller() 模糊控制判斷 void compute_grade() 函數原型宣告 void compute_grade1() 函數原型宣告 a1 = 0 b1 = 001 I = 0 for (n=0 nlt=14 n++) r = error1 set = Rule[n][0]-1 compute_grade() 計算輸入變數 1 與

模糊程度的歸屬函數 condition = 1 r = error2 set = Rule[n][1]-1 compute_grade1() 計算輸入變數 2 與 模糊程度的歸屬函數 grade[n] = MIN(grade_reg[0] grade_reg[1]) a1 = a1 + (grade[n]membership2[Rule[n][2]-1][1]) b1 = b1 + grade[n] I = a1 b1 得到模糊控制判斷的結果 void compute_grade() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership[set][0]) || (r gt membership[set][2])) 當輸入變數不在 歸屬函數內

59

grade_reg[condition] = 0 else if ((r gt membership[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership[set][2]-r) (membership[set][2] - membership[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership[set][0]) (membership[set][1] - membership[set][0]) void compute_grade1() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership1[set][0]) || (r gt membership1[set][2])) 當輸入變數不在 歸屬函數內 grade_reg[condition] = 0 else if ((r gt membership1[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership1[set][2]-r) (membership1[set][2]-membership1[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership1[set][0]) (membership1[set][1]-membership1[set][0])

60

void condition() P2_0 = 1 設定 P20 為輸入模式 P2_1 = 1 設定 P21 為輸入模式 if ( (P2_0 == 1) ampamp (P2_1 == 0)) 當馬達為正轉時 if ( I gt 0 ) 若模糊判斷結果為正 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 若模糊判斷結果為零 PWM = PWM + 0 PWM 寬度不變 if ( I lt 0 ) 若模糊控制結果小於零 PWM = PWM + 1 PWM 寬度加 1 else if ( (P2_0 == 0) ampamp (P2_1 == 1) ) 若馬達為反轉 if ( I lt 0 ) 模糊控制小於零 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 模糊控制等於零 PWM = PWM + 0 PWM 寬度不變 if ( I gt 0 ) 模糊控制大於零 PWM = PWM + 1 PWM 寬度加 1 CW() 判斷 PWM 寬度上下限

61

void CW() 判斷 PWM 寬度上下限 if ( PWM gt= 215 ) 若 PWM 寬度 gt= 最大寬度 j = 215 PWM 寬度維持於 215us if ( PWM lt= 5 ) 若 PWM 寬度 lt= 最小寬度 j = 5 PWM 寬度維持在 5us if ( PWM gt 5 ampamp PWM lt 215 ) PWM 寬度介於最大與最小間 j = PWM PWM 依模糊控制判斷結果增減 void delay1ms(int count) 延遲 1ms int x y for ( x = 0 x lt count x++ ) for ( y = 0 y lt 122 y++ ) void convert() 數位資料換算成馬達轉速 r1 = ((value)40)-160

62

附錄 C LCD 顯示之程式

includereg51h 含 8051 所有暫存器宣告 include mathh define RS P3_5 LCD 指令資料選擇控制 define RW P3_4 LCD 讀寫控制腳 define Enable P3_3 LCD 致能接腳 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P0_0 = 0x80 接腳定義 sbit P0_1 = 0x81 接腳定義 sbit P0_2 = 0x82 接腳定義 sbit P0_3 = 0x83 接腳定義 sbit P0_4 = 0x84 接腳定義 sbit P0_5 = 0x85 接腳定義 sbit P0_6 = 0x86 接腳定義 sbit ADCRD = P3^7 設定 RD 控制線接腳為 P37 sbit ADCWR = P3^6 設定 WR 控制線接腳為 P36 void delay(void) 函數原型宣告 void delay10ms(int count) 函數原型宣告 void display(void) 函數原型宣告 void InitialLCD(void) 函數原型宣告 void WriteIns(char) 函數原型宣告 void WriteData(char) 函數原型宣告 void WriteString(charchar) 函數原型宣告 void CheckBusy(void) 函數原型宣告 void convert(void) 函數原型宣告 char MSG0[] = Motor Speed = 定義字串 MSG0 char MSG2[] = rpm 定義字串 MSG2 unsigned char MSG1[8]=0000000 定義字串 MSG1 unsigned long int value 讀取 ADC0804 數位資料 int sample = 1000 取樣率設定消除顯示值跳動 long int rpm

63

main() 主程式 InitialLCD() 初始化 LCD IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x01 設定計時器 0 工作於模式 1 TH0 = (65536-5000)256 設定計時器 0 初值 TL0 = (65536-5000)256 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 while(1) 等待中斷 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 while (--sample == 0) 取樣率減 1 sample = 1000 重設取樣率 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 void T0_int(void) interrupt 1 LCD 顯示動態掃描 display() 動態掃描顯示 TH0 = (65536-65535)256 重設計時初值 TL0 = (65536-65535)256

64

void InitialLCD(void) 設定 LCD 模組初始狀態 delay() 延遲函數 WriteIns(0x38) 設定 LCD 模組為 WriteIns(0x38) 2 行顯示 WriteIns(0x38) 8 位元介面 WriteIns(0x38) 5x7 點字型 WriteIns(0x08) 關閉顯示器 WriteIns(0x01) 清除 LCD 螢幕 WriteIns(0x0c) 令顯示器 ON但游標不顯示 WriteIns(0x06) 令 LCD 模組每接收到 1Byte 資料 AC 值自動加 1 void display() 掃描顯示 WriteIns(0x80) 設定 LCD 座標 WriteString(13MSG0) 將字串 MSG0 寫入 LCD 中 WriteIns(0xc0) 設定 LCD 座標 WriteString(8MSG1) 將字串 MSG1 寫入 LCD 中 WriteIns(0xc8) 設定 LCD 座標 WriteString(4MSG2) 將字串 MSG2 寫入 LCD 中 void convert(void) 換算轉速 long int freq freq = ((value)4000) - 16000 數位資料換成頻率公式 rpm = freq3 頻率換算轉速公式 MSG1[0] = (rpm1000000)+0x30 將結果存入字串 MSG1 中 MSG1[1] = ((rpm1000000)100000)+0x30 MSG1[2] = ((rpm100000)10000)+0x30 MSG1[3] = ((rpm10000)1000)+0x30 MSG1[4] = 0x2e MSG1[5] = ((rpm1000)100)+0x30 MSG1[6] = ((rpm100)10)+0x30 MSG1[7] = rpm10+0x30

65

void WriteIns(char instruction) 寫命令至 LCD 中 RS = 0 選擇指令暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = instruction 輸出命令至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteData(char i) 寫資料至 LCD 中 RS = 1 選擇資料暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = i 輸出資料至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteString(countMSG) 寫字串至 LCD 中 char count 字串長度 char MSG[] 字串資料 char i 定義位元組變數 for(i=0 iltcount i++) count 個位元組 WriteData(MSG[i]) 寫入一位元組的資料至 LCD 中 void CheckBusy(void) char i=0x80 檢查忙碌旗標 while(iamp0x80) 忙錄旗標 BF = 1 RS = 0 選擇指令暫存器 RW = 1 讀取 Enable = 1 致能 LCD i = P2 讀取 LCD 指令暫存器內的資料

66

Enable = 0 除能 LCD delay() 延遲函數 void delay() 延遲 5ms int i for(i=0 ilt250 i++)

  • 畢業專題封面pdf
  • File0004pdf
  • 最終版pdfpdf
Page 5: Based on Fuzzy Control Theorem and TPWM Method for DC ... · 使吾人想設計一模糊控制器來做為馬達轉速的閉迴路控制,以解決非線性系統的 問題。除此之外,flcs

IV

目錄

誌 謝 I

中文摘要 II

Abstract III

目錄 IV

圖目錄 VI

表目錄 VIII

第一章 緒論 1

11 前言 1 12 研究動機 2 13 研究方法 3 14 研究目標 4

第二章 原理探討 5

21 模糊控制與理論 5 211 模糊理論概述 5 212 模糊集合 6 213 歸屬函數 7 214 模糊推論與模糊規則 10 215 模糊控制器 11

22 直流馬達數學模型 14

第三章 系統功能分析與製作規劃 17

31 專題製作流程 17 32 雙脈寬調變法之直流馬達驅動電路設計 18

321 脈寬調變電路 18 322 橋型驅動功率放大電路 23 323 間距脈波產生電路 26

33 編碼器 27 34 LM2917 FV 電路設計 29 35 單晶片介面電路 31

351 AD 轉換31 36 電源供應系統 33 37 馬達轉速的量測 34

V

第四章 軟體規劃與製作 36

41 PWM 之軟體設計 36 411 PWM 軟體流程 36

42 模糊控制之程式規劃與撰寫 37 421 歸屬函數 38 422 模糊規則庫 41 423 模糊控制器之軟體設計流程 42

43 LCD 顯示轉速43 431 LCD 顯示幕之軟體流程 44

第五章 結論 46

參考文獻 48

附錄 A 專題硬體展示圖 50

附錄 B PWM 與模糊控制之程式53

附錄 C LCD 顯示之程式 62

VI

圖目錄

圖 11 單象限控速系統運作於第一象限2 圖 211 正規且凸模糊集合7 圖 212 正規非凸的模糊集合7 圖 22 吊鐘型歸屬函數8 圖 23 三角型歸屬函數9 圖 24 梯型歸屬函數9 圖 25 模糊控制系統的構造11 圖 26 模糊系統的基本架構13 圖 27 直流馬達等效電路簡圖14 圖 28 直流馬達數學模式方塊圖16 圖 31 專題製作流程圖17 圖 32 脈寬調變電路18 圖 33 三角波產生電路19 圖 34 三角波輸出波形21 圖 35 脈寬調變電路22 圖 36 三角波與反相輸入電壓比較22 圖 37 PWM 輸出波形 23 圖 38 橋型驅動功率放大電路24 圖 39 橋型驅動功率放大電路實體圖24 圖 3101 呈現不感帶的轉移函數25 圖 3102 輸出電壓波形25 圖 311 間距脈波產生電路26 圖 312 間距脈波27 圖 313 光學式轉動編碼器的原理圖28 圖 314 編碼器的輸出信號波形28 圖 315 FV 電路 29 圖 316 頻率對電壓曲線31 圖 317 直流電源電路33 圖 318 直流電源電路實體圖34 圖 319 PWM 輸出對應 encoder 週期 35 圖 41 PWM 軟體設計流程圖 36 圖 42 停止時之歸屬函數38 圖 43 正轉〈慢〉之歸屬函數38 圖 44 正轉〈快〉之歸屬函數39 圖 45 逆轉〈慢〉之歸屬函數39 圖 46 逆轉〈快〉之歸屬函數40

VII

圖 47 輸出之歸屬函數40 圖 48 推論後的三維空間圖41 圖 49 Fuzzy Controller 程式流程圖 42 圖 410 LCD 顯示幕之程式流程圖44 圖 A-1 硬體整體圖 50 圖 A-2 硬體整體鳥瞰圖 50 圖 A-3 硬體側視圖 51 圖 A-4 操作與顯示面板 51 圖 A-5 間距脈波電路與 FV 電路 51 圖 A-6 橋型驅動功率放大電路 52 圖 A-7 操作與控制面板 52

VIII

表目錄

表 31 頻率與轉換電壓之關係30 表 33 PWM 輸出對應 encoder 週期 34 表 41 模糊控制規則表41

1

第一章 緒論

11 前言

在現代的工程應用裡馬達扮演一個非常重要的角色它在機械設備中就好

像人的心臟一樣提供了機械運轉所需要的動力源以做為能量轉換或控制機能

的實行在眾多的馬達種類當中直流馬達不僅具有許多良好的特性例如高

啟動轉矩較易線性控制hellip等且其週邊控制元件充足控制理論發展成熟所

以被廣泛的應用在工業日常生活上馬達的速度控制被廣泛的應用在各種加工

機械航空機械農業機械交通工具等用途

直流電動機之轉速控制目前最常被使用的一種方法為脈波寬度調變〈PWM〉

驅動電路並結合傳統的 PID 控制器脈寬調變是一種以固定的頻率波寬可

調的輸出開閉供應的直流電壓使馬達感受到的平均電壓可以調整進而控制馬

達的轉速

我們日常生活中處處存在著非線性的現象但是我們較熟悉處理的卻是線

性的系統對於傳統 PID 控制器來說必須先知道受控系統〈plant〉的數學模

型否則無法導出其控制演算法則且其強健性與容錯性較低然而對於非線性

系統則不適合此法因此近年來對於非線性系統的研究工作已有許多學者嘗試

應用模糊理論〈Fuzzy Theory〉類神經網路〈Artificial Neural Networks〉基因

演算法〈Genetic Algorithms〉等非傳統方法且已有不錯之成效因此以模糊控

制理論之方法取代傳統的 PID 控制器來控制馬達轉速

對於一個非線性時變系統〈Nonlinear Time Variant System〉模糊控制理論

不但能簡化數學模型並且可以結合人類的操作經驗有效的達成控制目標模

糊控制能將操作者的專家經驗換成控制器設計人員的設計理念勢必擁有比一般

傳統的控制器更加的強健性與容錯性

2

12 研究動機

現今直流馬達的轉速控制多廣泛使用脈波寬度調變式〈Pulse Width

Modulation簡稱 PWM 驅動電路〉此種電路是以控制固定頻率的開閉供應直流

電壓以得到波寬可調的輸出使馬達的平均電壓可以調整進而轉移到馬達的

平均功率而達到轉速的控制但是由於 PWM 為一種單象限控制只運作於第一

象限這種系統本身無法產生負轉矩未加上逆向開關前亦無法反向因此無法

作用於第三象限系統加上動力制動後方可以有限度地產生逆向轉矩而運作於

第二象限〈見圖 11〉然而這也只是一種被動控制區間﹝1﹞

主動控制區動力制動

(被動運作)

Ⅱ Ⅰ

Ⅲ Ⅳ

ω

TCWCCW

圖 11 單象限控速系統運作於第一象限

本研究主要目的之一就是針對 PWM 之缺失提出了改良的方法於前級驅

動電路產生正反方向的兩個脈波信號再經驅動功率放大之後使馬達產生正

反轉向的兩拉力此即為雙脈波寬度調變式(Two Pulse Width Modulation簡稱

TPWM)本控制主要特色不論電動機正轉反轉速度快慢或停住均消

耗定額功率〈即馬達無時無刻都在運轉且輸出轉矩為額定值〉系統於寬廣的

速度變化範圍內仍具有良好的伺服性能馬達的旋轉扭力不會因速度及負載的

變化而受影響使伺服控制系統達到某一預定的特性範圍﹝2﹞

3

此外馬達的轉速會因其驅動機構的慣性影響不可能「說停就停」也

會因為摩擦力等影響不可能「說動就動」故對其操控指令一定會有延遲的

現象發生這些因素使馬達不是一個典型的線性系統故傳統的 PID 控制器就

不是最好的選擇再加上近年來模糊控制系統〈Fuzzy Logic Control System

FLCS〉的發展﹝3﹞使吾人想設計一模糊控制器來做為馬達轉速的閉迴路控

制以解決非線性系統的問題除此之外FLCS 在上升時間安定時間和超

越量上的要求也都優於傳統的 PID 控制器[4]

目前雖然有很多從事於馬達轉速控制的相關研究但是多採用脈波寬度調

變法且其尚有缺失待改良因此吾人想採用雙脈波寬度調變雖然有關此法

的研究並不多見但 TPWM 卻具有 PWM 所沒有的優點再加上近來發展愈

盛的模糊控制理論較傳統 PID 控制器的優點相信馬達轉速以 TPWM 驅動電

路之模糊控制是值得去加以研究和探討的

13 研究方法

本專題計畫其研究方法主要分為兩大類一為硬體結構電路設計另一為

Fuzzy 控制器之軟體製作硬體結構方面主要設計一比較放大器使其誤差值經

此電路與三角波比較而輸出 A 驅動信號脈波與 B 驅動信號脈波然後再由驅動

功率放大電路將信號脈波放大後控制馬達正逆轉此外為了確保功率放大電

路之安全性需在其之前加上一間距產生電路以防止其電路損毀

感測器方面則利用編碼器〈encoder〉感測出馬達的轉速然後再經由 FV

將其轉換為電壓此電壓再由 AD 轉換為數位信號送入單晶片 8051經由模

糊控制規則庫判斷並做出決策以達到馬達轉速的控制

4

14 研究目標

本專題研究目標如下

〈1〉 完成相關文獻資料之蒐集整理與討論

〈2〉 完成 AB 信號產生電路設計

〈3〉 完成間距脈波產生電路設計

〈4〉 完成驅動功率放大電路設計〈橋型驅動功率放大〉

〈5〉 完成 FV 電路設計

〈6〉 完成 AD 訊號轉換

〈7〉 編寫模糊控制法則與介面軟體設計

5

第二章 原理探討

21 模糊控制與理論

在傳統的控制領域裏控制系統動態模式的精確與否是影響控制優劣的最主

要關鍵系統動態的資訊越詳細則越能達到精確控制的目的然而對於複雜

的系統由於變數太多往往難以正確的描述系統的動態於是工程師便利用各

種方法來簡化系統動態以達成控制的目的但卻不盡理想換言之傳統的控

制理論對於明確系統有強而有力的控制能力但對於過於複雜或難以精確描述的

系統則顯得無能為力了因此便嘗試著以模糊數學來處理這些控制問題模糊

控制是屬於非線性式的控制在受控系統無法以線性數學模式精確描述的情況

下經由適當調整控制規則應具有比傳統控制方法更佳的控制性能

211 模糊理論概述

1965 年美國加州柏克萊分校的 LotfiAZadeh 教授首先在他主編的

「Information and Control」刊物上提出「Fuzzy Set」論文此為模糊邏輯理論的

創始模糊理論在經過了三十幾年的演化改進後無論是在應用或理論架構上

皆已日趨完備尤其近年來因人工智慧的迅速發展模糊理論儼然成為人工智慧

不可或缺的理論根基

Zadeh 教授曾提出一個互克性原理﹝5﹞「當系統的複雜性增長時對系統

特性做精確且有意義描述的能力亦相對降低最後精確性與有意義性將變成完全

互相排斥的特性」很高的複雜性意味著只能在一個刻意壓縮的低維因素空間觀

察而無法對問題的全部因素都進行考察使得原本是明確的概念變的模糊

Fuzzy 理論正是為了掌握這類具模糊特質的事物而發展出來的所以它的應用較

偏重於人類的經驗及對問題特性的掌握程度不主張用繁雜的數學分析及數學模

式來解決問題

Fuzzy 理論把傳統數學從二值邏輯〈binary logic〉擴展到連續多值〈continuous

6

multi-value〉利用歸屬函數〈membership function〉描述一個概念的程度亦及

使用 0 和 1 之間的數值來表示一個元素屬於某一概念的程度這個值稱為元素對

集合的歸屬度〈membership grade〉當歸屬度為 1 時表示該元素百分之百屬於

這個概念當歸屬度為 0 時則表示該元素完全不屬於這個概念介於兩者之間

的就是完全屬於和完全不屬於之間的灰色地帶

模糊理論的工程應用大約始於 1974 年倫敦大學的 EHMamdani 教授他根

據 Zadeh 提出的語言分析法〈linguistic approach〉及模糊推論〈fuzzy inference〉

運用 IF-THEN 形式的法則來敘述操作員的控制策略成功地應用在蒸汽機自動

運轉上﹝6﹞從此模糊理論的應用便迅速發展以在控制方面的研究成果最為

顯著模糊理論其實是一門相當生活化的學問由於使用語言變量描述因此更

具親和力與一般性人類日常生活所遇所用的一些敘述即大都是模糊的例如

那個人ldquo很高車開的ldquo很快等等其中ldquo很高ldquo很快並不是一個

明確值而只是描述事件的程度但是根據這些描述人類卻能很輕易的接收

212 模糊集合

模糊集合〈fuzzy set〉可視為傳統集合的擴張在模糊集合的世界中稱傳

統集合為明確集合〈crisp set〉所謂模糊集合是指用來表示界限或邊界不分明的

模糊概念的集合許多日常生活中的概念常常都不是清晰明確的這些可說是模

糊概念例如很高很快等這類概念無法用傳統的二值集合論即 0 或 1 表示

而Zadeh教授提出的Fuzzy集合論可以將這些概念由傳統集合論的特徵函數從非

0 即 1 的二值選擇推廣為從 0 到 1 之間的任何值做選擇得到新型的特徵函數

稱為歸屬函數

模糊集合由歸屬函數表示相對於明確集合的特徵函數其值只有 0 或 1 兩個

值即其值為在實軸閉區間[01]之中的任一實數模糊集合可以彌補明確集

合描述時所產生的不合理現象因此模糊集合比傳統的明確集合更具客觀性

7

213 歸屬函數

歸屬函數〈membership function〉為 0 到 1 之間的數值吾們可以藉由歸屬

函數來描述 Fuzzy 集合的特質它是 Fuzzy 理論的最基本觀念透過歸屬函數我

們才能對 Fuzzy 集合進行量化也才可能利用精確的數學方法分析處理模糊性資

歸屬函數在 Fuzzy 控制的應用範疇內都要具備凸〈convex〉及正規〈normal〉

等基本特性〈如圖 21〉歸屬度函數的定義可以分為數值及函數兩種數值定義

方式又稱為離散化歸屬函數它是直接給定有限 Fuzzy 集合內每個元素的歸屬

度並以向量的形式表現出來函數定義方式又稱為連續化歸屬函數它是以不

同形式的函數來描述 Fuzzy 集合

圖 211 正規且凸模糊集合

1

0 圖 212 正規非凸的模糊集合

8

一個模糊集合的歸屬函數可以有許多方式但是目前最廣泛使用的有吊鐘

型三角型梯型等歸屬函數

〈1〉吊鐘形歸屬函數

吊鐘形歸屬函數定義如下

μA=bell(xabc)= b

acx 2

1

1minus

+

〈21〉

圖 22 吊鐘型歸屬函數

〈2〉三角形歸屬函數

三角形歸屬函數可由三個參數(abc)來加以決定

=Aμ trangle(xabc)

⎪⎪⎪

⎪⎪⎪

ltleminusminus

ltleminusminus

=

other

cxbcbcx

bxaabax

0

〈22〉

其中a為歸屬函數左邊界b為歸屬函數中心值c為歸屬函數右邊界

9

圖 23 三角型歸屬函數

〈3〉梯型歸屬函數

梯型歸屬函數可由四個參數加以決定

=Aμ trapezoid(xabcd)

⎪⎪⎪⎪

⎪⎪⎪⎪

leleminusminus

ltle

ltleminusminus

=

other

dxcdcdx

cxb

bxaabax

0

1 〈23〉

圖 24 梯型歸屬函數

10

214 模糊推論與模糊規則

模糊推論〈fuzzy inference〉是根據知識庫保存的規則(rule)和給予的事實

推導出新的結論與傳統推論不同的地方是Fuzzy推論不只可以處理明確命題也

可以處理Fuzzy命題Fuzzy推論是依據近似推理〈approximate reasoning〉的概念

發展出來的比傳統推論的嚴正推理〈exact reasoning〉更合理也更具彈性近

似推理是兩種嚴正推理General Modus Ponens〈簡稱GMP〉及Genera Modus

Tollens〈簡稱GMT〉的一般化此原理是從傳統二值邏輯中的肯定律〈modus

ponens〉和否定律〈modus tollens〉推廣而來其中GMP又可稱為前向推理而

GMT則可稱為反向推理

〈1〉 GMP〈General Modus Ponens〉

規則IF x is A THEN y is B

事實x is Arsquo

結論y ix Brsquo 〈24〉

〈2〉 GMT〈General Modus Tollens〉

規則IF x is A THEN y is B

事實y is Brsquo

結論x is Arsquo 〈25〉

上式中IF x is A THEN y is B即為模糊規則〈fuzzy rules〉AArsquoBBrsquo

分別是定義在論域X及Y的模糊集合xy代表輸入變數及輸出變數的語言變數

一般來說「x is A」稱為前件部〈antecedent〉而「Y is B」則稱為後件部

〈consequence〉Fuzzy知識庫〈Fuzzy Knowledge Base簡稱FKB〉即由這些模

糊規則所組成的規則庫〈rule base〉和存放描述領域知識的Fuzzy變數及語言變數

的資料庫〈data base〉所組成所以FKB是用來描述受控對象所涉及的領域知

11

識和操控目標的一些定性及定量的資訊模糊知識庫和模糊推論是構成Fuzzy規

則系統核心的兩個重要部門﹝7﹞

模糊推論是模糊系統的核心根據知識庫的模糊法則進行模糊理論的合成運

算來模擬人類的思考決策模式一般來說規則的建立是採取十分主觀直覺的

方式依據相關領域專家的經驗與知識透過詢問進而將其知識經驗歸納條列出

重點再轉換成模糊規則的形式表現出來但是並非所有的專家或操作員都能

將自身的經驗知識以言詞的方式充分的表達出來且未必能整理成條列的模糊規

則所以知識規則的萃取工作往往是在建構模糊系統時最常遭遇到的困難之

215 模糊控制器

模糊控制是智慧型控制〈intelligent control〉系統的一種典型其基本特點

是不完全依賴受控對象的數學模型主要是利用人的操作經驗知識和推理技

術以及控制系統的某些訊息和性能得出對應的控制動作模糊控制是以並行

〈parallel〉方式處理規則的推理工作〈如圖25〉其近似推理會包容每個對操

控系統有貢獻的規則即使某些貢獻程度很小的規則也不會忽略

圖 25 模糊控制系統的構造

12

一個控制器的輸入通常是確定數值而非模糊輸出也是如此才能對被控對象

發生作用但是模糊邏輯控制器〈Fuzzy Logic Controller簡稱FLC〉則是以語

言化的控制規則為主體為了能夠把輸入的確定值與語言化之後的控制規則結

合必須把輸入的確定值模糊化〈fuzzification〉以便對應到FLC語言變數的論

域範圍中同樣的經過規則庫推理出來的結果是對應到輸出語言變數的論域

中所以也必須對其做解模糊化〈defuzzification〉的工作才能達成實際的控制

目標

一般模糊控制器的架構包含了五個主要部分定義變數模糊化知識庫

模糊推論及解模糊化

〈1〉 定義輸入及輸出變數

決定程序被觀察的狀況及考慮控制的動作輸入變數可以是擷取

自受控系統的觀測量也可以是推導出來的資料輸出變數則為操控

受控系統的操作量例如在一般控制問題上輸入變數通常為輸出

誤差e與輸出誤差之變化率e而控制變數則為下一個狀態之輸入

u其中eeu統稱為模糊變數

〈2〉 模糊化

將量測值轉換為語言變數的過程將外界所輸入的確定數值經由

一比例映射傳送到輸入變數所對應的模糊論域然後再利用模糊化

函數將此輸入資料轉換成適當的口語值以供模糊運算使用此口語

化變數稱之為模糊子集合

〈3〉 知識庫

模糊知識庫是模糊控制的依據由它來定義所有使用到的語言控

制法則及相關各項參數知識庫可說是整個控制系統資料核心其包

含了兩個部分資料庫〈data base〉與規則庫〈rules base〉

1 資料庫

提供處理模糊數據之相關定義資料庫所存放的資料是關

13

於如何將明確的資料轉換成模糊數值而資料的存放方式是以

歸屬函數表示該選用哪一種歸屬函數依實際的需要選定

以三角形歸屬函數最常被使用因其運算最為容易且又能充分

的表達模糊概念

2 規則庫

利用語言化的條件式控制規則描述控制目標和策略通常

控制規則可以由操控人員的經驗或專家的知識推導出來多個

控制規則所組成的集合就是規則庫

〈4〉 模糊推論

模糊推論為模糊控制最重要的核心其最主要的工作就是做實際

的決策過程處理模糊推論具有模擬人類做決策判斷的能力其基本

理論就是根據人類特有的近似推理方式如之前已說明的GMP和

GMTGMP為前向推理而GMT為逆向推理因為模糊推論為前向

運算因此GMP非常適合使用為模糊控制的推論機構

〈5〉 解模糊化

將推論完成所得到的模糊輸出量轉換成實際的明確數值以便和

外界溝通解模糊化的方法有很多例最大歸屬度法重心法高

度法面積法等

圖 26 模糊系統的基本架構

14

22 直流馬達數學模型

圖27為直流馬達等效電路簡圖其中

iV = 輸入電壓 ai = 電樞電流

zR = 電樞電阻 gT = 轉矩

aL = 電樞電感 bE = 反電動勢

φ = 空氣隙磁通量 ω = 轉子角速度

B = 黏滯摩擦係數 J = 轉動慣量

圖 27 直流馬達等效電路簡圖

由克希荷夫電壓定律知

( ) ( ) ( )tEdt

tdiLtiRV b

aaaai ++= 〈26〉

由於反電動勢 bE 與轉軸的角速度 ( )tω 及空氣隙磁通量φ之乘積成正比即

( ) ( ) ( )tKtKtE emb ωφω == 〈27〉

15

又轉矩的平衡方程式為

( ) ( ) ( )dt

tdJtBtTgωω += 〈28〉

且馬達轉矩 gT 與電樞電流 ( )tia 及空氣隙磁通量φ乘積成正比即

( ) ( ) ( )tiKtiKtT ataag == φ 〈29〉

取〈26〉~〈29〉式之拉氏變換得

( ) ( ) ( ) ( )sEssILsIRsV baaaai ++= 〈210〉

( ) ( )sKsE eb Ω= 〈211〉

( ) ( ) ( )sJssBsTg Ω+Ω= 〈212〉

( ) ( )sIKsT atg = 〈213〉

則馬達輸入電流與轉速為

( ) ( ) ( )( ) ( )( )

sR

sEsV

sLRsEsV

sIe

a

bi

aa

bia τ+

minus

=+minus

=1

〈214〉

( ) ( ) ( )

sB

sT

sJBsT

sm

gg

τ+=

+=Ω

1 〈215〉

其中a

ae R

L=τ 為電樞電流的電氣時間常數 BJ

m =τ 為馬達轉動的機械時間

常數

直流馬達轉速對輸入電壓的轉移函數 ( )sG 為

( ) ( )( ) ( )( ) etaa

t

i KKBJsRsLK

sVssG

+++=

Ω=

( )( ) etmea

t

KKssBRK

+++=

ττ 11 〈216〉

16

在一般情況電樞電感很小所以 eτ 可以忽略不計因此上式成為一階落後

方程式

( ) ( )( ) ( ) m

m

etma

t

i sTK

KKsBRK

sVssG

+=

++=

Ω=

11 τ 〈217〉

其中

eta

mam KKBR

BRT

+=

τ

eta

tm KKBR

KK

+=

所以直流馬達數學模式可以以圖28表之﹝8﹞

圖 28 直流馬達數學模式方塊圖

17

第三章 系統功能分析與製作規劃

31 專題製作流程

如圖 31 所示本專題主要分為兩條路徑進行一為硬體另一則為軟體程

式撰寫本章著重硬體的規劃設計軟體則在第四章中介紹在完成 AB 信號

產生電路驅動功率放大電路與間距脈波產生電路設計與製作後須先接上馬達

做一連串的測試〈此時系統並無回受控制〉測試間距脈波是否太長或太短硬

體電路是否有缺失hellip等等另一方面也著手撰寫模糊控制程式並將其與硬體電

路結合最後做閉迴路系統的整合測試若發現系統的運作結果並不如預期

則需分別從硬體與軟體兩方面去改良

直流馬達轉速之模糊控制

文獻蒐集與整理

AB信號產生電路設計與製作

驅動功率放大電路設計與製作

間距脈波產生電路設計與製作

測試間距脈波是否太長或太短

系統測試測試馬達轉速是否

達到控制目的

結束與論文寫作

重新設計間距脈波長度

Yes

No

系統整合與修正

輸出信號與Fuzzy控制器之連結設計

規劃輸出與輸入歸屬函數

規劃模糊知識庫

撰寫主程式並加入模糊知識庫

程式編譯及連結

軟硬體整合測試馬達是否運作

程式調整及最佳化

No

YesYes

No

圖 31 專題製作流程圖

18

32 雙脈寬調變法之直流馬達驅動電路設計

本專題製作的雙脈寬調變法之直流馬達驅動電路設計大致可以分為二大部

分第一雙脈寬調變法之電路設計第二橋型驅動功率放大電路

雙脈寬調變〈Two Pulse Width Modulation簡稱TPWM〉之電路設計主要

是先製作一脈寬調變〈Pulse Width Modulation簡稱PWM〉波形然後再將此

波形各別經由一緩衝器〈buffer〉和反向器〈inverter〉則可產生AB驅動信號

脈波此即為TPWM

321 脈寬調變電路

如圖32先利用兩顆op產生三角波電路再利用一個比較器比較三角波

和誤差值之大小

150k

1M

20k

+12V

-12V

+12V

-12V10k

+12V

-12V

10k

+12V

-12V-

+-

+

-

+ PWMLM324

LM324

LM324

2200pF

圖 32 脈寬調變電路

〈1〉 三角波產生電路

三角波產生電路通常至少需要兩個運算放大器其電路如圖33OP1

為一個反相積分器OP2為一個史密特磁滯比較器將OP2的輸出方波經

19

OP1反相積分以後得到Vo1三角波此三角波又同時加到OP2控制其狀

態的改變

當方波產生器的輸出是正的則三角波產生器的輸出是斜向負相似

地當方波產生器的輸出是負則三角波產生器的輸出是斜向正這個動

作將產生三角波的輸出同時也輸出方波﹝9﹞

+VCC

-VCC

-

+

R1

R2

R3

+VCC

-VCC

-

+

OP1

OP2

Vo2Vo1

圖 33 三角波產生電路

對OP2而言是磁滯比較必須先找到OP2的 THV 和 TLV

232

21

32

3oo v

RRR

vRR

Rv

++

+=+ 〈31〉

當 0=+v 時

23

21 oo v

RR

v minus= 〈32〉

表要達到OP2的 0=+v 必須有這麼大的 1ov

當 12 sato Ev = 時

TLsato VERR

v =minus= 13

21 〈33〉

當 22 sato Ev minus= 時

THsato VERR

v =+= 23

21 〈34〉

20

對OP1而言是反相積分器 2ov 為其輸入 1ov 為其輸出則

tCIt

Rv

Ct

CRv

dtvCR

v oooo

11

2

11

22

111

11minus=minus=minus=minus= int 〈35〉

因為

1

2

Rvv

I o minusminus= 0=minusv 〈因為虛接地〉 〈36〉

所以

1

2

Rv

I o= 〈37〉

又因運算放大器的輸入阻抗非常大則流經 1C 的電流也為 I 相當於以定

電流對電容C 充電

當 12 sato Ev = 時 1ov 為下降斜波

tR

EC

v sato

1

1

11

1minus= 〈38〉

當 22 sato Ev minus= 時 1ov 上升斜波

( )

tRE

Cv sat

o1

2

11

1 minusminus= 〈39〉

由此可知三角波的上升與下降斜波乃因 1C 的充電與放電且時間

常數為 11CR

三角波週期分析如下

1 上升斜波的時間 1T

tCR

vv o

o1

1

21 minus= 11

2

1 CRvv

to

ominus=

1Tt = TLTHo VVv minus=1 22 sato Ev =

11111

21

sat

TLTH

sat

TLTH

EVV

CRCRE

VVT

minus=

minusminus= 〈310〉

2 下降斜波的時間 2T

tCR

vv o

o1

1

21 minus= 11

2

1 CRvv

to

ominus=

21

2Tt = THTLo VVv minus=1 12 sato Ev =

1

11111

1sat

TLTH

sat

THTL

EVV

CRCRE

VVT

minus=

minusminus= 〈311〉

3 週期 21 TTT +=

若 1satE = 2satE = satE 且3

22RR

VV TLTH =minus satE

3

2114

RR

CRT=

若R3 = nR2

則nCR

T 114=

114 CR

nf = 〈312〉

《實驗結果》

必須注意的是三角波的頻率太低將導致馬達的轉動產生脈動現象

故將工作頻率設計在1kHz以上

Ω= k1501R Ω= k102R

Ω= k203R pFC 22001 =

所得到的三角波頻率為

15kHz10220010001504

00010100020

f 12- =timestimestimestimes

timestimes

=

圖 34 三角波輸出波形

22

〈2〉 脈寬調變電路〈PWM〉

+12V

-12V

10k

+12V

-12V -

+ PWM輸出LM324三角波輸入

圖 35 脈寬調變電路

PWM系統往往連接至直流電源供應放大器的工作是以固定的頻率開

閉直流供應電壓其激發角是可以調整的因此得到波寬可調的輸出

將固定頻率的三角波與反向輸入的電壓做比較便可輸出一脈寬〈見圖

36〉反向電阻值的不同將導致反向輸入電壓不同故其輸出為一可調但

頻率固定的脈寬也正因為如此故稱為脈寬調變〈PWM〉由於輸出的

dutycycle不同故馬達將接收到不同的平均電壓因而可以藉由PWM控制

馬達的轉速

反相輸入電壓

PWM

圖 36 三角波與反相輸入電壓比較

23

PWM的優點在於馬達驅動電路的電晶體之控制信號改以脈波列來控

制使電晶體操作成類似開關的動作不是完全導通就是完全截止故電晶

體不是一直操作於作用區所以其功率消耗不大整體效率較高

《實驗結果》

圖 37 PWM 輸出波形

322 橋型驅動功率放大電路

如圖38所示主要由四個功率電晶體組成利用不同的電晶體對使直流

馬達做正逆轉控制當Q5Q8導通使馬達正轉當Q6Q7導通馬達則逆

轉電路中的電晶體扮演開關的作用

此種電路簡單只要一組直流電源供應且電晶體分擔了部份的電壓保護

電晶體迅速工作於截止與飽和狀態之間故沒有功率散逸損失之虞

但是在設計時切勿使Q5Q6同時導通以免燒毀電路上之元件因為在

AB兩脈波短暫的交變時間內由於電晶體本身之最小延遲時間有可能使Q5

Q6同時ON與Q7Q8在很短時間同時ON因此在15kHz交變下容易燒毀功

率電晶體

因此設計一間距脈波電路主要之功用使Q5Q6和Q7Q8均不同時導通

24

以拉長AB兩者交換時間

M

20k

10k

20k

10k

+24V

A 信號 B 信號

2N3055 2N3055

2N2955 2N2955

1N40021N4002

C1815 C1815

C1815 C1815

Q5

Q8Q6

Q7

圖 38 橋型驅動功率放大電路

圖 39 橋型驅動功率放大電路實體圖

25

此外若考慮電晶體BE間的電壓則電路會出現約 plusmn 06V的不感帶〈ded

band〉即電晶體的 oV 對 inV 間的關係如圖3101假使 inV 電壓為正弦波則 oV 變

成如圖3102為了改善這種缺失吾人利用兩個二極體接在電路上如圖38

用來補償電晶體BE間的壓降﹝10﹞

約06V

Dead band

Vo

Vin

圖 3101 呈現不感帶的轉移函數

圖 3102 輸出電壓波形

26

323 間距脈波產生電路

RCext15

Cext14 74123

A3

B2

Q13

CLR1

Q4

7486100k

2200pF

10k

10000pF

+5V

間距脈波輸出

圖 311 間距脈波產生電路

間距脈波的產生方式是根據脈寬調變〈PWM〉後的訊號再經由積分電路的

電阻兩端取出且經由兩倍頻器〈74LS86〉檢示出PWM的正負緣脈波最後

再利用單穩態IC〈74LS123〉將檢出信號之脈寬拉長至01ms此即為間距脈波

74LS123有兩個輸入端子A及B分別為下降波緣輸入端子及上升波緣輸入端

子當輸入A之脈波由ldquoH變成ldquoL之瞬間Q輸出變為ldquoH其持續時間長

短由RC時間常數決定反之當輸入B之脈波由ldquoL變成ldquoH之瞬間Q輸出

變成ldquoH維持一定時間

74LS123的輸出脈波之寬度是由電阻及電容之時間常數所決定概略計算公

式如下

CR045T timestimes=

電容 C 必須大於 1000pF

27

《實驗結果》

R=24kΩ C=10000pF

所以得到間距脈波為

( )msec0110810000p24k045T cong=timestimes= μ

圖 312 間距脈波

研究經分析後發現

1 間距 T 愈大愈能確保電路之安全性愈有保護作用

2 間距 T 愈大相對的使驅動信號脈波減少愈多造成馬達旋轉扭力大

大減弱

3 適當的間距 T不但不會影響馬達的輸出轉矩而且兼具保護電路的

效果

33 編碼器

轉動編碼器不只可以作為轉速的感測也能做位置的感測又適合於數位處

理故被廣泛使用若就信號來看轉動編碼器可分為增量型與絕對型若以檢

測的方式來分可分為光學式和磁式兩種在本專題中所使用的編碼器為光學式

增量型編碼器﹝11﹞

光學式轉動編碼器的原理如圖 313在附有細縫轉盤的兩側分別裝置發光元

28

件與受光元件如果只有一組光電檢測元件則輸出信號就只有一相的脈波信

號此種裝置稱為脈波產生器圖 314 為增量型轉碼器的輸出信號它是利用

兩組光電元件所產生的脈波信號A 相和 B 相間有相位差正轉時 A 相領前 B

相逆轉時 B 相領前 A 相因此利用此兩相做檢測馬達為正轉或逆轉的工作

並利用 A 相或 B 相的頻率檢測出目前的轉速

吾人計算出編碼器每一轉可以產生約 200 個脈波故檢測 A 相或 B 相其頻

率為 N則轉速應為 60200

timesN

〈rpm〉

圖 313 光學式轉動編碼器的原理圖

圖 314 編碼器的輸出信號波形

29

34 LM2917 FV 電路設計

對 LM2907 而言磁滯比較器和電流汞是構成頻率對電壓轉換的基本架構

並且預留一個運算放大器及一個電晶體供各種不同的使用圖 315 為吾人所設

計的 FV 電路圖中 C1 用以抑制電流汞動作時所產生的漣波變化正常使用時

此電容應大於 10C若 C1 太大也將造成轉換速度下降

因為單晶片 8051 之輸入電壓最高為 5V故必須設計其馬達最高轉速頻率所

轉成的電壓必須在 5V 以內由於馬達轉速頻率範圍極大故吾人給予 LM2917

+12V 的電壓以擴大它可以轉換的電壓範圍並將所需維持在 5V 內

a1

14

b1

1

a1

13

b1

2

a1

12

b1

3

a1

11

b1

4

1

a1

10

b1

5

a1

8

b1

7

a1

9

b1

6

L2917

Encoder輸 入

1uF

+12V

FV輸出1000pF

45k 10kC1

C2

圖 315 FV 電路

30

《實驗結果》

根據統計結果每 50mV 相對於 100Hz如此一來吾人想得知馬達目前

的轉速只要將單晶片所接收到的電壓值經過換算即可得知目前 encoder 所量測

的頻率吾人知道 encoder 一圈可產生 200 個脈波故馬達的轉速便可經過下列

公式換算得知

轉速〈rpm〉 60200

times=f

其中 =f encoder 所量測到的頻率

表 31 頻率與轉換電壓之關係

頻率

(Hz) 1 2 3 4 5 6 7 8 9

電壓(V) 0006 0006 0007 0008 0009 0009 0009 0009 001

頻率

(Hz) 10 20 30 40 50 60 70 80 90

電壓(V) 008 009 010 010 011 011 012 012 013

頻率

(Hz) 100 200 300 400 500 600 700 800 900

電壓(V) 013 018 023 028 033 038 043 049 054

頻率

(Hz) 1000 2000 3000 4000 5000 6000 7000 8000 9000

電壓(V) 059 109 16 209 257 304 3508 4006 45

31

圖 316 頻率對電壓曲線

35 單晶片介面電路

單晶片介面包括了二大部分分別為單晶片 8051AD converter

〈1〉8051 單晶片

為本控制系統的核心一切動作皆經由它控制

〈2〉AD converter

將類比開關所送出來的類比訊號經由 ADC 0804 轉換成數位訊號傳送

到單晶片的輸入埠

351 AD 轉換

以單晶片 8051 控制 ADC0804則單晶片 8051 必須下達ldquo開始轉換rdquo的命令

給 ADC0804然後 ADC0804 就開始讀入類比輸入端的電壓在內部開始轉換

經過一段轉換時間後〈約 100μ s〉ADC0804 就將轉換完成的值放在其內部的三

態輸出栓鎖緩衝器裡然後將轉換完成輸出腳〈INTR〉降為 low以通知單晶片

可以去讀轉換完成資料

當WR和CS 同時為ldquo0rdquo時表示對 ADC0804 下達ldquo開始轉換rdquo命令再經過

32

一段轉換時間〈100μ s〉後轉換完成ADC0804 會將其轉換完成的數位資料放

在其內部 8 位元緩衝區裡且將 INTR 降為ldquo0rdquo因此單晶片只要下達ldquo開始轉換rdquo

命令後去檢查 INTR 的狀態就可以知道是否轉換完畢其方法有兩種

1 輪詢法〈polling〉

2 中斷法〈interrupt〉

所謂輪詢法就是將 ADC0804 的 INTR接到 CPU 的一條 IO 線上然後以軟體指

令主動偵測其狀態當偵測到為ldquo0rdquo時就可以去讀出 ADC0804 裡的緩衝區的轉

換值

中斷法是一個很理想的 IO 方式因為不像輪詢法必須讓 CPU 等 ADC0804

轉換當 CPU 下達ldquo開始轉換rdquo命令後就可以做其他工作當 ADC0804 轉換完

畢後 INTR會降為ldquo0rdquo可以利用此信號去中斷 CPU再由中斷副程式去讀入

轉換值即可因此大大提高了程式的效率

當 CPU 接收到 ADC0804 發出ldquo轉換完畢rdquo的信號〈 INTR =0〉後就可以去

讀出轉換值其讀出的方法是將CS 與RD設為ldquo0rdquo即可讀到轉換值這個讀值的

動作又會使得 INTR恢復成ldquo1rdquo

1 CPU 下達ldquo開始轉換rdquo命令〈CS =0WR =0〉

2 ADC0804ldquo轉換完畢rdquo 〈 INTR =0〉

3 CPU 讀取轉換值〈 RD =0CS =0〉

4 讀完後 INTR =1

ADC0804 主要規格摘要如下

1 +5V 單電源工作電壓

2 類比電壓輸入範圍 0~+5V

33

3 參考電壓為 25V

4 轉換時間為 100μ s〈 CLKf =640kHz〉

5 解析度為 8 位元

6 誤差plusmn 1LSB

7 讀取時間 135ns

36 電源供應系統

本專題中所有電路及硬體設備所需的電源採用交流電源 110V 經由 PT-31

變壓器後再經過橋式整流後提供了直流電源而因為各個電路所需電源不同

因此製作了多組的變壓電路如下

1電壓源 DC5V選擇了 7805 的穩壓 IC 搭配電容得到了+5V 的電壓源

供〈1〉8051 微處理器 〈2〉ADC 0804 〈3〉74LS8674LS12374LS04

74LS02CD4013 〈4〉馬達 Encoder

2電壓源 DC12V使用 7812 穩壓 IC 搭配電容得到+12V 的電壓源供

LM2917 使用

3電壓源 DC24V利用 7824 的穩壓 IC 搭配電容獲得+24V 的直流電壓

源供電路之橋型驅動功率放大之電晶體使用

Vin1

+12V2

GND3

LM7812

2200uF 10000pF 2200uF 10000pF

+12V outputAC

圖 317 直流電源電路

34

圖 318 直流電源電路實體圖

37 馬達轉速的量測

表 33 PWM 輸出對應 encoder 週期

PWM dutycycle encoder 週期 PWM dutycycle encoder 週期

40 sμ 172 sμ 440 sμ 0 sμ

80 sμ 188 sμ 480 sμ 0 sμ

120 sμ 204 sμ 520 sμ 0 sμ

160 sμ 230 sμ 560 sμ 0 sμ

200 sμ 272 sμ 600 sμ 0 sμ

240 sμ 328 sμ 640 sμ 0 sμ

280 sμ 416 sμ 680 sμ 1320 sμ

320 sμ 540 sμ 720 sμ 750 sμ

360 sμ 800 sμ 760 sμ 510 sμ

400 sμ 1320 sμ 800 sμ 400 sμ

35

圖 319 PWM 輸出對應 encoder 週期

由統計可知道此馬達並不是一顆線性馬達故相信若使用模糊控制理論來

作為其回授控制系統的控制器一定能達到比傳統控制器的性能還要好而且若能

在模糊控制裡加上 PID 控制器的觀念一定能在系統的響應時間上升時間

安定時間和超越量達到最佳的控制另一方面馬達在其反方向的內阻較大需

要更大的力量才能使馬達驅動

36

第四章 軟體規劃與製作

41 PWM 之軟體設計

因為之前所介紹的硬體方式是以調整可變電阻來達到轉速的調整因此無法

得知所給予的脈寬長度和轉速大小尤其在回授時也不易給予適當的訊號來調整

轉速因此改良之方法就是以8051之軟體撰寫方式來產生固定的脈寬也就等

於給予轉速的命令而在其回授控制時也只要在內部程式给予適當的指令便可

達到脈寬長度的調整以達到閉迴路之受控系統

411 PWM 軟體流程

設定Timer0模式為0

TH0 = temp 32 TL0 = temp 32

temp = 8192 ndash j4 Key = 0

檢查是否有鍵值

將鍵值存入Key

Yes

No

設定Key值所對應的 j值

If P30 == 1Then P30 = 0 temp = 8192 ndash j4Else P30 = 1 temp=8192ndash880+j4

TH0 = temp 32 TL0 = temp 32

Start Timer0中斷副程式

啟動Timer0

等待Timer0中斷

返回主程式

圖 41 PWM 軟體設計流程圖

37

在此總共設計了五個按鈕分別代表不同的轉速停止正轉〈慢〉正轉

〈快〉逆轉〈慢〉和逆轉〈快〉使用Timer0是因為8051之計時中斷比延遲程

式來的準確故可以達到準確的計時程式設計理念中並沒有將中斷致能清除

因此Timer0會一直處於計時的狀態程式執行時將一邊檢查鍵值〈KeyStatus〉一

邊進行計時當計時完畢便呼叫中斷副程式然後執行改變Port 30的輸出狀

態若是為high則變為low反之若是為low即變為high同時並重設計時時間

Timer0繼續計時

當鍵值改變時計時的時間也會跟著改變如此一來Timer0將ㄧ直重覆上

述動作直到電源切掉Timer0才會停止計時

42 模糊控制之程式規劃與撰寫

本專題目標在完成了先前所規劃的硬體電路之後接著就是要達成利用模糊

控制理論來設計控制器在此採用了單晶片8051目的是為了以硬體實現方式來

代替電腦模擬期望能夠按照原訂計畫完成本專題「具模糊控制理論與雙脈寬調

變法之直流馬達驅動電路設計」

單晶片 8051 模糊控制的程式撰寫採下列幾個步驟依序完成

1 設定變數轉速誤差〈dspeed〉目前轉速〈sspeed〉

2 模糊化採用三角形歸屬函數採用三角形歸屬函數的原因

〈1〉 三角形函數為一連續函數

〈2〉 三角形函數為線性的函數所以計算速度較快

〈3〉 是具有發散也有收斂的函數和指數函數一樣接近

事實

3 模糊推論模糊規則將其所有可能發生情況以 IFhellipTHENhellip表示

並建立控制規則表

4 解模糊化採用重心法

38

421 歸屬函數

設定變數為目前轉速〈sspeed〉與轉速誤差〈dspeed〉因此此模糊控制器共

有兩個輸入訊號與一輸出訊號輸出訊號為脈寬長度該加或是減多少又因為有

五種不同的轉速因此各分別設計了不同的歸屬函數如下

1 當轉速 = 0

ml h

s s p e e d

d s p e e d

r p m0 5 0 1 0 0- 5 0- 1 0 0

mv l l h v h

r p m0- 3 0- 6 0- 1 0 0 3 0 6 0 1 0 0 圖 42 停止時之歸屬函數

2 正轉〈慢〉

ml hsspeed

dspeed

rpm150 225 300750

mvl l h vh

rpm150100500 200 250 300

圖 43 正轉〈慢〉之歸屬函數

39

3 正轉〈快〉

ml hsspeed

dspeed

rpm520 670 820370220

mvl l h vh

rpm500400300200 600 700 800

圖 44 正轉〈快〉之歸屬函數

4 逆轉〈慢〉

ml hsspeed

dspeed

rpm100 250 400500

mvl l h vh

rpm10050250 200 300 400 圖 45 逆轉〈慢〉之歸屬函數

40

5 逆轉〈快〉

ml hsspeed

dspeed

rpm300 450 600150

mvl l h vh

rpm450350250150 550 650 750

750

圖 46 逆轉〈快〉之歸屬函數

6 輸出

OutputMVL L H VH

rpm0-50-150-250 50 150 250

圖 47 輸出之歸屬函數

41

422 模糊規則庫

表 41 為吾人所設計的模糊控制規則庫並利用 Matlab 之 Fuzzy ToolBox 來

建立此規則庫以進行模擬推論圖 48 為當馬達輸入指令為正轉慢時推論後所得

到的三維空間圖

表 41 模糊控制規則表

Dspeed

vl l m h vh

l H M L VL VL

m VH H M L VL sspeed

h VH VH H M L

圖 48 推論後的三維空間圖

42

423 模糊控制器之軟體設計流程

Start 外部中斷副程式

ADCWR = 0 ADCWR = 1

〈令AD開始轉換〉

檢查鍵值以得到對應的歸屬函數

取得目前轉速與

轉速誤差

Fuzzy Rules決策

得到輸出訊號

Delay 10ms

ADC = 0 讀取AD值 ADCRD = 0

將AD值換算成轉速

ADCWR = 0 ADCWR = 1

〈AD開始轉換〉

返回主程式

致能外部中斷

圖 49 Fuzzy Controller 程式流程圖

當控制器一開始動作時便先執行AD轉換的工作當AD轉換完成時其

INTR的接腳便會觸發8051的外部中斷INTR0於是程式便發生外部中斷執行

外部中斷副程式的指令

43

在外部中斷副程式中AD將ㄧ直進行轉換與讀取的工作同時並將轉換後

的值直接換算成目前轉速與轉速誤差以供模糊控制器使用換算目前encoder

的頻率其公式為

160-V2000 times=頻率 〈4-1〉

式4-1之公式是根據表31所導出來的其中V為encoder之頻率轉成電壓之值

又假設所讀取的AD轉換值為value因為

AD的解析度 = bit256

5V+ = 511 ( Vbit ) 〈4-2〉

故value值與電壓V之關係為

511 value V times= 〈4-3〉

所以encoder之頻率與value值的關係為

頻率= 2000times ⎟⎠⎞

⎜⎝⎛ times

511 value - 160 〈4-4〉

故目前轉速為

sspeed = ( )rpm 60 200

times頻率 〈4-5〉

另ㄧ方面在主程式中程式會先去檢查鍵值也就等於檢查輸入指令以

找出符合使用的歸屬函數並將AD所獲得的轉速對應到歸屬函數中然後執行

決策判斷即進入規則庫中尋找出適當的決策判斷最後將此決策送入PWM程

式裡進行脈寬長度的調整使馬達在合理的要求下達到理想的轉速控制不會

因為外在環境的影響而使馬達轉速受到干擾

43 LCD 顯示轉速

此專題最後再增加一LCD顯示幕以顯示目前的轉速否則在程式設計完成

後人卻因無法以肉眼得知目前轉速而不能肯定馬達轉速是否有達到控制的目

標因此增加一顯示幕LCD是有必要的不僅隨時得知目前的轉速還能知道

44

設計出來的軟體其控制性是否夠好夠穩定

431 LCD 顯示幕之軟體流程

Start

設定LCD模組的初始狀態

設定外部中斷INTR0

與Timer0

設定TH0 = (65536 ndash 5000) 256 TL0 = (65536 ndash 5000)256

令ADCWR = 0 ADCWR = 1 AD開始轉換

等待中斷

外部中斷副程式

ADCRD = 0 讀取AD值 ADCRD = 1

將AD值換算成速度

ADCWR = 0 ADCWR = 1 AD開始轉換

Timer0中斷副程式

顯示LCD第一行

ldquoMotor Speed =

顯示LCD第二行ldquoxxxxxxx rpm其中 xxxxxx為外部中斷副程式所換算出的轉速

重設TH0與TL0

返回主程式返回主程式

圖 410 LCD 顯示幕之程式流程圖

此程式主要由兩個部分完成一為外部中斷副程式另ㄧ為 Timer0 中斷副

程式當主程式完成外部與 Timer0 兩個中斷的設定後隨即命令 AD 開始轉換

之後便一直停在 while〈1〉的迴圈裡不做任何動作而由兩個中斷副程式來完

成整個轉換與顯示的工作

45

外部中斷副程式主要負責 AD 的轉換讀取與轉速換算的工作AD 第一

次的轉換由主程式來下達命令當轉換完成後AD 的 INTR 接腳將觸發外部中

斷〈INTR0〉副程式此時程式便進入外部中斷副程式執行讀取 AD 值與轉速

換算的工作當這些工作完成時外部中斷副程式再次下達 AD 開始轉換的命

令而離開中斷副程式當 AD 再次轉換完成時又將再次執行中斷副程式

如此週而復始中斷副程式將ㄧ直進行讀取換算與轉換的工作

而 Timer0 中斷副程式主要負責 LCD 顯示之工作當主程式所設定的計時時

間計數完時程式便進入 Timer0 中斷副程式一旦進入 Timer0 中斷副程式程

式將執行 LCD 的顯示然後再重設 Timer0 的計數時間Timer0 將重新計數當

計數完時程式又將再度進入 Timer0 中斷副程式執行因為程式中並無清除

Timer0 的中斷致能故 Timer0 中斷副程式和外部中斷副程式ㄧ樣週而復始的

執行其副程式的工作

46

第五章 結論

本計劃主旨為具模糊控制理論與雙脈寬調變法之直流馬達驅動電路設計主

要是針對傳統電路設計之缺點提出改良之方法以TPWM取代PWM電路以模

糊理論基礎設計之控制器替代傳統PID控制器

TPWM轉速控制優於PWM之處在於

1 TPWM只需使用單電源即可達到正轉和逆轉的轉速控制而PWM必須

加上逆向開關或是雙電源才能使馬達產生正轉和逆轉

2 TPWM可控制馬達處於停止狀態無論在正向或逆向加上負載皆無法使

馬達產生轉動

3 馬達消耗定額功率輸出轉矩為額定值

4 馬達由停止到某定轉速時反應時間較快

模糊控制器優於PID控制器

1 不須導出繁雜的數學模型

2 適用於非線性系統

3 強健性與容錯性較高

本專題至此雖說大致的目標都已達到但是此系統仍然有許多不完美而需要

改進的地方例如在實驗過程中發現整個轉速的控制在回授上其反應時間

有點慢探討其原因有可能是控制器之程式上的問題

1 因為使用C語言撰寫程式故其執行速度較慢

2 程式可能寫的太累贅

3 模糊控制規則庫建立不良

若想改善這些問題可以嘗試著將C語言改為組合語言來撰寫並盡量減少

47

不必要的指令相信此動作一定能大大提昇程式的執行速度其次就是多做測

試利用測試中所學到的經驗來幫助模糊控制規則庫的改寫同時也能從測試中

發現更多的問題若是都能對問題加以一一解決的話相信必定能將此控制系統

做的更盡善盡美

48

參考文獻

﹝1﹞ 李適中直流馬達速度控制伺服控制〈基礎篇〉全華科技圖書股份有

限公司民 74

﹝2﹞ 廖錦文ldquo直流電動機之雙脈寬調變是〈TPWM〉驅動電路研究電

子技術月刊第 69 期pp94-1021992

﹝3﹞ 楊英魁孫宗瀛鄭魁香林建德蔣旭堂模糊控制理論與技術全華

科技圖書股份有限公司民 85

﹝4﹞ 林敦煌陳憬德直流馬達定位及轉速的模糊控制逢甲大學自動控制工

程學系學士論文民 87

﹝5﹞ LAZadehldquo Fuzzy Sets Information and Control Vol8 pp338-353

1965

﹝6﹞ EHMamdani and SAsslianldquo A fuzzy logic controller for a dynamic

plant Internation Journal of Man-Machine Studies Vol7 pp1-13 1975

﹝7﹞ 孫宗瀛楊英魁Fuzzy 控制理論實作與應用全華科技圖書股份有

限公司民 83 年

﹝8﹞ 許中平黃煌嘉直流電動機控制電路設計全華科技圖書股份有限公司

民 75

﹝9﹞ 盧明智黃敏祥OP Amp 應用+實驗模擬全華科技圖書股份有限公司

民 83

﹝10﹞陳文耀電動機控制工程復文書局2003

﹝11﹞許中平林全福電動機運轉控制技術全華科技圖書股份有限公司民

77

﹝12﹞楊明豐8051 單晶片 C 語言設計實務碁峯資訊2003 年

﹝13﹞蔡朝洋單晶片微電腦 80518951 原理與應用全華科技圖書股份有限公

司民 91

49

﹝14﹞王文俊認識 Fuzzy全華科技圖書股份有限公司民 90

50

附錄 A 專題硬體展示圖

圖 A-1 硬體整體圖

圖 A-2 硬體整體鳥瞰圖

51

圖 A-3 硬體側視圖

圖 A-4 操作與顯示面板

圖 A-5 間距脈波電路與 FV 電路

52

圖 A-6 橋型驅動功率放大電路

圖 A-7 操作與控制面板

53

附錄 B PWM 與模糊控制之程式

include reg51h include stdioh sbit ADCRD = P3^1 設定 RD 控制線接腳為 P31 sbit ADCWR = P3^3 設定 WR 控制線接腳為 P33 sbit P2_0 = 0xA0 接腳定義 sbit P2_1 = 0xA1 接腳定義 sbit P3_0 = 0xB0 接腳定義 sbit P3_1 = 0xB1 接腳定義 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P3_6 = 0xB6 接腳定義 void KeyStatus(void) 函數原型宣告 void feedback(void) 函數原型宣告 void compute_grade(void) 函數原型宣告 void delay1ms(int count) 函數原型宣告 void convert() 函數原型宣告 void condition() 函數原型宣告 void CW(void) 函數原型宣告 int j i 對應 PWM 的寬度 unsigned int temp 所設計的計時器時間 int sample = 1000 取樣率設定消除顯示值跳動 long int value r1 讀取 ADC0804 數位資料 long int set n condition select long int r grade_reg[2] grade[15] error1 error2 long int a1 b1 I long int membership[5][3]membership1[3][3] 定義歸屬函數 long int membership2[3][3] = -10-50-5050510 long int error[2] int Rule[15][3] = 113213313 定義判斷規則庫 212223323 311232333 411241342 511251351

54

main() 主程式 j = PWM = 110 設定 PWM 初始值 IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x00 設定計時器 0 工作於模式 0 temp=8192-j4 設定計時器 0 初值 TH0 = temp 32 TL0 = temp 32 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 P3_4 = 1 P3_5 = 0 P3_6 = 0 ADCWR = 0 令 ADC0804 的 WR = 0 ADCWR = 1 令 ADC0804 的 WR = 1 while (1) KeyStatus() 檢查鍵值 void KeyStatus(void) 檢查鍵值並給對應的 PWM 值 char KeyScan(void) 按鍵掃描函數宣告 unsigned char KeyStatus unsigned char Key = 0 KeyStatus=KeyScan() 呼叫按鍵掃描函數 if (KeyStatus = 0) 已有按鍵輸入 Key = KeyStatus Key = 鍵值 if (Key == 0x01) 假如輸入為按鍵 1 i = 110 PWM 為 110us j = i P3_4 = 1 LED 亮第一顆〈表馬達停止〉 P3_5 = 0 P3_6 = 0

55

else if (Key == 0x02 ) 假如輸入為按鍵 2 i = 140 PWM 為 140us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x04 ) 假如輸入為按鍵 3 i = 180 PWM 為 180us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x08 ) 假如輸入為按鍵 4 i = 80 PWM 為 80us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 else if (Key == 0x10 ) 假如輸入為按鍵 5 i = 40 PWM 為 40us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 PWM = j delay1ms(10) 呼叫延遲函數 feedback() 模糊控制判斷

56

void To_int(void) interrupt 1 Timer0 中斷函數 if (P3_0 == 0) 假如 PWM 輸出為 Low P3_0 = 1 變更 PWM 輸出為 High temp=8192-j4 設定 High 的時間 else 若 PWM 輸出為 High P3_0 = 0 變更 PWM 輸出為 Low temp=8192-880+j4 設定 Low 的時間 TH0 = temp 32 Timer0 的計時時間 TL0 = temp 32 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 char KeyScan(void) 檢查鍵值 char KeyStatus 按鍵狀態 P0=0xff 設定 P0 為輸入模式 KeyStatus=~P0 讀取按鍵狀態 return(KeyStatus) 將鍵值送回程式 void feedback(void) 模糊判斷 void Fuzzycontroller() 函數原型宣告 void condition1() 函數原型宣告

57

void condition2() 函數原型宣告 error1 = ((value)40-160)03 輸入變數 1 delay10ms(10) 延遲 10ms error2 = ((value)40-160)03 輸入變數 2 if (key == 0x01 ) 當按鍵 1找出對應的歸屬函數 並做出模糊控制判斷

int membership[5][3]= -100-60-30-60-300-30030030603060100

int membership1[3][3]=-100-500-50050050100 Fuzzycontroller() condition() if (key == 0x02 ) 當按鍵 2找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

05010050100150100150200150200250200250300 int membership1[3][3]=07515075150225150225300 Fuzzycontroller() condition() else if (key == 0x04) 當按鍵 3找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

200320400300400500400500600500600700600700800 int membership1[3][3]=220370520370520670520670820 Fuzzycontroller() condition() else if (key == 0x08) 當按鍵 4找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

02550255010050100200100200300200300400 int membership1[3][3]=05010050100250100250400 Fuzzycontroller() condition()

58

else if (key == 0x10) 當按鍵 5找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

150250350250350450350450550450550650550650750 int membership1[3][3]=150300450300450600450600750 Fuzzycontroller() condition2() void Fuzzycontroller() 模糊控制判斷 void compute_grade() 函數原型宣告 void compute_grade1() 函數原型宣告 a1 = 0 b1 = 001 I = 0 for (n=0 nlt=14 n++) r = error1 set = Rule[n][0]-1 compute_grade() 計算輸入變數 1 與

模糊程度的歸屬函數 condition = 1 r = error2 set = Rule[n][1]-1 compute_grade1() 計算輸入變數 2 與 模糊程度的歸屬函數 grade[n] = MIN(grade_reg[0] grade_reg[1]) a1 = a1 + (grade[n]membership2[Rule[n][2]-1][1]) b1 = b1 + grade[n] I = a1 b1 得到模糊控制判斷的結果 void compute_grade() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership[set][0]) || (r gt membership[set][2])) 當輸入變數不在 歸屬函數內

59

grade_reg[condition] = 0 else if ((r gt membership[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership[set][2]-r) (membership[set][2] - membership[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership[set][0]) (membership[set][1] - membership[set][0]) void compute_grade1() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership1[set][0]) || (r gt membership1[set][2])) 當輸入變數不在 歸屬函數內 grade_reg[condition] = 0 else if ((r gt membership1[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership1[set][2]-r) (membership1[set][2]-membership1[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership1[set][0]) (membership1[set][1]-membership1[set][0])

60

void condition() P2_0 = 1 設定 P20 為輸入模式 P2_1 = 1 設定 P21 為輸入模式 if ( (P2_0 == 1) ampamp (P2_1 == 0)) 當馬達為正轉時 if ( I gt 0 ) 若模糊判斷結果為正 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 若模糊判斷結果為零 PWM = PWM + 0 PWM 寬度不變 if ( I lt 0 ) 若模糊控制結果小於零 PWM = PWM + 1 PWM 寬度加 1 else if ( (P2_0 == 0) ampamp (P2_1 == 1) ) 若馬達為反轉 if ( I lt 0 ) 模糊控制小於零 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 模糊控制等於零 PWM = PWM + 0 PWM 寬度不變 if ( I gt 0 ) 模糊控制大於零 PWM = PWM + 1 PWM 寬度加 1 CW() 判斷 PWM 寬度上下限

61

void CW() 判斷 PWM 寬度上下限 if ( PWM gt= 215 ) 若 PWM 寬度 gt= 最大寬度 j = 215 PWM 寬度維持於 215us if ( PWM lt= 5 ) 若 PWM 寬度 lt= 最小寬度 j = 5 PWM 寬度維持在 5us if ( PWM gt 5 ampamp PWM lt 215 ) PWM 寬度介於最大與最小間 j = PWM PWM 依模糊控制判斷結果增減 void delay1ms(int count) 延遲 1ms int x y for ( x = 0 x lt count x++ ) for ( y = 0 y lt 122 y++ ) void convert() 數位資料換算成馬達轉速 r1 = ((value)40)-160

62

附錄 C LCD 顯示之程式

includereg51h 含 8051 所有暫存器宣告 include mathh define RS P3_5 LCD 指令資料選擇控制 define RW P3_4 LCD 讀寫控制腳 define Enable P3_3 LCD 致能接腳 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P0_0 = 0x80 接腳定義 sbit P0_1 = 0x81 接腳定義 sbit P0_2 = 0x82 接腳定義 sbit P0_3 = 0x83 接腳定義 sbit P0_4 = 0x84 接腳定義 sbit P0_5 = 0x85 接腳定義 sbit P0_6 = 0x86 接腳定義 sbit ADCRD = P3^7 設定 RD 控制線接腳為 P37 sbit ADCWR = P3^6 設定 WR 控制線接腳為 P36 void delay(void) 函數原型宣告 void delay10ms(int count) 函數原型宣告 void display(void) 函數原型宣告 void InitialLCD(void) 函數原型宣告 void WriteIns(char) 函數原型宣告 void WriteData(char) 函數原型宣告 void WriteString(charchar) 函數原型宣告 void CheckBusy(void) 函數原型宣告 void convert(void) 函數原型宣告 char MSG0[] = Motor Speed = 定義字串 MSG0 char MSG2[] = rpm 定義字串 MSG2 unsigned char MSG1[8]=0000000 定義字串 MSG1 unsigned long int value 讀取 ADC0804 數位資料 int sample = 1000 取樣率設定消除顯示值跳動 long int rpm

63

main() 主程式 InitialLCD() 初始化 LCD IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x01 設定計時器 0 工作於模式 1 TH0 = (65536-5000)256 設定計時器 0 初值 TL0 = (65536-5000)256 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 while(1) 等待中斷 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 while (--sample == 0) 取樣率減 1 sample = 1000 重設取樣率 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 void T0_int(void) interrupt 1 LCD 顯示動態掃描 display() 動態掃描顯示 TH0 = (65536-65535)256 重設計時初值 TL0 = (65536-65535)256

64

void InitialLCD(void) 設定 LCD 模組初始狀態 delay() 延遲函數 WriteIns(0x38) 設定 LCD 模組為 WriteIns(0x38) 2 行顯示 WriteIns(0x38) 8 位元介面 WriteIns(0x38) 5x7 點字型 WriteIns(0x08) 關閉顯示器 WriteIns(0x01) 清除 LCD 螢幕 WriteIns(0x0c) 令顯示器 ON但游標不顯示 WriteIns(0x06) 令 LCD 模組每接收到 1Byte 資料 AC 值自動加 1 void display() 掃描顯示 WriteIns(0x80) 設定 LCD 座標 WriteString(13MSG0) 將字串 MSG0 寫入 LCD 中 WriteIns(0xc0) 設定 LCD 座標 WriteString(8MSG1) 將字串 MSG1 寫入 LCD 中 WriteIns(0xc8) 設定 LCD 座標 WriteString(4MSG2) 將字串 MSG2 寫入 LCD 中 void convert(void) 換算轉速 long int freq freq = ((value)4000) - 16000 數位資料換成頻率公式 rpm = freq3 頻率換算轉速公式 MSG1[0] = (rpm1000000)+0x30 將結果存入字串 MSG1 中 MSG1[1] = ((rpm1000000)100000)+0x30 MSG1[2] = ((rpm100000)10000)+0x30 MSG1[3] = ((rpm10000)1000)+0x30 MSG1[4] = 0x2e MSG1[5] = ((rpm1000)100)+0x30 MSG1[6] = ((rpm100)10)+0x30 MSG1[7] = rpm10+0x30

65

void WriteIns(char instruction) 寫命令至 LCD 中 RS = 0 選擇指令暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = instruction 輸出命令至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteData(char i) 寫資料至 LCD 中 RS = 1 選擇資料暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = i 輸出資料至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteString(countMSG) 寫字串至 LCD 中 char count 字串長度 char MSG[] 字串資料 char i 定義位元組變數 for(i=0 iltcount i++) count 個位元組 WriteData(MSG[i]) 寫入一位元組的資料至 LCD 中 void CheckBusy(void) char i=0x80 檢查忙碌旗標 while(iamp0x80) 忙錄旗標 BF = 1 RS = 0 選擇指令暫存器 RW = 1 讀取 Enable = 1 致能 LCD i = P2 讀取 LCD 指令暫存器內的資料

66

Enable = 0 除能 LCD delay() 延遲函數 void delay() 延遲 5ms int i for(i=0 ilt250 i++)

  • 畢業專題封面pdf
  • File0004pdf
  • 最終版pdfpdf
Page 6: Based on Fuzzy Control Theorem and TPWM Method for DC ... · 使吾人想設計一模糊控制器來做為馬達轉速的閉迴路控制,以解決非線性系統的 問題。除此之外,flcs

V

第四章 軟體規劃與製作 36

41 PWM 之軟體設計 36 411 PWM 軟體流程 36

42 模糊控制之程式規劃與撰寫 37 421 歸屬函數 38 422 模糊規則庫 41 423 模糊控制器之軟體設計流程 42

43 LCD 顯示轉速43 431 LCD 顯示幕之軟體流程 44

第五章 結論 46

參考文獻 48

附錄 A 專題硬體展示圖 50

附錄 B PWM 與模糊控制之程式53

附錄 C LCD 顯示之程式 62

VI

圖目錄

圖 11 單象限控速系統運作於第一象限2 圖 211 正規且凸模糊集合7 圖 212 正規非凸的模糊集合7 圖 22 吊鐘型歸屬函數8 圖 23 三角型歸屬函數9 圖 24 梯型歸屬函數9 圖 25 模糊控制系統的構造11 圖 26 模糊系統的基本架構13 圖 27 直流馬達等效電路簡圖14 圖 28 直流馬達數學模式方塊圖16 圖 31 專題製作流程圖17 圖 32 脈寬調變電路18 圖 33 三角波產生電路19 圖 34 三角波輸出波形21 圖 35 脈寬調變電路22 圖 36 三角波與反相輸入電壓比較22 圖 37 PWM 輸出波形 23 圖 38 橋型驅動功率放大電路24 圖 39 橋型驅動功率放大電路實體圖24 圖 3101 呈現不感帶的轉移函數25 圖 3102 輸出電壓波形25 圖 311 間距脈波產生電路26 圖 312 間距脈波27 圖 313 光學式轉動編碼器的原理圖28 圖 314 編碼器的輸出信號波形28 圖 315 FV 電路 29 圖 316 頻率對電壓曲線31 圖 317 直流電源電路33 圖 318 直流電源電路實體圖34 圖 319 PWM 輸出對應 encoder 週期 35 圖 41 PWM 軟體設計流程圖 36 圖 42 停止時之歸屬函數38 圖 43 正轉〈慢〉之歸屬函數38 圖 44 正轉〈快〉之歸屬函數39 圖 45 逆轉〈慢〉之歸屬函數39 圖 46 逆轉〈快〉之歸屬函數40

VII

圖 47 輸出之歸屬函數40 圖 48 推論後的三維空間圖41 圖 49 Fuzzy Controller 程式流程圖 42 圖 410 LCD 顯示幕之程式流程圖44 圖 A-1 硬體整體圖 50 圖 A-2 硬體整體鳥瞰圖 50 圖 A-3 硬體側視圖 51 圖 A-4 操作與顯示面板 51 圖 A-5 間距脈波電路與 FV 電路 51 圖 A-6 橋型驅動功率放大電路 52 圖 A-7 操作與控制面板 52

VIII

表目錄

表 31 頻率與轉換電壓之關係30 表 33 PWM 輸出對應 encoder 週期 34 表 41 模糊控制規則表41

1

第一章 緒論

11 前言

在現代的工程應用裡馬達扮演一個非常重要的角色它在機械設備中就好

像人的心臟一樣提供了機械運轉所需要的動力源以做為能量轉換或控制機能

的實行在眾多的馬達種類當中直流馬達不僅具有許多良好的特性例如高

啟動轉矩較易線性控制hellip等且其週邊控制元件充足控制理論發展成熟所

以被廣泛的應用在工業日常生活上馬達的速度控制被廣泛的應用在各種加工

機械航空機械農業機械交通工具等用途

直流電動機之轉速控制目前最常被使用的一種方法為脈波寬度調變〈PWM〉

驅動電路並結合傳統的 PID 控制器脈寬調變是一種以固定的頻率波寬可

調的輸出開閉供應的直流電壓使馬達感受到的平均電壓可以調整進而控制馬

達的轉速

我們日常生活中處處存在著非線性的現象但是我們較熟悉處理的卻是線

性的系統對於傳統 PID 控制器來說必須先知道受控系統〈plant〉的數學模

型否則無法導出其控制演算法則且其強健性與容錯性較低然而對於非線性

系統則不適合此法因此近年來對於非線性系統的研究工作已有許多學者嘗試

應用模糊理論〈Fuzzy Theory〉類神經網路〈Artificial Neural Networks〉基因

演算法〈Genetic Algorithms〉等非傳統方法且已有不錯之成效因此以模糊控

制理論之方法取代傳統的 PID 控制器來控制馬達轉速

對於一個非線性時變系統〈Nonlinear Time Variant System〉模糊控制理論

不但能簡化數學模型並且可以結合人類的操作經驗有效的達成控制目標模

糊控制能將操作者的專家經驗換成控制器設計人員的設計理念勢必擁有比一般

傳統的控制器更加的強健性與容錯性

2

12 研究動機

現今直流馬達的轉速控制多廣泛使用脈波寬度調變式〈Pulse Width

Modulation簡稱 PWM 驅動電路〉此種電路是以控制固定頻率的開閉供應直流

電壓以得到波寬可調的輸出使馬達的平均電壓可以調整進而轉移到馬達的

平均功率而達到轉速的控制但是由於 PWM 為一種單象限控制只運作於第一

象限這種系統本身無法產生負轉矩未加上逆向開關前亦無法反向因此無法

作用於第三象限系統加上動力制動後方可以有限度地產生逆向轉矩而運作於

第二象限〈見圖 11〉然而這也只是一種被動控制區間﹝1﹞

主動控制區動力制動

(被動運作)

Ⅱ Ⅰ

Ⅲ Ⅳ

ω

TCWCCW

圖 11 單象限控速系統運作於第一象限

本研究主要目的之一就是針對 PWM 之缺失提出了改良的方法於前級驅

動電路產生正反方向的兩個脈波信號再經驅動功率放大之後使馬達產生正

反轉向的兩拉力此即為雙脈波寬度調變式(Two Pulse Width Modulation簡稱

TPWM)本控制主要特色不論電動機正轉反轉速度快慢或停住均消

耗定額功率〈即馬達無時無刻都在運轉且輸出轉矩為額定值〉系統於寬廣的

速度變化範圍內仍具有良好的伺服性能馬達的旋轉扭力不會因速度及負載的

變化而受影響使伺服控制系統達到某一預定的特性範圍﹝2﹞

3

此外馬達的轉速會因其驅動機構的慣性影響不可能「說停就停」也

會因為摩擦力等影響不可能「說動就動」故對其操控指令一定會有延遲的

現象發生這些因素使馬達不是一個典型的線性系統故傳統的 PID 控制器就

不是最好的選擇再加上近年來模糊控制系統〈Fuzzy Logic Control System

FLCS〉的發展﹝3﹞使吾人想設計一模糊控制器來做為馬達轉速的閉迴路控

制以解決非線性系統的問題除此之外FLCS 在上升時間安定時間和超

越量上的要求也都優於傳統的 PID 控制器[4]

目前雖然有很多從事於馬達轉速控制的相關研究但是多採用脈波寬度調

變法且其尚有缺失待改良因此吾人想採用雙脈波寬度調變雖然有關此法

的研究並不多見但 TPWM 卻具有 PWM 所沒有的優點再加上近來發展愈

盛的模糊控制理論較傳統 PID 控制器的優點相信馬達轉速以 TPWM 驅動電

路之模糊控制是值得去加以研究和探討的

13 研究方法

本專題計畫其研究方法主要分為兩大類一為硬體結構電路設計另一為

Fuzzy 控制器之軟體製作硬體結構方面主要設計一比較放大器使其誤差值經

此電路與三角波比較而輸出 A 驅動信號脈波與 B 驅動信號脈波然後再由驅動

功率放大電路將信號脈波放大後控制馬達正逆轉此外為了確保功率放大電

路之安全性需在其之前加上一間距產生電路以防止其電路損毀

感測器方面則利用編碼器〈encoder〉感測出馬達的轉速然後再經由 FV

將其轉換為電壓此電壓再由 AD 轉換為數位信號送入單晶片 8051經由模

糊控制規則庫判斷並做出決策以達到馬達轉速的控制

4

14 研究目標

本專題研究目標如下

〈1〉 完成相關文獻資料之蒐集整理與討論

〈2〉 完成 AB 信號產生電路設計

〈3〉 完成間距脈波產生電路設計

〈4〉 完成驅動功率放大電路設計〈橋型驅動功率放大〉

〈5〉 完成 FV 電路設計

〈6〉 完成 AD 訊號轉換

〈7〉 編寫模糊控制法則與介面軟體設計

5

第二章 原理探討

21 模糊控制與理論

在傳統的控制領域裏控制系統動態模式的精確與否是影響控制優劣的最主

要關鍵系統動態的資訊越詳細則越能達到精確控制的目的然而對於複雜

的系統由於變數太多往往難以正確的描述系統的動態於是工程師便利用各

種方法來簡化系統動態以達成控制的目的但卻不盡理想換言之傳統的控

制理論對於明確系統有強而有力的控制能力但對於過於複雜或難以精確描述的

系統則顯得無能為力了因此便嘗試著以模糊數學來處理這些控制問題模糊

控制是屬於非線性式的控制在受控系統無法以線性數學模式精確描述的情況

下經由適當調整控制規則應具有比傳統控制方法更佳的控制性能

211 模糊理論概述

1965 年美國加州柏克萊分校的 LotfiAZadeh 教授首先在他主編的

「Information and Control」刊物上提出「Fuzzy Set」論文此為模糊邏輯理論的

創始模糊理論在經過了三十幾年的演化改進後無論是在應用或理論架構上

皆已日趨完備尤其近年來因人工智慧的迅速發展模糊理論儼然成為人工智慧

不可或缺的理論根基

Zadeh 教授曾提出一個互克性原理﹝5﹞「當系統的複雜性增長時對系統

特性做精確且有意義描述的能力亦相對降低最後精確性與有意義性將變成完全

互相排斥的特性」很高的複雜性意味著只能在一個刻意壓縮的低維因素空間觀

察而無法對問題的全部因素都進行考察使得原本是明確的概念變的模糊

Fuzzy 理論正是為了掌握這類具模糊特質的事物而發展出來的所以它的應用較

偏重於人類的經驗及對問題特性的掌握程度不主張用繁雜的數學分析及數學模

式來解決問題

Fuzzy 理論把傳統數學從二值邏輯〈binary logic〉擴展到連續多值〈continuous

6

multi-value〉利用歸屬函數〈membership function〉描述一個概念的程度亦及

使用 0 和 1 之間的數值來表示一個元素屬於某一概念的程度這個值稱為元素對

集合的歸屬度〈membership grade〉當歸屬度為 1 時表示該元素百分之百屬於

這個概念當歸屬度為 0 時則表示該元素完全不屬於這個概念介於兩者之間

的就是完全屬於和完全不屬於之間的灰色地帶

模糊理論的工程應用大約始於 1974 年倫敦大學的 EHMamdani 教授他根

據 Zadeh 提出的語言分析法〈linguistic approach〉及模糊推論〈fuzzy inference〉

運用 IF-THEN 形式的法則來敘述操作員的控制策略成功地應用在蒸汽機自動

運轉上﹝6﹞從此模糊理論的應用便迅速發展以在控制方面的研究成果最為

顯著模糊理論其實是一門相當生活化的學問由於使用語言變量描述因此更

具親和力與一般性人類日常生活所遇所用的一些敘述即大都是模糊的例如

那個人ldquo很高車開的ldquo很快等等其中ldquo很高ldquo很快並不是一個

明確值而只是描述事件的程度但是根據這些描述人類卻能很輕易的接收

212 模糊集合

模糊集合〈fuzzy set〉可視為傳統集合的擴張在模糊集合的世界中稱傳

統集合為明確集合〈crisp set〉所謂模糊集合是指用來表示界限或邊界不分明的

模糊概念的集合許多日常生活中的概念常常都不是清晰明確的這些可說是模

糊概念例如很高很快等這類概念無法用傳統的二值集合論即 0 或 1 表示

而Zadeh教授提出的Fuzzy集合論可以將這些概念由傳統集合論的特徵函數從非

0 即 1 的二值選擇推廣為從 0 到 1 之間的任何值做選擇得到新型的特徵函數

稱為歸屬函數

模糊集合由歸屬函數表示相對於明確集合的特徵函數其值只有 0 或 1 兩個

值即其值為在實軸閉區間[01]之中的任一實數模糊集合可以彌補明確集

合描述時所產生的不合理現象因此模糊集合比傳統的明確集合更具客觀性

7

213 歸屬函數

歸屬函數〈membership function〉為 0 到 1 之間的數值吾們可以藉由歸屬

函數來描述 Fuzzy 集合的特質它是 Fuzzy 理論的最基本觀念透過歸屬函數我

們才能對 Fuzzy 集合進行量化也才可能利用精確的數學方法分析處理模糊性資

歸屬函數在 Fuzzy 控制的應用範疇內都要具備凸〈convex〉及正規〈normal〉

等基本特性〈如圖 21〉歸屬度函數的定義可以分為數值及函數兩種數值定義

方式又稱為離散化歸屬函數它是直接給定有限 Fuzzy 集合內每個元素的歸屬

度並以向量的形式表現出來函數定義方式又稱為連續化歸屬函數它是以不

同形式的函數來描述 Fuzzy 集合

圖 211 正規且凸模糊集合

1

0 圖 212 正規非凸的模糊集合

8

一個模糊集合的歸屬函數可以有許多方式但是目前最廣泛使用的有吊鐘

型三角型梯型等歸屬函數

〈1〉吊鐘形歸屬函數

吊鐘形歸屬函數定義如下

μA=bell(xabc)= b

acx 2

1

1minus

+

〈21〉

圖 22 吊鐘型歸屬函數

〈2〉三角形歸屬函數

三角形歸屬函數可由三個參數(abc)來加以決定

=Aμ trangle(xabc)

⎪⎪⎪

⎪⎪⎪

ltleminusminus

ltleminusminus

=

other

cxbcbcx

bxaabax

0

〈22〉

其中a為歸屬函數左邊界b為歸屬函數中心值c為歸屬函數右邊界

9

圖 23 三角型歸屬函數

〈3〉梯型歸屬函數

梯型歸屬函數可由四個參數加以決定

=Aμ trapezoid(xabcd)

⎪⎪⎪⎪

⎪⎪⎪⎪

leleminusminus

ltle

ltleminusminus

=

other

dxcdcdx

cxb

bxaabax

0

1 〈23〉

圖 24 梯型歸屬函數

10

214 模糊推論與模糊規則

模糊推論〈fuzzy inference〉是根據知識庫保存的規則(rule)和給予的事實

推導出新的結論與傳統推論不同的地方是Fuzzy推論不只可以處理明確命題也

可以處理Fuzzy命題Fuzzy推論是依據近似推理〈approximate reasoning〉的概念

發展出來的比傳統推論的嚴正推理〈exact reasoning〉更合理也更具彈性近

似推理是兩種嚴正推理General Modus Ponens〈簡稱GMP〉及Genera Modus

Tollens〈簡稱GMT〉的一般化此原理是從傳統二值邏輯中的肯定律〈modus

ponens〉和否定律〈modus tollens〉推廣而來其中GMP又可稱為前向推理而

GMT則可稱為反向推理

〈1〉 GMP〈General Modus Ponens〉

規則IF x is A THEN y is B

事實x is Arsquo

結論y ix Brsquo 〈24〉

〈2〉 GMT〈General Modus Tollens〉

規則IF x is A THEN y is B

事實y is Brsquo

結論x is Arsquo 〈25〉

上式中IF x is A THEN y is B即為模糊規則〈fuzzy rules〉AArsquoBBrsquo

分別是定義在論域X及Y的模糊集合xy代表輸入變數及輸出變數的語言變數

一般來說「x is A」稱為前件部〈antecedent〉而「Y is B」則稱為後件部

〈consequence〉Fuzzy知識庫〈Fuzzy Knowledge Base簡稱FKB〉即由這些模

糊規則所組成的規則庫〈rule base〉和存放描述領域知識的Fuzzy變數及語言變數

的資料庫〈data base〉所組成所以FKB是用來描述受控對象所涉及的領域知

11

識和操控目標的一些定性及定量的資訊模糊知識庫和模糊推論是構成Fuzzy規

則系統核心的兩個重要部門﹝7﹞

模糊推論是模糊系統的核心根據知識庫的模糊法則進行模糊理論的合成運

算來模擬人類的思考決策模式一般來說規則的建立是採取十分主觀直覺的

方式依據相關領域專家的經驗與知識透過詢問進而將其知識經驗歸納條列出

重點再轉換成模糊規則的形式表現出來但是並非所有的專家或操作員都能

將自身的經驗知識以言詞的方式充分的表達出來且未必能整理成條列的模糊規

則所以知識規則的萃取工作往往是在建構模糊系統時最常遭遇到的困難之

215 模糊控制器

模糊控制是智慧型控制〈intelligent control〉系統的一種典型其基本特點

是不完全依賴受控對象的數學模型主要是利用人的操作經驗知識和推理技

術以及控制系統的某些訊息和性能得出對應的控制動作模糊控制是以並行

〈parallel〉方式處理規則的推理工作〈如圖25〉其近似推理會包容每個對操

控系統有貢獻的規則即使某些貢獻程度很小的規則也不會忽略

圖 25 模糊控制系統的構造

12

一個控制器的輸入通常是確定數值而非模糊輸出也是如此才能對被控對象

發生作用但是模糊邏輯控制器〈Fuzzy Logic Controller簡稱FLC〉則是以語

言化的控制規則為主體為了能夠把輸入的確定值與語言化之後的控制規則結

合必須把輸入的確定值模糊化〈fuzzification〉以便對應到FLC語言變數的論

域範圍中同樣的經過規則庫推理出來的結果是對應到輸出語言變數的論域

中所以也必須對其做解模糊化〈defuzzification〉的工作才能達成實際的控制

目標

一般模糊控制器的架構包含了五個主要部分定義變數模糊化知識庫

模糊推論及解模糊化

〈1〉 定義輸入及輸出變數

決定程序被觀察的狀況及考慮控制的動作輸入變數可以是擷取

自受控系統的觀測量也可以是推導出來的資料輸出變數則為操控

受控系統的操作量例如在一般控制問題上輸入變數通常為輸出

誤差e與輸出誤差之變化率e而控制變數則為下一個狀態之輸入

u其中eeu統稱為模糊變數

〈2〉 模糊化

將量測值轉換為語言變數的過程將外界所輸入的確定數值經由

一比例映射傳送到輸入變數所對應的模糊論域然後再利用模糊化

函數將此輸入資料轉換成適當的口語值以供模糊運算使用此口語

化變數稱之為模糊子集合

〈3〉 知識庫

模糊知識庫是模糊控制的依據由它來定義所有使用到的語言控

制法則及相關各項參數知識庫可說是整個控制系統資料核心其包

含了兩個部分資料庫〈data base〉與規則庫〈rules base〉

1 資料庫

提供處理模糊數據之相關定義資料庫所存放的資料是關

13

於如何將明確的資料轉換成模糊數值而資料的存放方式是以

歸屬函數表示該選用哪一種歸屬函數依實際的需要選定

以三角形歸屬函數最常被使用因其運算最為容易且又能充分

的表達模糊概念

2 規則庫

利用語言化的條件式控制規則描述控制目標和策略通常

控制規則可以由操控人員的經驗或專家的知識推導出來多個

控制規則所組成的集合就是規則庫

〈4〉 模糊推論

模糊推論為模糊控制最重要的核心其最主要的工作就是做實際

的決策過程處理模糊推論具有模擬人類做決策判斷的能力其基本

理論就是根據人類特有的近似推理方式如之前已說明的GMP和

GMTGMP為前向推理而GMT為逆向推理因為模糊推論為前向

運算因此GMP非常適合使用為模糊控制的推論機構

〈5〉 解模糊化

將推論完成所得到的模糊輸出量轉換成實際的明確數值以便和

外界溝通解模糊化的方法有很多例最大歸屬度法重心法高

度法面積法等

圖 26 模糊系統的基本架構

14

22 直流馬達數學模型

圖27為直流馬達等效電路簡圖其中

iV = 輸入電壓 ai = 電樞電流

zR = 電樞電阻 gT = 轉矩

aL = 電樞電感 bE = 反電動勢

φ = 空氣隙磁通量 ω = 轉子角速度

B = 黏滯摩擦係數 J = 轉動慣量

圖 27 直流馬達等效電路簡圖

由克希荷夫電壓定律知

( ) ( ) ( )tEdt

tdiLtiRV b

aaaai ++= 〈26〉

由於反電動勢 bE 與轉軸的角速度 ( )tω 及空氣隙磁通量φ之乘積成正比即

( ) ( ) ( )tKtKtE emb ωφω == 〈27〉

15

又轉矩的平衡方程式為

( ) ( ) ( )dt

tdJtBtTgωω += 〈28〉

且馬達轉矩 gT 與電樞電流 ( )tia 及空氣隙磁通量φ乘積成正比即

( ) ( ) ( )tiKtiKtT ataag == φ 〈29〉

取〈26〉~〈29〉式之拉氏變換得

( ) ( ) ( ) ( )sEssILsIRsV baaaai ++= 〈210〉

( ) ( )sKsE eb Ω= 〈211〉

( ) ( ) ( )sJssBsTg Ω+Ω= 〈212〉

( ) ( )sIKsT atg = 〈213〉

則馬達輸入電流與轉速為

( ) ( ) ( )( ) ( )( )

sR

sEsV

sLRsEsV

sIe

a

bi

aa

bia τ+

minus

=+minus

=1

〈214〉

( ) ( ) ( )

sB

sT

sJBsT

sm

gg

τ+=

+=Ω

1 〈215〉

其中a

ae R

L=τ 為電樞電流的電氣時間常數 BJ

m =τ 為馬達轉動的機械時間

常數

直流馬達轉速對輸入電壓的轉移函數 ( )sG 為

( ) ( )( ) ( )( ) etaa

t

i KKBJsRsLK

sVssG

+++=

Ω=

( )( ) etmea

t

KKssBRK

+++=

ττ 11 〈216〉

16

在一般情況電樞電感很小所以 eτ 可以忽略不計因此上式成為一階落後

方程式

( ) ( )( ) ( ) m

m

etma

t

i sTK

KKsBRK

sVssG

+=

++=

Ω=

11 τ 〈217〉

其中

eta

mam KKBR

BRT

+=

τ

eta

tm KKBR

KK

+=

所以直流馬達數學模式可以以圖28表之﹝8﹞

圖 28 直流馬達數學模式方塊圖

17

第三章 系統功能分析與製作規劃

31 專題製作流程

如圖 31 所示本專題主要分為兩條路徑進行一為硬體另一則為軟體程

式撰寫本章著重硬體的規劃設計軟體則在第四章中介紹在完成 AB 信號

產生電路驅動功率放大電路與間距脈波產生電路設計與製作後須先接上馬達

做一連串的測試〈此時系統並無回受控制〉測試間距脈波是否太長或太短硬

體電路是否有缺失hellip等等另一方面也著手撰寫模糊控制程式並將其與硬體電

路結合最後做閉迴路系統的整合測試若發現系統的運作結果並不如預期

則需分別從硬體與軟體兩方面去改良

直流馬達轉速之模糊控制

文獻蒐集與整理

AB信號產生電路設計與製作

驅動功率放大電路設計與製作

間距脈波產生電路設計與製作

測試間距脈波是否太長或太短

系統測試測試馬達轉速是否

達到控制目的

結束與論文寫作

重新設計間距脈波長度

Yes

No

系統整合與修正

輸出信號與Fuzzy控制器之連結設計

規劃輸出與輸入歸屬函數

規劃模糊知識庫

撰寫主程式並加入模糊知識庫

程式編譯及連結

軟硬體整合測試馬達是否運作

程式調整及最佳化

No

YesYes

No

圖 31 專題製作流程圖

18

32 雙脈寬調變法之直流馬達驅動電路設計

本專題製作的雙脈寬調變法之直流馬達驅動電路設計大致可以分為二大部

分第一雙脈寬調變法之電路設計第二橋型驅動功率放大電路

雙脈寬調變〈Two Pulse Width Modulation簡稱TPWM〉之電路設計主要

是先製作一脈寬調變〈Pulse Width Modulation簡稱PWM〉波形然後再將此

波形各別經由一緩衝器〈buffer〉和反向器〈inverter〉則可產生AB驅動信號

脈波此即為TPWM

321 脈寬調變電路

如圖32先利用兩顆op產生三角波電路再利用一個比較器比較三角波

和誤差值之大小

150k

1M

20k

+12V

-12V

+12V

-12V10k

+12V

-12V

10k

+12V

-12V-

+-

+

-

+ PWMLM324

LM324

LM324

2200pF

圖 32 脈寬調變電路

〈1〉 三角波產生電路

三角波產生電路通常至少需要兩個運算放大器其電路如圖33OP1

為一個反相積分器OP2為一個史密特磁滯比較器將OP2的輸出方波經

19

OP1反相積分以後得到Vo1三角波此三角波又同時加到OP2控制其狀

態的改變

當方波產生器的輸出是正的則三角波產生器的輸出是斜向負相似

地當方波產生器的輸出是負則三角波產生器的輸出是斜向正這個動

作將產生三角波的輸出同時也輸出方波﹝9﹞

+VCC

-VCC

-

+

R1

R2

R3

+VCC

-VCC

-

+

OP1

OP2

Vo2Vo1

圖 33 三角波產生電路

對OP2而言是磁滯比較必須先找到OP2的 THV 和 TLV

232

21

32

3oo v

RRR

vRR

Rv

++

+=+ 〈31〉

當 0=+v 時

23

21 oo v

RR

v minus= 〈32〉

表要達到OP2的 0=+v 必須有這麼大的 1ov

當 12 sato Ev = 時

TLsato VERR

v =minus= 13

21 〈33〉

當 22 sato Ev minus= 時

THsato VERR

v =+= 23

21 〈34〉

20

對OP1而言是反相積分器 2ov 為其輸入 1ov 為其輸出則

tCIt

Rv

Ct

CRv

dtvCR

v oooo

11

2

11

22

111

11minus=minus=minus=minus= int 〈35〉

因為

1

2

Rvv

I o minusminus= 0=minusv 〈因為虛接地〉 〈36〉

所以

1

2

Rv

I o= 〈37〉

又因運算放大器的輸入阻抗非常大則流經 1C 的電流也為 I 相當於以定

電流對電容C 充電

當 12 sato Ev = 時 1ov 為下降斜波

tR

EC

v sato

1

1

11

1minus= 〈38〉

當 22 sato Ev minus= 時 1ov 上升斜波

( )

tRE

Cv sat

o1

2

11

1 minusminus= 〈39〉

由此可知三角波的上升與下降斜波乃因 1C 的充電與放電且時間

常數為 11CR

三角波週期分析如下

1 上升斜波的時間 1T

tCR

vv o

o1

1

21 minus= 11

2

1 CRvv

to

ominus=

1Tt = TLTHo VVv minus=1 22 sato Ev =

11111

21

sat

TLTH

sat

TLTH

EVV

CRCRE

VVT

minus=

minusminus= 〈310〉

2 下降斜波的時間 2T

tCR

vv o

o1

1

21 minus= 11

2

1 CRvv

to

ominus=

21

2Tt = THTLo VVv minus=1 12 sato Ev =

1

11111

1sat

TLTH

sat

THTL

EVV

CRCRE

VVT

minus=

minusminus= 〈311〉

3 週期 21 TTT +=

若 1satE = 2satE = satE 且3

22RR

VV TLTH =minus satE

3

2114

RR

CRT=

若R3 = nR2

則nCR

T 114=

114 CR

nf = 〈312〉

《實驗結果》

必須注意的是三角波的頻率太低將導致馬達的轉動產生脈動現象

故將工作頻率設計在1kHz以上

Ω= k1501R Ω= k102R

Ω= k203R pFC 22001 =

所得到的三角波頻率為

15kHz10220010001504

00010100020

f 12- =timestimestimestimes

timestimes

=

圖 34 三角波輸出波形

22

〈2〉 脈寬調變電路〈PWM〉

+12V

-12V

10k

+12V

-12V -

+ PWM輸出LM324三角波輸入

圖 35 脈寬調變電路

PWM系統往往連接至直流電源供應放大器的工作是以固定的頻率開

閉直流供應電壓其激發角是可以調整的因此得到波寬可調的輸出

將固定頻率的三角波與反向輸入的電壓做比較便可輸出一脈寬〈見圖

36〉反向電阻值的不同將導致反向輸入電壓不同故其輸出為一可調但

頻率固定的脈寬也正因為如此故稱為脈寬調變〈PWM〉由於輸出的

dutycycle不同故馬達將接收到不同的平均電壓因而可以藉由PWM控制

馬達的轉速

反相輸入電壓

PWM

圖 36 三角波與反相輸入電壓比較

23

PWM的優點在於馬達驅動電路的電晶體之控制信號改以脈波列來控

制使電晶體操作成類似開關的動作不是完全導通就是完全截止故電晶

體不是一直操作於作用區所以其功率消耗不大整體效率較高

《實驗結果》

圖 37 PWM 輸出波形

322 橋型驅動功率放大電路

如圖38所示主要由四個功率電晶體組成利用不同的電晶體對使直流

馬達做正逆轉控制當Q5Q8導通使馬達正轉當Q6Q7導通馬達則逆

轉電路中的電晶體扮演開關的作用

此種電路簡單只要一組直流電源供應且電晶體分擔了部份的電壓保護

電晶體迅速工作於截止與飽和狀態之間故沒有功率散逸損失之虞

但是在設計時切勿使Q5Q6同時導通以免燒毀電路上之元件因為在

AB兩脈波短暫的交變時間內由於電晶體本身之最小延遲時間有可能使Q5

Q6同時ON與Q7Q8在很短時間同時ON因此在15kHz交變下容易燒毀功

率電晶體

因此設計一間距脈波電路主要之功用使Q5Q6和Q7Q8均不同時導通

24

以拉長AB兩者交換時間

M

20k

10k

20k

10k

+24V

A 信號 B 信號

2N3055 2N3055

2N2955 2N2955

1N40021N4002

C1815 C1815

C1815 C1815

Q5

Q8Q6

Q7

圖 38 橋型驅動功率放大電路

圖 39 橋型驅動功率放大電路實體圖

25

此外若考慮電晶體BE間的電壓則電路會出現約 plusmn 06V的不感帶〈ded

band〉即電晶體的 oV 對 inV 間的關係如圖3101假使 inV 電壓為正弦波則 oV 變

成如圖3102為了改善這種缺失吾人利用兩個二極體接在電路上如圖38

用來補償電晶體BE間的壓降﹝10﹞

約06V

Dead band

Vo

Vin

圖 3101 呈現不感帶的轉移函數

圖 3102 輸出電壓波形

26

323 間距脈波產生電路

RCext15

Cext14 74123

A3

B2

Q13

CLR1

Q4

7486100k

2200pF

10k

10000pF

+5V

間距脈波輸出

圖 311 間距脈波產生電路

間距脈波的產生方式是根據脈寬調變〈PWM〉後的訊號再經由積分電路的

電阻兩端取出且經由兩倍頻器〈74LS86〉檢示出PWM的正負緣脈波最後

再利用單穩態IC〈74LS123〉將檢出信號之脈寬拉長至01ms此即為間距脈波

74LS123有兩個輸入端子A及B分別為下降波緣輸入端子及上升波緣輸入端

子當輸入A之脈波由ldquoH變成ldquoL之瞬間Q輸出變為ldquoH其持續時間長

短由RC時間常數決定反之當輸入B之脈波由ldquoL變成ldquoH之瞬間Q輸出

變成ldquoH維持一定時間

74LS123的輸出脈波之寬度是由電阻及電容之時間常數所決定概略計算公

式如下

CR045T timestimes=

電容 C 必須大於 1000pF

27

《實驗結果》

R=24kΩ C=10000pF

所以得到間距脈波為

( )msec0110810000p24k045T cong=timestimes= μ

圖 312 間距脈波

研究經分析後發現

1 間距 T 愈大愈能確保電路之安全性愈有保護作用

2 間距 T 愈大相對的使驅動信號脈波減少愈多造成馬達旋轉扭力大

大減弱

3 適當的間距 T不但不會影響馬達的輸出轉矩而且兼具保護電路的

效果

33 編碼器

轉動編碼器不只可以作為轉速的感測也能做位置的感測又適合於數位處

理故被廣泛使用若就信號來看轉動編碼器可分為增量型與絕對型若以檢

測的方式來分可分為光學式和磁式兩種在本專題中所使用的編碼器為光學式

增量型編碼器﹝11﹞

光學式轉動編碼器的原理如圖 313在附有細縫轉盤的兩側分別裝置發光元

28

件與受光元件如果只有一組光電檢測元件則輸出信號就只有一相的脈波信

號此種裝置稱為脈波產生器圖 314 為增量型轉碼器的輸出信號它是利用

兩組光電元件所產生的脈波信號A 相和 B 相間有相位差正轉時 A 相領前 B

相逆轉時 B 相領前 A 相因此利用此兩相做檢測馬達為正轉或逆轉的工作

並利用 A 相或 B 相的頻率檢測出目前的轉速

吾人計算出編碼器每一轉可以產生約 200 個脈波故檢測 A 相或 B 相其頻

率為 N則轉速應為 60200

timesN

〈rpm〉

圖 313 光學式轉動編碼器的原理圖

圖 314 編碼器的輸出信號波形

29

34 LM2917 FV 電路設計

對 LM2907 而言磁滯比較器和電流汞是構成頻率對電壓轉換的基本架構

並且預留一個運算放大器及一個電晶體供各種不同的使用圖 315 為吾人所設

計的 FV 電路圖中 C1 用以抑制電流汞動作時所產生的漣波變化正常使用時

此電容應大於 10C若 C1 太大也將造成轉換速度下降

因為單晶片 8051 之輸入電壓最高為 5V故必須設計其馬達最高轉速頻率所

轉成的電壓必須在 5V 以內由於馬達轉速頻率範圍極大故吾人給予 LM2917

+12V 的電壓以擴大它可以轉換的電壓範圍並將所需維持在 5V 內

a1

14

b1

1

a1

13

b1

2

a1

12

b1

3

a1

11

b1

4

1

a1

10

b1

5

a1

8

b1

7

a1

9

b1

6

L2917

Encoder輸 入

1uF

+12V

FV輸出1000pF

45k 10kC1

C2

圖 315 FV 電路

30

《實驗結果》

根據統計結果每 50mV 相對於 100Hz如此一來吾人想得知馬達目前

的轉速只要將單晶片所接收到的電壓值經過換算即可得知目前 encoder 所量測

的頻率吾人知道 encoder 一圈可產生 200 個脈波故馬達的轉速便可經過下列

公式換算得知

轉速〈rpm〉 60200

times=f

其中 =f encoder 所量測到的頻率

表 31 頻率與轉換電壓之關係

頻率

(Hz) 1 2 3 4 5 6 7 8 9

電壓(V) 0006 0006 0007 0008 0009 0009 0009 0009 001

頻率

(Hz) 10 20 30 40 50 60 70 80 90

電壓(V) 008 009 010 010 011 011 012 012 013

頻率

(Hz) 100 200 300 400 500 600 700 800 900

電壓(V) 013 018 023 028 033 038 043 049 054

頻率

(Hz) 1000 2000 3000 4000 5000 6000 7000 8000 9000

電壓(V) 059 109 16 209 257 304 3508 4006 45

31

圖 316 頻率對電壓曲線

35 單晶片介面電路

單晶片介面包括了二大部分分別為單晶片 8051AD converter

〈1〉8051 單晶片

為本控制系統的核心一切動作皆經由它控制

〈2〉AD converter

將類比開關所送出來的類比訊號經由 ADC 0804 轉換成數位訊號傳送

到單晶片的輸入埠

351 AD 轉換

以單晶片 8051 控制 ADC0804則單晶片 8051 必須下達ldquo開始轉換rdquo的命令

給 ADC0804然後 ADC0804 就開始讀入類比輸入端的電壓在內部開始轉換

經過一段轉換時間後〈約 100μ s〉ADC0804 就將轉換完成的值放在其內部的三

態輸出栓鎖緩衝器裡然後將轉換完成輸出腳〈INTR〉降為 low以通知單晶片

可以去讀轉換完成資料

當WR和CS 同時為ldquo0rdquo時表示對 ADC0804 下達ldquo開始轉換rdquo命令再經過

32

一段轉換時間〈100μ s〉後轉換完成ADC0804 會將其轉換完成的數位資料放

在其內部 8 位元緩衝區裡且將 INTR 降為ldquo0rdquo因此單晶片只要下達ldquo開始轉換rdquo

命令後去檢查 INTR 的狀態就可以知道是否轉換完畢其方法有兩種

1 輪詢法〈polling〉

2 中斷法〈interrupt〉

所謂輪詢法就是將 ADC0804 的 INTR接到 CPU 的一條 IO 線上然後以軟體指

令主動偵測其狀態當偵測到為ldquo0rdquo時就可以去讀出 ADC0804 裡的緩衝區的轉

換值

中斷法是一個很理想的 IO 方式因為不像輪詢法必須讓 CPU 等 ADC0804

轉換當 CPU 下達ldquo開始轉換rdquo命令後就可以做其他工作當 ADC0804 轉換完

畢後 INTR會降為ldquo0rdquo可以利用此信號去中斷 CPU再由中斷副程式去讀入

轉換值即可因此大大提高了程式的效率

當 CPU 接收到 ADC0804 發出ldquo轉換完畢rdquo的信號〈 INTR =0〉後就可以去

讀出轉換值其讀出的方法是將CS 與RD設為ldquo0rdquo即可讀到轉換值這個讀值的

動作又會使得 INTR恢復成ldquo1rdquo

1 CPU 下達ldquo開始轉換rdquo命令〈CS =0WR =0〉

2 ADC0804ldquo轉換完畢rdquo 〈 INTR =0〉

3 CPU 讀取轉換值〈 RD =0CS =0〉

4 讀完後 INTR =1

ADC0804 主要規格摘要如下

1 +5V 單電源工作電壓

2 類比電壓輸入範圍 0~+5V

33

3 參考電壓為 25V

4 轉換時間為 100μ s〈 CLKf =640kHz〉

5 解析度為 8 位元

6 誤差plusmn 1LSB

7 讀取時間 135ns

36 電源供應系統

本專題中所有電路及硬體設備所需的電源採用交流電源 110V 經由 PT-31

變壓器後再經過橋式整流後提供了直流電源而因為各個電路所需電源不同

因此製作了多組的變壓電路如下

1電壓源 DC5V選擇了 7805 的穩壓 IC 搭配電容得到了+5V 的電壓源

供〈1〉8051 微處理器 〈2〉ADC 0804 〈3〉74LS8674LS12374LS04

74LS02CD4013 〈4〉馬達 Encoder

2電壓源 DC12V使用 7812 穩壓 IC 搭配電容得到+12V 的電壓源供

LM2917 使用

3電壓源 DC24V利用 7824 的穩壓 IC 搭配電容獲得+24V 的直流電壓

源供電路之橋型驅動功率放大之電晶體使用

Vin1

+12V2

GND3

LM7812

2200uF 10000pF 2200uF 10000pF

+12V outputAC

圖 317 直流電源電路

34

圖 318 直流電源電路實體圖

37 馬達轉速的量測

表 33 PWM 輸出對應 encoder 週期

PWM dutycycle encoder 週期 PWM dutycycle encoder 週期

40 sμ 172 sμ 440 sμ 0 sμ

80 sμ 188 sμ 480 sμ 0 sμ

120 sμ 204 sμ 520 sμ 0 sμ

160 sμ 230 sμ 560 sμ 0 sμ

200 sμ 272 sμ 600 sμ 0 sμ

240 sμ 328 sμ 640 sμ 0 sμ

280 sμ 416 sμ 680 sμ 1320 sμ

320 sμ 540 sμ 720 sμ 750 sμ

360 sμ 800 sμ 760 sμ 510 sμ

400 sμ 1320 sμ 800 sμ 400 sμ

35

圖 319 PWM 輸出對應 encoder 週期

由統計可知道此馬達並不是一顆線性馬達故相信若使用模糊控制理論來

作為其回授控制系統的控制器一定能達到比傳統控制器的性能還要好而且若能

在模糊控制裡加上 PID 控制器的觀念一定能在系統的響應時間上升時間

安定時間和超越量達到最佳的控制另一方面馬達在其反方向的內阻較大需

要更大的力量才能使馬達驅動

36

第四章 軟體規劃與製作

41 PWM 之軟體設計

因為之前所介紹的硬體方式是以調整可變電阻來達到轉速的調整因此無法

得知所給予的脈寬長度和轉速大小尤其在回授時也不易給予適當的訊號來調整

轉速因此改良之方法就是以8051之軟體撰寫方式來產生固定的脈寬也就等

於給予轉速的命令而在其回授控制時也只要在內部程式给予適當的指令便可

達到脈寬長度的調整以達到閉迴路之受控系統

411 PWM 軟體流程

設定Timer0模式為0

TH0 = temp 32 TL0 = temp 32

temp = 8192 ndash j4 Key = 0

檢查是否有鍵值

將鍵值存入Key

Yes

No

設定Key值所對應的 j值

If P30 == 1Then P30 = 0 temp = 8192 ndash j4Else P30 = 1 temp=8192ndash880+j4

TH0 = temp 32 TL0 = temp 32

Start Timer0中斷副程式

啟動Timer0

等待Timer0中斷

返回主程式

圖 41 PWM 軟體設計流程圖

37

在此總共設計了五個按鈕分別代表不同的轉速停止正轉〈慢〉正轉

〈快〉逆轉〈慢〉和逆轉〈快〉使用Timer0是因為8051之計時中斷比延遲程

式來的準確故可以達到準確的計時程式設計理念中並沒有將中斷致能清除

因此Timer0會一直處於計時的狀態程式執行時將一邊檢查鍵值〈KeyStatus〉一

邊進行計時當計時完畢便呼叫中斷副程式然後執行改變Port 30的輸出狀

態若是為high則變為low反之若是為low即變為high同時並重設計時時間

Timer0繼續計時

當鍵值改變時計時的時間也會跟著改變如此一來Timer0將ㄧ直重覆上

述動作直到電源切掉Timer0才會停止計時

42 模糊控制之程式規劃與撰寫

本專題目標在完成了先前所規劃的硬體電路之後接著就是要達成利用模糊

控制理論來設計控制器在此採用了單晶片8051目的是為了以硬體實現方式來

代替電腦模擬期望能夠按照原訂計畫完成本專題「具模糊控制理論與雙脈寬調

變法之直流馬達驅動電路設計」

單晶片 8051 模糊控制的程式撰寫採下列幾個步驟依序完成

1 設定變數轉速誤差〈dspeed〉目前轉速〈sspeed〉

2 模糊化採用三角形歸屬函數採用三角形歸屬函數的原因

〈1〉 三角形函數為一連續函數

〈2〉 三角形函數為線性的函數所以計算速度較快

〈3〉 是具有發散也有收斂的函數和指數函數一樣接近

事實

3 模糊推論模糊規則將其所有可能發生情況以 IFhellipTHENhellip表示

並建立控制規則表

4 解模糊化採用重心法

38

421 歸屬函數

設定變數為目前轉速〈sspeed〉與轉速誤差〈dspeed〉因此此模糊控制器共

有兩個輸入訊號與一輸出訊號輸出訊號為脈寬長度該加或是減多少又因為有

五種不同的轉速因此各分別設計了不同的歸屬函數如下

1 當轉速 = 0

ml h

s s p e e d

d s p e e d

r p m0 5 0 1 0 0- 5 0- 1 0 0

mv l l h v h

r p m0- 3 0- 6 0- 1 0 0 3 0 6 0 1 0 0 圖 42 停止時之歸屬函數

2 正轉〈慢〉

ml hsspeed

dspeed

rpm150 225 300750

mvl l h vh

rpm150100500 200 250 300

圖 43 正轉〈慢〉之歸屬函數

39

3 正轉〈快〉

ml hsspeed

dspeed

rpm520 670 820370220

mvl l h vh

rpm500400300200 600 700 800

圖 44 正轉〈快〉之歸屬函數

4 逆轉〈慢〉

ml hsspeed

dspeed

rpm100 250 400500

mvl l h vh

rpm10050250 200 300 400 圖 45 逆轉〈慢〉之歸屬函數

40

5 逆轉〈快〉

ml hsspeed

dspeed

rpm300 450 600150

mvl l h vh

rpm450350250150 550 650 750

750

圖 46 逆轉〈快〉之歸屬函數

6 輸出

OutputMVL L H VH

rpm0-50-150-250 50 150 250

圖 47 輸出之歸屬函數

41

422 模糊規則庫

表 41 為吾人所設計的模糊控制規則庫並利用 Matlab 之 Fuzzy ToolBox 來

建立此規則庫以進行模擬推論圖 48 為當馬達輸入指令為正轉慢時推論後所得

到的三維空間圖

表 41 模糊控制規則表

Dspeed

vl l m h vh

l H M L VL VL

m VH H M L VL sspeed

h VH VH H M L

圖 48 推論後的三維空間圖

42

423 模糊控制器之軟體設計流程

Start 外部中斷副程式

ADCWR = 0 ADCWR = 1

〈令AD開始轉換〉

檢查鍵值以得到對應的歸屬函數

取得目前轉速與

轉速誤差

Fuzzy Rules決策

得到輸出訊號

Delay 10ms

ADC = 0 讀取AD值 ADCRD = 0

將AD值換算成轉速

ADCWR = 0 ADCWR = 1

〈AD開始轉換〉

返回主程式

致能外部中斷

圖 49 Fuzzy Controller 程式流程圖

當控制器一開始動作時便先執行AD轉換的工作當AD轉換完成時其

INTR的接腳便會觸發8051的外部中斷INTR0於是程式便發生外部中斷執行

外部中斷副程式的指令

43

在外部中斷副程式中AD將ㄧ直進行轉換與讀取的工作同時並將轉換後

的值直接換算成目前轉速與轉速誤差以供模糊控制器使用換算目前encoder

的頻率其公式為

160-V2000 times=頻率 〈4-1〉

式4-1之公式是根據表31所導出來的其中V為encoder之頻率轉成電壓之值

又假設所讀取的AD轉換值為value因為

AD的解析度 = bit256

5V+ = 511 ( Vbit ) 〈4-2〉

故value值與電壓V之關係為

511 value V times= 〈4-3〉

所以encoder之頻率與value值的關係為

頻率= 2000times ⎟⎠⎞

⎜⎝⎛ times

511 value - 160 〈4-4〉

故目前轉速為

sspeed = ( )rpm 60 200

times頻率 〈4-5〉

另ㄧ方面在主程式中程式會先去檢查鍵值也就等於檢查輸入指令以

找出符合使用的歸屬函數並將AD所獲得的轉速對應到歸屬函數中然後執行

決策判斷即進入規則庫中尋找出適當的決策判斷最後將此決策送入PWM程

式裡進行脈寬長度的調整使馬達在合理的要求下達到理想的轉速控制不會

因為外在環境的影響而使馬達轉速受到干擾

43 LCD 顯示轉速

此專題最後再增加一LCD顯示幕以顯示目前的轉速否則在程式設計完成

後人卻因無法以肉眼得知目前轉速而不能肯定馬達轉速是否有達到控制的目

標因此增加一顯示幕LCD是有必要的不僅隨時得知目前的轉速還能知道

44

設計出來的軟體其控制性是否夠好夠穩定

431 LCD 顯示幕之軟體流程

Start

設定LCD模組的初始狀態

設定外部中斷INTR0

與Timer0

設定TH0 = (65536 ndash 5000) 256 TL0 = (65536 ndash 5000)256

令ADCWR = 0 ADCWR = 1 AD開始轉換

等待中斷

外部中斷副程式

ADCRD = 0 讀取AD值 ADCRD = 1

將AD值換算成速度

ADCWR = 0 ADCWR = 1 AD開始轉換

Timer0中斷副程式

顯示LCD第一行

ldquoMotor Speed =

顯示LCD第二行ldquoxxxxxxx rpm其中 xxxxxx為外部中斷副程式所換算出的轉速

重設TH0與TL0

返回主程式返回主程式

圖 410 LCD 顯示幕之程式流程圖

此程式主要由兩個部分完成一為外部中斷副程式另ㄧ為 Timer0 中斷副

程式當主程式完成外部與 Timer0 兩個中斷的設定後隨即命令 AD 開始轉換

之後便一直停在 while〈1〉的迴圈裡不做任何動作而由兩個中斷副程式來完

成整個轉換與顯示的工作

45

外部中斷副程式主要負責 AD 的轉換讀取與轉速換算的工作AD 第一

次的轉換由主程式來下達命令當轉換完成後AD 的 INTR 接腳將觸發外部中

斷〈INTR0〉副程式此時程式便進入外部中斷副程式執行讀取 AD 值與轉速

換算的工作當這些工作完成時外部中斷副程式再次下達 AD 開始轉換的命

令而離開中斷副程式當 AD 再次轉換完成時又將再次執行中斷副程式

如此週而復始中斷副程式將ㄧ直進行讀取換算與轉換的工作

而 Timer0 中斷副程式主要負責 LCD 顯示之工作當主程式所設定的計時時

間計數完時程式便進入 Timer0 中斷副程式一旦進入 Timer0 中斷副程式程

式將執行 LCD 的顯示然後再重設 Timer0 的計數時間Timer0 將重新計數當

計數完時程式又將再度進入 Timer0 中斷副程式執行因為程式中並無清除

Timer0 的中斷致能故 Timer0 中斷副程式和外部中斷副程式ㄧ樣週而復始的

執行其副程式的工作

46

第五章 結論

本計劃主旨為具模糊控制理論與雙脈寬調變法之直流馬達驅動電路設計主

要是針對傳統電路設計之缺點提出改良之方法以TPWM取代PWM電路以模

糊理論基礎設計之控制器替代傳統PID控制器

TPWM轉速控制優於PWM之處在於

1 TPWM只需使用單電源即可達到正轉和逆轉的轉速控制而PWM必須

加上逆向開關或是雙電源才能使馬達產生正轉和逆轉

2 TPWM可控制馬達處於停止狀態無論在正向或逆向加上負載皆無法使

馬達產生轉動

3 馬達消耗定額功率輸出轉矩為額定值

4 馬達由停止到某定轉速時反應時間較快

模糊控制器優於PID控制器

1 不須導出繁雜的數學模型

2 適用於非線性系統

3 強健性與容錯性較高

本專題至此雖說大致的目標都已達到但是此系統仍然有許多不完美而需要

改進的地方例如在實驗過程中發現整個轉速的控制在回授上其反應時間

有點慢探討其原因有可能是控制器之程式上的問題

1 因為使用C語言撰寫程式故其執行速度較慢

2 程式可能寫的太累贅

3 模糊控制規則庫建立不良

若想改善這些問題可以嘗試著將C語言改為組合語言來撰寫並盡量減少

47

不必要的指令相信此動作一定能大大提昇程式的執行速度其次就是多做測

試利用測試中所學到的經驗來幫助模糊控制規則庫的改寫同時也能從測試中

發現更多的問題若是都能對問題加以一一解決的話相信必定能將此控制系統

做的更盡善盡美

48

參考文獻

﹝1﹞ 李適中直流馬達速度控制伺服控制〈基礎篇〉全華科技圖書股份有

限公司民 74

﹝2﹞ 廖錦文ldquo直流電動機之雙脈寬調變是〈TPWM〉驅動電路研究電

子技術月刊第 69 期pp94-1021992

﹝3﹞ 楊英魁孫宗瀛鄭魁香林建德蔣旭堂模糊控制理論與技術全華

科技圖書股份有限公司民 85

﹝4﹞ 林敦煌陳憬德直流馬達定位及轉速的模糊控制逢甲大學自動控制工

程學系學士論文民 87

﹝5﹞ LAZadehldquo Fuzzy Sets Information and Control Vol8 pp338-353

1965

﹝6﹞ EHMamdani and SAsslianldquo A fuzzy logic controller for a dynamic

plant Internation Journal of Man-Machine Studies Vol7 pp1-13 1975

﹝7﹞ 孫宗瀛楊英魁Fuzzy 控制理論實作與應用全華科技圖書股份有

限公司民 83 年

﹝8﹞ 許中平黃煌嘉直流電動機控制電路設計全華科技圖書股份有限公司

民 75

﹝9﹞ 盧明智黃敏祥OP Amp 應用+實驗模擬全華科技圖書股份有限公司

民 83

﹝10﹞陳文耀電動機控制工程復文書局2003

﹝11﹞許中平林全福電動機運轉控制技術全華科技圖書股份有限公司民

77

﹝12﹞楊明豐8051 單晶片 C 語言設計實務碁峯資訊2003 年

﹝13﹞蔡朝洋單晶片微電腦 80518951 原理與應用全華科技圖書股份有限公

司民 91

49

﹝14﹞王文俊認識 Fuzzy全華科技圖書股份有限公司民 90

50

附錄 A 專題硬體展示圖

圖 A-1 硬體整體圖

圖 A-2 硬體整體鳥瞰圖

51

圖 A-3 硬體側視圖

圖 A-4 操作與顯示面板

圖 A-5 間距脈波電路與 FV 電路

52

圖 A-6 橋型驅動功率放大電路

圖 A-7 操作與控制面板

53

附錄 B PWM 與模糊控制之程式

include reg51h include stdioh sbit ADCRD = P3^1 設定 RD 控制線接腳為 P31 sbit ADCWR = P3^3 設定 WR 控制線接腳為 P33 sbit P2_0 = 0xA0 接腳定義 sbit P2_1 = 0xA1 接腳定義 sbit P3_0 = 0xB0 接腳定義 sbit P3_1 = 0xB1 接腳定義 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P3_6 = 0xB6 接腳定義 void KeyStatus(void) 函數原型宣告 void feedback(void) 函數原型宣告 void compute_grade(void) 函數原型宣告 void delay1ms(int count) 函數原型宣告 void convert() 函數原型宣告 void condition() 函數原型宣告 void CW(void) 函數原型宣告 int j i 對應 PWM 的寬度 unsigned int temp 所設計的計時器時間 int sample = 1000 取樣率設定消除顯示值跳動 long int value r1 讀取 ADC0804 數位資料 long int set n condition select long int r grade_reg[2] grade[15] error1 error2 long int a1 b1 I long int membership[5][3]membership1[3][3] 定義歸屬函數 long int membership2[3][3] = -10-50-5050510 long int error[2] int Rule[15][3] = 113213313 定義判斷規則庫 212223323 311232333 411241342 511251351

54

main() 主程式 j = PWM = 110 設定 PWM 初始值 IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x00 設定計時器 0 工作於模式 0 temp=8192-j4 設定計時器 0 初值 TH0 = temp 32 TL0 = temp 32 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 P3_4 = 1 P3_5 = 0 P3_6 = 0 ADCWR = 0 令 ADC0804 的 WR = 0 ADCWR = 1 令 ADC0804 的 WR = 1 while (1) KeyStatus() 檢查鍵值 void KeyStatus(void) 檢查鍵值並給對應的 PWM 值 char KeyScan(void) 按鍵掃描函數宣告 unsigned char KeyStatus unsigned char Key = 0 KeyStatus=KeyScan() 呼叫按鍵掃描函數 if (KeyStatus = 0) 已有按鍵輸入 Key = KeyStatus Key = 鍵值 if (Key == 0x01) 假如輸入為按鍵 1 i = 110 PWM 為 110us j = i P3_4 = 1 LED 亮第一顆〈表馬達停止〉 P3_5 = 0 P3_6 = 0

55

else if (Key == 0x02 ) 假如輸入為按鍵 2 i = 140 PWM 為 140us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x04 ) 假如輸入為按鍵 3 i = 180 PWM 為 180us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x08 ) 假如輸入為按鍵 4 i = 80 PWM 為 80us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 else if (Key == 0x10 ) 假如輸入為按鍵 5 i = 40 PWM 為 40us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 PWM = j delay1ms(10) 呼叫延遲函數 feedback() 模糊控制判斷

56

void To_int(void) interrupt 1 Timer0 中斷函數 if (P3_0 == 0) 假如 PWM 輸出為 Low P3_0 = 1 變更 PWM 輸出為 High temp=8192-j4 設定 High 的時間 else 若 PWM 輸出為 High P3_0 = 0 變更 PWM 輸出為 Low temp=8192-880+j4 設定 Low 的時間 TH0 = temp 32 Timer0 的計時時間 TL0 = temp 32 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 char KeyScan(void) 檢查鍵值 char KeyStatus 按鍵狀態 P0=0xff 設定 P0 為輸入模式 KeyStatus=~P0 讀取按鍵狀態 return(KeyStatus) 將鍵值送回程式 void feedback(void) 模糊判斷 void Fuzzycontroller() 函數原型宣告 void condition1() 函數原型宣告

57

void condition2() 函數原型宣告 error1 = ((value)40-160)03 輸入變數 1 delay10ms(10) 延遲 10ms error2 = ((value)40-160)03 輸入變數 2 if (key == 0x01 ) 當按鍵 1找出對應的歸屬函數 並做出模糊控制判斷

int membership[5][3]= -100-60-30-60-300-30030030603060100

int membership1[3][3]=-100-500-50050050100 Fuzzycontroller() condition() if (key == 0x02 ) 當按鍵 2找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

05010050100150100150200150200250200250300 int membership1[3][3]=07515075150225150225300 Fuzzycontroller() condition() else if (key == 0x04) 當按鍵 3找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

200320400300400500400500600500600700600700800 int membership1[3][3]=220370520370520670520670820 Fuzzycontroller() condition() else if (key == 0x08) 當按鍵 4找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

02550255010050100200100200300200300400 int membership1[3][3]=05010050100250100250400 Fuzzycontroller() condition()

58

else if (key == 0x10) 當按鍵 5找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

150250350250350450350450550450550650550650750 int membership1[3][3]=150300450300450600450600750 Fuzzycontroller() condition2() void Fuzzycontroller() 模糊控制判斷 void compute_grade() 函數原型宣告 void compute_grade1() 函數原型宣告 a1 = 0 b1 = 001 I = 0 for (n=0 nlt=14 n++) r = error1 set = Rule[n][0]-1 compute_grade() 計算輸入變數 1 與

模糊程度的歸屬函數 condition = 1 r = error2 set = Rule[n][1]-1 compute_grade1() 計算輸入變數 2 與 模糊程度的歸屬函數 grade[n] = MIN(grade_reg[0] grade_reg[1]) a1 = a1 + (grade[n]membership2[Rule[n][2]-1][1]) b1 = b1 + grade[n] I = a1 b1 得到模糊控制判斷的結果 void compute_grade() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership[set][0]) || (r gt membership[set][2])) 當輸入變數不在 歸屬函數內

59

grade_reg[condition] = 0 else if ((r gt membership[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership[set][2]-r) (membership[set][2] - membership[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership[set][0]) (membership[set][1] - membership[set][0]) void compute_grade1() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership1[set][0]) || (r gt membership1[set][2])) 當輸入變數不在 歸屬函數內 grade_reg[condition] = 0 else if ((r gt membership1[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership1[set][2]-r) (membership1[set][2]-membership1[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership1[set][0]) (membership1[set][1]-membership1[set][0])

60

void condition() P2_0 = 1 設定 P20 為輸入模式 P2_1 = 1 設定 P21 為輸入模式 if ( (P2_0 == 1) ampamp (P2_1 == 0)) 當馬達為正轉時 if ( I gt 0 ) 若模糊判斷結果為正 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 若模糊判斷結果為零 PWM = PWM + 0 PWM 寬度不變 if ( I lt 0 ) 若模糊控制結果小於零 PWM = PWM + 1 PWM 寬度加 1 else if ( (P2_0 == 0) ampamp (P2_1 == 1) ) 若馬達為反轉 if ( I lt 0 ) 模糊控制小於零 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 模糊控制等於零 PWM = PWM + 0 PWM 寬度不變 if ( I gt 0 ) 模糊控制大於零 PWM = PWM + 1 PWM 寬度加 1 CW() 判斷 PWM 寬度上下限

61

void CW() 判斷 PWM 寬度上下限 if ( PWM gt= 215 ) 若 PWM 寬度 gt= 最大寬度 j = 215 PWM 寬度維持於 215us if ( PWM lt= 5 ) 若 PWM 寬度 lt= 最小寬度 j = 5 PWM 寬度維持在 5us if ( PWM gt 5 ampamp PWM lt 215 ) PWM 寬度介於最大與最小間 j = PWM PWM 依模糊控制判斷結果增減 void delay1ms(int count) 延遲 1ms int x y for ( x = 0 x lt count x++ ) for ( y = 0 y lt 122 y++ ) void convert() 數位資料換算成馬達轉速 r1 = ((value)40)-160

62

附錄 C LCD 顯示之程式

includereg51h 含 8051 所有暫存器宣告 include mathh define RS P3_5 LCD 指令資料選擇控制 define RW P3_4 LCD 讀寫控制腳 define Enable P3_3 LCD 致能接腳 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P0_0 = 0x80 接腳定義 sbit P0_1 = 0x81 接腳定義 sbit P0_2 = 0x82 接腳定義 sbit P0_3 = 0x83 接腳定義 sbit P0_4 = 0x84 接腳定義 sbit P0_5 = 0x85 接腳定義 sbit P0_6 = 0x86 接腳定義 sbit ADCRD = P3^7 設定 RD 控制線接腳為 P37 sbit ADCWR = P3^6 設定 WR 控制線接腳為 P36 void delay(void) 函數原型宣告 void delay10ms(int count) 函數原型宣告 void display(void) 函數原型宣告 void InitialLCD(void) 函數原型宣告 void WriteIns(char) 函數原型宣告 void WriteData(char) 函數原型宣告 void WriteString(charchar) 函數原型宣告 void CheckBusy(void) 函數原型宣告 void convert(void) 函數原型宣告 char MSG0[] = Motor Speed = 定義字串 MSG0 char MSG2[] = rpm 定義字串 MSG2 unsigned char MSG1[8]=0000000 定義字串 MSG1 unsigned long int value 讀取 ADC0804 數位資料 int sample = 1000 取樣率設定消除顯示值跳動 long int rpm

63

main() 主程式 InitialLCD() 初始化 LCD IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x01 設定計時器 0 工作於模式 1 TH0 = (65536-5000)256 設定計時器 0 初值 TL0 = (65536-5000)256 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 while(1) 等待中斷 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 while (--sample == 0) 取樣率減 1 sample = 1000 重設取樣率 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 void T0_int(void) interrupt 1 LCD 顯示動態掃描 display() 動態掃描顯示 TH0 = (65536-65535)256 重設計時初值 TL0 = (65536-65535)256

64

void InitialLCD(void) 設定 LCD 模組初始狀態 delay() 延遲函數 WriteIns(0x38) 設定 LCD 模組為 WriteIns(0x38) 2 行顯示 WriteIns(0x38) 8 位元介面 WriteIns(0x38) 5x7 點字型 WriteIns(0x08) 關閉顯示器 WriteIns(0x01) 清除 LCD 螢幕 WriteIns(0x0c) 令顯示器 ON但游標不顯示 WriteIns(0x06) 令 LCD 模組每接收到 1Byte 資料 AC 值自動加 1 void display() 掃描顯示 WriteIns(0x80) 設定 LCD 座標 WriteString(13MSG0) 將字串 MSG0 寫入 LCD 中 WriteIns(0xc0) 設定 LCD 座標 WriteString(8MSG1) 將字串 MSG1 寫入 LCD 中 WriteIns(0xc8) 設定 LCD 座標 WriteString(4MSG2) 將字串 MSG2 寫入 LCD 中 void convert(void) 換算轉速 long int freq freq = ((value)4000) - 16000 數位資料換成頻率公式 rpm = freq3 頻率換算轉速公式 MSG1[0] = (rpm1000000)+0x30 將結果存入字串 MSG1 中 MSG1[1] = ((rpm1000000)100000)+0x30 MSG1[2] = ((rpm100000)10000)+0x30 MSG1[3] = ((rpm10000)1000)+0x30 MSG1[4] = 0x2e MSG1[5] = ((rpm1000)100)+0x30 MSG1[6] = ((rpm100)10)+0x30 MSG1[7] = rpm10+0x30

65

void WriteIns(char instruction) 寫命令至 LCD 中 RS = 0 選擇指令暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = instruction 輸出命令至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteData(char i) 寫資料至 LCD 中 RS = 1 選擇資料暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = i 輸出資料至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteString(countMSG) 寫字串至 LCD 中 char count 字串長度 char MSG[] 字串資料 char i 定義位元組變數 for(i=0 iltcount i++) count 個位元組 WriteData(MSG[i]) 寫入一位元組的資料至 LCD 中 void CheckBusy(void) char i=0x80 檢查忙碌旗標 while(iamp0x80) 忙錄旗標 BF = 1 RS = 0 選擇指令暫存器 RW = 1 讀取 Enable = 1 致能 LCD i = P2 讀取 LCD 指令暫存器內的資料

66

Enable = 0 除能 LCD delay() 延遲函數 void delay() 延遲 5ms int i for(i=0 ilt250 i++)

  • 畢業專題封面pdf
  • File0004pdf
  • 最終版pdfpdf
Page 7: Based on Fuzzy Control Theorem and TPWM Method for DC ... · 使吾人想設計一模糊控制器來做為馬達轉速的閉迴路控制,以解決非線性系統的 問題。除此之外,flcs

VI

圖目錄

圖 11 單象限控速系統運作於第一象限2 圖 211 正規且凸模糊集合7 圖 212 正規非凸的模糊集合7 圖 22 吊鐘型歸屬函數8 圖 23 三角型歸屬函數9 圖 24 梯型歸屬函數9 圖 25 模糊控制系統的構造11 圖 26 模糊系統的基本架構13 圖 27 直流馬達等效電路簡圖14 圖 28 直流馬達數學模式方塊圖16 圖 31 專題製作流程圖17 圖 32 脈寬調變電路18 圖 33 三角波產生電路19 圖 34 三角波輸出波形21 圖 35 脈寬調變電路22 圖 36 三角波與反相輸入電壓比較22 圖 37 PWM 輸出波形 23 圖 38 橋型驅動功率放大電路24 圖 39 橋型驅動功率放大電路實體圖24 圖 3101 呈現不感帶的轉移函數25 圖 3102 輸出電壓波形25 圖 311 間距脈波產生電路26 圖 312 間距脈波27 圖 313 光學式轉動編碼器的原理圖28 圖 314 編碼器的輸出信號波形28 圖 315 FV 電路 29 圖 316 頻率對電壓曲線31 圖 317 直流電源電路33 圖 318 直流電源電路實體圖34 圖 319 PWM 輸出對應 encoder 週期 35 圖 41 PWM 軟體設計流程圖 36 圖 42 停止時之歸屬函數38 圖 43 正轉〈慢〉之歸屬函數38 圖 44 正轉〈快〉之歸屬函數39 圖 45 逆轉〈慢〉之歸屬函數39 圖 46 逆轉〈快〉之歸屬函數40

VII

圖 47 輸出之歸屬函數40 圖 48 推論後的三維空間圖41 圖 49 Fuzzy Controller 程式流程圖 42 圖 410 LCD 顯示幕之程式流程圖44 圖 A-1 硬體整體圖 50 圖 A-2 硬體整體鳥瞰圖 50 圖 A-3 硬體側視圖 51 圖 A-4 操作與顯示面板 51 圖 A-5 間距脈波電路與 FV 電路 51 圖 A-6 橋型驅動功率放大電路 52 圖 A-7 操作與控制面板 52

VIII

表目錄

表 31 頻率與轉換電壓之關係30 表 33 PWM 輸出對應 encoder 週期 34 表 41 模糊控制規則表41

1

第一章 緒論

11 前言

在現代的工程應用裡馬達扮演一個非常重要的角色它在機械設備中就好

像人的心臟一樣提供了機械運轉所需要的動力源以做為能量轉換或控制機能

的實行在眾多的馬達種類當中直流馬達不僅具有許多良好的特性例如高

啟動轉矩較易線性控制hellip等且其週邊控制元件充足控制理論發展成熟所

以被廣泛的應用在工業日常生活上馬達的速度控制被廣泛的應用在各種加工

機械航空機械農業機械交通工具等用途

直流電動機之轉速控制目前最常被使用的一種方法為脈波寬度調變〈PWM〉

驅動電路並結合傳統的 PID 控制器脈寬調變是一種以固定的頻率波寬可

調的輸出開閉供應的直流電壓使馬達感受到的平均電壓可以調整進而控制馬

達的轉速

我們日常生活中處處存在著非線性的現象但是我們較熟悉處理的卻是線

性的系統對於傳統 PID 控制器來說必須先知道受控系統〈plant〉的數學模

型否則無法導出其控制演算法則且其強健性與容錯性較低然而對於非線性

系統則不適合此法因此近年來對於非線性系統的研究工作已有許多學者嘗試

應用模糊理論〈Fuzzy Theory〉類神經網路〈Artificial Neural Networks〉基因

演算法〈Genetic Algorithms〉等非傳統方法且已有不錯之成效因此以模糊控

制理論之方法取代傳統的 PID 控制器來控制馬達轉速

對於一個非線性時變系統〈Nonlinear Time Variant System〉模糊控制理論

不但能簡化數學模型並且可以結合人類的操作經驗有效的達成控制目標模

糊控制能將操作者的專家經驗換成控制器設計人員的設計理念勢必擁有比一般

傳統的控制器更加的強健性與容錯性

2

12 研究動機

現今直流馬達的轉速控制多廣泛使用脈波寬度調變式〈Pulse Width

Modulation簡稱 PWM 驅動電路〉此種電路是以控制固定頻率的開閉供應直流

電壓以得到波寬可調的輸出使馬達的平均電壓可以調整進而轉移到馬達的

平均功率而達到轉速的控制但是由於 PWM 為一種單象限控制只運作於第一

象限這種系統本身無法產生負轉矩未加上逆向開關前亦無法反向因此無法

作用於第三象限系統加上動力制動後方可以有限度地產生逆向轉矩而運作於

第二象限〈見圖 11〉然而這也只是一種被動控制區間﹝1﹞

主動控制區動力制動

(被動運作)

Ⅱ Ⅰ

Ⅲ Ⅳ

ω

TCWCCW

圖 11 單象限控速系統運作於第一象限

本研究主要目的之一就是針對 PWM 之缺失提出了改良的方法於前級驅

動電路產生正反方向的兩個脈波信號再經驅動功率放大之後使馬達產生正

反轉向的兩拉力此即為雙脈波寬度調變式(Two Pulse Width Modulation簡稱

TPWM)本控制主要特色不論電動機正轉反轉速度快慢或停住均消

耗定額功率〈即馬達無時無刻都在運轉且輸出轉矩為額定值〉系統於寬廣的

速度變化範圍內仍具有良好的伺服性能馬達的旋轉扭力不會因速度及負載的

變化而受影響使伺服控制系統達到某一預定的特性範圍﹝2﹞

3

此外馬達的轉速會因其驅動機構的慣性影響不可能「說停就停」也

會因為摩擦力等影響不可能「說動就動」故對其操控指令一定會有延遲的

現象發生這些因素使馬達不是一個典型的線性系統故傳統的 PID 控制器就

不是最好的選擇再加上近年來模糊控制系統〈Fuzzy Logic Control System

FLCS〉的發展﹝3﹞使吾人想設計一模糊控制器來做為馬達轉速的閉迴路控

制以解決非線性系統的問題除此之外FLCS 在上升時間安定時間和超

越量上的要求也都優於傳統的 PID 控制器[4]

目前雖然有很多從事於馬達轉速控制的相關研究但是多採用脈波寬度調

變法且其尚有缺失待改良因此吾人想採用雙脈波寬度調變雖然有關此法

的研究並不多見但 TPWM 卻具有 PWM 所沒有的優點再加上近來發展愈

盛的模糊控制理論較傳統 PID 控制器的優點相信馬達轉速以 TPWM 驅動電

路之模糊控制是值得去加以研究和探討的

13 研究方法

本專題計畫其研究方法主要分為兩大類一為硬體結構電路設計另一為

Fuzzy 控制器之軟體製作硬體結構方面主要設計一比較放大器使其誤差值經

此電路與三角波比較而輸出 A 驅動信號脈波與 B 驅動信號脈波然後再由驅動

功率放大電路將信號脈波放大後控制馬達正逆轉此外為了確保功率放大電

路之安全性需在其之前加上一間距產生電路以防止其電路損毀

感測器方面則利用編碼器〈encoder〉感測出馬達的轉速然後再經由 FV

將其轉換為電壓此電壓再由 AD 轉換為數位信號送入單晶片 8051經由模

糊控制規則庫判斷並做出決策以達到馬達轉速的控制

4

14 研究目標

本專題研究目標如下

〈1〉 完成相關文獻資料之蒐集整理與討論

〈2〉 完成 AB 信號產生電路設計

〈3〉 完成間距脈波產生電路設計

〈4〉 完成驅動功率放大電路設計〈橋型驅動功率放大〉

〈5〉 完成 FV 電路設計

〈6〉 完成 AD 訊號轉換

〈7〉 編寫模糊控制法則與介面軟體設計

5

第二章 原理探討

21 模糊控制與理論

在傳統的控制領域裏控制系統動態模式的精確與否是影響控制優劣的最主

要關鍵系統動態的資訊越詳細則越能達到精確控制的目的然而對於複雜

的系統由於變數太多往往難以正確的描述系統的動態於是工程師便利用各

種方法來簡化系統動態以達成控制的目的但卻不盡理想換言之傳統的控

制理論對於明確系統有強而有力的控制能力但對於過於複雜或難以精確描述的

系統則顯得無能為力了因此便嘗試著以模糊數學來處理這些控制問題模糊

控制是屬於非線性式的控制在受控系統無法以線性數學模式精確描述的情況

下經由適當調整控制規則應具有比傳統控制方法更佳的控制性能

211 模糊理論概述

1965 年美國加州柏克萊分校的 LotfiAZadeh 教授首先在他主編的

「Information and Control」刊物上提出「Fuzzy Set」論文此為模糊邏輯理論的

創始模糊理論在經過了三十幾年的演化改進後無論是在應用或理論架構上

皆已日趨完備尤其近年來因人工智慧的迅速發展模糊理論儼然成為人工智慧

不可或缺的理論根基

Zadeh 教授曾提出一個互克性原理﹝5﹞「當系統的複雜性增長時對系統

特性做精確且有意義描述的能力亦相對降低最後精確性與有意義性將變成完全

互相排斥的特性」很高的複雜性意味著只能在一個刻意壓縮的低維因素空間觀

察而無法對問題的全部因素都進行考察使得原本是明確的概念變的模糊

Fuzzy 理論正是為了掌握這類具模糊特質的事物而發展出來的所以它的應用較

偏重於人類的經驗及對問題特性的掌握程度不主張用繁雜的數學分析及數學模

式來解決問題

Fuzzy 理論把傳統數學從二值邏輯〈binary logic〉擴展到連續多值〈continuous

6

multi-value〉利用歸屬函數〈membership function〉描述一個概念的程度亦及

使用 0 和 1 之間的數值來表示一個元素屬於某一概念的程度這個值稱為元素對

集合的歸屬度〈membership grade〉當歸屬度為 1 時表示該元素百分之百屬於

這個概念當歸屬度為 0 時則表示該元素完全不屬於這個概念介於兩者之間

的就是完全屬於和完全不屬於之間的灰色地帶

模糊理論的工程應用大約始於 1974 年倫敦大學的 EHMamdani 教授他根

據 Zadeh 提出的語言分析法〈linguistic approach〉及模糊推論〈fuzzy inference〉

運用 IF-THEN 形式的法則來敘述操作員的控制策略成功地應用在蒸汽機自動

運轉上﹝6﹞從此模糊理論的應用便迅速發展以在控制方面的研究成果最為

顯著模糊理論其實是一門相當生活化的學問由於使用語言變量描述因此更

具親和力與一般性人類日常生活所遇所用的一些敘述即大都是模糊的例如

那個人ldquo很高車開的ldquo很快等等其中ldquo很高ldquo很快並不是一個

明確值而只是描述事件的程度但是根據這些描述人類卻能很輕易的接收

212 模糊集合

模糊集合〈fuzzy set〉可視為傳統集合的擴張在模糊集合的世界中稱傳

統集合為明確集合〈crisp set〉所謂模糊集合是指用來表示界限或邊界不分明的

模糊概念的集合許多日常生活中的概念常常都不是清晰明確的這些可說是模

糊概念例如很高很快等這類概念無法用傳統的二值集合論即 0 或 1 表示

而Zadeh教授提出的Fuzzy集合論可以將這些概念由傳統集合論的特徵函數從非

0 即 1 的二值選擇推廣為從 0 到 1 之間的任何值做選擇得到新型的特徵函數

稱為歸屬函數

模糊集合由歸屬函數表示相對於明確集合的特徵函數其值只有 0 或 1 兩個

值即其值為在實軸閉區間[01]之中的任一實數模糊集合可以彌補明確集

合描述時所產生的不合理現象因此模糊集合比傳統的明確集合更具客觀性

7

213 歸屬函數

歸屬函數〈membership function〉為 0 到 1 之間的數值吾們可以藉由歸屬

函數來描述 Fuzzy 集合的特質它是 Fuzzy 理論的最基本觀念透過歸屬函數我

們才能對 Fuzzy 集合進行量化也才可能利用精確的數學方法分析處理模糊性資

歸屬函數在 Fuzzy 控制的應用範疇內都要具備凸〈convex〉及正規〈normal〉

等基本特性〈如圖 21〉歸屬度函數的定義可以分為數值及函數兩種數值定義

方式又稱為離散化歸屬函數它是直接給定有限 Fuzzy 集合內每個元素的歸屬

度並以向量的形式表現出來函數定義方式又稱為連續化歸屬函數它是以不

同形式的函數來描述 Fuzzy 集合

圖 211 正規且凸模糊集合

1

0 圖 212 正規非凸的模糊集合

8

一個模糊集合的歸屬函數可以有許多方式但是目前最廣泛使用的有吊鐘

型三角型梯型等歸屬函數

〈1〉吊鐘形歸屬函數

吊鐘形歸屬函數定義如下

μA=bell(xabc)= b

acx 2

1

1minus

+

〈21〉

圖 22 吊鐘型歸屬函數

〈2〉三角形歸屬函數

三角形歸屬函數可由三個參數(abc)來加以決定

=Aμ trangle(xabc)

⎪⎪⎪

⎪⎪⎪

ltleminusminus

ltleminusminus

=

other

cxbcbcx

bxaabax

0

〈22〉

其中a為歸屬函數左邊界b為歸屬函數中心值c為歸屬函數右邊界

9

圖 23 三角型歸屬函數

〈3〉梯型歸屬函數

梯型歸屬函數可由四個參數加以決定

=Aμ trapezoid(xabcd)

⎪⎪⎪⎪

⎪⎪⎪⎪

leleminusminus

ltle

ltleminusminus

=

other

dxcdcdx

cxb

bxaabax

0

1 〈23〉

圖 24 梯型歸屬函數

10

214 模糊推論與模糊規則

模糊推論〈fuzzy inference〉是根據知識庫保存的規則(rule)和給予的事實

推導出新的結論與傳統推論不同的地方是Fuzzy推論不只可以處理明確命題也

可以處理Fuzzy命題Fuzzy推論是依據近似推理〈approximate reasoning〉的概念

發展出來的比傳統推論的嚴正推理〈exact reasoning〉更合理也更具彈性近

似推理是兩種嚴正推理General Modus Ponens〈簡稱GMP〉及Genera Modus

Tollens〈簡稱GMT〉的一般化此原理是從傳統二值邏輯中的肯定律〈modus

ponens〉和否定律〈modus tollens〉推廣而來其中GMP又可稱為前向推理而

GMT則可稱為反向推理

〈1〉 GMP〈General Modus Ponens〉

規則IF x is A THEN y is B

事實x is Arsquo

結論y ix Brsquo 〈24〉

〈2〉 GMT〈General Modus Tollens〉

規則IF x is A THEN y is B

事實y is Brsquo

結論x is Arsquo 〈25〉

上式中IF x is A THEN y is B即為模糊規則〈fuzzy rules〉AArsquoBBrsquo

分別是定義在論域X及Y的模糊集合xy代表輸入變數及輸出變數的語言變數

一般來說「x is A」稱為前件部〈antecedent〉而「Y is B」則稱為後件部

〈consequence〉Fuzzy知識庫〈Fuzzy Knowledge Base簡稱FKB〉即由這些模

糊規則所組成的規則庫〈rule base〉和存放描述領域知識的Fuzzy變數及語言變數

的資料庫〈data base〉所組成所以FKB是用來描述受控對象所涉及的領域知

11

識和操控目標的一些定性及定量的資訊模糊知識庫和模糊推論是構成Fuzzy規

則系統核心的兩個重要部門﹝7﹞

模糊推論是模糊系統的核心根據知識庫的模糊法則進行模糊理論的合成運

算來模擬人類的思考決策模式一般來說規則的建立是採取十分主觀直覺的

方式依據相關領域專家的經驗與知識透過詢問進而將其知識經驗歸納條列出

重點再轉換成模糊規則的形式表現出來但是並非所有的專家或操作員都能

將自身的經驗知識以言詞的方式充分的表達出來且未必能整理成條列的模糊規

則所以知識規則的萃取工作往往是在建構模糊系統時最常遭遇到的困難之

215 模糊控制器

模糊控制是智慧型控制〈intelligent control〉系統的一種典型其基本特點

是不完全依賴受控對象的數學模型主要是利用人的操作經驗知識和推理技

術以及控制系統的某些訊息和性能得出對應的控制動作模糊控制是以並行

〈parallel〉方式處理規則的推理工作〈如圖25〉其近似推理會包容每個對操

控系統有貢獻的規則即使某些貢獻程度很小的規則也不會忽略

圖 25 模糊控制系統的構造

12

一個控制器的輸入通常是確定數值而非模糊輸出也是如此才能對被控對象

發生作用但是模糊邏輯控制器〈Fuzzy Logic Controller簡稱FLC〉則是以語

言化的控制規則為主體為了能夠把輸入的確定值與語言化之後的控制規則結

合必須把輸入的確定值模糊化〈fuzzification〉以便對應到FLC語言變數的論

域範圍中同樣的經過規則庫推理出來的結果是對應到輸出語言變數的論域

中所以也必須對其做解模糊化〈defuzzification〉的工作才能達成實際的控制

目標

一般模糊控制器的架構包含了五個主要部分定義變數模糊化知識庫

模糊推論及解模糊化

〈1〉 定義輸入及輸出變數

決定程序被觀察的狀況及考慮控制的動作輸入變數可以是擷取

自受控系統的觀測量也可以是推導出來的資料輸出變數則為操控

受控系統的操作量例如在一般控制問題上輸入變數通常為輸出

誤差e與輸出誤差之變化率e而控制變數則為下一個狀態之輸入

u其中eeu統稱為模糊變數

〈2〉 模糊化

將量測值轉換為語言變數的過程將外界所輸入的確定數值經由

一比例映射傳送到輸入變數所對應的模糊論域然後再利用模糊化

函數將此輸入資料轉換成適當的口語值以供模糊運算使用此口語

化變數稱之為模糊子集合

〈3〉 知識庫

模糊知識庫是模糊控制的依據由它來定義所有使用到的語言控

制法則及相關各項參數知識庫可說是整個控制系統資料核心其包

含了兩個部分資料庫〈data base〉與規則庫〈rules base〉

1 資料庫

提供處理模糊數據之相關定義資料庫所存放的資料是關

13

於如何將明確的資料轉換成模糊數值而資料的存放方式是以

歸屬函數表示該選用哪一種歸屬函數依實際的需要選定

以三角形歸屬函數最常被使用因其運算最為容易且又能充分

的表達模糊概念

2 規則庫

利用語言化的條件式控制規則描述控制目標和策略通常

控制規則可以由操控人員的經驗或專家的知識推導出來多個

控制規則所組成的集合就是規則庫

〈4〉 模糊推論

模糊推論為模糊控制最重要的核心其最主要的工作就是做實際

的決策過程處理模糊推論具有模擬人類做決策判斷的能力其基本

理論就是根據人類特有的近似推理方式如之前已說明的GMP和

GMTGMP為前向推理而GMT為逆向推理因為模糊推論為前向

運算因此GMP非常適合使用為模糊控制的推論機構

〈5〉 解模糊化

將推論完成所得到的模糊輸出量轉換成實際的明確數值以便和

外界溝通解模糊化的方法有很多例最大歸屬度法重心法高

度法面積法等

圖 26 模糊系統的基本架構

14

22 直流馬達數學模型

圖27為直流馬達等效電路簡圖其中

iV = 輸入電壓 ai = 電樞電流

zR = 電樞電阻 gT = 轉矩

aL = 電樞電感 bE = 反電動勢

φ = 空氣隙磁通量 ω = 轉子角速度

B = 黏滯摩擦係數 J = 轉動慣量

圖 27 直流馬達等效電路簡圖

由克希荷夫電壓定律知

( ) ( ) ( )tEdt

tdiLtiRV b

aaaai ++= 〈26〉

由於反電動勢 bE 與轉軸的角速度 ( )tω 及空氣隙磁通量φ之乘積成正比即

( ) ( ) ( )tKtKtE emb ωφω == 〈27〉

15

又轉矩的平衡方程式為

( ) ( ) ( )dt

tdJtBtTgωω += 〈28〉

且馬達轉矩 gT 與電樞電流 ( )tia 及空氣隙磁通量φ乘積成正比即

( ) ( ) ( )tiKtiKtT ataag == φ 〈29〉

取〈26〉~〈29〉式之拉氏變換得

( ) ( ) ( ) ( )sEssILsIRsV baaaai ++= 〈210〉

( ) ( )sKsE eb Ω= 〈211〉

( ) ( ) ( )sJssBsTg Ω+Ω= 〈212〉

( ) ( )sIKsT atg = 〈213〉

則馬達輸入電流與轉速為

( ) ( ) ( )( ) ( )( )

sR

sEsV

sLRsEsV

sIe

a

bi

aa

bia τ+

minus

=+minus

=1

〈214〉

( ) ( ) ( )

sB

sT

sJBsT

sm

gg

τ+=

+=Ω

1 〈215〉

其中a

ae R

L=τ 為電樞電流的電氣時間常數 BJ

m =τ 為馬達轉動的機械時間

常數

直流馬達轉速對輸入電壓的轉移函數 ( )sG 為

( ) ( )( ) ( )( ) etaa

t

i KKBJsRsLK

sVssG

+++=

Ω=

( )( ) etmea

t

KKssBRK

+++=

ττ 11 〈216〉

16

在一般情況電樞電感很小所以 eτ 可以忽略不計因此上式成為一階落後

方程式

( ) ( )( ) ( ) m

m

etma

t

i sTK

KKsBRK

sVssG

+=

++=

Ω=

11 τ 〈217〉

其中

eta

mam KKBR

BRT

+=

τ

eta

tm KKBR

KK

+=

所以直流馬達數學模式可以以圖28表之﹝8﹞

圖 28 直流馬達數學模式方塊圖

17

第三章 系統功能分析與製作規劃

31 專題製作流程

如圖 31 所示本專題主要分為兩條路徑進行一為硬體另一則為軟體程

式撰寫本章著重硬體的規劃設計軟體則在第四章中介紹在完成 AB 信號

產生電路驅動功率放大電路與間距脈波產生電路設計與製作後須先接上馬達

做一連串的測試〈此時系統並無回受控制〉測試間距脈波是否太長或太短硬

體電路是否有缺失hellip等等另一方面也著手撰寫模糊控制程式並將其與硬體電

路結合最後做閉迴路系統的整合測試若發現系統的運作結果並不如預期

則需分別從硬體與軟體兩方面去改良

直流馬達轉速之模糊控制

文獻蒐集與整理

AB信號產生電路設計與製作

驅動功率放大電路設計與製作

間距脈波產生電路設計與製作

測試間距脈波是否太長或太短

系統測試測試馬達轉速是否

達到控制目的

結束與論文寫作

重新設計間距脈波長度

Yes

No

系統整合與修正

輸出信號與Fuzzy控制器之連結設計

規劃輸出與輸入歸屬函數

規劃模糊知識庫

撰寫主程式並加入模糊知識庫

程式編譯及連結

軟硬體整合測試馬達是否運作

程式調整及最佳化

No

YesYes

No

圖 31 專題製作流程圖

18

32 雙脈寬調變法之直流馬達驅動電路設計

本專題製作的雙脈寬調變法之直流馬達驅動電路設計大致可以分為二大部

分第一雙脈寬調變法之電路設計第二橋型驅動功率放大電路

雙脈寬調變〈Two Pulse Width Modulation簡稱TPWM〉之電路設計主要

是先製作一脈寬調變〈Pulse Width Modulation簡稱PWM〉波形然後再將此

波形各別經由一緩衝器〈buffer〉和反向器〈inverter〉則可產生AB驅動信號

脈波此即為TPWM

321 脈寬調變電路

如圖32先利用兩顆op產生三角波電路再利用一個比較器比較三角波

和誤差值之大小

150k

1M

20k

+12V

-12V

+12V

-12V10k

+12V

-12V

10k

+12V

-12V-

+-

+

-

+ PWMLM324

LM324

LM324

2200pF

圖 32 脈寬調變電路

〈1〉 三角波產生電路

三角波產生電路通常至少需要兩個運算放大器其電路如圖33OP1

為一個反相積分器OP2為一個史密特磁滯比較器將OP2的輸出方波經

19

OP1反相積分以後得到Vo1三角波此三角波又同時加到OP2控制其狀

態的改變

當方波產生器的輸出是正的則三角波產生器的輸出是斜向負相似

地當方波產生器的輸出是負則三角波產生器的輸出是斜向正這個動

作將產生三角波的輸出同時也輸出方波﹝9﹞

+VCC

-VCC

-

+

R1

R2

R3

+VCC

-VCC

-

+

OP1

OP2

Vo2Vo1

圖 33 三角波產生電路

對OP2而言是磁滯比較必須先找到OP2的 THV 和 TLV

232

21

32

3oo v

RRR

vRR

Rv

++

+=+ 〈31〉

當 0=+v 時

23

21 oo v

RR

v minus= 〈32〉

表要達到OP2的 0=+v 必須有這麼大的 1ov

當 12 sato Ev = 時

TLsato VERR

v =minus= 13

21 〈33〉

當 22 sato Ev minus= 時

THsato VERR

v =+= 23

21 〈34〉

20

對OP1而言是反相積分器 2ov 為其輸入 1ov 為其輸出則

tCIt

Rv

Ct

CRv

dtvCR

v oooo

11

2

11

22

111

11minus=minus=minus=minus= int 〈35〉

因為

1

2

Rvv

I o minusminus= 0=minusv 〈因為虛接地〉 〈36〉

所以

1

2

Rv

I o= 〈37〉

又因運算放大器的輸入阻抗非常大則流經 1C 的電流也為 I 相當於以定

電流對電容C 充電

當 12 sato Ev = 時 1ov 為下降斜波

tR

EC

v sato

1

1

11

1minus= 〈38〉

當 22 sato Ev minus= 時 1ov 上升斜波

( )

tRE

Cv sat

o1

2

11

1 minusminus= 〈39〉

由此可知三角波的上升與下降斜波乃因 1C 的充電與放電且時間

常數為 11CR

三角波週期分析如下

1 上升斜波的時間 1T

tCR

vv o

o1

1

21 minus= 11

2

1 CRvv

to

ominus=

1Tt = TLTHo VVv minus=1 22 sato Ev =

11111

21

sat

TLTH

sat

TLTH

EVV

CRCRE

VVT

minus=

minusminus= 〈310〉

2 下降斜波的時間 2T

tCR

vv o

o1

1

21 minus= 11

2

1 CRvv

to

ominus=

21

2Tt = THTLo VVv minus=1 12 sato Ev =

1

11111

1sat

TLTH

sat

THTL

EVV

CRCRE

VVT

minus=

minusminus= 〈311〉

3 週期 21 TTT +=

若 1satE = 2satE = satE 且3

22RR

VV TLTH =minus satE

3

2114

RR

CRT=

若R3 = nR2

則nCR

T 114=

114 CR

nf = 〈312〉

《實驗結果》

必須注意的是三角波的頻率太低將導致馬達的轉動產生脈動現象

故將工作頻率設計在1kHz以上

Ω= k1501R Ω= k102R

Ω= k203R pFC 22001 =

所得到的三角波頻率為

15kHz10220010001504

00010100020

f 12- =timestimestimestimes

timestimes

=

圖 34 三角波輸出波形

22

〈2〉 脈寬調變電路〈PWM〉

+12V

-12V

10k

+12V

-12V -

+ PWM輸出LM324三角波輸入

圖 35 脈寬調變電路

PWM系統往往連接至直流電源供應放大器的工作是以固定的頻率開

閉直流供應電壓其激發角是可以調整的因此得到波寬可調的輸出

將固定頻率的三角波與反向輸入的電壓做比較便可輸出一脈寬〈見圖

36〉反向電阻值的不同將導致反向輸入電壓不同故其輸出為一可調但

頻率固定的脈寬也正因為如此故稱為脈寬調變〈PWM〉由於輸出的

dutycycle不同故馬達將接收到不同的平均電壓因而可以藉由PWM控制

馬達的轉速

反相輸入電壓

PWM

圖 36 三角波與反相輸入電壓比較

23

PWM的優點在於馬達驅動電路的電晶體之控制信號改以脈波列來控

制使電晶體操作成類似開關的動作不是完全導通就是完全截止故電晶

體不是一直操作於作用區所以其功率消耗不大整體效率較高

《實驗結果》

圖 37 PWM 輸出波形

322 橋型驅動功率放大電路

如圖38所示主要由四個功率電晶體組成利用不同的電晶體對使直流

馬達做正逆轉控制當Q5Q8導通使馬達正轉當Q6Q7導通馬達則逆

轉電路中的電晶體扮演開關的作用

此種電路簡單只要一組直流電源供應且電晶體分擔了部份的電壓保護

電晶體迅速工作於截止與飽和狀態之間故沒有功率散逸損失之虞

但是在設計時切勿使Q5Q6同時導通以免燒毀電路上之元件因為在

AB兩脈波短暫的交變時間內由於電晶體本身之最小延遲時間有可能使Q5

Q6同時ON與Q7Q8在很短時間同時ON因此在15kHz交變下容易燒毀功

率電晶體

因此設計一間距脈波電路主要之功用使Q5Q6和Q7Q8均不同時導通

24

以拉長AB兩者交換時間

M

20k

10k

20k

10k

+24V

A 信號 B 信號

2N3055 2N3055

2N2955 2N2955

1N40021N4002

C1815 C1815

C1815 C1815

Q5

Q8Q6

Q7

圖 38 橋型驅動功率放大電路

圖 39 橋型驅動功率放大電路實體圖

25

此外若考慮電晶體BE間的電壓則電路會出現約 plusmn 06V的不感帶〈ded

band〉即電晶體的 oV 對 inV 間的關係如圖3101假使 inV 電壓為正弦波則 oV 變

成如圖3102為了改善這種缺失吾人利用兩個二極體接在電路上如圖38

用來補償電晶體BE間的壓降﹝10﹞

約06V

Dead band

Vo

Vin

圖 3101 呈現不感帶的轉移函數

圖 3102 輸出電壓波形

26

323 間距脈波產生電路

RCext15

Cext14 74123

A3

B2

Q13

CLR1

Q4

7486100k

2200pF

10k

10000pF

+5V

間距脈波輸出

圖 311 間距脈波產生電路

間距脈波的產生方式是根據脈寬調變〈PWM〉後的訊號再經由積分電路的

電阻兩端取出且經由兩倍頻器〈74LS86〉檢示出PWM的正負緣脈波最後

再利用單穩態IC〈74LS123〉將檢出信號之脈寬拉長至01ms此即為間距脈波

74LS123有兩個輸入端子A及B分別為下降波緣輸入端子及上升波緣輸入端

子當輸入A之脈波由ldquoH變成ldquoL之瞬間Q輸出變為ldquoH其持續時間長

短由RC時間常數決定反之當輸入B之脈波由ldquoL變成ldquoH之瞬間Q輸出

變成ldquoH維持一定時間

74LS123的輸出脈波之寬度是由電阻及電容之時間常數所決定概略計算公

式如下

CR045T timestimes=

電容 C 必須大於 1000pF

27

《實驗結果》

R=24kΩ C=10000pF

所以得到間距脈波為

( )msec0110810000p24k045T cong=timestimes= μ

圖 312 間距脈波

研究經分析後發現

1 間距 T 愈大愈能確保電路之安全性愈有保護作用

2 間距 T 愈大相對的使驅動信號脈波減少愈多造成馬達旋轉扭力大

大減弱

3 適當的間距 T不但不會影響馬達的輸出轉矩而且兼具保護電路的

效果

33 編碼器

轉動編碼器不只可以作為轉速的感測也能做位置的感測又適合於數位處

理故被廣泛使用若就信號來看轉動編碼器可分為增量型與絕對型若以檢

測的方式來分可分為光學式和磁式兩種在本專題中所使用的編碼器為光學式

增量型編碼器﹝11﹞

光學式轉動編碼器的原理如圖 313在附有細縫轉盤的兩側分別裝置發光元

28

件與受光元件如果只有一組光電檢測元件則輸出信號就只有一相的脈波信

號此種裝置稱為脈波產生器圖 314 為增量型轉碼器的輸出信號它是利用

兩組光電元件所產生的脈波信號A 相和 B 相間有相位差正轉時 A 相領前 B

相逆轉時 B 相領前 A 相因此利用此兩相做檢測馬達為正轉或逆轉的工作

並利用 A 相或 B 相的頻率檢測出目前的轉速

吾人計算出編碼器每一轉可以產生約 200 個脈波故檢測 A 相或 B 相其頻

率為 N則轉速應為 60200

timesN

〈rpm〉

圖 313 光學式轉動編碼器的原理圖

圖 314 編碼器的輸出信號波形

29

34 LM2917 FV 電路設計

對 LM2907 而言磁滯比較器和電流汞是構成頻率對電壓轉換的基本架構

並且預留一個運算放大器及一個電晶體供各種不同的使用圖 315 為吾人所設

計的 FV 電路圖中 C1 用以抑制電流汞動作時所產生的漣波變化正常使用時

此電容應大於 10C若 C1 太大也將造成轉換速度下降

因為單晶片 8051 之輸入電壓最高為 5V故必須設計其馬達最高轉速頻率所

轉成的電壓必須在 5V 以內由於馬達轉速頻率範圍極大故吾人給予 LM2917

+12V 的電壓以擴大它可以轉換的電壓範圍並將所需維持在 5V 內

a1

14

b1

1

a1

13

b1

2

a1

12

b1

3

a1

11

b1

4

1

a1

10

b1

5

a1

8

b1

7

a1

9

b1

6

L2917

Encoder輸 入

1uF

+12V

FV輸出1000pF

45k 10kC1

C2

圖 315 FV 電路

30

《實驗結果》

根據統計結果每 50mV 相對於 100Hz如此一來吾人想得知馬達目前

的轉速只要將單晶片所接收到的電壓值經過換算即可得知目前 encoder 所量測

的頻率吾人知道 encoder 一圈可產生 200 個脈波故馬達的轉速便可經過下列

公式換算得知

轉速〈rpm〉 60200

times=f

其中 =f encoder 所量測到的頻率

表 31 頻率與轉換電壓之關係

頻率

(Hz) 1 2 3 4 5 6 7 8 9

電壓(V) 0006 0006 0007 0008 0009 0009 0009 0009 001

頻率

(Hz) 10 20 30 40 50 60 70 80 90

電壓(V) 008 009 010 010 011 011 012 012 013

頻率

(Hz) 100 200 300 400 500 600 700 800 900

電壓(V) 013 018 023 028 033 038 043 049 054

頻率

(Hz) 1000 2000 3000 4000 5000 6000 7000 8000 9000

電壓(V) 059 109 16 209 257 304 3508 4006 45

31

圖 316 頻率對電壓曲線

35 單晶片介面電路

單晶片介面包括了二大部分分別為單晶片 8051AD converter

〈1〉8051 單晶片

為本控制系統的核心一切動作皆經由它控制

〈2〉AD converter

將類比開關所送出來的類比訊號經由 ADC 0804 轉換成數位訊號傳送

到單晶片的輸入埠

351 AD 轉換

以單晶片 8051 控制 ADC0804則單晶片 8051 必須下達ldquo開始轉換rdquo的命令

給 ADC0804然後 ADC0804 就開始讀入類比輸入端的電壓在內部開始轉換

經過一段轉換時間後〈約 100μ s〉ADC0804 就將轉換完成的值放在其內部的三

態輸出栓鎖緩衝器裡然後將轉換完成輸出腳〈INTR〉降為 low以通知單晶片

可以去讀轉換完成資料

當WR和CS 同時為ldquo0rdquo時表示對 ADC0804 下達ldquo開始轉換rdquo命令再經過

32

一段轉換時間〈100μ s〉後轉換完成ADC0804 會將其轉換完成的數位資料放

在其內部 8 位元緩衝區裡且將 INTR 降為ldquo0rdquo因此單晶片只要下達ldquo開始轉換rdquo

命令後去檢查 INTR 的狀態就可以知道是否轉換完畢其方法有兩種

1 輪詢法〈polling〉

2 中斷法〈interrupt〉

所謂輪詢法就是將 ADC0804 的 INTR接到 CPU 的一條 IO 線上然後以軟體指

令主動偵測其狀態當偵測到為ldquo0rdquo時就可以去讀出 ADC0804 裡的緩衝區的轉

換值

中斷法是一個很理想的 IO 方式因為不像輪詢法必須讓 CPU 等 ADC0804

轉換當 CPU 下達ldquo開始轉換rdquo命令後就可以做其他工作當 ADC0804 轉換完

畢後 INTR會降為ldquo0rdquo可以利用此信號去中斷 CPU再由中斷副程式去讀入

轉換值即可因此大大提高了程式的效率

當 CPU 接收到 ADC0804 發出ldquo轉換完畢rdquo的信號〈 INTR =0〉後就可以去

讀出轉換值其讀出的方法是將CS 與RD設為ldquo0rdquo即可讀到轉換值這個讀值的

動作又會使得 INTR恢復成ldquo1rdquo

1 CPU 下達ldquo開始轉換rdquo命令〈CS =0WR =0〉

2 ADC0804ldquo轉換完畢rdquo 〈 INTR =0〉

3 CPU 讀取轉換值〈 RD =0CS =0〉

4 讀完後 INTR =1

ADC0804 主要規格摘要如下

1 +5V 單電源工作電壓

2 類比電壓輸入範圍 0~+5V

33

3 參考電壓為 25V

4 轉換時間為 100μ s〈 CLKf =640kHz〉

5 解析度為 8 位元

6 誤差plusmn 1LSB

7 讀取時間 135ns

36 電源供應系統

本專題中所有電路及硬體設備所需的電源採用交流電源 110V 經由 PT-31

變壓器後再經過橋式整流後提供了直流電源而因為各個電路所需電源不同

因此製作了多組的變壓電路如下

1電壓源 DC5V選擇了 7805 的穩壓 IC 搭配電容得到了+5V 的電壓源

供〈1〉8051 微處理器 〈2〉ADC 0804 〈3〉74LS8674LS12374LS04

74LS02CD4013 〈4〉馬達 Encoder

2電壓源 DC12V使用 7812 穩壓 IC 搭配電容得到+12V 的電壓源供

LM2917 使用

3電壓源 DC24V利用 7824 的穩壓 IC 搭配電容獲得+24V 的直流電壓

源供電路之橋型驅動功率放大之電晶體使用

Vin1

+12V2

GND3

LM7812

2200uF 10000pF 2200uF 10000pF

+12V outputAC

圖 317 直流電源電路

34

圖 318 直流電源電路實體圖

37 馬達轉速的量測

表 33 PWM 輸出對應 encoder 週期

PWM dutycycle encoder 週期 PWM dutycycle encoder 週期

40 sμ 172 sμ 440 sμ 0 sμ

80 sμ 188 sμ 480 sμ 0 sμ

120 sμ 204 sμ 520 sμ 0 sμ

160 sμ 230 sμ 560 sμ 0 sμ

200 sμ 272 sμ 600 sμ 0 sμ

240 sμ 328 sμ 640 sμ 0 sμ

280 sμ 416 sμ 680 sμ 1320 sμ

320 sμ 540 sμ 720 sμ 750 sμ

360 sμ 800 sμ 760 sμ 510 sμ

400 sμ 1320 sμ 800 sμ 400 sμ

35

圖 319 PWM 輸出對應 encoder 週期

由統計可知道此馬達並不是一顆線性馬達故相信若使用模糊控制理論來

作為其回授控制系統的控制器一定能達到比傳統控制器的性能還要好而且若能

在模糊控制裡加上 PID 控制器的觀念一定能在系統的響應時間上升時間

安定時間和超越量達到最佳的控制另一方面馬達在其反方向的內阻較大需

要更大的力量才能使馬達驅動

36

第四章 軟體規劃與製作

41 PWM 之軟體設計

因為之前所介紹的硬體方式是以調整可變電阻來達到轉速的調整因此無法

得知所給予的脈寬長度和轉速大小尤其在回授時也不易給予適當的訊號來調整

轉速因此改良之方法就是以8051之軟體撰寫方式來產生固定的脈寬也就等

於給予轉速的命令而在其回授控制時也只要在內部程式给予適當的指令便可

達到脈寬長度的調整以達到閉迴路之受控系統

411 PWM 軟體流程

設定Timer0模式為0

TH0 = temp 32 TL0 = temp 32

temp = 8192 ndash j4 Key = 0

檢查是否有鍵值

將鍵值存入Key

Yes

No

設定Key值所對應的 j值

If P30 == 1Then P30 = 0 temp = 8192 ndash j4Else P30 = 1 temp=8192ndash880+j4

TH0 = temp 32 TL0 = temp 32

Start Timer0中斷副程式

啟動Timer0

等待Timer0中斷

返回主程式

圖 41 PWM 軟體設計流程圖

37

在此總共設計了五個按鈕分別代表不同的轉速停止正轉〈慢〉正轉

〈快〉逆轉〈慢〉和逆轉〈快〉使用Timer0是因為8051之計時中斷比延遲程

式來的準確故可以達到準確的計時程式設計理念中並沒有將中斷致能清除

因此Timer0會一直處於計時的狀態程式執行時將一邊檢查鍵值〈KeyStatus〉一

邊進行計時當計時完畢便呼叫中斷副程式然後執行改變Port 30的輸出狀

態若是為high則變為low反之若是為low即變為high同時並重設計時時間

Timer0繼續計時

當鍵值改變時計時的時間也會跟著改變如此一來Timer0將ㄧ直重覆上

述動作直到電源切掉Timer0才會停止計時

42 模糊控制之程式規劃與撰寫

本專題目標在完成了先前所規劃的硬體電路之後接著就是要達成利用模糊

控制理論來設計控制器在此採用了單晶片8051目的是為了以硬體實現方式來

代替電腦模擬期望能夠按照原訂計畫完成本專題「具模糊控制理論與雙脈寬調

變法之直流馬達驅動電路設計」

單晶片 8051 模糊控制的程式撰寫採下列幾個步驟依序完成

1 設定變數轉速誤差〈dspeed〉目前轉速〈sspeed〉

2 模糊化採用三角形歸屬函數採用三角形歸屬函數的原因

〈1〉 三角形函數為一連續函數

〈2〉 三角形函數為線性的函數所以計算速度較快

〈3〉 是具有發散也有收斂的函數和指數函數一樣接近

事實

3 模糊推論模糊規則將其所有可能發生情況以 IFhellipTHENhellip表示

並建立控制規則表

4 解模糊化採用重心法

38

421 歸屬函數

設定變數為目前轉速〈sspeed〉與轉速誤差〈dspeed〉因此此模糊控制器共

有兩個輸入訊號與一輸出訊號輸出訊號為脈寬長度該加或是減多少又因為有

五種不同的轉速因此各分別設計了不同的歸屬函數如下

1 當轉速 = 0

ml h

s s p e e d

d s p e e d

r p m0 5 0 1 0 0- 5 0- 1 0 0

mv l l h v h

r p m0- 3 0- 6 0- 1 0 0 3 0 6 0 1 0 0 圖 42 停止時之歸屬函數

2 正轉〈慢〉

ml hsspeed

dspeed

rpm150 225 300750

mvl l h vh

rpm150100500 200 250 300

圖 43 正轉〈慢〉之歸屬函數

39

3 正轉〈快〉

ml hsspeed

dspeed

rpm520 670 820370220

mvl l h vh

rpm500400300200 600 700 800

圖 44 正轉〈快〉之歸屬函數

4 逆轉〈慢〉

ml hsspeed

dspeed

rpm100 250 400500

mvl l h vh

rpm10050250 200 300 400 圖 45 逆轉〈慢〉之歸屬函數

40

5 逆轉〈快〉

ml hsspeed

dspeed

rpm300 450 600150

mvl l h vh

rpm450350250150 550 650 750

750

圖 46 逆轉〈快〉之歸屬函數

6 輸出

OutputMVL L H VH

rpm0-50-150-250 50 150 250

圖 47 輸出之歸屬函數

41

422 模糊規則庫

表 41 為吾人所設計的模糊控制規則庫並利用 Matlab 之 Fuzzy ToolBox 來

建立此規則庫以進行模擬推論圖 48 為當馬達輸入指令為正轉慢時推論後所得

到的三維空間圖

表 41 模糊控制規則表

Dspeed

vl l m h vh

l H M L VL VL

m VH H M L VL sspeed

h VH VH H M L

圖 48 推論後的三維空間圖

42

423 模糊控制器之軟體設計流程

Start 外部中斷副程式

ADCWR = 0 ADCWR = 1

〈令AD開始轉換〉

檢查鍵值以得到對應的歸屬函數

取得目前轉速與

轉速誤差

Fuzzy Rules決策

得到輸出訊號

Delay 10ms

ADC = 0 讀取AD值 ADCRD = 0

將AD值換算成轉速

ADCWR = 0 ADCWR = 1

〈AD開始轉換〉

返回主程式

致能外部中斷

圖 49 Fuzzy Controller 程式流程圖

當控制器一開始動作時便先執行AD轉換的工作當AD轉換完成時其

INTR的接腳便會觸發8051的外部中斷INTR0於是程式便發生外部中斷執行

外部中斷副程式的指令

43

在外部中斷副程式中AD將ㄧ直進行轉換與讀取的工作同時並將轉換後

的值直接換算成目前轉速與轉速誤差以供模糊控制器使用換算目前encoder

的頻率其公式為

160-V2000 times=頻率 〈4-1〉

式4-1之公式是根據表31所導出來的其中V為encoder之頻率轉成電壓之值

又假設所讀取的AD轉換值為value因為

AD的解析度 = bit256

5V+ = 511 ( Vbit ) 〈4-2〉

故value值與電壓V之關係為

511 value V times= 〈4-3〉

所以encoder之頻率與value值的關係為

頻率= 2000times ⎟⎠⎞

⎜⎝⎛ times

511 value - 160 〈4-4〉

故目前轉速為

sspeed = ( )rpm 60 200

times頻率 〈4-5〉

另ㄧ方面在主程式中程式會先去檢查鍵值也就等於檢查輸入指令以

找出符合使用的歸屬函數並將AD所獲得的轉速對應到歸屬函數中然後執行

決策判斷即進入規則庫中尋找出適當的決策判斷最後將此決策送入PWM程

式裡進行脈寬長度的調整使馬達在合理的要求下達到理想的轉速控制不會

因為外在環境的影響而使馬達轉速受到干擾

43 LCD 顯示轉速

此專題最後再增加一LCD顯示幕以顯示目前的轉速否則在程式設計完成

後人卻因無法以肉眼得知目前轉速而不能肯定馬達轉速是否有達到控制的目

標因此增加一顯示幕LCD是有必要的不僅隨時得知目前的轉速還能知道

44

設計出來的軟體其控制性是否夠好夠穩定

431 LCD 顯示幕之軟體流程

Start

設定LCD模組的初始狀態

設定外部中斷INTR0

與Timer0

設定TH0 = (65536 ndash 5000) 256 TL0 = (65536 ndash 5000)256

令ADCWR = 0 ADCWR = 1 AD開始轉換

等待中斷

外部中斷副程式

ADCRD = 0 讀取AD值 ADCRD = 1

將AD值換算成速度

ADCWR = 0 ADCWR = 1 AD開始轉換

Timer0中斷副程式

顯示LCD第一行

ldquoMotor Speed =

顯示LCD第二行ldquoxxxxxxx rpm其中 xxxxxx為外部中斷副程式所換算出的轉速

重設TH0與TL0

返回主程式返回主程式

圖 410 LCD 顯示幕之程式流程圖

此程式主要由兩個部分完成一為外部中斷副程式另ㄧ為 Timer0 中斷副

程式當主程式完成外部與 Timer0 兩個中斷的設定後隨即命令 AD 開始轉換

之後便一直停在 while〈1〉的迴圈裡不做任何動作而由兩個中斷副程式來完

成整個轉換與顯示的工作

45

外部中斷副程式主要負責 AD 的轉換讀取與轉速換算的工作AD 第一

次的轉換由主程式來下達命令當轉換完成後AD 的 INTR 接腳將觸發外部中

斷〈INTR0〉副程式此時程式便進入外部中斷副程式執行讀取 AD 值與轉速

換算的工作當這些工作完成時外部中斷副程式再次下達 AD 開始轉換的命

令而離開中斷副程式當 AD 再次轉換完成時又將再次執行中斷副程式

如此週而復始中斷副程式將ㄧ直進行讀取換算與轉換的工作

而 Timer0 中斷副程式主要負責 LCD 顯示之工作當主程式所設定的計時時

間計數完時程式便進入 Timer0 中斷副程式一旦進入 Timer0 中斷副程式程

式將執行 LCD 的顯示然後再重設 Timer0 的計數時間Timer0 將重新計數當

計數完時程式又將再度進入 Timer0 中斷副程式執行因為程式中並無清除

Timer0 的中斷致能故 Timer0 中斷副程式和外部中斷副程式ㄧ樣週而復始的

執行其副程式的工作

46

第五章 結論

本計劃主旨為具模糊控制理論與雙脈寬調變法之直流馬達驅動電路設計主

要是針對傳統電路設計之缺點提出改良之方法以TPWM取代PWM電路以模

糊理論基礎設計之控制器替代傳統PID控制器

TPWM轉速控制優於PWM之處在於

1 TPWM只需使用單電源即可達到正轉和逆轉的轉速控制而PWM必須

加上逆向開關或是雙電源才能使馬達產生正轉和逆轉

2 TPWM可控制馬達處於停止狀態無論在正向或逆向加上負載皆無法使

馬達產生轉動

3 馬達消耗定額功率輸出轉矩為額定值

4 馬達由停止到某定轉速時反應時間較快

模糊控制器優於PID控制器

1 不須導出繁雜的數學模型

2 適用於非線性系統

3 強健性與容錯性較高

本專題至此雖說大致的目標都已達到但是此系統仍然有許多不完美而需要

改進的地方例如在實驗過程中發現整個轉速的控制在回授上其反應時間

有點慢探討其原因有可能是控制器之程式上的問題

1 因為使用C語言撰寫程式故其執行速度較慢

2 程式可能寫的太累贅

3 模糊控制規則庫建立不良

若想改善這些問題可以嘗試著將C語言改為組合語言來撰寫並盡量減少

47

不必要的指令相信此動作一定能大大提昇程式的執行速度其次就是多做測

試利用測試中所學到的經驗來幫助模糊控制規則庫的改寫同時也能從測試中

發現更多的問題若是都能對問題加以一一解決的話相信必定能將此控制系統

做的更盡善盡美

48

參考文獻

﹝1﹞ 李適中直流馬達速度控制伺服控制〈基礎篇〉全華科技圖書股份有

限公司民 74

﹝2﹞ 廖錦文ldquo直流電動機之雙脈寬調變是〈TPWM〉驅動電路研究電

子技術月刊第 69 期pp94-1021992

﹝3﹞ 楊英魁孫宗瀛鄭魁香林建德蔣旭堂模糊控制理論與技術全華

科技圖書股份有限公司民 85

﹝4﹞ 林敦煌陳憬德直流馬達定位及轉速的模糊控制逢甲大學自動控制工

程學系學士論文民 87

﹝5﹞ LAZadehldquo Fuzzy Sets Information and Control Vol8 pp338-353

1965

﹝6﹞ EHMamdani and SAsslianldquo A fuzzy logic controller for a dynamic

plant Internation Journal of Man-Machine Studies Vol7 pp1-13 1975

﹝7﹞ 孫宗瀛楊英魁Fuzzy 控制理論實作與應用全華科技圖書股份有

限公司民 83 年

﹝8﹞ 許中平黃煌嘉直流電動機控制電路設計全華科技圖書股份有限公司

民 75

﹝9﹞ 盧明智黃敏祥OP Amp 應用+實驗模擬全華科技圖書股份有限公司

民 83

﹝10﹞陳文耀電動機控制工程復文書局2003

﹝11﹞許中平林全福電動機運轉控制技術全華科技圖書股份有限公司民

77

﹝12﹞楊明豐8051 單晶片 C 語言設計實務碁峯資訊2003 年

﹝13﹞蔡朝洋單晶片微電腦 80518951 原理與應用全華科技圖書股份有限公

司民 91

49

﹝14﹞王文俊認識 Fuzzy全華科技圖書股份有限公司民 90

50

附錄 A 專題硬體展示圖

圖 A-1 硬體整體圖

圖 A-2 硬體整體鳥瞰圖

51

圖 A-3 硬體側視圖

圖 A-4 操作與顯示面板

圖 A-5 間距脈波電路與 FV 電路

52

圖 A-6 橋型驅動功率放大電路

圖 A-7 操作與控制面板

53

附錄 B PWM 與模糊控制之程式

include reg51h include stdioh sbit ADCRD = P3^1 設定 RD 控制線接腳為 P31 sbit ADCWR = P3^3 設定 WR 控制線接腳為 P33 sbit P2_0 = 0xA0 接腳定義 sbit P2_1 = 0xA1 接腳定義 sbit P3_0 = 0xB0 接腳定義 sbit P3_1 = 0xB1 接腳定義 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P3_6 = 0xB6 接腳定義 void KeyStatus(void) 函數原型宣告 void feedback(void) 函數原型宣告 void compute_grade(void) 函數原型宣告 void delay1ms(int count) 函數原型宣告 void convert() 函數原型宣告 void condition() 函數原型宣告 void CW(void) 函數原型宣告 int j i 對應 PWM 的寬度 unsigned int temp 所設計的計時器時間 int sample = 1000 取樣率設定消除顯示值跳動 long int value r1 讀取 ADC0804 數位資料 long int set n condition select long int r grade_reg[2] grade[15] error1 error2 long int a1 b1 I long int membership[5][3]membership1[3][3] 定義歸屬函數 long int membership2[3][3] = -10-50-5050510 long int error[2] int Rule[15][3] = 113213313 定義判斷規則庫 212223323 311232333 411241342 511251351

54

main() 主程式 j = PWM = 110 設定 PWM 初始值 IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x00 設定計時器 0 工作於模式 0 temp=8192-j4 設定計時器 0 初值 TH0 = temp 32 TL0 = temp 32 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 P3_4 = 1 P3_5 = 0 P3_6 = 0 ADCWR = 0 令 ADC0804 的 WR = 0 ADCWR = 1 令 ADC0804 的 WR = 1 while (1) KeyStatus() 檢查鍵值 void KeyStatus(void) 檢查鍵值並給對應的 PWM 值 char KeyScan(void) 按鍵掃描函數宣告 unsigned char KeyStatus unsigned char Key = 0 KeyStatus=KeyScan() 呼叫按鍵掃描函數 if (KeyStatus = 0) 已有按鍵輸入 Key = KeyStatus Key = 鍵值 if (Key == 0x01) 假如輸入為按鍵 1 i = 110 PWM 為 110us j = i P3_4 = 1 LED 亮第一顆〈表馬達停止〉 P3_5 = 0 P3_6 = 0

55

else if (Key == 0x02 ) 假如輸入為按鍵 2 i = 140 PWM 為 140us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x04 ) 假如輸入為按鍵 3 i = 180 PWM 為 180us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x08 ) 假如輸入為按鍵 4 i = 80 PWM 為 80us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 else if (Key == 0x10 ) 假如輸入為按鍵 5 i = 40 PWM 為 40us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 PWM = j delay1ms(10) 呼叫延遲函數 feedback() 模糊控制判斷

56

void To_int(void) interrupt 1 Timer0 中斷函數 if (P3_0 == 0) 假如 PWM 輸出為 Low P3_0 = 1 變更 PWM 輸出為 High temp=8192-j4 設定 High 的時間 else 若 PWM 輸出為 High P3_0 = 0 變更 PWM 輸出為 Low temp=8192-880+j4 設定 Low 的時間 TH0 = temp 32 Timer0 的計時時間 TL0 = temp 32 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 char KeyScan(void) 檢查鍵值 char KeyStatus 按鍵狀態 P0=0xff 設定 P0 為輸入模式 KeyStatus=~P0 讀取按鍵狀態 return(KeyStatus) 將鍵值送回程式 void feedback(void) 模糊判斷 void Fuzzycontroller() 函數原型宣告 void condition1() 函數原型宣告

57

void condition2() 函數原型宣告 error1 = ((value)40-160)03 輸入變數 1 delay10ms(10) 延遲 10ms error2 = ((value)40-160)03 輸入變數 2 if (key == 0x01 ) 當按鍵 1找出對應的歸屬函數 並做出模糊控制判斷

int membership[5][3]= -100-60-30-60-300-30030030603060100

int membership1[3][3]=-100-500-50050050100 Fuzzycontroller() condition() if (key == 0x02 ) 當按鍵 2找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

05010050100150100150200150200250200250300 int membership1[3][3]=07515075150225150225300 Fuzzycontroller() condition() else if (key == 0x04) 當按鍵 3找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

200320400300400500400500600500600700600700800 int membership1[3][3]=220370520370520670520670820 Fuzzycontroller() condition() else if (key == 0x08) 當按鍵 4找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

02550255010050100200100200300200300400 int membership1[3][3]=05010050100250100250400 Fuzzycontroller() condition()

58

else if (key == 0x10) 當按鍵 5找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

150250350250350450350450550450550650550650750 int membership1[3][3]=150300450300450600450600750 Fuzzycontroller() condition2() void Fuzzycontroller() 模糊控制判斷 void compute_grade() 函數原型宣告 void compute_grade1() 函數原型宣告 a1 = 0 b1 = 001 I = 0 for (n=0 nlt=14 n++) r = error1 set = Rule[n][0]-1 compute_grade() 計算輸入變數 1 與

模糊程度的歸屬函數 condition = 1 r = error2 set = Rule[n][1]-1 compute_grade1() 計算輸入變數 2 與 模糊程度的歸屬函數 grade[n] = MIN(grade_reg[0] grade_reg[1]) a1 = a1 + (grade[n]membership2[Rule[n][2]-1][1]) b1 = b1 + grade[n] I = a1 b1 得到模糊控制判斷的結果 void compute_grade() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership[set][0]) || (r gt membership[set][2])) 當輸入變數不在 歸屬函數內

59

grade_reg[condition] = 0 else if ((r gt membership[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership[set][2]-r) (membership[set][2] - membership[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership[set][0]) (membership[set][1] - membership[set][0]) void compute_grade1() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership1[set][0]) || (r gt membership1[set][2])) 當輸入變數不在 歸屬函數內 grade_reg[condition] = 0 else if ((r gt membership1[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership1[set][2]-r) (membership1[set][2]-membership1[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership1[set][0]) (membership1[set][1]-membership1[set][0])

60

void condition() P2_0 = 1 設定 P20 為輸入模式 P2_1 = 1 設定 P21 為輸入模式 if ( (P2_0 == 1) ampamp (P2_1 == 0)) 當馬達為正轉時 if ( I gt 0 ) 若模糊判斷結果為正 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 若模糊判斷結果為零 PWM = PWM + 0 PWM 寬度不變 if ( I lt 0 ) 若模糊控制結果小於零 PWM = PWM + 1 PWM 寬度加 1 else if ( (P2_0 == 0) ampamp (P2_1 == 1) ) 若馬達為反轉 if ( I lt 0 ) 模糊控制小於零 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 模糊控制等於零 PWM = PWM + 0 PWM 寬度不變 if ( I gt 0 ) 模糊控制大於零 PWM = PWM + 1 PWM 寬度加 1 CW() 判斷 PWM 寬度上下限

61

void CW() 判斷 PWM 寬度上下限 if ( PWM gt= 215 ) 若 PWM 寬度 gt= 最大寬度 j = 215 PWM 寬度維持於 215us if ( PWM lt= 5 ) 若 PWM 寬度 lt= 最小寬度 j = 5 PWM 寬度維持在 5us if ( PWM gt 5 ampamp PWM lt 215 ) PWM 寬度介於最大與最小間 j = PWM PWM 依模糊控制判斷結果增減 void delay1ms(int count) 延遲 1ms int x y for ( x = 0 x lt count x++ ) for ( y = 0 y lt 122 y++ ) void convert() 數位資料換算成馬達轉速 r1 = ((value)40)-160

62

附錄 C LCD 顯示之程式

includereg51h 含 8051 所有暫存器宣告 include mathh define RS P3_5 LCD 指令資料選擇控制 define RW P3_4 LCD 讀寫控制腳 define Enable P3_3 LCD 致能接腳 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P0_0 = 0x80 接腳定義 sbit P0_1 = 0x81 接腳定義 sbit P0_2 = 0x82 接腳定義 sbit P0_3 = 0x83 接腳定義 sbit P0_4 = 0x84 接腳定義 sbit P0_5 = 0x85 接腳定義 sbit P0_6 = 0x86 接腳定義 sbit ADCRD = P3^7 設定 RD 控制線接腳為 P37 sbit ADCWR = P3^6 設定 WR 控制線接腳為 P36 void delay(void) 函數原型宣告 void delay10ms(int count) 函數原型宣告 void display(void) 函數原型宣告 void InitialLCD(void) 函數原型宣告 void WriteIns(char) 函數原型宣告 void WriteData(char) 函數原型宣告 void WriteString(charchar) 函數原型宣告 void CheckBusy(void) 函數原型宣告 void convert(void) 函數原型宣告 char MSG0[] = Motor Speed = 定義字串 MSG0 char MSG2[] = rpm 定義字串 MSG2 unsigned char MSG1[8]=0000000 定義字串 MSG1 unsigned long int value 讀取 ADC0804 數位資料 int sample = 1000 取樣率設定消除顯示值跳動 long int rpm

63

main() 主程式 InitialLCD() 初始化 LCD IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x01 設定計時器 0 工作於模式 1 TH0 = (65536-5000)256 設定計時器 0 初值 TL0 = (65536-5000)256 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 while(1) 等待中斷 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 while (--sample == 0) 取樣率減 1 sample = 1000 重設取樣率 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 void T0_int(void) interrupt 1 LCD 顯示動態掃描 display() 動態掃描顯示 TH0 = (65536-65535)256 重設計時初值 TL0 = (65536-65535)256

64

void InitialLCD(void) 設定 LCD 模組初始狀態 delay() 延遲函數 WriteIns(0x38) 設定 LCD 模組為 WriteIns(0x38) 2 行顯示 WriteIns(0x38) 8 位元介面 WriteIns(0x38) 5x7 點字型 WriteIns(0x08) 關閉顯示器 WriteIns(0x01) 清除 LCD 螢幕 WriteIns(0x0c) 令顯示器 ON但游標不顯示 WriteIns(0x06) 令 LCD 模組每接收到 1Byte 資料 AC 值自動加 1 void display() 掃描顯示 WriteIns(0x80) 設定 LCD 座標 WriteString(13MSG0) 將字串 MSG0 寫入 LCD 中 WriteIns(0xc0) 設定 LCD 座標 WriteString(8MSG1) 將字串 MSG1 寫入 LCD 中 WriteIns(0xc8) 設定 LCD 座標 WriteString(4MSG2) 將字串 MSG2 寫入 LCD 中 void convert(void) 換算轉速 long int freq freq = ((value)4000) - 16000 數位資料換成頻率公式 rpm = freq3 頻率換算轉速公式 MSG1[0] = (rpm1000000)+0x30 將結果存入字串 MSG1 中 MSG1[1] = ((rpm1000000)100000)+0x30 MSG1[2] = ((rpm100000)10000)+0x30 MSG1[3] = ((rpm10000)1000)+0x30 MSG1[4] = 0x2e MSG1[5] = ((rpm1000)100)+0x30 MSG1[6] = ((rpm100)10)+0x30 MSG1[7] = rpm10+0x30

65

void WriteIns(char instruction) 寫命令至 LCD 中 RS = 0 選擇指令暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = instruction 輸出命令至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteData(char i) 寫資料至 LCD 中 RS = 1 選擇資料暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = i 輸出資料至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteString(countMSG) 寫字串至 LCD 中 char count 字串長度 char MSG[] 字串資料 char i 定義位元組變數 for(i=0 iltcount i++) count 個位元組 WriteData(MSG[i]) 寫入一位元組的資料至 LCD 中 void CheckBusy(void) char i=0x80 檢查忙碌旗標 while(iamp0x80) 忙錄旗標 BF = 1 RS = 0 選擇指令暫存器 RW = 1 讀取 Enable = 1 致能 LCD i = P2 讀取 LCD 指令暫存器內的資料

66

Enable = 0 除能 LCD delay() 延遲函數 void delay() 延遲 5ms int i for(i=0 ilt250 i++)

  • 畢業專題封面pdf
  • File0004pdf
  • 最終版pdfpdf
Page 8: Based on Fuzzy Control Theorem and TPWM Method for DC ... · 使吾人想設計一模糊控制器來做為馬達轉速的閉迴路控制,以解決非線性系統的 問題。除此之外,flcs

VII

圖 47 輸出之歸屬函數40 圖 48 推論後的三維空間圖41 圖 49 Fuzzy Controller 程式流程圖 42 圖 410 LCD 顯示幕之程式流程圖44 圖 A-1 硬體整體圖 50 圖 A-2 硬體整體鳥瞰圖 50 圖 A-3 硬體側視圖 51 圖 A-4 操作與顯示面板 51 圖 A-5 間距脈波電路與 FV 電路 51 圖 A-6 橋型驅動功率放大電路 52 圖 A-7 操作與控制面板 52

VIII

表目錄

表 31 頻率與轉換電壓之關係30 表 33 PWM 輸出對應 encoder 週期 34 表 41 模糊控制規則表41

1

第一章 緒論

11 前言

在現代的工程應用裡馬達扮演一個非常重要的角色它在機械設備中就好

像人的心臟一樣提供了機械運轉所需要的動力源以做為能量轉換或控制機能

的實行在眾多的馬達種類當中直流馬達不僅具有許多良好的特性例如高

啟動轉矩較易線性控制hellip等且其週邊控制元件充足控制理論發展成熟所

以被廣泛的應用在工業日常生活上馬達的速度控制被廣泛的應用在各種加工

機械航空機械農業機械交通工具等用途

直流電動機之轉速控制目前最常被使用的一種方法為脈波寬度調變〈PWM〉

驅動電路並結合傳統的 PID 控制器脈寬調變是一種以固定的頻率波寬可

調的輸出開閉供應的直流電壓使馬達感受到的平均電壓可以調整進而控制馬

達的轉速

我們日常生活中處處存在著非線性的現象但是我們較熟悉處理的卻是線

性的系統對於傳統 PID 控制器來說必須先知道受控系統〈plant〉的數學模

型否則無法導出其控制演算法則且其強健性與容錯性較低然而對於非線性

系統則不適合此法因此近年來對於非線性系統的研究工作已有許多學者嘗試

應用模糊理論〈Fuzzy Theory〉類神經網路〈Artificial Neural Networks〉基因

演算法〈Genetic Algorithms〉等非傳統方法且已有不錯之成效因此以模糊控

制理論之方法取代傳統的 PID 控制器來控制馬達轉速

對於一個非線性時變系統〈Nonlinear Time Variant System〉模糊控制理論

不但能簡化數學模型並且可以結合人類的操作經驗有效的達成控制目標模

糊控制能將操作者的專家經驗換成控制器設計人員的設計理念勢必擁有比一般

傳統的控制器更加的強健性與容錯性

2

12 研究動機

現今直流馬達的轉速控制多廣泛使用脈波寬度調變式〈Pulse Width

Modulation簡稱 PWM 驅動電路〉此種電路是以控制固定頻率的開閉供應直流

電壓以得到波寬可調的輸出使馬達的平均電壓可以調整進而轉移到馬達的

平均功率而達到轉速的控制但是由於 PWM 為一種單象限控制只運作於第一

象限這種系統本身無法產生負轉矩未加上逆向開關前亦無法反向因此無法

作用於第三象限系統加上動力制動後方可以有限度地產生逆向轉矩而運作於

第二象限〈見圖 11〉然而這也只是一種被動控制區間﹝1﹞

主動控制區動力制動

(被動運作)

Ⅱ Ⅰ

Ⅲ Ⅳ

ω

TCWCCW

圖 11 單象限控速系統運作於第一象限

本研究主要目的之一就是針對 PWM 之缺失提出了改良的方法於前級驅

動電路產生正反方向的兩個脈波信號再經驅動功率放大之後使馬達產生正

反轉向的兩拉力此即為雙脈波寬度調變式(Two Pulse Width Modulation簡稱

TPWM)本控制主要特色不論電動機正轉反轉速度快慢或停住均消

耗定額功率〈即馬達無時無刻都在運轉且輸出轉矩為額定值〉系統於寬廣的

速度變化範圍內仍具有良好的伺服性能馬達的旋轉扭力不會因速度及負載的

變化而受影響使伺服控制系統達到某一預定的特性範圍﹝2﹞

3

此外馬達的轉速會因其驅動機構的慣性影響不可能「說停就停」也

會因為摩擦力等影響不可能「說動就動」故對其操控指令一定會有延遲的

現象發生這些因素使馬達不是一個典型的線性系統故傳統的 PID 控制器就

不是最好的選擇再加上近年來模糊控制系統〈Fuzzy Logic Control System

FLCS〉的發展﹝3﹞使吾人想設計一模糊控制器來做為馬達轉速的閉迴路控

制以解決非線性系統的問題除此之外FLCS 在上升時間安定時間和超

越量上的要求也都優於傳統的 PID 控制器[4]

目前雖然有很多從事於馬達轉速控制的相關研究但是多採用脈波寬度調

變法且其尚有缺失待改良因此吾人想採用雙脈波寬度調變雖然有關此法

的研究並不多見但 TPWM 卻具有 PWM 所沒有的優點再加上近來發展愈

盛的模糊控制理論較傳統 PID 控制器的優點相信馬達轉速以 TPWM 驅動電

路之模糊控制是值得去加以研究和探討的

13 研究方法

本專題計畫其研究方法主要分為兩大類一為硬體結構電路設計另一為

Fuzzy 控制器之軟體製作硬體結構方面主要設計一比較放大器使其誤差值經

此電路與三角波比較而輸出 A 驅動信號脈波與 B 驅動信號脈波然後再由驅動

功率放大電路將信號脈波放大後控制馬達正逆轉此外為了確保功率放大電

路之安全性需在其之前加上一間距產生電路以防止其電路損毀

感測器方面則利用編碼器〈encoder〉感測出馬達的轉速然後再經由 FV

將其轉換為電壓此電壓再由 AD 轉換為數位信號送入單晶片 8051經由模

糊控制規則庫判斷並做出決策以達到馬達轉速的控制

4

14 研究目標

本專題研究目標如下

〈1〉 完成相關文獻資料之蒐集整理與討論

〈2〉 完成 AB 信號產生電路設計

〈3〉 完成間距脈波產生電路設計

〈4〉 完成驅動功率放大電路設計〈橋型驅動功率放大〉

〈5〉 完成 FV 電路設計

〈6〉 完成 AD 訊號轉換

〈7〉 編寫模糊控制法則與介面軟體設計

5

第二章 原理探討

21 模糊控制與理論

在傳統的控制領域裏控制系統動態模式的精確與否是影響控制優劣的最主

要關鍵系統動態的資訊越詳細則越能達到精確控制的目的然而對於複雜

的系統由於變數太多往往難以正確的描述系統的動態於是工程師便利用各

種方法來簡化系統動態以達成控制的目的但卻不盡理想換言之傳統的控

制理論對於明確系統有強而有力的控制能力但對於過於複雜或難以精確描述的

系統則顯得無能為力了因此便嘗試著以模糊數學來處理這些控制問題模糊

控制是屬於非線性式的控制在受控系統無法以線性數學模式精確描述的情況

下經由適當調整控制規則應具有比傳統控制方法更佳的控制性能

211 模糊理論概述

1965 年美國加州柏克萊分校的 LotfiAZadeh 教授首先在他主編的

「Information and Control」刊物上提出「Fuzzy Set」論文此為模糊邏輯理論的

創始模糊理論在經過了三十幾年的演化改進後無論是在應用或理論架構上

皆已日趨完備尤其近年來因人工智慧的迅速發展模糊理論儼然成為人工智慧

不可或缺的理論根基

Zadeh 教授曾提出一個互克性原理﹝5﹞「當系統的複雜性增長時對系統

特性做精確且有意義描述的能力亦相對降低最後精確性與有意義性將變成完全

互相排斥的特性」很高的複雜性意味著只能在一個刻意壓縮的低維因素空間觀

察而無法對問題的全部因素都進行考察使得原本是明確的概念變的模糊

Fuzzy 理論正是為了掌握這類具模糊特質的事物而發展出來的所以它的應用較

偏重於人類的經驗及對問題特性的掌握程度不主張用繁雜的數學分析及數學模

式來解決問題

Fuzzy 理論把傳統數學從二值邏輯〈binary logic〉擴展到連續多值〈continuous

6

multi-value〉利用歸屬函數〈membership function〉描述一個概念的程度亦及

使用 0 和 1 之間的數值來表示一個元素屬於某一概念的程度這個值稱為元素對

集合的歸屬度〈membership grade〉當歸屬度為 1 時表示該元素百分之百屬於

這個概念當歸屬度為 0 時則表示該元素完全不屬於這個概念介於兩者之間

的就是完全屬於和完全不屬於之間的灰色地帶

模糊理論的工程應用大約始於 1974 年倫敦大學的 EHMamdani 教授他根

據 Zadeh 提出的語言分析法〈linguistic approach〉及模糊推論〈fuzzy inference〉

運用 IF-THEN 形式的法則來敘述操作員的控制策略成功地應用在蒸汽機自動

運轉上﹝6﹞從此模糊理論的應用便迅速發展以在控制方面的研究成果最為

顯著模糊理論其實是一門相當生活化的學問由於使用語言變量描述因此更

具親和力與一般性人類日常生活所遇所用的一些敘述即大都是模糊的例如

那個人ldquo很高車開的ldquo很快等等其中ldquo很高ldquo很快並不是一個

明確值而只是描述事件的程度但是根據這些描述人類卻能很輕易的接收

212 模糊集合

模糊集合〈fuzzy set〉可視為傳統集合的擴張在模糊集合的世界中稱傳

統集合為明確集合〈crisp set〉所謂模糊集合是指用來表示界限或邊界不分明的

模糊概念的集合許多日常生活中的概念常常都不是清晰明確的這些可說是模

糊概念例如很高很快等這類概念無法用傳統的二值集合論即 0 或 1 表示

而Zadeh教授提出的Fuzzy集合論可以將這些概念由傳統集合論的特徵函數從非

0 即 1 的二值選擇推廣為從 0 到 1 之間的任何值做選擇得到新型的特徵函數

稱為歸屬函數

模糊集合由歸屬函數表示相對於明確集合的特徵函數其值只有 0 或 1 兩個

值即其值為在實軸閉區間[01]之中的任一實數模糊集合可以彌補明確集

合描述時所產生的不合理現象因此模糊集合比傳統的明確集合更具客觀性

7

213 歸屬函數

歸屬函數〈membership function〉為 0 到 1 之間的數值吾們可以藉由歸屬

函數來描述 Fuzzy 集合的特質它是 Fuzzy 理論的最基本觀念透過歸屬函數我

們才能對 Fuzzy 集合進行量化也才可能利用精確的數學方法分析處理模糊性資

歸屬函數在 Fuzzy 控制的應用範疇內都要具備凸〈convex〉及正規〈normal〉

等基本特性〈如圖 21〉歸屬度函數的定義可以分為數值及函數兩種數值定義

方式又稱為離散化歸屬函數它是直接給定有限 Fuzzy 集合內每個元素的歸屬

度並以向量的形式表現出來函數定義方式又稱為連續化歸屬函數它是以不

同形式的函數來描述 Fuzzy 集合

圖 211 正規且凸模糊集合

1

0 圖 212 正規非凸的模糊集合

8

一個模糊集合的歸屬函數可以有許多方式但是目前最廣泛使用的有吊鐘

型三角型梯型等歸屬函數

〈1〉吊鐘形歸屬函數

吊鐘形歸屬函數定義如下

μA=bell(xabc)= b

acx 2

1

1minus

+

〈21〉

圖 22 吊鐘型歸屬函數

〈2〉三角形歸屬函數

三角形歸屬函數可由三個參數(abc)來加以決定

=Aμ trangle(xabc)

⎪⎪⎪

⎪⎪⎪

ltleminusminus

ltleminusminus

=

other

cxbcbcx

bxaabax

0

〈22〉

其中a為歸屬函數左邊界b為歸屬函數中心值c為歸屬函數右邊界

9

圖 23 三角型歸屬函數

〈3〉梯型歸屬函數

梯型歸屬函數可由四個參數加以決定

=Aμ trapezoid(xabcd)

⎪⎪⎪⎪

⎪⎪⎪⎪

leleminusminus

ltle

ltleminusminus

=

other

dxcdcdx

cxb

bxaabax

0

1 〈23〉

圖 24 梯型歸屬函數

10

214 模糊推論與模糊規則

模糊推論〈fuzzy inference〉是根據知識庫保存的規則(rule)和給予的事實

推導出新的結論與傳統推論不同的地方是Fuzzy推論不只可以處理明確命題也

可以處理Fuzzy命題Fuzzy推論是依據近似推理〈approximate reasoning〉的概念

發展出來的比傳統推論的嚴正推理〈exact reasoning〉更合理也更具彈性近

似推理是兩種嚴正推理General Modus Ponens〈簡稱GMP〉及Genera Modus

Tollens〈簡稱GMT〉的一般化此原理是從傳統二值邏輯中的肯定律〈modus

ponens〉和否定律〈modus tollens〉推廣而來其中GMP又可稱為前向推理而

GMT則可稱為反向推理

〈1〉 GMP〈General Modus Ponens〉

規則IF x is A THEN y is B

事實x is Arsquo

結論y ix Brsquo 〈24〉

〈2〉 GMT〈General Modus Tollens〉

規則IF x is A THEN y is B

事實y is Brsquo

結論x is Arsquo 〈25〉

上式中IF x is A THEN y is B即為模糊規則〈fuzzy rules〉AArsquoBBrsquo

分別是定義在論域X及Y的模糊集合xy代表輸入變數及輸出變數的語言變數

一般來說「x is A」稱為前件部〈antecedent〉而「Y is B」則稱為後件部

〈consequence〉Fuzzy知識庫〈Fuzzy Knowledge Base簡稱FKB〉即由這些模

糊規則所組成的規則庫〈rule base〉和存放描述領域知識的Fuzzy變數及語言變數

的資料庫〈data base〉所組成所以FKB是用來描述受控對象所涉及的領域知

11

識和操控目標的一些定性及定量的資訊模糊知識庫和模糊推論是構成Fuzzy規

則系統核心的兩個重要部門﹝7﹞

模糊推論是模糊系統的核心根據知識庫的模糊法則進行模糊理論的合成運

算來模擬人類的思考決策模式一般來說規則的建立是採取十分主觀直覺的

方式依據相關領域專家的經驗與知識透過詢問進而將其知識經驗歸納條列出

重點再轉換成模糊規則的形式表現出來但是並非所有的專家或操作員都能

將自身的經驗知識以言詞的方式充分的表達出來且未必能整理成條列的模糊規

則所以知識規則的萃取工作往往是在建構模糊系統時最常遭遇到的困難之

215 模糊控制器

模糊控制是智慧型控制〈intelligent control〉系統的一種典型其基本特點

是不完全依賴受控對象的數學模型主要是利用人的操作經驗知識和推理技

術以及控制系統的某些訊息和性能得出對應的控制動作模糊控制是以並行

〈parallel〉方式處理規則的推理工作〈如圖25〉其近似推理會包容每個對操

控系統有貢獻的規則即使某些貢獻程度很小的規則也不會忽略

圖 25 模糊控制系統的構造

12

一個控制器的輸入通常是確定數值而非模糊輸出也是如此才能對被控對象

發生作用但是模糊邏輯控制器〈Fuzzy Logic Controller簡稱FLC〉則是以語

言化的控制規則為主體為了能夠把輸入的確定值與語言化之後的控制規則結

合必須把輸入的確定值模糊化〈fuzzification〉以便對應到FLC語言變數的論

域範圍中同樣的經過規則庫推理出來的結果是對應到輸出語言變數的論域

中所以也必須對其做解模糊化〈defuzzification〉的工作才能達成實際的控制

目標

一般模糊控制器的架構包含了五個主要部分定義變數模糊化知識庫

模糊推論及解模糊化

〈1〉 定義輸入及輸出變數

決定程序被觀察的狀況及考慮控制的動作輸入變數可以是擷取

自受控系統的觀測量也可以是推導出來的資料輸出變數則為操控

受控系統的操作量例如在一般控制問題上輸入變數通常為輸出

誤差e與輸出誤差之變化率e而控制變數則為下一個狀態之輸入

u其中eeu統稱為模糊變數

〈2〉 模糊化

將量測值轉換為語言變數的過程將外界所輸入的確定數值經由

一比例映射傳送到輸入變數所對應的模糊論域然後再利用模糊化

函數將此輸入資料轉換成適當的口語值以供模糊運算使用此口語

化變數稱之為模糊子集合

〈3〉 知識庫

模糊知識庫是模糊控制的依據由它來定義所有使用到的語言控

制法則及相關各項參數知識庫可說是整個控制系統資料核心其包

含了兩個部分資料庫〈data base〉與規則庫〈rules base〉

1 資料庫

提供處理模糊數據之相關定義資料庫所存放的資料是關

13

於如何將明確的資料轉換成模糊數值而資料的存放方式是以

歸屬函數表示該選用哪一種歸屬函數依實際的需要選定

以三角形歸屬函數最常被使用因其運算最為容易且又能充分

的表達模糊概念

2 規則庫

利用語言化的條件式控制規則描述控制目標和策略通常

控制規則可以由操控人員的經驗或專家的知識推導出來多個

控制規則所組成的集合就是規則庫

〈4〉 模糊推論

模糊推論為模糊控制最重要的核心其最主要的工作就是做實際

的決策過程處理模糊推論具有模擬人類做決策判斷的能力其基本

理論就是根據人類特有的近似推理方式如之前已說明的GMP和

GMTGMP為前向推理而GMT為逆向推理因為模糊推論為前向

運算因此GMP非常適合使用為模糊控制的推論機構

〈5〉 解模糊化

將推論完成所得到的模糊輸出量轉換成實際的明確數值以便和

外界溝通解模糊化的方法有很多例最大歸屬度法重心法高

度法面積法等

圖 26 模糊系統的基本架構

14

22 直流馬達數學模型

圖27為直流馬達等效電路簡圖其中

iV = 輸入電壓 ai = 電樞電流

zR = 電樞電阻 gT = 轉矩

aL = 電樞電感 bE = 反電動勢

φ = 空氣隙磁通量 ω = 轉子角速度

B = 黏滯摩擦係數 J = 轉動慣量

圖 27 直流馬達等效電路簡圖

由克希荷夫電壓定律知

( ) ( ) ( )tEdt

tdiLtiRV b

aaaai ++= 〈26〉

由於反電動勢 bE 與轉軸的角速度 ( )tω 及空氣隙磁通量φ之乘積成正比即

( ) ( ) ( )tKtKtE emb ωφω == 〈27〉

15

又轉矩的平衡方程式為

( ) ( ) ( )dt

tdJtBtTgωω += 〈28〉

且馬達轉矩 gT 與電樞電流 ( )tia 及空氣隙磁通量φ乘積成正比即

( ) ( ) ( )tiKtiKtT ataag == φ 〈29〉

取〈26〉~〈29〉式之拉氏變換得

( ) ( ) ( ) ( )sEssILsIRsV baaaai ++= 〈210〉

( ) ( )sKsE eb Ω= 〈211〉

( ) ( ) ( )sJssBsTg Ω+Ω= 〈212〉

( ) ( )sIKsT atg = 〈213〉

則馬達輸入電流與轉速為

( ) ( ) ( )( ) ( )( )

sR

sEsV

sLRsEsV

sIe

a

bi

aa

bia τ+

minus

=+minus

=1

〈214〉

( ) ( ) ( )

sB

sT

sJBsT

sm

gg

τ+=

+=Ω

1 〈215〉

其中a

ae R

L=τ 為電樞電流的電氣時間常數 BJ

m =τ 為馬達轉動的機械時間

常數

直流馬達轉速對輸入電壓的轉移函數 ( )sG 為

( ) ( )( ) ( )( ) etaa

t

i KKBJsRsLK

sVssG

+++=

Ω=

( )( ) etmea

t

KKssBRK

+++=

ττ 11 〈216〉

16

在一般情況電樞電感很小所以 eτ 可以忽略不計因此上式成為一階落後

方程式

( ) ( )( ) ( ) m

m

etma

t

i sTK

KKsBRK

sVssG

+=

++=

Ω=

11 τ 〈217〉

其中

eta

mam KKBR

BRT

+=

τ

eta

tm KKBR

KK

+=

所以直流馬達數學模式可以以圖28表之﹝8﹞

圖 28 直流馬達數學模式方塊圖

17

第三章 系統功能分析與製作規劃

31 專題製作流程

如圖 31 所示本專題主要分為兩條路徑進行一為硬體另一則為軟體程

式撰寫本章著重硬體的規劃設計軟體則在第四章中介紹在完成 AB 信號

產生電路驅動功率放大電路與間距脈波產生電路設計與製作後須先接上馬達

做一連串的測試〈此時系統並無回受控制〉測試間距脈波是否太長或太短硬

體電路是否有缺失hellip等等另一方面也著手撰寫模糊控制程式並將其與硬體電

路結合最後做閉迴路系統的整合測試若發現系統的運作結果並不如預期

則需分別從硬體與軟體兩方面去改良

直流馬達轉速之模糊控制

文獻蒐集與整理

AB信號產生電路設計與製作

驅動功率放大電路設計與製作

間距脈波產生電路設計與製作

測試間距脈波是否太長或太短

系統測試測試馬達轉速是否

達到控制目的

結束與論文寫作

重新設計間距脈波長度

Yes

No

系統整合與修正

輸出信號與Fuzzy控制器之連結設計

規劃輸出與輸入歸屬函數

規劃模糊知識庫

撰寫主程式並加入模糊知識庫

程式編譯及連結

軟硬體整合測試馬達是否運作

程式調整及最佳化

No

YesYes

No

圖 31 專題製作流程圖

18

32 雙脈寬調變法之直流馬達驅動電路設計

本專題製作的雙脈寬調變法之直流馬達驅動電路設計大致可以分為二大部

分第一雙脈寬調變法之電路設計第二橋型驅動功率放大電路

雙脈寬調變〈Two Pulse Width Modulation簡稱TPWM〉之電路設計主要

是先製作一脈寬調變〈Pulse Width Modulation簡稱PWM〉波形然後再將此

波形各別經由一緩衝器〈buffer〉和反向器〈inverter〉則可產生AB驅動信號

脈波此即為TPWM

321 脈寬調變電路

如圖32先利用兩顆op產生三角波電路再利用一個比較器比較三角波

和誤差值之大小

150k

1M

20k

+12V

-12V

+12V

-12V10k

+12V

-12V

10k

+12V

-12V-

+-

+

-

+ PWMLM324

LM324

LM324

2200pF

圖 32 脈寬調變電路

〈1〉 三角波產生電路

三角波產生電路通常至少需要兩個運算放大器其電路如圖33OP1

為一個反相積分器OP2為一個史密特磁滯比較器將OP2的輸出方波經

19

OP1反相積分以後得到Vo1三角波此三角波又同時加到OP2控制其狀

態的改變

當方波產生器的輸出是正的則三角波產生器的輸出是斜向負相似

地當方波產生器的輸出是負則三角波產生器的輸出是斜向正這個動

作將產生三角波的輸出同時也輸出方波﹝9﹞

+VCC

-VCC

-

+

R1

R2

R3

+VCC

-VCC

-

+

OP1

OP2

Vo2Vo1

圖 33 三角波產生電路

對OP2而言是磁滯比較必須先找到OP2的 THV 和 TLV

232

21

32

3oo v

RRR

vRR

Rv

++

+=+ 〈31〉

當 0=+v 時

23

21 oo v

RR

v minus= 〈32〉

表要達到OP2的 0=+v 必須有這麼大的 1ov

當 12 sato Ev = 時

TLsato VERR

v =minus= 13

21 〈33〉

當 22 sato Ev minus= 時

THsato VERR

v =+= 23

21 〈34〉

20

對OP1而言是反相積分器 2ov 為其輸入 1ov 為其輸出則

tCIt

Rv

Ct

CRv

dtvCR

v oooo

11

2

11

22

111

11minus=minus=minus=minus= int 〈35〉

因為

1

2

Rvv

I o minusminus= 0=minusv 〈因為虛接地〉 〈36〉

所以

1

2

Rv

I o= 〈37〉

又因運算放大器的輸入阻抗非常大則流經 1C 的電流也為 I 相當於以定

電流對電容C 充電

當 12 sato Ev = 時 1ov 為下降斜波

tR

EC

v sato

1

1

11

1minus= 〈38〉

當 22 sato Ev minus= 時 1ov 上升斜波

( )

tRE

Cv sat

o1

2

11

1 minusminus= 〈39〉

由此可知三角波的上升與下降斜波乃因 1C 的充電與放電且時間

常數為 11CR

三角波週期分析如下

1 上升斜波的時間 1T

tCR

vv o

o1

1

21 minus= 11

2

1 CRvv

to

ominus=

1Tt = TLTHo VVv minus=1 22 sato Ev =

11111

21

sat

TLTH

sat

TLTH

EVV

CRCRE

VVT

minus=

minusminus= 〈310〉

2 下降斜波的時間 2T

tCR

vv o

o1

1

21 minus= 11

2

1 CRvv

to

ominus=

21

2Tt = THTLo VVv minus=1 12 sato Ev =

1

11111

1sat

TLTH

sat

THTL

EVV

CRCRE

VVT

minus=

minusminus= 〈311〉

3 週期 21 TTT +=

若 1satE = 2satE = satE 且3

22RR

VV TLTH =minus satE

3

2114

RR

CRT=

若R3 = nR2

則nCR

T 114=

114 CR

nf = 〈312〉

《實驗結果》

必須注意的是三角波的頻率太低將導致馬達的轉動產生脈動現象

故將工作頻率設計在1kHz以上

Ω= k1501R Ω= k102R

Ω= k203R pFC 22001 =

所得到的三角波頻率為

15kHz10220010001504

00010100020

f 12- =timestimestimestimes

timestimes

=

圖 34 三角波輸出波形

22

〈2〉 脈寬調變電路〈PWM〉

+12V

-12V

10k

+12V

-12V -

+ PWM輸出LM324三角波輸入

圖 35 脈寬調變電路

PWM系統往往連接至直流電源供應放大器的工作是以固定的頻率開

閉直流供應電壓其激發角是可以調整的因此得到波寬可調的輸出

將固定頻率的三角波與反向輸入的電壓做比較便可輸出一脈寬〈見圖

36〉反向電阻值的不同將導致反向輸入電壓不同故其輸出為一可調但

頻率固定的脈寬也正因為如此故稱為脈寬調變〈PWM〉由於輸出的

dutycycle不同故馬達將接收到不同的平均電壓因而可以藉由PWM控制

馬達的轉速

反相輸入電壓

PWM

圖 36 三角波與反相輸入電壓比較

23

PWM的優點在於馬達驅動電路的電晶體之控制信號改以脈波列來控

制使電晶體操作成類似開關的動作不是完全導通就是完全截止故電晶

體不是一直操作於作用區所以其功率消耗不大整體效率較高

《實驗結果》

圖 37 PWM 輸出波形

322 橋型驅動功率放大電路

如圖38所示主要由四個功率電晶體組成利用不同的電晶體對使直流

馬達做正逆轉控制當Q5Q8導通使馬達正轉當Q6Q7導通馬達則逆

轉電路中的電晶體扮演開關的作用

此種電路簡單只要一組直流電源供應且電晶體分擔了部份的電壓保護

電晶體迅速工作於截止與飽和狀態之間故沒有功率散逸損失之虞

但是在設計時切勿使Q5Q6同時導通以免燒毀電路上之元件因為在

AB兩脈波短暫的交變時間內由於電晶體本身之最小延遲時間有可能使Q5

Q6同時ON與Q7Q8在很短時間同時ON因此在15kHz交變下容易燒毀功

率電晶體

因此設計一間距脈波電路主要之功用使Q5Q6和Q7Q8均不同時導通

24

以拉長AB兩者交換時間

M

20k

10k

20k

10k

+24V

A 信號 B 信號

2N3055 2N3055

2N2955 2N2955

1N40021N4002

C1815 C1815

C1815 C1815

Q5

Q8Q6

Q7

圖 38 橋型驅動功率放大電路

圖 39 橋型驅動功率放大電路實體圖

25

此外若考慮電晶體BE間的電壓則電路會出現約 plusmn 06V的不感帶〈ded

band〉即電晶體的 oV 對 inV 間的關係如圖3101假使 inV 電壓為正弦波則 oV 變

成如圖3102為了改善這種缺失吾人利用兩個二極體接在電路上如圖38

用來補償電晶體BE間的壓降﹝10﹞

約06V

Dead band

Vo

Vin

圖 3101 呈現不感帶的轉移函數

圖 3102 輸出電壓波形

26

323 間距脈波產生電路

RCext15

Cext14 74123

A3

B2

Q13

CLR1

Q4

7486100k

2200pF

10k

10000pF

+5V

間距脈波輸出

圖 311 間距脈波產生電路

間距脈波的產生方式是根據脈寬調變〈PWM〉後的訊號再經由積分電路的

電阻兩端取出且經由兩倍頻器〈74LS86〉檢示出PWM的正負緣脈波最後

再利用單穩態IC〈74LS123〉將檢出信號之脈寬拉長至01ms此即為間距脈波

74LS123有兩個輸入端子A及B分別為下降波緣輸入端子及上升波緣輸入端

子當輸入A之脈波由ldquoH變成ldquoL之瞬間Q輸出變為ldquoH其持續時間長

短由RC時間常數決定反之當輸入B之脈波由ldquoL變成ldquoH之瞬間Q輸出

變成ldquoH維持一定時間

74LS123的輸出脈波之寬度是由電阻及電容之時間常數所決定概略計算公

式如下

CR045T timestimes=

電容 C 必須大於 1000pF

27

《實驗結果》

R=24kΩ C=10000pF

所以得到間距脈波為

( )msec0110810000p24k045T cong=timestimes= μ

圖 312 間距脈波

研究經分析後發現

1 間距 T 愈大愈能確保電路之安全性愈有保護作用

2 間距 T 愈大相對的使驅動信號脈波減少愈多造成馬達旋轉扭力大

大減弱

3 適當的間距 T不但不會影響馬達的輸出轉矩而且兼具保護電路的

效果

33 編碼器

轉動編碼器不只可以作為轉速的感測也能做位置的感測又適合於數位處

理故被廣泛使用若就信號來看轉動編碼器可分為增量型與絕對型若以檢

測的方式來分可分為光學式和磁式兩種在本專題中所使用的編碼器為光學式

增量型編碼器﹝11﹞

光學式轉動編碼器的原理如圖 313在附有細縫轉盤的兩側分別裝置發光元

28

件與受光元件如果只有一組光電檢測元件則輸出信號就只有一相的脈波信

號此種裝置稱為脈波產生器圖 314 為增量型轉碼器的輸出信號它是利用

兩組光電元件所產生的脈波信號A 相和 B 相間有相位差正轉時 A 相領前 B

相逆轉時 B 相領前 A 相因此利用此兩相做檢測馬達為正轉或逆轉的工作

並利用 A 相或 B 相的頻率檢測出目前的轉速

吾人計算出編碼器每一轉可以產生約 200 個脈波故檢測 A 相或 B 相其頻

率為 N則轉速應為 60200

timesN

〈rpm〉

圖 313 光學式轉動編碼器的原理圖

圖 314 編碼器的輸出信號波形

29

34 LM2917 FV 電路設計

對 LM2907 而言磁滯比較器和電流汞是構成頻率對電壓轉換的基本架構

並且預留一個運算放大器及一個電晶體供各種不同的使用圖 315 為吾人所設

計的 FV 電路圖中 C1 用以抑制電流汞動作時所產生的漣波變化正常使用時

此電容應大於 10C若 C1 太大也將造成轉換速度下降

因為單晶片 8051 之輸入電壓最高為 5V故必須設計其馬達最高轉速頻率所

轉成的電壓必須在 5V 以內由於馬達轉速頻率範圍極大故吾人給予 LM2917

+12V 的電壓以擴大它可以轉換的電壓範圍並將所需維持在 5V 內

a1

14

b1

1

a1

13

b1

2

a1

12

b1

3

a1

11

b1

4

1

a1

10

b1

5

a1

8

b1

7

a1

9

b1

6

L2917

Encoder輸 入

1uF

+12V

FV輸出1000pF

45k 10kC1

C2

圖 315 FV 電路

30

《實驗結果》

根據統計結果每 50mV 相對於 100Hz如此一來吾人想得知馬達目前

的轉速只要將單晶片所接收到的電壓值經過換算即可得知目前 encoder 所量測

的頻率吾人知道 encoder 一圈可產生 200 個脈波故馬達的轉速便可經過下列

公式換算得知

轉速〈rpm〉 60200

times=f

其中 =f encoder 所量測到的頻率

表 31 頻率與轉換電壓之關係

頻率

(Hz) 1 2 3 4 5 6 7 8 9

電壓(V) 0006 0006 0007 0008 0009 0009 0009 0009 001

頻率

(Hz) 10 20 30 40 50 60 70 80 90

電壓(V) 008 009 010 010 011 011 012 012 013

頻率

(Hz) 100 200 300 400 500 600 700 800 900

電壓(V) 013 018 023 028 033 038 043 049 054

頻率

(Hz) 1000 2000 3000 4000 5000 6000 7000 8000 9000

電壓(V) 059 109 16 209 257 304 3508 4006 45

31

圖 316 頻率對電壓曲線

35 單晶片介面電路

單晶片介面包括了二大部分分別為單晶片 8051AD converter

〈1〉8051 單晶片

為本控制系統的核心一切動作皆經由它控制

〈2〉AD converter

將類比開關所送出來的類比訊號經由 ADC 0804 轉換成數位訊號傳送

到單晶片的輸入埠

351 AD 轉換

以單晶片 8051 控制 ADC0804則單晶片 8051 必須下達ldquo開始轉換rdquo的命令

給 ADC0804然後 ADC0804 就開始讀入類比輸入端的電壓在內部開始轉換

經過一段轉換時間後〈約 100μ s〉ADC0804 就將轉換完成的值放在其內部的三

態輸出栓鎖緩衝器裡然後將轉換完成輸出腳〈INTR〉降為 low以通知單晶片

可以去讀轉換完成資料

當WR和CS 同時為ldquo0rdquo時表示對 ADC0804 下達ldquo開始轉換rdquo命令再經過

32

一段轉換時間〈100μ s〉後轉換完成ADC0804 會將其轉換完成的數位資料放

在其內部 8 位元緩衝區裡且將 INTR 降為ldquo0rdquo因此單晶片只要下達ldquo開始轉換rdquo

命令後去檢查 INTR 的狀態就可以知道是否轉換完畢其方法有兩種

1 輪詢法〈polling〉

2 中斷法〈interrupt〉

所謂輪詢法就是將 ADC0804 的 INTR接到 CPU 的一條 IO 線上然後以軟體指

令主動偵測其狀態當偵測到為ldquo0rdquo時就可以去讀出 ADC0804 裡的緩衝區的轉

換值

中斷法是一個很理想的 IO 方式因為不像輪詢法必須讓 CPU 等 ADC0804

轉換當 CPU 下達ldquo開始轉換rdquo命令後就可以做其他工作當 ADC0804 轉換完

畢後 INTR會降為ldquo0rdquo可以利用此信號去中斷 CPU再由中斷副程式去讀入

轉換值即可因此大大提高了程式的效率

當 CPU 接收到 ADC0804 發出ldquo轉換完畢rdquo的信號〈 INTR =0〉後就可以去

讀出轉換值其讀出的方法是將CS 與RD設為ldquo0rdquo即可讀到轉換值這個讀值的

動作又會使得 INTR恢復成ldquo1rdquo

1 CPU 下達ldquo開始轉換rdquo命令〈CS =0WR =0〉

2 ADC0804ldquo轉換完畢rdquo 〈 INTR =0〉

3 CPU 讀取轉換值〈 RD =0CS =0〉

4 讀完後 INTR =1

ADC0804 主要規格摘要如下

1 +5V 單電源工作電壓

2 類比電壓輸入範圍 0~+5V

33

3 參考電壓為 25V

4 轉換時間為 100μ s〈 CLKf =640kHz〉

5 解析度為 8 位元

6 誤差plusmn 1LSB

7 讀取時間 135ns

36 電源供應系統

本專題中所有電路及硬體設備所需的電源採用交流電源 110V 經由 PT-31

變壓器後再經過橋式整流後提供了直流電源而因為各個電路所需電源不同

因此製作了多組的變壓電路如下

1電壓源 DC5V選擇了 7805 的穩壓 IC 搭配電容得到了+5V 的電壓源

供〈1〉8051 微處理器 〈2〉ADC 0804 〈3〉74LS8674LS12374LS04

74LS02CD4013 〈4〉馬達 Encoder

2電壓源 DC12V使用 7812 穩壓 IC 搭配電容得到+12V 的電壓源供

LM2917 使用

3電壓源 DC24V利用 7824 的穩壓 IC 搭配電容獲得+24V 的直流電壓

源供電路之橋型驅動功率放大之電晶體使用

Vin1

+12V2

GND3

LM7812

2200uF 10000pF 2200uF 10000pF

+12V outputAC

圖 317 直流電源電路

34

圖 318 直流電源電路實體圖

37 馬達轉速的量測

表 33 PWM 輸出對應 encoder 週期

PWM dutycycle encoder 週期 PWM dutycycle encoder 週期

40 sμ 172 sμ 440 sμ 0 sμ

80 sμ 188 sμ 480 sμ 0 sμ

120 sμ 204 sμ 520 sμ 0 sμ

160 sμ 230 sμ 560 sμ 0 sμ

200 sμ 272 sμ 600 sμ 0 sμ

240 sμ 328 sμ 640 sμ 0 sμ

280 sμ 416 sμ 680 sμ 1320 sμ

320 sμ 540 sμ 720 sμ 750 sμ

360 sμ 800 sμ 760 sμ 510 sμ

400 sμ 1320 sμ 800 sμ 400 sμ

35

圖 319 PWM 輸出對應 encoder 週期

由統計可知道此馬達並不是一顆線性馬達故相信若使用模糊控制理論來

作為其回授控制系統的控制器一定能達到比傳統控制器的性能還要好而且若能

在模糊控制裡加上 PID 控制器的觀念一定能在系統的響應時間上升時間

安定時間和超越量達到最佳的控制另一方面馬達在其反方向的內阻較大需

要更大的力量才能使馬達驅動

36

第四章 軟體規劃與製作

41 PWM 之軟體設計

因為之前所介紹的硬體方式是以調整可變電阻來達到轉速的調整因此無法

得知所給予的脈寬長度和轉速大小尤其在回授時也不易給予適當的訊號來調整

轉速因此改良之方法就是以8051之軟體撰寫方式來產生固定的脈寬也就等

於給予轉速的命令而在其回授控制時也只要在內部程式给予適當的指令便可

達到脈寬長度的調整以達到閉迴路之受控系統

411 PWM 軟體流程

設定Timer0模式為0

TH0 = temp 32 TL0 = temp 32

temp = 8192 ndash j4 Key = 0

檢查是否有鍵值

將鍵值存入Key

Yes

No

設定Key值所對應的 j值

If P30 == 1Then P30 = 0 temp = 8192 ndash j4Else P30 = 1 temp=8192ndash880+j4

TH0 = temp 32 TL0 = temp 32

Start Timer0中斷副程式

啟動Timer0

等待Timer0中斷

返回主程式

圖 41 PWM 軟體設計流程圖

37

在此總共設計了五個按鈕分別代表不同的轉速停止正轉〈慢〉正轉

〈快〉逆轉〈慢〉和逆轉〈快〉使用Timer0是因為8051之計時中斷比延遲程

式來的準確故可以達到準確的計時程式設計理念中並沒有將中斷致能清除

因此Timer0會一直處於計時的狀態程式執行時將一邊檢查鍵值〈KeyStatus〉一

邊進行計時當計時完畢便呼叫中斷副程式然後執行改變Port 30的輸出狀

態若是為high則變為low反之若是為low即變為high同時並重設計時時間

Timer0繼續計時

當鍵值改變時計時的時間也會跟著改變如此一來Timer0將ㄧ直重覆上

述動作直到電源切掉Timer0才會停止計時

42 模糊控制之程式規劃與撰寫

本專題目標在完成了先前所規劃的硬體電路之後接著就是要達成利用模糊

控制理論來設計控制器在此採用了單晶片8051目的是為了以硬體實現方式來

代替電腦模擬期望能夠按照原訂計畫完成本專題「具模糊控制理論與雙脈寬調

變法之直流馬達驅動電路設計」

單晶片 8051 模糊控制的程式撰寫採下列幾個步驟依序完成

1 設定變數轉速誤差〈dspeed〉目前轉速〈sspeed〉

2 模糊化採用三角形歸屬函數採用三角形歸屬函數的原因

〈1〉 三角形函數為一連續函數

〈2〉 三角形函數為線性的函數所以計算速度較快

〈3〉 是具有發散也有收斂的函數和指數函數一樣接近

事實

3 模糊推論模糊規則將其所有可能發生情況以 IFhellipTHENhellip表示

並建立控制規則表

4 解模糊化採用重心法

38

421 歸屬函數

設定變數為目前轉速〈sspeed〉與轉速誤差〈dspeed〉因此此模糊控制器共

有兩個輸入訊號與一輸出訊號輸出訊號為脈寬長度該加或是減多少又因為有

五種不同的轉速因此各分別設計了不同的歸屬函數如下

1 當轉速 = 0

ml h

s s p e e d

d s p e e d

r p m0 5 0 1 0 0- 5 0- 1 0 0

mv l l h v h

r p m0- 3 0- 6 0- 1 0 0 3 0 6 0 1 0 0 圖 42 停止時之歸屬函數

2 正轉〈慢〉

ml hsspeed

dspeed

rpm150 225 300750

mvl l h vh

rpm150100500 200 250 300

圖 43 正轉〈慢〉之歸屬函數

39

3 正轉〈快〉

ml hsspeed

dspeed

rpm520 670 820370220

mvl l h vh

rpm500400300200 600 700 800

圖 44 正轉〈快〉之歸屬函數

4 逆轉〈慢〉

ml hsspeed

dspeed

rpm100 250 400500

mvl l h vh

rpm10050250 200 300 400 圖 45 逆轉〈慢〉之歸屬函數

40

5 逆轉〈快〉

ml hsspeed

dspeed

rpm300 450 600150

mvl l h vh

rpm450350250150 550 650 750

750

圖 46 逆轉〈快〉之歸屬函數

6 輸出

OutputMVL L H VH

rpm0-50-150-250 50 150 250

圖 47 輸出之歸屬函數

41

422 模糊規則庫

表 41 為吾人所設計的模糊控制規則庫並利用 Matlab 之 Fuzzy ToolBox 來

建立此規則庫以進行模擬推論圖 48 為當馬達輸入指令為正轉慢時推論後所得

到的三維空間圖

表 41 模糊控制規則表

Dspeed

vl l m h vh

l H M L VL VL

m VH H M L VL sspeed

h VH VH H M L

圖 48 推論後的三維空間圖

42

423 模糊控制器之軟體設計流程

Start 外部中斷副程式

ADCWR = 0 ADCWR = 1

〈令AD開始轉換〉

檢查鍵值以得到對應的歸屬函數

取得目前轉速與

轉速誤差

Fuzzy Rules決策

得到輸出訊號

Delay 10ms

ADC = 0 讀取AD值 ADCRD = 0

將AD值換算成轉速

ADCWR = 0 ADCWR = 1

〈AD開始轉換〉

返回主程式

致能外部中斷

圖 49 Fuzzy Controller 程式流程圖

當控制器一開始動作時便先執行AD轉換的工作當AD轉換完成時其

INTR的接腳便會觸發8051的外部中斷INTR0於是程式便發生外部中斷執行

外部中斷副程式的指令

43

在外部中斷副程式中AD將ㄧ直進行轉換與讀取的工作同時並將轉換後

的值直接換算成目前轉速與轉速誤差以供模糊控制器使用換算目前encoder

的頻率其公式為

160-V2000 times=頻率 〈4-1〉

式4-1之公式是根據表31所導出來的其中V為encoder之頻率轉成電壓之值

又假設所讀取的AD轉換值為value因為

AD的解析度 = bit256

5V+ = 511 ( Vbit ) 〈4-2〉

故value值與電壓V之關係為

511 value V times= 〈4-3〉

所以encoder之頻率與value值的關係為

頻率= 2000times ⎟⎠⎞

⎜⎝⎛ times

511 value - 160 〈4-4〉

故目前轉速為

sspeed = ( )rpm 60 200

times頻率 〈4-5〉

另ㄧ方面在主程式中程式會先去檢查鍵值也就等於檢查輸入指令以

找出符合使用的歸屬函數並將AD所獲得的轉速對應到歸屬函數中然後執行

決策判斷即進入規則庫中尋找出適當的決策判斷最後將此決策送入PWM程

式裡進行脈寬長度的調整使馬達在合理的要求下達到理想的轉速控制不會

因為外在環境的影響而使馬達轉速受到干擾

43 LCD 顯示轉速

此專題最後再增加一LCD顯示幕以顯示目前的轉速否則在程式設計完成

後人卻因無法以肉眼得知目前轉速而不能肯定馬達轉速是否有達到控制的目

標因此增加一顯示幕LCD是有必要的不僅隨時得知目前的轉速還能知道

44

設計出來的軟體其控制性是否夠好夠穩定

431 LCD 顯示幕之軟體流程

Start

設定LCD模組的初始狀態

設定外部中斷INTR0

與Timer0

設定TH0 = (65536 ndash 5000) 256 TL0 = (65536 ndash 5000)256

令ADCWR = 0 ADCWR = 1 AD開始轉換

等待中斷

外部中斷副程式

ADCRD = 0 讀取AD值 ADCRD = 1

將AD值換算成速度

ADCWR = 0 ADCWR = 1 AD開始轉換

Timer0中斷副程式

顯示LCD第一行

ldquoMotor Speed =

顯示LCD第二行ldquoxxxxxxx rpm其中 xxxxxx為外部中斷副程式所換算出的轉速

重設TH0與TL0

返回主程式返回主程式

圖 410 LCD 顯示幕之程式流程圖

此程式主要由兩個部分完成一為外部中斷副程式另ㄧ為 Timer0 中斷副

程式當主程式完成外部與 Timer0 兩個中斷的設定後隨即命令 AD 開始轉換

之後便一直停在 while〈1〉的迴圈裡不做任何動作而由兩個中斷副程式來完

成整個轉換與顯示的工作

45

外部中斷副程式主要負責 AD 的轉換讀取與轉速換算的工作AD 第一

次的轉換由主程式來下達命令當轉換完成後AD 的 INTR 接腳將觸發外部中

斷〈INTR0〉副程式此時程式便進入外部中斷副程式執行讀取 AD 值與轉速

換算的工作當這些工作完成時外部中斷副程式再次下達 AD 開始轉換的命

令而離開中斷副程式當 AD 再次轉換完成時又將再次執行中斷副程式

如此週而復始中斷副程式將ㄧ直進行讀取換算與轉換的工作

而 Timer0 中斷副程式主要負責 LCD 顯示之工作當主程式所設定的計時時

間計數完時程式便進入 Timer0 中斷副程式一旦進入 Timer0 中斷副程式程

式將執行 LCD 的顯示然後再重設 Timer0 的計數時間Timer0 將重新計數當

計數完時程式又將再度進入 Timer0 中斷副程式執行因為程式中並無清除

Timer0 的中斷致能故 Timer0 中斷副程式和外部中斷副程式ㄧ樣週而復始的

執行其副程式的工作

46

第五章 結論

本計劃主旨為具模糊控制理論與雙脈寬調變法之直流馬達驅動電路設計主

要是針對傳統電路設計之缺點提出改良之方法以TPWM取代PWM電路以模

糊理論基礎設計之控制器替代傳統PID控制器

TPWM轉速控制優於PWM之處在於

1 TPWM只需使用單電源即可達到正轉和逆轉的轉速控制而PWM必須

加上逆向開關或是雙電源才能使馬達產生正轉和逆轉

2 TPWM可控制馬達處於停止狀態無論在正向或逆向加上負載皆無法使

馬達產生轉動

3 馬達消耗定額功率輸出轉矩為額定值

4 馬達由停止到某定轉速時反應時間較快

模糊控制器優於PID控制器

1 不須導出繁雜的數學模型

2 適用於非線性系統

3 強健性與容錯性較高

本專題至此雖說大致的目標都已達到但是此系統仍然有許多不完美而需要

改進的地方例如在實驗過程中發現整個轉速的控制在回授上其反應時間

有點慢探討其原因有可能是控制器之程式上的問題

1 因為使用C語言撰寫程式故其執行速度較慢

2 程式可能寫的太累贅

3 模糊控制規則庫建立不良

若想改善這些問題可以嘗試著將C語言改為組合語言來撰寫並盡量減少

47

不必要的指令相信此動作一定能大大提昇程式的執行速度其次就是多做測

試利用測試中所學到的經驗來幫助模糊控制規則庫的改寫同時也能從測試中

發現更多的問題若是都能對問題加以一一解決的話相信必定能將此控制系統

做的更盡善盡美

48

參考文獻

﹝1﹞ 李適中直流馬達速度控制伺服控制〈基礎篇〉全華科技圖書股份有

限公司民 74

﹝2﹞ 廖錦文ldquo直流電動機之雙脈寬調變是〈TPWM〉驅動電路研究電

子技術月刊第 69 期pp94-1021992

﹝3﹞ 楊英魁孫宗瀛鄭魁香林建德蔣旭堂模糊控制理論與技術全華

科技圖書股份有限公司民 85

﹝4﹞ 林敦煌陳憬德直流馬達定位及轉速的模糊控制逢甲大學自動控制工

程學系學士論文民 87

﹝5﹞ LAZadehldquo Fuzzy Sets Information and Control Vol8 pp338-353

1965

﹝6﹞ EHMamdani and SAsslianldquo A fuzzy logic controller for a dynamic

plant Internation Journal of Man-Machine Studies Vol7 pp1-13 1975

﹝7﹞ 孫宗瀛楊英魁Fuzzy 控制理論實作與應用全華科技圖書股份有

限公司民 83 年

﹝8﹞ 許中平黃煌嘉直流電動機控制電路設計全華科技圖書股份有限公司

民 75

﹝9﹞ 盧明智黃敏祥OP Amp 應用+實驗模擬全華科技圖書股份有限公司

民 83

﹝10﹞陳文耀電動機控制工程復文書局2003

﹝11﹞許中平林全福電動機運轉控制技術全華科技圖書股份有限公司民

77

﹝12﹞楊明豐8051 單晶片 C 語言設計實務碁峯資訊2003 年

﹝13﹞蔡朝洋單晶片微電腦 80518951 原理與應用全華科技圖書股份有限公

司民 91

49

﹝14﹞王文俊認識 Fuzzy全華科技圖書股份有限公司民 90

50

附錄 A 專題硬體展示圖

圖 A-1 硬體整體圖

圖 A-2 硬體整體鳥瞰圖

51

圖 A-3 硬體側視圖

圖 A-4 操作與顯示面板

圖 A-5 間距脈波電路與 FV 電路

52

圖 A-6 橋型驅動功率放大電路

圖 A-7 操作與控制面板

53

附錄 B PWM 與模糊控制之程式

include reg51h include stdioh sbit ADCRD = P3^1 設定 RD 控制線接腳為 P31 sbit ADCWR = P3^3 設定 WR 控制線接腳為 P33 sbit P2_0 = 0xA0 接腳定義 sbit P2_1 = 0xA1 接腳定義 sbit P3_0 = 0xB0 接腳定義 sbit P3_1 = 0xB1 接腳定義 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P3_6 = 0xB6 接腳定義 void KeyStatus(void) 函數原型宣告 void feedback(void) 函數原型宣告 void compute_grade(void) 函數原型宣告 void delay1ms(int count) 函數原型宣告 void convert() 函數原型宣告 void condition() 函數原型宣告 void CW(void) 函數原型宣告 int j i 對應 PWM 的寬度 unsigned int temp 所設計的計時器時間 int sample = 1000 取樣率設定消除顯示值跳動 long int value r1 讀取 ADC0804 數位資料 long int set n condition select long int r grade_reg[2] grade[15] error1 error2 long int a1 b1 I long int membership[5][3]membership1[3][3] 定義歸屬函數 long int membership2[3][3] = -10-50-5050510 long int error[2] int Rule[15][3] = 113213313 定義判斷規則庫 212223323 311232333 411241342 511251351

54

main() 主程式 j = PWM = 110 設定 PWM 初始值 IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x00 設定計時器 0 工作於模式 0 temp=8192-j4 設定計時器 0 初值 TH0 = temp 32 TL0 = temp 32 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 P3_4 = 1 P3_5 = 0 P3_6 = 0 ADCWR = 0 令 ADC0804 的 WR = 0 ADCWR = 1 令 ADC0804 的 WR = 1 while (1) KeyStatus() 檢查鍵值 void KeyStatus(void) 檢查鍵值並給對應的 PWM 值 char KeyScan(void) 按鍵掃描函數宣告 unsigned char KeyStatus unsigned char Key = 0 KeyStatus=KeyScan() 呼叫按鍵掃描函數 if (KeyStatus = 0) 已有按鍵輸入 Key = KeyStatus Key = 鍵值 if (Key == 0x01) 假如輸入為按鍵 1 i = 110 PWM 為 110us j = i P3_4 = 1 LED 亮第一顆〈表馬達停止〉 P3_5 = 0 P3_6 = 0

55

else if (Key == 0x02 ) 假如輸入為按鍵 2 i = 140 PWM 為 140us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x04 ) 假如輸入為按鍵 3 i = 180 PWM 為 180us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x08 ) 假如輸入為按鍵 4 i = 80 PWM 為 80us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 else if (Key == 0x10 ) 假如輸入為按鍵 5 i = 40 PWM 為 40us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 PWM = j delay1ms(10) 呼叫延遲函數 feedback() 模糊控制判斷

56

void To_int(void) interrupt 1 Timer0 中斷函數 if (P3_0 == 0) 假如 PWM 輸出為 Low P3_0 = 1 變更 PWM 輸出為 High temp=8192-j4 設定 High 的時間 else 若 PWM 輸出為 High P3_0 = 0 變更 PWM 輸出為 Low temp=8192-880+j4 設定 Low 的時間 TH0 = temp 32 Timer0 的計時時間 TL0 = temp 32 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 char KeyScan(void) 檢查鍵值 char KeyStatus 按鍵狀態 P0=0xff 設定 P0 為輸入模式 KeyStatus=~P0 讀取按鍵狀態 return(KeyStatus) 將鍵值送回程式 void feedback(void) 模糊判斷 void Fuzzycontroller() 函數原型宣告 void condition1() 函數原型宣告

57

void condition2() 函數原型宣告 error1 = ((value)40-160)03 輸入變數 1 delay10ms(10) 延遲 10ms error2 = ((value)40-160)03 輸入變數 2 if (key == 0x01 ) 當按鍵 1找出對應的歸屬函數 並做出模糊控制判斷

int membership[5][3]= -100-60-30-60-300-30030030603060100

int membership1[3][3]=-100-500-50050050100 Fuzzycontroller() condition() if (key == 0x02 ) 當按鍵 2找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

05010050100150100150200150200250200250300 int membership1[3][3]=07515075150225150225300 Fuzzycontroller() condition() else if (key == 0x04) 當按鍵 3找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

200320400300400500400500600500600700600700800 int membership1[3][3]=220370520370520670520670820 Fuzzycontroller() condition() else if (key == 0x08) 當按鍵 4找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

02550255010050100200100200300200300400 int membership1[3][3]=05010050100250100250400 Fuzzycontroller() condition()

58

else if (key == 0x10) 當按鍵 5找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

150250350250350450350450550450550650550650750 int membership1[3][3]=150300450300450600450600750 Fuzzycontroller() condition2() void Fuzzycontroller() 模糊控制判斷 void compute_grade() 函數原型宣告 void compute_grade1() 函數原型宣告 a1 = 0 b1 = 001 I = 0 for (n=0 nlt=14 n++) r = error1 set = Rule[n][0]-1 compute_grade() 計算輸入變數 1 與

模糊程度的歸屬函數 condition = 1 r = error2 set = Rule[n][1]-1 compute_grade1() 計算輸入變數 2 與 模糊程度的歸屬函數 grade[n] = MIN(grade_reg[0] grade_reg[1]) a1 = a1 + (grade[n]membership2[Rule[n][2]-1][1]) b1 = b1 + grade[n] I = a1 b1 得到模糊控制判斷的結果 void compute_grade() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership[set][0]) || (r gt membership[set][2])) 當輸入變數不在 歸屬函數內

59

grade_reg[condition] = 0 else if ((r gt membership[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership[set][2]-r) (membership[set][2] - membership[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership[set][0]) (membership[set][1] - membership[set][0]) void compute_grade1() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership1[set][0]) || (r gt membership1[set][2])) 當輸入變數不在 歸屬函數內 grade_reg[condition] = 0 else if ((r gt membership1[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership1[set][2]-r) (membership1[set][2]-membership1[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership1[set][0]) (membership1[set][1]-membership1[set][0])

60

void condition() P2_0 = 1 設定 P20 為輸入模式 P2_1 = 1 設定 P21 為輸入模式 if ( (P2_0 == 1) ampamp (P2_1 == 0)) 當馬達為正轉時 if ( I gt 0 ) 若模糊判斷結果為正 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 若模糊判斷結果為零 PWM = PWM + 0 PWM 寬度不變 if ( I lt 0 ) 若模糊控制結果小於零 PWM = PWM + 1 PWM 寬度加 1 else if ( (P2_0 == 0) ampamp (P2_1 == 1) ) 若馬達為反轉 if ( I lt 0 ) 模糊控制小於零 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 模糊控制等於零 PWM = PWM + 0 PWM 寬度不變 if ( I gt 0 ) 模糊控制大於零 PWM = PWM + 1 PWM 寬度加 1 CW() 判斷 PWM 寬度上下限

61

void CW() 判斷 PWM 寬度上下限 if ( PWM gt= 215 ) 若 PWM 寬度 gt= 最大寬度 j = 215 PWM 寬度維持於 215us if ( PWM lt= 5 ) 若 PWM 寬度 lt= 最小寬度 j = 5 PWM 寬度維持在 5us if ( PWM gt 5 ampamp PWM lt 215 ) PWM 寬度介於最大與最小間 j = PWM PWM 依模糊控制判斷結果增減 void delay1ms(int count) 延遲 1ms int x y for ( x = 0 x lt count x++ ) for ( y = 0 y lt 122 y++ ) void convert() 數位資料換算成馬達轉速 r1 = ((value)40)-160

62

附錄 C LCD 顯示之程式

includereg51h 含 8051 所有暫存器宣告 include mathh define RS P3_5 LCD 指令資料選擇控制 define RW P3_4 LCD 讀寫控制腳 define Enable P3_3 LCD 致能接腳 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P0_0 = 0x80 接腳定義 sbit P0_1 = 0x81 接腳定義 sbit P0_2 = 0x82 接腳定義 sbit P0_3 = 0x83 接腳定義 sbit P0_4 = 0x84 接腳定義 sbit P0_5 = 0x85 接腳定義 sbit P0_6 = 0x86 接腳定義 sbit ADCRD = P3^7 設定 RD 控制線接腳為 P37 sbit ADCWR = P3^6 設定 WR 控制線接腳為 P36 void delay(void) 函數原型宣告 void delay10ms(int count) 函數原型宣告 void display(void) 函數原型宣告 void InitialLCD(void) 函數原型宣告 void WriteIns(char) 函數原型宣告 void WriteData(char) 函數原型宣告 void WriteString(charchar) 函數原型宣告 void CheckBusy(void) 函數原型宣告 void convert(void) 函數原型宣告 char MSG0[] = Motor Speed = 定義字串 MSG0 char MSG2[] = rpm 定義字串 MSG2 unsigned char MSG1[8]=0000000 定義字串 MSG1 unsigned long int value 讀取 ADC0804 數位資料 int sample = 1000 取樣率設定消除顯示值跳動 long int rpm

63

main() 主程式 InitialLCD() 初始化 LCD IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x01 設定計時器 0 工作於模式 1 TH0 = (65536-5000)256 設定計時器 0 初值 TL0 = (65536-5000)256 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 while(1) 等待中斷 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 while (--sample == 0) 取樣率減 1 sample = 1000 重設取樣率 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 void T0_int(void) interrupt 1 LCD 顯示動態掃描 display() 動態掃描顯示 TH0 = (65536-65535)256 重設計時初值 TL0 = (65536-65535)256

64

void InitialLCD(void) 設定 LCD 模組初始狀態 delay() 延遲函數 WriteIns(0x38) 設定 LCD 模組為 WriteIns(0x38) 2 行顯示 WriteIns(0x38) 8 位元介面 WriteIns(0x38) 5x7 點字型 WriteIns(0x08) 關閉顯示器 WriteIns(0x01) 清除 LCD 螢幕 WriteIns(0x0c) 令顯示器 ON但游標不顯示 WriteIns(0x06) 令 LCD 模組每接收到 1Byte 資料 AC 值自動加 1 void display() 掃描顯示 WriteIns(0x80) 設定 LCD 座標 WriteString(13MSG0) 將字串 MSG0 寫入 LCD 中 WriteIns(0xc0) 設定 LCD 座標 WriteString(8MSG1) 將字串 MSG1 寫入 LCD 中 WriteIns(0xc8) 設定 LCD 座標 WriteString(4MSG2) 將字串 MSG2 寫入 LCD 中 void convert(void) 換算轉速 long int freq freq = ((value)4000) - 16000 數位資料換成頻率公式 rpm = freq3 頻率換算轉速公式 MSG1[0] = (rpm1000000)+0x30 將結果存入字串 MSG1 中 MSG1[1] = ((rpm1000000)100000)+0x30 MSG1[2] = ((rpm100000)10000)+0x30 MSG1[3] = ((rpm10000)1000)+0x30 MSG1[4] = 0x2e MSG1[5] = ((rpm1000)100)+0x30 MSG1[6] = ((rpm100)10)+0x30 MSG1[7] = rpm10+0x30

65

void WriteIns(char instruction) 寫命令至 LCD 中 RS = 0 選擇指令暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = instruction 輸出命令至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteData(char i) 寫資料至 LCD 中 RS = 1 選擇資料暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = i 輸出資料至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteString(countMSG) 寫字串至 LCD 中 char count 字串長度 char MSG[] 字串資料 char i 定義位元組變數 for(i=0 iltcount i++) count 個位元組 WriteData(MSG[i]) 寫入一位元組的資料至 LCD 中 void CheckBusy(void) char i=0x80 檢查忙碌旗標 while(iamp0x80) 忙錄旗標 BF = 1 RS = 0 選擇指令暫存器 RW = 1 讀取 Enable = 1 致能 LCD i = P2 讀取 LCD 指令暫存器內的資料

66

Enable = 0 除能 LCD delay() 延遲函數 void delay() 延遲 5ms int i for(i=0 ilt250 i++)

  • 畢業專題封面pdf
  • File0004pdf
  • 最終版pdfpdf
Page 9: Based on Fuzzy Control Theorem and TPWM Method for DC ... · 使吾人想設計一模糊控制器來做為馬達轉速的閉迴路控制,以解決非線性系統的 問題。除此之外,flcs

VIII

表目錄

表 31 頻率與轉換電壓之關係30 表 33 PWM 輸出對應 encoder 週期 34 表 41 模糊控制規則表41

1

第一章 緒論

11 前言

在現代的工程應用裡馬達扮演一個非常重要的角色它在機械設備中就好

像人的心臟一樣提供了機械運轉所需要的動力源以做為能量轉換或控制機能

的實行在眾多的馬達種類當中直流馬達不僅具有許多良好的特性例如高

啟動轉矩較易線性控制hellip等且其週邊控制元件充足控制理論發展成熟所

以被廣泛的應用在工業日常生活上馬達的速度控制被廣泛的應用在各種加工

機械航空機械農業機械交通工具等用途

直流電動機之轉速控制目前最常被使用的一種方法為脈波寬度調變〈PWM〉

驅動電路並結合傳統的 PID 控制器脈寬調變是一種以固定的頻率波寬可

調的輸出開閉供應的直流電壓使馬達感受到的平均電壓可以調整進而控制馬

達的轉速

我們日常生活中處處存在著非線性的現象但是我們較熟悉處理的卻是線

性的系統對於傳統 PID 控制器來說必須先知道受控系統〈plant〉的數學模

型否則無法導出其控制演算法則且其強健性與容錯性較低然而對於非線性

系統則不適合此法因此近年來對於非線性系統的研究工作已有許多學者嘗試

應用模糊理論〈Fuzzy Theory〉類神經網路〈Artificial Neural Networks〉基因

演算法〈Genetic Algorithms〉等非傳統方法且已有不錯之成效因此以模糊控

制理論之方法取代傳統的 PID 控制器來控制馬達轉速

對於一個非線性時變系統〈Nonlinear Time Variant System〉模糊控制理論

不但能簡化數學模型並且可以結合人類的操作經驗有效的達成控制目標模

糊控制能將操作者的專家經驗換成控制器設計人員的設計理念勢必擁有比一般

傳統的控制器更加的強健性與容錯性

2

12 研究動機

現今直流馬達的轉速控制多廣泛使用脈波寬度調變式〈Pulse Width

Modulation簡稱 PWM 驅動電路〉此種電路是以控制固定頻率的開閉供應直流

電壓以得到波寬可調的輸出使馬達的平均電壓可以調整進而轉移到馬達的

平均功率而達到轉速的控制但是由於 PWM 為一種單象限控制只運作於第一

象限這種系統本身無法產生負轉矩未加上逆向開關前亦無法反向因此無法

作用於第三象限系統加上動力制動後方可以有限度地產生逆向轉矩而運作於

第二象限〈見圖 11〉然而這也只是一種被動控制區間﹝1﹞

主動控制區動力制動

(被動運作)

Ⅱ Ⅰ

Ⅲ Ⅳ

ω

TCWCCW

圖 11 單象限控速系統運作於第一象限

本研究主要目的之一就是針對 PWM 之缺失提出了改良的方法於前級驅

動電路產生正反方向的兩個脈波信號再經驅動功率放大之後使馬達產生正

反轉向的兩拉力此即為雙脈波寬度調變式(Two Pulse Width Modulation簡稱

TPWM)本控制主要特色不論電動機正轉反轉速度快慢或停住均消

耗定額功率〈即馬達無時無刻都在運轉且輸出轉矩為額定值〉系統於寬廣的

速度變化範圍內仍具有良好的伺服性能馬達的旋轉扭力不會因速度及負載的

變化而受影響使伺服控制系統達到某一預定的特性範圍﹝2﹞

3

此外馬達的轉速會因其驅動機構的慣性影響不可能「說停就停」也

會因為摩擦力等影響不可能「說動就動」故對其操控指令一定會有延遲的

現象發生這些因素使馬達不是一個典型的線性系統故傳統的 PID 控制器就

不是最好的選擇再加上近年來模糊控制系統〈Fuzzy Logic Control System

FLCS〉的發展﹝3﹞使吾人想設計一模糊控制器來做為馬達轉速的閉迴路控

制以解決非線性系統的問題除此之外FLCS 在上升時間安定時間和超

越量上的要求也都優於傳統的 PID 控制器[4]

目前雖然有很多從事於馬達轉速控制的相關研究但是多採用脈波寬度調

變法且其尚有缺失待改良因此吾人想採用雙脈波寬度調變雖然有關此法

的研究並不多見但 TPWM 卻具有 PWM 所沒有的優點再加上近來發展愈

盛的模糊控制理論較傳統 PID 控制器的優點相信馬達轉速以 TPWM 驅動電

路之模糊控制是值得去加以研究和探討的

13 研究方法

本專題計畫其研究方法主要分為兩大類一為硬體結構電路設計另一為

Fuzzy 控制器之軟體製作硬體結構方面主要設計一比較放大器使其誤差值經

此電路與三角波比較而輸出 A 驅動信號脈波與 B 驅動信號脈波然後再由驅動

功率放大電路將信號脈波放大後控制馬達正逆轉此外為了確保功率放大電

路之安全性需在其之前加上一間距產生電路以防止其電路損毀

感測器方面則利用編碼器〈encoder〉感測出馬達的轉速然後再經由 FV

將其轉換為電壓此電壓再由 AD 轉換為數位信號送入單晶片 8051經由模

糊控制規則庫判斷並做出決策以達到馬達轉速的控制

4

14 研究目標

本專題研究目標如下

〈1〉 完成相關文獻資料之蒐集整理與討論

〈2〉 完成 AB 信號產生電路設計

〈3〉 完成間距脈波產生電路設計

〈4〉 完成驅動功率放大電路設計〈橋型驅動功率放大〉

〈5〉 完成 FV 電路設計

〈6〉 完成 AD 訊號轉換

〈7〉 編寫模糊控制法則與介面軟體設計

5

第二章 原理探討

21 模糊控制與理論

在傳統的控制領域裏控制系統動態模式的精確與否是影響控制優劣的最主

要關鍵系統動態的資訊越詳細則越能達到精確控制的目的然而對於複雜

的系統由於變數太多往往難以正確的描述系統的動態於是工程師便利用各

種方法來簡化系統動態以達成控制的目的但卻不盡理想換言之傳統的控

制理論對於明確系統有強而有力的控制能力但對於過於複雜或難以精確描述的

系統則顯得無能為力了因此便嘗試著以模糊數學來處理這些控制問題模糊

控制是屬於非線性式的控制在受控系統無法以線性數學模式精確描述的情況

下經由適當調整控制規則應具有比傳統控制方法更佳的控制性能

211 模糊理論概述

1965 年美國加州柏克萊分校的 LotfiAZadeh 教授首先在他主編的

「Information and Control」刊物上提出「Fuzzy Set」論文此為模糊邏輯理論的

創始模糊理論在經過了三十幾年的演化改進後無論是在應用或理論架構上

皆已日趨完備尤其近年來因人工智慧的迅速發展模糊理論儼然成為人工智慧

不可或缺的理論根基

Zadeh 教授曾提出一個互克性原理﹝5﹞「當系統的複雜性增長時對系統

特性做精確且有意義描述的能力亦相對降低最後精確性與有意義性將變成完全

互相排斥的特性」很高的複雜性意味著只能在一個刻意壓縮的低維因素空間觀

察而無法對問題的全部因素都進行考察使得原本是明確的概念變的模糊

Fuzzy 理論正是為了掌握這類具模糊特質的事物而發展出來的所以它的應用較

偏重於人類的經驗及對問題特性的掌握程度不主張用繁雜的數學分析及數學模

式來解決問題

Fuzzy 理論把傳統數學從二值邏輯〈binary logic〉擴展到連續多值〈continuous

6

multi-value〉利用歸屬函數〈membership function〉描述一個概念的程度亦及

使用 0 和 1 之間的數值來表示一個元素屬於某一概念的程度這個值稱為元素對

集合的歸屬度〈membership grade〉當歸屬度為 1 時表示該元素百分之百屬於

這個概念當歸屬度為 0 時則表示該元素完全不屬於這個概念介於兩者之間

的就是完全屬於和完全不屬於之間的灰色地帶

模糊理論的工程應用大約始於 1974 年倫敦大學的 EHMamdani 教授他根

據 Zadeh 提出的語言分析法〈linguistic approach〉及模糊推論〈fuzzy inference〉

運用 IF-THEN 形式的法則來敘述操作員的控制策略成功地應用在蒸汽機自動

運轉上﹝6﹞從此模糊理論的應用便迅速發展以在控制方面的研究成果最為

顯著模糊理論其實是一門相當生活化的學問由於使用語言變量描述因此更

具親和力與一般性人類日常生活所遇所用的一些敘述即大都是模糊的例如

那個人ldquo很高車開的ldquo很快等等其中ldquo很高ldquo很快並不是一個

明確值而只是描述事件的程度但是根據這些描述人類卻能很輕易的接收

212 模糊集合

模糊集合〈fuzzy set〉可視為傳統集合的擴張在模糊集合的世界中稱傳

統集合為明確集合〈crisp set〉所謂模糊集合是指用來表示界限或邊界不分明的

模糊概念的集合許多日常生活中的概念常常都不是清晰明確的這些可說是模

糊概念例如很高很快等這類概念無法用傳統的二值集合論即 0 或 1 表示

而Zadeh教授提出的Fuzzy集合論可以將這些概念由傳統集合論的特徵函數從非

0 即 1 的二值選擇推廣為從 0 到 1 之間的任何值做選擇得到新型的特徵函數

稱為歸屬函數

模糊集合由歸屬函數表示相對於明確集合的特徵函數其值只有 0 或 1 兩個

值即其值為在實軸閉區間[01]之中的任一實數模糊集合可以彌補明確集

合描述時所產生的不合理現象因此模糊集合比傳統的明確集合更具客觀性

7

213 歸屬函數

歸屬函數〈membership function〉為 0 到 1 之間的數值吾們可以藉由歸屬

函數來描述 Fuzzy 集合的特質它是 Fuzzy 理論的最基本觀念透過歸屬函數我

們才能對 Fuzzy 集合進行量化也才可能利用精確的數學方法分析處理模糊性資

歸屬函數在 Fuzzy 控制的應用範疇內都要具備凸〈convex〉及正規〈normal〉

等基本特性〈如圖 21〉歸屬度函數的定義可以分為數值及函數兩種數值定義

方式又稱為離散化歸屬函數它是直接給定有限 Fuzzy 集合內每個元素的歸屬

度並以向量的形式表現出來函數定義方式又稱為連續化歸屬函數它是以不

同形式的函數來描述 Fuzzy 集合

圖 211 正規且凸模糊集合

1

0 圖 212 正規非凸的模糊集合

8

一個模糊集合的歸屬函數可以有許多方式但是目前最廣泛使用的有吊鐘

型三角型梯型等歸屬函數

〈1〉吊鐘形歸屬函數

吊鐘形歸屬函數定義如下

μA=bell(xabc)= b

acx 2

1

1minus

+

〈21〉

圖 22 吊鐘型歸屬函數

〈2〉三角形歸屬函數

三角形歸屬函數可由三個參數(abc)來加以決定

=Aμ trangle(xabc)

⎪⎪⎪

⎪⎪⎪

ltleminusminus

ltleminusminus

=

other

cxbcbcx

bxaabax

0

〈22〉

其中a為歸屬函數左邊界b為歸屬函數中心值c為歸屬函數右邊界

9

圖 23 三角型歸屬函數

〈3〉梯型歸屬函數

梯型歸屬函數可由四個參數加以決定

=Aμ trapezoid(xabcd)

⎪⎪⎪⎪

⎪⎪⎪⎪

leleminusminus

ltle

ltleminusminus

=

other

dxcdcdx

cxb

bxaabax

0

1 〈23〉

圖 24 梯型歸屬函數

10

214 模糊推論與模糊規則

模糊推論〈fuzzy inference〉是根據知識庫保存的規則(rule)和給予的事實

推導出新的結論與傳統推論不同的地方是Fuzzy推論不只可以處理明確命題也

可以處理Fuzzy命題Fuzzy推論是依據近似推理〈approximate reasoning〉的概念

發展出來的比傳統推論的嚴正推理〈exact reasoning〉更合理也更具彈性近

似推理是兩種嚴正推理General Modus Ponens〈簡稱GMP〉及Genera Modus

Tollens〈簡稱GMT〉的一般化此原理是從傳統二值邏輯中的肯定律〈modus

ponens〉和否定律〈modus tollens〉推廣而來其中GMP又可稱為前向推理而

GMT則可稱為反向推理

〈1〉 GMP〈General Modus Ponens〉

規則IF x is A THEN y is B

事實x is Arsquo

結論y ix Brsquo 〈24〉

〈2〉 GMT〈General Modus Tollens〉

規則IF x is A THEN y is B

事實y is Brsquo

結論x is Arsquo 〈25〉

上式中IF x is A THEN y is B即為模糊規則〈fuzzy rules〉AArsquoBBrsquo

分別是定義在論域X及Y的模糊集合xy代表輸入變數及輸出變數的語言變數

一般來說「x is A」稱為前件部〈antecedent〉而「Y is B」則稱為後件部

〈consequence〉Fuzzy知識庫〈Fuzzy Knowledge Base簡稱FKB〉即由這些模

糊規則所組成的規則庫〈rule base〉和存放描述領域知識的Fuzzy變數及語言變數

的資料庫〈data base〉所組成所以FKB是用來描述受控對象所涉及的領域知

11

識和操控目標的一些定性及定量的資訊模糊知識庫和模糊推論是構成Fuzzy規

則系統核心的兩個重要部門﹝7﹞

模糊推論是模糊系統的核心根據知識庫的模糊法則進行模糊理論的合成運

算來模擬人類的思考決策模式一般來說規則的建立是採取十分主觀直覺的

方式依據相關領域專家的經驗與知識透過詢問進而將其知識經驗歸納條列出

重點再轉換成模糊規則的形式表現出來但是並非所有的專家或操作員都能

將自身的經驗知識以言詞的方式充分的表達出來且未必能整理成條列的模糊規

則所以知識規則的萃取工作往往是在建構模糊系統時最常遭遇到的困難之

215 模糊控制器

模糊控制是智慧型控制〈intelligent control〉系統的一種典型其基本特點

是不完全依賴受控對象的數學模型主要是利用人的操作經驗知識和推理技

術以及控制系統的某些訊息和性能得出對應的控制動作模糊控制是以並行

〈parallel〉方式處理規則的推理工作〈如圖25〉其近似推理會包容每個對操

控系統有貢獻的規則即使某些貢獻程度很小的規則也不會忽略

圖 25 模糊控制系統的構造

12

一個控制器的輸入通常是確定數值而非模糊輸出也是如此才能對被控對象

發生作用但是模糊邏輯控制器〈Fuzzy Logic Controller簡稱FLC〉則是以語

言化的控制規則為主體為了能夠把輸入的確定值與語言化之後的控制規則結

合必須把輸入的確定值模糊化〈fuzzification〉以便對應到FLC語言變數的論

域範圍中同樣的經過規則庫推理出來的結果是對應到輸出語言變數的論域

中所以也必須對其做解模糊化〈defuzzification〉的工作才能達成實際的控制

目標

一般模糊控制器的架構包含了五個主要部分定義變數模糊化知識庫

模糊推論及解模糊化

〈1〉 定義輸入及輸出變數

決定程序被觀察的狀況及考慮控制的動作輸入變數可以是擷取

自受控系統的觀測量也可以是推導出來的資料輸出變數則為操控

受控系統的操作量例如在一般控制問題上輸入變數通常為輸出

誤差e與輸出誤差之變化率e而控制變數則為下一個狀態之輸入

u其中eeu統稱為模糊變數

〈2〉 模糊化

將量測值轉換為語言變數的過程將外界所輸入的確定數值經由

一比例映射傳送到輸入變數所對應的模糊論域然後再利用模糊化

函數將此輸入資料轉換成適當的口語值以供模糊運算使用此口語

化變數稱之為模糊子集合

〈3〉 知識庫

模糊知識庫是模糊控制的依據由它來定義所有使用到的語言控

制法則及相關各項參數知識庫可說是整個控制系統資料核心其包

含了兩個部分資料庫〈data base〉與規則庫〈rules base〉

1 資料庫

提供處理模糊數據之相關定義資料庫所存放的資料是關

13

於如何將明確的資料轉換成模糊數值而資料的存放方式是以

歸屬函數表示該選用哪一種歸屬函數依實際的需要選定

以三角形歸屬函數最常被使用因其運算最為容易且又能充分

的表達模糊概念

2 規則庫

利用語言化的條件式控制規則描述控制目標和策略通常

控制規則可以由操控人員的經驗或專家的知識推導出來多個

控制規則所組成的集合就是規則庫

〈4〉 模糊推論

模糊推論為模糊控制最重要的核心其最主要的工作就是做實際

的決策過程處理模糊推論具有模擬人類做決策判斷的能力其基本

理論就是根據人類特有的近似推理方式如之前已說明的GMP和

GMTGMP為前向推理而GMT為逆向推理因為模糊推論為前向

運算因此GMP非常適合使用為模糊控制的推論機構

〈5〉 解模糊化

將推論完成所得到的模糊輸出量轉換成實際的明確數值以便和

外界溝通解模糊化的方法有很多例最大歸屬度法重心法高

度法面積法等

圖 26 模糊系統的基本架構

14

22 直流馬達數學模型

圖27為直流馬達等效電路簡圖其中

iV = 輸入電壓 ai = 電樞電流

zR = 電樞電阻 gT = 轉矩

aL = 電樞電感 bE = 反電動勢

φ = 空氣隙磁通量 ω = 轉子角速度

B = 黏滯摩擦係數 J = 轉動慣量

圖 27 直流馬達等效電路簡圖

由克希荷夫電壓定律知

( ) ( ) ( )tEdt

tdiLtiRV b

aaaai ++= 〈26〉

由於反電動勢 bE 與轉軸的角速度 ( )tω 及空氣隙磁通量φ之乘積成正比即

( ) ( ) ( )tKtKtE emb ωφω == 〈27〉

15

又轉矩的平衡方程式為

( ) ( ) ( )dt

tdJtBtTgωω += 〈28〉

且馬達轉矩 gT 與電樞電流 ( )tia 及空氣隙磁通量φ乘積成正比即

( ) ( ) ( )tiKtiKtT ataag == φ 〈29〉

取〈26〉~〈29〉式之拉氏變換得

( ) ( ) ( ) ( )sEssILsIRsV baaaai ++= 〈210〉

( ) ( )sKsE eb Ω= 〈211〉

( ) ( ) ( )sJssBsTg Ω+Ω= 〈212〉

( ) ( )sIKsT atg = 〈213〉

則馬達輸入電流與轉速為

( ) ( ) ( )( ) ( )( )

sR

sEsV

sLRsEsV

sIe

a

bi

aa

bia τ+

minus

=+minus

=1

〈214〉

( ) ( ) ( )

sB

sT

sJBsT

sm

gg

τ+=

+=Ω

1 〈215〉

其中a

ae R

L=τ 為電樞電流的電氣時間常數 BJ

m =τ 為馬達轉動的機械時間

常數

直流馬達轉速對輸入電壓的轉移函數 ( )sG 為

( ) ( )( ) ( )( ) etaa

t

i KKBJsRsLK

sVssG

+++=

Ω=

( )( ) etmea

t

KKssBRK

+++=

ττ 11 〈216〉

16

在一般情況電樞電感很小所以 eτ 可以忽略不計因此上式成為一階落後

方程式

( ) ( )( ) ( ) m

m

etma

t

i sTK

KKsBRK

sVssG

+=

++=

Ω=

11 τ 〈217〉

其中

eta

mam KKBR

BRT

+=

τ

eta

tm KKBR

KK

+=

所以直流馬達數學模式可以以圖28表之﹝8﹞

圖 28 直流馬達數學模式方塊圖

17

第三章 系統功能分析與製作規劃

31 專題製作流程

如圖 31 所示本專題主要分為兩條路徑進行一為硬體另一則為軟體程

式撰寫本章著重硬體的規劃設計軟體則在第四章中介紹在完成 AB 信號

產生電路驅動功率放大電路與間距脈波產生電路設計與製作後須先接上馬達

做一連串的測試〈此時系統並無回受控制〉測試間距脈波是否太長或太短硬

體電路是否有缺失hellip等等另一方面也著手撰寫模糊控制程式並將其與硬體電

路結合最後做閉迴路系統的整合測試若發現系統的運作結果並不如預期

則需分別從硬體與軟體兩方面去改良

直流馬達轉速之模糊控制

文獻蒐集與整理

AB信號產生電路設計與製作

驅動功率放大電路設計與製作

間距脈波產生電路設計與製作

測試間距脈波是否太長或太短

系統測試測試馬達轉速是否

達到控制目的

結束與論文寫作

重新設計間距脈波長度

Yes

No

系統整合與修正

輸出信號與Fuzzy控制器之連結設計

規劃輸出與輸入歸屬函數

規劃模糊知識庫

撰寫主程式並加入模糊知識庫

程式編譯及連結

軟硬體整合測試馬達是否運作

程式調整及最佳化

No

YesYes

No

圖 31 專題製作流程圖

18

32 雙脈寬調變法之直流馬達驅動電路設計

本專題製作的雙脈寬調變法之直流馬達驅動電路設計大致可以分為二大部

分第一雙脈寬調變法之電路設計第二橋型驅動功率放大電路

雙脈寬調變〈Two Pulse Width Modulation簡稱TPWM〉之電路設計主要

是先製作一脈寬調變〈Pulse Width Modulation簡稱PWM〉波形然後再將此

波形各別經由一緩衝器〈buffer〉和反向器〈inverter〉則可產生AB驅動信號

脈波此即為TPWM

321 脈寬調變電路

如圖32先利用兩顆op產生三角波電路再利用一個比較器比較三角波

和誤差值之大小

150k

1M

20k

+12V

-12V

+12V

-12V10k

+12V

-12V

10k

+12V

-12V-

+-

+

-

+ PWMLM324

LM324

LM324

2200pF

圖 32 脈寬調變電路

〈1〉 三角波產生電路

三角波產生電路通常至少需要兩個運算放大器其電路如圖33OP1

為一個反相積分器OP2為一個史密特磁滯比較器將OP2的輸出方波經

19

OP1反相積分以後得到Vo1三角波此三角波又同時加到OP2控制其狀

態的改變

當方波產生器的輸出是正的則三角波產生器的輸出是斜向負相似

地當方波產生器的輸出是負則三角波產生器的輸出是斜向正這個動

作將產生三角波的輸出同時也輸出方波﹝9﹞

+VCC

-VCC

-

+

R1

R2

R3

+VCC

-VCC

-

+

OP1

OP2

Vo2Vo1

圖 33 三角波產生電路

對OP2而言是磁滯比較必須先找到OP2的 THV 和 TLV

232

21

32

3oo v

RRR

vRR

Rv

++

+=+ 〈31〉

當 0=+v 時

23

21 oo v

RR

v minus= 〈32〉

表要達到OP2的 0=+v 必須有這麼大的 1ov

當 12 sato Ev = 時

TLsato VERR

v =minus= 13

21 〈33〉

當 22 sato Ev minus= 時

THsato VERR

v =+= 23

21 〈34〉

20

對OP1而言是反相積分器 2ov 為其輸入 1ov 為其輸出則

tCIt

Rv

Ct

CRv

dtvCR

v oooo

11

2

11

22

111

11minus=minus=minus=minus= int 〈35〉

因為

1

2

Rvv

I o minusminus= 0=minusv 〈因為虛接地〉 〈36〉

所以

1

2

Rv

I o= 〈37〉

又因運算放大器的輸入阻抗非常大則流經 1C 的電流也為 I 相當於以定

電流對電容C 充電

當 12 sato Ev = 時 1ov 為下降斜波

tR

EC

v sato

1

1

11

1minus= 〈38〉

當 22 sato Ev minus= 時 1ov 上升斜波

( )

tRE

Cv sat

o1

2

11

1 minusminus= 〈39〉

由此可知三角波的上升與下降斜波乃因 1C 的充電與放電且時間

常數為 11CR

三角波週期分析如下

1 上升斜波的時間 1T

tCR

vv o

o1

1

21 minus= 11

2

1 CRvv

to

ominus=

1Tt = TLTHo VVv minus=1 22 sato Ev =

11111

21

sat

TLTH

sat

TLTH

EVV

CRCRE

VVT

minus=

minusminus= 〈310〉

2 下降斜波的時間 2T

tCR

vv o

o1

1

21 minus= 11

2

1 CRvv

to

ominus=

21

2Tt = THTLo VVv minus=1 12 sato Ev =

1

11111

1sat

TLTH

sat

THTL

EVV

CRCRE

VVT

minus=

minusminus= 〈311〉

3 週期 21 TTT +=

若 1satE = 2satE = satE 且3

22RR

VV TLTH =minus satE

3

2114

RR

CRT=

若R3 = nR2

則nCR

T 114=

114 CR

nf = 〈312〉

《實驗結果》

必須注意的是三角波的頻率太低將導致馬達的轉動產生脈動現象

故將工作頻率設計在1kHz以上

Ω= k1501R Ω= k102R

Ω= k203R pFC 22001 =

所得到的三角波頻率為

15kHz10220010001504

00010100020

f 12- =timestimestimestimes

timestimes

=

圖 34 三角波輸出波形

22

〈2〉 脈寬調變電路〈PWM〉

+12V

-12V

10k

+12V

-12V -

+ PWM輸出LM324三角波輸入

圖 35 脈寬調變電路

PWM系統往往連接至直流電源供應放大器的工作是以固定的頻率開

閉直流供應電壓其激發角是可以調整的因此得到波寬可調的輸出

將固定頻率的三角波與反向輸入的電壓做比較便可輸出一脈寬〈見圖

36〉反向電阻值的不同將導致反向輸入電壓不同故其輸出為一可調但

頻率固定的脈寬也正因為如此故稱為脈寬調變〈PWM〉由於輸出的

dutycycle不同故馬達將接收到不同的平均電壓因而可以藉由PWM控制

馬達的轉速

反相輸入電壓

PWM

圖 36 三角波與反相輸入電壓比較

23

PWM的優點在於馬達驅動電路的電晶體之控制信號改以脈波列來控

制使電晶體操作成類似開關的動作不是完全導通就是完全截止故電晶

體不是一直操作於作用區所以其功率消耗不大整體效率較高

《實驗結果》

圖 37 PWM 輸出波形

322 橋型驅動功率放大電路

如圖38所示主要由四個功率電晶體組成利用不同的電晶體對使直流

馬達做正逆轉控制當Q5Q8導通使馬達正轉當Q6Q7導通馬達則逆

轉電路中的電晶體扮演開關的作用

此種電路簡單只要一組直流電源供應且電晶體分擔了部份的電壓保護

電晶體迅速工作於截止與飽和狀態之間故沒有功率散逸損失之虞

但是在設計時切勿使Q5Q6同時導通以免燒毀電路上之元件因為在

AB兩脈波短暫的交變時間內由於電晶體本身之最小延遲時間有可能使Q5

Q6同時ON與Q7Q8在很短時間同時ON因此在15kHz交變下容易燒毀功

率電晶體

因此設計一間距脈波電路主要之功用使Q5Q6和Q7Q8均不同時導通

24

以拉長AB兩者交換時間

M

20k

10k

20k

10k

+24V

A 信號 B 信號

2N3055 2N3055

2N2955 2N2955

1N40021N4002

C1815 C1815

C1815 C1815

Q5

Q8Q6

Q7

圖 38 橋型驅動功率放大電路

圖 39 橋型驅動功率放大電路實體圖

25

此外若考慮電晶體BE間的電壓則電路會出現約 plusmn 06V的不感帶〈ded

band〉即電晶體的 oV 對 inV 間的關係如圖3101假使 inV 電壓為正弦波則 oV 變

成如圖3102為了改善這種缺失吾人利用兩個二極體接在電路上如圖38

用來補償電晶體BE間的壓降﹝10﹞

約06V

Dead band

Vo

Vin

圖 3101 呈現不感帶的轉移函數

圖 3102 輸出電壓波形

26

323 間距脈波產生電路

RCext15

Cext14 74123

A3

B2

Q13

CLR1

Q4

7486100k

2200pF

10k

10000pF

+5V

間距脈波輸出

圖 311 間距脈波產生電路

間距脈波的產生方式是根據脈寬調變〈PWM〉後的訊號再經由積分電路的

電阻兩端取出且經由兩倍頻器〈74LS86〉檢示出PWM的正負緣脈波最後

再利用單穩態IC〈74LS123〉將檢出信號之脈寬拉長至01ms此即為間距脈波

74LS123有兩個輸入端子A及B分別為下降波緣輸入端子及上升波緣輸入端

子當輸入A之脈波由ldquoH變成ldquoL之瞬間Q輸出變為ldquoH其持續時間長

短由RC時間常數決定反之當輸入B之脈波由ldquoL變成ldquoH之瞬間Q輸出

變成ldquoH維持一定時間

74LS123的輸出脈波之寬度是由電阻及電容之時間常數所決定概略計算公

式如下

CR045T timestimes=

電容 C 必須大於 1000pF

27

《實驗結果》

R=24kΩ C=10000pF

所以得到間距脈波為

( )msec0110810000p24k045T cong=timestimes= μ

圖 312 間距脈波

研究經分析後發現

1 間距 T 愈大愈能確保電路之安全性愈有保護作用

2 間距 T 愈大相對的使驅動信號脈波減少愈多造成馬達旋轉扭力大

大減弱

3 適當的間距 T不但不會影響馬達的輸出轉矩而且兼具保護電路的

效果

33 編碼器

轉動編碼器不只可以作為轉速的感測也能做位置的感測又適合於數位處

理故被廣泛使用若就信號來看轉動編碼器可分為增量型與絕對型若以檢

測的方式來分可分為光學式和磁式兩種在本專題中所使用的編碼器為光學式

增量型編碼器﹝11﹞

光學式轉動編碼器的原理如圖 313在附有細縫轉盤的兩側分別裝置發光元

28

件與受光元件如果只有一組光電檢測元件則輸出信號就只有一相的脈波信

號此種裝置稱為脈波產生器圖 314 為增量型轉碼器的輸出信號它是利用

兩組光電元件所產生的脈波信號A 相和 B 相間有相位差正轉時 A 相領前 B

相逆轉時 B 相領前 A 相因此利用此兩相做檢測馬達為正轉或逆轉的工作

並利用 A 相或 B 相的頻率檢測出目前的轉速

吾人計算出編碼器每一轉可以產生約 200 個脈波故檢測 A 相或 B 相其頻

率為 N則轉速應為 60200

timesN

〈rpm〉

圖 313 光學式轉動編碼器的原理圖

圖 314 編碼器的輸出信號波形

29

34 LM2917 FV 電路設計

對 LM2907 而言磁滯比較器和電流汞是構成頻率對電壓轉換的基本架構

並且預留一個運算放大器及一個電晶體供各種不同的使用圖 315 為吾人所設

計的 FV 電路圖中 C1 用以抑制電流汞動作時所產生的漣波變化正常使用時

此電容應大於 10C若 C1 太大也將造成轉換速度下降

因為單晶片 8051 之輸入電壓最高為 5V故必須設計其馬達最高轉速頻率所

轉成的電壓必須在 5V 以內由於馬達轉速頻率範圍極大故吾人給予 LM2917

+12V 的電壓以擴大它可以轉換的電壓範圍並將所需維持在 5V 內

a1

14

b1

1

a1

13

b1

2

a1

12

b1

3

a1

11

b1

4

1

a1

10

b1

5

a1

8

b1

7

a1

9

b1

6

L2917

Encoder輸 入

1uF

+12V

FV輸出1000pF

45k 10kC1

C2

圖 315 FV 電路

30

《實驗結果》

根據統計結果每 50mV 相對於 100Hz如此一來吾人想得知馬達目前

的轉速只要將單晶片所接收到的電壓值經過換算即可得知目前 encoder 所量測

的頻率吾人知道 encoder 一圈可產生 200 個脈波故馬達的轉速便可經過下列

公式換算得知

轉速〈rpm〉 60200

times=f

其中 =f encoder 所量測到的頻率

表 31 頻率與轉換電壓之關係

頻率

(Hz) 1 2 3 4 5 6 7 8 9

電壓(V) 0006 0006 0007 0008 0009 0009 0009 0009 001

頻率

(Hz) 10 20 30 40 50 60 70 80 90

電壓(V) 008 009 010 010 011 011 012 012 013

頻率

(Hz) 100 200 300 400 500 600 700 800 900

電壓(V) 013 018 023 028 033 038 043 049 054

頻率

(Hz) 1000 2000 3000 4000 5000 6000 7000 8000 9000

電壓(V) 059 109 16 209 257 304 3508 4006 45

31

圖 316 頻率對電壓曲線

35 單晶片介面電路

單晶片介面包括了二大部分分別為單晶片 8051AD converter

〈1〉8051 單晶片

為本控制系統的核心一切動作皆經由它控制

〈2〉AD converter

將類比開關所送出來的類比訊號經由 ADC 0804 轉換成數位訊號傳送

到單晶片的輸入埠

351 AD 轉換

以單晶片 8051 控制 ADC0804則單晶片 8051 必須下達ldquo開始轉換rdquo的命令

給 ADC0804然後 ADC0804 就開始讀入類比輸入端的電壓在內部開始轉換

經過一段轉換時間後〈約 100μ s〉ADC0804 就將轉換完成的值放在其內部的三

態輸出栓鎖緩衝器裡然後將轉換完成輸出腳〈INTR〉降為 low以通知單晶片

可以去讀轉換完成資料

當WR和CS 同時為ldquo0rdquo時表示對 ADC0804 下達ldquo開始轉換rdquo命令再經過

32

一段轉換時間〈100μ s〉後轉換完成ADC0804 會將其轉換完成的數位資料放

在其內部 8 位元緩衝區裡且將 INTR 降為ldquo0rdquo因此單晶片只要下達ldquo開始轉換rdquo

命令後去檢查 INTR 的狀態就可以知道是否轉換完畢其方法有兩種

1 輪詢法〈polling〉

2 中斷法〈interrupt〉

所謂輪詢法就是將 ADC0804 的 INTR接到 CPU 的一條 IO 線上然後以軟體指

令主動偵測其狀態當偵測到為ldquo0rdquo時就可以去讀出 ADC0804 裡的緩衝區的轉

換值

中斷法是一個很理想的 IO 方式因為不像輪詢法必須讓 CPU 等 ADC0804

轉換當 CPU 下達ldquo開始轉換rdquo命令後就可以做其他工作當 ADC0804 轉換完

畢後 INTR會降為ldquo0rdquo可以利用此信號去中斷 CPU再由中斷副程式去讀入

轉換值即可因此大大提高了程式的效率

當 CPU 接收到 ADC0804 發出ldquo轉換完畢rdquo的信號〈 INTR =0〉後就可以去

讀出轉換值其讀出的方法是將CS 與RD設為ldquo0rdquo即可讀到轉換值這個讀值的

動作又會使得 INTR恢復成ldquo1rdquo

1 CPU 下達ldquo開始轉換rdquo命令〈CS =0WR =0〉

2 ADC0804ldquo轉換完畢rdquo 〈 INTR =0〉

3 CPU 讀取轉換值〈 RD =0CS =0〉

4 讀完後 INTR =1

ADC0804 主要規格摘要如下

1 +5V 單電源工作電壓

2 類比電壓輸入範圍 0~+5V

33

3 參考電壓為 25V

4 轉換時間為 100μ s〈 CLKf =640kHz〉

5 解析度為 8 位元

6 誤差plusmn 1LSB

7 讀取時間 135ns

36 電源供應系統

本專題中所有電路及硬體設備所需的電源採用交流電源 110V 經由 PT-31

變壓器後再經過橋式整流後提供了直流電源而因為各個電路所需電源不同

因此製作了多組的變壓電路如下

1電壓源 DC5V選擇了 7805 的穩壓 IC 搭配電容得到了+5V 的電壓源

供〈1〉8051 微處理器 〈2〉ADC 0804 〈3〉74LS8674LS12374LS04

74LS02CD4013 〈4〉馬達 Encoder

2電壓源 DC12V使用 7812 穩壓 IC 搭配電容得到+12V 的電壓源供

LM2917 使用

3電壓源 DC24V利用 7824 的穩壓 IC 搭配電容獲得+24V 的直流電壓

源供電路之橋型驅動功率放大之電晶體使用

Vin1

+12V2

GND3

LM7812

2200uF 10000pF 2200uF 10000pF

+12V outputAC

圖 317 直流電源電路

34

圖 318 直流電源電路實體圖

37 馬達轉速的量測

表 33 PWM 輸出對應 encoder 週期

PWM dutycycle encoder 週期 PWM dutycycle encoder 週期

40 sμ 172 sμ 440 sμ 0 sμ

80 sμ 188 sμ 480 sμ 0 sμ

120 sμ 204 sμ 520 sμ 0 sμ

160 sμ 230 sμ 560 sμ 0 sμ

200 sμ 272 sμ 600 sμ 0 sμ

240 sμ 328 sμ 640 sμ 0 sμ

280 sμ 416 sμ 680 sμ 1320 sμ

320 sμ 540 sμ 720 sμ 750 sμ

360 sμ 800 sμ 760 sμ 510 sμ

400 sμ 1320 sμ 800 sμ 400 sμ

35

圖 319 PWM 輸出對應 encoder 週期

由統計可知道此馬達並不是一顆線性馬達故相信若使用模糊控制理論來

作為其回授控制系統的控制器一定能達到比傳統控制器的性能還要好而且若能

在模糊控制裡加上 PID 控制器的觀念一定能在系統的響應時間上升時間

安定時間和超越量達到最佳的控制另一方面馬達在其反方向的內阻較大需

要更大的力量才能使馬達驅動

36

第四章 軟體規劃與製作

41 PWM 之軟體設計

因為之前所介紹的硬體方式是以調整可變電阻來達到轉速的調整因此無法

得知所給予的脈寬長度和轉速大小尤其在回授時也不易給予適當的訊號來調整

轉速因此改良之方法就是以8051之軟體撰寫方式來產生固定的脈寬也就等

於給予轉速的命令而在其回授控制時也只要在內部程式给予適當的指令便可

達到脈寬長度的調整以達到閉迴路之受控系統

411 PWM 軟體流程

設定Timer0模式為0

TH0 = temp 32 TL0 = temp 32

temp = 8192 ndash j4 Key = 0

檢查是否有鍵值

將鍵值存入Key

Yes

No

設定Key值所對應的 j值

If P30 == 1Then P30 = 0 temp = 8192 ndash j4Else P30 = 1 temp=8192ndash880+j4

TH0 = temp 32 TL0 = temp 32

Start Timer0中斷副程式

啟動Timer0

等待Timer0中斷

返回主程式

圖 41 PWM 軟體設計流程圖

37

在此總共設計了五個按鈕分別代表不同的轉速停止正轉〈慢〉正轉

〈快〉逆轉〈慢〉和逆轉〈快〉使用Timer0是因為8051之計時中斷比延遲程

式來的準確故可以達到準確的計時程式設計理念中並沒有將中斷致能清除

因此Timer0會一直處於計時的狀態程式執行時將一邊檢查鍵值〈KeyStatus〉一

邊進行計時當計時完畢便呼叫中斷副程式然後執行改變Port 30的輸出狀

態若是為high則變為low反之若是為low即變為high同時並重設計時時間

Timer0繼續計時

當鍵值改變時計時的時間也會跟著改變如此一來Timer0將ㄧ直重覆上

述動作直到電源切掉Timer0才會停止計時

42 模糊控制之程式規劃與撰寫

本專題目標在完成了先前所規劃的硬體電路之後接著就是要達成利用模糊

控制理論來設計控制器在此採用了單晶片8051目的是為了以硬體實現方式來

代替電腦模擬期望能夠按照原訂計畫完成本專題「具模糊控制理論與雙脈寬調

變法之直流馬達驅動電路設計」

單晶片 8051 模糊控制的程式撰寫採下列幾個步驟依序完成

1 設定變數轉速誤差〈dspeed〉目前轉速〈sspeed〉

2 模糊化採用三角形歸屬函數採用三角形歸屬函數的原因

〈1〉 三角形函數為一連續函數

〈2〉 三角形函數為線性的函數所以計算速度較快

〈3〉 是具有發散也有收斂的函數和指數函數一樣接近

事實

3 模糊推論模糊規則將其所有可能發生情況以 IFhellipTHENhellip表示

並建立控制規則表

4 解模糊化採用重心法

38

421 歸屬函數

設定變數為目前轉速〈sspeed〉與轉速誤差〈dspeed〉因此此模糊控制器共

有兩個輸入訊號與一輸出訊號輸出訊號為脈寬長度該加或是減多少又因為有

五種不同的轉速因此各分別設計了不同的歸屬函數如下

1 當轉速 = 0

ml h

s s p e e d

d s p e e d

r p m0 5 0 1 0 0- 5 0- 1 0 0

mv l l h v h

r p m0- 3 0- 6 0- 1 0 0 3 0 6 0 1 0 0 圖 42 停止時之歸屬函數

2 正轉〈慢〉

ml hsspeed

dspeed

rpm150 225 300750

mvl l h vh

rpm150100500 200 250 300

圖 43 正轉〈慢〉之歸屬函數

39

3 正轉〈快〉

ml hsspeed

dspeed

rpm520 670 820370220

mvl l h vh

rpm500400300200 600 700 800

圖 44 正轉〈快〉之歸屬函數

4 逆轉〈慢〉

ml hsspeed

dspeed

rpm100 250 400500

mvl l h vh

rpm10050250 200 300 400 圖 45 逆轉〈慢〉之歸屬函數

40

5 逆轉〈快〉

ml hsspeed

dspeed

rpm300 450 600150

mvl l h vh

rpm450350250150 550 650 750

750

圖 46 逆轉〈快〉之歸屬函數

6 輸出

OutputMVL L H VH

rpm0-50-150-250 50 150 250

圖 47 輸出之歸屬函數

41

422 模糊規則庫

表 41 為吾人所設計的模糊控制規則庫並利用 Matlab 之 Fuzzy ToolBox 來

建立此規則庫以進行模擬推論圖 48 為當馬達輸入指令為正轉慢時推論後所得

到的三維空間圖

表 41 模糊控制規則表

Dspeed

vl l m h vh

l H M L VL VL

m VH H M L VL sspeed

h VH VH H M L

圖 48 推論後的三維空間圖

42

423 模糊控制器之軟體設計流程

Start 外部中斷副程式

ADCWR = 0 ADCWR = 1

〈令AD開始轉換〉

檢查鍵值以得到對應的歸屬函數

取得目前轉速與

轉速誤差

Fuzzy Rules決策

得到輸出訊號

Delay 10ms

ADC = 0 讀取AD值 ADCRD = 0

將AD值換算成轉速

ADCWR = 0 ADCWR = 1

〈AD開始轉換〉

返回主程式

致能外部中斷

圖 49 Fuzzy Controller 程式流程圖

當控制器一開始動作時便先執行AD轉換的工作當AD轉換完成時其

INTR的接腳便會觸發8051的外部中斷INTR0於是程式便發生外部中斷執行

外部中斷副程式的指令

43

在外部中斷副程式中AD將ㄧ直進行轉換與讀取的工作同時並將轉換後

的值直接換算成目前轉速與轉速誤差以供模糊控制器使用換算目前encoder

的頻率其公式為

160-V2000 times=頻率 〈4-1〉

式4-1之公式是根據表31所導出來的其中V為encoder之頻率轉成電壓之值

又假設所讀取的AD轉換值為value因為

AD的解析度 = bit256

5V+ = 511 ( Vbit ) 〈4-2〉

故value值與電壓V之關係為

511 value V times= 〈4-3〉

所以encoder之頻率與value值的關係為

頻率= 2000times ⎟⎠⎞

⎜⎝⎛ times

511 value - 160 〈4-4〉

故目前轉速為

sspeed = ( )rpm 60 200

times頻率 〈4-5〉

另ㄧ方面在主程式中程式會先去檢查鍵值也就等於檢查輸入指令以

找出符合使用的歸屬函數並將AD所獲得的轉速對應到歸屬函數中然後執行

決策判斷即進入規則庫中尋找出適當的決策判斷最後將此決策送入PWM程

式裡進行脈寬長度的調整使馬達在合理的要求下達到理想的轉速控制不會

因為外在環境的影響而使馬達轉速受到干擾

43 LCD 顯示轉速

此專題最後再增加一LCD顯示幕以顯示目前的轉速否則在程式設計完成

後人卻因無法以肉眼得知目前轉速而不能肯定馬達轉速是否有達到控制的目

標因此增加一顯示幕LCD是有必要的不僅隨時得知目前的轉速還能知道

44

設計出來的軟體其控制性是否夠好夠穩定

431 LCD 顯示幕之軟體流程

Start

設定LCD模組的初始狀態

設定外部中斷INTR0

與Timer0

設定TH0 = (65536 ndash 5000) 256 TL0 = (65536 ndash 5000)256

令ADCWR = 0 ADCWR = 1 AD開始轉換

等待中斷

外部中斷副程式

ADCRD = 0 讀取AD值 ADCRD = 1

將AD值換算成速度

ADCWR = 0 ADCWR = 1 AD開始轉換

Timer0中斷副程式

顯示LCD第一行

ldquoMotor Speed =

顯示LCD第二行ldquoxxxxxxx rpm其中 xxxxxx為外部中斷副程式所換算出的轉速

重設TH0與TL0

返回主程式返回主程式

圖 410 LCD 顯示幕之程式流程圖

此程式主要由兩個部分完成一為外部中斷副程式另ㄧ為 Timer0 中斷副

程式當主程式完成外部與 Timer0 兩個中斷的設定後隨即命令 AD 開始轉換

之後便一直停在 while〈1〉的迴圈裡不做任何動作而由兩個中斷副程式來完

成整個轉換與顯示的工作

45

外部中斷副程式主要負責 AD 的轉換讀取與轉速換算的工作AD 第一

次的轉換由主程式來下達命令當轉換完成後AD 的 INTR 接腳將觸發外部中

斷〈INTR0〉副程式此時程式便進入外部中斷副程式執行讀取 AD 值與轉速

換算的工作當這些工作完成時外部中斷副程式再次下達 AD 開始轉換的命

令而離開中斷副程式當 AD 再次轉換完成時又將再次執行中斷副程式

如此週而復始中斷副程式將ㄧ直進行讀取換算與轉換的工作

而 Timer0 中斷副程式主要負責 LCD 顯示之工作當主程式所設定的計時時

間計數完時程式便進入 Timer0 中斷副程式一旦進入 Timer0 中斷副程式程

式將執行 LCD 的顯示然後再重設 Timer0 的計數時間Timer0 將重新計數當

計數完時程式又將再度進入 Timer0 中斷副程式執行因為程式中並無清除

Timer0 的中斷致能故 Timer0 中斷副程式和外部中斷副程式ㄧ樣週而復始的

執行其副程式的工作

46

第五章 結論

本計劃主旨為具模糊控制理論與雙脈寬調變法之直流馬達驅動電路設計主

要是針對傳統電路設計之缺點提出改良之方法以TPWM取代PWM電路以模

糊理論基礎設計之控制器替代傳統PID控制器

TPWM轉速控制優於PWM之處在於

1 TPWM只需使用單電源即可達到正轉和逆轉的轉速控制而PWM必須

加上逆向開關或是雙電源才能使馬達產生正轉和逆轉

2 TPWM可控制馬達處於停止狀態無論在正向或逆向加上負載皆無法使

馬達產生轉動

3 馬達消耗定額功率輸出轉矩為額定值

4 馬達由停止到某定轉速時反應時間較快

模糊控制器優於PID控制器

1 不須導出繁雜的數學模型

2 適用於非線性系統

3 強健性與容錯性較高

本專題至此雖說大致的目標都已達到但是此系統仍然有許多不完美而需要

改進的地方例如在實驗過程中發現整個轉速的控制在回授上其反應時間

有點慢探討其原因有可能是控制器之程式上的問題

1 因為使用C語言撰寫程式故其執行速度較慢

2 程式可能寫的太累贅

3 模糊控制規則庫建立不良

若想改善這些問題可以嘗試著將C語言改為組合語言來撰寫並盡量減少

47

不必要的指令相信此動作一定能大大提昇程式的執行速度其次就是多做測

試利用測試中所學到的經驗來幫助模糊控制規則庫的改寫同時也能從測試中

發現更多的問題若是都能對問題加以一一解決的話相信必定能將此控制系統

做的更盡善盡美

48

參考文獻

﹝1﹞ 李適中直流馬達速度控制伺服控制〈基礎篇〉全華科技圖書股份有

限公司民 74

﹝2﹞ 廖錦文ldquo直流電動機之雙脈寬調變是〈TPWM〉驅動電路研究電

子技術月刊第 69 期pp94-1021992

﹝3﹞ 楊英魁孫宗瀛鄭魁香林建德蔣旭堂模糊控制理論與技術全華

科技圖書股份有限公司民 85

﹝4﹞ 林敦煌陳憬德直流馬達定位及轉速的模糊控制逢甲大學自動控制工

程學系學士論文民 87

﹝5﹞ LAZadehldquo Fuzzy Sets Information and Control Vol8 pp338-353

1965

﹝6﹞ EHMamdani and SAsslianldquo A fuzzy logic controller for a dynamic

plant Internation Journal of Man-Machine Studies Vol7 pp1-13 1975

﹝7﹞ 孫宗瀛楊英魁Fuzzy 控制理論實作與應用全華科技圖書股份有

限公司民 83 年

﹝8﹞ 許中平黃煌嘉直流電動機控制電路設計全華科技圖書股份有限公司

民 75

﹝9﹞ 盧明智黃敏祥OP Amp 應用+實驗模擬全華科技圖書股份有限公司

民 83

﹝10﹞陳文耀電動機控制工程復文書局2003

﹝11﹞許中平林全福電動機運轉控制技術全華科技圖書股份有限公司民

77

﹝12﹞楊明豐8051 單晶片 C 語言設計實務碁峯資訊2003 年

﹝13﹞蔡朝洋單晶片微電腦 80518951 原理與應用全華科技圖書股份有限公

司民 91

49

﹝14﹞王文俊認識 Fuzzy全華科技圖書股份有限公司民 90

50

附錄 A 專題硬體展示圖

圖 A-1 硬體整體圖

圖 A-2 硬體整體鳥瞰圖

51

圖 A-3 硬體側視圖

圖 A-4 操作與顯示面板

圖 A-5 間距脈波電路與 FV 電路

52

圖 A-6 橋型驅動功率放大電路

圖 A-7 操作與控制面板

53

附錄 B PWM 與模糊控制之程式

include reg51h include stdioh sbit ADCRD = P3^1 設定 RD 控制線接腳為 P31 sbit ADCWR = P3^3 設定 WR 控制線接腳為 P33 sbit P2_0 = 0xA0 接腳定義 sbit P2_1 = 0xA1 接腳定義 sbit P3_0 = 0xB0 接腳定義 sbit P3_1 = 0xB1 接腳定義 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P3_6 = 0xB6 接腳定義 void KeyStatus(void) 函數原型宣告 void feedback(void) 函數原型宣告 void compute_grade(void) 函數原型宣告 void delay1ms(int count) 函數原型宣告 void convert() 函數原型宣告 void condition() 函數原型宣告 void CW(void) 函數原型宣告 int j i 對應 PWM 的寬度 unsigned int temp 所設計的計時器時間 int sample = 1000 取樣率設定消除顯示值跳動 long int value r1 讀取 ADC0804 數位資料 long int set n condition select long int r grade_reg[2] grade[15] error1 error2 long int a1 b1 I long int membership[5][3]membership1[3][3] 定義歸屬函數 long int membership2[3][3] = -10-50-5050510 long int error[2] int Rule[15][3] = 113213313 定義判斷規則庫 212223323 311232333 411241342 511251351

54

main() 主程式 j = PWM = 110 設定 PWM 初始值 IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x00 設定計時器 0 工作於模式 0 temp=8192-j4 設定計時器 0 初值 TH0 = temp 32 TL0 = temp 32 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 P3_4 = 1 P3_5 = 0 P3_6 = 0 ADCWR = 0 令 ADC0804 的 WR = 0 ADCWR = 1 令 ADC0804 的 WR = 1 while (1) KeyStatus() 檢查鍵值 void KeyStatus(void) 檢查鍵值並給對應的 PWM 值 char KeyScan(void) 按鍵掃描函數宣告 unsigned char KeyStatus unsigned char Key = 0 KeyStatus=KeyScan() 呼叫按鍵掃描函數 if (KeyStatus = 0) 已有按鍵輸入 Key = KeyStatus Key = 鍵值 if (Key == 0x01) 假如輸入為按鍵 1 i = 110 PWM 為 110us j = i P3_4 = 1 LED 亮第一顆〈表馬達停止〉 P3_5 = 0 P3_6 = 0

55

else if (Key == 0x02 ) 假如輸入為按鍵 2 i = 140 PWM 為 140us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x04 ) 假如輸入為按鍵 3 i = 180 PWM 為 180us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x08 ) 假如輸入為按鍵 4 i = 80 PWM 為 80us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 else if (Key == 0x10 ) 假如輸入為按鍵 5 i = 40 PWM 為 40us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 PWM = j delay1ms(10) 呼叫延遲函數 feedback() 模糊控制判斷

56

void To_int(void) interrupt 1 Timer0 中斷函數 if (P3_0 == 0) 假如 PWM 輸出為 Low P3_0 = 1 變更 PWM 輸出為 High temp=8192-j4 設定 High 的時間 else 若 PWM 輸出為 High P3_0 = 0 變更 PWM 輸出為 Low temp=8192-880+j4 設定 Low 的時間 TH0 = temp 32 Timer0 的計時時間 TL0 = temp 32 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 char KeyScan(void) 檢查鍵值 char KeyStatus 按鍵狀態 P0=0xff 設定 P0 為輸入模式 KeyStatus=~P0 讀取按鍵狀態 return(KeyStatus) 將鍵值送回程式 void feedback(void) 模糊判斷 void Fuzzycontroller() 函數原型宣告 void condition1() 函數原型宣告

57

void condition2() 函數原型宣告 error1 = ((value)40-160)03 輸入變數 1 delay10ms(10) 延遲 10ms error2 = ((value)40-160)03 輸入變數 2 if (key == 0x01 ) 當按鍵 1找出對應的歸屬函數 並做出模糊控制判斷

int membership[5][3]= -100-60-30-60-300-30030030603060100

int membership1[3][3]=-100-500-50050050100 Fuzzycontroller() condition() if (key == 0x02 ) 當按鍵 2找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

05010050100150100150200150200250200250300 int membership1[3][3]=07515075150225150225300 Fuzzycontroller() condition() else if (key == 0x04) 當按鍵 3找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

200320400300400500400500600500600700600700800 int membership1[3][3]=220370520370520670520670820 Fuzzycontroller() condition() else if (key == 0x08) 當按鍵 4找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

02550255010050100200100200300200300400 int membership1[3][3]=05010050100250100250400 Fuzzycontroller() condition()

58

else if (key == 0x10) 當按鍵 5找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

150250350250350450350450550450550650550650750 int membership1[3][3]=150300450300450600450600750 Fuzzycontroller() condition2() void Fuzzycontroller() 模糊控制判斷 void compute_grade() 函數原型宣告 void compute_grade1() 函數原型宣告 a1 = 0 b1 = 001 I = 0 for (n=0 nlt=14 n++) r = error1 set = Rule[n][0]-1 compute_grade() 計算輸入變數 1 與

模糊程度的歸屬函數 condition = 1 r = error2 set = Rule[n][1]-1 compute_grade1() 計算輸入變數 2 與 模糊程度的歸屬函數 grade[n] = MIN(grade_reg[0] grade_reg[1]) a1 = a1 + (grade[n]membership2[Rule[n][2]-1][1]) b1 = b1 + grade[n] I = a1 b1 得到模糊控制判斷的結果 void compute_grade() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership[set][0]) || (r gt membership[set][2])) 當輸入變數不在 歸屬函數內

59

grade_reg[condition] = 0 else if ((r gt membership[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership[set][2]-r) (membership[set][2] - membership[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership[set][0]) (membership[set][1] - membership[set][0]) void compute_grade1() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership1[set][0]) || (r gt membership1[set][2])) 當輸入變數不在 歸屬函數內 grade_reg[condition] = 0 else if ((r gt membership1[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership1[set][2]-r) (membership1[set][2]-membership1[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership1[set][0]) (membership1[set][1]-membership1[set][0])

60

void condition() P2_0 = 1 設定 P20 為輸入模式 P2_1 = 1 設定 P21 為輸入模式 if ( (P2_0 == 1) ampamp (P2_1 == 0)) 當馬達為正轉時 if ( I gt 0 ) 若模糊判斷結果為正 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 若模糊判斷結果為零 PWM = PWM + 0 PWM 寬度不變 if ( I lt 0 ) 若模糊控制結果小於零 PWM = PWM + 1 PWM 寬度加 1 else if ( (P2_0 == 0) ampamp (P2_1 == 1) ) 若馬達為反轉 if ( I lt 0 ) 模糊控制小於零 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 模糊控制等於零 PWM = PWM + 0 PWM 寬度不變 if ( I gt 0 ) 模糊控制大於零 PWM = PWM + 1 PWM 寬度加 1 CW() 判斷 PWM 寬度上下限

61

void CW() 判斷 PWM 寬度上下限 if ( PWM gt= 215 ) 若 PWM 寬度 gt= 最大寬度 j = 215 PWM 寬度維持於 215us if ( PWM lt= 5 ) 若 PWM 寬度 lt= 最小寬度 j = 5 PWM 寬度維持在 5us if ( PWM gt 5 ampamp PWM lt 215 ) PWM 寬度介於最大與最小間 j = PWM PWM 依模糊控制判斷結果增減 void delay1ms(int count) 延遲 1ms int x y for ( x = 0 x lt count x++ ) for ( y = 0 y lt 122 y++ ) void convert() 數位資料換算成馬達轉速 r1 = ((value)40)-160

62

附錄 C LCD 顯示之程式

includereg51h 含 8051 所有暫存器宣告 include mathh define RS P3_5 LCD 指令資料選擇控制 define RW P3_4 LCD 讀寫控制腳 define Enable P3_3 LCD 致能接腳 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P0_0 = 0x80 接腳定義 sbit P0_1 = 0x81 接腳定義 sbit P0_2 = 0x82 接腳定義 sbit P0_3 = 0x83 接腳定義 sbit P0_4 = 0x84 接腳定義 sbit P0_5 = 0x85 接腳定義 sbit P0_6 = 0x86 接腳定義 sbit ADCRD = P3^7 設定 RD 控制線接腳為 P37 sbit ADCWR = P3^6 設定 WR 控制線接腳為 P36 void delay(void) 函數原型宣告 void delay10ms(int count) 函數原型宣告 void display(void) 函數原型宣告 void InitialLCD(void) 函數原型宣告 void WriteIns(char) 函數原型宣告 void WriteData(char) 函數原型宣告 void WriteString(charchar) 函數原型宣告 void CheckBusy(void) 函數原型宣告 void convert(void) 函數原型宣告 char MSG0[] = Motor Speed = 定義字串 MSG0 char MSG2[] = rpm 定義字串 MSG2 unsigned char MSG1[8]=0000000 定義字串 MSG1 unsigned long int value 讀取 ADC0804 數位資料 int sample = 1000 取樣率設定消除顯示值跳動 long int rpm

63

main() 主程式 InitialLCD() 初始化 LCD IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x01 設定計時器 0 工作於模式 1 TH0 = (65536-5000)256 設定計時器 0 初值 TL0 = (65536-5000)256 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 while(1) 等待中斷 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 while (--sample == 0) 取樣率減 1 sample = 1000 重設取樣率 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 void T0_int(void) interrupt 1 LCD 顯示動態掃描 display() 動態掃描顯示 TH0 = (65536-65535)256 重設計時初值 TL0 = (65536-65535)256

64

void InitialLCD(void) 設定 LCD 模組初始狀態 delay() 延遲函數 WriteIns(0x38) 設定 LCD 模組為 WriteIns(0x38) 2 行顯示 WriteIns(0x38) 8 位元介面 WriteIns(0x38) 5x7 點字型 WriteIns(0x08) 關閉顯示器 WriteIns(0x01) 清除 LCD 螢幕 WriteIns(0x0c) 令顯示器 ON但游標不顯示 WriteIns(0x06) 令 LCD 模組每接收到 1Byte 資料 AC 值自動加 1 void display() 掃描顯示 WriteIns(0x80) 設定 LCD 座標 WriteString(13MSG0) 將字串 MSG0 寫入 LCD 中 WriteIns(0xc0) 設定 LCD 座標 WriteString(8MSG1) 將字串 MSG1 寫入 LCD 中 WriteIns(0xc8) 設定 LCD 座標 WriteString(4MSG2) 將字串 MSG2 寫入 LCD 中 void convert(void) 換算轉速 long int freq freq = ((value)4000) - 16000 數位資料換成頻率公式 rpm = freq3 頻率換算轉速公式 MSG1[0] = (rpm1000000)+0x30 將結果存入字串 MSG1 中 MSG1[1] = ((rpm1000000)100000)+0x30 MSG1[2] = ((rpm100000)10000)+0x30 MSG1[3] = ((rpm10000)1000)+0x30 MSG1[4] = 0x2e MSG1[5] = ((rpm1000)100)+0x30 MSG1[6] = ((rpm100)10)+0x30 MSG1[7] = rpm10+0x30

65

void WriteIns(char instruction) 寫命令至 LCD 中 RS = 0 選擇指令暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = instruction 輸出命令至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteData(char i) 寫資料至 LCD 中 RS = 1 選擇資料暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = i 輸出資料至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteString(countMSG) 寫字串至 LCD 中 char count 字串長度 char MSG[] 字串資料 char i 定義位元組變數 for(i=0 iltcount i++) count 個位元組 WriteData(MSG[i]) 寫入一位元組的資料至 LCD 中 void CheckBusy(void) char i=0x80 檢查忙碌旗標 while(iamp0x80) 忙錄旗標 BF = 1 RS = 0 選擇指令暫存器 RW = 1 讀取 Enable = 1 致能 LCD i = P2 讀取 LCD 指令暫存器內的資料

66

Enable = 0 除能 LCD delay() 延遲函數 void delay() 延遲 5ms int i for(i=0 ilt250 i++)

  • 畢業專題封面pdf
  • File0004pdf
  • 最終版pdfpdf
Page 10: Based on Fuzzy Control Theorem and TPWM Method for DC ... · 使吾人想設計一模糊控制器來做為馬達轉速的閉迴路控制,以解決非線性系統的 問題。除此之外,flcs

1

第一章 緒論

11 前言

在現代的工程應用裡馬達扮演一個非常重要的角色它在機械設備中就好

像人的心臟一樣提供了機械運轉所需要的動力源以做為能量轉換或控制機能

的實行在眾多的馬達種類當中直流馬達不僅具有許多良好的特性例如高

啟動轉矩較易線性控制hellip等且其週邊控制元件充足控制理論發展成熟所

以被廣泛的應用在工業日常生活上馬達的速度控制被廣泛的應用在各種加工

機械航空機械農業機械交通工具等用途

直流電動機之轉速控制目前最常被使用的一種方法為脈波寬度調變〈PWM〉

驅動電路並結合傳統的 PID 控制器脈寬調變是一種以固定的頻率波寬可

調的輸出開閉供應的直流電壓使馬達感受到的平均電壓可以調整進而控制馬

達的轉速

我們日常生活中處處存在著非線性的現象但是我們較熟悉處理的卻是線

性的系統對於傳統 PID 控制器來說必須先知道受控系統〈plant〉的數學模

型否則無法導出其控制演算法則且其強健性與容錯性較低然而對於非線性

系統則不適合此法因此近年來對於非線性系統的研究工作已有許多學者嘗試

應用模糊理論〈Fuzzy Theory〉類神經網路〈Artificial Neural Networks〉基因

演算法〈Genetic Algorithms〉等非傳統方法且已有不錯之成效因此以模糊控

制理論之方法取代傳統的 PID 控制器來控制馬達轉速

對於一個非線性時變系統〈Nonlinear Time Variant System〉模糊控制理論

不但能簡化數學模型並且可以結合人類的操作經驗有效的達成控制目標模

糊控制能將操作者的專家經驗換成控制器設計人員的設計理念勢必擁有比一般

傳統的控制器更加的強健性與容錯性

2

12 研究動機

現今直流馬達的轉速控制多廣泛使用脈波寬度調變式〈Pulse Width

Modulation簡稱 PWM 驅動電路〉此種電路是以控制固定頻率的開閉供應直流

電壓以得到波寬可調的輸出使馬達的平均電壓可以調整進而轉移到馬達的

平均功率而達到轉速的控制但是由於 PWM 為一種單象限控制只運作於第一

象限這種系統本身無法產生負轉矩未加上逆向開關前亦無法反向因此無法

作用於第三象限系統加上動力制動後方可以有限度地產生逆向轉矩而運作於

第二象限〈見圖 11〉然而這也只是一種被動控制區間﹝1﹞

主動控制區動力制動

(被動運作)

Ⅱ Ⅰ

Ⅲ Ⅳ

ω

TCWCCW

圖 11 單象限控速系統運作於第一象限

本研究主要目的之一就是針對 PWM 之缺失提出了改良的方法於前級驅

動電路產生正反方向的兩個脈波信號再經驅動功率放大之後使馬達產生正

反轉向的兩拉力此即為雙脈波寬度調變式(Two Pulse Width Modulation簡稱

TPWM)本控制主要特色不論電動機正轉反轉速度快慢或停住均消

耗定額功率〈即馬達無時無刻都在運轉且輸出轉矩為額定值〉系統於寬廣的

速度變化範圍內仍具有良好的伺服性能馬達的旋轉扭力不會因速度及負載的

變化而受影響使伺服控制系統達到某一預定的特性範圍﹝2﹞

3

此外馬達的轉速會因其驅動機構的慣性影響不可能「說停就停」也

會因為摩擦力等影響不可能「說動就動」故對其操控指令一定會有延遲的

現象發生這些因素使馬達不是一個典型的線性系統故傳統的 PID 控制器就

不是最好的選擇再加上近年來模糊控制系統〈Fuzzy Logic Control System

FLCS〉的發展﹝3﹞使吾人想設計一模糊控制器來做為馬達轉速的閉迴路控

制以解決非線性系統的問題除此之外FLCS 在上升時間安定時間和超

越量上的要求也都優於傳統的 PID 控制器[4]

目前雖然有很多從事於馬達轉速控制的相關研究但是多採用脈波寬度調

變法且其尚有缺失待改良因此吾人想採用雙脈波寬度調變雖然有關此法

的研究並不多見但 TPWM 卻具有 PWM 所沒有的優點再加上近來發展愈

盛的模糊控制理論較傳統 PID 控制器的優點相信馬達轉速以 TPWM 驅動電

路之模糊控制是值得去加以研究和探討的

13 研究方法

本專題計畫其研究方法主要分為兩大類一為硬體結構電路設計另一為

Fuzzy 控制器之軟體製作硬體結構方面主要設計一比較放大器使其誤差值經

此電路與三角波比較而輸出 A 驅動信號脈波與 B 驅動信號脈波然後再由驅動

功率放大電路將信號脈波放大後控制馬達正逆轉此外為了確保功率放大電

路之安全性需在其之前加上一間距產生電路以防止其電路損毀

感測器方面則利用編碼器〈encoder〉感測出馬達的轉速然後再經由 FV

將其轉換為電壓此電壓再由 AD 轉換為數位信號送入單晶片 8051經由模

糊控制規則庫判斷並做出決策以達到馬達轉速的控制

4

14 研究目標

本專題研究目標如下

〈1〉 完成相關文獻資料之蒐集整理與討論

〈2〉 完成 AB 信號產生電路設計

〈3〉 完成間距脈波產生電路設計

〈4〉 完成驅動功率放大電路設計〈橋型驅動功率放大〉

〈5〉 完成 FV 電路設計

〈6〉 完成 AD 訊號轉換

〈7〉 編寫模糊控制法則與介面軟體設計

5

第二章 原理探討

21 模糊控制與理論

在傳統的控制領域裏控制系統動態模式的精確與否是影響控制優劣的最主

要關鍵系統動態的資訊越詳細則越能達到精確控制的目的然而對於複雜

的系統由於變數太多往往難以正確的描述系統的動態於是工程師便利用各

種方法來簡化系統動態以達成控制的目的但卻不盡理想換言之傳統的控

制理論對於明確系統有強而有力的控制能力但對於過於複雜或難以精確描述的

系統則顯得無能為力了因此便嘗試著以模糊數學來處理這些控制問題模糊

控制是屬於非線性式的控制在受控系統無法以線性數學模式精確描述的情況

下經由適當調整控制規則應具有比傳統控制方法更佳的控制性能

211 模糊理論概述

1965 年美國加州柏克萊分校的 LotfiAZadeh 教授首先在他主編的

「Information and Control」刊物上提出「Fuzzy Set」論文此為模糊邏輯理論的

創始模糊理論在經過了三十幾年的演化改進後無論是在應用或理論架構上

皆已日趨完備尤其近年來因人工智慧的迅速發展模糊理論儼然成為人工智慧

不可或缺的理論根基

Zadeh 教授曾提出一個互克性原理﹝5﹞「當系統的複雜性增長時對系統

特性做精確且有意義描述的能力亦相對降低最後精確性與有意義性將變成完全

互相排斥的特性」很高的複雜性意味著只能在一個刻意壓縮的低維因素空間觀

察而無法對問題的全部因素都進行考察使得原本是明確的概念變的模糊

Fuzzy 理論正是為了掌握這類具模糊特質的事物而發展出來的所以它的應用較

偏重於人類的經驗及對問題特性的掌握程度不主張用繁雜的數學分析及數學模

式來解決問題

Fuzzy 理論把傳統數學從二值邏輯〈binary logic〉擴展到連續多值〈continuous

6

multi-value〉利用歸屬函數〈membership function〉描述一個概念的程度亦及

使用 0 和 1 之間的數值來表示一個元素屬於某一概念的程度這個值稱為元素對

集合的歸屬度〈membership grade〉當歸屬度為 1 時表示該元素百分之百屬於

這個概念當歸屬度為 0 時則表示該元素完全不屬於這個概念介於兩者之間

的就是完全屬於和完全不屬於之間的灰色地帶

模糊理論的工程應用大約始於 1974 年倫敦大學的 EHMamdani 教授他根

據 Zadeh 提出的語言分析法〈linguistic approach〉及模糊推論〈fuzzy inference〉

運用 IF-THEN 形式的法則來敘述操作員的控制策略成功地應用在蒸汽機自動

運轉上﹝6﹞從此模糊理論的應用便迅速發展以在控制方面的研究成果最為

顯著模糊理論其實是一門相當生活化的學問由於使用語言變量描述因此更

具親和力與一般性人類日常生活所遇所用的一些敘述即大都是模糊的例如

那個人ldquo很高車開的ldquo很快等等其中ldquo很高ldquo很快並不是一個

明確值而只是描述事件的程度但是根據這些描述人類卻能很輕易的接收

212 模糊集合

模糊集合〈fuzzy set〉可視為傳統集合的擴張在模糊集合的世界中稱傳

統集合為明確集合〈crisp set〉所謂模糊集合是指用來表示界限或邊界不分明的

模糊概念的集合許多日常生活中的概念常常都不是清晰明確的這些可說是模

糊概念例如很高很快等這類概念無法用傳統的二值集合論即 0 或 1 表示

而Zadeh教授提出的Fuzzy集合論可以將這些概念由傳統集合論的特徵函數從非

0 即 1 的二值選擇推廣為從 0 到 1 之間的任何值做選擇得到新型的特徵函數

稱為歸屬函數

模糊集合由歸屬函數表示相對於明確集合的特徵函數其值只有 0 或 1 兩個

值即其值為在實軸閉區間[01]之中的任一實數模糊集合可以彌補明確集

合描述時所產生的不合理現象因此模糊集合比傳統的明確集合更具客觀性

7

213 歸屬函數

歸屬函數〈membership function〉為 0 到 1 之間的數值吾們可以藉由歸屬

函數來描述 Fuzzy 集合的特質它是 Fuzzy 理論的最基本觀念透過歸屬函數我

們才能對 Fuzzy 集合進行量化也才可能利用精確的數學方法分析處理模糊性資

歸屬函數在 Fuzzy 控制的應用範疇內都要具備凸〈convex〉及正規〈normal〉

等基本特性〈如圖 21〉歸屬度函數的定義可以分為數值及函數兩種數值定義

方式又稱為離散化歸屬函數它是直接給定有限 Fuzzy 集合內每個元素的歸屬

度並以向量的形式表現出來函數定義方式又稱為連續化歸屬函數它是以不

同形式的函數來描述 Fuzzy 集合

圖 211 正規且凸模糊集合

1

0 圖 212 正規非凸的模糊集合

8

一個模糊集合的歸屬函數可以有許多方式但是目前最廣泛使用的有吊鐘

型三角型梯型等歸屬函數

〈1〉吊鐘形歸屬函數

吊鐘形歸屬函數定義如下

μA=bell(xabc)= b

acx 2

1

1minus

+

〈21〉

圖 22 吊鐘型歸屬函數

〈2〉三角形歸屬函數

三角形歸屬函數可由三個參數(abc)來加以決定

=Aμ trangle(xabc)

⎪⎪⎪

⎪⎪⎪

ltleminusminus

ltleminusminus

=

other

cxbcbcx

bxaabax

0

〈22〉

其中a為歸屬函數左邊界b為歸屬函數中心值c為歸屬函數右邊界

9

圖 23 三角型歸屬函數

〈3〉梯型歸屬函數

梯型歸屬函數可由四個參數加以決定

=Aμ trapezoid(xabcd)

⎪⎪⎪⎪

⎪⎪⎪⎪

leleminusminus

ltle

ltleminusminus

=

other

dxcdcdx

cxb

bxaabax

0

1 〈23〉

圖 24 梯型歸屬函數

10

214 模糊推論與模糊規則

模糊推論〈fuzzy inference〉是根據知識庫保存的規則(rule)和給予的事實

推導出新的結論與傳統推論不同的地方是Fuzzy推論不只可以處理明確命題也

可以處理Fuzzy命題Fuzzy推論是依據近似推理〈approximate reasoning〉的概念

發展出來的比傳統推論的嚴正推理〈exact reasoning〉更合理也更具彈性近

似推理是兩種嚴正推理General Modus Ponens〈簡稱GMP〉及Genera Modus

Tollens〈簡稱GMT〉的一般化此原理是從傳統二值邏輯中的肯定律〈modus

ponens〉和否定律〈modus tollens〉推廣而來其中GMP又可稱為前向推理而

GMT則可稱為反向推理

〈1〉 GMP〈General Modus Ponens〉

規則IF x is A THEN y is B

事實x is Arsquo

結論y ix Brsquo 〈24〉

〈2〉 GMT〈General Modus Tollens〉

規則IF x is A THEN y is B

事實y is Brsquo

結論x is Arsquo 〈25〉

上式中IF x is A THEN y is B即為模糊規則〈fuzzy rules〉AArsquoBBrsquo

分別是定義在論域X及Y的模糊集合xy代表輸入變數及輸出變數的語言變數

一般來說「x is A」稱為前件部〈antecedent〉而「Y is B」則稱為後件部

〈consequence〉Fuzzy知識庫〈Fuzzy Knowledge Base簡稱FKB〉即由這些模

糊規則所組成的規則庫〈rule base〉和存放描述領域知識的Fuzzy變數及語言變數

的資料庫〈data base〉所組成所以FKB是用來描述受控對象所涉及的領域知

11

識和操控目標的一些定性及定量的資訊模糊知識庫和模糊推論是構成Fuzzy規

則系統核心的兩個重要部門﹝7﹞

模糊推論是模糊系統的核心根據知識庫的模糊法則進行模糊理論的合成運

算來模擬人類的思考決策模式一般來說規則的建立是採取十分主觀直覺的

方式依據相關領域專家的經驗與知識透過詢問進而將其知識經驗歸納條列出

重點再轉換成模糊規則的形式表現出來但是並非所有的專家或操作員都能

將自身的經驗知識以言詞的方式充分的表達出來且未必能整理成條列的模糊規

則所以知識規則的萃取工作往往是在建構模糊系統時最常遭遇到的困難之

215 模糊控制器

模糊控制是智慧型控制〈intelligent control〉系統的一種典型其基本特點

是不完全依賴受控對象的數學模型主要是利用人的操作經驗知識和推理技

術以及控制系統的某些訊息和性能得出對應的控制動作模糊控制是以並行

〈parallel〉方式處理規則的推理工作〈如圖25〉其近似推理會包容每個對操

控系統有貢獻的規則即使某些貢獻程度很小的規則也不會忽略

圖 25 模糊控制系統的構造

12

一個控制器的輸入通常是確定數值而非模糊輸出也是如此才能對被控對象

發生作用但是模糊邏輯控制器〈Fuzzy Logic Controller簡稱FLC〉則是以語

言化的控制規則為主體為了能夠把輸入的確定值與語言化之後的控制規則結

合必須把輸入的確定值模糊化〈fuzzification〉以便對應到FLC語言變數的論

域範圍中同樣的經過規則庫推理出來的結果是對應到輸出語言變數的論域

中所以也必須對其做解模糊化〈defuzzification〉的工作才能達成實際的控制

目標

一般模糊控制器的架構包含了五個主要部分定義變數模糊化知識庫

模糊推論及解模糊化

〈1〉 定義輸入及輸出變數

決定程序被觀察的狀況及考慮控制的動作輸入變數可以是擷取

自受控系統的觀測量也可以是推導出來的資料輸出變數則為操控

受控系統的操作量例如在一般控制問題上輸入變數通常為輸出

誤差e與輸出誤差之變化率e而控制變數則為下一個狀態之輸入

u其中eeu統稱為模糊變數

〈2〉 模糊化

將量測值轉換為語言變數的過程將外界所輸入的確定數值經由

一比例映射傳送到輸入變數所對應的模糊論域然後再利用模糊化

函數將此輸入資料轉換成適當的口語值以供模糊運算使用此口語

化變數稱之為模糊子集合

〈3〉 知識庫

模糊知識庫是模糊控制的依據由它來定義所有使用到的語言控

制法則及相關各項參數知識庫可說是整個控制系統資料核心其包

含了兩個部分資料庫〈data base〉與規則庫〈rules base〉

1 資料庫

提供處理模糊數據之相關定義資料庫所存放的資料是關

13

於如何將明確的資料轉換成模糊數值而資料的存放方式是以

歸屬函數表示該選用哪一種歸屬函數依實際的需要選定

以三角形歸屬函數最常被使用因其運算最為容易且又能充分

的表達模糊概念

2 規則庫

利用語言化的條件式控制規則描述控制目標和策略通常

控制規則可以由操控人員的經驗或專家的知識推導出來多個

控制規則所組成的集合就是規則庫

〈4〉 模糊推論

模糊推論為模糊控制最重要的核心其最主要的工作就是做實際

的決策過程處理模糊推論具有模擬人類做決策判斷的能力其基本

理論就是根據人類特有的近似推理方式如之前已說明的GMP和

GMTGMP為前向推理而GMT為逆向推理因為模糊推論為前向

運算因此GMP非常適合使用為模糊控制的推論機構

〈5〉 解模糊化

將推論完成所得到的模糊輸出量轉換成實際的明確數值以便和

外界溝通解模糊化的方法有很多例最大歸屬度法重心法高

度法面積法等

圖 26 模糊系統的基本架構

14

22 直流馬達數學模型

圖27為直流馬達等效電路簡圖其中

iV = 輸入電壓 ai = 電樞電流

zR = 電樞電阻 gT = 轉矩

aL = 電樞電感 bE = 反電動勢

φ = 空氣隙磁通量 ω = 轉子角速度

B = 黏滯摩擦係數 J = 轉動慣量

圖 27 直流馬達等效電路簡圖

由克希荷夫電壓定律知

( ) ( ) ( )tEdt

tdiLtiRV b

aaaai ++= 〈26〉

由於反電動勢 bE 與轉軸的角速度 ( )tω 及空氣隙磁通量φ之乘積成正比即

( ) ( ) ( )tKtKtE emb ωφω == 〈27〉

15

又轉矩的平衡方程式為

( ) ( ) ( )dt

tdJtBtTgωω += 〈28〉

且馬達轉矩 gT 與電樞電流 ( )tia 及空氣隙磁通量φ乘積成正比即

( ) ( ) ( )tiKtiKtT ataag == φ 〈29〉

取〈26〉~〈29〉式之拉氏變換得

( ) ( ) ( ) ( )sEssILsIRsV baaaai ++= 〈210〉

( ) ( )sKsE eb Ω= 〈211〉

( ) ( ) ( )sJssBsTg Ω+Ω= 〈212〉

( ) ( )sIKsT atg = 〈213〉

則馬達輸入電流與轉速為

( ) ( ) ( )( ) ( )( )

sR

sEsV

sLRsEsV

sIe

a

bi

aa

bia τ+

minus

=+minus

=1

〈214〉

( ) ( ) ( )

sB

sT

sJBsT

sm

gg

τ+=

+=Ω

1 〈215〉

其中a

ae R

L=τ 為電樞電流的電氣時間常數 BJ

m =τ 為馬達轉動的機械時間

常數

直流馬達轉速對輸入電壓的轉移函數 ( )sG 為

( ) ( )( ) ( )( ) etaa

t

i KKBJsRsLK

sVssG

+++=

Ω=

( )( ) etmea

t

KKssBRK

+++=

ττ 11 〈216〉

16

在一般情況電樞電感很小所以 eτ 可以忽略不計因此上式成為一階落後

方程式

( ) ( )( ) ( ) m

m

etma

t

i sTK

KKsBRK

sVssG

+=

++=

Ω=

11 τ 〈217〉

其中

eta

mam KKBR

BRT

+=

τ

eta

tm KKBR

KK

+=

所以直流馬達數學模式可以以圖28表之﹝8﹞

圖 28 直流馬達數學模式方塊圖

17

第三章 系統功能分析與製作規劃

31 專題製作流程

如圖 31 所示本專題主要分為兩條路徑進行一為硬體另一則為軟體程

式撰寫本章著重硬體的規劃設計軟體則在第四章中介紹在完成 AB 信號

產生電路驅動功率放大電路與間距脈波產生電路設計與製作後須先接上馬達

做一連串的測試〈此時系統並無回受控制〉測試間距脈波是否太長或太短硬

體電路是否有缺失hellip等等另一方面也著手撰寫模糊控制程式並將其與硬體電

路結合最後做閉迴路系統的整合測試若發現系統的運作結果並不如預期

則需分別從硬體與軟體兩方面去改良

直流馬達轉速之模糊控制

文獻蒐集與整理

AB信號產生電路設計與製作

驅動功率放大電路設計與製作

間距脈波產生電路設計與製作

測試間距脈波是否太長或太短

系統測試測試馬達轉速是否

達到控制目的

結束與論文寫作

重新設計間距脈波長度

Yes

No

系統整合與修正

輸出信號與Fuzzy控制器之連結設計

規劃輸出與輸入歸屬函數

規劃模糊知識庫

撰寫主程式並加入模糊知識庫

程式編譯及連結

軟硬體整合測試馬達是否運作

程式調整及最佳化

No

YesYes

No

圖 31 專題製作流程圖

18

32 雙脈寬調變法之直流馬達驅動電路設計

本專題製作的雙脈寬調變法之直流馬達驅動電路設計大致可以分為二大部

分第一雙脈寬調變法之電路設計第二橋型驅動功率放大電路

雙脈寬調變〈Two Pulse Width Modulation簡稱TPWM〉之電路設計主要

是先製作一脈寬調變〈Pulse Width Modulation簡稱PWM〉波形然後再將此

波形各別經由一緩衝器〈buffer〉和反向器〈inverter〉則可產生AB驅動信號

脈波此即為TPWM

321 脈寬調變電路

如圖32先利用兩顆op產生三角波電路再利用一個比較器比較三角波

和誤差值之大小

150k

1M

20k

+12V

-12V

+12V

-12V10k

+12V

-12V

10k

+12V

-12V-

+-

+

-

+ PWMLM324

LM324

LM324

2200pF

圖 32 脈寬調變電路

〈1〉 三角波產生電路

三角波產生電路通常至少需要兩個運算放大器其電路如圖33OP1

為一個反相積分器OP2為一個史密特磁滯比較器將OP2的輸出方波經

19

OP1反相積分以後得到Vo1三角波此三角波又同時加到OP2控制其狀

態的改變

當方波產生器的輸出是正的則三角波產生器的輸出是斜向負相似

地當方波產生器的輸出是負則三角波產生器的輸出是斜向正這個動

作將產生三角波的輸出同時也輸出方波﹝9﹞

+VCC

-VCC

-

+

R1

R2

R3

+VCC

-VCC

-

+

OP1

OP2

Vo2Vo1

圖 33 三角波產生電路

對OP2而言是磁滯比較必須先找到OP2的 THV 和 TLV

232

21

32

3oo v

RRR

vRR

Rv

++

+=+ 〈31〉

當 0=+v 時

23

21 oo v

RR

v minus= 〈32〉

表要達到OP2的 0=+v 必須有這麼大的 1ov

當 12 sato Ev = 時

TLsato VERR

v =minus= 13

21 〈33〉

當 22 sato Ev minus= 時

THsato VERR

v =+= 23

21 〈34〉

20

對OP1而言是反相積分器 2ov 為其輸入 1ov 為其輸出則

tCIt

Rv

Ct

CRv

dtvCR

v oooo

11

2

11

22

111

11minus=minus=minus=minus= int 〈35〉

因為

1

2

Rvv

I o minusminus= 0=minusv 〈因為虛接地〉 〈36〉

所以

1

2

Rv

I o= 〈37〉

又因運算放大器的輸入阻抗非常大則流經 1C 的電流也為 I 相當於以定

電流對電容C 充電

當 12 sato Ev = 時 1ov 為下降斜波

tR

EC

v sato

1

1

11

1minus= 〈38〉

當 22 sato Ev minus= 時 1ov 上升斜波

( )

tRE

Cv sat

o1

2

11

1 minusminus= 〈39〉

由此可知三角波的上升與下降斜波乃因 1C 的充電與放電且時間

常數為 11CR

三角波週期分析如下

1 上升斜波的時間 1T

tCR

vv o

o1

1

21 minus= 11

2

1 CRvv

to

ominus=

1Tt = TLTHo VVv minus=1 22 sato Ev =

11111

21

sat

TLTH

sat

TLTH

EVV

CRCRE

VVT

minus=

minusminus= 〈310〉

2 下降斜波的時間 2T

tCR

vv o

o1

1

21 minus= 11

2

1 CRvv

to

ominus=

21

2Tt = THTLo VVv minus=1 12 sato Ev =

1

11111

1sat

TLTH

sat

THTL

EVV

CRCRE

VVT

minus=

minusminus= 〈311〉

3 週期 21 TTT +=

若 1satE = 2satE = satE 且3

22RR

VV TLTH =minus satE

3

2114

RR

CRT=

若R3 = nR2

則nCR

T 114=

114 CR

nf = 〈312〉

《實驗結果》

必須注意的是三角波的頻率太低將導致馬達的轉動產生脈動現象

故將工作頻率設計在1kHz以上

Ω= k1501R Ω= k102R

Ω= k203R pFC 22001 =

所得到的三角波頻率為

15kHz10220010001504

00010100020

f 12- =timestimestimestimes

timestimes

=

圖 34 三角波輸出波形

22

〈2〉 脈寬調變電路〈PWM〉

+12V

-12V

10k

+12V

-12V -

+ PWM輸出LM324三角波輸入

圖 35 脈寬調變電路

PWM系統往往連接至直流電源供應放大器的工作是以固定的頻率開

閉直流供應電壓其激發角是可以調整的因此得到波寬可調的輸出

將固定頻率的三角波與反向輸入的電壓做比較便可輸出一脈寬〈見圖

36〉反向電阻值的不同將導致反向輸入電壓不同故其輸出為一可調但

頻率固定的脈寬也正因為如此故稱為脈寬調變〈PWM〉由於輸出的

dutycycle不同故馬達將接收到不同的平均電壓因而可以藉由PWM控制

馬達的轉速

反相輸入電壓

PWM

圖 36 三角波與反相輸入電壓比較

23

PWM的優點在於馬達驅動電路的電晶體之控制信號改以脈波列來控

制使電晶體操作成類似開關的動作不是完全導通就是完全截止故電晶

體不是一直操作於作用區所以其功率消耗不大整體效率較高

《實驗結果》

圖 37 PWM 輸出波形

322 橋型驅動功率放大電路

如圖38所示主要由四個功率電晶體組成利用不同的電晶體對使直流

馬達做正逆轉控制當Q5Q8導通使馬達正轉當Q6Q7導通馬達則逆

轉電路中的電晶體扮演開關的作用

此種電路簡單只要一組直流電源供應且電晶體分擔了部份的電壓保護

電晶體迅速工作於截止與飽和狀態之間故沒有功率散逸損失之虞

但是在設計時切勿使Q5Q6同時導通以免燒毀電路上之元件因為在

AB兩脈波短暫的交變時間內由於電晶體本身之最小延遲時間有可能使Q5

Q6同時ON與Q7Q8在很短時間同時ON因此在15kHz交變下容易燒毀功

率電晶體

因此設計一間距脈波電路主要之功用使Q5Q6和Q7Q8均不同時導通

24

以拉長AB兩者交換時間

M

20k

10k

20k

10k

+24V

A 信號 B 信號

2N3055 2N3055

2N2955 2N2955

1N40021N4002

C1815 C1815

C1815 C1815

Q5

Q8Q6

Q7

圖 38 橋型驅動功率放大電路

圖 39 橋型驅動功率放大電路實體圖

25

此外若考慮電晶體BE間的電壓則電路會出現約 plusmn 06V的不感帶〈ded

band〉即電晶體的 oV 對 inV 間的關係如圖3101假使 inV 電壓為正弦波則 oV 變

成如圖3102為了改善這種缺失吾人利用兩個二極體接在電路上如圖38

用來補償電晶體BE間的壓降﹝10﹞

約06V

Dead band

Vo

Vin

圖 3101 呈現不感帶的轉移函數

圖 3102 輸出電壓波形

26

323 間距脈波產生電路

RCext15

Cext14 74123

A3

B2

Q13

CLR1

Q4

7486100k

2200pF

10k

10000pF

+5V

間距脈波輸出

圖 311 間距脈波產生電路

間距脈波的產生方式是根據脈寬調變〈PWM〉後的訊號再經由積分電路的

電阻兩端取出且經由兩倍頻器〈74LS86〉檢示出PWM的正負緣脈波最後

再利用單穩態IC〈74LS123〉將檢出信號之脈寬拉長至01ms此即為間距脈波

74LS123有兩個輸入端子A及B分別為下降波緣輸入端子及上升波緣輸入端

子當輸入A之脈波由ldquoH變成ldquoL之瞬間Q輸出變為ldquoH其持續時間長

短由RC時間常數決定反之當輸入B之脈波由ldquoL變成ldquoH之瞬間Q輸出

變成ldquoH維持一定時間

74LS123的輸出脈波之寬度是由電阻及電容之時間常數所決定概略計算公

式如下

CR045T timestimes=

電容 C 必須大於 1000pF

27

《實驗結果》

R=24kΩ C=10000pF

所以得到間距脈波為

( )msec0110810000p24k045T cong=timestimes= μ

圖 312 間距脈波

研究經分析後發現

1 間距 T 愈大愈能確保電路之安全性愈有保護作用

2 間距 T 愈大相對的使驅動信號脈波減少愈多造成馬達旋轉扭力大

大減弱

3 適當的間距 T不但不會影響馬達的輸出轉矩而且兼具保護電路的

效果

33 編碼器

轉動編碼器不只可以作為轉速的感測也能做位置的感測又適合於數位處

理故被廣泛使用若就信號來看轉動編碼器可分為增量型與絕對型若以檢

測的方式來分可分為光學式和磁式兩種在本專題中所使用的編碼器為光學式

增量型編碼器﹝11﹞

光學式轉動編碼器的原理如圖 313在附有細縫轉盤的兩側分別裝置發光元

28

件與受光元件如果只有一組光電檢測元件則輸出信號就只有一相的脈波信

號此種裝置稱為脈波產生器圖 314 為增量型轉碼器的輸出信號它是利用

兩組光電元件所產生的脈波信號A 相和 B 相間有相位差正轉時 A 相領前 B

相逆轉時 B 相領前 A 相因此利用此兩相做檢測馬達為正轉或逆轉的工作

並利用 A 相或 B 相的頻率檢測出目前的轉速

吾人計算出編碼器每一轉可以產生約 200 個脈波故檢測 A 相或 B 相其頻

率為 N則轉速應為 60200

timesN

〈rpm〉

圖 313 光學式轉動編碼器的原理圖

圖 314 編碼器的輸出信號波形

29

34 LM2917 FV 電路設計

對 LM2907 而言磁滯比較器和電流汞是構成頻率對電壓轉換的基本架構

並且預留一個運算放大器及一個電晶體供各種不同的使用圖 315 為吾人所設

計的 FV 電路圖中 C1 用以抑制電流汞動作時所產生的漣波變化正常使用時

此電容應大於 10C若 C1 太大也將造成轉換速度下降

因為單晶片 8051 之輸入電壓最高為 5V故必須設計其馬達最高轉速頻率所

轉成的電壓必須在 5V 以內由於馬達轉速頻率範圍極大故吾人給予 LM2917

+12V 的電壓以擴大它可以轉換的電壓範圍並將所需維持在 5V 內

a1

14

b1

1

a1

13

b1

2

a1

12

b1

3

a1

11

b1

4

1

a1

10

b1

5

a1

8

b1

7

a1

9

b1

6

L2917

Encoder輸 入

1uF

+12V

FV輸出1000pF

45k 10kC1

C2

圖 315 FV 電路

30

《實驗結果》

根據統計結果每 50mV 相對於 100Hz如此一來吾人想得知馬達目前

的轉速只要將單晶片所接收到的電壓值經過換算即可得知目前 encoder 所量測

的頻率吾人知道 encoder 一圈可產生 200 個脈波故馬達的轉速便可經過下列

公式換算得知

轉速〈rpm〉 60200

times=f

其中 =f encoder 所量測到的頻率

表 31 頻率與轉換電壓之關係

頻率

(Hz) 1 2 3 4 5 6 7 8 9

電壓(V) 0006 0006 0007 0008 0009 0009 0009 0009 001

頻率

(Hz) 10 20 30 40 50 60 70 80 90

電壓(V) 008 009 010 010 011 011 012 012 013

頻率

(Hz) 100 200 300 400 500 600 700 800 900

電壓(V) 013 018 023 028 033 038 043 049 054

頻率

(Hz) 1000 2000 3000 4000 5000 6000 7000 8000 9000

電壓(V) 059 109 16 209 257 304 3508 4006 45

31

圖 316 頻率對電壓曲線

35 單晶片介面電路

單晶片介面包括了二大部分分別為單晶片 8051AD converter

〈1〉8051 單晶片

為本控制系統的核心一切動作皆經由它控制

〈2〉AD converter

將類比開關所送出來的類比訊號經由 ADC 0804 轉換成數位訊號傳送

到單晶片的輸入埠

351 AD 轉換

以單晶片 8051 控制 ADC0804則單晶片 8051 必須下達ldquo開始轉換rdquo的命令

給 ADC0804然後 ADC0804 就開始讀入類比輸入端的電壓在內部開始轉換

經過一段轉換時間後〈約 100μ s〉ADC0804 就將轉換完成的值放在其內部的三

態輸出栓鎖緩衝器裡然後將轉換完成輸出腳〈INTR〉降為 low以通知單晶片

可以去讀轉換完成資料

當WR和CS 同時為ldquo0rdquo時表示對 ADC0804 下達ldquo開始轉換rdquo命令再經過

32

一段轉換時間〈100μ s〉後轉換完成ADC0804 會將其轉換完成的數位資料放

在其內部 8 位元緩衝區裡且將 INTR 降為ldquo0rdquo因此單晶片只要下達ldquo開始轉換rdquo

命令後去檢查 INTR 的狀態就可以知道是否轉換完畢其方法有兩種

1 輪詢法〈polling〉

2 中斷法〈interrupt〉

所謂輪詢法就是將 ADC0804 的 INTR接到 CPU 的一條 IO 線上然後以軟體指

令主動偵測其狀態當偵測到為ldquo0rdquo時就可以去讀出 ADC0804 裡的緩衝區的轉

換值

中斷法是一個很理想的 IO 方式因為不像輪詢法必須讓 CPU 等 ADC0804

轉換當 CPU 下達ldquo開始轉換rdquo命令後就可以做其他工作當 ADC0804 轉換完

畢後 INTR會降為ldquo0rdquo可以利用此信號去中斷 CPU再由中斷副程式去讀入

轉換值即可因此大大提高了程式的效率

當 CPU 接收到 ADC0804 發出ldquo轉換完畢rdquo的信號〈 INTR =0〉後就可以去

讀出轉換值其讀出的方法是將CS 與RD設為ldquo0rdquo即可讀到轉換值這個讀值的

動作又會使得 INTR恢復成ldquo1rdquo

1 CPU 下達ldquo開始轉換rdquo命令〈CS =0WR =0〉

2 ADC0804ldquo轉換完畢rdquo 〈 INTR =0〉

3 CPU 讀取轉換值〈 RD =0CS =0〉

4 讀完後 INTR =1

ADC0804 主要規格摘要如下

1 +5V 單電源工作電壓

2 類比電壓輸入範圍 0~+5V

33

3 參考電壓為 25V

4 轉換時間為 100μ s〈 CLKf =640kHz〉

5 解析度為 8 位元

6 誤差plusmn 1LSB

7 讀取時間 135ns

36 電源供應系統

本專題中所有電路及硬體設備所需的電源採用交流電源 110V 經由 PT-31

變壓器後再經過橋式整流後提供了直流電源而因為各個電路所需電源不同

因此製作了多組的變壓電路如下

1電壓源 DC5V選擇了 7805 的穩壓 IC 搭配電容得到了+5V 的電壓源

供〈1〉8051 微處理器 〈2〉ADC 0804 〈3〉74LS8674LS12374LS04

74LS02CD4013 〈4〉馬達 Encoder

2電壓源 DC12V使用 7812 穩壓 IC 搭配電容得到+12V 的電壓源供

LM2917 使用

3電壓源 DC24V利用 7824 的穩壓 IC 搭配電容獲得+24V 的直流電壓

源供電路之橋型驅動功率放大之電晶體使用

Vin1

+12V2

GND3

LM7812

2200uF 10000pF 2200uF 10000pF

+12V outputAC

圖 317 直流電源電路

34

圖 318 直流電源電路實體圖

37 馬達轉速的量測

表 33 PWM 輸出對應 encoder 週期

PWM dutycycle encoder 週期 PWM dutycycle encoder 週期

40 sμ 172 sμ 440 sμ 0 sμ

80 sμ 188 sμ 480 sμ 0 sμ

120 sμ 204 sμ 520 sμ 0 sμ

160 sμ 230 sμ 560 sμ 0 sμ

200 sμ 272 sμ 600 sμ 0 sμ

240 sμ 328 sμ 640 sμ 0 sμ

280 sμ 416 sμ 680 sμ 1320 sμ

320 sμ 540 sμ 720 sμ 750 sμ

360 sμ 800 sμ 760 sμ 510 sμ

400 sμ 1320 sμ 800 sμ 400 sμ

35

圖 319 PWM 輸出對應 encoder 週期

由統計可知道此馬達並不是一顆線性馬達故相信若使用模糊控制理論來

作為其回授控制系統的控制器一定能達到比傳統控制器的性能還要好而且若能

在模糊控制裡加上 PID 控制器的觀念一定能在系統的響應時間上升時間

安定時間和超越量達到最佳的控制另一方面馬達在其反方向的內阻較大需

要更大的力量才能使馬達驅動

36

第四章 軟體規劃與製作

41 PWM 之軟體設計

因為之前所介紹的硬體方式是以調整可變電阻來達到轉速的調整因此無法

得知所給予的脈寬長度和轉速大小尤其在回授時也不易給予適當的訊號來調整

轉速因此改良之方法就是以8051之軟體撰寫方式來產生固定的脈寬也就等

於給予轉速的命令而在其回授控制時也只要在內部程式给予適當的指令便可

達到脈寬長度的調整以達到閉迴路之受控系統

411 PWM 軟體流程

設定Timer0模式為0

TH0 = temp 32 TL0 = temp 32

temp = 8192 ndash j4 Key = 0

檢查是否有鍵值

將鍵值存入Key

Yes

No

設定Key值所對應的 j值

If P30 == 1Then P30 = 0 temp = 8192 ndash j4Else P30 = 1 temp=8192ndash880+j4

TH0 = temp 32 TL0 = temp 32

Start Timer0中斷副程式

啟動Timer0

等待Timer0中斷

返回主程式

圖 41 PWM 軟體設計流程圖

37

在此總共設計了五個按鈕分別代表不同的轉速停止正轉〈慢〉正轉

〈快〉逆轉〈慢〉和逆轉〈快〉使用Timer0是因為8051之計時中斷比延遲程

式來的準確故可以達到準確的計時程式設計理念中並沒有將中斷致能清除

因此Timer0會一直處於計時的狀態程式執行時將一邊檢查鍵值〈KeyStatus〉一

邊進行計時當計時完畢便呼叫中斷副程式然後執行改變Port 30的輸出狀

態若是為high則變為low反之若是為low即變為high同時並重設計時時間

Timer0繼續計時

當鍵值改變時計時的時間也會跟著改變如此一來Timer0將ㄧ直重覆上

述動作直到電源切掉Timer0才會停止計時

42 模糊控制之程式規劃與撰寫

本專題目標在完成了先前所規劃的硬體電路之後接著就是要達成利用模糊

控制理論來設計控制器在此採用了單晶片8051目的是為了以硬體實現方式來

代替電腦模擬期望能夠按照原訂計畫完成本專題「具模糊控制理論與雙脈寬調

變法之直流馬達驅動電路設計」

單晶片 8051 模糊控制的程式撰寫採下列幾個步驟依序完成

1 設定變數轉速誤差〈dspeed〉目前轉速〈sspeed〉

2 模糊化採用三角形歸屬函數採用三角形歸屬函數的原因

〈1〉 三角形函數為一連續函數

〈2〉 三角形函數為線性的函數所以計算速度較快

〈3〉 是具有發散也有收斂的函數和指數函數一樣接近

事實

3 模糊推論模糊規則將其所有可能發生情況以 IFhellipTHENhellip表示

並建立控制規則表

4 解模糊化採用重心法

38

421 歸屬函數

設定變數為目前轉速〈sspeed〉與轉速誤差〈dspeed〉因此此模糊控制器共

有兩個輸入訊號與一輸出訊號輸出訊號為脈寬長度該加或是減多少又因為有

五種不同的轉速因此各分別設計了不同的歸屬函數如下

1 當轉速 = 0

ml h

s s p e e d

d s p e e d

r p m0 5 0 1 0 0- 5 0- 1 0 0

mv l l h v h

r p m0- 3 0- 6 0- 1 0 0 3 0 6 0 1 0 0 圖 42 停止時之歸屬函數

2 正轉〈慢〉

ml hsspeed

dspeed

rpm150 225 300750

mvl l h vh

rpm150100500 200 250 300

圖 43 正轉〈慢〉之歸屬函數

39

3 正轉〈快〉

ml hsspeed

dspeed

rpm520 670 820370220

mvl l h vh

rpm500400300200 600 700 800

圖 44 正轉〈快〉之歸屬函數

4 逆轉〈慢〉

ml hsspeed

dspeed

rpm100 250 400500

mvl l h vh

rpm10050250 200 300 400 圖 45 逆轉〈慢〉之歸屬函數

40

5 逆轉〈快〉

ml hsspeed

dspeed

rpm300 450 600150

mvl l h vh

rpm450350250150 550 650 750

750

圖 46 逆轉〈快〉之歸屬函數

6 輸出

OutputMVL L H VH

rpm0-50-150-250 50 150 250

圖 47 輸出之歸屬函數

41

422 模糊規則庫

表 41 為吾人所設計的模糊控制規則庫並利用 Matlab 之 Fuzzy ToolBox 來

建立此規則庫以進行模擬推論圖 48 為當馬達輸入指令為正轉慢時推論後所得

到的三維空間圖

表 41 模糊控制規則表

Dspeed

vl l m h vh

l H M L VL VL

m VH H M L VL sspeed

h VH VH H M L

圖 48 推論後的三維空間圖

42

423 模糊控制器之軟體設計流程

Start 外部中斷副程式

ADCWR = 0 ADCWR = 1

〈令AD開始轉換〉

檢查鍵值以得到對應的歸屬函數

取得目前轉速與

轉速誤差

Fuzzy Rules決策

得到輸出訊號

Delay 10ms

ADC = 0 讀取AD值 ADCRD = 0

將AD值換算成轉速

ADCWR = 0 ADCWR = 1

〈AD開始轉換〉

返回主程式

致能外部中斷

圖 49 Fuzzy Controller 程式流程圖

當控制器一開始動作時便先執行AD轉換的工作當AD轉換完成時其

INTR的接腳便會觸發8051的外部中斷INTR0於是程式便發生外部中斷執行

外部中斷副程式的指令

43

在外部中斷副程式中AD將ㄧ直進行轉換與讀取的工作同時並將轉換後

的值直接換算成目前轉速與轉速誤差以供模糊控制器使用換算目前encoder

的頻率其公式為

160-V2000 times=頻率 〈4-1〉

式4-1之公式是根據表31所導出來的其中V為encoder之頻率轉成電壓之值

又假設所讀取的AD轉換值為value因為

AD的解析度 = bit256

5V+ = 511 ( Vbit ) 〈4-2〉

故value值與電壓V之關係為

511 value V times= 〈4-3〉

所以encoder之頻率與value值的關係為

頻率= 2000times ⎟⎠⎞

⎜⎝⎛ times

511 value - 160 〈4-4〉

故目前轉速為

sspeed = ( )rpm 60 200

times頻率 〈4-5〉

另ㄧ方面在主程式中程式會先去檢查鍵值也就等於檢查輸入指令以

找出符合使用的歸屬函數並將AD所獲得的轉速對應到歸屬函數中然後執行

決策判斷即進入規則庫中尋找出適當的決策判斷最後將此決策送入PWM程

式裡進行脈寬長度的調整使馬達在合理的要求下達到理想的轉速控制不會

因為外在環境的影響而使馬達轉速受到干擾

43 LCD 顯示轉速

此專題最後再增加一LCD顯示幕以顯示目前的轉速否則在程式設計完成

後人卻因無法以肉眼得知目前轉速而不能肯定馬達轉速是否有達到控制的目

標因此增加一顯示幕LCD是有必要的不僅隨時得知目前的轉速還能知道

44

設計出來的軟體其控制性是否夠好夠穩定

431 LCD 顯示幕之軟體流程

Start

設定LCD模組的初始狀態

設定外部中斷INTR0

與Timer0

設定TH0 = (65536 ndash 5000) 256 TL0 = (65536 ndash 5000)256

令ADCWR = 0 ADCWR = 1 AD開始轉換

等待中斷

外部中斷副程式

ADCRD = 0 讀取AD值 ADCRD = 1

將AD值換算成速度

ADCWR = 0 ADCWR = 1 AD開始轉換

Timer0中斷副程式

顯示LCD第一行

ldquoMotor Speed =

顯示LCD第二行ldquoxxxxxxx rpm其中 xxxxxx為外部中斷副程式所換算出的轉速

重設TH0與TL0

返回主程式返回主程式

圖 410 LCD 顯示幕之程式流程圖

此程式主要由兩個部分完成一為外部中斷副程式另ㄧ為 Timer0 中斷副

程式當主程式完成外部與 Timer0 兩個中斷的設定後隨即命令 AD 開始轉換

之後便一直停在 while〈1〉的迴圈裡不做任何動作而由兩個中斷副程式來完

成整個轉換與顯示的工作

45

外部中斷副程式主要負責 AD 的轉換讀取與轉速換算的工作AD 第一

次的轉換由主程式來下達命令當轉換完成後AD 的 INTR 接腳將觸發外部中

斷〈INTR0〉副程式此時程式便進入外部中斷副程式執行讀取 AD 值與轉速

換算的工作當這些工作完成時外部中斷副程式再次下達 AD 開始轉換的命

令而離開中斷副程式當 AD 再次轉換完成時又將再次執行中斷副程式

如此週而復始中斷副程式將ㄧ直進行讀取換算與轉換的工作

而 Timer0 中斷副程式主要負責 LCD 顯示之工作當主程式所設定的計時時

間計數完時程式便進入 Timer0 中斷副程式一旦進入 Timer0 中斷副程式程

式將執行 LCD 的顯示然後再重設 Timer0 的計數時間Timer0 將重新計數當

計數完時程式又將再度進入 Timer0 中斷副程式執行因為程式中並無清除

Timer0 的中斷致能故 Timer0 中斷副程式和外部中斷副程式ㄧ樣週而復始的

執行其副程式的工作

46

第五章 結論

本計劃主旨為具模糊控制理論與雙脈寬調變法之直流馬達驅動電路設計主

要是針對傳統電路設計之缺點提出改良之方法以TPWM取代PWM電路以模

糊理論基礎設計之控制器替代傳統PID控制器

TPWM轉速控制優於PWM之處在於

1 TPWM只需使用單電源即可達到正轉和逆轉的轉速控制而PWM必須

加上逆向開關或是雙電源才能使馬達產生正轉和逆轉

2 TPWM可控制馬達處於停止狀態無論在正向或逆向加上負載皆無法使

馬達產生轉動

3 馬達消耗定額功率輸出轉矩為額定值

4 馬達由停止到某定轉速時反應時間較快

模糊控制器優於PID控制器

1 不須導出繁雜的數學模型

2 適用於非線性系統

3 強健性與容錯性較高

本專題至此雖說大致的目標都已達到但是此系統仍然有許多不完美而需要

改進的地方例如在實驗過程中發現整個轉速的控制在回授上其反應時間

有點慢探討其原因有可能是控制器之程式上的問題

1 因為使用C語言撰寫程式故其執行速度較慢

2 程式可能寫的太累贅

3 模糊控制規則庫建立不良

若想改善這些問題可以嘗試著將C語言改為組合語言來撰寫並盡量減少

47

不必要的指令相信此動作一定能大大提昇程式的執行速度其次就是多做測

試利用測試中所學到的經驗來幫助模糊控制規則庫的改寫同時也能從測試中

發現更多的問題若是都能對問題加以一一解決的話相信必定能將此控制系統

做的更盡善盡美

48

參考文獻

﹝1﹞ 李適中直流馬達速度控制伺服控制〈基礎篇〉全華科技圖書股份有

限公司民 74

﹝2﹞ 廖錦文ldquo直流電動機之雙脈寬調變是〈TPWM〉驅動電路研究電

子技術月刊第 69 期pp94-1021992

﹝3﹞ 楊英魁孫宗瀛鄭魁香林建德蔣旭堂模糊控制理論與技術全華

科技圖書股份有限公司民 85

﹝4﹞ 林敦煌陳憬德直流馬達定位及轉速的模糊控制逢甲大學自動控制工

程學系學士論文民 87

﹝5﹞ LAZadehldquo Fuzzy Sets Information and Control Vol8 pp338-353

1965

﹝6﹞ EHMamdani and SAsslianldquo A fuzzy logic controller for a dynamic

plant Internation Journal of Man-Machine Studies Vol7 pp1-13 1975

﹝7﹞ 孫宗瀛楊英魁Fuzzy 控制理論實作與應用全華科技圖書股份有

限公司民 83 年

﹝8﹞ 許中平黃煌嘉直流電動機控制電路設計全華科技圖書股份有限公司

民 75

﹝9﹞ 盧明智黃敏祥OP Amp 應用+實驗模擬全華科技圖書股份有限公司

民 83

﹝10﹞陳文耀電動機控制工程復文書局2003

﹝11﹞許中平林全福電動機運轉控制技術全華科技圖書股份有限公司民

77

﹝12﹞楊明豐8051 單晶片 C 語言設計實務碁峯資訊2003 年

﹝13﹞蔡朝洋單晶片微電腦 80518951 原理與應用全華科技圖書股份有限公

司民 91

49

﹝14﹞王文俊認識 Fuzzy全華科技圖書股份有限公司民 90

50

附錄 A 專題硬體展示圖

圖 A-1 硬體整體圖

圖 A-2 硬體整體鳥瞰圖

51

圖 A-3 硬體側視圖

圖 A-4 操作與顯示面板

圖 A-5 間距脈波電路與 FV 電路

52

圖 A-6 橋型驅動功率放大電路

圖 A-7 操作與控制面板

53

附錄 B PWM 與模糊控制之程式

include reg51h include stdioh sbit ADCRD = P3^1 設定 RD 控制線接腳為 P31 sbit ADCWR = P3^3 設定 WR 控制線接腳為 P33 sbit P2_0 = 0xA0 接腳定義 sbit P2_1 = 0xA1 接腳定義 sbit P3_0 = 0xB0 接腳定義 sbit P3_1 = 0xB1 接腳定義 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P3_6 = 0xB6 接腳定義 void KeyStatus(void) 函數原型宣告 void feedback(void) 函數原型宣告 void compute_grade(void) 函數原型宣告 void delay1ms(int count) 函數原型宣告 void convert() 函數原型宣告 void condition() 函數原型宣告 void CW(void) 函數原型宣告 int j i 對應 PWM 的寬度 unsigned int temp 所設計的計時器時間 int sample = 1000 取樣率設定消除顯示值跳動 long int value r1 讀取 ADC0804 數位資料 long int set n condition select long int r grade_reg[2] grade[15] error1 error2 long int a1 b1 I long int membership[5][3]membership1[3][3] 定義歸屬函數 long int membership2[3][3] = -10-50-5050510 long int error[2] int Rule[15][3] = 113213313 定義判斷規則庫 212223323 311232333 411241342 511251351

54

main() 主程式 j = PWM = 110 設定 PWM 初始值 IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x00 設定計時器 0 工作於模式 0 temp=8192-j4 設定計時器 0 初值 TH0 = temp 32 TL0 = temp 32 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 P3_4 = 1 P3_5 = 0 P3_6 = 0 ADCWR = 0 令 ADC0804 的 WR = 0 ADCWR = 1 令 ADC0804 的 WR = 1 while (1) KeyStatus() 檢查鍵值 void KeyStatus(void) 檢查鍵值並給對應的 PWM 值 char KeyScan(void) 按鍵掃描函數宣告 unsigned char KeyStatus unsigned char Key = 0 KeyStatus=KeyScan() 呼叫按鍵掃描函數 if (KeyStatus = 0) 已有按鍵輸入 Key = KeyStatus Key = 鍵值 if (Key == 0x01) 假如輸入為按鍵 1 i = 110 PWM 為 110us j = i P3_4 = 1 LED 亮第一顆〈表馬達停止〉 P3_5 = 0 P3_6 = 0

55

else if (Key == 0x02 ) 假如輸入為按鍵 2 i = 140 PWM 為 140us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x04 ) 假如輸入為按鍵 3 i = 180 PWM 為 180us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x08 ) 假如輸入為按鍵 4 i = 80 PWM 為 80us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 else if (Key == 0x10 ) 假如輸入為按鍵 5 i = 40 PWM 為 40us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 PWM = j delay1ms(10) 呼叫延遲函數 feedback() 模糊控制判斷

56

void To_int(void) interrupt 1 Timer0 中斷函數 if (P3_0 == 0) 假如 PWM 輸出為 Low P3_0 = 1 變更 PWM 輸出為 High temp=8192-j4 設定 High 的時間 else 若 PWM 輸出為 High P3_0 = 0 變更 PWM 輸出為 Low temp=8192-880+j4 設定 Low 的時間 TH0 = temp 32 Timer0 的計時時間 TL0 = temp 32 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 char KeyScan(void) 檢查鍵值 char KeyStatus 按鍵狀態 P0=0xff 設定 P0 為輸入模式 KeyStatus=~P0 讀取按鍵狀態 return(KeyStatus) 將鍵值送回程式 void feedback(void) 模糊判斷 void Fuzzycontroller() 函數原型宣告 void condition1() 函數原型宣告

57

void condition2() 函數原型宣告 error1 = ((value)40-160)03 輸入變數 1 delay10ms(10) 延遲 10ms error2 = ((value)40-160)03 輸入變數 2 if (key == 0x01 ) 當按鍵 1找出對應的歸屬函數 並做出模糊控制判斷

int membership[5][3]= -100-60-30-60-300-30030030603060100

int membership1[3][3]=-100-500-50050050100 Fuzzycontroller() condition() if (key == 0x02 ) 當按鍵 2找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

05010050100150100150200150200250200250300 int membership1[3][3]=07515075150225150225300 Fuzzycontroller() condition() else if (key == 0x04) 當按鍵 3找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

200320400300400500400500600500600700600700800 int membership1[3][3]=220370520370520670520670820 Fuzzycontroller() condition() else if (key == 0x08) 當按鍵 4找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

02550255010050100200100200300200300400 int membership1[3][3]=05010050100250100250400 Fuzzycontroller() condition()

58

else if (key == 0x10) 當按鍵 5找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

150250350250350450350450550450550650550650750 int membership1[3][3]=150300450300450600450600750 Fuzzycontroller() condition2() void Fuzzycontroller() 模糊控制判斷 void compute_grade() 函數原型宣告 void compute_grade1() 函數原型宣告 a1 = 0 b1 = 001 I = 0 for (n=0 nlt=14 n++) r = error1 set = Rule[n][0]-1 compute_grade() 計算輸入變數 1 與

模糊程度的歸屬函數 condition = 1 r = error2 set = Rule[n][1]-1 compute_grade1() 計算輸入變數 2 與 模糊程度的歸屬函數 grade[n] = MIN(grade_reg[0] grade_reg[1]) a1 = a1 + (grade[n]membership2[Rule[n][2]-1][1]) b1 = b1 + grade[n] I = a1 b1 得到模糊控制判斷的結果 void compute_grade() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership[set][0]) || (r gt membership[set][2])) 當輸入變數不在 歸屬函數內

59

grade_reg[condition] = 0 else if ((r gt membership[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership[set][2]-r) (membership[set][2] - membership[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership[set][0]) (membership[set][1] - membership[set][0]) void compute_grade1() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership1[set][0]) || (r gt membership1[set][2])) 當輸入變數不在 歸屬函數內 grade_reg[condition] = 0 else if ((r gt membership1[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership1[set][2]-r) (membership1[set][2]-membership1[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership1[set][0]) (membership1[set][1]-membership1[set][0])

60

void condition() P2_0 = 1 設定 P20 為輸入模式 P2_1 = 1 設定 P21 為輸入模式 if ( (P2_0 == 1) ampamp (P2_1 == 0)) 當馬達為正轉時 if ( I gt 0 ) 若模糊判斷結果為正 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 若模糊判斷結果為零 PWM = PWM + 0 PWM 寬度不變 if ( I lt 0 ) 若模糊控制結果小於零 PWM = PWM + 1 PWM 寬度加 1 else if ( (P2_0 == 0) ampamp (P2_1 == 1) ) 若馬達為反轉 if ( I lt 0 ) 模糊控制小於零 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 模糊控制等於零 PWM = PWM + 0 PWM 寬度不變 if ( I gt 0 ) 模糊控制大於零 PWM = PWM + 1 PWM 寬度加 1 CW() 判斷 PWM 寬度上下限

61

void CW() 判斷 PWM 寬度上下限 if ( PWM gt= 215 ) 若 PWM 寬度 gt= 最大寬度 j = 215 PWM 寬度維持於 215us if ( PWM lt= 5 ) 若 PWM 寬度 lt= 最小寬度 j = 5 PWM 寬度維持在 5us if ( PWM gt 5 ampamp PWM lt 215 ) PWM 寬度介於最大與最小間 j = PWM PWM 依模糊控制判斷結果增減 void delay1ms(int count) 延遲 1ms int x y for ( x = 0 x lt count x++ ) for ( y = 0 y lt 122 y++ ) void convert() 數位資料換算成馬達轉速 r1 = ((value)40)-160

62

附錄 C LCD 顯示之程式

includereg51h 含 8051 所有暫存器宣告 include mathh define RS P3_5 LCD 指令資料選擇控制 define RW P3_4 LCD 讀寫控制腳 define Enable P3_3 LCD 致能接腳 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P0_0 = 0x80 接腳定義 sbit P0_1 = 0x81 接腳定義 sbit P0_2 = 0x82 接腳定義 sbit P0_3 = 0x83 接腳定義 sbit P0_4 = 0x84 接腳定義 sbit P0_5 = 0x85 接腳定義 sbit P0_6 = 0x86 接腳定義 sbit ADCRD = P3^7 設定 RD 控制線接腳為 P37 sbit ADCWR = P3^6 設定 WR 控制線接腳為 P36 void delay(void) 函數原型宣告 void delay10ms(int count) 函數原型宣告 void display(void) 函數原型宣告 void InitialLCD(void) 函數原型宣告 void WriteIns(char) 函數原型宣告 void WriteData(char) 函數原型宣告 void WriteString(charchar) 函數原型宣告 void CheckBusy(void) 函數原型宣告 void convert(void) 函數原型宣告 char MSG0[] = Motor Speed = 定義字串 MSG0 char MSG2[] = rpm 定義字串 MSG2 unsigned char MSG1[8]=0000000 定義字串 MSG1 unsigned long int value 讀取 ADC0804 數位資料 int sample = 1000 取樣率設定消除顯示值跳動 long int rpm

63

main() 主程式 InitialLCD() 初始化 LCD IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x01 設定計時器 0 工作於模式 1 TH0 = (65536-5000)256 設定計時器 0 初值 TL0 = (65536-5000)256 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 while(1) 等待中斷 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 while (--sample == 0) 取樣率減 1 sample = 1000 重設取樣率 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 void T0_int(void) interrupt 1 LCD 顯示動態掃描 display() 動態掃描顯示 TH0 = (65536-65535)256 重設計時初值 TL0 = (65536-65535)256

64

void InitialLCD(void) 設定 LCD 模組初始狀態 delay() 延遲函數 WriteIns(0x38) 設定 LCD 模組為 WriteIns(0x38) 2 行顯示 WriteIns(0x38) 8 位元介面 WriteIns(0x38) 5x7 點字型 WriteIns(0x08) 關閉顯示器 WriteIns(0x01) 清除 LCD 螢幕 WriteIns(0x0c) 令顯示器 ON但游標不顯示 WriteIns(0x06) 令 LCD 模組每接收到 1Byte 資料 AC 值自動加 1 void display() 掃描顯示 WriteIns(0x80) 設定 LCD 座標 WriteString(13MSG0) 將字串 MSG0 寫入 LCD 中 WriteIns(0xc0) 設定 LCD 座標 WriteString(8MSG1) 將字串 MSG1 寫入 LCD 中 WriteIns(0xc8) 設定 LCD 座標 WriteString(4MSG2) 將字串 MSG2 寫入 LCD 中 void convert(void) 換算轉速 long int freq freq = ((value)4000) - 16000 數位資料換成頻率公式 rpm = freq3 頻率換算轉速公式 MSG1[0] = (rpm1000000)+0x30 將結果存入字串 MSG1 中 MSG1[1] = ((rpm1000000)100000)+0x30 MSG1[2] = ((rpm100000)10000)+0x30 MSG1[3] = ((rpm10000)1000)+0x30 MSG1[4] = 0x2e MSG1[5] = ((rpm1000)100)+0x30 MSG1[6] = ((rpm100)10)+0x30 MSG1[7] = rpm10+0x30

65

void WriteIns(char instruction) 寫命令至 LCD 中 RS = 0 選擇指令暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = instruction 輸出命令至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteData(char i) 寫資料至 LCD 中 RS = 1 選擇資料暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = i 輸出資料至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteString(countMSG) 寫字串至 LCD 中 char count 字串長度 char MSG[] 字串資料 char i 定義位元組變數 for(i=0 iltcount i++) count 個位元組 WriteData(MSG[i]) 寫入一位元組的資料至 LCD 中 void CheckBusy(void) char i=0x80 檢查忙碌旗標 while(iamp0x80) 忙錄旗標 BF = 1 RS = 0 選擇指令暫存器 RW = 1 讀取 Enable = 1 致能 LCD i = P2 讀取 LCD 指令暫存器內的資料

66

Enable = 0 除能 LCD delay() 延遲函數 void delay() 延遲 5ms int i for(i=0 ilt250 i++)

  • 畢業專題封面pdf
  • File0004pdf
  • 最終版pdfpdf
Page 11: Based on Fuzzy Control Theorem and TPWM Method for DC ... · 使吾人想設計一模糊控制器來做為馬達轉速的閉迴路控制,以解決非線性系統的 問題。除此之外,flcs

2

12 研究動機

現今直流馬達的轉速控制多廣泛使用脈波寬度調變式〈Pulse Width

Modulation簡稱 PWM 驅動電路〉此種電路是以控制固定頻率的開閉供應直流

電壓以得到波寬可調的輸出使馬達的平均電壓可以調整進而轉移到馬達的

平均功率而達到轉速的控制但是由於 PWM 為一種單象限控制只運作於第一

象限這種系統本身無法產生負轉矩未加上逆向開關前亦無法反向因此無法

作用於第三象限系統加上動力制動後方可以有限度地產生逆向轉矩而運作於

第二象限〈見圖 11〉然而這也只是一種被動控制區間﹝1﹞

主動控制區動力制動

(被動運作)

Ⅱ Ⅰ

Ⅲ Ⅳ

ω

TCWCCW

圖 11 單象限控速系統運作於第一象限

本研究主要目的之一就是針對 PWM 之缺失提出了改良的方法於前級驅

動電路產生正反方向的兩個脈波信號再經驅動功率放大之後使馬達產生正

反轉向的兩拉力此即為雙脈波寬度調變式(Two Pulse Width Modulation簡稱

TPWM)本控制主要特色不論電動機正轉反轉速度快慢或停住均消

耗定額功率〈即馬達無時無刻都在運轉且輸出轉矩為額定值〉系統於寬廣的

速度變化範圍內仍具有良好的伺服性能馬達的旋轉扭力不會因速度及負載的

變化而受影響使伺服控制系統達到某一預定的特性範圍﹝2﹞

3

此外馬達的轉速會因其驅動機構的慣性影響不可能「說停就停」也

會因為摩擦力等影響不可能「說動就動」故對其操控指令一定會有延遲的

現象發生這些因素使馬達不是一個典型的線性系統故傳統的 PID 控制器就

不是最好的選擇再加上近年來模糊控制系統〈Fuzzy Logic Control System

FLCS〉的發展﹝3﹞使吾人想設計一模糊控制器來做為馬達轉速的閉迴路控

制以解決非線性系統的問題除此之外FLCS 在上升時間安定時間和超

越量上的要求也都優於傳統的 PID 控制器[4]

目前雖然有很多從事於馬達轉速控制的相關研究但是多採用脈波寬度調

變法且其尚有缺失待改良因此吾人想採用雙脈波寬度調變雖然有關此法

的研究並不多見但 TPWM 卻具有 PWM 所沒有的優點再加上近來發展愈

盛的模糊控制理論較傳統 PID 控制器的優點相信馬達轉速以 TPWM 驅動電

路之模糊控制是值得去加以研究和探討的

13 研究方法

本專題計畫其研究方法主要分為兩大類一為硬體結構電路設計另一為

Fuzzy 控制器之軟體製作硬體結構方面主要設計一比較放大器使其誤差值經

此電路與三角波比較而輸出 A 驅動信號脈波與 B 驅動信號脈波然後再由驅動

功率放大電路將信號脈波放大後控制馬達正逆轉此外為了確保功率放大電

路之安全性需在其之前加上一間距產生電路以防止其電路損毀

感測器方面則利用編碼器〈encoder〉感測出馬達的轉速然後再經由 FV

將其轉換為電壓此電壓再由 AD 轉換為數位信號送入單晶片 8051經由模

糊控制規則庫判斷並做出決策以達到馬達轉速的控制

4

14 研究目標

本專題研究目標如下

〈1〉 完成相關文獻資料之蒐集整理與討論

〈2〉 完成 AB 信號產生電路設計

〈3〉 完成間距脈波產生電路設計

〈4〉 完成驅動功率放大電路設計〈橋型驅動功率放大〉

〈5〉 完成 FV 電路設計

〈6〉 完成 AD 訊號轉換

〈7〉 編寫模糊控制法則與介面軟體設計

5

第二章 原理探討

21 模糊控制與理論

在傳統的控制領域裏控制系統動態模式的精確與否是影響控制優劣的最主

要關鍵系統動態的資訊越詳細則越能達到精確控制的目的然而對於複雜

的系統由於變數太多往往難以正確的描述系統的動態於是工程師便利用各

種方法來簡化系統動態以達成控制的目的但卻不盡理想換言之傳統的控

制理論對於明確系統有強而有力的控制能力但對於過於複雜或難以精確描述的

系統則顯得無能為力了因此便嘗試著以模糊數學來處理這些控制問題模糊

控制是屬於非線性式的控制在受控系統無法以線性數學模式精確描述的情況

下經由適當調整控制規則應具有比傳統控制方法更佳的控制性能

211 模糊理論概述

1965 年美國加州柏克萊分校的 LotfiAZadeh 教授首先在他主編的

「Information and Control」刊物上提出「Fuzzy Set」論文此為模糊邏輯理論的

創始模糊理論在經過了三十幾年的演化改進後無論是在應用或理論架構上

皆已日趨完備尤其近年來因人工智慧的迅速發展模糊理論儼然成為人工智慧

不可或缺的理論根基

Zadeh 教授曾提出一個互克性原理﹝5﹞「當系統的複雜性增長時對系統

特性做精確且有意義描述的能力亦相對降低最後精確性與有意義性將變成完全

互相排斥的特性」很高的複雜性意味著只能在一個刻意壓縮的低維因素空間觀

察而無法對問題的全部因素都進行考察使得原本是明確的概念變的模糊

Fuzzy 理論正是為了掌握這類具模糊特質的事物而發展出來的所以它的應用較

偏重於人類的經驗及對問題特性的掌握程度不主張用繁雜的數學分析及數學模

式來解決問題

Fuzzy 理論把傳統數學從二值邏輯〈binary logic〉擴展到連續多值〈continuous

6

multi-value〉利用歸屬函數〈membership function〉描述一個概念的程度亦及

使用 0 和 1 之間的數值來表示一個元素屬於某一概念的程度這個值稱為元素對

集合的歸屬度〈membership grade〉當歸屬度為 1 時表示該元素百分之百屬於

這個概念當歸屬度為 0 時則表示該元素完全不屬於這個概念介於兩者之間

的就是完全屬於和完全不屬於之間的灰色地帶

模糊理論的工程應用大約始於 1974 年倫敦大學的 EHMamdani 教授他根

據 Zadeh 提出的語言分析法〈linguistic approach〉及模糊推論〈fuzzy inference〉

運用 IF-THEN 形式的法則來敘述操作員的控制策略成功地應用在蒸汽機自動

運轉上﹝6﹞從此模糊理論的應用便迅速發展以在控制方面的研究成果最為

顯著模糊理論其實是一門相當生活化的學問由於使用語言變量描述因此更

具親和力與一般性人類日常生活所遇所用的一些敘述即大都是模糊的例如

那個人ldquo很高車開的ldquo很快等等其中ldquo很高ldquo很快並不是一個

明確值而只是描述事件的程度但是根據這些描述人類卻能很輕易的接收

212 模糊集合

模糊集合〈fuzzy set〉可視為傳統集合的擴張在模糊集合的世界中稱傳

統集合為明確集合〈crisp set〉所謂模糊集合是指用來表示界限或邊界不分明的

模糊概念的集合許多日常生活中的概念常常都不是清晰明確的這些可說是模

糊概念例如很高很快等這類概念無法用傳統的二值集合論即 0 或 1 表示

而Zadeh教授提出的Fuzzy集合論可以將這些概念由傳統集合論的特徵函數從非

0 即 1 的二值選擇推廣為從 0 到 1 之間的任何值做選擇得到新型的特徵函數

稱為歸屬函數

模糊集合由歸屬函數表示相對於明確集合的特徵函數其值只有 0 或 1 兩個

值即其值為在實軸閉區間[01]之中的任一實數模糊集合可以彌補明確集

合描述時所產生的不合理現象因此模糊集合比傳統的明確集合更具客觀性

7

213 歸屬函數

歸屬函數〈membership function〉為 0 到 1 之間的數值吾們可以藉由歸屬

函數來描述 Fuzzy 集合的特質它是 Fuzzy 理論的最基本觀念透過歸屬函數我

們才能對 Fuzzy 集合進行量化也才可能利用精確的數學方法分析處理模糊性資

歸屬函數在 Fuzzy 控制的應用範疇內都要具備凸〈convex〉及正規〈normal〉

等基本特性〈如圖 21〉歸屬度函數的定義可以分為數值及函數兩種數值定義

方式又稱為離散化歸屬函數它是直接給定有限 Fuzzy 集合內每個元素的歸屬

度並以向量的形式表現出來函數定義方式又稱為連續化歸屬函數它是以不

同形式的函數來描述 Fuzzy 集合

圖 211 正規且凸模糊集合

1

0 圖 212 正規非凸的模糊集合

8

一個模糊集合的歸屬函數可以有許多方式但是目前最廣泛使用的有吊鐘

型三角型梯型等歸屬函數

〈1〉吊鐘形歸屬函數

吊鐘形歸屬函數定義如下

μA=bell(xabc)= b

acx 2

1

1minus

+

〈21〉

圖 22 吊鐘型歸屬函數

〈2〉三角形歸屬函數

三角形歸屬函數可由三個參數(abc)來加以決定

=Aμ trangle(xabc)

⎪⎪⎪

⎪⎪⎪

ltleminusminus

ltleminusminus

=

other

cxbcbcx

bxaabax

0

〈22〉

其中a為歸屬函數左邊界b為歸屬函數中心值c為歸屬函數右邊界

9

圖 23 三角型歸屬函數

〈3〉梯型歸屬函數

梯型歸屬函數可由四個參數加以決定

=Aμ trapezoid(xabcd)

⎪⎪⎪⎪

⎪⎪⎪⎪

leleminusminus

ltle

ltleminusminus

=

other

dxcdcdx

cxb

bxaabax

0

1 〈23〉

圖 24 梯型歸屬函數

10

214 模糊推論與模糊規則

模糊推論〈fuzzy inference〉是根據知識庫保存的規則(rule)和給予的事實

推導出新的結論與傳統推論不同的地方是Fuzzy推論不只可以處理明確命題也

可以處理Fuzzy命題Fuzzy推論是依據近似推理〈approximate reasoning〉的概念

發展出來的比傳統推論的嚴正推理〈exact reasoning〉更合理也更具彈性近

似推理是兩種嚴正推理General Modus Ponens〈簡稱GMP〉及Genera Modus

Tollens〈簡稱GMT〉的一般化此原理是從傳統二值邏輯中的肯定律〈modus

ponens〉和否定律〈modus tollens〉推廣而來其中GMP又可稱為前向推理而

GMT則可稱為反向推理

〈1〉 GMP〈General Modus Ponens〉

規則IF x is A THEN y is B

事實x is Arsquo

結論y ix Brsquo 〈24〉

〈2〉 GMT〈General Modus Tollens〉

規則IF x is A THEN y is B

事實y is Brsquo

結論x is Arsquo 〈25〉

上式中IF x is A THEN y is B即為模糊規則〈fuzzy rules〉AArsquoBBrsquo

分別是定義在論域X及Y的模糊集合xy代表輸入變數及輸出變數的語言變數

一般來說「x is A」稱為前件部〈antecedent〉而「Y is B」則稱為後件部

〈consequence〉Fuzzy知識庫〈Fuzzy Knowledge Base簡稱FKB〉即由這些模

糊規則所組成的規則庫〈rule base〉和存放描述領域知識的Fuzzy變數及語言變數

的資料庫〈data base〉所組成所以FKB是用來描述受控對象所涉及的領域知

11

識和操控目標的一些定性及定量的資訊模糊知識庫和模糊推論是構成Fuzzy規

則系統核心的兩個重要部門﹝7﹞

模糊推論是模糊系統的核心根據知識庫的模糊法則進行模糊理論的合成運

算來模擬人類的思考決策模式一般來說規則的建立是採取十分主觀直覺的

方式依據相關領域專家的經驗與知識透過詢問進而將其知識經驗歸納條列出

重點再轉換成模糊規則的形式表現出來但是並非所有的專家或操作員都能

將自身的經驗知識以言詞的方式充分的表達出來且未必能整理成條列的模糊規

則所以知識規則的萃取工作往往是在建構模糊系統時最常遭遇到的困難之

215 模糊控制器

模糊控制是智慧型控制〈intelligent control〉系統的一種典型其基本特點

是不完全依賴受控對象的數學模型主要是利用人的操作經驗知識和推理技

術以及控制系統的某些訊息和性能得出對應的控制動作模糊控制是以並行

〈parallel〉方式處理規則的推理工作〈如圖25〉其近似推理會包容每個對操

控系統有貢獻的規則即使某些貢獻程度很小的規則也不會忽略

圖 25 模糊控制系統的構造

12

一個控制器的輸入通常是確定數值而非模糊輸出也是如此才能對被控對象

發生作用但是模糊邏輯控制器〈Fuzzy Logic Controller簡稱FLC〉則是以語

言化的控制規則為主體為了能夠把輸入的確定值與語言化之後的控制規則結

合必須把輸入的確定值模糊化〈fuzzification〉以便對應到FLC語言變數的論

域範圍中同樣的經過規則庫推理出來的結果是對應到輸出語言變數的論域

中所以也必須對其做解模糊化〈defuzzification〉的工作才能達成實際的控制

目標

一般模糊控制器的架構包含了五個主要部分定義變數模糊化知識庫

模糊推論及解模糊化

〈1〉 定義輸入及輸出變數

決定程序被觀察的狀況及考慮控制的動作輸入變數可以是擷取

自受控系統的觀測量也可以是推導出來的資料輸出變數則為操控

受控系統的操作量例如在一般控制問題上輸入變數通常為輸出

誤差e與輸出誤差之變化率e而控制變數則為下一個狀態之輸入

u其中eeu統稱為模糊變數

〈2〉 模糊化

將量測值轉換為語言變數的過程將外界所輸入的確定數值經由

一比例映射傳送到輸入變數所對應的模糊論域然後再利用模糊化

函數將此輸入資料轉換成適當的口語值以供模糊運算使用此口語

化變數稱之為模糊子集合

〈3〉 知識庫

模糊知識庫是模糊控制的依據由它來定義所有使用到的語言控

制法則及相關各項參數知識庫可說是整個控制系統資料核心其包

含了兩個部分資料庫〈data base〉與規則庫〈rules base〉

1 資料庫

提供處理模糊數據之相關定義資料庫所存放的資料是關

13

於如何將明確的資料轉換成模糊數值而資料的存放方式是以

歸屬函數表示該選用哪一種歸屬函數依實際的需要選定

以三角形歸屬函數最常被使用因其運算最為容易且又能充分

的表達模糊概念

2 規則庫

利用語言化的條件式控制規則描述控制目標和策略通常

控制規則可以由操控人員的經驗或專家的知識推導出來多個

控制規則所組成的集合就是規則庫

〈4〉 模糊推論

模糊推論為模糊控制最重要的核心其最主要的工作就是做實際

的決策過程處理模糊推論具有模擬人類做決策判斷的能力其基本

理論就是根據人類特有的近似推理方式如之前已說明的GMP和

GMTGMP為前向推理而GMT為逆向推理因為模糊推論為前向

運算因此GMP非常適合使用為模糊控制的推論機構

〈5〉 解模糊化

將推論完成所得到的模糊輸出量轉換成實際的明確數值以便和

外界溝通解模糊化的方法有很多例最大歸屬度法重心法高

度法面積法等

圖 26 模糊系統的基本架構

14

22 直流馬達數學模型

圖27為直流馬達等效電路簡圖其中

iV = 輸入電壓 ai = 電樞電流

zR = 電樞電阻 gT = 轉矩

aL = 電樞電感 bE = 反電動勢

φ = 空氣隙磁通量 ω = 轉子角速度

B = 黏滯摩擦係數 J = 轉動慣量

圖 27 直流馬達等效電路簡圖

由克希荷夫電壓定律知

( ) ( ) ( )tEdt

tdiLtiRV b

aaaai ++= 〈26〉

由於反電動勢 bE 與轉軸的角速度 ( )tω 及空氣隙磁通量φ之乘積成正比即

( ) ( ) ( )tKtKtE emb ωφω == 〈27〉

15

又轉矩的平衡方程式為

( ) ( ) ( )dt

tdJtBtTgωω += 〈28〉

且馬達轉矩 gT 與電樞電流 ( )tia 及空氣隙磁通量φ乘積成正比即

( ) ( ) ( )tiKtiKtT ataag == φ 〈29〉

取〈26〉~〈29〉式之拉氏變換得

( ) ( ) ( ) ( )sEssILsIRsV baaaai ++= 〈210〉

( ) ( )sKsE eb Ω= 〈211〉

( ) ( ) ( )sJssBsTg Ω+Ω= 〈212〉

( ) ( )sIKsT atg = 〈213〉

則馬達輸入電流與轉速為

( ) ( ) ( )( ) ( )( )

sR

sEsV

sLRsEsV

sIe

a

bi

aa

bia τ+

minus

=+minus

=1

〈214〉

( ) ( ) ( )

sB

sT

sJBsT

sm

gg

τ+=

+=Ω

1 〈215〉

其中a

ae R

L=τ 為電樞電流的電氣時間常數 BJ

m =τ 為馬達轉動的機械時間

常數

直流馬達轉速對輸入電壓的轉移函數 ( )sG 為

( ) ( )( ) ( )( ) etaa

t

i KKBJsRsLK

sVssG

+++=

Ω=

( )( ) etmea

t

KKssBRK

+++=

ττ 11 〈216〉

16

在一般情況電樞電感很小所以 eτ 可以忽略不計因此上式成為一階落後

方程式

( ) ( )( ) ( ) m

m

etma

t

i sTK

KKsBRK

sVssG

+=

++=

Ω=

11 τ 〈217〉

其中

eta

mam KKBR

BRT

+=

τ

eta

tm KKBR

KK

+=

所以直流馬達數學模式可以以圖28表之﹝8﹞

圖 28 直流馬達數學模式方塊圖

17

第三章 系統功能分析與製作規劃

31 專題製作流程

如圖 31 所示本專題主要分為兩條路徑進行一為硬體另一則為軟體程

式撰寫本章著重硬體的規劃設計軟體則在第四章中介紹在完成 AB 信號

產生電路驅動功率放大電路與間距脈波產生電路設計與製作後須先接上馬達

做一連串的測試〈此時系統並無回受控制〉測試間距脈波是否太長或太短硬

體電路是否有缺失hellip等等另一方面也著手撰寫模糊控制程式並將其與硬體電

路結合最後做閉迴路系統的整合測試若發現系統的運作結果並不如預期

則需分別從硬體與軟體兩方面去改良

直流馬達轉速之模糊控制

文獻蒐集與整理

AB信號產生電路設計與製作

驅動功率放大電路設計與製作

間距脈波產生電路設計與製作

測試間距脈波是否太長或太短

系統測試測試馬達轉速是否

達到控制目的

結束與論文寫作

重新設計間距脈波長度

Yes

No

系統整合與修正

輸出信號與Fuzzy控制器之連結設計

規劃輸出與輸入歸屬函數

規劃模糊知識庫

撰寫主程式並加入模糊知識庫

程式編譯及連結

軟硬體整合測試馬達是否運作

程式調整及最佳化

No

YesYes

No

圖 31 專題製作流程圖

18

32 雙脈寬調變法之直流馬達驅動電路設計

本專題製作的雙脈寬調變法之直流馬達驅動電路設計大致可以分為二大部

分第一雙脈寬調變法之電路設計第二橋型驅動功率放大電路

雙脈寬調變〈Two Pulse Width Modulation簡稱TPWM〉之電路設計主要

是先製作一脈寬調變〈Pulse Width Modulation簡稱PWM〉波形然後再將此

波形各別經由一緩衝器〈buffer〉和反向器〈inverter〉則可產生AB驅動信號

脈波此即為TPWM

321 脈寬調變電路

如圖32先利用兩顆op產生三角波電路再利用一個比較器比較三角波

和誤差值之大小

150k

1M

20k

+12V

-12V

+12V

-12V10k

+12V

-12V

10k

+12V

-12V-

+-

+

-

+ PWMLM324

LM324

LM324

2200pF

圖 32 脈寬調變電路

〈1〉 三角波產生電路

三角波產生電路通常至少需要兩個運算放大器其電路如圖33OP1

為一個反相積分器OP2為一個史密特磁滯比較器將OP2的輸出方波經

19

OP1反相積分以後得到Vo1三角波此三角波又同時加到OP2控制其狀

態的改變

當方波產生器的輸出是正的則三角波產生器的輸出是斜向負相似

地當方波產生器的輸出是負則三角波產生器的輸出是斜向正這個動

作將產生三角波的輸出同時也輸出方波﹝9﹞

+VCC

-VCC

-

+

R1

R2

R3

+VCC

-VCC

-

+

OP1

OP2

Vo2Vo1

圖 33 三角波產生電路

對OP2而言是磁滯比較必須先找到OP2的 THV 和 TLV

232

21

32

3oo v

RRR

vRR

Rv

++

+=+ 〈31〉

當 0=+v 時

23

21 oo v

RR

v minus= 〈32〉

表要達到OP2的 0=+v 必須有這麼大的 1ov

當 12 sato Ev = 時

TLsato VERR

v =minus= 13

21 〈33〉

當 22 sato Ev minus= 時

THsato VERR

v =+= 23

21 〈34〉

20

對OP1而言是反相積分器 2ov 為其輸入 1ov 為其輸出則

tCIt

Rv

Ct

CRv

dtvCR

v oooo

11

2

11

22

111

11minus=minus=minus=minus= int 〈35〉

因為

1

2

Rvv

I o minusminus= 0=minusv 〈因為虛接地〉 〈36〉

所以

1

2

Rv

I o= 〈37〉

又因運算放大器的輸入阻抗非常大則流經 1C 的電流也為 I 相當於以定

電流對電容C 充電

當 12 sato Ev = 時 1ov 為下降斜波

tR

EC

v sato

1

1

11

1minus= 〈38〉

當 22 sato Ev minus= 時 1ov 上升斜波

( )

tRE

Cv sat

o1

2

11

1 minusminus= 〈39〉

由此可知三角波的上升與下降斜波乃因 1C 的充電與放電且時間

常數為 11CR

三角波週期分析如下

1 上升斜波的時間 1T

tCR

vv o

o1

1

21 minus= 11

2

1 CRvv

to

ominus=

1Tt = TLTHo VVv minus=1 22 sato Ev =

11111

21

sat

TLTH

sat

TLTH

EVV

CRCRE

VVT

minus=

minusminus= 〈310〉

2 下降斜波的時間 2T

tCR

vv o

o1

1

21 minus= 11

2

1 CRvv

to

ominus=

21

2Tt = THTLo VVv minus=1 12 sato Ev =

1

11111

1sat

TLTH

sat

THTL

EVV

CRCRE

VVT

minus=

minusminus= 〈311〉

3 週期 21 TTT +=

若 1satE = 2satE = satE 且3

22RR

VV TLTH =minus satE

3

2114

RR

CRT=

若R3 = nR2

則nCR

T 114=

114 CR

nf = 〈312〉

《實驗結果》

必須注意的是三角波的頻率太低將導致馬達的轉動產生脈動現象

故將工作頻率設計在1kHz以上

Ω= k1501R Ω= k102R

Ω= k203R pFC 22001 =

所得到的三角波頻率為

15kHz10220010001504

00010100020

f 12- =timestimestimestimes

timestimes

=

圖 34 三角波輸出波形

22

〈2〉 脈寬調變電路〈PWM〉

+12V

-12V

10k

+12V

-12V -

+ PWM輸出LM324三角波輸入

圖 35 脈寬調變電路

PWM系統往往連接至直流電源供應放大器的工作是以固定的頻率開

閉直流供應電壓其激發角是可以調整的因此得到波寬可調的輸出

將固定頻率的三角波與反向輸入的電壓做比較便可輸出一脈寬〈見圖

36〉反向電阻值的不同將導致反向輸入電壓不同故其輸出為一可調但

頻率固定的脈寬也正因為如此故稱為脈寬調變〈PWM〉由於輸出的

dutycycle不同故馬達將接收到不同的平均電壓因而可以藉由PWM控制

馬達的轉速

反相輸入電壓

PWM

圖 36 三角波與反相輸入電壓比較

23

PWM的優點在於馬達驅動電路的電晶體之控制信號改以脈波列來控

制使電晶體操作成類似開關的動作不是完全導通就是完全截止故電晶

體不是一直操作於作用區所以其功率消耗不大整體效率較高

《實驗結果》

圖 37 PWM 輸出波形

322 橋型驅動功率放大電路

如圖38所示主要由四個功率電晶體組成利用不同的電晶體對使直流

馬達做正逆轉控制當Q5Q8導通使馬達正轉當Q6Q7導通馬達則逆

轉電路中的電晶體扮演開關的作用

此種電路簡單只要一組直流電源供應且電晶體分擔了部份的電壓保護

電晶體迅速工作於截止與飽和狀態之間故沒有功率散逸損失之虞

但是在設計時切勿使Q5Q6同時導通以免燒毀電路上之元件因為在

AB兩脈波短暫的交變時間內由於電晶體本身之最小延遲時間有可能使Q5

Q6同時ON與Q7Q8在很短時間同時ON因此在15kHz交變下容易燒毀功

率電晶體

因此設計一間距脈波電路主要之功用使Q5Q6和Q7Q8均不同時導通

24

以拉長AB兩者交換時間

M

20k

10k

20k

10k

+24V

A 信號 B 信號

2N3055 2N3055

2N2955 2N2955

1N40021N4002

C1815 C1815

C1815 C1815

Q5

Q8Q6

Q7

圖 38 橋型驅動功率放大電路

圖 39 橋型驅動功率放大電路實體圖

25

此外若考慮電晶體BE間的電壓則電路會出現約 plusmn 06V的不感帶〈ded

band〉即電晶體的 oV 對 inV 間的關係如圖3101假使 inV 電壓為正弦波則 oV 變

成如圖3102為了改善這種缺失吾人利用兩個二極體接在電路上如圖38

用來補償電晶體BE間的壓降﹝10﹞

約06V

Dead band

Vo

Vin

圖 3101 呈現不感帶的轉移函數

圖 3102 輸出電壓波形

26

323 間距脈波產生電路

RCext15

Cext14 74123

A3

B2

Q13

CLR1

Q4

7486100k

2200pF

10k

10000pF

+5V

間距脈波輸出

圖 311 間距脈波產生電路

間距脈波的產生方式是根據脈寬調變〈PWM〉後的訊號再經由積分電路的

電阻兩端取出且經由兩倍頻器〈74LS86〉檢示出PWM的正負緣脈波最後

再利用單穩態IC〈74LS123〉將檢出信號之脈寬拉長至01ms此即為間距脈波

74LS123有兩個輸入端子A及B分別為下降波緣輸入端子及上升波緣輸入端

子當輸入A之脈波由ldquoH變成ldquoL之瞬間Q輸出變為ldquoH其持續時間長

短由RC時間常數決定反之當輸入B之脈波由ldquoL變成ldquoH之瞬間Q輸出

變成ldquoH維持一定時間

74LS123的輸出脈波之寬度是由電阻及電容之時間常數所決定概略計算公

式如下

CR045T timestimes=

電容 C 必須大於 1000pF

27

《實驗結果》

R=24kΩ C=10000pF

所以得到間距脈波為

( )msec0110810000p24k045T cong=timestimes= μ

圖 312 間距脈波

研究經分析後發現

1 間距 T 愈大愈能確保電路之安全性愈有保護作用

2 間距 T 愈大相對的使驅動信號脈波減少愈多造成馬達旋轉扭力大

大減弱

3 適當的間距 T不但不會影響馬達的輸出轉矩而且兼具保護電路的

效果

33 編碼器

轉動編碼器不只可以作為轉速的感測也能做位置的感測又適合於數位處

理故被廣泛使用若就信號來看轉動編碼器可分為增量型與絕對型若以檢

測的方式來分可分為光學式和磁式兩種在本專題中所使用的編碼器為光學式

增量型編碼器﹝11﹞

光學式轉動編碼器的原理如圖 313在附有細縫轉盤的兩側分別裝置發光元

28

件與受光元件如果只有一組光電檢測元件則輸出信號就只有一相的脈波信

號此種裝置稱為脈波產生器圖 314 為增量型轉碼器的輸出信號它是利用

兩組光電元件所產生的脈波信號A 相和 B 相間有相位差正轉時 A 相領前 B

相逆轉時 B 相領前 A 相因此利用此兩相做檢測馬達為正轉或逆轉的工作

並利用 A 相或 B 相的頻率檢測出目前的轉速

吾人計算出編碼器每一轉可以產生約 200 個脈波故檢測 A 相或 B 相其頻

率為 N則轉速應為 60200

timesN

〈rpm〉

圖 313 光學式轉動編碼器的原理圖

圖 314 編碼器的輸出信號波形

29

34 LM2917 FV 電路設計

對 LM2907 而言磁滯比較器和電流汞是構成頻率對電壓轉換的基本架構

並且預留一個運算放大器及一個電晶體供各種不同的使用圖 315 為吾人所設

計的 FV 電路圖中 C1 用以抑制電流汞動作時所產生的漣波變化正常使用時

此電容應大於 10C若 C1 太大也將造成轉換速度下降

因為單晶片 8051 之輸入電壓最高為 5V故必須設計其馬達最高轉速頻率所

轉成的電壓必須在 5V 以內由於馬達轉速頻率範圍極大故吾人給予 LM2917

+12V 的電壓以擴大它可以轉換的電壓範圍並將所需維持在 5V 內

a1

14

b1

1

a1

13

b1

2

a1

12

b1

3

a1

11

b1

4

1

a1

10

b1

5

a1

8

b1

7

a1

9

b1

6

L2917

Encoder輸 入

1uF

+12V

FV輸出1000pF

45k 10kC1

C2

圖 315 FV 電路

30

《實驗結果》

根據統計結果每 50mV 相對於 100Hz如此一來吾人想得知馬達目前

的轉速只要將單晶片所接收到的電壓值經過換算即可得知目前 encoder 所量測

的頻率吾人知道 encoder 一圈可產生 200 個脈波故馬達的轉速便可經過下列

公式換算得知

轉速〈rpm〉 60200

times=f

其中 =f encoder 所量測到的頻率

表 31 頻率與轉換電壓之關係

頻率

(Hz) 1 2 3 4 5 6 7 8 9

電壓(V) 0006 0006 0007 0008 0009 0009 0009 0009 001

頻率

(Hz) 10 20 30 40 50 60 70 80 90

電壓(V) 008 009 010 010 011 011 012 012 013

頻率

(Hz) 100 200 300 400 500 600 700 800 900

電壓(V) 013 018 023 028 033 038 043 049 054

頻率

(Hz) 1000 2000 3000 4000 5000 6000 7000 8000 9000

電壓(V) 059 109 16 209 257 304 3508 4006 45

31

圖 316 頻率對電壓曲線

35 單晶片介面電路

單晶片介面包括了二大部分分別為單晶片 8051AD converter

〈1〉8051 單晶片

為本控制系統的核心一切動作皆經由它控制

〈2〉AD converter

將類比開關所送出來的類比訊號經由 ADC 0804 轉換成數位訊號傳送

到單晶片的輸入埠

351 AD 轉換

以單晶片 8051 控制 ADC0804則單晶片 8051 必須下達ldquo開始轉換rdquo的命令

給 ADC0804然後 ADC0804 就開始讀入類比輸入端的電壓在內部開始轉換

經過一段轉換時間後〈約 100μ s〉ADC0804 就將轉換完成的值放在其內部的三

態輸出栓鎖緩衝器裡然後將轉換完成輸出腳〈INTR〉降為 low以通知單晶片

可以去讀轉換完成資料

當WR和CS 同時為ldquo0rdquo時表示對 ADC0804 下達ldquo開始轉換rdquo命令再經過

32

一段轉換時間〈100μ s〉後轉換完成ADC0804 會將其轉換完成的數位資料放

在其內部 8 位元緩衝區裡且將 INTR 降為ldquo0rdquo因此單晶片只要下達ldquo開始轉換rdquo

命令後去檢查 INTR 的狀態就可以知道是否轉換完畢其方法有兩種

1 輪詢法〈polling〉

2 中斷法〈interrupt〉

所謂輪詢法就是將 ADC0804 的 INTR接到 CPU 的一條 IO 線上然後以軟體指

令主動偵測其狀態當偵測到為ldquo0rdquo時就可以去讀出 ADC0804 裡的緩衝區的轉

換值

中斷法是一個很理想的 IO 方式因為不像輪詢法必須讓 CPU 等 ADC0804

轉換當 CPU 下達ldquo開始轉換rdquo命令後就可以做其他工作當 ADC0804 轉換完

畢後 INTR會降為ldquo0rdquo可以利用此信號去中斷 CPU再由中斷副程式去讀入

轉換值即可因此大大提高了程式的效率

當 CPU 接收到 ADC0804 發出ldquo轉換完畢rdquo的信號〈 INTR =0〉後就可以去

讀出轉換值其讀出的方法是將CS 與RD設為ldquo0rdquo即可讀到轉換值這個讀值的

動作又會使得 INTR恢復成ldquo1rdquo

1 CPU 下達ldquo開始轉換rdquo命令〈CS =0WR =0〉

2 ADC0804ldquo轉換完畢rdquo 〈 INTR =0〉

3 CPU 讀取轉換值〈 RD =0CS =0〉

4 讀完後 INTR =1

ADC0804 主要規格摘要如下

1 +5V 單電源工作電壓

2 類比電壓輸入範圍 0~+5V

33

3 參考電壓為 25V

4 轉換時間為 100μ s〈 CLKf =640kHz〉

5 解析度為 8 位元

6 誤差plusmn 1LSB

7 讀取時間 135ns

36 電源供應系統

本專題中所有電路及硬體設備所需的電源採用交流電源 110V 經由 PT-31

變壓器後再經過橋式整流後提供了直流電源而因為各個電路所需電源不同

因此製作了多組的變壓電路如下

1電壓源 DC5V選擇了 7805 的穩壓 IC 搭配電容得到了+5V 的電壓源

供〈1〉8051 微處理器 〈2〉ADC 0804 〈3〉74LS8674LS12374LS04

74LS02CD4013 〈4〉馬達 Encoder

2電壓源 DC12V使用 7812 穩壓 IC 搭配電容得到+12V 的電壓源供

LM2917 使用

3電壓源 DC24V利用 7824 的穩壓 IC 搭配電容獲得+24V 的直流電壓

源供電路之橋型驅動功率放大之電晶體使用

Vin1

+12V2

GND3

LM7812

2200uF 10000pF 2200uF 10000pF

+12V outputAC

圖 317 直流電源電路

34

圖 318 直流電源電路實體圖

37 馬達轉速的量測

表 33 PWM 輸出對應 encoder 週期

PWM dutycycle encoder 週期 PWM dutycycle encoder 週期

40 sμ 172 sμ 440 sμ 0 sμ

80 sμ 188 sμ 480 sμ 0 sμ

120 sμ 204 sμ 520 sμ 0 sμ

160 sμ 230 sμ 560 sμ 0 sμ

200 sμ 272 sμ 600 sμ 0 sμ

240 sμ 328 sμ 640 sμ 0 sμ

280 sμ 416 sμ 680 sμ 1320 sμ

320 sμ 540 sμ 720 sμ 750 sμ

360 sμ 800 sμ 760 sμ 510 sμ

400 sμ 1320 sμ 800 sμ 400 sμ

35

圖 319 PWM 輸出對應 encoder 週期

由統計可知道此馬達並不是一顆線性馬達故相信若使用模糊控制理論來

作為其回授控制系統的控制器一定能達到比傳統控制器的性能還要好而且若能

在模糊控制裡加上 PID 控制器的觀念一定能在系統的響應時間上升時間

安定時間和超越量達到最佳的控制另一方面馬達在其反方向的內阻較大需

要更大的力量才能使馬達驅動

36

第四章 軟體規劃與製作

41 PWM 之軟體設計

因為之前所介紹的硬體方式是以調整可變電阻來達到轉速的調整因此無法

得知所給予的脈寬長度和轉速大小尤其在回授時也不易給予適當的訊號來調整

轉速因此改良之方法就是以8051之軟體撰寫方式來產生固定的脈寬也就等

於給予轉速的命令而在其回授控制時也只要在內部程式给予適當的指令便可

達到脈寬長度的調整以達到閉迴路之受控系統

411 PWM 軟體流程

設定Timer0模式為0

TH0 = temp 32 TL0 = temp 32

temp = 8192 ndash j4 Key = 0

檢查是否有鍵值

將鍵值存入Key

Yes

No

設定Key值所對應的 j值

If P30 == 1Then P30 = 0 temp = 8192 ndash j4Else P30 = 1 temp=8192ndash880+j4

TH0 = temp 32 TL0 = temp 32

Start Timer0中斷副程式

啟動Timer0

等待Timer0中斷

返回主程式

圖 41 PWM 軟體設計流程圖

37

在此總共設計了五個按鈕分別代表不同的轉速停止正轉〈慢〉正轉

〈快〉逆轉〈慢〉和逆轉〈快〉使用Timer0是因為8051之計時中斷比延遲程

式來的準確故可以達到準確的計時程式設計理念中並沒有將中斷致能清除

因此Timer0會一直處於計時的狀態程式執行時將一邊檢查鍵值〈KeyStatus〉一

邊進行計時當計時完畢便呼叫中斷副程式然後執行改變Port 30的輸出狀

態若是為high則變為low反之若是為low即變為high同時並重設計時時間

Timer0繼續計時

當鍵值改變時計時的時間也會跟著改變如此一來Timer0將ㄧ直重覆上

述動作直到電源切掉Timer0才會停止計時

42 模糊控制之程式規劃與撰寫

本專題目標在完成了先前所規劃的硬體電路之後接著就是要達成利用模糊

控制理論來設計控制器在此採用了單晶片8051目的是為了以硬體實現方式來

代替電腦模擬期望能夠按照原訂計畫完成本專題「具模糊控制理論與雙脈寬調

變法之直流馬達驅動電路設計」

單晶片 8051 模糊控制的程式撰寫採下列幾個步驟依序完成

1 設定變數轉速誤差〈dspeed〉目前轉速〈sspeed〉

2 模糊化採用三角形歸屬函數採用三角形歸屬函數的原因

〈1〉 三角形函數為一連續函數

〈2〉 三角形函數為線性的函數所以計算速度較快

〈3〉 是具有發散也有收斂的函數和指數函數一樣接近

事實

3 模糊推論模糊規則將其所有可能發生情況以 IFhellipTHENhellip表示

並建立控制規則表

4 解模糊化採用重心法

38

421 歸屬函數

設定變數為目前轉速〈sspeed〉與轉速誤差〈dspeed〉因此此模糊控制器共

有兩個輸入訊號與一輸出訊號輸出訊號為脈寬長度該加或是減多少又因為有

五種不同的轉速因此各分別設計了不同的歸屬函數如下

1 當轉速 = 0

ml h

s s p e e d

d s p e e d

r p m0 5 0 1 0 0- 5 0- 1 0 0

mv l l h v h

r p m0- 3 0- 6 0- 1 0 0 3 0 6 0 1 0 0 圖 42 停止時之歸屬函數

2 正轉〈慢〉

ml hsspeed

dspeed

rpm150 225 300750

mvl l h vh

rpm150100500 200 250 300

圖 43 正轉〈慢〉之歸屬函數

39

3 正轉〈快〉

ml hsspeed

dspeed

rpm520 670 820370220

mvl l h vh

rpm500400300200 600 700 800

圖 44 正轉〈快〉之歸屬函數

4 逆轉〈慢〉

ml hsspeed

dspeed

rpm100 250 400500

mvl l h vh

rpm10050250 200 300 400 圖 45 逆轉〈慢〉之歸屬函數

40

5 逆轉〈快〉

ml hsspeed

dspeed

rpm300 450 600150

mvl l h vh

rpm450350250150 550 650 750

750

圖 46 逆轉〈快〉之歸屬函數

6 輸出

OutputMVL L H VH

rpm0-50-150-250 50 150 250

圖 47 輸出之歸屬函數

41

422 模糊規則庫

表 41 為吾人所設計的模糊控制規則庫並利用 Matlab 之 Fuzzy ToolBox 來

建立此規則庫以進行模擬推論圖 48 為當馬達輸入指令為正轉慢時推論後所得

到的三維空間圖

表 41 模糊控制規則表

Dspeed

vl l m h vh

l H M L VL VL

m VH H M L VL sspeed

h VH VH H M L

圖 48 推論後的三維空間圖

42

423 模糊控制器之軟體設計流程

Start 外部中斷副程式

ADCWR = 0 ADCWR = 1

〈令AD開始轉換〉

檢查鍵值以得到對應的歸屬函數

取得目前轉速與

轉速誤差

Fuzzy Rules決策

得到輸出訊號

Delay 10ms

ADC = 0 讀取AD值 ADCRD = 0

將AD值換算成轉速

ADCWR = 0 ADCWR = 1

〈AD開始轉換〉

返回主程式

致能外部中斷

圖 49 Fuzzy Controller 程式流程圖

當控制器一開始動作時便先執行AD轉換的工作當AD轉換完成時其

INTR的接腳便會觸發8051的外部中斷INTR0於是程式便發生外部中斷執行

外部中斷副程式的指令

43

在外部中斷副程式中AD將ㄧ直進行轉換與讀取的工作同時並將轉換後

的值直接換算成目前轉速與轉速誤差以供模糊控制器使用換算目前encoder

的頻率其公式為

160-V2000 times=頻率 〈4-1〉

式4-1之公式是根據表31所導出來的其中V為encoder之頻率轉成電壓之值

又假設所讀取的AD轉換值為value因為

AD的解析度 = bit256

5V+ = 511 ( Vbit ) 〈4-2〉

故value值與電壓V之關係為

511 value V times= 〈4-3〉

所以encoder之頻率與value值的關係為

頻率= 2000times ⎟⎠⎞

⎜⎝⎛ times

511 value - 160 〈4-4〉

故目前轉速為

sspeed = ( )rpm 60 200

times頻率 〈4-5〉

另ㄧ方面在主程式中程式會先去檢查鍵值也就等於檢查輸入指令以

找出符合使用的歸屬函數並將AD所獲得的轉速對應到歸屬函數中然後執行

決策判斷即進入規則庫中尋找出適當的決策判斷最後將此決策送入PWM程

式裡進行脈寬長度的調整使馬達在合理的要求下達到理想的轉速控制不會

因為外在環境的影響而使馬達轉速受到干擾

43 LCD 顯示轉速

此專題最後再增加一LCD顯示幕以顯示目前的轉速否則在程式設計完成

後人卻因無法以肉眼得知目前轉速而不能肯定馬達轉速是否有達到控制的目

標因此增加一顯示幕LCD是有必要的不僅隨時得知目前的轉速還能知道

44

設計出來的軟體其控制性是否夠好夠穩定

431 LCD 顯示幕之軟體流程

Start

設定LCD模組的初始狀態

設定外部中斷INTR0

與Timer0

設定TH0 = (65536 ndash 5000) 256 TL0 = (65536 ndash 5000)256

令ADCWR = 0 ADCWR = 1 AD開始轉換

等待中斷

外部中斷副程式

ADCRD = 0 讀取AD值 ADCRD = 1

將AD值換算成速度

ADCWR = 0 ADCWR = 1 AD開始轉換

Timer0中斷副程式

顯示LCD第一行

ldquoMotor Speed =

顯示LCD第二行ldquoxxxxxxx rpm其中 xxxxxx為外部中斷副程式所換算出的轉速

重設TH0與TL0

返回主程式返回主程式

圖 410 LCD 顯示幕之程式流程圖

此程式主要由兩個部分完成一為外部中斷副程式另ㄧ為 Timer0 中斷副

程式當主程式完成外部與 Timer0 兩個中斷的設定後隨即命令 AD 開始轉換

之後便一直停在 while〈1〉的迴圈裡不做任何動作而由兩個中斷副程式來完

成整個轉換與顯示的工作

45

外部中斷副程式主要負責 AD 的轉換讀取與轉速換算的工作AD 第一

次的轉換由主程式來下達命令當轉換完成後AD 的 INTR 接腳將觸發外部中

斷〈INTR0〉副程式此時程式便進入外部中斷副程式執行讀取 AD 值與轉速

換算的工作當這些工作完成時外部中斷副程式再次下達 AD 開始轉換的命

令而離開中斷副程式當 AD 再次轉換完成時又將再次執行中斷副程式

如此週而復始中斷副程式將ㄧ直進行讀取換算與轉換的工作

而 Timer0 中斷副程式主要負責 LCD 顯示之工作當主程式所設定的計時時

間計數完時程式便進入 Timer0 中斷副程式一旦進入 Timer0 中斷副程式程

式將執行 LCD 的顯示然後再重設 Timer0 的計數時間Timer0 將重新計數當

計數完時程式又將再度進入 Timer0 中斷副程式執行因為程式中並無清除

Timer0 的中斷致能故 Timer0 中斷副程式和外部中斷副程式ㄧ樣週而復始的

執行其副程式的工作

46

第五章 結論

本計劃主旨為具模糊控制理論與雙脈寬調變法之直流馬達驅動電路設計主

要是針對傳統電路設計之缺點提出改良之方法以TPWM取代PWM電路以模

糊理論基礎設計之控制器替代傳統PID控制器

TPWM轉速控制優於PWM之處在於

1 TPWM只需使用單電源即可達到正轉和逆轉的轉速控制而PWM必須

加上逆向開關或是雙電源才能使馬達產生正轉和逆轉

2 TPWM可控制馬達處於停止狀態無論在正向或逆向加上負載皆無法使

馬達產生轉動

3 馬達消耗定額功率輸出轉矩為額定值

4 馬達由停止到某定轉速時反應時間較快

模糊控制器優於PID控制器

1 不須導出繁雜的數學模型

2 適用於非線性系統

3 強健性與容錯性較高

本專題至此雖說大致的目標都已達到但是此系統仍然有許多不完美而需要

改進的地方例如在實驗過程中發現整個轉速的控制在回授上其反應時間

有點慢探討其原因有可能是控制器之程式上的問題

1 因為使用C語言撰寫程式故其執行速度較慢

2 程式可能寫的太累贅

3 模糊控制規則庫建立不良

若想改善這些問題可以嘗試著將C語言改為組合語言來撰寫並盡量減少

47

不必要的指令相信此動作一定能大大提昇程式的執行速度其次就是多做測

試利用測試中所學到的經驗來幫助模糊控制規則庫的改寫同時也能從測試中

發現更多的問題若是都能對問題加以一一解決的話相信必定能將此控制系統

做的更盡善盡美

48

參考文獻

﹝1﹞ 李適中直流馬達速度控制伺服控制〈基礎篇〉全華科技圖書股份有

限公司民 74

﹝2﹞ 廖錦文ldquo直流電動機之雙脈寬調變是〈TPWM〉驅動電路研究電

子技術月刊第 69 期pp94-1021992

﹝3﹞ 楊英魁孫宗瀛鄭魁香林建德蔣旭堂模糊控制理論與技術全華

科技圖書股份有限公司民 85

﹝4﹞ 林敦煌陳憬德直流馬達定位及轉速的模糊控制逢甲大學自動控制工

程學系學士論文民 87

﹝5﹞ LAZadehldquo Fuzzy Sets Information and Control Vol8 pp338-353

1965

﹝6﹞ EHMamdani and SAsslianldquo A fuzzy logic controller for a dynamic

plant Internation Journal of Man-Machine Studies Vol7 pp1-13 1975

﹝7﹞ 孫宗瀛楊英魁Fuzzy 控制理論實作與應用全華科技圖書股份有

限公司民 83 年

﹝8﹞ 許中平黃煌嘉直流電動機控制電路設計全華科技圖書股份有限公司

民 75

﹝9﹞ 盧明智黃敏祥OP Amp 應用+實驗模擬全華科技圖書股份有限公司

民 83

﹝10﹞陳文耀電動機控制工程復文書局2003

﹝11﹞許中平林全福電動機運轉控制技術全華科技圖書股份有限公司民

77

﹝12﹞楊明豐8051 單晶片 C 語言設計實務碁峯資訊2003 年

﹝13﹞蔡朝洋單晶片微電腦 80518951 原理與應用全華科技圖書股份有限公

司民 91

49

﹝14﹞王文俊認識 Fuzzy全華科技圖書股份有限公司民 90

50

附錄 A 專題硬體展示圖

圖 A-1 硬體整體圖

圖 A-2 硬體整體鳥瞰圖

51

圖 A-3 硬體側視圖

圖 A-4 操作與顯示面板

圖 A-5 間距脈波電路與 FV 電路

52

圖 A-6 橋型驅動功率放大電路

圖 A-7 操作與控制面板

53

附錄 B PWM 與模糊控制之程式

include reg51h include stdioh sbit ADCRD = P3^1 設定 RD 控制線接腳為 P31 sbit ADCWR = P3^3 設定 WR 控制線接腳為 P33 sbit P2_0 = 0xA0 接腳定義 sbit P2_1 = 0xA1 接腳定義 sbit P3_0 = 0xB0 接腳定義 sbit P3_1 = 0xB1 接腳定義 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P3_6 = 0xB6 接腳定義 void KeyStatus(void) 函數原型宣告 void feedback(void) 函數原型宣告 void compute_grade(void) 函數原型宣告 void delay1ms(int count) 函數原型宣告 void convert() 函數原型宣告 void condition() 函數原型宣告 void CW(void) 函數原型宣告 int j i 對應 PWM 的寬度 unsigned int temp 所設計的計時器時間 int sample = 1000 取樣率設定消除顯示值跳動 long int value r1 讀取 ADC0804 數位資料 long int set n condition select long int r grade_reg[2] grade[15] error1 error2 long int a1 b1 I long int membership[5][3]membership1[3][3] 定義歸屬函數 long int membership2[3][3] = -10-50-5050510 long int error[2] int Rule[15][3] = 113213313 定義判斷規則庫 212223323 311232333 411241342 511251351

54

main() 主程式 j = PWM = 110 設定 PWM 初始值 IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x00 設定計時器 0 工作於模式 0 temp=8192-j4 設定計時器 0 初值 TH0 = temp 32 TL0 = temp 32 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 P3_4 = 1 P3_5 = 0 P3_6 = 0 ADCWR = 0 令 ADC0804 的 WR = 0 ADCWR = 1 令 ADC0804 的 WR = 1 while (1) KeyStatus() 檢查鍵值 void KeyStatus(void) 檢查鍵值並給對應的 PWM 值 char KeyScan(void) 按鍵掃描函數宣告 unsigned char KeyStatus unsigned char Key = 0 KeyStatus=KeyScan() 呼叫按鍵掃描函數 if (KeyStatus = 0) 已有按鍵輸入 Key = KeyStatus Key = 鍵值 if (Key == 0x01) 假如輸入為按鍵 1 i = 110 PWM 為 110us j = i P3_4 = 1 LED 亮第一顆〈表馬達停止〉 P3_5 = 0 P3_6 = 0

55

else if (Key == 0x02 ) 假如輸入為按鍵 2 i = 140 PWM 為 140us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x04 ) 假如輸入為按鍵 3 i = 180 PWM 為 180us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x08 ) 假如輸入為按鍵 4 i = 80 PWM 為 80us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 else if (Key == 0x10 ) 假如輸入為按鍵 5 i = 40 PWM 為 40us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 PWM = j delay1ms(10) 呼叫延遲函數 feedback() 模糊控制判斷

56

void To_int(void) interrupt 1 Timer0 中斷函數 if (P3_0 == 0) 假如 PWM 輸出為 Low P3_0 = 1 變更 PWM 輸出為 High temp=8192-j4 設定 High 的時間 else 若 PWM 輸出為 High P3_0 = 0 變更 PWM 輸出為 Low temp=8192-880+j4 設定 Low 的時間 TH0 = temp 32 Timer0 的計時時間 TL0 = temp 32 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 char KeyScan(void) 檢查鍵值 char KeyStatus 按鍵狀態 P0=0xff 設定 P0 為輸入模式 KeyStatus=~P0 讀取按鍵狀態 return(KeyStatus) 將鍵值送回程式 void feedback(void) 模糊判斷 void Fuzzycontroller() 函數原型宣告 void condition1() 函數原型宣告

57

void condition2() 函數原型宣告 error1 = ((value)40-160)03 輸入變數 1 delay10ms(10) 延遲 10ms error2 = ((value)40-160)03 輸入變數 2 if (key == 0x01 ) 當按鍵 1找出對應的歸屬函數 並做出模糊控制判斷

int membership[5][3]= -100-60-30-60-300-30030030603060100

int membership1[3][3]=-100-500-50050050100 Fuzzycontroller() condition() if (key == 0x02 ) 當按鍵 2找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

05010050100150100150200150200250200250300 int membership1[3][3]=07515075150225150225300 Fuzzycontroller() condition() else if (key == 0x04) 當按鍵 3找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

200320400300400500400500600500600700600700800 int membership1[3][3]=220370520370520670520670820 Fuzzycontroller() condition() else if (key == 0x08) 當按鍵 4找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

02550255010050100200100200300200300400 int membership1[3][3]=05010050100250100250400 Fuzzycontroller() condition()

58

else if (key == 0x10) 當按鍵 5找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

150250350250350450350450550450550650550650750 int membership1[3][3]=150300450300450600450600750 Fuzzycontroller() condition2() void Fuzzycontroller() 模糊控制判斷 void compute_grade() 函數原型宣告 void compute_grade1() 函數原型宣告 a1 = 0 b1 = 001 I = 0 for (n=0 nlt=14 n++) r = error1 set = Rule[n][0]-1 compute_grade() 計算輸入變數 1 與

模糊程度的歸屬函數 condition = 1 r = error2 set = Rule[n][1]-1 compute_grade1() 計算輸入變數 2 與 模糊程度的歸屬函數 grade[n] = MIN(grade_reg[0] grade_reg[1]) a1 = a1 + (grade[n]membership2[Rule[n][2]-1][1]) b1 = b1 + grade[n] I = a1 b1 得到模糊控制判斷的結果 void compute_grade() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership[set][0]) || (r gt membership[set][2])) 當輸入變數不在 歸屬函數內

59

grade_reg[condition] = 0 else if ((r gt membership[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership[set][2]-r) (membership[set][2] - membership[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership[set][0]) (membership[set][1] - membership[set][0]) void compute_grade1() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership1[set][0]) || (r gt membership1[set][2])) 當輸入變數不在 歸屬函數內 grade_reg[condition] = 0 else if ((r gt membership1[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership1[set][2]-r) (membership1[set][2]-membership1[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership1[set][0]) (membership1[set][1]-membership1[set][0])

60

void condition() P2_0 = 1 設定 P20 為輸入模式 P2_1 = 1 設定 P21 為輸入模式 if ( (P2_0 == 1) ampamp (P2_1 == 0)) 當馬達為正轉時 if ( I gt 0 ) 若模糊判斷結果為正 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 若模糊判斷結果為零 PWM = PWM + 0 PWM 寬度不變 if ( I lt 0 ) 若模糊控制結果小於零 PWM = PWM + 1 PWM 寬度加 1 else if ( (P2_0 == 0) ampamp (P2_1 == 1) ) 若馬達為反轉 if ( I lt 0 ) 模糊控制小於零 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 模糊控制等於零 PWM = PWM + 0 PWM 寬度不變 if ( I gt 0 ) 模糊控制大於零 PWM = PWM + 1 PWM 寬度加 1 CW() 判斷 PWM 寬度上下限

61

void CW() 判斷 PWM 寬度上下限 if ( PWM gt= 215 ) 若 PWM 寬度 gt= 最大寬度 j = 215 PWM 寬度維持於 215us if ( PWM lt= 5 ) 若 PWM 寬度 lt= 最小寬度 j = 5 PWM 寬度維持在 5us if ( PWM gt 5 ampamp PWM lt 215 ) PWM 寬度介於最大與最小間 j = PWM PWM 依模糊控制判斷結果增減 void delay1ms(int count) 延遲 1ms int x y for ( x = 0 x lt count x++ ) for ( y = 0 y lt 122 y++ ) void convert() 數位資料換算成馬達轉速 r1 = ((value)40)-160

62

附錄 C LCD 顯示之程式

includereg51h 含 8051 所有暫存器宣告 include mathh define RS P3_5 LCD 指令資料選擇控制 define RW P3_4 LCD 讀寫控制腳 define Enable P3_3 LCD 致能接腳 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P0_0 = 0x80 接腳定義 sbit P0_1 = 0x81 接腳定義 sbit P0_2 = 0x82 接腳定義 sbit P0_3 = 0x83 接腳定義 sbit P0_4 = 0x84 接腳定義 sbit P0_5 = 0x85 接腳定義 sbit P0_6 = 0x86 接腳定義 sbit ADCRD = P3^7 設定 RD 控制線接腳為 P37 sbit ADCWR = P3^6 設定 WR 控制線接腳為 P36 void delay(void) 函數原型宣告 void delay10ms(int count) 函數原型宣告 void display(void) 函數原型宣告 void InitialLCD(void) 函數原型宣告 void WriteIns(char) 函數原型宣告 void WriteData(char) 函數原型宣告 void WriteString(charchar) 函數原型宣告 void CheckBusy(void) 函數原型宣告 void convert(void) 函數原型宣告 char MSG0[] = Motor Speed = 定義字串 MSG0 char MSG2[] = rpm 定義字串 MSG2 unsigned char MSG1[8]=0000000 定義字串 MSG1 unsigned long int value 讀取 ADC0804 數位資料 int sample = 1000 取樣率設定消除顯示值跳動 long int rpm

63

main() 主程式 InitialLCD() 初始化 LCD IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x01 設定計時器 0 工作於模式 1 TH0 = (65536-5000)256 設定計時器 0 初值 TL0 = (65536-5000)256 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 while(1) 等待中斷 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 while (--sample == 0) 取樣率減 1 sample = 1000 重設取樣率 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 void T0_int(void) interrupt 1 LCD 顯示動態掃描 display() 動態掃描顯示 TH0 = (65536-65535)256 重設計時初值 TL0 = (65536-65535)256

64

void InitialLCD(void) 設定 LCD 模組初始狀態 delay() 延遲函數 WriteIns(0x38) 設定 LCD 模組為 WriteIns(0x38) 2 行顯示 WriteIns(0x38) 8 位元介面 WriteIns(0x38) 5x7 點字型 WriteIns(0x08) 關閉顯示器 WriteIns(0x01) 清除 LCD 螢幕 WriteIns(0x0c) 令顯示器 ON但游標不顯示 WriteIns(0x06) 令 LCD 模組每接收到 1Byte 資料 AC 值自動加 1 void display() 掃描顯示 WriteIns(0x80) 設定 LCD 座標 WriteString(13MSG0) 將字串 MSG0 寫入 LCD 中 WriteIns(0xc0) 設定 LCD 座標 WriteString(8MSG1) 將字串 MSG1 寫入 LCD 中 WriteIns(0xc8) 設定 LCD 座標 WriteString(4MSG2) 將字串 MSG2 寫入 LCD 中 void convert(void) 換算轉速 long int freq freq = ((value)4000) - 16000 數位資料換成頻率公式 rpm = freq3 頻率換算轉速公式 MSG1[0] = (rpm1000000)+0x30 將結果存入字串 MSG1 中 MSG1[1] = ((rpm1000000)100000)+0x30 MSG1[2] = ((rpm100000)10000)+0x30 MSG1[3] = ((rpm10000)1000)+0x30 MSG1[4] = 0x2e MSG1[5] = ((rpm1000)100)+0x30 MSG1[6] = ((rpm100)10)+0x30 MSG1[7] = rpm10+0x30

65

void WriteIns(char instruction) 寫命令至 LCD 中 RS = 0 選擇指令暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = instruction 輸出命令至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteData(char i) 寫資料至 LCD 中 RS = 1 選擇資料暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = i 輸出資料至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteString(countMSG) 寫字串至 LCD 中 char count 字串長度 char MSG[] 字串資料 char i 定義位元組變數 for(i=0 iltcount i++) count 個位元組 WriteData(MSG[i]) 寫入一位元組的資料至 LCD 中 void CheckBusy(void) char i=0x80 檢查忙碌旗標 while(iamp0x80) 忙錄旗標 BF = 1 RS = 0 選擇指令暫存器 RW = 1 讀取 Enable = 1 致能 LCD i = P2 讀取 LCD 指令暫存器內的資料

66

Enable = 0 除能 LCD delay() 延遲函數 void delay() 延遲 5ms int i for(i=0 ilt250 i++)

  • 畢業專題封面pdf
  • File0004pdf
  • 最終版pdfpdf
Page 12: Based on Fuzzy Control Theorem and TPWM Method for DC ... · 使吾人想設計一模糊控制器來做為馬達轉速的閉迴路控制,以解決非線性系統的 問題。除此之外,flcs

3

此外馬達的轉速會因其驅動機構的慣性影響不可能「說停就停」也

會因為摩擦力等影響不可能「說動就動」故對其操控指令一定會有延遲的

現象發生這些因素使馬達不是一個典型的線性系統故傳統的 PID 控制器就

不是最好的選擇再加上近年來模糊控制系統〈Fuzzy Logic Control System

FLCS〉的發展﹝3﹞使吾人想設計一模糊控制器來做為馬達轉速的閉迴路控

制以解決非線性系統的問題除此之外FLCS 在上升時間安定時間和超

越量上的要求也都優於傳統的 PID 控制器[4]

目前雖然有很多從事於馬達轉速控制的相關研究但是多採用脈波寬度調

變法且其尚有缺失待改良因此吾人想採用雙脈波寬度調變雖然有關此法

的研究並不多見但 TPWM 卻具有 PWM 所沒有的優點再加上近來發展愈

盛的模糊控制理論較傳統 PID 控制器的優點相信馬達轉速以 TPWM 驅動電

路之模糊控制是值得去加以研究和探討的

13 研究方法

本專題計畫其研究方法主要分為兩大類一為硬體結構電路設計另一為

Fuzzy 控制器之軟體製作硬體結構方面主要設計一比較放大器使其誤差值經

此電路與三角波比較而輸出 A 驅動信號脈波與 B 驅動信號脈波然後再由驅動

功率放大電路將信號脈波放大後控制馬達正逆轉此外為了確保功率放大電

路之安全性需在其之前加上一間距產生電路以防止其電路損毀

感測器方面則利用編碼器〈encoder〉感測出馬達的轉速然後再經由 FV

將其轉換為電壓此電壓再由 AD 轉換為數位信號送入單晶片 8051經由模

糊控制規則庫判斷並做出決策以達到馬達轉速的控制

4

14 研究目標

本專題研究目標如下

〈1〉 完成相關文獻資料之蒐集整理與討論

〈2〉 完成 AB 信號產生電路設計

〈3〉 完成間距脈波產生電路設計

〈4〉 完成驅動功率放大電路設計〈橋型驅動功率放大〉

〈5〉 完成 FV 電路設計

〈6〉 完成 AD 訊號轉換

〈7〉 編寫模糊控制法則與介面軟體設計

5

第二章 原理探討

21 模糊控制與理論

在傳統的控制領域裏控制系統動態模式的精確與否是影響控制優劣的最主

要關鍵系統動態的資訊越詳細則越能達到精確控制的目的然而對於複雜

的系統由於變數太多往往難以正確的描述系統的動態於是工程師便利用各

種方法來簡化系統動態以達成控制的目的但卻不盡理想換言之傳統的控

制理論對於明確系統有強而有力的控制能力但對於過於複雜或難以精確描述的

系統則顯得無能為力了因此便嘗試著以模糊數學來處理這些控制問題模糊

控制是屬於非線性式的控制在受控系統無法以線性數學模式精確描述的情況

下經由適當調整控制規則應具有比傳統控制方法更佳的控制性能

211 模糊理論概述

1965 年美國加州柏克萊分校的 LotfiAZadeh 教授首先在他主編的

「Information and Control」刊物上提出「Fuzzy Set」論文此為模糊邏輯理論的

創始模糊理論在經過了三十幾年的演化改進後無論是在應用或理論架構上

皆已日趨完備尤其近年來因人工智慧的迅速發展模糊理論儼然成為人工智慧

不可或缺的理論根基

Zadeh 教授曾提出一個互克性原理﹝5﹞「當系統的複雜性增長時對系統

特性做精確且有意義描述的能力亦相對降低最後精確性與有意義性將變成完全

互相排斥的特性」很高的複雜性意味著只能在一個刻意壓縮的低維因素空間觀

察而無法對問題的全部因素都進行考察使得原本是明確的概念變的模糊

Fuzzy 理論正是為了掌握這類具模糊特質的事物而發展出來的所以它的應用較

偏重於人類的經驗及對問題特性的掌握程度不主張用繁雜的數學分析及數學模

式來解決問題

Fuzzy 理論把傳統數學從二值邏輯〈binary logic〉擴展到連續多值〈continuous

6

multi-value〉利用歸屬函數〈membership function〉描述一個概念的程度亦及

使用 0 和 1 之間的數值來表示一個元素屬於某一概念的程度這個值稱為元素對

集合的歸屬度〈membership grade〉當歸屬度為 1 時表示該元素百分之百屬於

這個概念當歸屬度為 0 時則表示該元素完全不屬於這個概念介於兩者之間

的就是完全屬於和完全不屬於之間的灰色地帶

模糊理論的工程應用大約始於 1974 年倫敦大學的 EHMamdani 教授他根

據 Zadeh 提出的語言分析法〈linguistic approach〉及模糊推論〈fuzzy inference〉

運用 IF-THEN 形式的法則來敘述操作員的控制策略成功地應用在蒸汽機自動

運轉上﹝6﹞從此模糊理論的應用便迅速發展以在控制方面的研究成果最為

顯著模糊理論其實是一門相當生活化的學問由於使用語言變量描述因此更

具親和力與一般性人類日常生活所遇所用的一些敘述即大都是模糊的例如

那個人ldquo很高車開的ldquo很快等等其中ldquo很高ldquo很快並不是一個

明確值而只是描述事件的程度但是根據這些描述人類卻能很輕易的接收

212 模糊集合

模糊集合〈fuzzy set〉可視為傳統集合的擴張在模糊集合的世界中稱傳

統集合為明確集合〈crisp set〉所謂模糊集合是指用來表示界限或邊界不分明的

模糊概念的集合許多日常生活中的概念常常都不是清晰明確的這些可說是模

糊概念例如很高很快等這類概念無法用傳統的二值集合論即 0 或 1 表示

而Zadeh教授提出的Fuzzy集合論可以將這些概念由傳統集合論的特徵函數從非

0 即 1 的二值選擇推廣為從 0 到 1 之間的任何值做選擇得到新型的特徵函數

稱為歸屬函數

模糊集合由歸屬函數表示相對於明確集合的特徵函數其值只有 0 或 1 兩個

值即其值為在實軸閉區間[01]之中的任一實數模糊集合可以彌補明確集

合描述時所產生的不合理現象因此模糊集合比傳統的明確集合更具客觀性

7

213 歸屬函數

歸屬函數〈membership function〉為 0 到 1 之間的數值吾們可以藉由歸屬

函數來描述 Fuzzy 集合的特質它是 Fuzzy 理論的最基本觀念透過歸屬函數我

們才能對 Fuzzy 集合進行量化也才可能利用精確的數學方法分析處理模糊性資

歸屬函數在 Fuzzy 控制的應用範疇內都要具備凸〈convex〉及正規〈normal〉

等基本特性〈如圖 21〉歸屬度函數的定義可以分為數值及函數兩種數值定義

方式又稱為離散化歸屬函數它是直接給定有限 Fuzzy 集合內每個元素的歸屬

度並以向量的形式表現出來函數定義方式又稱為連續化歸屬函數它是以不

同形式的函數來描述 Fuzzy 集合

圖 211 正規且凸模糊集合

1

0 圖 212 正規非凸的模糊集合

8

一個模糊集合的歸屬函數可以有許多方式但是目前最廣泛使用的有吊鐘

型三角型梯型等歸屬函數

〈1〉吊鐘形歸屬函數

吊鐘形歸屬函數定義如下

μA=bell(xabc)= b

acx 2

1

1minus

+

〈21〉

圖 22 吊鐘型歸屬函數

〈2〉三角形歸屬函數

三角形歸屬函數可由三個參數(abc)來加以決定

=Aμ trangle(xabc)

⎪⎪⎪

⎪⎪⎪

ltleminusminus

ltleminusminus

=

other

cxbcbcx

bxaabax

0

〈22〉

其中a為歸屬函數左邊界b為歸屬函數中心值c為歸屬函數右邊界

9

圖 23 三角型歸屬函數

〈3〉梯型歸屬函數

梯型歸屬函數可由四個參數加以決定

=Aμ trapezoid(xabcd)

⎪⎪⎪⎪

⎪⎪⎪⎪

leleminusminus

ltle

ltleminusminus

=

other

dxcdcdx

cxb

bxaabax

0

1 〈23〉

圖 24 梯型歸屬函數

10

214 模糊推論與模糊規則

模糊推論〈fuzzy inference〉是根據知識庫保存的規則(rule)和給予的事實

推導出新的結論與傳統推論不同的地方是Fuzzy推論不只可以處理明確命題也

可以處理Fuzzy命題Fuzzy推論是依據近似推理〈approximate reasoning〉的概念

發展出來的比傳統推論的嚴正推理〈exact reasoning〉更合理也更具彈性近

似推理是兩種嚴正推理General Modus Ponens〈簡稱GMP〉及Genera Modus

Tollens〈簡稱GMT〉的一般化此原理是從傳統二值邏輯中的肯定律〈modus

ponens〉和否定律〈modus tollens〉推廣而來其中GMP又可稱為前向推理而

GMT則可稱為反向推理

〈1〉 GMP〈General Modus Ponens〉

規則IF x is A THEN y is B

事實x is Arsquo

結論y ix Brsquo 〈24〉

〈2〉 GMT〈General Modus Tollens〉

規則IF x is A THEN y is B

事實y is Brsquo

結論x is Arsquo 〈25〉

上式中IF x is A THEN y is B即為模糊規則〈fuzzy rules〉AArsquoBBrsquo

分別是定義在論域X及Y的模糊集合xy代表輸入變數及輸出變數的語言變數

一般來說「x is A」稱為前件部〈antecedent〉而「Y is B」則稱為後件部

〈consequence〉Fuzzy知識庫〈Fuzzy Knowledge Base簡稱FKB〉即由這些模

糊規則所組成的規則庫〈rule base〉和存放描述領域知識的Fuzzy變數及語言變數

的資料庫〈data base〉所組成所以FKB是用來描述受控對象所涉及的領域知

11

識和操控目標的一些定性及定量的資訊模糊知識庫和模糊推論是構成Fuzzy規

則系統核心的兩個重要部門﹝7﹞

模糊推論是模糊系統的核心根據知識庫的模糊法則進行模糊理論的合成運

算來模擬人類的思考決策模式一般來說規則的建立是採取十分主觀直覺的

方式依據相關領域專家的經驗與知識透過詢問進而將其知識經驗歸納條列出

重點再轉換成模糊規則的形式表現出來但是並非所有的專家或操作員都能

將自身的經驗知識以言詞的方式充分的表達出來且未必能整理成條列的模糊規

則所以知識規則的萃取工作往往是在建構模糊系統時最常遭遇到的困難之

215 模糊控制器

模糊控制是智慧型控制〈intelligent control〉系統的一種典型其基本特點

是不完全依賴受控對象的數學模型主要是利用人的操作經驗知識和推理技

術以及控制系統的某些訊息和性能得出對應的控制動作模糊控制是以並行

〈parallel〉方式處理規則的推理工作〈如圖25〉其近似推理會包容每個對操

控系統有貢獻的規則即使某些貢獻程度很小的規則也不會忽略

圖 25 模糊控制系統的構造

12

一個控制器的輸入通常是確定數值而非模糊輸出也是如此才能對被控對象

發生作用但是模糊邏輯控制器〈Fuzzy Logic Controller簡稱FLC〉則是以語

言化的控制規則為主體為了能夠把輸入的確定值與語言化之後的控制規則結

合必須把輸入的確定值模糊化〈fuzzification〉以便對應到FLC語言變數的論

域範圍中同樣的經過規則庫推理出來的結果是對應到輸出語言變數的論域

中所以也必須對其做解模糊化〈defuzzification〉的工作才能達成實際的控制

目標

一般模糊控制器的架構包含了五個主要部分定義變數模糊化知識庫

模糊推論及解模糊化

〈1〉 定義輸入及輸出變數

決定程序被觀察的狀況及考慮控制的動作輸入變數可以是擷取

自受控系統的觀測量也可以是推導出來的資料輸出變數則為操控

受控系統的操作量例如在一般控制問題上輸入變數通常為輸出

誤差e與輸出誤差之變化率e而控制變數則為下一個狀態之輸入

u其中eeu統稱為模糊變數

〈2〉 模糊化

將量測值轉換為語言變數的過程將外界所輸入的確定數值經由

一比例映射傳送到輸入變數所對應的模糊論域然後再利用模糊化

函數將此輸入資料轉換成適當的口語值以供模糊運算使用此口語

化變數稱之為模糊子集合

〈3〉 知識庫

模糊知識庫是模糊控制的依據由它來定義所有使用到的語言控

制法則及相關各項參數知識庫可說是整個控制系統資料核心其包

含了兩個部分資料庫〈data base〉與規則庫〈rules base〉

1 資料庫

提供處理模糊數據之相關定義資料庫所存放的資料是關

13

於如何將明確的資料轉換成模糊數值而資料的存放方式是以

歸屬函數表示該選用哪一種歸屬函數依實際的需要選定

以三角形歸屬函數最常被使用因其運算最為容易且又能充分

的表達模糊概念

2 規則庫

利用語言化的條件式控制規則描述控制目標和策略通常

控制規則可以由操控人員的經驗或專家的知識推導出來多個

控制規則所組成的集合就是規則庫

〈4〉 模糊推論

模糊推論為模糊控制最重要的核心其最主要的工作就是做實際

的決策過程處理模糊推論具有模擬人類做決策判斷的能力其基本

理論就是根據人類特有的近似推理方式如之前已說明的GMP和

GMTGMP為前向推理而GMT為逆向推理因為模糊推論為前向

運算因此GMP非常適合使用為模糊控制的推論機構

〈5〉 解模糊化

將推論完成所得到的模糊輸出量轉換成實際的明確數值以便和

外界溝通解模糊化的方法有很多例最大歸屬度法重心法高

度法面積法等

圖 26 模糊系統的基本架構

14

22 直流馬達數學模型

圖27為直流馬達等效電路簡圖其中

iV = 輸入電壓 ai = 電樞電流

zR = 電樞電阻 gT = 轉矩

aL = 電樞電感 bE = 反電動勢

φ = 空氣隙磁通量 ω = 轉子角速度

B = 黏滯摩擦係數 J = 轉動慣量

圖 27 直流馬達等效電路簡圖

由克希荷夫電壓定律知

( ) ( ) ( )tEdt

tdiLtiRV b

aaaai ++= 〈26〉

由於反電動勢 bE 與轉軸的角速度 ( )tω 及空氣隙磁通量φ之乘積成正比即

( ) ( ) ( )tKtKtE emb ωφω == 〈27〉

15

又轉矩的平衡方程式為

( ) ( ) ( )dt

tdJtBtTgωω += 〈28〉

且馬達轉矩 gT 與電樞電流 ( )tia 及空氣隙磁通量φ乘積成正比即

( ) ( ) ( )tiKtiKtT ataag == φ 〈29〉

取〈26〉~〈29〉式之拉氏變換得

( ) ( ) ( ) ( )sEssILsIRsV baaaai ++= 〈210〉

( ) ( )sKsE eb Ω= 〈211〉

( ) ( ) ( )sJssBsTg Ω+Ω= 〈212〉

( ) ( )sIKsT atg = 〈213〉

則馬達輸入電流與轉速為

( ) ( ) ( )( ) ( )( )

sR

sEsV

sLRsEsV

sIe

a

bi

aa

bia τ+

minus

=+minus

=1

〈214〉

( ) ( ) ( )

sB

sT

sJBsT

sm

gg

τ+=

+=Ω

1 〈215〉

其中a

ae R

L=τ 為電樞電流的電氣時間常數 BJ

m =τ 為馬達轉動的機械時間

常數

直流馬達轉速對輸入電壓的轉移函數 ( )sG 為

( ) ( )( ) ( )( ) etaa

t

i KKBJsRsLK

sVssG

+++=

Ω=

( )( ) etmea

t

KKssBRK

+++=

ττ 11 〈216〉

16

在一般情況電樞電感很小所以 eτ 可以忽略不計因此上式成為一階落後

方程式

( ) ( )( ) ( ) m

m

etma

t

i sTK

KKsBRK

sVssG

+=

++=

Ω=

11 τ 〈217〉

其中

eta

mam KKBR

BRT

+=

τ

eta

tm KKBR

KK

+=

所以直流馬達數學模式可以以圖28表之﹝8﹞

圖 28 直流馬達數學模式方塊圖

17

第三章 系統功能分析與製作規劃

31 專題製作流程

如圖 31 所示本專題主要分為兩條路徑進行一為硬體另一則為軟體程

式撰寫本章著重硬體的規劃設計軟體則在第四章中介紹在完成 AB 信號

產生電路驅動功率放大電路與間距脈波產生電路設計與製作後須先接上馬達

做一連串的測試〈此時系統並無回受控制〉測試間距脈波是否太長或太短硬

體電路是否有缺失hellip等等另一方面也著手撰寫模糊控制程式並將其與硬體電

路結合最後做閉迴路系統的整合測試若發現系統的運作結果並不如預期

則需分別從硬體與軟體兩方面去改良

直流馬達轉速之模糊控制

文獻蒐集與整理

AB信號產生電路設計與製作

驅動功率放大電路設計與製作

間距脈波產生電路設計與製作

測試間距脈波是否太長或太短

系統測試測試馬達轉速是否

達到控制目的

結束與論文寫作

重新設計間距脈波長度

Yes

No

系統整合與修正

輸出信號與Fuzzy控制器之連結設計

規劃輸出與輸入歸屬函數

規劃模糊知識庫

撰寫主程式並加入模糊知識庫

程式編譯及連結

軟硬體整合測試馬達是否運作

程式調整及最佳化

No

YesYes

No

圖 31 專題製作流程圖

18

32 雙脈寬調變法之直流馬達驅動電路設計

本專題製作的雙脈寬調變法之直流馬達驅動電路設計大致可以分為二大部

分第一雙脈寬調變法之電路設計第二橋型驅動功率放大電路

雙脈寬調變〈Two Pulse Width Modulation簡稱TPWM〉之電路設計主要

是先製作一脈寬調變〈Pulse Width Modulation簡稱PWM〉波形然後再將此

波形各別經由一緩衝器〈buffer〉和反向器〈inverter〉則可產生AB驅動信號

脈波此即為TPWM

321 脈寬調變電路

如圖32先利用兩顆op產生三角波電路再利用一個比較器比較三角波

和誤差值之大小

150k

1M

20k

+12V

-12V

+12V

-12V10k

+12V

-12V

10k

+12V

-12V-

+-

+

-

+ PWMLM324

LM324

LM324

2200pF

圖 32 脈寬調變電路

〈1〉 三角波產生電路

三角波產生電路通常至少需要兩個運算放大器其電路如圖33OP1

為一個反相積分器OP2為一個史密特磁滯比較器將OP2的輸出方波經

19

OP1反相積分以後得到Vo1三角波此三角波又同時加到OP2控制其狀

態的改變

當方波產生器的輸出是正的則三角波產生器的輸出是斜向負相似

地當方波產生器的輸出是負則三角波產生器的輸出是斜向正這個動

作將產生三角波的輸出同時也輸出方波﹝9﹞

+VCC

-VCC

-

+

R1

R2

R3

+VCC

-VCC

-

+

OP1

OP2

Vo2Vo1

圖 33 三角波產生電路

對OP2而言是磁滯比較必須先找到OP2的 THV 和 TLV

232

21

32

3oo v

RRR

vRR

Rv

++

+=+ 〈31〉

當 0=+v 時

23

21 oo v

RR

v minus= 〈32〉

表要達到OP2的 0=+v 必須有這麼大的 1ov

當 12 sato Ev = 時

TLsato VERR

v =minus= 13

21 〈33〉

當 22 sato Ev minus= 時

THsato VERR

v =+= 23

21 〈34〉

20

對OP1而言是反相積分器 2ov 為其輸入 1ov 為其輸出則

tCIt

Rv

Ct

CRv

dtvCR

v oooo

11

2

11

22

111

11minus=minus=minus=minus= int 〈35〉

因為

1

2

Rvv

I o minusminus= 0=minusv 〈因為虛接地〉 〈36〉

所以

1

2

Rv

I o= 〈37〉

又因運算放大器的輸入阻抗非常大則流經 1C 的電流也為 I 相當於以定

電流對電容C 充電

當 12 sato Ev = 時 1ov 為下降斜波

tR

EC

v sato

1

1

11

1minus= 〈38〉

當 22 sato Ev minus= 時 1ov 上升斜波

( )

tRE

Cv sat

o1

2

11

1 minusminus= 〈39〉

由此可知三角波的上升與下降斜波乃因 1C 的充電與放電且時間

常數為 11CR

三角波週期分析如下

1 上升斜波的時間 1T

tCR

vv o

o1

1

21 minus= 11

2

1 CRvv

to

ominus=

1Tt = TLTHo VVv minus=1 22 sato Ev =

11111

21

sat

TLTH

sat

TLTH

EVV

CRCRE

VVT

minus=

minusminus= 〈310〉

2 下降斜波的時間 2T

tCR

vv o

o1

1

21 minus= 11

2

1 CRvv

to

ominus=

21

2Tt = THTLo VVv minus=1 12 sato Ev =

1

11111

1sat

TLTH

sat

THTL

EVV

CRCRE

VVT

minus=

minusminus= 〈311〉

3 週期 21 TTT +=

若 1satE = 2satE = satE 且3

22RR

VV TLTH =minus satE

3

2114

RR

CRT=

若R3 = nR2

則nCR

T 114=

114 CR

nf = 〈312〉

《實驗結果》

必須注意的是三角波的頻率太低將導致馬達的轉動產生脈動現象

故將工作頻率設計在1kHz以上

Ω= k1501R Ω= k102R

Ω= k203R pFC 22001 =

所得到的三角波頻率為

15kHz10220010001504

00010100020

f 12- =timestimestimestimes

timestimes

=

圖 34 三角波輸出波形

22

〈2〉 脈寬調變電路〈PWM〉

+12V

-12V

10k

+12V

-12V -

+ PWM輸出LM324三角波輸入

圖 35 脈寬調變電路

PWM系統往往連接至直流電源供應放大器的工作是以固定的頻率開

閉直流供應電壓其激發角是可以調整的因此得到波寬可調的輸出

將固定頻率的三角波與反向輸入的電壓做比較便可輸出一脈寬〈見圖

36〉反向電阻值的不同將導致反向輸入電壓不同故其輸出為一可調但

頻率固定的脈寬也正因為如此故稱為脈寬調變〈PWM〉由於輸出的

dutycycle不同故馬達將接收到不同的平均電壓因而可以藉由PWM控制

馬達的轉速

反相輸入電壓

PWM

圖 36 三角波與反相輸入電壓比較

23

PWM的優點在於馬達驅動電路的電晶體之控制信號改以脈波列來控

制使電晶體操作成類似開關的動作不是完全導通就是完全截止故電晶

體不是一直操作於作用區所以其功率消耗不大整體效率較高

《實驗結果》

圖 37 PWM 輸出波形

322 橋型驅動功率放大電路

如圖38所示主要由四個功率電晶體組成利用不同的電晶體對使直流

馬達做正逆轉控制當Q5Q8導通使馬達正轉當Q6Q7導通馬達則逆

轉電路中的電晶體扮演開關的作用

此種電路簡單只要一組直流電源供應且電晶體分擔了部份的電壓保護

電晶體迅速工作於截止與飽和狀態之間故沒有功率散逸損失之虞

但是在設計時切勿使Q5Q6同時導通以免燒毀電路上之元件因為在

AB兩脈波短暫的交變時間內由於電晶體本身之最小延遲時間有可能使Q5

Q6同時ON與Q7Q8在很短時間同時ON因此在15kHz交變下容易燒毀功

率電晶體

因此設計一間距脈波電路主要之功用使Q5Q6和Q7Q8均不同時導通

24

以拉長AB兩者交換時間

M

20k

10k

20k

10k

+24V

A 信號 B 信號

2N3055 2N3055

2N2955 2N2955

1N40021N4002

C1815 C1815

C1815 C1815

Q5

Q8Q6

Q7

圖 38 橋型驅動功率放大電路

圖 39 橋型驅動功率放大電路實體圖

25

此外若考慮電晶體BE間的電壓則電路會出現約 plusmn 06V的不感帶〈ded

band〉即電晶體的 oV 對 inV 間的關係如圖3101假使 inV 電壓為正弦波則 oV 變

成如圖3102為了改善這種缺失吾人利用兩個二極體接在電路上如圖38

用來補償電晶體BE間的壓降﹝10﹞

約06V

Dead band

Vo

Vin

圖 3101 呈現不感帶的轉移函數

圖 3102 輸出電壓波形

26

323 間距脈波產生電路

RCext15

Cext14 74123

A3

B2

Q13

CLR1

Q4

7486100k

2200pF

10k

10000pF

+5V

間距脈波輸出

圖 311 間距脈波產生電路

間距脈波的產生方式是根據脈寬調變〈PWM〉後的訊號再經由積分電路的

電阻兩端取出且經由兩倍頻器〈74LS86〉檢示出PWM的正負緣脈波最後

再利用單穩態IC〈74LS123〉將檢出信號之脈寬拉長至01ms此即為間距脈波

74LS123有兩個輸入端子A及B分別為下降波緣輸入端子及上升波緣輸入端

子當輸入A之脈波由ldquoH變成ldquoL之瞬間Q輸出變為ldquoH其持續時間長

短由RC時間常數決定反之當輸入B之脈波由ldquoL變成ldquoH之瞬間Q輸出

變成ldquoH維持一定時間

74LS123的輸出脈波之寬度是由電阻及電容之時間常數所決定概略計算公

式如下

CR045T timestimes=

電容 C 必須大於 1000pF

27

《實驗結果》

R=24kΩ C=10000pF

所以得到間距脈波為

( )msec0110810000p24k045T cong=timestimes= μ

圖 312 間距脈波

研究經分析後發現

1 間距 T 愈大愈能確保電路之安全性愈有保護作用

2 間距 T 愈大相對的使驅動信號脈波減少愈多造成馬達旋轉扭力大

大減弱

3 適當的間距 T不但不會影響馬達的輸出轉矩而且兼具保護電路的

效果

33 編碼器

轉動編碼器不只可以作為轉速的感測也能做位置的感測又適合於數位處

理故被廣泛使用若就信號來看轉動編碼器可分為增量型與絕對型若以檢

測的方式來分可分為光學式和磁式兩種在本專題中所使用的編碼器為光學式

增量型編碼器﹝11﹞

光學式轉動編碼器的原理如圖 313在附有細縫轉盤的兩側分別裝置發光元

28

件與受光元件如果只有一組光電檢測元件則輸出信號就只有一相的脈波信

號此種裝置稱為脈波產生器圖 314 為增量型轉碼器的輸出信號它是利用

兩組光電元件所產生的脈波信號A 相和 B 相間有相位差正轉時 A 相領前 B

相逆轉時 B 相領前 A 相因此利用此兩相做檢測馬達為正轉或逆轉的工作

並利用 A 相或 B 相的頻率檢測出目前的轉速

吾人計算出編碼器每一轉可以產生約 200 個脈波故檢測 A 相或 B 相其頻

率為 N則轉速應為 60200

timesN

〈rpm〉

圖 313 光學式轉動編碼器的原理圖

圖 314 編碼器的輸出信號波形

29

34 LM2917 FV 電路設計

對 LM2907 而言磁滯比較器和電流汞是構成頻率對電壓轉換的基本架構

並且預留一個運算放大器及一個電晶體供各種不同的使用圖 315 為吾人所設

計的 FV 電路圖中 C1 用以抑制電流汞動作時所產生的漣波變化正常使用時

此電容應大於 10C若 C1 太大也將造成轉換速度下降

因為單晶片 8051 之輸入電壓最高為 5V故必須設計其馬達最高轉速頻率所

轉成的電壓必須在 5V 以內由於馬達轉速頻率範圍極大故吾人給予 LM2917

+12V 的電壓以擴大它可以轉換的電壓範圍並將所需維持在 5V 內

a1

14

b1

1

a1

13

b1

2

a1

12

b1

3

a1

11

b1

4

1

a1

10

b1

5

a1

8

b1

7

a1

9

b1

6

L2917

Encoder輸 入

1uF

+12V

FV輸出1000pF

45k 10kC1

C2

圖 315 FV 電路

30

《實驗結果》

根據統計結果每 50mV 相對於 100Hz如此一來吾人想得知馬達目前

的轉速只要將單晶片所接收到的電壓值經過換算即可得知目前 encoder 所量測

的頻率吾人知道 encoder 一圈可產生 200 個脈波故馬達的轉速便可經過下列

公式換算得知

轉速〈rpm〉 60200

times=f

其中 =f encoder 所量測到的頻率

表 31 頻率與轉換電壓之關係

頻率

(Hz) 1 2 3 4 5 6 7 8 9

電壓(V) 0006 0006 0007 0008 0009 0009 0009 0009 001

頻率

(Hz) 10 20 30 40 50 60 70 80 90

電壓(V) 008 009 010 010 011 011 012 012 013

頻率

(Hz) 100 200 300 400 500 600 700 800 900

電壓(V) 013 018 023 028 033 038 043 049 054

頻率

(Hz) 1000 2000 3000 4000 5000 6000 7000 8000 9000

電壓(V) 059 109 16 209 257 304 3508 4006 45

31

圖 316 頻率對電壓曲線

35 單晶片介面電路

單晶片介面包括了二大部分分別為單晶片 8051AD converter

〈1〉8051 單晶片

為本控制系統的核心一切動作皆經由它控制

〈2〉AD converter

將類比開關所送出來的類比訊號經由 ADC 0804 轉換成數位訊號傳送

到單晶片的輸入埠

351 AD 轉換

以單晶片 8051 控制 ADC0804則單晶片 8051 必須下達ldquo開始轉換rdquo的命令

給 ADC0804然後 ADC0804 就開始讀入類比輸入端的電壓在內部開始轉換

經過一段轉換時間後〈約 100μ s〉ADC0804 就將轉換完成的值放在其內部的三

態輸出栓鎖緩衝器裡然後將轉換完成輸出腳〈INTR〉降為 low以通知單晶片

可以去讀轉換完成資料

當WR和CS 同時為ldquo0rdquo時表示對 ADC0804 下達ldquo開始轉換rdquo命令再經過

32

一段轉換時間〈100μ s〉後轉換完成ADC0804 會將其轉換完成的數位資料放

在其內部 8 位元緩衝區裡且將 INTR 降為ldquo0rdquo因此單晶片只要下達ldquo開始轉換rdquo

命令後去檢查 INTR 的狀態就可以知道是否轉換完畢其方法有兩種

1 輪詢法〈polling〉

2 中斷法〈interrupt〉

所謂輪詢法就是將 ADC0804 的 INTR接到 CPU 的一條 IO 線上然後以軟體指

令主動偵測其狀態當偵測到為ldquo0rdquo時就可以去讀出 ADC0804 裡的緩衝區的轉

換值

中斷法是一個很理想的 IO 方式因為不像輪詢法必須讓 CPU 等 ADC0804

轉換當 CPU 下達ldquo開始轉換rdquo命令後就可以做其他工作當 ADC0804 轉換完

畢後 INTR會降為ldquo0rdquo可以利用此信號去中斷 CPU再由中斷副程式去讀入

轉換值即可因此大大提高了程式的效率

當 CPU 接收到 ADC0804 發出ldquo轉換完畢rdquo的信號〈 INTR =0〉後就可以去

讀出轉換值其讀出的方法是將CS 與RD設為ldquo0rdquo即可讀到轉換值這個讀值的

動作又會使得 INTR恢復成ldquo1rdquo

1 CPU 下達ldquo開始轉換rdquo命令〈CS =0WR =0〉

2 ADC0804ldquo轉換完畢rdquo 〈 INTR =0〉

3 CPU 讀取轉換值〈 RD =0CS =0〉

4 讀完後 INTR =1

ADC0804 主要規格摘要如下

1 +5V 單電源工作電壓

2 類比電壓輸入範圍 0~+5V

33

3 參考電壓為 25V

4 轉換時間為 100μ s〈 CLKf =640kHz〉

5 解析度為 8 位元

6 誤差plusmn 1LSB

7 讀取時間 135ns

36 電源供應系統

本專題中所有電路及硬體設備所需的電源採用交流電源 110V 經由 PT-31

變壓器後再經過橋式整流後提供了直流電源而因為各個電路所需電源不同

因此製作了多組的變壓電路如下

1電壓源 DC5V選擇了 7805 的穩壓 IC 搭配電容得到了+5V 的電壓源

供〈1〉8051 微處理器 〈2〉ADC 0804 〈3〉74LS8674LS12374LS04

74LS02CD4013 〈4〉馬達 Encoder

2電壓源 DC12V使用 7812 穩壓 IC 搭配電容得到+12V 的電壓源供

LM2917 使用

3電壓源 DC24V利用 7824 的穩壓 IC 搭配電容獲得+24V 的直流電壓

源供電路之橋型驅動功率放大之電晶體使用

Vin1

+12V2

GND3

LM7812

2200uF 10000pF 2200uF 10000pF

+12V outputAC

圖 317 直流電源電路

34

圖 318 直流電源電路實體圖

37 馬達轉速的量測

表 33 PWM 輸出對應 encoder 週期

PWM dutycycle encoder 週期 PWM dutycycle encoder 週期

40 sμ 172 sμ 440 sμ 0 sμ

80 sμ 188 sμ 480 sμ 0 sμ

120 sμ 204 sμ 520 sμ 0 sμ

160 sμ 230 sμ 560 sμ 0 sμ

200 sμ 272 sμ 600 sμ 0 sμ

240 sμ 328 sμ 640 sμ 0 sμ

280 sμ 416 sμ 680 sμ 1320 sμ

320 sμ 540 sμ 720 sμ 750 sμ

360 sμ 800 sμ 760 sμ 510 sμ

400 sμ 1320 sμ 800 sμ 400 sμ

35

圖 319 PWM 輸出對應 encoder 週期

由統計可知道此馬達並不是一顆線性馬達故相信若使用模糊控制理論來

作為其回授控制系統的控制器一定能達到比傳統控制器的性能還要好而且若能

在模糊控制裡加上 PID 控制器的觀念一定能在系統的響應時間上升時間

安定時間和超越量達到最佳的控制另一方面馬達在其反方向的內阻較大需

要更大的力量才能使馬達驅動

36

第四章 軟體規劃與製作

41 PWM 之軟體設計

因為之前所介紹的硬體方式是以調整可變電阻來達到轉速的調整因此無法

得知所給予的脈寬長度和轉速大小尤其在回授時也不易給予適當的訊號來調整

轉速因此改良之方法就是以8051之軟體撰寫方式來產生固定的脈寬也就等

於給予轉速的命令而在其回授控制時也只要在內部程式给予適當的指令便可

達到脈寬長度的調整以達到閉迴路之受控系統

411 PWM 軟體流程

設定Timer0模式為0

TH0 = temp 32 TL0 = temp 32

temp = 8192 ndash j4 Key = 0

檢查是否有鍵值

將鍵值存入Key

Yes

No

設定Key值所對應的 j值

If P30 == 1Then P30 = 0 temp = 8192 ndash j4Else P30 = 1 temp=8192ndash880+j4

TH0 = temp 32 TL0 = temp 32

Start Timer0中斷副程式

啟動Timer0

等待Timer0中斷

返回主程式

圖 41 PWM 軟體設計流程圖

37

在此總共設計了五個按鈕分別代表不同的轉速停止正轉〈慢〉正轉

〈快〉逆轉〈慢〉和逆轉〈快〉使用Timer0是因為8051之計時中斷比延遲程

式來的準確故可以達到準確的計時程式設計理念中並沒有將中斷致能清除

因此Timer0會一直處於計時的狀態程式執行時將一邊檢查鍵值〈KeyStatus〉一

邊進行計時當計時完畢便呼叫中斷副程式然後執行改變Port 30的輸出狀

態若是為high則變為low反之若是為low即變為high同時並重設計時時間

Timer0繼續計時

當鍵值改變時計時的時間也會跟著改變如此一來Timer0將ㄧ直重覆上

述動作直到電源切掉Timer0才會停止計時

42 模糊控制之程式規劃與撰寫

本專題目標在完成了先前所規劃的硬體電路之後接著就是要達成利用模糊

控制理論來設計控制器在此採用了單晶片8051目的是為了以硬體實現方式來

代替電腦模擬期望能夠按照原訂計畫完成本專題「具模糊控制理論與雙脈寬調

變法之直流馬達驅動電路設計」

單晶片 8051 模糊控制的程式撰寫採下列幾個步驟依序完成

1 設定變數轉速誤差〈dspeed〉目前轉速〈sspeed〉

2 模糊化採用三角形歸屬函數採用三角形歸屬函數的原因

〈1〉 三角形函數為一連續函數

〈2〉 三角形函數為線性的函數所以計算速度較快

〈3〉 是具有發散也有收斂的函數和指數函數一樣接近

事實

3 模糊推論模糊規則將其所有可能發生情況以 IFhellipTHENhellip表示

並建立控制規則表

4 解模糊化採用重心法

38

421 歸屬函數

設定變數為目前轉速〈sspeed〉與轉速誤差〈dspeed〉因此此模糊控制器共

有兩個輸入訊號與一輸出訊號輸出訊號為脈寬長度該加或是減多少又因為有

五種不同的轉速因此各分別設計了不同的歸屬函數如下

1 當轉速 = 0

ml h

s s p e e d

d s p e e d

r p m0 5 0 1 0 0- 5 0- 1 0 0

mv l l h v h

r p m0- 3 0- 6 0- 1 0 0 3 0 6 0 1 0 0 圖 42 停止時之歸屬函數

2 正轉〈慢〉

ml hsspeed

dspeed

rpm150 225 300750

mvl l h vh

rpm150100500 200 250 300

圖 43 正轉〈慢〉之歸屬函數

39

3 正轉〈快〉

ml hsspeed

dspeed

rpm520 670 820370220

mvl l h vh

rpm500400300200 600 700 800

圖 44 正轉〈快〉之歸屬函數

4 逆轉〈慢〉

ml hsspeed

dspeed

rpm100 250 400500

mvl l h vh

rpm10050250 200 300 400 圖 45 逆轉〈慢〉之歸屬函數

40

5 逆轉〈快〉

ml hsspeed

dspeed

rpm300 450 600150

mvl l h vh

rpm450350250150 550 650 750

750

圖 46 逆轉〈快〉之歸屬函數

6 輸出

OutputMVL L H VH

rpm0-50-150-250 50 150 250

圖 47 輸出之歸屬函數

41

422 模糊規則庫

表 41 為吾人所設計的模糊控制規則庫並利用 Matlab 之 Fuzzy ToolBox 來

建立此規則庫以進行模擬推論圖 48 為當馬達輸入指令為正轉慢時推論後所得

到的三維空間圖

表 41 模糊控制規則表

Dspeed

vl l m h vh

l H M L VL VL

m VH H M L VL sspeed

h VH VH H M L

圖 48 推論後的三維空間圖

42

423 模糊控制器之軟體設計流程

Start 外部中斷副程式

ADCWR = 0 ADCWR = 1

〈令AD開始轉換〉

檢查鍵值以得到對應的歸屬函數

取得目前轉速與

轉速誤差

Fuzzy Rules決策

得到輸出訊號

Delay 10ms

ADC = 0 讀取AD值 ADCRD = 0

將AD值換算成轉速

ADCWR = 0 ADCWR = 1

〈AD開始轉換〉

返回主程式

致能外部中斷

圖 49 Fuzzy Controller 程式流程圖

當控制器一開始動作時便先執行AD轉換的工作當AD轉換完成時其

INTR的接腳便會觸發8051的外部中斷INTR0於是程式便發生外部中斷執行

外部中斷副程式的指令

43

在外部中斷副程式中AD將ㄧ直進行轉換與讀取的工作同時並將轉換後

的值直接換算成目前轉速與轉速誤差以供模糊控制器使用換算目前encoder

的頻率其公式為

160-V2000 times=頻率 〈4-1〉

式4-1之公式是根據表31所導出來的其中V為encoder之頻率轉成電壓之值

又假設所讀取的AD轉換值為value因為

AD的解析度 = bit256

5V+ = 511 ( Vbit ) 〈4-2〉

故value值與電壓V之關係為

511 value V times= 〈4-3〉

所以encoder之頻率與value值的關係為

頻率= 2000times ⎟⎠⎞

⎜⎝⎛ times

511 value - 160 〈4-4〉

故目前轉速為

sspeed = ( )rpm 60 200

times頻率 〈4-5〉

另ㄧ方面在主程式中程式會先去檢查鍵值也就等於檢查輸入指令以

找出符合使用的歸屬函數並將AD所獲得的轉速對應到歸屬函數中然後執行

決策判斷即進入規則庫中尋找出適當的決策判斷最後將此決策送入PWM程

式裡進行脈寬長度的調整使馬達在合理的要求下達到理想的轉速控制不會

因為外在環境的影響而使馬達轉速受到干擾

43 LCD 顯示轉速

此專題最後再增加一LCD顯示幕以顯示目前的轉速否則在程式設計完成

後人卻因無法以肉眼得知目前轉速而不能肯定馬達轉速是否有達到控制的目

標因此增加一顯示幕LCD是有必要的不僅隨時得知目前的轉速還能知道

44

設計出來的軟體其控制性是否夠好夠穩定

431 LCD 顯示幕之軟體流程

Start

設定LCD模組的初始狀態

設定外部中斷INTR0

與Timer0

設定TH0 = (65536 ndash 5000) 256 TL0 = (65536 ndash 5000)256

令ADCWR = 0 ADCWR = 1 AD開始轉換

等待中斷

外部中斷副程式

ADCRD = 0 讀取AD值 ADCRD = 1

將AD值換算成速度

ADCWR = 0 ADCWR = 1 AD開始轉換

Timer0中斷副程式

顯示LCD第一行

ldquoMotor Speed =

顯示LCD第二行ldquoxxxxxxx rpm其中 xxxxxx為外部中斷副程式所換算出的轉速

重設TH0與TL0

返回主程式返回主程式

圖 410 LCD 顯示幕之程式流程圖

此程式主要由兩個部分完成一為外部中斷副程式另ㄧ為 Timer0 中斷副

程式當主程式完成外部與 Timer0 兩個中斷的設定後隨即命令 AD 開始轉換

之後便一直停在 while〈1〉的迴圈裡不做任何動作而由兩個中斷副程式來完

成整個轉換與顯示的工作

45

外部中斷副程式主要負責 AD 的轉換讀取與轉速換算的工作AD 第一

次的轉換由主程式來下達命令當轉換完成後AD 的 INTR 接腳將觸發外部中

斷〈INTR0〉副程式此時程式便進入外部中斷副程式執行讀取 AD 值與轉速

換算的工作當這些工作完成時外部中斷副程式再次下達 AD 開始轉換的命

令而離開中斷副程式當 AD 再次轉換完成時又將再次執行中斷副程式

如此週而復始中斷副程式將ㄧ直進行讀取換算與轉換的工作

而 Timer0 中斷副程式主要負責 LCD 顯示之工作當主程式所設定的計時時

間計數完時程式便進入 Timer0 中斷副程式一旦進入 Timer0 中斷副程式程

式將執行 LCD 的顯示然後再重設 Timer0 的計數時間Timer0 將重新計數當

計數完時程式又將再度進入 Timer0 中斷副程式執行因為程式中並無清除

Timer0 的中斷致能故 Timer0 中斷副程式和外部中斷副程式ㄧ樣週而復始的

執行其副程式的工作

46

第五章 結論

本計劃主旨為具模糊控制理論與雙脈寬調變法之直流馬達驅動電路設計主

要是針對傳統電路設計之缺點提出改良之方法以TPWM取代PWM電路以模

糊理論基礎設計之控制器替代傳統PID控制器

TPWM轉速控制優於PWM之處在於

1 TPWM只需使用單電源即可達到正轉和逆轉的轉速控制而PWM必須

加上逆向開關或是雙電源才能使馬達產生正轉和逆轉

2 TPWM可控制馬達處於停止狀態無論在正向或逆向加上負載皆無法使

馬達產生轉動

3 馬達消耗定額功率輸出轉矩為額定值

4 馬達由停止到某定轉速時反應時間較快

模糊控制器優於PID控制器

1 不須導出繁雜的數學模型

2 適用於非線性系統

3 強健性與容錯性較高

本專題至此雖說大致的目標都已達到但是此系統仍然有許多不完美而需要

改進的地方例如在實驗過程中發現整個轉速的控制在回授上其反應時間

有點慢探討其原因有可能是控制器之程式上的問題

1 因為使用C語言撰寫程式故其執行速度較慢

2 程式可能寫的太累贅

3 模糊控制規則庫建立不良

若想改善這些問題可以嘗試著將C語言改為組合語言來撰寫並盡量減少

47

不必要的指令相信此動作一定能大大提昇程式的執行速度其次就是多做測

試利用測試中所學到的經驗來幫助模糊控制規則庫的改寫同時也能從測試中

發現更多的問題若是都能對問題加以一一解決的話相信必定能將此控制系統

做的更盡善盡美

48

參考文獻

﹝1﹞ 李適中直流馬達速度控制伺服控制〈基礎篇〉全華科技圖書股份有

限公司民 74

﹝2﹞ 廖錦文ldquo直流電動機之雙脈寬調變是〈TPWM〉驅動電路研究電

子技術月刊第 69 期pp94-1021992

﹝3﹞ 楊英魁孫宗瀛鄭魁香林建德蔣旭堂模糊控制理論與技術全華

科技圖書股份有限公司民 85

﹝4﹞ 林敦煌陳憬德直流馬達定位及轉速的模糊控制逢甲大學自動控制工

程學系學士論文民 87

﹝5﹞ LAZadehldquo Fuzzy Sets Information and Control Vol8 pp338-353

1965

﹝6﹞ EHMamdani and SAsslianldquo A fuzzy logic controller for a dynamic

plant Internation Journal of Man-Machine Studies Vol7 pp1-13 1975

﹝7﹞ 孫宗瀛楊英魁Fuzzy 控制理論實作與應用全華科技圖書股份有

限公司民 83 年

﹝8﹞ 許中平黃煌嘉直流電動機控制電路設計全華科技圖書股份有限公司

民 75

﹝9﹞ 盧明智黃敏祥OP Amp 應用+實驗模擬全華科技圖書股份有限公司

民 83

﹝10﹞陳文耀電動機控制工程復文書局2003

﹝11﹞許中平林全福電動機運轉控制技術全華科技圖書股份有限公司民

77

﹝12﹞楊明豐8051 單晶片 C 語言設計實務碁峯資訊2003 年

﹝13﹞蔡朝洋單晶片微電腦 80518951 原理與應用全華科技圖書股份有限公

司民 91

49

﹝14﹞王文俊認識 Fuzzy全華科技圖書股份有限公司民 90

50

附錄 A 專題硬體展示圖

圖 A-1 硬體整體圖

圖 A-2 硬體整體鳥瞰圖

51

圖 A-3 硬體側視圖

圖 A-4 操作與顯示面板

圖 A-5 間距脈波電路與 FV 電路

52

圖 A-6 橋型驅動功率放大電路

圖 A-7 操作與控制面板

53

附錄 B PWM 與模糊控制之程式

include reg51h include stdioh sbit ADCRD = P3^1 設定 RD 控制線接腳為 P31 sbit ADCWR = P3^3 設定 WR 控制線接腳為 P33 sbit P2_0 = 0xA0 接腳定義 sbit P2_1 = 0xA1 接腳定義 sbit P3_0 = 0xB0 接腳定義 sbit P3_1 = 0xB1 接腳定義 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P3_6 = 0xB6 接腳定義 void KeyStatus(void) 函數原型宣告 void feedback(void) 函數原型宣告 void compute_grade(void) 函數原型宣告 void delay1ms(int count) 函數原型宣告 void convert() 函數原型宣告 void condition() 函數原型宣告 void CW(void) 函數原型宣告 int j i 對應 PWM 的寬度 unsigned int temp 所設計的計時器時間 int sample = 1000 取樣率設定消除顯示值跳動 long int value r1 讀取 ADC0804 數位資料 long int set n condition select long int r grade_reg[2] grade[15] error1 error2 long int a1 b1 I long int membership[5][3]membership1[3][3] 定義歸屬函數 long int membership2[3][3] = -10-50-5050510 long int error[2] int Rule[15][3] = 113213313 定義判斷規則庫 212223323 311232333 411241342 511251351

54

main() 主程式 j = PWM = 110 設定 PWM 初始值 IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x00 設定計時器 0 工作於模式 0 temp=8192-j4 設定計時器 0 初值 TH0 = temp 32 TL0 = temp 32 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 P3_4 = 1 P3_5 = 0 P3_6 = 0 ADCWR = 0 令 ADC0804 的 WR = 0 ADCWR = 1 令 ADC0804 的 WR = 1 while (1) KeyStatus() 檢查鍵值 void KeyStatus(void) 檢查鍵值並給對應的 PWM 值 char KeyScan(void) 按鍵掃描函數宣告 unsigned char KeyStatus unsigned char Key = 0 KeyStatus=KeyScan() 呼叫按鍵掃描函數 if (KeyStatus = 0) 已有按鍵輸入 Key = KeyStatus Key = 鍵值 if (Key == 0x01) 假如輸入為按鍵 1 i = 110 PWM 為 110us j = i P3_4 = 1 LED 亮第一顆〈表馬達停止〉 P3_5 = 0 P3_6 = 0

55

else if (Key == 0x02 ) 假如輸入為按鍵 2 i = 140 PWM 為 140us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x04 ) 假如輸入為按鍵 3 i = 180 PWM 為 180us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x08 ) 假如輸入為按鍵 4 i = 80 PWM 為 80us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 else if (Key == 0x10 ) 假如輸入為按鍵 5 i = 40 PWM 為 40us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 PWM = j delay1ms(10) 呼叫延遲函數 feedback() 模糊控制判斷

56

void To_int(void) interrupt 1 Timer0 中斷函數 if (P3_0 == 0) 假如 PWM 輸出為 Low P3_0 = 1 變更 PWM 輸出為 High temp=8192-j4 設定 High 的時間 else 若 PWM 輸出為 High P3_0 = 0 變更 PWM 輸出為 Low temp=8192-880+j4 設定 Low 的時間 TH0 = temp 32 Timer0 的計時時間 TL0 = temp 32 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 char KeyScan(void) 檢查鍵值 char KeyStatus 按鍵狀態 P0=0xff 設定 P0 為輸入模式 KeyStatus=~P0 讀取按鍵狀態 return(KeyStatus) 將鍵值送回程式 void feedback(void) 模糊判斷 void Fuzzycontroller() 函數原型宣告 void condition1() 函數原型宣告

57

void condition2() 函數原型宣告 error1 = ((value)40-160)03 輸入變數 1 delay10ms(10) 延遲 10ms error2 = ((value)40-160)03 輸入變數 2 if (key == 0x01 ) 當按鍵 1找出對應的歸屬函數 並做出模糊控制判斷

int membership[5][3]= -100-60-30-60-300-30030030603060100

int membership1[3][3]=-100-500-50050050100 Fuzzycontroller() condition() if (key == 0x02 ) 當按鍵 2找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

05010050100150100150200150200250200250300 int membership1[3][3]=07515075150225150225300 Fuzzycontroller() condition() else if (key == 0x04) 當按鍵 3找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

200320400300400500400500600500600700600700800 int membership1[3][3]=220370520370520670520670820 Fuzzycontroller() condition() else if (key == 0x08) 當按鍵 4找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

02550255010050100200100200300200300400 int membership1[3][3]=05010050100250100250400 Fuzzycontroller() condition()

58

else if (key == 0x10) 當按鍵 5找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

150250350250350450350450550450550650550650750 int membership1[3][3]=150300450300450600450600750 Fuzzycontroller() condition2() void Fuzzycontroller() 模糊控制判斷 void compute_grade() 函數原型宣告 void compute_grade1() 函數原型宣告 a1 = 0 b1 = 001 I = 0 for (n=0 nlt=14 n++) r = error1 set = Rule[n][0]-1 compute_grade() 計算輸入變數 1 與

模糊程度的歸屬函數 condition = 1 r = error2 set = Rule[n][1]-1 compute_grade1() 計算輸入變數 2 與 模糊程度的歸屬函數 grade[n] = MIN(grade_reg[0] grade_reg[1]) a1 = a1 + (grade[n]membership2[Rule[n][2]-1][1]) b1 = b1 + grade[n] I = a1 b1 得到模糊控制判斷的結果 void compute_grade() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership[set][0]) || (r gt membership[set][2])) 當輸入變數不在 歸屬函數內

59

grade_reg[condition] = 0 else if ((r gt membership[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership[set][2]-r) (membership[set][2] - membership[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership[set][0]) (membership[set][1] - membership[set][0]) void compute_grade1() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership1[set][0]) || (r gt membership1[set][2])) 當輸入變數不在 歸屬函數內 grade_reg[condition] = 0 else if ((r gt membership1[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership1[set][2]-r) (membership1[set][2]-membership1[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership1[set][0]) (membership1[set][1]-membership1[set][0])

60

void condition() P2_0 = 1 設定 P20 為輸入模式 P2_1 = 1 設定 P21 為輸入模式 if ( (P2_0 == 1) ampamp (P2_1 == 0)) 當馬達為正轉時 if ( I gt 0 ) 若模糊判斷結果為正 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 若模糊判斷結果為零 PWM = PWM + 0 PWM 寬度不變 if ( I lt 0 ) 若模糊控制結果小於零 PWM = PWM + 1 PWM 寬度加 1 else if ( (P2_0 == 0) ampamp (P2_1 == 1) ) 若馬達為反轉 if ( I lt 0 ) 模糊控制小於零 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 模糊控制等於零 PWM = PWM + 0 PWM 寬度不變 if ( I gt 0 ) 模糊控制大於零 PWM = PWM + 1 PWM 寬度加 1 CW() 判斷 PWM 寬度上下限

61

void CW() 判斷 PWM 寬度上下限 if ( PWM gt= 215 ) 若 PWM 寬度 gt= 最大寬度 j = 215 PWM 寬度維持於 215us if ( PWM lt= 5 ) 若 PWM 寬度 lt= 最小寬度 j = 5 PWM 寬度維持在 5us if ( PWM gt 5 ampamp PWM lt 215 ) PWM 寬度介於最大與最小間 j = PWM PWM 依模糊控制判斷結果增減 void delay1ms(int count) 延遲 1ms int x y for ( x = 0 x lt count x++ ) for ( y = 0 y lt 122 y++ ) void convert() 數位資料換算成馬達轉速 r1 = ((value)40)-160

62

附錄 C LCD 顯示之程式

includereg51h 含 8051 所有暫存器宣告 include mathh define RS P3_5 LCD 指令資料選擇控制 define RW P3_4 LCD 讀寫控制腳 define Enable P3_3 LCD 致能接腳 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P0_0 = 0x80 接腳定義 sbit P0_1 = 0x81 接腳定義 sbit P0_2 = 0x82 接腳定義 sbit P0_3 = 0x83 接腳定義 sbit P0_4 = 0x84 接腳定義 sbit P0_5 = 0x85 接腳定義 sbit P0_6 = 0x86 接腳定義 sbit ADCRD = P3^7 設定 RD 控制線接腳為 P37 sbit ADCWR = P3^6 設定 WR 控制線接腳為 P36 void delay(void) 函數原型宣告 void delay10ms(int count) 函數原型宣告 void display(void) 函數原型宣告 void InitialLCD(void) 函數原型宣告 void WriteIns(char) 函數原型宣告 void WriteData(char) 函數原型宣告 void WriteString(charchar) 函數原型宣告 void CheckBusy(void) 函數原型宣告 void convert(void) 函數原型宣告 char MSG0[] = Motor Speed = 定義字串 MSG0 char MSG2[] = rpm 定義字串 MSG2 unsigned char MSG1[8]=0000000 定義字串 MSG1 unsigned long int value 讀取 ADC0804 數位資料 int sample = 1000 取樣率設定消除顯示值跳動 long int rpm

63

main() 主程式 InitialLCD() 初始化 LCD IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x01 設定計時器 0 工作於模式 1 TH0 = (65536-5000)256 設定計時器 0 初值 TL0 = (65536-5000)256 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 while(1) 等待中斷 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 while (--sample == 0) 取樣率減 1 sample = 1000 重設取樣率 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 void T0_int(void) interrupt 1 LCD 顯示動態掃描 display() 動態掃描顯示 TH0 = (65536-65535)256 重設計時初值 TL0 = (65536-65535)256

64

void InitialLCD(void) 設定 LCD 模組初始狀態 delay() 延遲函數 WriteIns(0x38) 設定 LCD 模組為 WriteIns(0x38) 2 行顯示 WriteIns(0x38) 8 位元介面 WriteIns(0x38) 5x7 點字型 WriteIns(0x08) 關閉顯示器 WriteIns(0x01) 清除 LCD 螢幕 WriteIns(0x0c) 令顯示器 ON但游標不顯示 WriteIns(0x06) 令 LCD 模組每接收到 1Byte 資料 AC 值自動加 1 void display() 掃描顯示 WriteIns(0x80) 設定 LCD 座標 WriteString(13MSG0) 將字串 MSG0 寫入 LCD 中 WriteIns(0xc0) 設定 LCD 座標 WriteString(8MSG1) 將字串 MSG1 寫入 LCD 中 WriteIns(0xc8) 設定 LCD 座標 WriteString(4MSG2) 將字串 MSG2 寫入 LCD 中 void convert(void) 換算轉速 long int freq freq = ((value)4000) - 16000 數位資料換成頻率公式 rpm = freq3 頻率換算轉速公式 MSG1[0] = (rpm1000000)+0x30 將結果存入字串 MSG1 中 MSG1[1] = ((rpm1000000)100000)+0x30 MSG1[2] = ((rpm100000)10000)+0x30 MSG1[3] = ((rpm10000)1000)+0x30 MSG1[4] = 0x2e MSG1[5] = ((rpm1000)100)+0x30 MSG1[6] = ((rpm100)10)+0x30 MSG1[7] = rpm10+0x30

65

void WriteIns(char instruction) 寫命令至 LCD 中 RS = 0 選擇指令暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = instruction 輸出命令至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteData(char i) 寫資料至 LCD 中 RS = 1 選擇資料暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = i 輸出資料至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteString(countMSG) 寫字串至 LCD 中 char count 字串長度 char MSG[] 字串資料 char i 定義位元組變數 for(i=0 iltcount i++) count 個位元組 WriteData(MSG[i]) 寫入一位元組的資料至 LCD 中 void CheckBusy(void) char i=0x80 檢查忙碌旗標 while(iamp0x80) 忙錄旗標 BF = 1 RS = 0 選擇指令暫存器 RW = 1 讀取 Enable = 1 致能 LCD i = P2 讀取 LCD 指令暫存器內的資料

66

Enable = 0 除能 LCD delay() 延遲函數 void delay() 延遲 5ms int i for(i=0 ilt250 i++)

  • 畢業專題封面pdf
  • File0004pdf
  • 最終版pdfpdf
Page 13: Based on Fuzzy Control Theorem and TPWM Method for DC ... · 使吾人想設計一模糊控制器來做為馬達轉速的閉迴路控制,以解決非線性系統的 問題。除此之外,flcs

4

14 研究目標

本專題研究目標如下

〈1〉 完成相關文獻資料之蒐集整理與討論

〈2〉 完成 AB 信號產生電路設計

〈3〉 完成間距脈波產生電路設計

〈4〉 完成驅動功率放大電路設計〈橋型驅動功率放大〉

〈5〉 完成 FV 電路設計

〈6〉 完成 AD 訊號轉換

〈7〉 編寫模糊控制法則與介面軟體設計

5

第二章 原理探討

21 模糊控制與理論

在傳統的控制領域裏控制系統動態模式的精確與否是影響控制優劣的最主

要關鍵系統動態的資訊越詳細則越能達到精確控制的目的然而對於複雜

的系統由於變數太多往往難以正確的描述系統的動態於是工程師便利用各

種方法來簡化系統動態以達成控制的目的但卻不盡理想換言之傳統的控

制理論對於明確系統有強而有力的控制能力但對於過於複雜或難以精確描述的

系統則顯得無能為力了因此便嘗試著以模糊數學來處理這些控制問題模糊

控制是屬於非線性式的控制在受控系統無法以線性數學模式精確描述的情況

下經由適當調整控制規則應具有比傳統控制方法更佳的控制性能

211 模糊理論概述

1965 年美國加州柏克萊分校的 LotfiAZadeh 教授首先在他主編的

「Information and Control」刊物上提出「Fuzzy Set」論文此為模糊邏輯理論的

創始模糊理論在經過了三十幾年的演化改進後無論是在應用或理論架構上

皆已日趨完備尤其近年來因人工智慧的迅速發展模糊理論儼然成為人工智慧

不可或缺的理論根基

Zadeh 教授曾提出一個互克性原理﹝5﹞「當系統的複雜性增長時對系統

特性做精確且有意義描述的能力亦相對降低最後精確性與有意義性將變成完全

互相排斥的特性」很高的複雜性意味著只能在一個刻意壓縮的低維因素空間觀

察而無法對問題的全部因素都進行考察使得原本是明確的概念變的模糊

Fuzzy 理論正是為了掌握這類具模糊特質的事物而發展出來的所以它的應用較

偏重於人類的經驗及對問題特性的掌握程度不主張用繁雜的數學分析及數學模

式來解決問題

Fuzzy 理論把傳統數學從二值邏輯〈binary logic〉擴展到連續多值〈continuous

6

multi-value〉利用歸屬函數〈membership function〉描述一個概念的程度亦及

使用 0 和 1 之間的數值來表示一個元素屬於某一概念的程度這個值稱為元素對

集合的歸屬度〈membership grade〉當歸屬度為 1 時表示該元素百分之百屬於

這個概念當歸屬度為 0 時則表示該元素完全不屬於這個概念介於兩者之間

的就是完全屬於和完全不屬於之間的灰色地帶

模糊理論的工程應用大約始於 1974 年倫敦大學的 EHMamdani 教授他根

據 Zadeh 提出的語言分析法〈linguistic approach〉及模糊推論〈fuzzy inference〉

運用 IF-THEN 形式的法則來敘述操作員的控制策略成功地應用在蒸汽機自動

運轉上﹝6﹞從此模糊理論的應用便迅速發展以在控制方面的研究成果最為

顯著模糊理論其實是一門相當生活化的學問由於使用語言變量描述因此更

具親和力與一般性人類日常生活所遇所用的一些敘述即大都是模糊的例如

那個人ldquo很高車開的ldquo很快等等其中ldquo很高ldquo很快並不是一個

明確值而只是描述事件的程度但是根據這些描述人類卻能很輕易的接收

212 模糊集合

模糊集合〈fuzzy set〉可視為傳統集合的擴張在模糊集合的世界中稱傳

統集合為明確集合〈crisp set〉所謂模糊集合是指用來表示界限或邊界不分明的

模糊概念的集合許多日常生活中的概念常常都不是清晰明確的這些可說是模

糊概念例如很高很快等這類概念無法用傳統的二值集合論即 0 或 1 表示

而Zadeh教授提出的Fuzzy集合論可以將這些概念由傳統集合論的特徵函數從非

0 即 1 的二值選擇推廣為從 0 到 1 之間的任何值做選擇得到新型的特徵函數

稱為歸屬函數

模糊集合由歸屬函數表示相對於明確集合的特徵函數其值只有 0 或 1 兩個

值即其值為在實軸閉區間[01]之中的任一實數模糊集合可以彌補明確集

合描述時所產生的不合理現象因此模糊集合比傳統的明確集合更具客觀性

7

213 歸屬函數

歸屬函數〈membership function〉為 0 到 1 之間的數值吾們可以藉由歸屬

函數來描述 Fuzzy 集合的特質它是 Fuzzy 理論的最基本觀念透過歸屬函數我

們才能對 Fuzzy 集合進行量化也才可能利用精確的數學方法分析處理模糊性資

歸屬函數在 Fuzzy 控制的應用範疇內都要具備凸〈convex〉及正規〈normal〉

等基本特性〈如圖 21〉歸屬度函數的定義可以分為數值及函數兩種數值定義

方式又稱為離散化歸屬函數它是直接給定有限 Fuzzy 集合內每個元素的歸屬

度並以向量的形式表現出來函數定義方式又稱為連續化歸屬函數它是以不

同形式的函數來描述 Fuzzy 集合

圖 211 正規且凸模糊集合

1

0 圖 212 正規非凸的模糊集合

8

一個模糊集合的歸屬函數可以有許多方式但是目前最廣泛使用的有吊鐘

型三角型梯型等歸屬函數

〈1〉吊鐘形歸屬函數

吊鐘形歸屬函數定義如下

μA=bell(xabc)= b

acx 2

1

1minus

+

〈21〉

圖 22 吊鐘型歸屬函數

〈2〉三角形歸屬函數

三角形歸屬函數可由三個參數(abc)來加以決定

=Aμ trangle(xabc)

⎪⎪⎪

⎪⎪⎪

ltleminusminus

ltleminusminus

=

other

cxbcbcx

bxaabax

0

〈22〉

其中a為歸屬函數左邊界b為歸屬函數中心值c為歸屬函數右邊界

9

圖 23 三角型歸屬函數

〈3〉梯型歸屬函數

梯型歸屬函數可由四個參數加以決定

=Aμ trapezoid(xabcd)

⎪⎪⎪⎪

⎪⎪⎪⎪

leleminusminus

ltle

ltleminusminus

=

other

dxcdcdx

cxb

bxaabax

0

1 〈23〉

圖 24 梯型歸屬函數

10

214 模糊推論與模糊規則

模糊推論〈fuzzy inference〉是根據知識庫保存的規則(rule)和給予的事實

推導出新的結論與傳統推論不同的地方是Fuzzy推論不只可以處理明確命題也

可以處理Fuzzy命題Fuzzy推論是依據近似推理〈approximate reasoning〉的概念

發展出來的比傳統推論的嚴正推理〈exact reasoning〉更合理也更具彈性近

似推理是兩種嚴正推理General Modus Ponens〈簡稱GMP〉及Genera Modus

Tollens〈簡稱GMT〉的一般化此原理是從傳統二值邏輯中的肯定律〈modus

ponens〉和否定律〈modus tollens〉推廣而來其中GMP又可稱為前向推理而

GMT則可稱為反向推理

〈1〉 GMP〈General Modus Ponens〉

規則IF x is A THEN y is B

事實x is Arsquo

結論y ix Brsquo 〈24〉

〈2〉 GMT〈General Modus Tollens〉

規則IF x is A THEN y is B

事實y is Brsquo

結論x is Arsquo 〈25〉

上式中IF x is A THEN y is B即為模糊規則〈fuzzy rules〉AArsquoBBrsquo

分別是定義在論域X及Y的模糊集合xy代表輸入變數及輸出變數的語言變數

一般來說「x is A」稱為前件部〈antecedent〉而「Y is B」則稱為後件部

〈consequence〉Fuzzy知識庫〈Fuzzy Knowledge Base簡稱FKB〉即由這些模

糊規則所組成的規則庫〈rule base〉和存放描述領域知識的Fuzzy變數及語言變數

的資料庫〈data base〉所組成所以FKB是用來描述受控對象所涉及的領域知

11

識和操控目標的一些定性及定量的資訊模糊知識庫和模糊推論是構成Fuzzy規

則系統核心的兩個重要部門﹝7﹞

模糊推論是模糊系統的核心根據知識庫的模糊法則進行模糊理論的合成運

算來模擬人類的思考決策模式一般來說規則的建立是採取十分主觀直覺的

方式依據相關領域專家的經驗與知識透過詢問進而將其知識經驗歸納條列出

重點再轉換成模糊規則的形式表現出來但是並非所有的專家或操作員都能

將自身的經驗知識以言詞的方式充分的表達出來且未必能整理成條列的模糊規

則所以知識規則的萃取工作往往是在建構模糊系統時最常遭遇到的困難之

215 模糊控制器

模糊控制是智慧型控制〈intelligent control〉系統的一種典型其基本特點

是不完全依賴受控對象的數學模型主要是利用人的操作經驗知識和推理技

術以及控制系統的某些訊息和性能得出對應的控制動作模糊控制是以並行

〈parallel〉方式處理規則的推理工作〈如圖25〉其近似推理會包容每個對操

控系統有貢獻的規則即使某些貢獻程度很小的規則也不會忽略

圖 25 模糊控制系統的構造

12

一個控制器的輸入通常是確定數值而非模糊輸出也是如此才能對被控對象

發生作用但是模糊邏輯控制器〈Fuzzy Logic Controller簡稱FLC〉則是以語

言化的控制規則為主體為了能夠把輸入的確定值與語言化之後的控制規則結

合必須把輸入的確定值模糊化〈fuzzification〉以便對應到FLC語言變數的論

域範圍中同樣的經過規則庫推理出來的結果是對應到輸出語言變數的論域

中所以也必須對其做解模糊化〈defuzzification〉的工作才能達成實際的控制

目標

一般模糊控制器的架構包含了五個主要部分定義變數模糊化知識庫

模糊推論及解模糊化

〈1〉 定義輸入及輸出變數

決定程序被觀察的狀況及考慮控制的動作輸入變數可以是擷取

自受控系統的觀測量也可以是推導出來的資料輸出變數則為操控

受控系統的操作量例如在一般控制問題上輸入變數通常為輸出

誤差e與輸出誤差之變化率e而控制變數則為下一個狀態之輸入

u其中eeu統稱為模糊變數

〈2〉 模糊化

將量測值轉換為語言變數的過程將外界所輸入的確定數值經由

一比例映射傳送到輸入變數所對應的模糊論域然後再利用模糊化

函數將此輸入資料轉換成適當的口語值以供模糊運算使用此口語

化變數稱之為模糊子集合

〈3〉 知識庫

模糊知識庫是模糊控制的依據由它來定義所有使用到的語言控

制法則及相關各項參數知識庫可說是整個控制系統資料核心其包

含了兩個部分資料庫〈data base〉與規則庫〈rules base〉

1 資料庫

提供處理模糊數據之相關定義資料庫所存放的資料是關

13

於如何將明確的資料轉換成模糊數值而資料的存放方式是以

歸屬函數表示該選用哪一種歸屬函數依實際的需要選定

以三角形歸屬函數最常被使用因其運算最為容易且又能充分

的表達模糊概念

2 規則庫

利用語言化的條件式控制規則描述控制目標和策略通常

控制規則可以由操控人員的經驗或專家的知識推導出來多個

控制規則所組成的集合就是規則庫

〈4〉 模糊推論

模糊推論為模糊控制最重要的核心其最主要的工作就是做實際

的決策過程處理模糊推論具有模擬人類做決策判斷的能力其基本

理論就是根據人類特有的近似推理方式如之前已說明的GMP和

GMTGMP為前向推理而GMT為逆向推理因為模糊推論為前向

運算因此GMP非常適合使用為模糊控制的推論機構

〈5〉 解模糊化

將推論完成所得到的模糊輸出量轉換成實際的明確數值以便和

外界溝通解模糊化的方法有很多例最大歸屬度法重心法高

度法面積法等

圖 26 模糊系統的基本架構

14

22 直流馬達數學模型

圖27為直流馬達等效電路簡圖其中

iV = 輸入電壓 ai = 電樞電流

zR = 電樞電阻 gT = 轉矩

aL = 電樞電感 bE = 反電動勢

φ = 空氣隙磁通量 ω = 轉子角速度

B = 黏滯摩擦係數 J = 轉動慣量

圖 27 直流馬達等效電路簡圖

由克希荷夫電壓定律知

( ) ( ) ( )tEdt

tdiLtiRV b

aaaai ++= 〈26〉

由於反電動勢 bE 與轉軸的角速度 ( )tω 及空氣隙磁通量φ之乘積成正比即

( ) ( ) ( )tKtKtE emb ωφω == 〈27〉

15

又轉矩的平衡方程式為

( ) ( ) ( )dt

tdJtBtTgωω += 〈28〉

且馬達轉矩 gT 與電樞電流 ( )tia 及空氣隙磁通量φ乘積成正比即

( ) ( ) ( )tiKtiKtT ataag == φ 〈29〉

取〈26〉~〈29〉式之拉氏變換得

( ) ( ) ( ) ( )sEssILsIRsV baaaai ++= 〈210〉

( ) ( )sKsE eb Ω= 〈211〉

( ) ( ) ( )sJssBsTg Ω+Ω= 〈212〉

( ) ( )sIKsT atg = 〈213〉

則馬達輸入電流與轉速為

( ) ( ) ( )( ) ( )( )

sR

sEsV

sLRsEsV

sIe

a

bi

aa

bia τ+

minus

=+minus

=1

〈214〉

( ) ( ) ( )

sB

sT

sJBsT

sm

gg

τ+=

+=Ω

1 〈215〉

其中a

ae R

L=τ 為電樞電流的電氣時間常數 BJ

m =τ 為馬達轉動的機械時間

常數

直流馬達轉速對輸入電壓的轉移函數 ( )sG 為

( ) ( )( ) ( )( ) etaa

t

i KKBJsRsLK

sVssG

+++=

Ω=

( )( ) etmea

t

KKssBRK

+++=

ττ 11 〈216〉

16

在一般情況電樞電感很小所以 eτ 可以忽略不計因此上式成為一階落後

方程式

( ) ( )( ) ( ) m

m

etma

t

i sTK

KKsBRK

sVssG

+=

++=

Ω=

11 τ 〈217〉

其中

eta

mam KKBR

BRT

+=

τ

eta

tm KKBR

KK

+=

所以直流馬達數學模式可以以圖28表之﹝8﹞

圖 28 直流馬達數學模式方塊圖

17

第三章 系統功能分析與製作規劃

31 專題製作流程

如圖 31 所示本專題主要分為兩條路徑進行一為硬體另一則為軟體程

式撰寫本章著重硬體的規劃設計軟體則在第四章中介紹在完成 AB 信號

產生電路驅動功率放大電路與間距脈波產生電路設計與製作後須先接上馬達

做一連串的測試〈此時系統並無回受控制〉測試間距脈波是否太長或太短硬

體電路是否有缺失hellip等等另一方面也著手撰寫模糊控制程式並將其與硬體電

路結合最後做閉迴路系統的整合測試若發現系統的運作結果並不如預期

則需分別從硬體與軟體兩方面去改良

直流馬達轉速之模糊控制

文獻蒐集與整理

AB信號產生電路設計與製作

驅動功率放大電路設計與製作

間距脈波產生電路設計與製作

測試間距脈波是否太長或太短

系統測試測試馬達轉速是否

達到控制目的

結束與論文寫作

重新設計間距脈波長度

Yes

No

系統整合與修正

輸出信號與Fuzzy控制器之連結設計

規劃輸出與輸入歸屬函數

規劃模糊知識庫

撰寫主程式並加入模糊知識庫

程式編譯及連結

軟硬體整合測試馬達是否運作

程式調整及最佳化

No

YesYes

No

圖 31 專題製作流程圖

18

32 雙脈寬調變法之直流馬達驅動電路設計

本專題製作的雙脈寬調變法之直流馬達驅動電路設計大致可以分為二大部

分第一雙脈寬調變法之電路設計第二橋型驅動功率放大電路

雙脈寬調變〈Two Pulse Width Modulation簡稱TPWM〉之電路設計主要

是先製作一脈寬調變〈Pulse Width Modulation簡稱PWM〉波形然後再將此

波形各別經由一緩衝器〈buffer〉和反向器〈inverter〉則可產生AB驅動信號

脈波此即為TPWM

321 脈寬調變電路

如圖32先利用兩顆op產生三角波電路再利用一個比較器比較三角波

和誤差值之大小

150k

1M

20k

+12V

-12V

+12V

-12V10k

+12V

-12V

10k

+12V

-12V-

+-

+

-

+ PWMLM324

LM324

LM324

2200pF

圖 32 脈寬調變電路

〈1〉 三角波產生電路

三角波產生電路通常至少需要兩個運算放大器其電路如圖33OP1

為一個反相積分器OP2為一個史密特磁滯比較器將OP2的輸出方波經

19

OP1反相積分以後得到Vo1三角波此三角波又同時加到OP2控制其狀

態的改變

當方波產生器的輸出是正的則三角波產生器的輸出是斜向負相似

地當方波產生器的輸出是負則三角波產生器的輸出是斜向正這個動

作將產生三角波的輸出同時也輸出方波﹝9﹞

+VCC

-VCC

-

+

R1

R2

R3

+VCC

-VCC

-

+

OP1

OP2

Vo2Vo1

圖 33 三角波產生電路

對OP2而言是磁滯比較必須先找到OP2的 THV 和 TLV

232

21

32

3oo v

RRR

vRR

Rv

++

+=+ 〈31〉

當 0=+v 時

23

21 oo v

RR

v minus= 〈32〉

表要達到OP2的 0=+v 必須有這麼大的 1ov

當 12 sato Ev = 時

TLsato VERR

v =minus= 13

21 〈33〉

當 22 sato Ev minus= 時

THsato VERR

v =+= 23

21 〈34〉

20

對OP1而言是反相積分器 2ov 為其輸入 1ov 為其輸出則

tCIt

Rv

Ct

CRv

dtvCR

v oooo

11

2

11

22

111

11minus=minus=minus=minus= int 〈35〉

因為

1

2

Rvv

I o minusminus= 0=minusv 〈因為虛接地〉 〈36〉

所以

1

2

Rv

I o= 〈37〉

又因運算放大器的輸入阻抗非常大則流經 1C 的電流也為 I 相當於以定

電流對電容C 充電

當 12 sato Ev = 時 1ov 為下降斜波

tR

EC

v sato

1

1

11

1minus= 〈38〉

當 22 sato Ev minus= 時 1ov 上升斜波

( )

tRE

Cv sat

o1

2

11

1 minusminus= 〈39〉

由此可知三角波的上升與下降斜波乃因 1C 的充電與放電且時間

常數為 11CR

三角波週期分析如下

1 上升斜波的時間 1T

tCR

vv o

o1

1

21 minus= 11

2

1 CRvv

to

ominus=

1Tt = TLTHo VVv minus=1 22 sato Ev =

11111

21

sat

TLTH

sat

TLTH

EVV

CRCRE

VVT

minus=

minusminus= 〈310〉

2 下降斜波的時間 2T

tCR

vv o

o1

1

21 minus= 11

2

1 CRvv

to

ominus=

21

2Tt = THTLo VVv minus=1 12 sato Ev =

1

11111

1sat

TLTH

sat

THTL

EVV

CRCRE

VVT

minus=

minusminus= 〈311〉

3 週期 21 TTT +=

若 1satE = 2satE = satE 且3

22RR

VV TLTH =minus satE

3

2114

RR

CRT=

若R3 = nR2

則nCR

T 114=

114 CR

nf = 〈312〉

《實驗結果》

必須注意的是三角波的頻率太低將導致馬達的轉動產生脈動現象

故將工作頻率設計在1kHz以上

Ω= k1501R Ω= k102R

Ω= k203R pFC 22001 =

所得到的三角波頻率為

15kHz10220010001504

00010100020

f 12- =timestimestimestimes

timestimes

=

圖 34 三角波輸出波形

22

〈2〉 脈寬調變電路〈PWM〉

+12V

-12V

10k

+12V

-12V -

+ PWM輸出LM324三角波輸入

圖 35 脈寬調變電路

PWM系統往往連接至直流電源供應放大器的工作是以固定的頻率開

閉直流供應電壓其激發角是可以調整的因此得到波寬可調的輸出

將固定頻率的三角波與反向輸入的電壓做比較便可輸出一脈寬〈見圖

36〉反向電阻值的不同將導致反向輸入電壓不同故其輸出為一可調但

頻率固定的脈寬也正因為如此故稱為脈寬調變〈PWM〉由於輸出的

dutycycle不同故馬達將接收到不同的平均電壓因而可以藉由PWM控制

馬達的轉速

反相輸入電壓

PWM

圖 36 三角波與反相輸入電壓比較

23

PWM的優點在於馬達驅動電路的電晶體之控制信號改以脈波列來控

制使電晶體操作成類似開關的動作不是完全導通就是完全截止故電晶

體不是一直操作於作用區所以其功率消耗不大整體效率較高

《實驗結果》

圖 37 PWM 輸出波形

322 橋型驅動功率放大電路

如圖38所示主要由四個功率電晶體組成利用不同的電晶體對使直流

馬達做正逆轉控制當Q5Q8導通使馬達正轉當Q6Q7導通馬達則逆

轉電路中的電晶體扮演開關的作用

此種電路簡單只要一組直流電源供應且電晶體分擔了部份的電壓保護

電晶體迅速工作於截止與飽和狀態之間故沒有功率散逸損失之虞

但是在設計時切勿使Q5Q6同時導通以免燒毀電路上之元件因為在

AB兩脈波短暫的交變時間內由於電晶體本身之最小延遲時間有可能使Q5

Q6同時ON與Q7Q8在很短時間同時ON因此在15kHz交變下容易燒毀功

率電晶體

因此設計一間距脈波電路主要之功用使Q5Q6和Q7Q8均不同時導通

24

以拉長AB兩者交換時間

M

20k

10k

20k

10k

+24V

A 信號 B 信號

2N3055 2N3055

2N2955 2N2955

1N40021N4002

C1815 C1815

C1815 C1815

Q5

Q8Q6

Q7

圖 38 橋型驅動功率放大電路

圖 39 橋型驅動功率放大電路實體圖

25

此外若考慮電晶體BE間的電壓則電路會出現約 plusmn 06V的不感帶〈ded

band〉即電晶體的 oV 對 inV 間的關係如圖3101假使 inV 電壓為正弦波則 oV 變

成如圖3102為了改善這種缺失吾人利用兩個二極體接在電路上如圖38

用來補償電晶體BE間的壓降﹝10﹞

約06V

Dead band

Vo

Vin

圖 3101 呈現不感帶的轉移函數

圖 3102 輸出電壓波形

26

323 間距脈波產生電路

RCext15

Cext14 74123

A3

B2

Q13

CLR1

Q4

7486100k

2200pF

10k

10000pF

+5V

間距脈波輸出

圖 311 間距脈波產生電路

間距脈波的產生方式是根據脈寬調變〈PWM〉後的訊號再經由積分電路的

電阻兩端取出且經由兩倍頻器〈74LS86〉檢示出PWM的正負緣脈波最後

再利用單穩態IC〈74LS123〉將檢出信號之脈寬拉長至01ms此即為間距脈波

74LS123有兩個輸入端子A及B分別為下降波緣輸入端子及上升波緣輸入端

子當輸入A之脈波由ldquoH變成ldquoL之瞬間Q輸出變為ldquoH其持續時間長

短由RC時間常數決定反之當輸入B之脈波由ldquoL變成ldquoH之瞬間Q輸出

變成ldquoH維持一定時間

74LS123的輸出脈波之寬度是由電阻及電容之時間常數所決定概略計算公

式如下

CR045T timestimes=

電容 C 必須大於 1000pF

27

《實驗結果》

R=24kΩ C=10000pF

所以得到間距脈波為

( )msec0110810000p24k045T cong=timestimes= μ

圖 312 間距脈波

研究經分析後發現

1 間距 T 愈大愈能確保電路之安全性愈有保護作用

2 間距 T 愈大相對的使驅動信號脈波減少愈多造成馬達旋轉扭力大

大減弱

3 適當的間距 T不但不會影響馬達的輸出轉矩而且兼具保護電路的

效果

33 編碼器

轉動編碼器不只可以作為轉速的感測也能做位置的感測又適合於數位處

理故被廣泛使用若就信號來看轉動編碼器可分為增量型與絕對型若以檢

測的方式來分可分為光學式和磁式兩種在本專題中所使用的編碼器為光學式

增量型編碼器﹝11﹞

光學式轉動編碼器的原理如圖 313在附有細縫轉盤的兩側分別裝置發光元

28

件與受光元件如果只有一組光電檢測元件則輸出信號就只有一相的脈波信

號此種裝置稱為脈波產生器圖 314 為增量型轉碼器的輸出信號它是利用

兩組光電元件所產生的脈波信號A 相和 B 相間有相位差正轉時 A 相領前 B

相逆轉時 B 相領前 A 相因此利用此兩相做檢測馬達為正轉或逆轉的工作

並利用 A 相或 B 相的頻率檢測出目前的轉速

吾人計算出編碼器每一轉可以產生約 200 個脈波故檢測 A 相或 B 相其頻

率為 N則轉速應為 60200

timesN

〈rpm〉

圖 313 光學式轉動編碼器的原理圖

圖 314 編碼器的輸出信號波形

29

34 LM2917 FV 電路設計

對 LM2907 而言磁滯比較器和電流汞是構成頻率對電壓轉換的基本架構

並且預留一個運算放大器及一個電晶體供各種不同的使用圖 315 為吾人所設

計的 FV 電路圖中 C1 用以抑制電流汞動作時所產生的漣波變化正常使用時

此電容應大於 10C若 C1 太大也將造成轉換速度下降

因為單晶片 8051 之輸入電壓最高為 5V故必須設計其馬達最高轉速頻率所

轉成的電壓必須在 5V 以內由於馬達轉速頻率範圍極大故吾人給予 LM2917

+12V 的電壓以擴大它可以轉換的電壓範圍並將所需維持在 5V 內

a1

14

b1

1

a1

13

b1

2

a1

12

b1

3

a1

11

b1

4

1

a1

10

b1

5

a1

8

b1

7

a1

9

b1

6

L2917

Encoder輸 入

1uF

+12V

FV輸出1000pF

45k 10kC1

C2

圖 315 FV 電路

30

《實驗結果》

根據統計結果每 50mV 相對於 100Hz如此一來吾人想得知馬達目前

的轉速只要將單晶片所接收到的電壓值經過換算即可得知目前 encoder 所量測

的頻率吾人知道 encoder 一圈可產生 200 個脈波故馬達的轉速便可經過下列

公式換算得知

轉速〈rpm〉 60200

times=f

其中 =f encoder 所量測到的頻率

表 31 頻率與轉換電壓之關係

頻率

(Hz) 1 2 3 4 5 6 7 8 9

電壓(V) 0006 0006 0007 0008 0009 0009 0009 0009 001

頻率

(Hz) 10 20 30 40 50 60 70 80 90

電壓(V) 008 009 010 010 011 011 012 012 013

頻率

(Hz) 100 200 300 400 500 600 700 800 900

電壓(V) 013 018 023 028 033 038 043 049 054

頻率

(Hz) 1000 2000 3000 4000 5000 6000 7000 8000 9000

電壓(V) 059 109 16 209 257 304 3508 4006 45

31

圖 316 頻率對電壓曲線

35 單晶片介面電路

單晶片介面包括了二大部分分別為單晶片 8051AD converter

〈1〉8051 單晶片

為本控制系統的核心一切動作皆經由它控制

〈2〉AD converter

將類比開關所送出來的類比訊號經由 ADC 0804 轉換成數位訊號傳送

到單晶片的輸入埠

351 AD 轉換

以單晶片 8051 控制 ADC0804則單晶片 8051 必須下達ldquo開始轉換rdquo的命令

給 ADC0804然後 ADC0804 就開始讀入類比輸入端的電壓在內部開始轉換

經過一段轉換時間後〈約 100μ s〉ADC0804 就將轉換完成的值放在其內部的三

態輸出栓鎖緩衝器裡然後將轉換完成輸出腳〈INTR〉降為 low以通知單晶片

可以去讀轉換完成資料

當WR和CS 同時為ldquo0rdquo時表示對 ADC0804 下達ldquo開始轉換rdquo命令再經過

32

一段轉換時間〈100μ s〉後轉換完成ADC0804 會將其轉換完成的數位資料放

在其內部 8 位元緩衝區裡且將 INTR 降為ldquo0rdquo因此單晶片只要下達ldquo開始轉換rdquo

命令後去檢查 INTR 的狀態就可以知道是否轉換完畢其方法有兩種

1 輪詢法〈polling〉

2 中斷法〈interrupt〉

所謂輪詢法就是將 ADC0804 的 INTR接到 CPU 的一條 IO 線上然後以軟體指

令主動偵測其狀態當偵測到為ldquo0rdquo時就可以去讀出 ADC0804 裡的緩衝區的轉

換值

中斷法是一個很理想的 IO 方式因為不像輪詢法必須讓 CPU 等 ADC0804

轉換當 CPU 下達ldquo開始轉換rdquo命令後就可以做其他工作當 ADC0804 轉換完

畢後 INTR會降為ldquo0rdquo可以利用此信號去中斷 CPU再由中斷副程式去讀入

轉換值即可因此大大提高了程式的效率

當 CPU 接收到 ADC0804 發出ldquo轉換完畢rdquo的信號〈 INTR =0〉後就可以去

讀出轉換值其讀出的方法是將CS 與RD設為ldquo0rdquo即可讀到轉換值這個讀值的

動作又會使得 INTR恢復成ldquo1rdquo

1 CPU 下達ldquo開始轉換rdquo命令〈CS =0WR =0〉

2 ADC0804ldquo轉換完畢rdquo 〈 INTR =0〉

3 CPU 讀取轉換值〈 RD =0CS =0〉

4 讀完後 INTR =1

ADC0804 主要規格摘要如下

1 +5V 單電源工作電壓

2 類比電壓輸入範圍 0~+5V

33

3 參考電壓為 25V

4 轉換時間為 100μ s〈 CLKf =640kHz〉

5 解析度為 8 位元

6 誤差plusmn 1LSB

7 讀取時間 135ns

36 電源供應系統

本專題中所有電路及硬體設備所需的電源採用交流電源 110V 經由 PT-31

變壓器後再經過橋式整流後提供了直流電源而因為各個電路所需電源不同

因此製作了多組的變壓電路如下

1電壓源 DC5V選擇了 7805 的穩壓 IC 搭配電容得到了+5V 的電壓源

供〈1〉8051 微處理器 〈2〉ADC 0804 〈3〉74LS8674LS12374LS04

74LS02CD4013 〈4〉馬達 Encoder

2電壓源 DC12V使用 7812 穩壓 IC 搭配電容得到+12V 的電壓源供

LM2917 使用

3電壓源 DC24V利用 7824 的穩壓 IC 搭配電容獲得+24V 的直流電壓

源供電路之橋型驅動功率放大之電晶體使用

Vin1

+12V2

GND3

LM7812

2200uF 10000pF 2200uF 10000pF

+12V outputAC

圖 317 直流電源電路

34

圖 318 直流電源電路實體圖

37 馬達轉速的量測

表 33 PWM 輸出對應 encoder 週期

PWM dutycycle encoder 週期 PWM dutycycle encoder 週期

40 sμ 172 sμ 440 sμ 0 sμ

80 sμ 188 sμ 480 sμ 0 sμ

120 sμ 204 sμ 520 sμ 0 sμ

160 sμ 230 sμ 560 sμ 0 sμ

200 sμ 272 sμ 600 sμ 0 sμ

240 sμ 328 sμ 640 sμ 0 sμ

280 sμ 416 sμ 680 sμ 1320 sμ

320 sμ 540 sμ 720 sμ 750 sμ

360 sμ 800 sμ 760 sμ 510 sμ

400 sμ 1320 sμ 800 sμ 400 sμ

35

圖 319 PWM 輸出對應 encoder 週期

由統計可知道此馬達並不是一顆線性馬達故相信若使用模糊控制理論來

作為其回授控制系統的控制器一定能達到比傳統控制器的性能還要好而且若能

在模糊控制裡加上 PID 控制器的觀念一定能在系統的響應時間上升時間

安定時間和超越量達到最佳的控制另一方面馬達在其反方向的內阻較大需

要更大的力量才能使馬達驅動

36

第四章 軟體規劃與製作

41 PWM 之軟體設計

因為之前所介紹的硬體方式是以調整可變電阻來達到轉速的調整因此無法

得知所給予的脈寬長度和轉速大小尤其在回授時也不易給予適當的訊號來調整

轉速因此改良之方法就是以8051之軟體撰寫方式來產生固定的脈寬也就等

於給予轉速的命令而在其回授控制時也只要在內部程式给予適當的指令便可

達到脈寬長度的調整以達到閉迴路之受控系統

411 PWM 軟體流程

設定Timer0模式為0

TH0 = temp 32 TL0 = temp 32

temp = 8192 ndash j4 Key = 0

檢查是否有鍵值

將鍵值存入Key

Yes

No

設定Key值所對應的 j值

If P30 == 1Then P30 = 0 temp = 8192 ndash j4Else P30 = 1 temp=8192ndash880+j4

TH0 = temp 32 TL0 = temp 32

Start Timer0中斷副程式

啟動Timer0

等待Timer0中斷

返回主程式

圖 41 PWM 軟體設計流程圖

37

在此總共設計了五個按鈕分別代表不同的轉速停止正轉〈慢〉正轉

〈快〉逆轉〈慢〉和逆轉〈快〉使用Timer0是因為8051之計時中斷比延遲程

式來的準確故可以達到準確的計時程式設計理念中並沒有將中斷致能清除

因此Timer0會一直處於計時的狀態程式執行時將一邊檢查鍵值〈KeyStatus〉一

邊進行計時當計時完畢便呼叫中斷副程式然後執行改變Port 30的輸出狀

態若是為high則變為low反之若是為low即變為high同時並重設計時時間

Timer0繼續計時

當鍵值改變時計時的時間也會跟著改變如此一來Timer0將ㄧ直重覆上

述動作直到電源切掉Timer0才會停止計時

42 模糊控制之程式規劃與撰寫

本專題目標在完成了先前所規劃的硬體電路之後接著就是要達成利用模糊

控制理論來設計控制器在此採用了單晶片8051目的是為了以硬體實現方式來

代替電腦模擬期望能夠按照原訂計畫完成本專題「具模糊控制理論與雙脈寬調

變法之直流馬達驅動電路設計」

單晶片 8051 模糊控制的程式撰寫採下列幾個步驟依序完成

1 設定變數轉速誤差〈dspeed〉目前轉速〈sspeed〉

2 模糊化採用三角形歸屬函數採用三角形歸屬函數的原因

〈1〉 三角形函數為一連續函數

〈2〉 三角形函數為線性的函數所以計算速度較快

〈3〉 是具有發散也有收斂的函數和指數函數一樣接近

事實

3 模糊推論模糊規則將其所有可能發生情況以 IFhellipTHENhellip表示

並建立控制規則表

4 解模糊化採用重心法

38

421 歸屬函數

設定變數為目前轉速〈sspeed〉與轉速誤差〈dspeed〉因此此模糊控制器共

有兩個輸入訊號與一輸出訊號輸出訊號為脈寬長度該加或是減多少又因為有

五種不同的轉速因此各分別設計了不同的歸屬函數如下

1 當轉速 = 0

ml h

s s p e e d

d s p e e d

r p m0 5 0 1 0 0- 5 0- 1 0 0

mv l l h v h

r p m0- 3 0- 6 0- 1 0 0 3 0 6 0 1 0 0 圖 42 停止時之歸屬函數

2 正轉〈慢〉

ml hsspeed

dspeed

rpm150 225 300750

mvl l h vh

rpm150100500 200 250 300

圖 43 正轉〈慢〉之歸屬函數

39

3 正轉〈快〉

ml hsspeed

dspeed

rpm520 670 820370220

mvl l h vh

rpm500400300200 600 700 800

圖 44 正轉〈快〉之歸屬函數

4 逆轉〈慢〉

ml hsspeed

dspeed

rpm100 250 400500

mvl l h vh

rpm10050250 200 300 400 圖 45 逆轉〈慢〉之歸屬函數

40

5 逆轉〈快〉

ml hsspeed

dspeed

rpm300 450 600150

mvl l h vh

rpm450350250150 550 650 750

750

圖 46 逆轉〈快〉之歸屬函數

6 輸出

OutputMVL L H VH

rpm0-50-150-250 50 150 250

圖 47 輸出之歸屬函數

41

422 模糊規則庫

表 41 為吾人所設計的模糊控制規則庫並利用 Matlab 之 Fuzzy ToolBox 來

建立此規則庫以進行模擬推論圖 48 為當馬達輸入指令為正轉慢時推論後所得

到的三維空間圖

表 41 模糊控制規則表

Dspeed

vl l m h vh

l H M L VL VL

m VH H M L VL sspeed

h VH VH H M L

圖 48 推論後的三維空間圖

42

423 模糊控制器之軟體設計流程

Start 外部中斷副程式

ADCWR = 0 ADCWR = 1

〈令AD開始轉換〉

檢查鍵值以得到對應的歸屬函數

取得目前轉速與

轉速誤差

Fuzzy Rules決策

得到輸出訊號

Delay 10ms

ADC = 0 讀取AD值 ADCRD = 0

將AD值換算成轉速

ADCWR = 0 ADCWR = 1

〈AD開始轉換〉

返回主程式

致能外部中斷

圖 49 Fuzzy Controller 程式流程圖

當控制器一開始動作時便先執行AD轉換的工作當AD轉換完成時其

INTR的接腳便會觸發8051的外部中斷INTR0於是程式便發生外部中斷執行

外部中斷副程式的指令

43

在外部中斷副程式中AD將ㄧ直進行轉換與讀取的工作同時並將轉換後

的值直接換算成目前轉速與轉速誤差以供模糊控制器使用換算目前encoder

的頻率其公式為

160-V2000 times=頻率 〈4-1〉

式4-1之公式是根據表31所導出來的其中V為encoder之頻率轉成電壓之值

又假設所讀取的AD轉換值為value因為

AD的解析度 = bit256

5V+ = 511 ( Vbit ) 〈4-2〉

故value值與電壓V之關係為

511 value V times= 〈4-3〉

所以encoder之頻率與value值的關係為

頻率= 2000times ⎟⎠⎞

⎜⎝⎛ times

511 value - 160 〈4-4〉

故目前轉速為

sspeed = ( )rpm 60 200

times頻率 〈4-5〉

另ㄧ方面在主程式中程式會先去檢查鍵值也就等於檢查輸入指令以

找出符合使用的歸屬函數並將AD所獲得的轉速對應到歸屬函數中然後執行

決策判斷即進入規則庫中尋找出適當的決策判斷最後將此決策送入PWM程

式裡進行脈寬長度的調整使馬達在合理的要求下達到理想的轉速控制不會

因為外在環境的影響而使馬達轉速受到干擾

43 LCD 顯示轉速

此專題最後再增加一LCD顯示幕以顯示目前的轉速否則在程式設計完成

後人卻因無法以肉眼得知目前轉速而不能肯定馬達轉速是否有達到控制的目

標因此增加一顯示幕LCD是有必要的不僅隨時得知目前的轉速還能知道

44

設計出來的軟體其控制性是否夠好夠穩定

431 LCD 顯示幕之軟體流程

Start

設定LCD模組的初始狀態

設定外部中斷INTR0

與Timer0

設定TH0 = (65536 ndash 5000) 256 TL0 = (65536 ndash 5000)256

令ADCWR = 0 ADCWR = 1 AD開始轉換

等待中斷

外部中斷副程式

ADCRD = 0 讀取AD值 ADCRD = 1

將AD值換算成速度

ADCWR = 0 ADCWR = 1 AD開始轉換

Timer0中斷副程式

顯示LCD第一行

ldquoMotor Speed =

顯示LCD第二行ldquoxxxxxxx rpm其中 xxxxxx為外部中斷副程式所換算出的轉速

重設TH0與TL0

返回主程式返回主程式

圖 410 LCD 顯示幕之程式流程圖

此程式主要由兩個部分完成一為外部中斷副程式另ㄧ為 Timer0 中斷副

程式當主程式完成外部與 Timer0 兩個中斷的設定後隨即命令 AD 開始轉換

之後便一直停在 while〈1〉的迴圈裡不做任何動作而由兩個中斷副程式來完

成整個轉換與顯示的工作

45

外部中斷副程式主要負責 AD 的轉換讀取與轉速換算的工作AD 第一

次的轉換由主程式來下達命令當轉換完成後AD 的 INTR 接腳將觸發外部中

斷〈INTR0〉副程式此時程式便進入外部中斷副程式執行讀取 AD 值與轉速

換算的工作當這些工作完成時外部中斷副程式再次下達 AD 開始轉換的命

令而離開中斷副程式當 AD 再次轉換完成時又將再次執行中斷副程式

如此週而復始中斷副程式將ㄧ直進行讀取換算與轉換的工作

而 Timer0 中斷副程式主要負責 LCD 顯示之工作當主程式所設定的計時時

間計數完時程式便進入 Timer0 中斷副程式一旦進入 Timer0 中斷副程式程

式將執行 LCD 的顯示然後再重設 Timer0 的計數時間Timer0 將重新計數當

計數完時程式又將再度進入 Timer0 中斷副程式執行因為程式中並無清除

Timer0 的中斷致能故 Timer0 中斷副程式和外部中斷副程式ㄧ樣週而復始的

執行其副程式的工作

46

第五章 結論

本計劃主旨為具模糊控制理論與雙脈寬調變法之直流馬達驅動電路設計主

要是針對傳統電路設計之缺點提出改良之方法以TPWM取代PWM電路以模

糊理論基礎設計之控制器替代傳統PID控制器

TPWM轉速控制優於PWM之處在於

1 TPWM只需使用單電源即可達到正轉和逆轉的轉速控制而PWM必須

加上逆向開關或是雙電源才能使馬達產生正轉和逆轉

2 TPWM可控制馬達處於停止狀態無論在正向或逆向加上負載皆無法使

馬達產生轉動

3 馬達消耗定額功率輸出轉矩為額定值

4 馬達由停止到某定轉速時反應時間較快

模糊控制器優於PID控制器

1 不須導出繁雜的數學模型

2 適用於非線性系統

3 強健性與容錯性較高

本專題至此雖說大致的目標都已達到但是此系統仍然有許多不完美而需要

改進的地方例如在實驗過程中發現整個轉速的控制在回授上其反應時間

有點慢探討其原因有可能是控制器之程式上的問題

1 因為使用C語言撰寫程式故其執行速度較慢

2 程式可能寫的太累贅

3 模糊控制規則庫建立不良

若想改善這些問題可以嘗試著將C語言改為組合語言來撰寫並盡量減少

47

不必要的指令相信此動作一定能大大提昇程式的執行速度其次就是多做測

試利用測試中所學到的經驗來幫助模糊控制規則庫的改寫同時也能從測試中

發現更多的問題若是都能對問題加以一一解決的話相信必定能將此控制系統

做的更盡善盡美

48

參考文獻

﹝1﹞ 李適中直流馬達速度控制伺服控制〈基礎篇〉全華科技圖書股份有

限公司民 74

﹝2﹞ 廖錦文ldquo直流電動機之雙脈寬調變是〈TPWM〉驅動電路研究電

子技術月刊第 69 期pp94-1021992

﹝3﹞ 楊英魁孫宗瀛鄭魁香林建德蔣旭堂模糊控制理論與技術全華

科技圖書股份有限公司民 85

﹝4﹞ 林敦煌陳憬德直流馬達定位及轉速的模糊控制逢甲大學自動控制工

程學系學士論文民 87

﹝5﹞ LAZadehldquo Fuzzy Sets Information and Control Vol8 pp338-353

1965

﹝6﹞ EHMamdani and SAsslianldquo A fuzzy logic controller for a dynamic

plant Internation Journal of Man-Machine Studies Vol7 pp1-13 1975

﹝7﹞ 孫宗瀛楊英魁Fuzzy 控制理論實作與應用全華科技圖書股份有

限公司民 83 年

﹝8﹞ 許中平黃煌嘉直流電動機控制電路設計全華科技圖書股份有限公司

民 75

﹝9﹞ 盧明智黃敏祥OP Amp 應用+實驗模擬全華科技圖書股份有限公司

民 83

﹝10﹞陳文耀電動機控制工程復文書局2003

﹝11﹞許中平林全福電動機運轉控制技術全華科技圖書股份有限公司民

77

﹝12﹞楊明豐8051 單晶片 C 語言設計實務碁峯資訊2003 年

﹝13﹞蔡朝洋單晶片微電腦 80518951 原理與應用全華科技圖書股份有限公

司民 91

49

﹝14﹞王文俊認識 Fuzzy全華科技圖書股份有限公司民 90

50

附錄 A 專題硬體展示圖

圖 A-1 硬體整體圖

圖 A-2 硬體整體鳥瞰圖

51

圖 A-3 硬體側視圖

圖 A-4 操作與顯示面板

圖 A-5 間距脈波電路與 FV 電路

52

圖 A-6 橋型驅動功率放大電路

圖 A-7 操作與控制面板

53

附錄 B PWM 與模糊控制之程式

include reg51h include stdioh sbit ADCRD = P3^1 設定 RD 控制線接腳為 P31 sbit ADCWR = P3^3 設定 WR 控制線接腳為 P33 sbit P2_0 = 0xA0 接腳定義 sbit P2_1 = 0xA1 接腳定義 sbit P3_0 = 0xB0 接腳定義 sbit P3_1 = 0xB1 接腳定義 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P3_6 = 0xB6 接腳定義 void KeyStatus(void) 函數原型宣告 void feedback(void) 函數原型宣告 void compute_grade(void) 函數原型宣告 void delay1ms(int count) 函數原型宣告 void convert() 函數原型宣告 void condition() 函數原型宣告 void CW(void) 函數原型宣告 int j i 對應 PWM 的寬度 unsigned int temp 所設計的計時器時間 int sample = 1000 取樣率設定消除顯示值跳動 long int value r1 讀取 ADC0804 數位資料 long int set n condition select long int r grade_reg[2] grade[15] error1 error2 long int a1 b1 I long int membership[5][3]membership1[3][3] 定義歸屬函數 long int membership2[3][3] = -10-50-5050510 long int error[2] int Rule[15][3] = 113213313 定義判斷規則庫 212223323 311232333 411241342 511251351

54

main() 主程式 j = PWM = 110 設定 PWM 初始值 IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x00 設定計時器 0 工作於模式 0 temp=8192-j4 設定計時器 0 初值 TH0 = temp 32 TL0 = temp 32 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 P3_4 = 1 P3_5 = 0 P3_6 = 0 ADCWR = 0 令 ADC0804 的 WR = 0 ADCWR = 1 令 ADC0804 的 WR = 1 while (1) KeyStatus() 檢查鍵值 void KeyStatus(void) 檢查鍵值並給對應的 PWM 值 char KeyScan(void) 按鍵掃描函數宣告 unsigned char KeyStatus unsigned char Key = 0 KeyStatus=KeyScan() 呼叫按鍵掃描函數 if (KeyStatus = 0) 已有按鍵輸入 Key = KeyStatus Key = 鍵值 if (Key == 0x01) 假如輸入為按鍵 1 i = 110 PWM 為 110us j = i P3_4 = 1 LED 亮第一顆〈表馬達停止〉 P3_5 = 0 P3_6 = 0

55

else if (Key == 0x02 ) 假如輸入為按鍵 2 i = 140 PWM 為 140us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x04 ) 假如輸入為按鍵 3 i = 180 PWM 為 180us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x08 ) 假如輸入為按鍵 4 i = 80 PWM 為 80us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 else if (Key == 0x10 ) 假如輸入為按鍵 5 i = 40 PWM 為 40us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 PWM = j delay1ms(10) 呼叫延遲函數 feedback() 模糊控制判斷

56

void To_int(void) interrupt 1 Timer0 中斷函數 if (P3_0 == 0) 假如 PWM 輸出為 Low P3_0 = 1 變更 PWM 輸出為 High temp=8192-j4 設定 High 的時間 else 若 PWM 輸出為 High P3_0 = 0 變更 PWM 輸出為 Low temp=8192-880+j4 設定 Low 的時間 TH0 = temp 32 Timer0 的計時時間 TL0 = temp 32 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 char KeyScan(void) 檢查鍵值 char KeyStatus 按鍵狀態 P0=0xff 設定 P0 為輸入模式 KeyStatus=~P0 讀取按鍵狀態 return(KeyStatus) 將鍵值送回程式 void feedback(void) 模糊判斷 void Fuzzycontroller() 函數原型宣告 void condition1() 函數原型宣告

57

void condition2() 函數原型宣告 error1 = ((value)40-160)03 輸入變數 1 delay10ms(10) 延遲 10ms error2 = ((value)40-160)03 輸入變數 2 if (key == 0x01 ) 當按鍵 1找出對應的歸屬函數 並做出模糊控制判斷

int membership[5][3]= -100-60-30-60-300-30030030603060100

int membership1[3][3]=-100-500-50050050100 Fuzzycontroller() condition() if (key == 0x02 ) 當按鍵 2找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

05010050100150100150200150200250200250300 int membership1[3][3]=07515075150225150225300 Fuzzycontroller() condition() else if (key == 0x04) 當按鍵 3找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

200320400300400500400500600500600700600700800 int membership1[3][3]=220370520370520670520670820 Fuzzycontroller() condition() else if (key == 0x08) 當按鍵 4找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

02550255010050100200100200300200300400 int membership1[3][3]=05010050100250100250400 Fuzzycontroller() condition()

58

else if (key == 0x10) 當按鍵 5找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

150250350250350450350450550450550650550650750 int membership1[3][3]=150300450300450600450600750 Fuzzycontroller() condition2() void Fuzzycontroller() 模糊控制判斷 void compute_grade() 函數原型宣告 void compute_grade1() 函數原型宣告 a1 = 0 b1 = 001 I = 0 for (n=0 nlt=14 n++) r = error1 set = Rule[n][0]-1 compute_grade() 計算輸入變數 1 與

模糊程度的歸屬函數 condition = 1 r = error2 set = Rule[n][1]-1 compute_grade1() 計算輸入變數 2 與 模糊程度的歸屬函數 grade[n] = MIN(grade_reg[0] grade_reg[1]) a1 = a1 + (grade[n]membership2[Rule[n][2]-1][1]) b1 = b1 + grade[n] I = a1 b1 得到模糊控制判斷的結果 void compute_grade() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership[set][0]) || (r gt membership[set][2])) 當輸入變數不在 歸屬函數內

59

grade_reg[condition] = 0 else if ((r gt membership[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership[set][2]-r) (membership[set][2] - membership[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership[set][0]) (membership[set][1] - membership[set][0]) void compute_grade1() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership1[set][0]) || (r gt membership1[set][2])) 當輸入變數不在 歸屬函數內 grade_reg[condition] = 0 else if ((r gt membership1[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership1[set][2]-r) (membership1[set][2]-membership1[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership1[set][0]) (membership1[set][1]-membership1[set][0])

60

void condition() P2_0 = 1 設定 P20 為輸入模式 P2_1 = 1 設定 P21 為輸入模式 if ( (P2_0 == 1) ampamp (P2_1 == 0)) 當馬達為正轉時 if ( I gt 0 ) 若模糊判斷結果為正 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 若模糊判斷結果為零 PWM = PWM + 0 PWM 寬度不變 if ( I lt 0 ) 若模糊控制結果小於零 PWM = PWM + 1 PWM 寬度加 1 else if ( (P2_0 == 0) ampamp (P2_1 == 1) ) 若馬達為反轉 if ( I lt 0 ) 模糊控制小於零 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 模糊控制等於零 PWM = PWM + 0 PWM 寬度不變 if ( I gt 0 ) 模糊控制大於零 PWM = PWM + 1 PWM 寬度加 1 CW() 判斷 PWM 寬度上下限

61

void CW() 判斷 PWM 寬度上下限 if ( PWM gt= 215 ) 若 PWM 寬度 gt= 最大寬度 j = 215 PWM 寬度維持於 215us if ( PWM lt= 5 ) 若 PWM 寬度 lt= 最小寬度 j = 5 PWM 寬度維持在 5us if ( PWM gt 5 ampamp PWM lt 215 ) PWM 寬度介於最大與最小間 j = PWM PWM 依模糊控制判斷結果增減 void delay1ms(int count) 延遲 1ms int x y for ( x = 0 x lt count x++ ) for ( y = 0 y lt 122 y++ ) void convert() 數位資料換算成馬達轉速 r1 = ((value)40)-160

62

附錄 C LCD 顯示之程式

includereg51h 含 8051 所有暫存器宣告 include mathh define RS P3_5 LCD 指令資料選擇控制 define RW P3_4 LCD 讀寫控制腳 define Enable P3_3 LCD 致能接腳 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P0_0 = 0x80 接腳定義 sbit P0_1 = 0x81 接腳定義 sbit P0_2 = 0x82 接腳定義 sbit P0_3 = 0x83 接腳定義 sbit P0_4 = 0x84 接腳定義 sbit P0_5 = 0x85 接腳定義 sbit P0_6 = 0x86 接腳定義 sbit ADCRD = P3^7 設定 RD 控制線接腳為 P37 sbit ADCWR = P3^6 設定 WR 控制線接腳為 P36 void delay(void) 函數原型宣告 void delay10ms(int count) 函數原型宣告 void display(void) 函數原型宣告 void InitialLCD(void) 函數原型宣告 void WriteIns(char) 函數原型宣告 void WriteData(char) 函數原型宣告 void WriteString(charchar) 函數原型宣告 void CheckBusy(void) 函數原型宣告 void convert(void) 函數原型宣告 char MSG0[] = Motor Speed = 定義字串 MSG0 char MSG2[] = rpm 定義字串 MSG2 unsigned char MSG1[8]=0000000 定義字串 MSG1 unsigned long int value 讀取 ADC0804 數位資料 int sample = 1000 取樣率設定消除顯示值跳動 long int rpm

63

main() 主程式 InitialLCD() 初始化 LCD IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x01 設定計時器 0 工作於模式 1 TH0 = (65536-5000)256 設定計時器 0 初值 TL0 = (65536-5000)256 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 while(1) 等待中斷 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 while (--sample == 0) 取樣率減 1 sample = 1000 重設取樣率 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 void T0_int(void) interrupt 1 LCD 顯示動態掃描 display() 動態掃描顯示 TH0 = (65536-65535)256 重設計時初值 TL0 = (65536-65535)256

64

void InitialLCD(void) 設定 LCD 模組初始狀態 delay() 延遲函數 WriteIns(0x38) 設定 LCD 模組為 WriteIns(0x38) 2 行顯示 WriteIns(0x38) 8 位元介面 WriteIns(0x38) 5x7 點字型 WriteIns(0x08) 關閉顯示器 WriteIns(0x01) 清除 LCD 螢幕 WriteIns(0x0c) 令顯示器 ON但游標不顯示 WriteIns(0x06) 令 LCD 模組每接收到 1Byte 資料 AC 值自動加 1 void display() 掃描顯示 WriteIns(0x80) 設定 LCD 座標 WriteString(13MSG0) 將字串 MSG0 寫入 LCD 中 WriteIns(0xc0) 設定 LCD 座標 WriteString(8MSG1) 將字串 MSG1 寫入 LCD 中 WriteIns(0xc8) 設定 LCD 座標 WriteString(4MSG2) 將字串 MSG2 寫入 LCD 中 void convert(void) 換算轉速 long int freq freq = ((value)4000) - 16000 數位資料換成頻率公式 rpm = freq3 頻率換算轉速公式 MSG1[0] = (rpm1000000)+0x30 將結果存入字串 MSG1 中 MSG1[1] = ((rpm1000000)100000)+0x30 MSG1[2] = ((rpm100000)10000)+0x30 MSG1[3] = ((rpm10000)1000)+0x30 MSG1[4] = 0x2e MSG1[5] = ((rpm1000)100)+0x30 MSG1[6] = ((rpm100)10)+0x30 MSG1[7] = rpm10+0x30

65

void WriteIns(char instruction) 寫命令至 LCD 中 RS = 0 選擇指令暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = instruction 輸出命令至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteData(char i) 寫資料至 LCD 中 RS = 1 選擇資料暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = i 輸出資料至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteString(countMSG) 寫字串至 LCD 中 char count 字串長度 char MSG[] 字串資料 char i 定義位元組變數 for(i=0 iltcount i++) count 個位元組 WriteData(MSG[i]) 寫入一位元組的資料至 LCD 中 void CheckBusy(void) char i=0x80 檢查忙碌旗標 while(iamp0x80) 忙錄旗標 BF = 1 RS = 0 選擇指令暫存器 RW = 1 讀取 Enable = 1 致能 LCD i = P2 讀取 LCD 指令暫存器內的資料

66

Enable = 0 除能 LCD delay() 延遲函數 void delay() 延遲 5ms int i for(i=0 ilt250 i++)

  • 畢業專題封面pdf
  • File0004pdf
  • 最終版pdfpdf
Page 14: Based on Fuzzy Control Theorem and TPWM Method for DC ... · 使吾人想設計一模糊控制器來做為馬達轉速的閉迴路控制,以解決非線性系統的 問題。除此之外,flcs

5

第二章 原理探討

21 模糊控制與理論

在傳統的控制領域裏控制系統動態模式的精確與否是影響控制優劣的最主

要關鍵系統動態的資訊越詳細則越能達到精確控制的目的然而對於複雜

的系統由於變數太多往往難以正確的描述系統的動態於是工程師便利用各

種方法來簡化系統動態以達成控制的目的但卻不盡理想換言之傳統的控

制理論對於明確系統有強而有力的控制能力但對於過於複雜或難以精確描述的

系統則顯得無能為力了因此便嘗試著以模糊數學來處理這些控制問題模糊

控制是屬於非線性式的控制在受控系統無法以線性數學模式精確描述的情況

下經由適當調整控制規則應具有比傳統控制方法更佳的控制性能

211 模糊理論概述

1965 年美國加州柏克萊分校的 LotfiAZadeh 教授首先在他主編的

「Information and Control」刊物上提出「Fuzzy Set」論文此為模糊邏輯理論的

創始模糊理論在經過了三十幾年的演化改進後無論是在應用或理論架構上

皆已日趨完備尤其近年來因人工智慧的迅速發展模糊理論儼然成為人工智慧

不可或缺的理論根基

Zadeh 教授曾提出一個互克性原理﹝5﹞「當系統的複雜性增長時對系統

特性做精確且有意義描述的能力亦相對降低最後精確性與有意義性將變成完全

互相排斥的特性」很高的複雜性意味著只能在一個刻意壓縮的低維因素空間觀

察而無法對問題的全部因素都進行考察使得原本是明確的概念變的模糊

Fuzzy 理論正是為了掌握這類具模糊特質的事物而發展出來的所以它的應用較

偏重於人類的經驗及對問題特性的掌握程度不主張用繁雜的數學分析及數學模

式來解決問題

Fuzzy 理論把傳統數學從二值邏輯〈binary logic〉擴展到連續多值〈continuous

6

multi-value〉利用歸屬函數〈membership function〉描述一個概念的程度亦及

使用 0 和 1 之間的數值來表示一個元素屬於某一概念的程度這個值稱為元素對

集合的歸屬度〈membership grade〉當歸屬度為 1 時表示該元素百分之百屬於

這個概念當歸屬度為 0 時則表示該元素完全不屬於這個概念介於兩者之間

的就是完全屬於和完全不屬於之間的灰色地帶

模糊理論的工程應用大約始於 1974 年倫敦大學的 EHMamdani 教授他根

據 Zadeh 提出的語言分析法〈linguistic approach〉及模糊推論〈fuzzy inference〉

運用 IF-THEN 形式的法則來敘述操作員的控制策略成功地應用在蒸汽機自動

運轉上﹝6﹞從此模糊理論的應用便迅速發展以在控制方面的研究成果最為

顯著模糊理論其實是一門相當生活化的學問由於使用語言變量描述因此更

具親和力與一般性人類日常生活所遇所用的一些敘述即大都是模糊的例如

那個人ldquo很高車開的ldquo很快等等其中ldquo很高ldquo很快並不是一個

明確值而只是描述事件的程度但是根據這些描述人類卻能很輕易的接收

212 模糊集合

模糊集合〈fuzzy set〉可視為傳統集合的擴張在模糊集合的世界中稱傳

統集合為明確集合〈crisp set〉所謂模糊集合是指用來表示界限或邊界不分明的

模糊概念的集合許多日常生活中的概念常常都不是清晰明確的這些可說是模

糊概念例如很高很快等這類概念無法用傳統的二值集合論即 0 或 1 表示

而Zadeh教授提出的Fuzzy集合論可以將這些概念由傳統集合論的特徵函數從非

0 即 1 的二值選擇推廣為從 0 到 1 之間的任何值做選擇得到新型的特徵函數

稱為歸屬函數

模糊集合由歸屬函數表示相對於明確集合的特徵函數其值只有 0 或 1 兩個

值即其值為在實軸閉區間[01]之中的任一實數模糊集合可以彌補明確集

合描述時所產生的不合理現象因此模糊集合比傳統的明確集合更具客觀性

7

213 歸屬函數

歸屬函數〈membership function〉為 0 到 1 之間的數值吾們可以藉由歸屬

函數來描述 Fuzzy 集合的特質它是 Fuzzy 理論的最基本觀念透過歸屬函數我

們才能對 Fuzzy 集合進行量化也才可能利用精確的數學方法分析處理模糊性資

歸屬函數在 Fuzzy 控制的應用範疇內都要具備凸〈convex〉及正規〈normal〉

等基本特性〈如圖 21〉歸屬度函數的定義可以分為數值及函數兩種數值定義

方式又稱為離散化歸屬函數它是直接給定有限 Fuzzy 集合內每個元素的歸屬

度並以向量的形式表現出來函數定義方式又稱為連續化歸屬函數它是以不

同形式的函數來描述 Fuzzy 集合

圖 211 正規且凸模糊集合

1

0 圖 212 正規非凸的模糊集合

8

一個模糊集合的歸屬函數可以有許多方式但是目前最廣泛使用的有吊鐘

型三角型梯型等歸屬函數

〈1〉吊鐘形歸屬函數

吊鐘形歸屬函數定義如下

μA=bell(xabc)= b

acx 2

1

1minus

+

〈21〉

圖 22 吊鐘型歸屬函數

〈2〉三角形歸屬函數

三角形歸屬函數可由三個參數(abc)來加以決定

=Aμ trangle(xabc)

⎪⎪⎪

⎪⎪⎪

ltleminusminus

ltleminusminus

=

other

cxbcbcx

bxaabax

0

〈22〉

其中a為歸屬函數左邊界b為歸屬函數中心值c為歸屬函數右邊界

9

圖 23 三角型歸屬函數

〈3〉梯型歸屬函數

梯型歸屬函數可由四個參數加以決定

=Aμ trapezoid(xabcd)

⎪⎪⎪⎪

⎪⎪⎪⎪

leleminusminus

ltle

ltleminusminus

=

other

dxcdcdx

cxb

bxaabax

0

1 〈23〉

圖 24 梯型歸屬函數

10

214 模糊推論與模糊規則

模糊推論〈fuzzy inference〉是根據知識庫保存的規則(rule)和給予的事實

推導出新的結論與傳統推論不同的地方是Fuzzy推論不只可以處理明確命題也

可以處理Fuzzy命題Fuzzy推論是依據近似推理〈approximate reasoning〉的概念

發展出來的比傳統推論的嚴正推理〈exact reasoning〉更合理也更具彈性近

似推理是兩種嚴正推理General Modus Ponens〈簡稱GMP〉及Genera Modus

Tollens〈簡稱GMT〉的一般化此原理是從傳統二值邏輯中的肯定律〈modus

ponens〉和否定律〈modus tollens〉推廣而來其中GMP又可稱為前向推理而

GMT則可稱為反向推理

〈1〉 GMP〈General Modus Ponens〉

規則IF x is A THEN y is B

事實x is Arsquo

結論y ix Brsquo 〈24〉

〈2〉 GMT〈General Modus Tollens〉

規則IF x is A THEN y is B

事實y is Brsquo

結論x is Arsquo 〈25〉

上式中IF x is A THEN y is B即為模糊規則〈fuzzy rules〉AArsquoBBrsquo

分別是定義在論域X及Y的模糊集合xy代表輸入變數及輸出變數的語言變數

一般來說「x is A」稱為前件部〈antecedent〉而「Y is B」則稱為後件部

〈consequence〉Fuzzy知識庫〈Fuzzy Knowledge Base簡稱FKB〉即由這些模

糊規則所組成的規則庫〈rule base〉和存放描述領域知識的Fuzzy變數及語言變數

的資料庫〈data base〉所組成所以FKB是用來描述受控對象所涉及的領域知

11

識和操控目標的一些定性及定量的資訊模糊知識庫和模糊推論是構成Fuzzy規

則系統核心的兩個重要部門﹝7﹞

模糊推論是模糊系統的核心根據知識庫的模糊法則進行模糊理論的合成運

算來模擬人類的思考決策模式一般來說規則的建立是採取十分主觀直覺的

方式依據相關領域專家的經驗與知識透過詢問進而將其知識經驗歸納條列出

重點再轉換成模糊規則的形式表現出來但是並非所有的專家或操作員都能

將自身的經驗知識以言詞的方式充分的表達出來且未必能整理成條列的模糊規

則所以知識規則的萃取工作往往是在建構模糊系統時最常遭遇到的困難之

215 模糊控制器

模糊控制是智慧型控制〈intelligent control〉系統的一種典型其基本特點

是不完全依賴受控對象的數學模型主要是利用人的操作經驗知識和推理技

術以及控制系統的某些訊息和性能得出對應的控制動作模糊控制是以並行

〈parallel〉方式處理規則的推理工作〈如圖25〉其近似推理會包容每個對操

控系統有貢獻的規則即使某些貢獻程度很小的規則也不會忽略

圖 25 模糊控制系統的構造

12

一個控制器的輸入通常是確定數值而非模糊輸出也是如此才能對被控對象

發生作用但是模糊邏輯控制器〈Fuzzy Logic Controller簡稱FLC〉則是以語

言化的控制規則為主體為了能夠把輸入的確定值與語言化之後的控制規則結

合必須把輸入的確定值模糊化〈fuzzification〉以便對應到FLC語言變數的論

域範圍中同樣的經過規則庫推理出來的結果是對應到輸出語言變數的論域

中所以也必須對其做解模糊化〈defuzzification〉的工作才能達成實際的控制

目標

一般模糊控制器的架構包含了五個主要部分定義變數模糊化知識庫

模糊推論及解模糊化

〈1〉 定義輸入及輸出變數

決定程序被觀察的狀況及考慮控制的動作輸入變數可以是擷取

自受控系統的觀測量也可以是推導出來的資料輸出變數則為操控

受控系統的操作量例如在一般控制問題上輸入變數通常為輸出

誤差e與輸出誤差之變化率e而控制變數則為下一個狀態之輸入

u其中eeu統稱為模糊變數

〈2〉 模糊化

將量測值轉換為語言變數的過程將外界所輸入的確定數值經由

一比例映射傳送到輸入變數所對應的模糊論域然後再利用模糊化

函數將此輸入資料轉換成適當的口語值以供模糊運算使用此口語

化變數稱之為模糊子集合

〈3〉 知識庫

模糊知識庫是模糊控制的依據由它來定義所有使用到的語言控

制法則及相關各項參數知識庫可說是整個控制系統資料核心其包

含了兩個部分資料庫〈data base〉與規則庫〈rules base〉

1 資料庫

提供處理模糊數據之相關定義資料庫所存放的資料是關

13

於如何將明確的資料轉換成模糊數值而資料的存放方式是以

歸屬函數表示該選用哪一種歸屬函數依實際的需要選定

以三角形歸屬函數最常被使用因其運算最為容易且又能充分

的表達模糊概念

2 規則庫

利用語言化的條件式控制規則描述控制目標和策略通常

控制規則可以由操控人員的經驗或專家的知識推導出來多個

控制規則所組成的集合就是規則庫

〈4〉 模糊推論

模糊推論為模糊控制最重要的核心其最主要的工作就是做實際

的決策過程處理模糊推論具有模擬人類做決策判斷的能力其基本

理論就是根據人類特有的近似推理方式如之前已說明的GMP和

GMTGMP為前向推理而GMT為逆向推理因為模糊推論為前向

運算因此GMP非常適合使用為模糊控制的推論機構

〈5〉 解模糊化

將推論完成所得到的模糊輸出量轉換成實際的明確數值以便和

外界溝通解模糊化的方法有很多例最大歸屬度法重心法高

度法面積法等

圖 26 模糊系統的基本架構

14

22 直流馬達數學模型

圖27為直流馬達等效電路簡圖其中

iV = 輸入電壓 ai = 電樞電流

zR = 電樞電阻 gT = 轉矩

aL = 電樞電感 bE = 反電動勢

φ = 空氣隙磁通量 ω = 轉子角速度

B = 黏滯摩擦係數 J = 轉動慣量

圖 27 直流馬達等效電路簡圖

由克希荷夫電壓定律知

( ) ( ) ( )tEdt

tdiLtiRV b

aaaai ++= 〈26〉

由於反電動勢 bE 與轉軸的角速度 ( )tω 及空氣隙磁通量φ之乘積成正比即

( ) ( ) ( )tKtKtE emb ωφω == 〈27〉

15

又轉矩的平衡方程式為

( ) ( ) ( )dt

tdJtBtTgωω += 〈28〉

且馬達轉矩 gT 與電樞電流 ( )tia 及空氣隙磁通量φ乘積成正比即

( ) ( ) ( )tiKtiKtT ataag == φ 〈29〉

取〈26〉~〈29〉式之拉氏變換得

( ) ( ) ( ) ( )sEssILsIRsV baaaai ++= 〈210〉

( ) ( )sKsE eb Ω= 〈211〉

( ) ( ) ( )sJssBsTg Ω+Ω= 〈212〉

( ) ( )sIKsT atg = 〈213〉

則馬達輸入電流與轉速為

( ) ( ) ( )( ) ( )( )

sR

sEsV

sLRsEsV

sIe

a

bi

aa

bia τ+

minus

=+minus

=1

〈214〉

( ) ( ) ( )

sB

sT

sJBsT

sm

gg

τ+=

+=Ω

1 〈215〉

其中a

ae R

L=τ 為電樞電流的電氣時間常數 BJ

m =τ 為馬達轉動的機械時間

常數

直流馬達轉速對輸入電壓的轉移函數 ( )sG 為

( ) ( )( ) ( )( ) etaa

t

i KKBJsRsLK

sVssG

+++=

Ω=

( )( ) etmea

t

KKssBRK

+++=

ττ 11 〈216〉

16

在一般情況電樞電感很小所以 eτ 可以忽略不計因此上式成為一階落後

方程式

( ) ( )( ) ( ) m

m

etma

t

i sTK

KKsBRK

sVssG

+=

++=

Ω=

11 τ 〈217〉

其中

eta

mam KKBR

BRT

+=

τ

eta

tm KKBR

KK

+=

所以直流馬達數學模式可以以圖28表之﹝8﹞

圖 28 直流馬達數學模式方塊圖

17

第三章 系統功能分析與製作規劃

31 專題製作流程

如圖 31 所示本專題主要分為兩條路徑進行一為硬體另一則為軟體程

式撰寫本章著重硬體的規劃設計軟體則在第四章中介紹在完成 AB 信號

產生電路驅動功率放大電路與間距脈波產生電路設計與製作後須先接上馬達

做一連串的測試〈此時系統並無回受控制〉測試間距脈波是否太長或太短硬

體電路是否有缺失hellip等等另一方面也著手撰寫模糊控制程式並將其與硬體電

路結合最後做閉迴路系統的整合測試若發現系統的運作結果並不如預期

則需分別從硬體與軟體兩方面去改良

直流馬達轉速之模糊控制

文獻蒐集與整理

AB信號產生電路設計與製作

驅動功率放大電路設計與製作

間距脈波產生電路設計與製作

測試間距脈波是否太長或太短

系統測試測試馬達轉速是否

達到控制目的

結束與論文寫作

重新設計間距脈波長度

Yes

No

系統整合與修正

輸出信號與Fuzzy控制器之連結設計

規劃輸出與輸入歸屬函數

規劃模糊知識庫

撰寫主程式並加入模糊知識庫

程式編譯及連結

軟硬體整合測試馬達是否運作

程式調整及最佳化

No

YesYes

No

圖 31 專題製作流程圖

18

32 雙脈寬調變法之直流馬達驅動電路設計

本專題製作的雙脈寬調變法之直流馬達驅動電路設計大致可以分為二大部

分第一雙脈寬調變法之電路設計第二橋型驅動功率放大電路

雙脈寬調變〈Two Pulse Width Modulation簡稱TPWM〉之電路設計主要

是先製作一脈寬調變〈Pulse Width Modulation簡稱PWM〉波形然後再將此

波形各別經由一緩衝器〈buffer〉和反向器〈inverter〉則可產生AB驅動信號

脈波此即為TPWM

321 脈寬調變電路

如圖32先利用兩顆op產生三角波電路再利用一個比較器比較三角波

和誤差值之大小

150k

1M

20k

+12V

-12V

+12V

-12V10k

+12V

-12V

10k

+12V

-12V-

+-

+

-

+ PWMLM324

LM324

LM324

2200pF

圖 32 脈寬調變電路

〈1〉 三角波產生電路

三角波產生電路通常至少需要兩個運算放大器其電路如圖33OP1

為一個反相積分器OP2為一個史密特磁滯比較器將OP2的輸出方波經

19

OP1反相積分以後得到Vo1三角波此三角波又同時加到OP2控制其狀

態的改變

當方波產生器的輸出是正的則三角波產生器的輸出是斜向負相似

地當方波產生器的輸出是負則三角波產生器的輸出是斜向正這個動

作將產生三角波的輸出同時也輸出方波﹝9﹞

+VCC

-VCC

-

+

R1

R2

R3

+VCC

-VCC

-

+

OP1

OP2

Vo2Vo1

圖 33 三角波產生電路

對OP2而言是磁滯比較必須先找到OP2的 THV 和 TLV

232

21

32

3oo v

RRR

vRR

Rv

++

+=+ 〈31〉

當 0=+v 時

23

21 oo v

RR

v minus= 〈32〉

表要達到OP2的 0=+v 必須有這麼大的 1ov

當 12 sato Ev = 時

TLsato VERR

v =minus= 13

21 〈33〉

當 22 sato Ev minus= 時

THsato VERR

v =+= 23

21 〈34〉

20

對OP1而言是反相積分器 2ov 為其輸入 1ov 為其輸出則

tCIt

Rv

Ct

CRv

dtvCR

v oooo

11

2

11

22

111

11minus=minus=minus=minus= int 〈35〉

因為

1

2

Rvv

I o minusminus= 0=minusv 〈因為虛接地〉 〈36〉

所以

1

2

Rv

I o= 〈37〉

又因運算放大器的輸入阻抗非常大則流經 1C 的電流也為 I 相當於以定

電流對電容C 充電

當 12 sato Ev = 時 1ov 為下降斜波

tR

EC

v sato

1

1

11

1minus= 〈38〉

當 22 sato Ev minus= 時 1ov 上升斜波

( )

tRE

Cv sat

o1

2

11

1 minusminus= 〈39〉

由此可知三角波的上升與下降斜波乃因 1C 的充電與放電且時間

常數為 11CR

三角波週期分析如下

1 上升斜波的時間 1T

tCR

vv o

o1

1

21 minus= 11

2

1 CRvv

to

ominus=

1Tt = TLTHo VVv minus=1 22 sato Ev =

11111

21

sat

TLTH

sat

TLTH

EVV

CRCRE

VVT

minus=

minusminus= 〈310〉

2 下降斜波的時間 2T

tCR

vv o

o1

1

21 minus= 11

2

1 CRvv

to

ominus=

21

2Tt = THTLo VVv minus=1 12 sato Ev =

1

11111

1sat

TLTH

sat

THTL

EVV

CRCRE

VVT

minus=

minusminus= 〈311〉

3 週期 21 TTT +=

若 1satE = 2satE = satE 且3

22RR

VV TLTH =minus satE

3

2114

RR

CRT=

若R3 = nR2

則nCR

T 114=

114 CR

nf = 〈312〉

《實驗結果》

必須注意的是三角波的頻率太低將導致馬達的轉動產生脈動現象

故將工作頻率設計在1kHz以上

Ω= k1501R Ω= k102R

Ω= k203R pFC 22001 =

所得到的三角波頻率為

15kHz10220010001504

00010100020

f 12- =timestimestimestimes

timestimes

=

圖 34 三角波輸出波形

22

〈2〉 脈寬調變電路〈PWM〉

+12V

-12V

10k

+12V

-12V -

+ PWM輸出LM324三角波輸入

圖 35 脈寬調變電路

PWM系統往往連接至直流電源供應放大器的工作是以固定的頻率開

閉直流供應電壓其激發角是可以調整的因此得到波寬可調的輸出

將固定頻率的三角波與反向輸入的電壓做比較便可輸出一脈寬〈見圖

36〉反向電阻值的不同將導致反向輸入電壓不同故其輸出為一可調但

頻率固定的脈寬也正因為如此故稱為脈寬調變〈PWM〉由於輸出的

dutycycle不同故馬達將接收到不同的平均電壓因而可以藉由PWM控制

馬達的轉速

反相輸入電壓

PWM

圖 36 三角波與反相輸入電壓比較

23

PWM的優點在於馬達驅動電路的電晶體之控制信號改以脈波列來控

制使電晶體操作成類似開關的動作不是完全導通就是完全截止故電晶

體不是一直操作於作用區所以其功率消耗不大整體效率較高

《實驗結果》

圖 37 PWM 輸出波形

322 橋型驅動功率放大電路

如圖38所示主要由四個功率電晶體組成利用不同的電晶體對使直流

馬達做正逆轉控制當Q5Q8導通使馬達正轉當Q6Q7導通馬達則逆

轉電路中的電晶體扮演開關的作用

此種電路簡單只要一組直流電源供應且電晶體分擔了部份的電壓保護

電晶體迅速工作於截止與飽和狀態之間故沒有功率散逸損失之虞

但是在設計時切勿使Q5Q6同時導通以免燒毀電路上之元件因為在

AB兩脈波短暫的交變時間內由於電晶體本身之最小延遲時間有可能使Q5

Q6同時ON與Q7Q8在很短時間同時ON因此在15kHz交變下容易燒毀功

率電晶體

因此設計一間距脈波電路主要之功用使Q5Q6和Q7Q8均不同時導通

24

以拉長AB兩者交換時間

M

20k

10k

20k

10k

+24V

A 信號 B 信號

2N3055 2N3055

2N2955 2N2955

1N40021N4002

C1815 C1815

C1815 C1815

Q5

Q8Q6

Q7

圖 38 橋型驅動功率放大電路

圖 39 橋型驅動功率放大電路實體圖

25

此外若考慮電晶體BE間的電壓則電路會出現約 plusmn 06V的不感帶〈ded

band〉即電晶體的 oV 對 inV 間的關係如圖3101假使 inV 電壓為正弦波則 oV 變

成如圖3102為了改善這種缺失吾人利用兩個二極體接在電路上如圖38

用來補償電晶體BE間的壓降﹝10﹞

約06V

Dead band

Vo

Vin

圖 3101 呈現不感帶的轉移函數

圖 3102 輸出電壓波形

26

323 間距脈波產生電路

RCext15

Cext14 74123

A3

B2

Q13

CLR1

Q4

7486100k

2200pF

10k

10000pF

+5V

間距脈波輸出

圖 311 間距脈波產生電路

間距脈波的產生方式是根據脈寬調變〈PWM〉後的訊號再經由積分電路的

電阻兩端取出且經由兩倍頻器〈74LS86〉檢示出PWM的正負緣脈波最後

再利用單穩態IC〈74LS123〉將檢出信號之脈寬拉長至01ms此即為間距脈波

74LS123有兩個輸入端子A及B分別為下降波緣輸入端子及上升波緣輸入端

子當輸入A之脈波由ldquoH變成ldquoL之瞬間Q輸出變為ldquoH其持續時間長

短由RC時間常數決定反之當輸入B之脈波由ldquoL變成ldquoH之瞬間Q輸出

變成ldquoH維持一定時間

74LS123的輸出脈波之寬度是由電阻及電容之時間常數所決定概略計算公

式如下

CR045T timestimes=

電容 C 必須大於 1000pF

27

《實驗結果》

R=24kΩ C=10000pF

所以得到間距脈波為

( )msec0110810000p24k045T cong=timestimes= μ

圖 312 間距脈波

研究經分析後發現

1 間距 T 愈大愈能確保電路之安全性愈有保護作用

2 間距 T 愈大相對的使驅動信號脈波減少愈多造成馬達旋轉扭力大

大減弱

3 適當的間距 T不但不會影響馬達的輸出轉矩而且兼具保護電路的

效果

33 編碼器

轉動編碼器不只可以作為轉速的感測也能做位置的感測又適合於數位處

理故被廣泛使用若就信號來看轉動編碼器可分為增量型與絕對型若以檢

測的方式來分可分為光學式和磁式兩種在本專題中所使用的編碼器為光學式

增量型編碼器﹝11﹞

光學式轉動編碼器的原理如圖 313在附有細縫轉盤的兩側分別裝置發光元

28

件與受光元件如果只有一組光電檢測元件則輸出信號就只有一相的脈波信

號此種裝置稱為脈波產生器圖 314 為增量型轉碼器的輸出信號它是利用

兩組光電元件所產生的脈波信號A 相和 B 相間有相位差正轉時 A 相領前 B

相逆轉時 B 相領前 A 相因此利用此兩相做檢測馬達為正轉或逆轉的工作

並利用 A 相或 B 相的頻率檢測出目前的轉速

吾人計算出編碼器每一轉可以產生約 200 個脈波故檢測 A 相或 B 相其頻

率為 N則轉速應為 60200

timesN

〈rpm〉

圖 313 光學式轉動編碼器的原理圖

圖 314 編碼器的輸出信號波形

29

34 LM2917 FV 電路設計

對 LM2907 而言磁滯比較器和電流汞是構成頻率對電壓轉換的基本架構

並且預留一個運算放大器及一個電晶體供各種不同的使用圖 315 為吾人所設

計的 FV 電路圖中 C1 用以抑制電流汞動作時所產生的漣波變化正常使用時

此電容應大於 10C若 C1 太大也將造成轉換速度下降

因為單晶片 8051 之輸入電壓最高為 5V故必須設計其馬達最高轉速頻率所

轉成的電壓必須在 5V 以內由於馬達轉速頻率範圍極大故吾人給予 LM2917

+12V 的電壓以擴大它可以轉換的電壓範圍並將所需維持在 5V 內

a1

14

b1

1

a1

13

b1

2

a1

12

b1

3

a1

11

b1

4

1

a1

10

b1

5

a1

8

b1

7

a1

9

b1

6

L2917

Encoder輸 入

1uF

+12V

FV輸出1000pF

45k 10kC1

C2

圖 315 FV 電路

30

《實驗結果》

根據統計結果每 50mV 相對於 100Hz如此一來吾人想得知馬達目前

的轉速只要將單晶片所接收到的電壓值經過換算即可得知目前 encoder 所量測

的頻率吾人知道 encoder 一圈可產生 200 個脈波故馬達的轉速便可經過下列

公式換算得知

轉速〈rpm〉 60200

times=f

其中 =f encoder 所量測到的頻率

表 31 頻率與轉換電壓之關係

頻率

(Hz) 1 2 3 4 5 6 7 8 9

電壓(V) 0006 0006 0007 0008 0009 0009 0009 0009 001

頻率

(Hz) 10 20 30 40 50 60 70 80 90

電壓(V) 008 009 010 010 011 011 012 012 013

頻率

(Hz) 100 200 300 400 500 600 700 800 900

電壓(V) 013 018 023 028 033 038 043 049 054

頻率

(Hz) 1000 2000 3000 4000 5000 6000 7000 8000 9000

電壓(V) 059 109 16 209 257 304 3508 4006 45

31

圖 316 頻率對電壓曲線

35 單晶片介面電路

單晶片介面包括了二大部分分別為單晶片 8051AD converter

〈1〉8051 單晶片

為本控制系統的核心一切動作皆經由它控制

〈2〉AD converter

將類比開關所送出來的類比訊號經由 ADC 0804 轉換成數位訊號傳送

到單晶片的輸入埠

351 AD 轉換

以單晶片 8051 控制 ADC0804則單晶片 8051 必須下達ldquo開始轉換rdquo的命令

給 ADC0804然後 ADC0804 就開始讀入類比輸入端的電壓在內部開始轉換

經過一段轉換時間後〈約 100μ s〉ADC0804 就將轉換完成的值放在其內部的三

態輸出栓鎖緩衝器裡然後將轉換完成輸出腳〈INTR〉降為 low以通知單晶片

可以去讀轉換完成資料

當WR和CS 同時為ldquo0rdquo時表示對 ADC0804 下達ldquo開始轉換rdquo命令再經過

32

一段轉換時間〈100μ s〉後轉換完成ADC0804 會將其轉換完成的數位資料放

在其內部 8 位元緩衝區裡且將 INTR 降為ldquo0rdquo因此單晶片只要下達ldquo開始轉換rdquo

命令後去檢查 INTR 的狀態就可以知道是否轉換完畢其方法有兩種

1 輪詢法〈polling〉

2 中斷法〈interrupt〉

所謂輪詢法就是將 ADC0804 的 INTR接到 CPU 的一條 IO 線上然後以軟體指

令主動偵測其狀態當偵測到為ldquo0rdquo時就可以去讀出 ADC0804 裡的緩衝區的轉

換值

中斷法是一個很理想的 IO 方式因為不像輪詢法必須讓 CPU 等 ADC0804

轉換當 CPU 下達ldquo開始轉換rdquo命令後就可以做其他工作當 ADC0804 轉換完

畢後 INTR會降為ldquo0rdquo可以利用此信號去中斷 CPU再由中斷副程式去讀入

轉換值即可因此大大提高了程式的效率

當 CPU 接收到 ADC0804 發出ldquo轉換完畢rdquo的信號〈 INTR =0〉後就可以去

讀出轉換值其讀出的方法是將CS 與RD設為ldquo0rdquo即可讀到轉換值這個讀值的

動作又會使得 INTR恢復成ldquo1rdquo

1 CPU 下達ldquo開始轉換rdquo命令〈CS =0WR =0〉

2 ADC0804ldquo轉換完畢rdquo 〈 INTR =0〉

3 CPU 讀取轉換值〈 RD =0CS =0〉

4 讀完後 INTR =1

ADC0804 主要規格摘要如下

1 +5V 單電源工作電壓

2 類比電壓輸入範圍 0~+5V

33

3 參考電壓為 25V

4 轉換時間為 100μ s〈 CLKf =640kHz〉

5 解析度為 8 位元

6 誤差plusmn 1LSB

7 讀取時間 135ns

36 電源供應系統

本專題中所有電路及硬體設備所需的電源採用交流電源 110V 經由 PT-31

變壓器後再經過橋式整流後提供了直流電源而因為各個電路所需電源不同

因此製作了多組的變壓電路如下

1電壓源 DC5V選擇了 7805 的穩壓 IC 搭配電容得到了+5V 的電壓源

供〈1〉8051 微處理器 〈2〉ADC 0804 〈3〉74LS8674LS12374LS04

74LS02CD4013 〈4〉馬達 Encoder

2電壓源 DC12V使用 7812 穩壓 IC 搭配電容得到+12V 的電壓源供

LM2917 使用

3電壓源 DC24V利用 7824 的穩壓 IC 搭配電容獲得+24V 的直流電壓

源供電路之橋型驅動功率放大之電晶體使用

Vin1

+12V2

GND3

LM7812

2200uF 10000pF 2200uF 10000pF

+12V outputAC

圖 317 直流電源電路

34

圖 318 直流電源電路實體圖

37 馬達轉速的量測

表 33 PWM 輸出對應 encoder 週期

PWM dutycycle encoder 週期 PWM dutycycle encoder 週期

40 sμ 172 sμ 440 sμ 0 sμ

80 sμ 188 sμ 480 sμ 0 sμ

120 sμ 204 sμ 520 sμ 0 sμ

160 sμ 230 sμ 560 sμ 0 sμ

200 sμ 272 sμ 600 sμ 0 sμ

240 sμ 328 sμ 640 sμ 0 sμ

280 sμ 416 sμ 680 sμ 1320 sμ

320 sμ 540 sμ 720 sμ 750 sμ

360 sμ 800 sμ 760 sμ 510 sμ

400 sμ 1320 sμ 800 sμ 400 sμ

35

圖 319 PWM 輸出對應 encoder 週期

由統計可知道此馬達並不是一顆線性馬達故相信若使用模糊控制理論來

作為其回授控制系統的控制器一定能達到比傳統控制器的性能還要好而且若能

在模糊控制裡加上 PID 控制器的觀念一定能在系統的響應時間上升時間

安定時間和超越量達到最佳的控制另一方面馬達在其反方向的內阻較大需

要更大的力量才能使馬達驅動

36

第四章 軟體規劃與製作

41 PWM 之軟體設計

因為之前所介紹的硬體方式是以調整可變電阻來達到轉速的調整因此無法

得知所給予的脈寬長度和轉速大小尤其在回授時也不易給予適當的訊號來調整

轉速因此改良之方法就是以8051之軟體撰寫方式來產生固定的脈寬也就等

於給予轉速的命令而在其回授控制時也只要在內部程式给予適當的指令便可

達到脈寬長度的調整以達到閉迴路之受控系統

411 PWM 軟體流程

設定Timer0模式為0

TH0 = temp 32 TL0 = temp 32

temp = 8192 ndash j4 Key = 0

檢查是否有鍵值

將鍵值存入Key

Yes

No

設定Key值所對應的 j值

If P30 == 1Then P30 = 0 temp = 8192 ndash j4Else P30 = 1 temp=8192ndash880+j4

TH0 = temp 32 TL0 = temp 32

Start Timer0中斷副程式

啟動Timer0

等待Timer0中斷

返回主程式

圖 41 PWM 軟體設計流程圖

37

在此總共設計了五個按鈕分別代表不同的轉速停止正轉〈慢〉正轉

〈快〉逆轉〈慢〉和逆轉〈快〉使用Timer0是因為8051之計時中斷比延遲程

式來的準確故可以達到準確的計時程式設計理念中並沒有將中斷致能清除

因此Timer0會一直處於計時的狀態程式執行時將一邊檢查鍵值〈KeyStatus〉一

邊進行計時當計時完畢便呼叫中斷副程式然後執行改變Port 30的輸出狀

態若是為high則變為low反之若是為low即變為high同時並重設計時時間

Timer0繼續計時

當鍵值改變時計時的時間也會跟著改變如此一來Timer0將ㄧ直重覆上

述動作直到電源切掉Timer0才會停止計時

42 模糊控制之程式規劃與撰寫

本專題目標在完成了先前所規劃的硬體電路之後接著就是要達成利用模糊

控制理論來設計控制器在此採用了單晶片8051目的是為了以硬體實現方式來

代替電腦模擬期望能夠按照原訂計畫完成本專題「具模糊控制理論與雙脈寬調

變法之直流馬達驅動電路設計」

單晶片 8051 模糊控制的程式撰寫採下列幾個步驟依序完成

1 設定變數轉速誤差〈dspeed〉目前轉速〈sspeed〉

2 模糊化採用三角形歸屬函數採用三角形歸屬函數的原因

〈1〉 三角形函數為一連續函數

〈2〉 三角形函數為線性的函數所以計算速度較快

〈3〉 是具有發散也有收斂的函數和指數函數一樣接近

事實

3 模糊推論模糊規則將其所有可能發生情況以 IFhellipTHENhellip表示

並建立控制規則表

4 解模糊化採用重心法

38

421 歸屬函數

設定變數為目前轉速〈sspeed〉與轉速誤差〈dspeed〉因此此模糊控制器共

有兩個輸入訊號與一輸出訊號輸出訊號為脈寬長度該加或是減多少又因為有

五種不同的轉速因此各分別設計了不同的歸屬函數如下

1 當轉速 = 0

ml h

s s p e e d

d s p e e d

r p m0 5 0 1 0 0- 5 0- 1 0 0

mv l l h v h

r p m0- 3 0- 6 0- 1 0 0 3 0 6 0 1 0 0 圖 42 停止時之歸屬函數

2 正轉〈慢〉

ml hsspeed

dspeed

rpm150 225 300750

mvl l h vh

rpm150100500 200 250 300

圖 43 正轉〈慢〉之歸屬函數

39

3 正轉〈快〉

ml hsspeed

dspeed

rpm520 670 820370220

mvl l h vh

rpm500400300200 600 700 800

圖 44 正轉〈快〉之歸屬函數

4 逆轉〈慢〉

ml hsspeed

dspeed

rpm100 250 400500

mvl l h vh

rpm10050250 200 300 400 圖 45 逆轉〈慢〉之歸屬函數

40

5 逆轉〈快〉

ml hsspeed

dspeed

rpm300 450 600150

mvl l h vh

rpm450350250150 550 650 750

750

圖 46 逆轉〈快〉之歸屬函數

6 輸出

OutputMVL L H VH

rpm0-50-150-250 50 150 250

圖 47 輸出之歸屬函數

41

422 模糊規則庫

表 41 為吾人所設計的模糊控制規則庫並利用 Matlab 之 Fuzzy ToolBox 來

建立此規則庫以進行模擬推論圖 48 為當馬達輸入指令為正轉慢時推論後所得

到的三維空間圖

表 41 模糊控制規則表

Dspeed

vl l m h vh

l H M L VL VL

m VH H M L VL sspeed

h VH VH H M L

圖 48 推論後的三維空間圖

42

423 模糊控制器之軟體設計流程

Start 外部中斷副程式

ADCWR = 0 ADCWR = 1

〈令AD開始轉換〉

檢查鍵值以得到對應的歸屬函數

取得目前轉速與

轉速誤差

Fuzzy Rules決策

得到輸出訊號

Delay 10ms

ADC = 0 讀取AD值 ADCRD = 0

將AD值換算成轉速

ADCWR = 0 ADCWR = 1

〈AD開始轉換〉

返回主程式

致能外部中斷

圖 49 Fuzzy Controller 程式流程圖

當控制器一開始動作時便先執行AD轉換的工作當AD轉換完成時其

INTR的接腳便會觸發8051的外部中斷INTR0於是程式便發生外部中斷執行

外部中斷副程式的指令

43

在外部中斷副程式中AD將ㄧ直進行轉換與讀取的工作同時並將轉換後

的值直接換算成目前轉速與轉速誤差以供模糊控制器使用換算目前encoder

的頻率其公式為

160-V2000 times=頻率 〈4-1〉

式4-1之公式是根據表31所導出來的其中V為encoder之頻率轉成電壓之值

又假設所讀取的AD轉換值為value因為

AD的解析度 = bit256

5V+ = 511 ( Vbit ) 〈4-2〉

故value值與電壓V之關係為

511 value V times= 〈4-3〉

所以encoder之頻率與value值的關係為

頻率= 2000times ⎟⎠⎞

⎜⎝⎛ times

511 value - 160 〈4-4〉

故目前轉速為

sspeed = ( )rpm 60 200

times頻率 〈4-5〉

另ㄧ方面在主程式中程式會先去檢查鍵值也就等於檢查輸入指令以

找出符合使用的歸屬函數並將AD所獲得的轉速對應到歸屬函數中然後執行

決策判斷即進入規則庫中尋找出適當的決策判斷最後將此決策送入PWM程

式裡進行脈寬長度的調整使馬達在合理的要求下達到理想的轉速控制不會

因為外在環境的影響而使馬達轉速受到干擾

43 LCD 顯示轉速

此專題最後再增加一LCD顯示幕以顯示目前的轉速否則在程式設計完成

後人卻因無法以肉眼得知目前轉速而不能肯定馬達轉速是否有達到控制的目

標因此增加一顯示幕LCD是有必要的不僅隨時得知目前的轉速還能知道

44

設計出來的軟體其控制性是否夠好夠穩定

431 LCD 顯示幕之軟體流程

Start

設定LCD模組的初始狀態

設定外部中斷INTR0

與Timer0

設定TH0 = (65536 ndash 5000) 256 TL0 = (65536 ndash 5000)256

令ADCWR = 0 ADCWR = 1 AD開始轉換

等待中斷

外部中斷副程式

ADCRD = 0 讀取AD值 ADCRD = 1

將AD值換算成速度

ADCWR = 0 ADCWR = 1 AD開始轉換

Timer0中斷副程式

顯示LCD第一行

ldquoMotor Speed =

顯示LCD第二行ldquoxxxxxxx rpm其中 xxxxxx為外部中斷副程式所換算出的轉速

重設TH0與TL0

返回主程式返回主程式

圖 410 LCD 顯示幕之程式流程圖

此程式主要由兩個部分完成一為外部中斷副程式另ㄧ為 Timer0 中斷副

程式當主程式完成外部與 Timer0 兩個中斷的設定後隨即命令 AD 開始轉換

之後便一直停在 while〈1〉的迴圈裡不做任何動作而由兩個中斷副程式來完

成整個轉換與顯示的工作

45

外部中斷副程式主要負責 AD 的轉換讀取與轉速換算的工作AD 第一

次的轉換由主程式來下達命令當轉換完成後AD 的 INTR 接腳將觸發外部中

斷〈INTR0〉副程式此時程式便進入外部中斷副程式執行讀取 AD 值與轉速

換算的工作當這些工作完成時外部中斷副程式再次下達 AD 開始轉換的命

令而離開中斷副程式當 AD 再次轉換完成時又將再次執行中斷副程式

如此週而復始中斷副程式將ㄧ直進行讀取換算與轉換的工作

而 Timer0 中斷副程式主要負責 LCD 顯示之工作當主程式所設定的計時時

間計數完時程式便進入 Timer0 中斷副程式一旦進入 Timer0 中斷副程式程

式將執行 LCD 的顯示然後再重設 Timer0 的計數時間Timer0 將重新計數當

計數完時程式又將再度進入 Timer0 中斷副程式執行因為程式中並無清除

Timer0 的中斷致能故 Timer0 中斷副程式和外部中斷副程式ㄧ樣週而復始的

執行其副程式的工作

46

第五章 結論

本計劃主旨為具模糊控制理論與雙脈寬調變法之直流馬達驅動電路設計主

要是針對傳統電路設計之缺點提出改良之方法以TPWM取代PWM電路以模

糊理論基礎設計之控制器替代傳統PID控制器

TPWM轉速控制優於PWM之處在於

1 TPWM只需使用單電源即可達到正轉和逆轉的轉速控制而PWM必須

加上逆向開關或是雙電源才能使馬達產生正轉和逆轉

2 TPWM可控制馬達處於停止狀態無論在正向或逆向加上負載皆無法使

馬達產生轉動

3 馬達消耗定額功率輸出轉矩為額定值

4 馬達由停止到某定轉速時反應時間較快

模糊控制器優於PID控制器

1 不須導出繁雜的數學模型

2 適用於非線性系統

3 強健性與容錯性較高

本專題至此雖說大致的目標都已達到但是此系統仍然有許多不完美而需要

改進的地方例如在實驗過程中發現整個轉速的控制在回授上其反應時間

有點慢探討其原因有可能是控制器之程式上的問題

1 因為使用C語言撰寫程式故其執行速度較慢

2 程式可能寫的太累贅

3 模糊控制規則庫建立不良

若想改善這些問題可以嘗試著將C語言改為組合語言來撰寫並盡量減少

47

不必要的指令相信此動作一定能大大提昇程式的執行速度其次就是多做測

試利用測試中所學到的經驗來幫助模糊控制規則庫的改寫同時也能從測試中

發現更多的問題若是都能對問題加以一一解決的話相信必定能將此控制系統

做的更盡善盡美

48

參考文獻

﹝1﹞ 李適中直流馬達速度控制伺服控制〈基礎篇〉全華科技圖書股份有

限公司民 74

﹝2﹞ 廖錦文ldquo直流電動機之雙脈寬調變是〈TPWM〉驅動電路研究電

子技術月刊第 69 期pp94-1021992

﹝3﹞ 楊英魁孫宗瀛鄭魁香林建德蔣旭堂模糊控制理論與技術全華

科技圖書股份有限公司民 85

﹝4﹞ 林敦煌陳憬德直流馬達定位及轉速的模糊控制逢甲大學自動控制工

程學系學士論文民 87

﹝5﹞ LAZadehldquo Fuzzy Sets Information and Control Vol8 pp338-353

1965

﹝6﹞ EHMamdani and SAsslianldquo A fuzzy logic controller for a dynamic

plant Internation Journal of Man-Machine Studies Vol7 pp1-13 1975

﹝7﹞ 孫宗瀛楊英魁Fuzzy 控制理論實作與應用全華科技圖書股份有

限公司民 83 年

﹝8﹞ 許中平黃煌嘉直流電動機控制電路設計全華科技圖書股份有限公司

民 75

﹝9﹞ 盧明智黃敏祥OP Amp 應用+實驗模擬全華科技圖書股份有限公司

民 83

﹝10﹞陳文耀電動機控制工程復文書局2003

﹝11﹞許中平林全福電動機運轉控制技術全華科技圖書股份有限公司民

77

﹝12﹞楊明豐8051 單晶片 C 語言設計實務碁峯資訊2003 年

﹝13﹞蔡朝洋單晶片微電腦 80518951 原理與應用全華科技圖書股份有限公

司民 91

49

﹝14﹞王文俊認識 Fuzzy全華科技圖書股份有限公司民 90

50

附錄 A 專題硬體展示圖

圖 A-1 硬體整體圖

圖 A-2 硬體整體鳥瞰圖

51

圖 A-3 硬體側視圖

圖 A-4 操作與顯示面板

圖 A-5 間距脈波電路與 FV 電路

52

圖 A-6 橋型驅動功率放大電路

圖 A-7 操作與控制面板

53

附錄 B PWM 與模糊控制之程式

include reg51h include stdioh sbit ADCRD = P3^1 設定 RD 控制線接腳為 P31 sbit ADCWR = P3^3 設定 WR 控制線接腳為 P33 sbit P2_0 = 0xA0 接腳定義 sbit P2_1 = 0xA1 接腳定義 sbit P3_0 = 0xB0 接腳定義 sbit P3_1 = 0xB1 接腳定義 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P3_6 = 0xB6 接腳定義 void KeyStatus(void) 函數原型宣告 void feedback(void) 函數原型宣告 void compute_grade(void) 函數原型宣告 void delay1ms(int count) 函數原型宣告 void convert() 函數原型宣告 void condition() 函數原型宣告 void CW(void) 函數原型宣告 int j i 對應 PWM 的寬度 unsigned int temp 所設計的計時器時間 int sample = 1000 取樣率設定消除顯示值跳動 long int value r1 讀取 ADC0804 數位資料 long int set n condition select long int r grade_reg[2] grade[15] error1 error2 long int a1 b1 I long int membership[5][3]membership1[3][3] 定義歸屬函數 long int membership2[3][3] = -10-50-5050510 long int error[2] int Rule[15][3] = 113213313 定義判斷規則庫 212223323 311232333 411241342 511251351

54

main() 主程式 j = PWM = 110 設定 PWM 初始值 IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x00 設定計時器 0 工作於模式 0 temp=8192-j4 設定計時器 0 初值 TH0 = temp 32 TL0 = temp 32 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 P3_4 = 1 P3_5 = 0 P3_6 = 0 ADCWR = 0 令 ADC0804 的 WR = 0 ADCWR = 1 令 ADC0804 的 WR = 1 while (1) KeyStatus() 檢查鍵值 void KeyStatus(void) 檢查鍵值並給對應的 PWM 值 char KeyScan(void) 按鍵掃描函數宣告 unsigned char KeyStatus unsigned char Key = 0 KeyStatus=KeyScan() 呼叫按鍵掃描函數 if (KeyStatus = 0) 已有按鍵輸入 Key = KeyStatus Key = 鍵值 if (Key == 0x01) 假如輸入為按鍵 1 i = 110 PWM 為 110us j = i P3_4 = 1 LED 亮第一顆〈表馬達停止〉 P3_5 = 0 P3_6 = 0

55

else if (Key == 0x02 ) 假如輸入為按鍵 2 i = 140 PWM 為 140us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x04 ) 假如輸入為按鍵 3 i = 180 PWM 為 180us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x08 ) 假如輸入為按鍵 4 i = 80 PWM 為 80us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 else if (Key == 0x10 ) 假如輸入為按鍵 5 i = 40 PWM 為 40us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 PWM = j delay1ms(10) 呼叫延遲函數 feedback() 模糊控制判斷

56

void To_int(void) interrupt 1 Timer0 中斷函數 if (P3_0 == 0) 假如 PWM 輸出為 Low P3_0 = 1 變更 PWM 輸出為 High temp=8192-j4 設定 High 的時間 else 若 PWM 輸出為 High P3_0 = 0 變更 PWM 輸出為 Low temp=8192-880+j4 設定 Low 的時間 TH0 = temp 32 Timer0 的計時時間 TL0 = temp 32 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 char KeyScan(void) 檢查鍵值 char KeyStatus 按鍵狀態 P0=0xff 設定 P0 為輸入模式 KeyStatus=~P0 讀取按鍵狀態 return(KeyStatus) 將鍵值送回程式 void feedback(void) 模糊判斷 void Fuzzycontroller() 函數原型宣告 void condition1() 函數原型宣告

57

void condition2() 函數原型宣告 error1 = ((value)40-160)03 輸入變數 1 delay10ms(10) 延遲 10ms error2 = ((value)40-160)03 輸入變數 2 if (key == 0x01 ) 當按鍵 1找出對應的歸屬函數 並做出模糊控制判斷

int membership[5][3]= -100-60-30-60-300-30030030603060100

int membership1[3][3]=-100-500-50050050100 Fuzzycontroller() condition() if (key == 0x02 ) 當按鍵 2找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

05010050100150100150200150200250200250300 int membership1[3][3]=07515075150225150225300 Fuzzycontroller() condition() else if (key == 0x04) 當按鍵 3找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

200320400300400500400500600500600700600700800 int membership1[3][3]=220370520370520670520670820 Fuzzycontroller() condition() else if (key == 0x08) 當按鍵 4找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

02550255010050100200100200300200300400 int membership1[3][3]=05010050100250100250400 Fuzzycontroller() condition()

58

else if (key == 0x10) 當按鍵 5找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

150250350250350450350450550450550650550650750 int membership1[3][3]=150300450300450600450600750 Fuzzycontroller() condition2() void Fuzzycontroller() 模糊控制判斷 void compute_grade() 函數原型宣告 void compute_grade1() 函數原型宣告 a1 = 0 b1 = 001 I = 0 for (n=0 nlt=14 n++) r = error1 set = Rule[n][0]-1 compute_grade() 計算輸入變數 1 與

模糊程度的歸屬函數 condition = 1 r = error2 set = Rule[n][1]-1 compute_grade1() 計算輸入變數 2 與 模糊程度的歸屬函數 grade[n] = MIN(grade_reg[0] grade_reg[1]) a1 = a1 + (grade[n]membership2[Rule[n][2]-1][1]) b1 = b1 + grade[n] I = a1 b1 得到模糊控制判斷的結果 void compute_grade() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership[set][0]) || (r gt membership[set][2])) 當輸入變數不在 歸屬函數內

59

grade_reg[condition] = 0 else if ((r gt membership[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership[set][2]-r) (membership[set][2] - membership[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership[set][0]) (membership[set][1] - membership[set][0]) void compute_grade1() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership1[set][0]) || (r gt membership1[set][2])) 當輸入變數不在 歸屬函數內 grade_reg[condition] = 0 else if ((r gt membership1[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership1[set][2]-r) (membership1[set][2]-membership1[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership1[set][0]) (membership1[set][1]-membership1[set][0])

60

void condition() P2_0 = 1 設定 P20 為輸入模式 P2_1 = 1 設定 P21 為輸入模式 if ( (P2_0 == 1) ampamp (P2_1 == 0)) 當馬達為正轉時 if ( I gt 0 ) 若模糊判斷結果為正 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 若模糊判斷結果為零 PWM = PWM + 0 PWM 寬度不變 if ( I lt 0 ) 若模糊控制結果小於零 PWM = PWM + 1 PWM 寬度加 1 else if ( (P2_0 == 0) ampamp (P2_1 == 1) ) 若馬達為反轉 if ( I lt 0 ) 模糊控制小於零 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 模糊控制等於零 PWM = PWM + 0 PWM 寬度不變 if ( I gt 0 ) 模糊控制大於零 PWM = PWM + 1 PWM 寬度加 1 CW() 判斷 PWM 寬度上下限

61

void CW() 判斷 PWM 寬度上下限 if ( PWM gt= 215 ) 若 PWM 寬度 gt= 最大寬度 j = 215 PWM 寬度維持於 215us if ( PWM lt= 5 ) 若 PWM 寬度 lt= 最小寬度 j = 5 PWM 寬度維持在 5us if ( PWM gt 5 ampamp PWM lt 215 ) PWM 寬度介於最大與最小間 j = PWM PWM 依模糊控制判斷結果增減 void delay1ms(int count) 延遲 1ms int x y for ( x = 0 x lt count x++ ) for ( y = 0 y lt 122 y++ ) void convert() 數位資料換算成馬達轉速 r1 = ((value)40)-160

62

附錄 C LCD 顯示之程式

includereg51h 含 8051 所有暫存器宣告 include mathh define RS P3_5 LCD 指令資料選擇控制 define RW P3_4 LCD 讀寫控制腳 define Enable P3_3 LCD 致能接腳 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P0_0 = 0x80 接腳定義 sbit P0_1 = 0x81 接腳定義 sbit P0_2 = 0x82 接腳定義 sbit P0_3 = 0x83 接腳定義 sbit P0_4 = 0x84 接腳定義 sbit P0_5 = 0x85 接腳定義 sbit P0_6 = 0x86 接腳定義 sbit ADCRD = P3^7 設定 RD 控制線接腳為 P37 sbit ADCWR = P3^6 設定 WR 控制線接腳為 P36 void delay(void) 函數原型宣告 void delay10ms(int count) 函數原型宣告 void display(void) 函數原型宣告 void InitialLCD(void) 函數原型宣告 void WriteIns(char) 函數原型宣告 void WriteData(char) 函數原型宣告 void WriteString(charchar) 函數原型宣告 void CheckBusy(void) 函數原型宣告 void convert(void) 函數原型宣告 char MSG0[] = Motor Speed = 定義字串 MSG0 char MSG2[] = rpm 定義字串 MSG2 unsigned char MSG1[8]=0000000 定義字串 MSG1 unsigned long int value 讀取 ADC0804 數位資料 int sample = 1000 取樣率設定消除顯示值跳動 long int rpm

63

main() 主程式 InitialLCD() 初始化 LCD IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x01 設定計時器 0 工作於模式 1 TH0 = (65536-5000)256 設定計時器 0 初值 TL0 = (65536-5000)256 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 while(1) 等待中斷 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 while (--sample == 0) 取樣率減 1 sample = 1000 重設取樣率 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 void T0_int(void) interrupt 1 LCD 顯示動態掃描 display() 動態掃描顯示 TH0 = (65536-65535)256 重設計時初值 TL0 = (65536-65535)256

64

void InitialLCD(void) 設定 LCD 模組初始狀態 delay() 延遲函數 WriteIns(0x38) 設定 LCD 模組為 WriteIns(0x38) 2 行顯示 WriteIns(0x38) 8 位元介面 WriteIns(0x38) 5x7 點字型 WriteIns(0x08) 關閉顯示器 WriteIns(0x01) 清除 LCD 螢幕 WriteIns(0x0c) 令顯示器 ON但游標不顯示 WriteIns(0x06) 令 LCD 模組每接收到 1Byte 資料 AC 值自動加 1 void display() 掃描顯示 WriteIns(0x80) 設定 LCD 座標 WriteString(13MSG0) 將字串 MSG0 寫入 LCD 中 WriteIns(0xc0) 設定 LCD 座標 WriteString(8MSG1) 將字串 MSG1 寫入 LCD 中 WriteIns(0xc8) 設定 LCD 座標 WriteString(4MSG2) 將字串 MSG2 寫入 LCD 中 void convert(void) 換算轉速 long int freq freq = ((value)4000) - 16000 數位資料換成頻率公式 rpm = freq3 頻率換算轉速公式 MSG1[0] = (rpm1000000)+0x30 將結果存入字串 MSG1 中 MSG1[1] = ((rpm1000000)100000)+0x30 MSG1[2] = ((rpm100000)10000)+0x30 MSG1[3] = ((rpm10000)1000)+0x30 MSG1[4] = 0x2e MSG1[5] = ((rpm1000)100)+0x30 MSG1[6] = ((rpm100)10)+0x30 MSG1[7] = rpm10+0x30

65

void WriteIns(char instruction) 寫命令至 LCD 中 RS = 0 選擇指令暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = instruction 輸出命令至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteData(char i) 寫資料至 LCD 中 RS = 1 選擇資料暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = i 輸出資料至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteString(countMSG) 寫字串至 LCD 中 char count 字串長度 char MSG[] 字串資料 char i 定義位元組變數 for(i=0 iltcount i++) count 個位元組 WriteData(MSG[i]) 寫入一位元組的資料至 LCD 中 void CheckBusy(void) char i=0x80 檢查忙碌旗標 while(iamp0x80) 忙錄旗標 BF = 1 RS = 0 選擇指令暫存器 RW = 1 讀取 Enable = 1 致能 LCD i = P2 讀取 LCD 指令暫存器內的資料

66

Enable = 0 除能 LCD delay() 延遲函數 void delay() 延遲 5ms int i for(i=0 ilt250 i++)

  • 畢業專題封面pdf
  • File0004pdf
  • 最終版pdfpdf
Page 15: Based on Fuzzy Control Theorem and TPWM Method for DC ... · 使吾人想設計一模糊控制器來做為馬達轉速的閉迴路控制,以解決非線性系統的 問題。除此之外,flcs

6

multi-value〉利用歸屬函數〈membership function〉描述一個概念的程度亦及

使用 0 和 1 之間的數值來表示一個元素屬於某一概念的程度這個值稱為元素對

集合的歸屬度〈membership grade〉當歸屬度為 1 時表示該元素百分之百屬於

這個概念當歸屬度為 0 時則表示該元素完全不屬於這個概念介於兩者之間

的就是完全屬於和完全不屬於之間的灰色地帶

模糊理論的工程應用大約始於 1974 年倫敦大學的 EHMamdani 教授他根

據 Zadeh 提出的語言分析法〈linguistic approach〉及模糊推論〈fuzzy inference〉

運用 IF-THEN 形式的法則來敘述操作員的控制策略成功地應用在蒸汽機自動

運轉上﹝6﹞從此模糊理論的應用便迅速發展以在控制方面的研究成果最為

顯著模糊理論其實是一門相當生活化的學問由於使用語言變量描述因此更

具親和力與一般性人類日常生活所遇所用的一些敘述即大都是模糊的例如

那個人ldquo很高車開的ldquo很快等等其中ldquo很高ldquo很快並不是一個

明確值而只是描述事件的程度但是根據這些描述人類卻能很輕易的接收

212 模糊集合

模糊集合〈fuzzy set〉可視為傳統集合的擴張在模糊集合的世界中稱傳

統集合為明確集合〈crisp set〉所謂模糊集合是指用來表示界限或邊界不分明的

模糊概念的集合許多日常生活中的概念常常都不是清晰明確的這些可說是模

糊概念例如很高很快等這類概念無法用傳統的二值集合論即 0 或 1 表示

而Zadeh教授提出的Fuzzy集合論可以將這些概念由傳統集合論的特徵函數從非

0 即 1 的二值選擇推廣為從 0 到 1 之間的任何值做選擇得到新型的特徵函數

稱為歸屬函數

模糊集合由歸屬函數表示相對於明確集合的特徵函數其值只有 0 或 1 兩個

值即其值為在實軸閉區間[01]之中的任一實數模糊集合可以彌補明確集

合描述時所產生的不合理現象因此模糊集合比傳統的明確集合更具客觀性

7

213 歸屬函數

歸屬函數〈membership function〉為 0 到 1 之間的數值吾們可以藉由歸屬

函數來描述 Fuzzy 集合的特質它是 Fuzzy 理論的最基本觀念透過歸屬函數我

們才能對 Fuzzy 集合進行量化也才可能利用精確的數學方法分析處理模糊性資

歸屬函數在 Fuzzy 控制的應用範疇內都要具備凸〈convex〉及正規〈normal〉

等基本特性〈如圖 21〉歸屬度函數的定義可以分為數值及函數兩種數值定義

方式又稱為離散化歸屬函數它是直接給定有限 Fuzzy 集合內每個元素的歸屬

度並以向量的形式表現出來函數定義方式又稱為連續化歸屬函數它是以不

同形式的函數來描述 Fuzzy 集合

圖 211 正規且凸模糊集合

1

0 圖 212 正規非凸的模糊集合

8

一個模糊集合的歸屬函數可以有許多方式但是目前最廣泛使用的有吊鐘

型三角型梯型等歸屬函數

〈1〉吊鐘形歸屬函數

吊鐘形歸屬函數定義如下

μA=bell(xabc)= b

acx 2

1

1minus

+

〈21〉

圖 22 吊鐘型歸屬函數

〈2〉三角形歸屬函數

三角形歸屬函數可由三個參數(abc)來加以決定

=Aμ trangle(xabc)

⎪⎪⎪

⎪⎪⎪

ltleminusminus

ltleminusminus

=

other

cxbcbcx

bxaabax

0

〈22〉

其中a為歸屬函數左邊界b為歸屬函數中心值c為歸屬函數右邊界

9

圖 23 三角型歸屬函數

〈3〉梯型歸屬函數

梯型歸屬函數可由四個參數加以決定

=Aμ trapezoid(xabcd)

⎪⎪⎪⎪

⎪⎪⎪⎪

leleminusminus

ltle

ltleminusminus

=

other

dxcdcdx

cxb

bxaabax

0

1 〈23〉

圖 24 梯型歸屬函數

10

214 模糊推論與模糊規則

模糊推論〈fuzzy inference〉是根據知識庫保存的規則(rule)和給予的事實

推導出新的結論與傳統推論不同的地方是Fuzzy推論不只可以處理明確命題也

可以處理Fuzzy命題Fuzzy推論是依據近似推理〈approximate reasoning〉的概念

發展出來的比傳統推論的嚴正推理〈exact reasoning〉更合理也更具彈性近

似推理是兩種嚴正推理General Modus Ponens〈簡稱GMP〉及Genera Modus

Tollens〈簡稱GMT〉的一般化此原理是從傳統二值邏輯中的肯定律〈modus

ponens〉和否定律〈modus tollens〉推廣而來其中GMP又可稱為前向推理而

GMT則可稱為反向推理

〈1〉 GMP〈General Modus Ponens〉

規則IF x is A THEN y is B

事實x is Arsquo

結論y ix Brsquo 〈24〉

〈2〉 GMT〈General Modus Tollens〉

規則IF x is A THEN y is B

事實y is Brsquo

結論x is Arsquo 〈25〉

上式中IF x is A THEN y is B即為模糊規則〈fuzzy rules〉AArsquoBBrsquo

分別是定義在論域X及Y的模糊集合xy代表輸入變數及輸出變數的語言變數

一般來說「x is A」稱為前件部〈antecedent〉而「Y is B」則稱為後件部

〈consequence〉Fuzzy知識庫〈Fuzzy Knowledge Base簡稱FKB〉即由這些模

糊規則所組成的規則庫〈rule base〉和存放描述領域知識的Fuzzy變數及語言變數

的資料庫〈data base〉所組成所以FKB是用來描述受控對象所涉及的領域知

11

識和操控目標的一些定性及定量的資訊模糊知識庫和模糊推論是構成Fuzzy規

則系統核心的兩個重要部門﹝7﹞

模糊推論是模糊系統的核心根據知識庫的模糊法則進行模糊理論的合成運

算來模擬人類的思考決策模式一般來說規則的建立是採取十分主觀直覺的

方式依據相關領域專家的經驗與知識透過詢問進而將其知識經驗歸納條列出

重點再轉換成模糊規則的形式表現出來但是並非所有的專家或操作員都能

將自身的經驗知識以言詞的方式充分的表達出來且未必能整理成條列的模糊規

則所以知識規則的萃取工作往往是在建構模糊系統時最常遭遇到的困難之

215 模糊控制器

模糊控制是智慧型控制〈intelligent control〉系統的一種典型其基本特點

是不完全依賴受控對象的數學模型主要是利用人的操作經驗知識和推理技

術以及控制系統的某些訊息和性能得出對應的控制動作模糊控制是以並行

〈parallel〉方式處理規則的推理工作〈如圖25〉其近似推理會包容每個對操

控系統有貢獻的規則即使某些貢獻程度很小的規則也不會忽略

圖 25 模糊控制系統的構造

12

一個控制器的輸入通常是確定數值而非模糊輸出也是如此才能對被控對象

發生作用但是模糊邏輯控制器〈Fuzzy Logic Controller簡稱FLC〉則是以語

言化的控制規則為主體為了能夠把輸入的確定值與語言化之後的控制規則結

合必須把輸入的確定值模糊化〈fuzzification〉以便對應到FLC語言變數的論

域範圍中同樣的經過規則庫推理出來的結果是對應到輸出語言變數的論域

中所以也必須對其做解模糊化〈defuzzification〉的工作才能達成實際的控制

目標

一般模糊控制器的架構包含了五個主要部分定義變數模糊化知識庫

模糊推論及解模糊化

〈1〉 定義輸入及輸出變數

決定程序被觀察的狀況及考慮控制的動作輸入變數可以是擷取

自受控系統的觀測量也可以是推導出來的資料輸出變數則為操控

受控系統的操作量例如在一般控制問題上輸入變數通常為輸出

誤差e與輸出誤差之變化率e而控制變數則為下一個狀態之輸入

u其中eeu統稱為模糊變數

〈2〉 模糊化

將量測值轉換為語言變數的過程將外界所輸入的確定數值經由

一比例映射傳送到輸入變數所對應的模糊論域然後再利用模糊化

函數將此輸入資料轉換成適當的口語值以供模糊運算使用此口語

化變數稱之為模糊子集合

〈3〉 知識庫

模糊知識庫是模糊控制的依據由它來定義所有使用到的語言控

制法則及相關各項參數知識庫可說是整個控制系統資料核心其包

含了兩個部分資料庫〈data base〉與規則庫〈rules base〉

1 資料庫

提供處理模糊數據之相關定義資料庫所存放的資料是關

13

於如何將明確的資料轉換成模糊數值而資料的存放方式是以

歸屬函數表示該選用哪一種歸屬函數依實際的需要選定

以三角形歸屬函數最常被使用因其運算最為容易且又能充分

的表達模糊概念

2 規則庫

利用語言化的條件式控制規則描述控制目標和策略通常

控制規則可以由操控人員的經驗或專家的知識推導出來多個

控制規則所組成的集合就是規則庫

〈4〉 模糊推論

模糊推論為模糊控制最重要的核心其最主要的工作就是做實際

的決策過程處理模糊推論具有模擬人類做決策判斷的能力其基本

理論就是根據人類特有的近似推理方式如之前已說明的GMP和

GMTGMP為前向推理而GMT為逆向推理因為模糊推論為前向

運算因此GMP非常適合使用為模糊控制的推論機構

〈5〉 解模糊化

將推論完成所得到的模糊輸出量轉換成實際的明確數值以便和

外界溝通解模糊化的方法有很多例最大歸屬度法重心法高

度法面積法等

圖 26 模糊系統的基本架構

14

22 直流馬達數學模型

圖27為直流馬達等效電路簡圖其中

iV = 輸入電壓 ai = 電樞電流

zR = 電樞電阻 gT = 轉矩

aL = 電樞電感 bE = 反電動勢

φ = 空氣隙磁通量 ω = 轉子角速度

B = 黏滯摩擦係數 J = 轉動慣量

圖 27 直流馬達等效電路簡圖

由克希荷夫電壓定律知

( ) ( ) ( )tEdt

tdiLtiRV b

aaaai ++= 〈26〉

由於反電動勢 bE 與轉軸的角速度 ( )tω 及空氣隙磁通量φ之乘積成正比即

( ) ( ) ( )tKtKtE emb ωφω == 〈27〉

15

又轉矩的平衡方程式為

( ) ( ) ( )dt

tdJtBtTgωω += 〈28〉

且馬達轉矩 gT 與電樞電流 ( )tia 及空氣隙磁通量φ乘積成正比即

( ) ( ) ( )tiKtiKtT ataag == φ 〈29〉

取〈26〉~〈29〉式之拉氏變換得

( ) ( ) ( ) ( )sEssILsIRsV baaaai ++= 〈210〉

( ) ( )sKsE eb Ω= 〈211〉

( ) ( ) ( )sJssBsTg Ω+Ω= 〈212〉

( ) ( )sIKsT atg = 〈213〉

則馬達輸入電流與轉速為

( ) ( ) ( )( ) ( )( )

sR

sEsV

sLRsEsV

sIe

a

bi

aa

bia τ+

minus

=+minus

=1

〈214〉

( ) ( ) ( )

sB

sT

sJBsT

sm

gg

τ+=

+=Ω

1 〈215〉

其中a

ae R

L=τ 為電樞電流的電氣時間常數 BJ

m =τ 為馬達轉動的機械時間

常數

直流馬達轉速對輸入電壓的轉移函數 ( )sG 為

( ) ( )( ) ( )( ) etaa

t

i KKBJsRsLK

sVssG

+++=

Ω=

( )( ) etmea

t

KKssBRK

+++=

ττ 11 〈216〉

16

在一般情況電樞電感很小所以 eτ 可以忽略不計因此上式成為一階落後

方程式

( ) ( )( ) ( ) m

m

etma

t

i sTK

KKsBRK

sVssG

+=

++=

Ω=

11 τ 〈217〉

其中

eta

mam KKBR

BRT

+=

τ

eta

tm KKBR

KK

+=

所以直流馬達數學模式可以以圖28表之﹝8﹞

圖 28 直流馬達數學模式方塊圖

17

第三章 系統功能分析與製作規劃

31 專題製作流程

如圖 31 所示本專題主要分為兩條路徑進行一為硬體另一則為軟體程

式撰寫本章著重硬體的規劃設計軟體則在第四章中介紹在完成 AB 信號

產生電路驅動功率放大電路與間距脈波產生電路設計與製作後須先接上馬達

做一連串的測試〈此時系統並無回受控制〉測試間距脈波是否太長或太短硬

體電路是否有缺失hellip等等另一方面也著手撰寫模糊控制程式並將其與硬體電

路結合最後做閉迴路系統的整合測試若發現系統的運作結果並不如預期

則需分別從硬體與軟體兩方面去改良

直流馬達轉速之模糊控制

文獻蒐集與整理

AB信號產生電路設計與製作

驅動功率放大電路設計與製作

間距脈波產生電路設計與製作

測試間距脈波是否太長或太短

系統測試測試馬達轉速是否

達到控制目的

結束與論文寫作

重新設計間距脈波長度

Yes

No

系統整合與修正

輸出信號與Fuzzy控制器之連結設計

規劃輸出與輸入歸屬函數

規劃模糊知識庫

撰寫主程式並加入模糊知識庫

程式編譯及連結

軟硬體整合測試馬達是否運作

程式調整及最佳化

No

YesYes

No

圖 31 專題製作流程圖

18

32 雙脈寬調變法之直流馬達驅動電路設計

本專題製作的雙脈寬調變法之直流馬達驅動電路設計大致可以分為二大部

分第一雙脈寬調變法之電路設計第二橋型驅動功率放大電路

雙脈寬調變〈Two Pulse Width Modulation簡稱TPWM〉之電路設計主要

是先製作一脈寬調變〈Pulse Width Modulation簡稱PWM〉波形然後再將此

波形各別經由一緩衝器〈buffer〉和反向器〈inverter〉則可產生AB驅動信號

脈波此即為TPWM

321 脈寬調變電路

如圖32先利用兩顆op產生三角波電路再利用一個比較器比較三角波

和誤差值之大小

150k

1M

20k

+12V

-12V

+12V

-12V10k

+12V

-12V

10k

+12V

-12V-

+-

+

-

+ PWMLM324

LM324

LM324

2200pF

圖 32 脈寬調變電路

〈1〉 三角波產生電路

三角波產生電路通常至少需要兩個運算放大器其電路如圖33OP1

為一個反相積分器OP2為一個史密特磁滯比較器將OP2的輸出方波經

19

OP1反相積分以後得到Vo1三角波此三角波又同時加到OP2控制其狀

態的改變

當方波產生器的輸出是正的則三角波產生器的輸出是斜向負相似

地當方波產生器的輸出是負則三角波產生器的輸出是斜向正這個動

作將產生三角波的輸出同時也輸出方波﹝9﹞

+VCC

-VCC

-

+

R1

R2

R3

+VCC

-VCC

-

+

OP1

OP2

Vo2Vo1

圖 33 三角波產生電路

對OP2而言是磁滯比較必須先找到OP2的 THV 和 TLV

232

21

32

3oo v

RRR

vRR

Rv

++

+=+ 〈31〉

當 0=+v 時

23

21 oo v

RR

v minus= 〈32〉

表要達到OP2的 0=+v 必須有這麼大的 1ov

當 12 sato Ev = 時

TLsato VERR

v =minus= 13

21 〈33〉

當 22 sato Ev minus= 時

THsato VERR

v =+= 23

21 〈34〉

20

對OP1而言是反相積分器 2ov 為其輸入 1ov 為其輸出則

tCIt

Rv

Ct

CRv

dtvCR

v oooo

11

2

11

22

111

11minus=minus=minus=minus= int 〈35〉

因為

1

2

Rvv

I o minusminus= 0=minusv 〈因為虛接地〉 〈36〉

所以

1

2

Rv

I o= 〈37〉

又因運算放大器的輸入阻抗非常大則流經 1C 的電流也為 I 相當於以定

電流對電容C 充電

當 12 sato Ev = 時 1ov 為下降斜波

tR

EC

v sato

1

1

11

1minus= 〈38〉

當 22 sato Ev minus= 時 1ov 上升斜波

( )

tRE

Cv sat

o1

2

11

1 minusminus= 〈39〉

由此可知三角波的上升與下降斜波乃因 1C 的充電與放電且時間

常數為 11CR

三角波週期分析如下

1 上升斜波的時間 1T

tCR

vv o

o1

1

21 minus= 11

2

1 CRvv

to

ominus=

1Tt = TLTHo VVv minus=1 22 sato Ev =

11111

21

sat

TLTH

sat

TLTH

EVV

CRCRE

VVT

minus=

minusminus= 〈310〉

2 下降斜波的時間 2T

tCR

vv o

o1

1

21 minus= 11

2

1 CRvv

to

ominus=

21

2Tt = THTLo VVv minus=1 12 sato Ev =

1

11111

1sat

TLTH

sat

THTL

EVV

CRCRE

VVT

minus=

minusminus= 〈311〉

3 週期 21 TTT +=

若 1satE = 2satE = satE 且3

22RR

VV TLTH =minus satE

3

2114

RR

CRT=

若R3 = nR2

則nCR

T 114=

114 CR

nf = 〈312〉

《實驗結果》

必須注意的是三角波的頻率太低將導致馬達的轉動產生脈動現象

故將工作頻率設計在1kHz以上

Ω= k1501R Ω= k102R

Ω= k203R pFC 22001 =

所得到的三角波頻率為

15kHz10220010001504

00010100020

f 12- =timestimestimestimes

timestimes

=

圖 34 三角波輸出波形

22

〈2〉 脈寬調變電路〈PWM〉

+12V

-12V

10k

+12V

-12V -

+ PWM輸出LM324三角波輸入

圖 35 脈寬調變電路

PWM系統往往連接至直流電源供應放大器的工作是以固定的頻率開

閉直流供應電壓其激發角是可以調整的因此得到波寬可調的輸出

將固定頻率的三角波與反向輸入的電壓做比較便可輸出一脈寬〈見圖

36〉反向電阻值的不同將導致反向輸入電壓不同故其輸出為一可調但

頻率固定的脈寬也正因為如此故稱為脈寬調變〈PWM〉由於輸出的

dutycycle不同故馬達將接收到不同的平均電壓因而可以藉由PWM控制

馬達的轉速

反相輸入電壓

PWM

圖 36 三角波與反相輸入電壓比較

23

PWM的優點在於馬達驅動電路的電晶體之控制信號改以脈波列來控

制使電晶體操作成類似開關的動作不是完全導通就是完全截止故電晶

體不是一直操作於作用區所以其功率消耗不大整體效率較高

《實驗結果》

圖 37 PWM 輸出波形

322 橋型驅動功率放大電路

如圖38所示主要由四個功率電晶體組成利用不同的電晶體對使直流

馬達做正逆轉控制當Q5Q8導通使馬達正轉當Q6Q7導通馬達則逆

轉電路中的電晶體扮演開關的作用

此種電路簡單只要一組直流電源供應且電晶體分擔了部份的電壓保護

電晶體迅速工作於截止與飽和狀態之間故沒有功率散逸損失之虞

但是在設計時切勿使Q5Q6同時導通以免燒毀電路上之元件因為在

AB兩脈波短暫的交變時間內由於電晶體本身之最小延遲時間有可能使Q5

Q6同時ON與Q7Q8在很短時間同時ON因此在15kHz交變下容易燒毀功

率電晶體

因此設計一間距脈波電路主要之功用使Q5Q6和Q7Q8均不同時導通

24

以拉長AB兩者交換時間

M

20k

10k

20k

10k

+24V

A 信號 B 信號

2N3055 2N3055

2N2955 2N2955

1N40021N4002

C1815 C1815

C1815 C1815

Q5

Q8Q6

Q7

圖 38 橋型驅動功率放大電路

圖 39 橋型驅動功率放大電路實體圖

25

此外若考慮電晶體BE間的電壓則電路會出現約 plusmn 06V的不感帶〈ded

band〉即電晶體的 oV 對 inV 間的關係如圖3101假使 inV 電壓為正弦波則 oV 變

成如圖3102為了改善這種缺失吾人利用兩個二極體接在電路上如圖38

用來補償電晶體BE間的壓降﹝10﹞

約06V

Dead band

Vo

Vin

圖 3101 呈現不感帶的轉移函數

圖 3102 輸出電壓波形

26

323 間距脈波產生電路

RCext15

Cext14 74123

A3

B2

Q13

CLR1

Q4

7486100k

2200pF

10k

10000pF

+5V

間距脈波輸出

圖 311 間距脈波產生電路

間距脈波的產生方式是根據脈寬調變〈PWM〉後的訊號再經由積分電路的

電阻兩端取出且經由兩倍頻器〈74LS86〉檢示出PWM的正負緣脈波最後

再利用單穩態IC〈74LS123〉將檢出信號之脈寬拉長至01ms此即為間距脈波

74LS123有兩個輸入端子A及B分別為下降波緣輸入端子及上升波緣輸入端

子當輸入A之脈波由ldquoH變成ldquoL之瞬間Q輸出變為ldquoH其持續時間長

短由RC時間常數決定反之當輸入B之脈波由ldquoL變成ldquoH之瞬間Q輸出

變成ldquoH維持一定時間

74LS123的輸出脈波之寬度是由電阻及電容之時間常數所決定概略計算公

式如下

CR045T timestimes=

電容 C 必須大於 1000pF

27

《實驗結果》

R=24kΩ C=10000pF

所以得到間距脈波為

( )msec0110810000p24k045T cong=timestimes= μ

圖 312 間距脈波

研究經分析後發現

1 間距 T 愈大愈能確保電路之安全性愈有保護作用

2 間距 T 愈大相對的使驅動信號脈波減少愈多造成馬達旋轉扭力大

大減弱

3 適當的間距 T不但不會影響馬達的輸出轉矩而且兼具保護電路的

效果

33 編碼器

轉動編碼器不只可以作為轉速的感測也能做位置的感測又適合於數位處

理故被廣泛使用若就信號來看轉動編碼器可分為增量型與絕對型若以檢

測的方式來分可分為光學式和磁式兩種在本專題中所使用的編碼器為光學式

增量型編碼器﹝11﹞

光學式轉動編碼器的原理如圖 313在附有細縫轉盤的兩側分別裝置發光元

28

件與受光元件如果只有一組光電檢測元件則輸出信號就只有一相的脈波信

號此種裝置稱為脈波產生器圖 314 為增量型轉碼器的輸出信號它是利用

兩組光電元件所產生的脈波信號A 相和 B 相間有相位差正轉時 A 相領前 B

相逆轉時 B 相領前 A 相因此利用此兩相做檢測馬達為正轉或逆轉的工作

並利用 A 相或 B 相的頻率檢測出目前的轉速

吾人計算出編碼器每一轉可以產生約 200 個脈波故檢測 A 相或 B 相其頻

率為 N則轉速應為 60200

timesN

〈rpm〉

圖 313 光學式轉動編碼器的原理圖

圖 314 編碼器的輸出信號波形

29

34 LM2917 FV 電路設計

對 LM2907 而言磁滯比較器和電流汞是構成頻率對電壓轉換的基本架構

並且預留一個運算放大器及一個電晶體供各種不同的使用圖 315 為吾人所設

計的 FV 電路圖中 C1 用以抑制電流汞動作時所產生的漣波變化正常使用時

此電容應大於 10C若 C1 太大也將造成轉換速度下降

因為單晶片 8051 之輸入電壓最高為 5V故必須設計其馬達最高轉速頻率所

轉成的電壓必須在 5V 以內由於馬達轉速頻率範圍極大故吾人給予 LM2917

+12V 的電壓以擴大它可以轉換的電壓範圍並將所需維持在 5V 內

a1

14

b1

1

a1

13

b1

2

a1

12

b1

3

a1

11

b1

4

1

a1

10

b1

5

a1

8

b1

7

a1

9

b1

6

L2917

Encoder輸 入

1uF

+12V

FV輸出1000pF

45k 10kC1

C2

圖 315 FV 電路

30

《實驗結果》

根據統計結果每 50mV 相對於 100Hz如此一來吾人想得知馬達目前

的轉速只要將單晶片所接收到的電壓值經過換算即可得知目前 encoder 所量測

的頻率吾人知道 encoder 一圈可產生 200 個脈波故馬達的轉速便可經過下列

公式換算得知

轉速〈rpm〉 60200

times=f

其中 =f encoder 所量測到的頻率

表 31 頻率與轉換電壓之關係

頻率

(Hz) 1 2 3 4 5 6 7 8 9

電壓(V) 0006 0006 0007 0008 0009 0009 0009 0009 001

頻率

(Hz) 10 20 30 40 50 60 70 80 90

電壓(V) 008 009 010 010 011 011 012 012 013

頻率

(Hz) 100 200 300 400 500 600 700 800 900

電壓(V) 013 018 023 028 033 038 043 049 054

頻率

(Hz) 1000 2000 3000 4000 5000 6000 7000 8000 9000

電壓(V) 059 109 16 209 257 304 3508 4006 45

31

圖 316 頻率對電壓曲線

35 單晶片介面電路

單晶片介面包括了二大部分分別為單晶片 8051AD converter

〈1〉8051 單晶片

為本控制系統的核心一切動作皆經由它控制

〈2〉AD converter

將類比開關所送出來的類比訊號經由 ADC 0804 轉換成數位訊號傳送

到單晶片的輸入埠

351 AD 轉換

以單晶片 8051 控制 ADC0804則單晶片 8051 必須下達ldquo開始轉換rdquo的命令

給 ADC0804然後 ADC0804 就開始讀入類比輸入端的電壓在內部開始轉換

經過一段轉換時間後〈約 100μ s〉ADC0804 就將轉換完成的值放在其內部的三

態輸出栓鎖緩衝器裡然後將轉換完成輸出腳〈INTR〉降為 low以通知單晶片

可以去讀轉換完成資料

當WR和CS 同時為ldquo0rdquo時表示對 ADC0804 下達ldquo開始轉換rdquo命令再經過

32

一段轉換時間〈100μ s〉後轉換完成ADC0804 會將其轉換完成的數位資料放

在其內部 8 位元緩衝區裡且將 INTR 降為ldquo0rdquo因此單晶片只要下達ldquo開始轉換rdquo

命令後去檢查 INTR 的狀態就可以知道是否轉換完畢其方法有兩種

1 輪詢法〈polling〉

2 中斷法〈interrupt〉

所謂輪詢法就是將 ADC0804 的 INTR接到 CPU 的一條 IO 線上然後以軟體指

令主動偵測其狀態當偵測到為ldquo0rdquo時就可以去讀出 ADC0804 裡的緩衝區的轉

換值

中斷法是一個很理想的 IO 方式因為不像輪詢法必須讓 CPU 等 ADC0804

轉換當 CPU 下達ldquo開始轉換rdquo命令後就可以做其他工作當 ADC0804 轉換完

畢後 INTR會降為ldquo0rdquo可以利用此信號去中斷 CPU再由中斷副程式去讀入

轉換值即可因此大大提高了程式的效率

當 CPU 接收到 ADC0804 發出ldquo轉換完畢rdquo的信號〈 INTR =0〉後就可以去

讀出轉換值其讀出的方法是將CS 與RD設為ldquo0rdquo即可讀到轉換值這個讀值的

動作又會使得 INTR恢復成ldquo1rdquo

1 CPU 下達ldquo開始轉換rdquo命令〈CS =0WR =0〉

2 ADC0804ldquo轉換完畢rdquo 〈 INTR =0〉

3 CPU 讀取轉換值〈 RD =0CS =0〉

4 讀完後 INTR =1

ADC0804 主要規格摘要如下

1 +5V 單電源工作電壓

2 類比電壓輸入範圍 0~+5V

33

3 參考電壓為 25V

4 轉換時間為 100μ s〈 CLKf =640kHz〉

5 解析度為 8 位元

6 誤差plusmn 1LSB

7 讀取時間 135ns

36 電源供應系統

本專題中所有電路及硬體設備所需的電源採用交流電源 110V 經由 PT-31

變壓器後再經過橋式整流後提供了直流電源而因為各個電路所需電源不同

因此製作了多組的變壓電路如下

1電壓源 DC5V選擇了 7805 的穩壓 IC 搭配電容得到了+5V 的電壓源

供〈1〉8051 微處理器 〈2〉ADC 0804 〈3〉74LS8674LS12374LS04

74LS02CD4013 〈4〉馬達 Encoder

2電壓源 DC12V使用 7812 穩壓 IC 搭配電容得到+12V 的電壓源供

LM2917 使用

3電壓源 DC24V利用 7824 的穩壓 IC 搭配電容獲得+24V 的直流電壓

源供電路之橋型驅動功率放大之電晶體使用

Vin1

+12V2

GND3

LM7812

2200uF 10000pF 2200uF 10000pF

+12V outputAC

圖 317 直流電源電路

34

圖 318 直流電源電路實體圖

37 馬達轉速的量測

表 33 PWM 輸出對應 encoder 週期

PWM dutycycle encoder 週期 PWM dutycycle encoder 週期

40 sμ 172 sμ 440 sμ 0 sμ

80 sμ 188 sμ 480 sμ 0 sμ

120 sμ 204 sμ 520 sμ 0 sμ

160 sμ 230 sμ 560 sμ 0 sμ

200 sμ 272 sμ 600 sμ 0 sμ

240 sμ 328 sμ 640 sμ 0 sμ

280 sμ 416 sμ 680 sμ 1320 sμ

320 sμ 540 sμ 720 sμ 750 sμ

360 sμ 800 sμ 760 sμ 510 sμ

400 sμ 1320 sμ 800 sμ 400 sμ

35

圖 319 PWM 輸出對應 encoder 週期

由統計可知道此馬達並不是一顆線性馬達故相信若使用模糊控制理論來

作為其回授控制系統的控制器一定能達到比傳統控制器的性能還要好而且若能

在模糊控制裡加上 PID 控制器的觀念一定能在系統的響應時間上升時間

安定時間和超越量達到最佳的控制另一方面馬達在其反方向的內阻較大需

要更大的力量才能使馬達驅動

36

第四章 軟體規劃與製作

41 PWM 之軟體設計

因為之前所介紹的硬體方式是以調整可變電阻來達到轉速的調整因此無法

得知所給予的脈寬長度和轉速大小尤其在回授時也不易給予適當的訊號來調整

轉速因此改良之方法就是以8051之軟體撰寫方式來產生固定的脈寬也就等

於給予轉速的命令而在其回授控制時也只要在內部程式给予適當的指令便可

達到脈寬長度的調整以達到閉迴路之受控系統

411 PWM 軟體流程

設定Timer0模式為0

TH0 = temp 32 TL0 = temp 32

temp = 8192 ndash j4 Key = 0

檢查是否有鍵值

將鍵值存入Key

Yes

No

設定Key值所對應的 j值

If P30 == 1Then P30 = 0 temp = 8192 ndash j4Else P30 = 1 temp=8192ndash880+j4

TH0 = temp 32 TL0 = temp 32

Start Timer0中斷副程式

啟動Timer0

等待Timer0中斷

返回主程式

圖 41 PWM 軟體設計流程圖

37

在此總共設計了五個按鈕分別代表不同的轉速停止正轉〈慢〉正轉

〈快〉逆轉〈慢〉和逆轉〈快〉使用Timer0是因為8051之計時中斷比延遲程

式來的準確故可以達到準確的計時程式設計理念中並沒有將中斷致能清除

因此Timer0會一直處於計時的狀態程式執行時將一邊檢查鍵值〈KeyStatus〉一

邊進行計時當計時完畢便呼叫中斷副程式然後執行改變Port 30的輸出狀

態若是為high則變為low反之若是為low即變為high同時並重設計時時間

Timer0繼續計時

當鍵值改變時計時的時間也會跟著改變如此一來Timer0將ㄧ直重覆上

述動作直到電源切掉Timer0才會停止計時

42 模糊控制之程式規劃與撰寫

本專題目標在完成了先前所規劃的硬體電路之後接著就是要達成利用模糊

控制理論來設計控制器在此採用了單晶片8051目的是為了以硬體實現方式來

代替電腦模擬期望能夠按照原訂計畫完成本專題「具模糊控制理論與雙脈寬調

變法之直流馬達驅動電路設計」

單晶片 8051 模糊控制的程式撰寫採下列幾個步驟依序完成

1 設定變數轉速誤差〈dspeed〉目前轉速〈sspeed〉

2 模糊化採用三角形歸屬函數採用三角形歸屬函數的原因

〈1〉 三角形函數為一連續函數

〈2〉 三角形函數為線性的函數所以計算速度較快

〈3〉 是具有發散也有收斂的函數和指數函數一樣接近

事實

3 模糊推論模糊規則將其所有可能發生情況以 IFhellipTHENhellip表示

並建立控制規則表

4 解模糊化採用重心法

38

421 歸屬函數

設定變數為目前轉速〈sspeed〉與轉速誤差〈dspeed〉因此此模糊控制器共

有兩個輸入訊號與一輸出訊號輸出訊號為脈寬長度該加或是減多少又因為有

五種不同的轉速因此各分別設計了不同的歸屬函數如下

1 當轉速 = 0

ml h

s s p e e d

d s p e e d

r p m0 5 0 1 0 0- 5 0- 1 0 0

mv l l h v h

r p m0- 3 0- 6 0- 1 0 0 3 0 6 0 1 0 0 圖 42 停止時之歸屬函數

2 正轉〈慢〉

ml hsspeed

dspeed

rpm150 225 300750

mvl l h vh

rpm150100500 200 250 300

圖 43 正轉〈慢〉之歸屬函數

39

3 正轉〈快〉

ml hsspeed

dspeed

rpm520 670 820370220

mvl l h vh

rpm500400300200 600 700 800

圖 44 正轉〈快〉之歸屬函數

4 逆轉〈慢〉

ml hsspeed

dspeed

rpm100 250 400500

mvl l h vh

rpm10050250 200 300 400 圖 45 逆轉〈慢〉之歸屬函數

40

5 逆轉〈快〉

ml hsspeed

dspeed

rpm300 450 600150

mvl l h vh

rpm450350250150 550 650 750

750

圖 46 逆轉〈快〉之歸屬函數

6 輸出

OutputMVL L H VH

rpm0-50-150-250 50 150 250

圖 47 輸出之歸屬函數

41

422 模糊規則庫

表 41 為吾人所設計的模糊控制規則庫並利用 Matlab 之 Fuzzy ToolBox 來

建立此規則庫以進行模擬推論圖 48 為當馬達輸入指令為正轉慢時推論後所得

到的三維空間圖

表 41 模糊控制規則表

Dspeed

vl l m h vh

l H M L VL VL

m VH H M L VL sspeed

h VH VH H M L

圖 48 推論後的三維空間圖

42

423 模糊控制器之軟體設計流程

Start 外部中斷副程式

ADCWR = 0 ADCWR = 1

〈令AD開始轉換〉

檢查鍵值以得到對應的歸屬函數

取得目前轉速與

轉速誤差

Fuzzy Rules決策

得到輸出訊號

Delay 10ms

ADC = 0 讀取AD值 ADCRD = 0

將AD值換算成轉速

ADCWR = 0 ADCWR = 1

〈AD開始轉換〉

返回主程式

致能外部中斷

圖 49 Fuzzy Controller 程式流程圖

當控制器一開始動作時便先執行AD轉換的工作當AD轉換完成時其

INTR的接腳便會觸發8051的外部中斷INTR0於是程式便發生外部中斷執行

外部中斷副程式的指令

43

在外部中斷副程式中AD將ㄧ直進行轉換與讀取的工作同時並將轉換後

的值直接換算成目前轉速與轉速誤差以供模糊控制器使用換算目前encoder

的頻率其公式為

160-V2000 times=頻率 〈4-1〉

式4-1之公式是根據表31所導出來的其中V為encoder之頻率轉成電壓之值

又假設所讀取的AD轉換值為value因為

AD的解析度 = bit256

5V+ = 511 ( Vbit ) 〈4-2〉

故value值與電壓V之關係為

511 value V times= 〈4-3〉

所以encoder之頻率與value值的關係為

頻率= 2000times ⎟⎠⎞

⎜⎝⎛ times

511 value - 160 〈4-4〉

故目前轉速為

sspeed = ( )rpm 60 200

times頻率 〈4-5〉

另ㄧ方面在主程式中程式會先去檢查鍵值也就等於檢查輸入指令以

找出符合使用的歸屬函數並將AD所獲得的轉速對應到歸屬函數中然後執行

決策判斷即進入規則庫中尋找出適當的決策判斷最後將此決策送入PWM程

式裡進行脈寬長度的調整使馬達在合理的要求下達到理想的轉速控制不會

因為外在環境的影響而使馬達轉速受到干擾

43 LCD 顯示轉速

此專題最後再增加一LCD顯示幕以顯示目前的轉速否則在程式設計完成

後人卻因無法以肉眼得知目前轉速而不能肯定馬達轉速是否有達到控制的目

標因此增加一顯示幕LCD是有必要的不僅隨時得知目前的轉速還能知道

44

設計出來的軟體其控制性是否夠好夠穩定

431 LCD 顯示幕之軟體流程

Start

設定LCD模組的初始狀態

設定外部中斷INTR0

與Timer0

設定TH0 = (65536 ndash 5000) 256 TL0 = (65536 ndash 5000)256

令ADCWR = 0 ADCWR = 1 AD開始轉換

等待中斷

外部中斷副程式

ADCRD = 0 讀取AD值 ADCRD = 1

將AD值換算成速度

ADCWR = 0 ADCWR = 1 AD開始轉換

Timer0中斷副程式

顯示LCD第一行

ldquoMotor Speed =

顯示LCD第二行ldquoxxxxxxx rpm其中 xxxxxx為外部中斷副程式所換算出的轉速

重設TH0與TL0

返回主程式返回主程式

圖 410 LCD 顯示幕之程式流程圖

此程式主要由兩個部分完成一為外部中斷副程式另ㄧ為 Timer0 中斷副

程式當主程式完成外部與 Timer0 兩個中斷的設定後隨即命令 AD 開始轉換

之後便一直停在 while〈1〉的迴圈裡不做任何動作而由兩個中斷副程式來完

成整個轉換與顯示的工作

45

外部中斷副程式主要負責 AD 的轉換讀取與轉速換算的工作AD 第一

次的轉換由主程式來下達命令當轉換完成後AD 的 INTR 接腳將觸發外部中

斷〈INTR0〉副程式此時程式便進入外部中斷副程式執行讀取 AD 值與轉速

換算的工作當這些工作完成時外部中斷副程式再次下達 AD 開始轉換的命

令而離開中斷副程式當 AD 再次轉換完成時又將再次執行中斷副程式

如此週而復始中斷副程式將ㄧ直進行讀取換算與轉換的工作

而 Timer0 中斷副程式主要負責 LCD 顯示之工作當主程式所設定的計時時

間計數完時程式便進入 Timer0 中斷副程式一旦進入 Timer0 中斷副程式程

式將執行 LCD 的顯示然後再重設 Timer0 的計數時間Timer0 將重新計數當

計數完時程式又將再度進入 Timer0 中斷副程式執行因為程式中並無清除

Timer0 的中斷致能故 Timer0 中斷副程式和外部中斷副程式ㄧ樣週而復始的

執行其副程式的工作

46

第五章 結論

本計劃主旨為具模糊控制理論與雙脈寬調變法之直流馬達驅動電路設計主

要是針對傳統電路設計之缺點提出改良之方法以TPWM取代PWM電路以模

糊理論基礎設計之控制器替代傳統PID控制器

TPWM轉速控制優於PWM之處在於

1 TPWM只需使用單電源即可達到正轉和逆轉的轉速控制而PWM必須

加上逆向開關或是雙電源才能使馬達產生正轉和逆轉

2 TPWM可控制馬達處於停止狀態無論在正向或逆向加上負載皆無法使

馬達產生轉動

3 馬達消耗定額功率輸出轉矩為額定值

4 馬達由停止到某定轉速時反應時間較快

模糊控制器優於PID控制器

1 不須導出繁雜的數學模型

2 適用於非線性系統

3 強健性與容錯性較高

本專題至此雖說大致的目標都已達到但是此系統仍然有許多不完美而需要

改進的地方例如在實驗過程中發現整個轉速的控制在回授上其反應時間

有點慢探討其原因有可能是控制器之程式上的問題

1 因為使用C語言撰寫程式故其執行速度較慢

2 程式可能寫的太累贅

3 模糊控制規則庫建立不良

若想改善這些問題可以嘗試著將C語言改為組合語言來撰寫並盡量減少

47

不必要的指令相信此動作一定能大大提昇程式的執行速度其次就是多做測

試利用測試中所學到的經驗來幫助模糊控制規則庫的改寫同時也能從測試中

發現更多的問題若是都能對問題加以一一解決的話相信必定能將此控制系統

做的更盡善盡美

48

參考文獻

﹝1﹞ 李適中直流馬達速度控制伺服控制〈基礎篇〉全華科技圖書股份有

限公司民 74

﹝2﹞ 廖錦文ldquo直流電動機之雙脈寬調變是〈TPWM〉驅動電路研究電

子技術月刊第 69 期pp94-1021992

﹝3﹞ 楊英魁孫宗瀛鄭魁香林建德蔣旭堂模糊控制理論與技術全華

科技圖書股份有限公司民 85

﹝4﹞ 林敦煌陳憬德直流馬達定位及轉速的模糊控制逢甲大學自動控制工

程學系學士論文民 87

﹝5﹞ LAZadehldquo Fuzzy Sets Information and Control Vol8 pp338-353

1965

﹝6﹞ EHMamdani and SAsslianldquo A fuzzy logic controller for a dynamic

plant Internation Journal of Man-Machine Studies Vol7 pp1-13 1975

﹝7﹞ 孫宗瀛楊英魁Fuzzy 控制理論實作與應用全華科技圖書股份有

限公司民 83 年

﹝8﹞ 許中平黃煌嘉直流電動機控制電路設計全華科技圖書股份有限公司

民 75

﹝9﹞ 盧明智黃敏祥OP Amp 應用+實驗模擬全華科技圖書股份有限公司

民 83

﹝10﹞陳文耀電動機控制工程復文書局2003

﹝11﹞許中平林全福電動機運轉控制技術全華科技圖書股份有限公司民

77

﹝12﹞楊明豐8051 單晶片 C 語言設計實務碁峯資訊2003 年

﹝13﹞蔡朝洋單晶片微電腦 80518951 原理與應用全華科技圖書股份有限公

司民 91

49

﹝14﹞王文俊認識 Fuzzy全華科技圖書股份有限公司民 90

50

附錄 A 專題硬體展示圖

圖 A-1 硬體整體圖

圖 A-2 硬體整體鳥瞰圖

51

圖 A-3 硬體側視圖

圖 A-4 操作與顯示面板

圖 A-5 間距脈波電路與 FV 電路

52

圖 A-6 橋型驅動功率放大電路

圖 A-7 操作與控制面板

53

附錄 B PWM 與模糊控制之程式

include reg51h include stdioh sbit ADCRD = P3^1 設定 RD 控制線接腳為 P31 sbit ADCWR = P3^3 設定 WR 控制線接腳為 P33 sbit P2_0 = 0xA0 接腳定義 sbit P2_1 = 0xA1 接腳定義 sbit P3_0 = 0xB0 接腳定義 sbit P3_1 = 0xB1 接腳定義 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P3_6 = 0xB6 接腳定義 void KeyStatus(void) 函數原型宣告 void feedback(void) 函數原型宣告 void compute_grade(void) 函數原型宣告 void delay1ms(int count) 函數原型宣告 void convert() 函數原型宣告 void condition() 函數原型宣告 void CW(void) 函數原型宣告 int j i 對應 PWM 的寬度 unsigned int temp 所設計的計時器時間 int sample = 1000 取樣率設定消除顯示值跳動 long int value r1 讀取 ADC0804 數位資料 long int set n condition select long int r grade_reg[2] grade[15] error1 error2 long int a1 b1 I long int membership[5][3]membership1[3][3] 定義歸屬函數 long int membership2[3][3] = -10-50-5050510 long int error[2] int Rule[15][3] = 113213313 定義判斷規則庫 212223323 311232333 411241342 511251351

54

main() 主程式 j = PWM = 110 設定 PWM 初始值 IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x00 設定計時器 0 工作於模式 0 temp=8192-j4 設定計時器 0 初值 TH0 = temp 32 TL0 = temp 32 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 P3_4 = 1 P3_5 = 0 P3_6 = 0 ADCWR = 0 令 ADC0804 的 WR = 0 ADCWR = 1 令 ADC0804 的 WR = 1 while (1) KeyStatus() 檢查鍵值 void KeyStatus(void) 檢查鍵值並給對應的 PWM 值 char KeyScan(void) 按鍵掃描函數宣告 unsigned char KeyStatus unsigned char Key = 0 KeyStatus=KeyScan() 呼叫按鍵掃描函數 if (KeyStatus = 0) 已有按鍵輸入 Key = KeyStatus Key = 鍵值 if (Key == 0x01) 假如輸入為按鍵 1 i = 110 PWM 為 110us j = i P3_4 = 1 LED 亮第一顆〈表馬達停止〉 P3_5 = 0 P3_6 = 0

55

else if (Key == 0x02 ) 假如輸入為按鍵 2 i = 140 PWM 為 140us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x04 ) 假如輸入為按鍵 3 i = 180 PWM 為 180us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x08 ) 假如輸入為按鍵 4 i = 80 PWM 為 80us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 else if (Key == 0x10 ) 假如輸入為按鍵 5 i = 40 PWM 為 40us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 PWM = j delay1ms(10) 呼叫延遲函數 feedback() 模糊控制判斷

56

void To_int(void) interrupt 1 Timer0 中斷函數 if (P3_0 == 0) 假如 PWM 輸出為 Low P3_0 = 1 變更 PWM 輸出為 High temp=8192-j4 設定 High 的時間 else 若 PWM 輸出為 High P3_0 = 0 變更 PWM 輸出為 Low temp=8192-880+j4 設定 Low 的時間 TH0 = temp 32 Timer0 的計時時間 TL0 = temp 32 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 char KeyScan(void) 檢查鍵值 char KeyStatus 按鍵狀態 P0=0xff 設定 P0 為輸入模式 KeyStatus=~P0 讀取按鍵狀態 return(KeyStatus) 將鍵值送回程式 void feedback(void) 模糊判斷 void Fuzzycontroller() 函數原型宣告 void condition1() 函數原型宣告

57

void condition2() 函數原型宣告 error1 = ((value)40-160)03 輸入變數 1 delay10ms(10) 延遲 10ms error2 = ((value)40-160)03 輸入變數 2 if (key == 0x01 ) 當按鍵 1找出對應的歸屬函數 並做出模糊控制判斷

int membership[5][3]= -100-60-30-60-300-30030030603060100

int membership1[3][3]=-100-500-50050050100 Fuzzycontroller() condition() if (key == 0x02 ) 當按鍵 2找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

05010050100150100150200150200250200250300 int membership1[3][3]=07515075150225150225300 Fuzzycontroller() condition() else if (key == 0x04) 當按鍵 3找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

200320400300400500400500600500600700600700800 int membership1[3][3]=220370520370520670520670820 Fuzzycontroller() condition() else if (key == 0x08) 當按鍵 4找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

02550255010050100200100200300200300400 int membership1[3][3]=05010050100250100250400 Fuzzycontroller() condition()

58

else if (key == 0x10) 當按鍵 5找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

150250350250350450350450550450550650550650750 int membership1[3][3]=150300450300450600450600750 Fuzzycontroller() condition2() void Fuzzycontroller() 模糊控制判斷 void compute_grade() 函數原型宣告 void compute_grade1() 函數原型宣告 a1 = 0 b1 = 001 I = 0 for (n=0 nlt=14 n++) r = error1 set = Rule[n][0]-1 compute_grade() 計算輸入變數 1 與

模糊程度的歸屬函數 condition = 1 r = error2 set = Rule[n][1]-1 compute_grade1() 計算輸入變數 2 與 模糊程度的歸屬函數 grade[n] = MIN(grade_reg[0] grade_reg[1]) a1 = a1 + (grade[n]membership2[Rule[n][2]-1][1]) b1 = b1 + grade[n] I = a1 b1 得到模糊控制判斷的結果 void compute_grade() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership[set][0]) || (r gt membership[set][2])) 當輸入變數不在 歸屬函數內

59

grade_reg[condition] = 0 else if ((r gt membership[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership[set][2]-r) (membership[set][2] - membership[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership[set][0]) (membership[set][1] - membership[set][0]) void compute_grade1() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership1[set][0]) || (r gt membership1[set][2])) 當輸入變數不在 歸屬函數內 grade_reg[condition] = 0 else if ((r gt membership1[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership1[set][2]-r) (membership1[set][2]-membership1[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership1[set][0]) (membership1[set][1]-membership1[set][0])

60

void condition() P2_0 = 1 設定 P20 為輸入模式 P2_1 = 1 設定 P21 為輸入模式 if ( (P2_0 == 1) ampamp (P2_1 == 0)) 當馬達為正轉時 if ( I gt 0 ) 若模糊判斷結果為正 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 若模糊判斷結果為零 PWM = PWM + 0 PWM 寬度不變 if ( I lt 0 ) 若模糊控制結果小於零 PWM = PWM + 1 PWM 寬度加 1 else if ( (P2_0 == 0) ampamp (P2_1 == 1) ) 若馬達為反轉 if ( I lt 0 ) 模糊控制小於零 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 模糊控制等於零 PWM = PWM + 0 PWM 寬度不變 if ( I gt 0 ) 模糊控制大於零 PWM = PWM + 1 PWM 寬度加 1 CW() 判斷 PWM 寬度上下限

61

void CW() 判斷 PWM 寬度上下限 if ( PWM gt= 215 ) 若 PWM 寬度 gt= 最大寬度 j = 215 PWM 寬度維持於 215us if ( PWM lt= 5 ) 若 PWM 寬度 lt= 最小寬度 j = 5 PWM 寬度維持在 5us if ( PWM gt 5 ampamp PWM lt 215 ) PWM 寬度介於最大與最小間 j = PWM PWM 依模糊控制判斷結果增減 void delay1ms(int count) 延遲 1ms int x y for ( x = 0 x lt count x++ ) for ( y = 0 y lt 122 y++ ) void convert() 數位資料換算成馬達轉速 r1 = ((value)40)-160

62

附錄 C LCD 顯示之程式

includereg51h 含 8051 所有暫存器宣告 include mathh define RS P3_5 LCD 指令資料選擇控制 define RW P3_4 LCD 讀寫控制腳 define Enable P3_3 LCD 致能接腳 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P0_0 = 0x80 接腳定義 sbit P0_1 = 0x81 接腳定義 sbit P0_2 = 0x82 接腳定義 sbit P0_3 = 0x83 接腳定義 sbit P0_4 = 0x84 接腳定義 sbit P0_5 = 0x85 接腳定義 sbit P0_6 = 0x86 接腳定義 sbit ADCRD = P3^7 設定 RD 控制線接腳為 P37 sbit ADCWR = P3^6 設定 WR 控制線接腳為 P36 void delay(void) 函數原型宣告 void delay10ms(int count) 函數原型宣告 void display(void) 函數原型宣告 void InitialLCD(void) 函數原型宣告 void WriteIns(char) 函數原型宣告 void WriteData(char) 函數原型宣告 void WriteString(charchar) 函數原型宣告 void CheckBusy(void) 函數原型宣告 void convert(void) 函數原型宣告 char MSG0[] = Motor Speed = 定義字串 MSG0 char MSG2[] = rpm 定義字串 MSG2 unsigned char MSG1[8]=0000000 定義字串 MSG1 unsigned long int value 讀取 ADC0804 數位資料 int sample = 1000 取樣率設定消除顯示值跳動 long int rpm

63

main() 主程式 InitialLCD() 初始化 LCD IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x01 設定計時器 0 工作於模式 1 TH0 = (65536-5000)256 設定計時器 0 初值 TL0 = (65536-5000)256 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 while(1) 等待中斷 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 while (--sample == 0) 取樣率減 1 sample = 1000 重設取樣率 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 void T0_int(void) interrupt 1 LCD 顯示動態掃描 display() 動態掃描顯示 TH0 = (65536-65535)256 重設計時初值 TL0 = (65536-65535)256

64

void InitialLCD(void) 設定 LCD 模組初始狀態 delay() 延遲函數 WriteIns(0x38) 設定 LCD 模組為 WriteIns(0x38) 2 行顯示 WriteIns(0x38) 8 位元介面 WriteIns(0x38) 5x7 點字型 WriteIns(0x08) 關閉顯示器 WriteIns(0x01) 清除 LCD 螢幕 WriteIns(0x0c) 令顯示器 ON但游標不顯示 WriteIns(0x06) 令 LCD 模組每接收到 1Byte 資料 AC 值自動加 1 void display() 掃描顯示 WriteIns(0x80) 設定 LCD 座標 WriteString(13MSG0) 將字串 MSG0 寫入 LCD 中 WriteIns(0xc0) 設定 LCD 座標 WriteString(8MSG1) 將字串 MSG1 寫入 LCD 中 WriteIns(0xc8) 設定 LCD 座標 WriteString(4MSG2) 將字串 MSG2 寫入 LCD 中 void convert(void) 換算轉速 long int freq freq = ((value)4000) - 16000 數位資料換成頻率公式 rpm = freq3 頻率換算轉速公式 MSG1[0] = (rpm1000000)+0x30 將結果存入字串 MSG1 中 MSG1[1] = ((rpm1000000)100000)+0x30 MSG1[2] = ((rpm100000)10000)+0x30 MSG1[3] = ((rpm10000)1000)+0x30 MSG1[4] = 0x2e MSG1[5] = ((rpm1000)100)+0x30 MSG1[6] = ((rpm100)10)+0x30 MSG1[7] = rpm10+0x30

65

void WriteIns(char instruction) 寫命令至 LCD 中 RS = 0 選擇指令暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = instruction 輸出命令至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteData(char i) 寫資料至 LCD 中 RS = 1 選擇資料暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = i 輸出資料至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteString(countMSG) 寫字串至 LCD 中 char count 字串長度 char MSG[] 字串資料 char i 定義位元組變數 for(i=0 iltcount i++) count 個位元組 WriteData(MSG[i]) 寫入一位元組的資料至 LCD 中 void CheckBusy(void) char i=0x80 檢查忙碌旗標 while(iamp0x80) 忙錄旗標 BF = 1 RS = 0 選擇指令暫存器 RW = 1 讀取 Enable = 1 致能 LCD i = P2 讀取 LCD 指令暫存器內的資料

66

Enable = 0 除能 LCD delay() 延遲函數 void delay() 延遲 5ms int i for(i=0 ilt250 i++)

  • 畢業專題封面pdf
  • File0004pdf
  • 最終版pdfpdf
Page 16: Based on Fuzzy Control Theorem and TPWM Method for DC ... · 使吾人想設計一模糊控制器來做為馬達轉速的閉迴路控制,以解決非線性系統的 問題。除此之外,flcs

7

213 歸屬函數

歸屬函數〈membership function〉為 0 到 1 之間的數值吾們可以藉由歸屬

函數來描述 Fuzzy 集合的特質它是 Fuzzy 理論的最基本觀念透過歸屬函數我

們才能對 Fuzzy 集合進行量化也才可能利用精確的數學方法分析處理模糊性資

歸屬函數在 Fuzzy 控制的應用範疇內都要具備凸〈convex〉及正規〈normal〉

等基本特性〈如圖 21〉歸屬度函數的定義可以分為數值及函數兩種數值定義

方式又稱為離散化歸屬函數它是直接給定有限 Fuzzy 集合內每個元素的歸屬

度並以向量的形式表現出來函數定義方式又稱為連續化歸屬函數它是以不

同形式的函數來描述 Fuzzy 集合

圖 211 正規且凸模糊集合

1

0 圖 212 正規非凸的模糊集合

8

一個模糊集合的歸屬函數可以有許多方式但是目前最廣泛使用的有吊鐘

型三角型梯型等歸屬函數

〈1〉吊鐘形歸屬函數

吊鐘形歸屬函數定義如下

μA=bell(xabc)= b

acx 2

1

1minus

+

〈21〉

圖 22 吊鐘型歸屬函數

〈2〉三角形歸屬函數

三角形歸屬函數可由三個參數(abc)來加以決定

=Aμ trangle(xabc)

⎪⎪⎪

⎪⎪⎪

ltleminusminus

ltleminusminus

=

other

cxbcbcx

bxaabax

0

〈22〉

其中a為歸屬函數左邊界b為歸屬函數中心值c為歸屬函數右邊界

9

圖 23 三角型歸屬函數

〈3〉梯型歸屬函數

梯型歸屬函數可由四個參數加以決定

=Aμ trapezoid(xabcd)

⎪⎪⎪⎪

⎪⎪⎪⎪

leleminusminus

ltle

ltleminusminus

=

other

dxcdcdx

cxb

bxaabax

0

1 〈23〉

圖 24 梯型歸屬函數

10

214 模糊推論與模糊規則

模糊推論〈fuzzy inference〉是根據知識庫保存的規則(rule)和給予的事實

推導出新的結論與傳統推論不同的地方是Fuzzy推論不只可以處理明確命題也

可以處理Fuzzy命題Fuzzy推論是依據近似推理〈approximate reasoning〉的概念

發展出來的比傳統推論的嚴正推理〈exact reasoning〉更合理也更具彈性近

似推理是兩種嚴正推理General Modus Ponens〈簡稱GMP〉及Genera Modus

Tollens〈簡稱GMT〉的一般化此原理是從傳統二值邏輯中的肯定律〈modus

ponens〉和否定律〈modus tollens〉推廣而來其中GMP又可稱為前向推理而

GMT則可稱為反向推理

〈1〉 GMP〈General Modus Ponens〉

規則IF x is A THEN y is B

事實x is Arsquo

結論y ix Brsquo 〈24〉

〈2〉 GMT〈General Modus Tollens〉

規則IF x is A THEN y is B

事實y is Brsquo

結論x is Arsquo 〈25〉

上式中IF x is A THEN y is B即為模糊規則〈fuzzy rules〉AArsquoBBrsquo

分別是定義在論域X及Y的模糊集合xy代表輸入變數及輸出變數的語言變數

一般來說「x is A」稱為前件部〈antecedent〉而「Y is B」則稱為後件部

〈consequence〉Fuzzy知識庫〈Fuzzy Knowledge Base簡稱FKB〉即由這些模

糊規則所組成的規則庫〈rule base〉和存放描述領域知識的Fuzzy變數及語言變數

的資料庫〈data base〉所組成所以FKB是用來描述受控對象所涉及的領域知

11

識和操控目標的一些定性及定量的資訊模糊知識庫和模糊推論是構成Fuzzy規

則系統核心的兩個重要部門﹝7﹞

模糊推論是模糊系統的核心根據知識庫的模糊法則進行模糊理論的合成運

算來模擬人類的思考決策模式一般來說規則的建立是採取十分主觀直覺的

方式依據相關領域專家的經驗與知識透過詢問進而將其知識經驗歸納條列出

重點再轉換成模糊規則的形式表現出來但是並非所有的專家或操作員都能

將自身的經驗知識以言詞的方式充分的表達出來且未必能整理成條列的模糊規

則所以知識規則的萃取工作往往是在建構模糊系統時最常遭遇到的困難之

215 模糊控制器

模糊控制是智慧型控制〈intelligent control〉系統的一種典型其基本特點

是不完全依賴受控對象的數學模型主要是利用人的操作經驗知識和推理技

術以及控制系統的某些訊息和性能得出對應的控制動作模糊控制是以並行

〈parallel〉方式處理規則的推理工作〈如圖25〉其近似推理會包容每個對操

控系統有貢獻的規則即使某些貢獻程度很小的規則也不會忽略

圖 25 模糊控制系統的構造

12

一個控制器的輸入通常是確定數值而非模糊輸出也是如此才能對被控對象

發生作用但是模糊邏輯控制器〈Fuzzy Logic Controller簡稱FLC〉則是以語

言化的控制規則為主體為了能夠把輸入的確定值與語言化之後的控制規則結

合必須把輸入的確定值模糊化〈fuzzification〉以便對應到FLC語言變數的論

域範圍中同樣的經過規則庫推理出來的結果是對應到輸出語言變數的論域

中所以也必須對其做解模糊化〈defuzzification〉的工作才能達成實際的控制

目標

一般模糊控制器的架構包含了五個主要部分定義變數模糊化知識庫

模糊推論及解模糊化

〈1〉 定義輸入及輸出變數

決定程序被觀察的狀況及考慮控制的動作輸入變數可以是擷取

自受控系統的觀測量也可以是推導出來的資料輸出變數則為操控

受控系統的操作量例如在一般控制問題上輸入變數通常為輸出

誤差e與輸出誤差之變化率e而控制變數則為下一個狀態之輸入

u其中eeu統稱為模糊變數

〈2〉 模糊化

將量測值轉換為語言變數的過程將外界所輸入的確定數值經由

一比例映射傳送到輸入變數所對應的模糊論域然後再利用模糊化

函數將此輸入資料轉換成適當的口語值以供模糊運算使用此口語

化變數稱之為模糊子集合

〈3〉 知識庫

模糊知識庫是模糊控制的依據由它來定義所有使用到的語言控

制法則及相關各項參數知識庫可說是整個控制系統資料核心其包

含了兩個部分資料庫〈data base〉與規則庫〈rules base〉

1 資料庫

提供處理模糊數據之相關定義資料庫所存放的資料是關

13

於如何將明確的資料轉換成模糊數值而資料的存放方式是以

歸屬函數表示該選用哪一種歸屬函數依實際的需要選定

以三角形歸屬函數最常被使用因其運算最為容易且又能充分

的表達模糊概念

2 規則庫

利用語言化的條件式控制規則描述控制目標和策略通常

控制規則可以由操控人員的經驗或專家的知識推導出來多個

控制規則所組成的集合就是規則庫

〈4〉 模糊推論

模糊推論為模糊控制最重要的核心其最主要的工作就是做實際

的決策過程處理模糊推論具有模擬人類做決策判斷的能力其基本

理論就是根據人類特有的近似推理方式如之前已說明的GMP和

GMTGMP為前向推理而GMT為逆向推理因為模糊推論為前向

運算因此GMP非常適合使用為模糊控制的推論機構

〈5〉 解模糊化

將推論完成所得到的模糊輸出量轉換成實際的明確數值以便和

外界溝通解模糊化的方法有很多例最大歸屬度法重心法高

度法面積法等

圖 26 模糊系統的基本架構

14

22 直流馬達數學模型

圖27為直流馬達等效電路簡圖其中

iV = 輸入電壓 ai = 電樞電流

zR = 電樞電阻 gT = 轉矩

aL = 電樞電感 bE = 反電動勢

φ = 空氣隙磁通量 ω = 轉子角速度

B = 黏滯摩擦係數 J = 轉動慣量

圖 27 直流馬達等效電路簡圖

由克希荷夫電壓定律知

( ) ( ) ( )tEdt

tdiLtiRV b

aaaai ++= 〈26〉

由於反電動勢 bE 與轉軸的角速度 ( )tω 及空氣隙磁通量φ之乘積成正比即

( ) ( ) ( )tKtKtE emb ωφω == 〈27〉

15

又轉矩的平衡方程式為

( ) ( ) ( )dt

tdJtBtTgωω += 〈28〉

且馬達轉矩 gT 與電樞電流 ( )tia 及空氣隙磁通量φ乘積成正比即

( ) ( ) ( )tiKtiKtT ataag == φ 〈29〉

取〈26〉~〈29〉式之拉氏變換得

( ) ( ) ( ) ( )sEssILsIRsV baaaai ++= 〈210〉

( ) ( )sKsE eb Ω= 〈211〉

( ) ( ) ( )sJssBsTg Ω+Ω= 〈212〉

( ) ( )sIKsT atg = 〈213〉

則馬達輸入電流與轉速為

( ) ( ) ( )( ) ( )( )

sR

sEsV

sLRsEsV

sIe

a

bi

aa

bia τ+

minus

=+minus

=1

〈214〉

( ) ( ) ( )

sB

sT

sJBsT

sm

gg

τ+=

+=Ω

1 〈215〉

其中a

ae R

L=τ 為電樞電流的電氣時間常數 BJ

m =τ 為馬達轉動的機械時間

常數

直流馬達轉速對輸入電壓的轉移函數 ( )sG 為

( ) ( )( ) ( )( ) etaa

t

i KKBJsRsLK

sVssG

+++=

Ω=

( )( ) etmea

t

KKssBRK

+++=

ττ 11 〈216〉

16

在一般情況電樞電感很小所以 eτ 可以忽略不計因此上式成為一階落後

方程式

( ) ( )( ) ( ) m

m

etma

t

i sTK

KKsBRK

sVssG

+=

++=

Ω=

11 τ 〈217〉

其中

eta

mam KKBR

BRT

+=

τ

eta

tm KKBR

KK

+=

所以直流馬達數學模式可以以圖28表之﹝8﹞

圖 28 直流馬達數學模式方塊圖

17

第三章 系統功能分析與製作規劃

31 專題製作流程

如圖 31 所示本專題主要分為兩條路徑進行一為硬體另一則為軟體程

式撰寫本章著重硬體的規劃設計軟體則在第四章中介紹在完成 AB 信號

產生電路驅動功率放大電路與間距脈波產生電路設計與製作後須先接上馬達

做一連串的測試〈此時系統並無回受控制〉測試間距脈波是否太長或太短硬

體電路是否有缺失hellip等等另一方面也著手撰寫模糊控制程式並將其與硬體電

路結合最後做閉迴路系統的整合測試若發現系統的運作結果並不如預期

則需分別從硬體與軟體兩方面去改良

直流馬達轉速之模糊控制

文獻蒐集與整理

AB信號產生電路設計與製作

驅動功率放大電路設計與製作

間距脈波產生電路設計與製作

測試間距脈波是否太長或太短

系統測試測試馬達轉速是否

達到控制目的

結束與論文寫作

重新設計間距脈波長度

Yes

No

系統整合與修正

輸出信號與Fuzzy控制器之連結設計

規劃輸出與輸入歸屬函數

規劃模糊知識庫

撰寫主程式並加入模糊知識庫

程式編譯及連結

軟硬體整合測試馬達是否運作

程式調整及最佳化

No

YesYes

No

圖 31 專題製作流程圖

18

32 雙脈寬調變法之直流馬達驅動電路設計

本專題製作的雙脈寬調變法之直流馬達驅動電路設計大致可以分為二大部

分第一雙脈寬調變法之電路設計第二橋型驅動功率放大電路

雙脈寬調變〈Two Pulse Width Modulation簡稱TPWM〉之電路設計主要

是先製作一脈寬調變〈Pulse Width Modulation簡稱PWM〉波形然後再將此

波形各別經由一緩衝器〈buffer〉和反向器〈inverter〉則可產生AB驅動信號

脈波此即為TPWM

321 脈寬調變電路

如圖32先利用兩顆op產生三角波電路再利用一個比較器比較三角波

和誤差值之大小

150k

1M

20k

+12V

-12V

+12V

-12V10k

+12V

-12V

10k

+12V

-12V-

+-

+

-

+ PWMLM324

LM324

LM324

2200pF

圖 32 脈寬調變電路

〈1〉 三角波產生電路

三角波產生電路通常至少需要兩個運算放大器其電路如圖33OP1

為一個反相積分器OP2為一個史密特磁滯比較器將OP2的輸出方波經

19

OP1反相積分以後得到Vo1三角波此三角波又同時加到OP2控制其狀

態的改變

當方波產生器的輸出是正的則三角波產生器的輸出是斜向負相似

地當方波產生器的輸出是負則三角波產生器的輸出是斜向正這個動

作將產生三角波的輸出同時也輸出方波﹝9﹞

+VCC

-VCC

-

+

R1

R2

R3

+VCC

-VCC

-

+

OP1

OP2

Vo2Vo1

圖 33 三角波產生電路

對OP2而言是磁滯比較必須先找到OP2的 THV 和 TLV

232

21

32

3oo v

RRR

vRR

Rv

++

+=+ 〈31〉

當 0=+v 時

23

21 oo v

RR

v minus= 〈32〉

表要達到OP2的 0=+v 必須有這麼大的 1ov

當 12 sato Ev = 時

TLsato VERR

v =minus= 13

21 〈33〉

當 22 sato Ev minus= 時

THsato VERR

v =+= 23

21 〈34〉

20

對OP1而言是反相積分器 2ov 為其輸入 1ov 為其輸出則

tCIt

Rv

Ct

CRv

dtvCR

v oooo

11

2

11

22

111

11minus=minus=minus=minus= int 〈35〉

因為

1

2

Rvv

I o minusminus= 0=minusv 〈因為虛接地〉 〈36〉

所以

1

2

Rv

I o= 〈37〉

又因運算放大器的輸入阻抗非常大則流經 1C 的電流也為 I 相當於以定

電流對電容C 充電

當 12 sato Ev = 時 1ov 為下降斜波

tR

EC

v sato

1

1

11

1minus= 〈38〉

當 22 sato Ev minus= 時 1ov 上升斜波

( )

tRE

Cv sat

o1

2

11

1 minusminus= 〈39〉

由此可知三角波的上升與下降斜波乃因 1C 的充電與放電且時間

常數為 11CR

三角波週期分析如下

1 上升斜波的時間 1T

tCR

vv o

o1

1

21 minus= 11

2

1 CRvv

to

ominus=

1Tt = TLTHo VVv minus=1 22 sato Ev =

11111

21

sat

TLTH

sat

TLTH

EVV

CRCRE

VVT

minus=

minusminus= 〈310〉

2 下降斜波的時間 2T

tCR

vv o

o1

1

21 minus= 11

2

1 CRvv

to

ominus=

21

2Tt = THTLo VVv minus=1 12 sato Ev =

1

11111

1sat

TLTH

sat

THTL

EVV

CRCRE

VVT

minus=

minusminus= 〈311〉

3 週期 21 TTT +=

若 1satE = 2satE = satE 且3

22RR

VV TLTH =minus satE

3

2114

RR

CRT=

若R3 = nR2

則nCR

T 114=

114 CR

nf = 〈312〉

《實驗結果》

必須注意的是三角波的頻率太低將導致馬達的轉動產生脈動現象

故將工作頻率設計在1kHz以上

Ω= k1501R Ω= k102R

Ω= k203R pFC 22001 =

所得到的三角波頻率為

15kHz10220010001504

00010100020

f 12- =timestimestimestimes

timestimes

=

圖 34 三角波輸出波形

22

〈2〉 脈寬調變電路〈PWM〉

+12V

-12V

10k

+12V

-12V -

+ PWM輸出LM324三角波輸入

圖 35 脈寬調變電路

PWM系統往往連接至直流電源供應放大器的工作是以固定的頻率開

閉直流供應電壓其激發角是可以調整的因此得到波寬可調的輸出

將固定頻率的三角波與反向輸入的電壓做比較便可輸出一脈寬〈見圖

36〉反向電阻值的不同將導致反向輸入電壓不同故其輸出為一可調但

頻率固定的脈寬也正因為如此故稱為脈寬調變〈PWM〉由於輸出的

dutycycle不同故馬達將接收到不同的平均電壓因而可以藉由PWM控制

馬達的轉速

反相輸入電壓

PWM

圖 36 三角波與反相輸入電壓比較

23

PWM的優點在於馬達驅動電路的電晶體之控制信號改以脈波列來控

制使電晶體操作成類似開關的動作不是完全導通就是完全截止故電晶

體不是一直操作於作用區所以其功率消耗不大整體效率較高

《實驗結果》

圖 37 PWM 輸出波形

322 橋型驅動功率放大電路

如圖38所示主要由四個功率電晶體組成利用不同的電晶體對使直流

馬達做正逆轉控制當Q5Q8導通使馬達正轉當Q6Q7導通馬達則逆

轉電路中的電晶體扮演開關的作用

此種電路簡單只要一組直流電源供應且電晶體分擔了部份的電壓保護

電晶體迅速工作於截止與飽和狀態之間故沒有功率散逸損失之虞

但是在設計時切勿使Q5Q6同時導通以免燒毀電路上之元件因為在

AB兩脈波短暫的交變時間內由於電晶體本身之最小延遲時間有可能使Q5

Q6同時ON與Q7Q8在很短時間同時ON因此在15kHz交變下容易燒毀功

率電晶體

因此設計一間距脈波電路主要之功用使Q5Q6和Q7Q8均不同時導通

24

以拉長AB兩者交換時間

M

20k

10k

20k

10k

+24V

A 信號 B 信號

2N3055 2N3055

2N2955 2N2955

1N40021N4002

C1815 C1815

C1815 C1815

Q5

Q8Q6

Q7

圖 38 橋型驅動功率放大電路

圖 39 橋型驅動功率放大電路實體圖

25

此外若考慮電晶體BE間的電壓則電路會出現約 plusmn 06V的不感帶〈ded

band〉即電晶體的 oV 對 inV 間的關係如圖3101假使 inV 電壓為正弦波則 oV 變

成如圖3102為了改善這種缺失吾人利用兩個二極體接在電路上如圖38

用來補償電晶體BE間的壓降﹝10﹞

約06V

Dead band

Vo

Vin

圖 3101 呈現不感帶的轉移函數

圖 3102 輸出電壓波形

26

323 間距脈波產生電路

RCext15

Cext14 74123

A3

B2

Q13

CLR1

Q4

7486100k

2200pF

10k

10000pF

+5V

間距脈波輸出

圖 311 間距脈波產生電路

間距脈波的產生方式是根據脈寬調變〈PWM〉後的訊號再經由積分電路的

電阻兩端取出且經由兩倍頻器〈74LS86〉檢示出PWM的正負緣脈波最後

再利用單穩態IC〈74LS123〉將檢出信號之脈寬拉長至01ms此即為間距脈波

74LS123有兩個輸入端子A及B分別為下降波緣輸入端子及上升波緣輸入端

子當輸入A之脈波由ldquoH變成ldquoL之瞬間Q輸出變為ldquoH其持續時間長

短由RC時間常數決定反之當輸入B之脈波由ldquoL變成ldquoH之瞬間Q輸出

變成ldquoH維持一定時間

74LS123的輸出脈波之寬度是由電阻及電容之時間常數所決定概略計算公

式如下

CR045T timestimes=

電容 C 必須大於 1000pF

27

《實驗結果》

R=24kΩ C=10000pF

所以得到間距脈波為

( )msec0110810000p24k045T cong=timestimes= μ

圖 312 間距脈波

研究經分析後發現

1 間距 T 愈大愈能確保電路之安全性愈有保護作用

2 間距 T 愈大相對的使驅動信號脈波減少愈多造成馬達旋轉扭力大

大減弱

3 適當的間距 T不但不會影響馬達的輸出轉矩而且兼具保護電路的

效果

33 編碼器

轉動編碼器不只可以作為轉速的感測也能做位置的感測又適合於數位處

理故被廣泛使用若就信號來看轉動編碼器可分為增量型與絕對型若以檢

測的方式來分可分為光學式和磁式兩種在本專題中所使用的編碼器為光學式

增量型編碼器﹝11﹞

光學式轉動編碼器的原理如圖 313在附有細縫轉盤的兩側分別裝置發光元

28

件與受光元件如果只有一組光電檢測元件則輸出信號就只有一相的脈波信

號此種裝置稱為脈波產生器圖 314 為增量型轉碼器的輸出信號它是利用

兩組光電元件所產生的脈波信號A 相和 B 相間有相位差正轉時 A 相領前 B

相逆轉時 B 相領前 A 相因此利用此兩相做檢測馬達為正轉或逆轉的工作

並利用 A 相或 B 相的頻率檢測出目前的轉速

吾人計算出編碼器每一轉可以產生約 200 個脈波故檢測 A 相或 B 相其頻

率為 N則轉速應為 60200

timesN

〈rpm〉

圖 313 光學式轉動編碼器的原理圖

圖 314 編碼器的輸出信號波形

29

34 LM2917 FV 電路設計

對 LM2907 而言磁滯比較器和電流汞是構成頻率對電壓轉換的基本架構

並且預留一個運算放大器及一個電晶體供各種不同的使用圖 315 為吾人所設

計的 FV 電路圖中 C1 用以抑制電流汞動作時所產生的漣波變化正常使用時

此電容應大於 10C若 C1 太大也將造成轉換速度下降

因為單晶片 8051 之輸入電壓最高為 5V故必須設計其馬達最高轉速頻率所

轉成的電壓必須在 5V 以內由於馬達轉速頻率範圍極大故吾人給予 LM2917

+12V 的電壓以擴大它可以轉換的電壓範圍並將所需維持在 5V 內

a1

14

b1

1

a1

13

b1

2

a1

12

b1

3

a1

11

b1

4

1

a1

10

b1

5

a1

8

b1

7

a1

9

b1

6

L2917

Encoder輸 入

1uF

+12V

FV輸出1000pF

45k 10kC1

C2

圖 315 FV 電路

30

《實驗結果》

根據統計結果每 50mV 相對於 100Hz如此一來吾人想得知馬達目前

的轉速只要將單晶片所接收到的電壓值經過換算即可得知目前 encoder 所量測

的頻率吾人知道 encoder 一圈可產生 200 個脈波故馬達的轉速便可經過下列

公式換算得知

轉速〈rpm〉 60200

times=f

其中 =f encoder 所量測到的頻率

表 31 頻率與轉換電壓之關係

頻率

(Hz) 1 2 3 4 5 6 7 8 9

電壓(V) 0006 0006 0007 0008 0009 0009 0009 0009 001

頻率

(Hz) 10 20 30 40 50 60 70 80 90

電壓(V) 008 009 010 010 011 011 012 012 013

頻率

(Hz) 100 200 300 400 500 600 700 800 900

電壓(V) 013 018 023 028 033 038 043 049 054

頻率

(Hz) 1000 2000 3000 4000 5000 6000 7000 8000 9000

電壓(V) 059 109 16 209 257 304 3508 4006 45

31

圖 316 頻率對電壓曲線

35 單晶片介面電路

單晶片介面包括了二大部分分別為單晶片 8051AD converter

〈1〉8051 單晶片

為本控制系統的核心一切動作皆經由它控制

〈2〉AD converter

將類比開關所送出來的類比訊號經由 ADC 0804 轉換成數位訊號傳送

到單晶片的輸入埠

351 AD 轉換

以單晶片 8051 控制 ADC0804則單晶片 8051 必須下達ldquo開始轉換rdquo的命令

給 ADC0804然後 ADC0804 就開始讀入類比輸入端的電壓在內部開始轉換

經過一段轉換時間後〈約 100μ s〉ADC0804 就將轉換完成的值放在其內部的三

態輸出栓鎖緩衝器裡然後將轉換完成輸出腳〈INTR〉降為 low以通知單晶片

可以去讀轉換完成資料

當WR和CS 同時為ldquo0rdquo時表示對 ADC0804 下達ldquo開始轉換rdquo命令再經過

32

一段轉換時間〈100μ s〉後轉換完成ADC0804 會將其轉換完成的數位資料放

在其內部 8 位元緩衝區裡且將 INTR 降為ldquo0rdquo因此單晶片只要下達ldquo開始轉換rdquo

命令後去檢查 INTR 的狀態就可以知道是否轉換完畢其方法有兩種

1 輪詢法〈polling〉

2 中斷法〈interrupt〉

所謂輪詢法就是將 ADC0804 的 INTR接到 CPU 的一條 IO 線上然後以軟體指

令主動偵測其狀態當偵測到為ldquo0rdquo時就可以去讀出 ADC0804 裡的緩衝區的轉

換值

中斷法是一個很理想的 IO 方式因為不像輪詢法必須讓 CPU 等 ADC0804

轉換當 CPU 下達ldquo開始轉換rdquo命令後就可以做其他工作當 ADC0804 轉換完

畢後 INTR會降為ldquo0rdquo可以利用此信號去中斷 CPU再由中斷副程式去讀入

轉換值即可因此大大提高了程式的效率

當 CPU 接收到 ADC0804 發出ldquo轉換完畢rdquo的信號〈 INTR =0〉後就可以去

讀出轉換值其讀出的方法是將CS 與RD設為ldquo0rdquo即可讀到轉換值這個讀值的

動作又會使得 INTR恢復成ldquo1rdquo

1 CPU 下達ldquo開始轉換rdquo命令〈CS =0WR =0〉

2 ADC0804ldquo轉換完畢rdquo 〈 INTR =0〉

3 CPU 讀取轉換值〈 RD =0CS =0〉

4 讀完後 INTR =1

ADC0804 主要規格摘要如下

1 +5V 單電源工作電壓

2 類比電壓輸入範圍 0~+5V

33

3 參考電壓為 25V

4 轉換時間為 100μ s〈 CLKf =640kHz〉

5 解析度為 8 位元

6 誤差plusmn 1LSB

7 讀取時間 135ns

36 電源供應系統

本專題中所有電路及硬體設備所需的電源採用交流電源 110V 經由 PT-31

變壓器後再經過橋式整流後提供了直流電源而因為各個電路所需電源不同

因此製作了多組的變壓電路如下

1電壓源 DC5V選擇了 7805 的穩壓 IC 搭配電容得到了+5V 的電壓源

供〈1〉8051 微處理器 〈2〉ADC 0804 〈3〉74LS8674LS12374LS04

74LS02CD4013 〈4〉馬達 Encoder

2電壓源 DC12V使用 7812 穩壓 IC 搭配電容得到+12V 的電壓源供

LM2917 使用

3電壓源 DC24V利用 7824 的穩壓 IC 搭配電容獲得+24V 的直流電壓

源供電路之橋型驅動功率放大之電晶體使用

Vin1

+12V2

GND3

LM7812

2200uF 10000pF 2200uF 10000pF

+12V outputAC

圖 317 直流電源電路

34

圖 318 直流電源電路實體圖

37 馬達轉速的量測

表 33 PWM 輸出對應 encoder 週期

PWM dutycycle encoder 週期 PWM dutycycle encoder 週期

40 sμ 172 sμ 440 sμ 0 sμ

80 sμ 188 sμ 480 sμ 0 sμ

120 sμ 204 sμ 520 sμ 0 sμ

160 sμ 230 sμ 560 sμ 0 sμ

200 sμ 272 sμ 600 sμ 0 sμ

240 sμ 328 sμ 640 sμ 0 sμ

280 sμ 416 sμ 680 sμ 1320 sμ

320 sμ 540 sμ 720 sμ 750 sμ

360 sμ 800 sμ 760 sμ 510 sμ

400 sμ 1320 sμ 800 sμ 400 sμ

35

圖 319 PWM 輸出對應 encoder 週期

由統計可知道此馬達並不是一顆線性馬達故相信若使用模糊控制理論來

作為其回授控制系統的控制器一定能達到比傳統控制器的性能還要好而且若能

在模糊控制裡加上 PID 控制器的觀念一定能在系統的響應時間上升時間

安定時間和超越量達到最佳的控制另一方面馬達在其反方向的內阻較大需

要更大的力量才能使馬達驅動

36

第四章 軟體規劃與製作

41 PWM 之軟體設計

因為之前所介紹的硬體方式是以調整可變電阻來達到轉速的調整因此無法

得知所給予的脈寬長度和轉速大小尤其在回授時也不易給予適當的訊號來調整

轉速因此改良之方法就是以8051之軟體撰寫方式來產生固定的脈寬也就等

於給予轉速的命令而在其回授控制時也只要在內部程式给予適當的指令便可

達到脈寬長度的調整以達到閉迴路之受控系統

411 PWM 軟體流程

設定Timer0模式為0

TH0 = temp 32 TL0 = temp 32

temp = 8192 ndash j4 Key = 0

檢查是否有鍵值

將鍵值存入Key

Yes

No

設定Key值所對應的 j值

If P30 == 1Then P30 = 0 temp = 8192 ndash j4Else P30 = 1 temp=8192ndash880+j4

TH0 = temp 32 TL0 = temp 32

Start Timer0中斷副程式

啟動Timer0

等待Timer0中斷

返回主程式

圖 41 PWM 軟體設計流程圖

37

在此總共設計了五個按鈕分別代表不同的轉速停止正轉〈慢〉正轉

〈快〉逆轉〈慢〉和逆轉〈快〉使用Timer0是因為8051之計時中斷比延遲程

式來的準確故可以達到準確的計時程式設計理念中並沒有將中斷致能清除

因此Timer0會一直處於計時的狀態程式執行時將一邊檢查鍵值〈KeyStatus〉一

邊進行計時當計時完畢便呼叫中斷副程式然後執行改變Port 30的輸出狀

態若是為high則變為low反之若是為low即變為high同時並重設計時時間

Timer0繼續計時

當鍵值改變時計時的時間也會跟著改變如此一來Timer0將ㄧ直重覆上

述動作直到電源切掉Timer0才會停止計時

42 模糊控制之程式規劃與撰寫

本專題目標在完成了先前所規劃的硬體電路之後接著就是要達成利用模糊

控制理論來設計控制器在此採用了單晶片8051目的是為了以硬體實現方式來

代替電腦模擬期望能夠按照原訂計畫完成本專題「具模糊控制理論與雙脈寬調

變法之直流馬達驅動電路設計」

單晶片 8051 模糊控制的程式撰寫採下列幾個步驟依序完成

1 設定變數轉速誤差〈dspeed〉目前轉速〈sspeed〉

2 模糊化採用三角形歸屬函數採用三角形歸屬函數的原因

〈1〉 三角形函數為一連續函數

〈2〉 三角形函數為線性的函數所以計算速度較快

〈3〉 是具有發散也有收斂的函數和指數函數一樣接近

事實

3 模糊推論模糊規則將其所有可能發生情況以 IFhellipTHENhellip表示

並建立控制規則表

4 解模糊化採用重心法

38

421 歸屬函數

設定變數為目前轉速〈sspeed〉與轉速誤差〈dspeed〉因此此模糊控制器共

有兩個輸入訊號與一輸出訊號輸出訊號為脈寬長度該加或是減多少又因為有

五種不同的轉速因此各分別設計了不同的歸屬函數如下

1 當轉速 = 0

ml h

s s p e e d

d s p e e d

r p m0 5 0 1 0 0- 5 0- 1 0 0

mv l l h v h

r p m0- 3 0- 6 0- 1 0 0 3 0 6 0 1 0 0 圖 42 停止時之歸屬函數

2 正轉〈慢〉

ml hsspeed

dspeed

rpm150 225 300750

mvl l h vh

rpm150100500 200 250 300

圖 43 正轉〈慢〉之歸屬函數

39

3 正轉〈快〉

ml hsspeed

dspeed

rpm520 670 820370220

mvl l h vh

rpm500400300200 600 700 800

圖 44 正轉〈快〉之歸屬函數

4 逆轉〈慢〉

ml hsspeed

dspeed

rpm100 250 400500

mvl l h vh

rpm10050250 200 300 400 圖 45 逆轉〈慢〉之歸屬函數

40

5 逆轉〈快〉

ml hsspeed

dspeed

rpm300 450 600150

mvl l h vh

rpm450350250150 550 650 750

750

圖 46 逆轉〈快〉之歸屬函數

6 輸出

OutputMVL L H VH

rpm0-50-150-250 50 150 250

圖 47 輸出之歸屬函數

41

422 模糊規則庫

表 41 為吾人所設計的模糊控制規則庫並利用 Matlab 之 Fuzzy ToolBox 來

建立此規則庫以進行模擬推論圖 48 為當馬達輸入指令為正轉慢時推論後所得

到的三維空間圖

表 41 模糊控制規則表

Dspeed

vl l m h vh

l H M L VL VL

m VH H M L VL sspeed

h VH VH H M L

圖 48 推論後的三維空間圖

42

423 模糊控制器之軟體設計流程

Start 外部中斷副程式

ADCWR = 0 ADCWR = 1

〈令AD開始轉換〉

檢查鍵值以得到對應的歸屬函數

取得目前轉速與

轉速誤差

Fuzzy Rules決策

得到輸出訊號

Delay 10ms

ADC = 0 讀取AD值 ADCRD = 0

將AD值換算成轉速

ADCWR = 0 ADCWR = 1

〈AD開始轉換〉

返回主程式

致能外部中斷

圖 49 Fuzzy Controller 程式流程圖

當控制器一開始動作時便先執行AD轉換的工作當AD轉換完成時其

INTR的接腳便會觸發8051的外部中斷INTR0於是程式便發生外部中斷執行

外部中斷副程式的指令

43

在外部中斷副程式中AD將ㄧ直進行轉換與讀取的工作同時並將轉換後

的值直接換算成目前轉速與轉速誤差以供模糊控制器使用換算目前encoder

的頻率其公式為

160-V2000 times=頻率 〈4-1〉

式4-1之公式是根據表31所導出來的其中V為encoder之頻率轉成電壓之值

又假設所讀取的AD轉換值為value因為

AD的解析度 = bit256

5V+ = 511 ( Vbit ) 〈4-2〉

故value值與電壓V之關係為

511 value V times= 〈4-3〉

所以encoder之頻率與value值的關係為

頻率= 2000times ⎟⎠⎞

⎜⎝⎛ times

511 value - 160 〈4-4〉

故目前轉速為

sspeed = ( )rpm 60 200

times頻率 〈4-5〉

另ㄧ方面在主程式中程式會先去檢查鍵值也就等於檢查輸入指令以

找出符合使用的歸屬函數並將AD所獲得的轉速對應到歸屬函數中然後執行

決策判斷即進入規則庫中尋找出適當的決策判斷最後將此決策送入PWM程

式裡進行脈寬長度的調整使馬達在合理的要求下達到理想的轉速控制不會

因為外在環境的影響而使馬達轉速受到干擾

43 LCD 顯示轉速

此專題最後再增加一LCD顯示幕以顯示目前的轉速否則在程式設計完成

後人卻因無法以肉眼得知目前轉速而不能肯定馬達轉速是否有達到控制的目

標因此增加一顯示幕LCD是有必要的不僅隨時得知目前的轉速還能知道

44

設計出來的軟體其控制性是否夠好夠穩定

431 LCD 顯示幕之軟體流程

Start

設定LCD模組的初始狀態

設定外部中斷INTR0

與Timer0

設定TH0 = (65536 ndash 5000) 256 TL0 = (65536 ndash 5000)256

令ADCWR = 0 ADCWR = 1 AD開始轉換

等待中斷

外部中斷副程式

ADCRD = 0 讀取AD值 ADCRD = 1

將AD值換算成速度

ADCWR = 0 ADCWR = 1 AD開始轉換

Timer0中斷副程式

顯示LCD第一行

ldquoMotor Speed =

顯示LCD第二行ldquoxxxxxxx rpm其中 xxxxxx為外部中斷副程式所換算出的轉速

重設TH0與TL0

返回主程式返回主程式

圖 410 LCD 顯示幕之程式流程圖

此程式主要由兩個部分完成一為外部中斷副程式另ㄧ為 Timer0 中斷副

程式當主程式完成外部與 Timer0 兩個中斷的設定後隨即命令 AD 開始轉換

之後便一直停在 while〈1〉的迴圈裡不做任何動作而由兩個中斷副程式來完

成整個轉換與顯示的工作

45

外部中斷副程式主要負責 AD 的轉換讀取與轉速換算的工作AD 第一

次的轉換由主程式來下達命令當轉換完成後AD 的 INTR 接腳將觸發外部中

斷〈INTR0〉副程式此時程式便進入外部中斷副程式執行讀取 AD 值與轉速

換算的工作當這些工作完成時外部中斷副程式再次下達 AD 開始轉換的命

令而離開中斷副程式當 AD 再次轉換完成時又將再次執行中斷副程式

如此週而復始中斷副程式將ㄧ直進行讀取換算與轉換的工作

而 Timer0 中斷副程式主要負責 LCD 顯示之工作當主程式所設定的計時時

間計數完時程式便進入 Timer0 中斷副程式一旦進入 Timer0 中斷副程式程

式將執行 LCD 的顯示然後再重設 Timer0 的計數時間Timer0 將重新計數當

計數完時程式又將再度進入 Timer0 中斷副程式執行因為程式中並無清除

Timer0 的中斷致能故 Timer0 中斷副程式和外部中斷副程式ㄧ樣週而復始的

執行其副程式的工作

46

第五章 結論

本計劃主旨為具模糊控制理論與雙脈寬調變法之直流馬達驅動電路設計主

要是針對傳統電路設計之缺點提出改良之方法以TPWM取代PWM電路以模

糊理論基礎設計之控制器替代傳統PID控制器

TPWM轉速控制優於PWM之處在於

1 TPWM只需使用單電源即可達到正轉和逆轉的轉速控制而PWM必須

加上逆向開關或是雙電源才能使馬達產生正轉和逆轉

2 TPWM可控制馬達處於停止狀態無論在正向或逆向加上負載皆無法使

馬達產生轉動

3 馬達消耗定額功率輸出轉矩為額定值

4 馬達由停止到某定轉速時反應時間較快

模糊控制器優於PID控制器

1 不須導出繁雜的數學模型

2 適用於非線性系統

3 強健性與容錯性較高

本專題至此雖說大致的目標都已達到但是此系統仍然有許多不完美而需要

改進的地方例如在實驗過程中發現整個轉速的控制在回授上其反應時間

有點慢探討其原因有可能是控制器之程式上的問題

1 因為使用C語言撰寫程式故其執行速度較慢

2 程式可能寫的太累贅

3 模糊控制規則庫建立不良

若想改善這些問題可以嘗試著將C語言改為組合語言來撰寫並盡量減少

47

不必要的指令相信此動作一定能大大提昇程式的執行速度其次就是多做測

試利用測試中所學到的經驗來幫助模糊控制規則庫的改寫同時也能從測試中

發現更多的問題若是都能對問題加以一一解決的話相信必定能將此控制系統

做的更盡善盡美

48

參考文獻

﹝1﹞ 李適中直流馬達速度控制伺服控制〈基礎篇〉全華科技圖書股份有

限公司民 74

﹝2﹞ 廖錦文ldquo直流電動機之雙脈寬調變是〈TPWM〉驅動電路研究電

子技術月刊第 69 期pp94-1021992

﹝3﹞ 楊英魁孫宗瀛鄭魁香林建德蔣旭堂模糊控制理論與技術全華

科技圖書股份有限公司民 85

﹝4﹞ 林敦煌陳憬德直流馬達定位及轉速的模糊控制逢甲大學自動控制工

程學系學士論文民 87

﹝5﹞ LAZadehldquo Fuzzy Sets Information and Control Vol8 pp338-353

1965

﹝6﹞ EHMamdani and SAsslianldquo A fuzzy logic controller for a dynamic

plant Internation Journal of Man-Machine Studies Vol7 pp1-13 1975

﹝7﹞ 孫宗瀛楊英魁Fuzzy 控制理論實作與應用全華科技圖書股份有

限公司民 83 年

﹝8﹞ 許中平黃煌嘉直流電動機控制電路設計全華科技圖書股份有限公司

民 75

﹝9﹞ 盧明智黃敏祥OP Amp 應用+實驗模擬全華科技圖書股份有限公司

民 83

﹝10﹞陳文耀電動機控制工程復文書局2003

﹝11﹞許中平林全福電動機運轉控制技術全華科技圖書股份有限公司民

77

﹝12﹞楊明豐8051 單晶片 C 語言設計實務碁峯資訊2003 年

﹝13﹞蔡朝洋單晶片微電腦 80518951 原理與應用全華科技圖書股份有限公

司民 91

49

﹝14﹞王文俊認識 Fuzzy全華科技圖書股份有限公司民 90

50

附錄 A 專題硬體展示圖

圖 A-1 硬體整體圖

圖 A-2 硬體整體鳥瞰圖

51

圖 A-3 硬體側視圖

圖 A-4 操作與顯示面板

圖 A-5 間距脈波電路與 FV 電路

52

圖 A-6 橋型驅動功率放大電路

圖 A-7 操作與控制面板

53

附錄 B PWM 與模糊控制之程式

include reg51h include stdioh sbit ADCRD = P3^1 設定 RD 控制線接腳為 P31 sbit ADCWR = P3^3 設定 WR 控制線接腳為 P33 sbit P2_0 = 0xA0 接腳定義 sbit P2_1 = 0xA1 接腳定義 sbit P3_0 = 0xB0 接腳定義 sbit P3_1 = 0xB1 接腳定義 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P3_6 = 0xB6 接腳定義 void KeyStatus(void) 函數原型宣告 void feedback(void) 函數原型宣告 void compute_grade(void) 函數原型宣告 void delay1ms(int count) 函數原型宣告 void convert() 函數原型宣告 void condition() 函數原型宣告 void CW(void) 函數原型宣告 int j i 對應 PWM 的寬度 unsigned int temp 所設計的計時器時間 int sample = 1000 取樣率設定消除顯示值跳動 long int value r1 讀取 ADC0804 數位資料 long int set n condition select long int r grade_reg[2] grade[15] error1 error2 long int a1 b1 I long int membership[5][3]membership1[3][3] 定義歸屬函數 long int membership2[3][3] = -10-50-5050510 long int error[2] int Rule[15][3] = 113213313 定義判斷規則庫 212223323 311232333 411241342 511251351

54

main() 主程式 j = PWM = 110 設定 PWM 初始值 IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x00 設定計時器 0 工作於模式 0 temp=8192-j4 設定計時器 0 初值 TH0 = temp 32 TL0 = temp 32 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 P3_4 = 1 P3_5 = 0 P3_6 = 0 ADCWR = 0 令 ADC0804 的 WR = 0 ADCWR = 1 令 ADC0804 的 WR = 1 while (1) KeyStatus() 檢查鍵值 void KeyStatus(void) 檢查鍵值並給對應的 PWM 值 char KeyScan(void) 按鍵掃描函數宣告 unsigned char KeyStatus unsigned char Key = 0 KeyStatus=KeyScan() 呼叫按鍵掃描函數 if (KeyStatus = 0) 已有按鍵輸入 Key = KeyStatus Key = 鍵值 if (Key == 0x01) 假如輸入為按鍵 1 i = 110 PWM 為 110us j = i P3_4 = 1 LED 亮第一顆〈表馬達停止〉 P3_5 = 0 P3_6 = 0

55

else if (Key == 0x02 ) 假如輸入為按鍵 2 i = 140 PWM 為 140us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x04 ) 假如輸入為按鍵 3 i = 180 PWM 為 180us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x08 ) 假如輸入為按鍵 4 i = 80 PWM 為 80us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 else if (Key == 0x10 ) 假如輸入為按鍵 5 i = 40 PWM 為 40us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 PWM = j delay1ms(10) 呼叫延遲函數 feedback() 模糊控制判斷

56

void To_int(void) interrupt 1 Timer0 中斷函數 if (P3_0 == 0) 假如 PWM 輸出為 Low P3_0 = 1 變更 PWM 輸出為 High temp=8192-j4 設定 High 的時間 else 若 PWM 輸出為 High P3_0 = 0 變更 PWM 輸出為 Low temp=8192-880+j4 設定 Low 的時間 TH0 = temp 32 Timer0 的計時時間 TL0 = temp 32 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 char KeyScan(void) 檢查鍵值 char KeyStatus 按鍵狀態 P0=0xff 設定 P0 為輸入模式 KeyStatus=~P0 讀取按鍵狀態 return(KeyStatus) 將鍵值送回程式 void feedback(void) 模糊判斷 void Fuzzycontroller() 函數原型宣告 void condition1() 函數原型宣告

57

void condition2() 函數原型宣告 error1 = ((value)40-160)03 輸入變數 1 delay10ms(10) 延遲 10ms error2 = ((value)40-160)03 輸入變數 2 if (key == 0x01 ) 當按鍵 1找出對應的歸屬函數 並做出模糊控制判斷

int membership[5][3]= -100-60-30-60-300-30030030603060100

int membership1[3][3]=-100-500-50050050100 Fuzzycontroller() condition() if (key == 0x02 ) 當按鍵 2找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

05010050100150100150200150200250200250300 int membership1[3][3]=07515075150225150225300 Fuzzycontroller() condition() else if (key == 0x04) 當按鍵 3找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

200320400300400500400500600500600700600700800 int membership1[3][3]=220370520370520670520670820 Fuzzycontroller() condition() else if (key == 0x08) 當按鍵 4找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

02550255010050100200100200300200300400 int membership1[3][3]=05010050100250100250400 Fuzzycontroller() condition()

58

else if (key == 0x10) 當按鍵 5找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

150250350250350450350450550450550650550650750 int membership1[3][3]=150300450300450600450600750 Fuzzycontroller() condition2() void Fuzzycontroller() 模糊控制判斷 void compute_grade() 函數原型宣告 void compute_grade1() 函數原型宣告 a1 = 0 b1 = 001 I = 0 for (n=0 nlt=14 n++) r = error1 set = Rule[n][0]-1 compute_grade() 計算輸入變數 1 與

模糊程度的歸屬函數 condition = 1 r = error2 set = Rule[n][1]-1 compute_grade1() 計算輸入變數 2 與 模糊程度的歸屬函數 grade[n] = MIN(grade_reg[0] grade_reg[1]) a1 = a1 + (grade[n]membership2[Rule[n][2]-1][1]) b1 = b1 + grade[n] I = a1 b1 得到模糊控制判斷的結果 void compute_grade() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership[set][0]) || (r gt membership[set][2])) 當輸入變數不在 歸屬函數內

59

grade_reg[condition] = 0 else if ((r gt membership[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership[set][2]-r) (membership[set][2] - membership[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership[set][0]) (membership[set][1] - membership[set][0]) void compute_grade1() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership1[set][0]) || (r gt membership1[set][2])) 當輸入變數不在 歸屬函數內 grade_reg[condition] = 0 else if ((r gt membership1[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership1[set][2]-r) (membership1[set][2]-membership1[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership1[set][0]) (membership1[set][1]-membership1[set][0])

60

void condition() P2_0 = 1 設定 P20 為輸入模式 P2_1 = 1 設定 P21 為輸入模式 if ( (P2_0 == 1) ampamp (P2_1 == 0)) 當馬達為正轉時 if ( I gt 0 ) 若模糊判斷結果為正 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 若模糊判斷結果為零 PWM = PWM + 0 PWM 寬度不變 if ( I lt 0 ) 若模糊控制結果小於零 PWM = PWM + 1 PWM 寬度加 1 else if ( (P2_0 == 0) ampamp (P2_1 == 1) ) 若馬達為反轉 if ( I lt 0 ) 模糊控制小於零 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 模糊控制等於零 PWM = PWM + 0 PWM 寬度不變 if ( I gt 0 ) 模糊控制大於零 PWM = PWM + 1 PWM 寬度加 1 CW() 判斷 PWM 寬度上下限

61

void CW() 判斷 PWM 寬度上下限 if ( PWM gt= 215 ) 若 PWM 寬度 gt= 最大寬度 j = 215 PWM 寬度維持於 215us if ( PWM lt= 5 ) 若 PWM 寬度 lt= 最小寬度 j = 5 PWM 寬度維持在 5us if ( PWM gt 5 ampamp PWM lt 215 ) PWM 寬度介於最大與最小間 j = PWM PWM 依模糊控制判斷結果增減 void delay1ms(int count) 延遲 1ms int x y for ( x = 0 x lt count x++ ) for ( y = 0 y lt 122 y++ ) void convert() 數位資料換算成馬達轉速 r1 = ((value)40)-160

62

附錄 C LCD 顯示之程式

includereg51h 含 8051 所有暫存器宣告 include mathh define RS P3_5 LCD 指令資料選擇控制 define RW P3_4 LCD 讀寫控制腳 define Enable P3_3 LCD 致能接腳 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P0_0 = 0x80 接腳定義 sbit P0_1 = 0x81 接腳定義 sbit P0_2 = 0x82 接腳定義 sbit P0_3 = 0x83 接腳定義 sbit P0_4 = 0x84 接腳定義 sbit P0_5 = 0x85 接腳定義 sbit P0_6 = 0x86 接腳定義 sbit ADCRD = P3^7 設定 RD 控制線接腳為 P37 sbit ADCWR = P3^6 設定 WR 控制線接腳為 P36 void delay(void) 函數原型宣告 void delay10ms(int count) 函數原型宣告 void display(void) 函數原型宣告 void InitialLCD(void) 函數原型宣告 void WriteIns(char) 函數原型宣告 void WriteData(char) 函數原型宣告 void WriteString(charchar) 函數原型宣告 void CheckBusy(void) 函數原型宣告 void convert(void) 函數原型宣告 char MSG0[] = Motor Speed = 定義字串 MSG0 char MSG2[] = rpm 定義字串 MSG2 unsigned char MSG1[8]=0000000 定義字串 MSG1 unsigned long int value 讀取 ADC0804 數位資料 int sample = 1000 取樣率設定消除顯示值跳動 long int rpm

63

main() 主程式 InitialLCD() 初始化 LCD IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x01 設定計時器 0 工作於模式 1 TH0 = (65536-5000)256 設定計時器 0 初值 TL0 = (65536-5000)256 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 while(1) 等待中斷 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 while (--sample == 0) 取樣率減 1 sample = 1000 重設取樣率 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 void T0_int(void) interrupt 1 LCD 顯示動態掃描 display() 動態掃描顯示 TH0 = (65536-65535)256 重設計時初值 TL0 = (65536-65535)256

64

void InitialLCD(void) 設定 LCD 模組初始狀態 delay() 延遲函數 WriteIns(0x38) 設定 LCD 模組為 WriteIns(0x38) 2 行顯示 WriteIns(0x38) 8 位元介面 WriteIns(0x38) 5x7 點字型 WriteIns(0x08) 關閉顯示器 WriteIns(0x01) 清除 LCD 螢幕 WriteIns(0x0c) 令顯示器 ON但游標不顯示 WriteIns(0x06) 令 LCD 模組每接收到 1Byte 資料 AC 值自動加 1 void display() 掃描顯示 WriteIns(0x80) 設定 LCD 座標 WriteString(13MSG0) 將字串 MSG0 寫入 LCD 中 WriteIns(0xc0) 設定 LCD 座標 WriteString(8MSG1) 將字串 MSG1 寫入 LCD 中 WriteIns(0xc8) 設定 LCD 座標 WriteString(4MSG2) 將字串 MSG2 寫入 LCD 中 void convert(void) 換算轉速 long int freq freq = ((value)4000) - 16000 數位資料換成頻率公式 rpm = freq3 頻率換算轉速公式 MSG1[0] = (rpm1000000)+0x30 將結果存入字串 MSG1 中 MSG1[1] = ((rpm1000000)100000)+0x30 MSG1[2] = ((rpm100000)10000)+0x30 MSG1[3] = ((rpm10000)1000)+0x30 MSG1[4] = 0x2e MSG1[5] = ((rpm1000)100)+0x30 MSG1[6] = ((rpm100)10)+0x30 MSG1[7] = rpm10+0x30

65

void WriteIns(char instruction) 寫命令至 LCD 中 RS = 0 選擇指令暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = instruction 輸出命令至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteData(char i) 寫資料至 LCD 中 RS = 1 選擇資料暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = i 輸出資料至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteString(countMSG) 寫字串至 LCD 中 char count 字串長度 char MSG[] 字串資料 char i 定義位元組變數 for(i=0 iltcount i++) count 個位元組 WriteData(MSG[i]) 寫入一位元組的資料至 LCD 中 void CheckBusy(void) char i=0x80 檢查忙碌旗標 while(iamp0x80) 忙錄旗標 BF = 1 RS = 0 選擇指令暫存器 RW = 1 讀取 Enable = 1 致能 LCD i = P2 讀取 LCD 指令暫存器內的資料

66

Enable = 0 除能 LCD delay() 延遲函數 void delay() 延遲 5ms int i for(i=0 ilt250 i++)

  • 畢業專題封面pdf
  • File0004pdf
  • 最終版pdfpdf
Page 17: Based on Fuzzy Control Theorem and TPWM Method for DC ... · 使吾人想設計一模糊控制器來做為馬達轉速的閉迴路控制,以解決非線性系統的 問題。除此之外,flcs

8

一個模糊集合的歸屬函數可以有許多方式但是目前最廣泛使用的有吊鐘

型三角型梯型等歸屬函數

〈1〉吊鐘形歸屬函數

吊鐘形歸屬函數定義如下

μA=bell(xabc)= b

acx 2

1

1minus

+

〈21〉

圖 22 吊鐘型歸屬函數

〈2〉三角形歸屬函數

三角形歸屬函數可由三個參數(abc)來加以決定

=Aμ trangle(xabc)

⎪⎪⎪

⎪⎪⎪

ltleminusminus

ltleminusminus

=

other

cxbcbcx

bxaabax

0

〈22〉

其中a為歸屬函數左邊界b為歸屬函數中心值c為歸屬函數右邊界

9

圖 23 三角型歸屬函數

〈3〉梯型歸屬函數

梯型歸屬函數可由四個參數加以決定

=Aμ trapezoid(xabcd)

⎪⎪⎪⎪

⎪⎪⎪⎪

leleminusminus

ltle

ltleminusminus

=

other

dxcdcdx

cxb

bxaabax

0

1 〈23〉

圖 24 梯型歸屬函數

10

214 模糊推論與模糊規則

模糊推論〈fuzzy inference〉是根據知識庫保存的規則(rule)和給予的事實

推導出新的結論與傳統推論不同的地方是Fuzzy推論不只可以處理明確命題也

可以處理Fuzzy命題Fuzzy推論是依據近似推理〈approximate reasoning〉的概念

發展出來的比傳統推論的嚴正推理〈exact reasoning〉更合理也更具彈性近

似推理是兩種嚴正推理General Modus Ponens〈簡稱GMP〉及Genera Modus

Tollens〈簡稱GMT〉的一般化此原理是從傳統二值邏輯中的肯定律〈modus

ponens〉和否定律〈modus tollens〉推廣而來其中GMP又可稱為前向推理而

GMT則可稱為反向推理

〈1〉 GMP〈General Modus Ponens〉

規則IF x is A THEN y is B

事實x is Arsquo

結論y ix Brsquo 〈24〉

〈2〉 GMT〈General Modus Tollens〉

規則IF x is A THEN y is B

事實y is Brsquo

結論x is Arsquo 〈25〉

上式中IF x is A THEN y is B即為模糊規則〈fuzzy rules〉AArsquoBBrsquo

分別是定義在論域X及Y的模糊集合xy代表輸入變數及輸出變數的語言變數

一般來說「x is A」稱為前件部〈antecedent〉而「Y is B」則稱為後件部

〈consequence〉Fuzzy知識庫〈Fuzzy Knowledge Base簡稱FKB〉即由這些模

糊規則所組成的規則庫〈rule base〉和存放描述領域知識的Fuzzy變數及語言變數

的資料庫〈data base〉所組成所以FKB是用來描述受控對象所涉及的領域知

11

識和操控目標的一些定性及定量的資訊模糊知識庫和模糊推論是構成Fuzzy規

則系統核心的兩個重要部門﹝7﹞

模糊推論是模糊系統的核心根據知識庫的模糊法則進行模糊理論的合成運

算來模擬人類的思考決策模式一般來說規則的建立是採取十分主觀直覺的

方式依據相關領域專家的經驗與知識透過詢問進而將其知識經驗歸納條列出

重點再轉換成模糊規則的形式表現出來但是並非所有的專家或操作員都能

將自身的經驗知識以言詞的方式充分的表達出來且未必能整理成條列的模糊規

則所以知識規則的萃取工作往往是在建構模糊系統時最常遭遇到的困難之

215 模糊控制器

模糊控制是智慧型控制〈intelligent control〉系統的一種典型其基本特點

是不完全依賴受控對象的數學模型主要是利用人的操作經驗知識和推理技

術以及控制系統的某些訊息和性能得出對應的控制動作模糊控制是以並行

〈parallel〉方式處理規則的推理工作〈如圖25〉其近似推理會包容每個對操

控系統有貢獻的規則即使某些貢獻程度很小的規則也不會忽略

圖 25 模糊控制系統的構造

12

一個控制器的輸入通常是確定數值而非模糊輸出也是如此才能對被控對象

發生作用但是模糊邏輯控制器〈Fuzzy Logic Controller簡稱FLC〉則是以語

言化的控制規則為主體為了能夠把輸入的確定值與語言化之後的控制規則結

合必須把輸入的確定值模糊化〈fuzzification〉以便對應到FLC語言變數的論

域範圍中同樣的經過規則庫推理出來的結果是對應到輸出語言變數的論域

中所以也必須對其做解模糊化〈defuzzification〉的工作才能達成實際的控制

目標

一般模糊控制器的架構包含了五個主要部分定義變數模糊化知識庫

模糊推論及解模糊化

〈1〉 定義輸入及輸出變數

決定程序被觀察的狀況及考慮控制的動作輸入變數可以是擷取

自受控系統的觀測量也可以是推導出來的資料輸出變數則為操控

受控系統的操作量例如在一般控制問題上輸入變數通常為輸出

誤差e與輸出誤差之變化率e而控制變數則為下一個狀態之輸入

u其中eeu統稱為模糊變數

〈2〉 模糊化

將量測值轉換為語言變數的過程將外界所輸入的確定數值經由

一比例映射傳送到輸入變數所對應的模糊論域然後再利用模糊化

函數將此輸入資料轉換成適當的口語值以供模糊運算使用此口語

化變數稱之為模糊子集合

〈3〉 知識庫

模糊知識庫是模糊控制的依據由它來定義所有使用到的語言控

制法則及相關各項參數知識庫可說是整個控制系統資料核心其包

含了兩個部分資料庫〈data base〉與規則庫〈rules base〉

1 資料庫

提供處理模糊數據之相關定義資料庫所存放的資料是關

13

於如何將明確的資料轉換成模糊數值而資料的存放方式是以

歸屬函數表示該選用哪一種歸屬函數依實際的需要選定

以三角形歸屬函數最常被使用因其運算最為容易且又能充分

的表達模糊概念

2 規則庫

利用語言化的條件式控制規則描述控制目標和策略通常

控制規則可以由操控人員的經驗或專家的知識推導出來多個

控制規則所組成的集合就是規則庫

〈4〉 模糊推論

模糊推論為模糊控制最重要的核心其最主要的工作就是做實際

的決策過程處理模糊推論具有模擬人類做決策判斷的能力其基本

理論就是根據人類特有的近似推理方式如之前已說明的GMP和

GMTGMP為前向推理而GMT為逆向推理因為模糊推論為前向

運算因此GMP非常適合使用為模糊控制的推論機構

〈5〉 解模糊化

將推論完成所得到的模糊輸出量轉換成實際的明確數值以便和

外界溝通解模糊化的方法有很多例最大歸屬度法重心法高

度法面積法等

圖 26 模糊系統的基本架構

14

22 直流馬達數學模型

圖27為直流馬達等效電路簡圖其中

iV = 輸入電壓 ai = 電樞電流

zR = 電樞電阻 gT = 轉矩

aL = 電樞電感 bE = 反電動勢

φ = 空氣隙磁通量 ω = 轉子角速度

B = 黏滯摩擦係數 J = 轉動慣量

圖 27 直流馬達等效電路簡圖

由克希荷夫電壓定律知

( ) ( ) ( )tEdt

tdiLtiRV b

aaaai ++= 〈26〉

由於反電動勢 bE 與轉軸的角速度 ( )tω 及空氣隙磁通量φ之乘積成正比即

( ) ( ) ( )tKtKtE emb ωφω == 〈27〉

15

又轉矩的平衡方程式為

( ) ( ) ( )dt

tdJtBtTgωω += 〈28〉

且馬達轉矩 gT 與電樞電流 ( )tia 及空氣隙磁通量φ乘積成正比即

( ) ( ) ( )tiKtiKtT ataag == φ 〈29〉

取〈26〉~〈29〉式之拉氏變換得

( ) ( ) ( ) ( )sEssILsIRsV baaaai ++= 〈210〉

( ) ( )sKsE eb Ω= 〈211〉

( ) ( ) ( )sJssBsTg Ω+Ω= 〈212〉

( ) ( )sIKsT atg = 〈213〉

則馬達輸入電流與轉速為

( ) ( ) ( )( ) ( )( )

sR

sEsV

sLRsEsV

sIe

a

bi

aa

bia τ+

minus

=+minus

=1

〈214〉

( ) ( ) ( )

sB

sT

sJBsT

sm

gg

τ+=

+=Ω

1 〈215〉

其中a

ae R

L=τ 為電樞電流的電氣時間常數 BJ

m =τ 為馬達轉動的機械時間

常數

直流馬達轉速對輸入電壓的轉移函數 ( )sG 為

( ) ( )( ) ( )( ) etaa

t

i KKBJsRsLK

sVssG

+++=

Ω=

( )( ) etmea

t

KKssBRK

+++=

ττ 11 〈216〉

16

在一般情況電樞電感很小所以 eτ 可以忽略不計因此上式成為一階落後

方程式

( ) ( )( ) ( ) m

m

etma

t

i sTK

KKsBRK

sVssG

+=

++=

Ω=

11 τ 〈217〉

其中

eta

mam KKBR

BRT

+=

τ

eta

tm KKBR

KK

+=

所以直流馬達數學模式可以以圖28表之﹝8﹞

圖 28 直流馬達數學模式方塊圖

17

第三章 系統功能分析與製作規劃

31 專題製作流程

如圖 31 所示本專題主要分為兩條路徑進行一為硬體另一則為軟體程

式撰寫本章著重硬體的規劃設計軟體則在第四章中介紹在完成 AB 信號

產生電路驅動功率放大電路與間距脈波產生電路設計與製作後須先接上馬達

做一連串的測試〈此時系統並無回受控制〉測試間距脈波是否太長或太短硬

體電路是否有缺失hellip等等另一方面也著手撰寫模糊控制程式並將其與硬體電

路結合最後做閉迴路系統的整合測試若發現系統的運作結果並不如預期

則需分別從硬體與軟體兩方面去改良

直流馬達轉速之模糊控制

文獻蒐集與整理

AB信號產生電路設計與製作

驅動功率放大電路設計與製作

間距脈波產生電路設計與製作

測試間距脈波是否太長或太短

系統測試測試馬達轉速是否

達到控制目的

結束與論文寫作

重新設計間距脈波長度

Yes

No

系統整合與修正

輸出信號與Fuzzy控制器之連結設計

規劃輸出與輸入歸屬函數

規劃模糊知識庫

撰寫主程式並加入模糊知識庫

程式編譯及連結

軟硬體整合測試馬達是否運作

程式調整及最佳化

No

YesYes

No

圖 31 專題製作流程圖

18

32 雙脈寬調變法之直流馬達驅動電路設計

本專題製作的雙脈寬調變法之直流馬達驅動電路設計大致可以分為二大部

分第一雙脈寬調變法之電路設計第二橋型驅動功率放大電路

雙脈寬調變〈Two Pulse Width Modulation簡稱TPWM〉之電路設計主要

是先製作一脈寬調變〈Pulse Width Modulation簡稱PWM〉波形然後再將此

波形各別經由一緩衝器〈buffer〉和反向器〈inverter〉則可產生AB驅動信號

脈波此即為TPWM

321 脈寬調變電路

如圖32先利用兩顆op產生三角波電路再利用一個比較器比較三角波

和誤差值之大小

150k

1M

20k

+12V

-12V

+12V

-12V10k

+12V

-12V

10k

+12V

-12V-

+-

+

-

+ PWMLM324

LM324

LM324

2200pF

圖 32 脈寬調變電路

〈1〉 三角波產生電路

三角波產生電路通常至少需要兩個運算放大器其電路如圖33OP1

為一個反相積分器OP2為一個史密特磁滯比較器將OP2的輸出方波經

19

OP1反相積分以後得到Vo1三角波此三角波又同時加到OP2控制其狀

態的改變

當方波產生器的輸出是正的則三角波產生器的輸出是斜向負相似

地當方波產生器的輸出是負則三角波產生器的輸出是斜向正這個動

作將產生三角波的輸出同時也輸出方波﹝9﹞

+VCC

-VCC

-

+

R1

R2

R3

+VCC

-VCC

-

+

OP1

OP2

Vo2Vo1

圖 33 三角波產生電路

對OP2而言是磁滯比較必須先找到OP2的 THV 和 TLV

232

21

32

3oo v

RRR

vRR

Rv

++

+=+ 〈31〉

當 0=+v 時

23

21 oo v

RR

v minus= 〈32〉

表要達到OP2的 0=+v 必須有這麼大的 1ov

當 12 sato Ev = 時

TLsato VERR

v =minus= 13

21 〈33〉

當 22 sato Ev minus= 時

THsato VERR

v =+= 23

21 〈34〉

20

對OP1而言是反相積分器 2ov 為其輸入 1ov 為其輸出則

tCIt

Rv

Ct

CRv

dtvCR

v oooo

11

2

11

22

111

11minus=minus=minus=minus= int 〈35〉

因為

1

2

Rvv

I o minusminus= 0=minusv 〈因為虛接地〉 〈36〉

所以

1

2

Rv

I o= 〈37〉

又因運算放大器的輸入阻抗非常大則流經 1C 的電流也為 I 相當於以定

電流對電容C 充電

當 12 sato Ev = 時 1ov 為下降斜波

tR

EC

v sato

1

1

11

1minus= 〈38〉

當 22 sato Ev minus= 時 1ov 上升斜波

( )

tRE

Cv sat

o1

2

11

1 minusminus= 〈39〉

由此可知三角波的上升與下降斜波乃因 1C 的充電與放電且時間

常數為 11CR

三角波週期分析如下

1 上升斜波的時間 1T

tCR

vv o

o1

1

21 minus= 11

2

1 CRvv

to

ominus=

1Tt = TLTHo VVv minus=1 22 sato Ev =

11111

21

sat

TLTH

sat

TLTH

EVV

CRCRE

VVT

minus=

minusminus= 〈310〉

2 下降斜波的時間 2T

tCR

vv o

o1

1

21 minus= 11

2

1 CRvv

to

ominus=

21

2Tt = THTLo VVv minus=1 12 sato Ev =

1

11111

1sat

TLTH

sat

THTL

EVV

CRCRE

VVT

minus=

minusminus= 〈311〉

3 週期 21 TTT +=

若 1satE = 2satE = satE 且3

22RR

VV TLTH =minus satE

3

2114

RR

CRT=

若R3 = nR2

則nCR

T 114=

114 CR

nf = 〈312〉

《實驗結果》

必須注意的是三角波的頻率太低將導致馬達的轉動產生脈動現象

故將工作頻率設計在1kHz以上

Ω= k1501R Ω= k102R

Ω= k203R pFC 22001 =

所得到的三角波頻率為

15kHz10220010001504

00010100020

f 12- =timestimestimestimes

timestimes

=

圖 34 三角波輸出波形

22

〈2〉 脈寬調變電路〈PWM〉

+12V

-12V

10k

+12V

-12V -

+ PWM輸出LM324三角波輸入

圖 35 脈寬調變電路

PWM系統往往連接至直流電源供應放大器的工作是以固定的頻率開

閉直流供應電壓其激發角是可以調整的因此得到波寬可調的輸出

將固定頻率的三角波與反向輸入的電壓做比較便可輸出一脈寬〈見圖

36〉反向電阻值的不同將導致反向輸入電壓不同故其輸出為一可調但

頻率固定的脈寬也正因為如此故稱為脈寬調變〈PWM〉由於輸出的

dutycycle不同故馬達將接收到不同的平均電壓因而可以藉由PWM控制

馬達的轉速

反相輸入電壓

PWM

圖 36 三角波與反相輸入電壓比較

23

PWM的優點在於馬達驅動電路的電晶體之控制信號改以脈波列來控

制使電晶體操作成類似開關的動作不是完全導通就是完全截止故電晶

體不是一直操作於作用區所以其功率消耗不大整體效率較高

《實驗結果》

圖 37 PWM 輸出波形

322 橋型驅動功率放大電路

如圖38所示主要由四個功率電晶體組成利用不同的電晶體對使直流

馬達做正逆轉控制當Q5Q8導通使馬達正轉當Q6Q7導通馬達則逆

轉電路中的電晶體扮演開關的作用

此種電路簡單只要一組直流電源供應且電晶體分擔了部份的電壓保護

電晶體迅速工作於截止與飽和狀態之間故沒有功率散逸損失之虞

但是在設計時切勿使Q5Q6同時導通以免燒毀電路上之元件因為在

AB兩脈波短暫的交變時間內由於電晶體本身之最小延遲時間有可能使Q5

Q6同時ON與Q7Q8在很短時間同時ON因此在15kHz交變下容易燒毀功

率電晶體

因此設計一間距脈波電路主要之功用使Q5Q6和Q7Q8均不同時導通

24

以拉長AB兩者交換時間

M

20k

10k

20k

10k

+24V

A 信號 B 信號

2N3055 2N3055

2N2955 2N2955

1N40021N4002

C1815 C1815

C1815 C1815

Q5

Q8Q6

Q7

圖 38 橋型驅動功率放大電路

圖 39 橋型驅動功率放大電路實體圖

25

此外若考慮電晶體BE間的電壓則電路會出現約 plusmn 06V的不感帶〈ded

band〉即電晶體的 oV 對 inV 間的關係如圖3101假使 inV 電壓為正弦波則 oV 變

成如圖3102為了改善這種缺失吾人利用兩個二極體接在電路上如圖38

用來補償電晶體BE間的壓降﹝10﹞

約06V

Dead band

Vo

Vin

圖 3101 呈現不感帶的轉移函數

圖 3102 輸出電壓波形

26

323 間距脈波產生電路

RCext15

Cext14 74123

A3

B2

Q13

CLR1

Q4

7486100k

2200pF

10k

10000pF

+5V

間距脈波輸出

圖 311 間距脈波產生電路

間距脈波的產生方式是根據脈寬調變〈PWM〉後的訊號再經由積分電路的

電阻兩端取出且經由兩倍頻器〈74LS86〉檢示出PWM的正負緣脈波最後

再利用單穩態IC〈74LS123〉將檢出信號之脈寬拉長至01ms此即為間距脈波

74LS123有兩個輸入端子A及B分別為下降波緣輸入端子及上升波緣輸入端

子當輸入A之脈波由ldquoH變成ldquoL之瞬間Q輸出變為ldquoH其持續時間長

短由RC時間常數決定反之當輸入B之脈波由ldquoL變成ldquoH之瞬間Q輸出

變成ldquoH維持一定時間

74LS123的輸出脈波之寬度是由電阻及電容之時間常數所決定概略計算公

式如下

CR045T timestimes=

電容 C 必須大於 1000pF

27

《實驗結果》

R=24kΩ C=10000pF

所以得到間距脈波為

( )msec0110810000p24k045T cong=timestimes= μ

圖 312 間距脈波

研究經分析後發現

1 間距 T 愈大愈能確保電路之安全性愈有保護作用

2 間距 T 愈大相對的使驅動信號脈波減少愈多造成馬達旋轉扭力大

大減弱

3 適當的間距 T不但不會影響馬達的輸出轉矩而且兼具保護電路的

效果

33 編碼器

轉動編碼器不只可以作為轉速的感測也能做位置的感測又適合於數位處

理故被廣泛使用若就信號來看轉動編碼器可分為增量型與絕對型若以檢

測的方式來分可分為光學式和磁式兩種在本專題中所使用的編碼器為光學式

增量型編碼器﹝11﹞

光學式轉動編碼器的原理如圖 313在附有細縫轉盤的兩側分別裝置發光元

28

件與受光元件如果只有一組光電檢測元件則輸出信號就只有一相的脈波信

號此種裝置稱為脈波產生器圖 314 為增量型轉碼器的輸出信號它是利用

兩組光電元件所產生的脈波信號A 相和 B 相間有相位差正轉時 A 相領前 B

相逆轉時 B 相領前 A 相因此利用此兩相做檢測馬達為正轉或逆轉的工作

並利用 A 相或 B 相的頻率檢測出目前的轉速

吾人計算出編碼器每一轉可以產生約 200 個脈波故檢測 A 相或 B 相其頻

率為 N則轉速應為 60200

timesN

〈rpm〉

圖 313 光學式轉動編碼器的原理圖

圖 314 編碼器的輸出信號波形

29

34 LM2917 FV 電路設計

對 LM2907 而言磁滯比較器和電流汞是構成頻率對電壓轉換的基本架構

並且預留一個運算放大器及一個電晶體供各種不同的使用圖 315 為吾人所設

計的 FV 電路圖中 C1 用以抑制電流汞動作時所產生的漣波變化正常使用時

此電容應大於 10C若 C1 太大也將造成轉換速度下降

因為單晶片 8051 之輸入電壓最高為 5V故必須設計其馬達最高轉速頻率所

轉成的電壓必須在 5V 以內由於馬達轉速頻率範圍極大故吾人給予 LM2917

+12V 的電壓以擴大它可以轉換的電壓範圍並將所需維持在 5V 內

a1

14

b1

1

a1

13

b1

2

a1

12

b1

3

a1

11

b1

4

1

a1

10

b1

5

a1

8

b1

7

a1

9

b1

6

L2917

Encoder輸 入

1uF

+12V

FV輸出1000pF

45k 10kC1

C2

圖 315 FV 電路

30

《實驗結果》

根據統計結果每 50mV 相對於 100Hz如此一來吾人想得知馬達目前

的轉速只要將單晶片所接收到的電壓值經過換算即可得知目前 encoder 所量測

的頻率吾人知道 encoder 一圈可產生 200 個脈波故馬達的轉速便可經過下列

公式換算得知

轉速〈rpm〉 60200

times=f

其中 =f encoder 所量測到的頻率

表 31 頻率與轉換電壓之關係

頻率

(Hz) 1 2 3 4 5 6 7 8 9

電壓(V) 0006 0006 0007 0008 0009 0009 0009 0009 001

頻率

(Hz) 10 20 30 40 50 60 70 80 90

電壓(V) 008 009 010 010 011 011 012 012 013

頻率

(Hz) 100 200 300 400 500 600 700 800 900

電壓(V) 013 018 023 028 033 038 043 049 054

頻率

(Hz) 1000 2000 3000 4000 5000 6000 7000 8000 9000

電壓(V) 059 109 16 209 257 304 3508 4006 45

31

圖 316 頻率對電壓曲線

35 單晶片介面電路

單晶片介面包括了二大部分分別為單晶片 8051AD converter

〈1〉8051 單晶片

為本控制系統的核心一切動作皆經由它控制

〈2〉AD converter

將類比開關所送出來的類比訊號經由 ADC 0804 轉換成數位訊號傳送

到單晶片的輸入埠

351 AD 轉換

以單晶片 8051 控制 ADC0804則單晶片 8051 必須下達ldquo開始轉換rdquo的命令

給 ADC0804然後 ADC0804 就開始讀入類比輸入端的電壓在內部開始轉換

經過一段轉換時間後〈約 100μ s〉ADC0804 就將轉換完成的值放在其內部的三

態輸出栓鎖緩衝器裡然後將轉換完成輸出腳〈INTR〉降為 low以通知單晶片

可以去讀轉換完成資料

當WR和CS 同時為ldquo0rdquo時表示對 ADC0804 下達ldquo開始轉換rdquo命令再經過

32

一段轉換時間〈100μ s〉後轉換完成ADC0804 會將其轉換完成的數位資料放

在其內部 8 位元緩衝區裡且將 INTR 降為ldquo0rdquo因此單晶片只要下達ldquo開始轉換rdquo

命令後去檢查 INTR 的狀態就可以知道是否轉換完畢其方法有兩種

1 輪詢法〈polling〉

2 中斷法〈interrupt〉

所謂輪詢法就是將 ADC0804 的 INTR接到 CPU 的一條 IO 線上然後以軟體指

令主動偵測其狀態當偵測到為ldquo0rdquo時就可以去讀出 ADC0804 裡的緩衝區的轉

換值

中斷法是一個很理想的 IO 方式因為不像輪詢法必須讓 CPU 等 ADC0804

轉換當 CPU 下達ldquo開始轉換rdquo命令後就可以做其他工作當 ADC0804 轉換完

畢後 INTR會降為ldquo0rdquo可以利用此信號去中斷 CPU再由中斷副程式去讀入

轉換值即可因此大大提高了程式的效率

當 CPU 接收到 ADC0804 發出ldquo轉換完畢rdquo的信號〈 INTR =0〉後就可以去

讀出轉換值其讀出的方法是將CS 與RD設為ldquo0rdquo即可讀到轉換值這個讀值的

動作又會使得 INTR恢復成ldquo1rdquo

1 CPU 下達ldquo開始轉換rdquo命令〈CS =0WR =0〉

2 ADC0804ldquo轉換完畢rdquo 〈 INTR =0〉

3 CPU 讀取轉換值〈 RD =0CS =0〉

4 讀完後 INTR =1

ADC0804 主要規格摘要如下

1 +5V 單電源工作電壓

2 類比電壓輸入範圍 0~+5V

33

3 參考電壓為 25V

4 轉換時間為 100μ s〈 CLKf =640kHz〉

5 解析度為 8 位元

6 誤差plusmn 1LSB

7 讀取時間 135ns

36 電源供應系統

本專題中所有電路及硬體設備所需的電源採用交流電源 110V 經由 PT-31

變壓器後再經過橋式整流後提供了直流電源而因為各個電路所需電源不同

因此製作了多組的變壓電路如下

1電壓源 DC5V選擇了 7805 的穩壓 IC 搭配電容得到了+5V 的電壓源

供〈1〉8051 微處理器 〈2〉ADC 0804 〈3〉74LS8674LS12374LS04

74LS02CD4013 〈4〉馬達 Encoder

2電壓源 DC12V使用 7812 穩壓 IC 搭配電容得到+12V 的電壓源供

LM2917 使用

3電壓源 DC24V利用 7824 的穩壓 IC 搭配電容獲得+24V 的直流電壓

源供電路之橋型驅動功率放大之電晶體使用

Vin1

+12V2

GND3

LM7812

2200uF 10000pF 2200uF 10000pF

+12V outputAC

圖 317 直流電源電路

34

圖 318 直流電源電路實體圖

37 馬達轉速的量測

表 33 PWM 輸出對應 encoder 週期

PWM dutycycle encoder 週期 PWM dutycycle encoder 週期

40 sμ 172 sμ 440 sμ 0 sμ

80 sμ 188 sμ 480 sμ 0 sμ

120 sμ 204 sμ 520 sμ 0 sμ

160 sμ 230 sμ 560 sμ 0 sμ

200 sμ 272 sμ 600 sμ 0 sμ

240 sμ 328 sμ 640 sμ 0 sμ

280 sμ 416 sμ 680 sμ 1320 sμ

320 sμ 540 sμ 720 sμ 750 sμ

360 sμ 800 sμ 760 sμ 510 sμ

400 sμ 1320 sμ 800 sμ 400 sμ

35

圖 319 PWM 輸出對應 encoder 週期

由統計可知道此馬達並不是一顆線性馬達故相信若使用模糊控制理論來

作為其回授控制系統的控制器一定能達到比傳統控制器的性能還要好而且若能

在模糊控制裡加上 PID 控制器的觀念一定能在系統的響應時間上升時間

安定時間和超越量達到最佳的控制另一方面馬達在其反方向的內阻較大需

要更大的力量才能使馬達驅動

36

第四章 軟體規劃與製作

41 PWM 之軟體設計

因為之前所介紹的硬體方式是以調整可變電阻來達到轉速的調整因此無法

得知所給予的脈寬長度和轉速大小尤其在回授時也不易給予適當的訊號來調整

轉速因此改良之方法就是以8051之軟體撰寫方式來產生固定的脈寬也就等

於給予轉速的命令而在其回授控制時也只要在內部程式给予適當的指令便可

達到脈寬長度的調整以達到閉迴路之受控系統

411 PWM 軟體流程

設定Timer0模式為0

TH0 = temp 32 TL0 = temp 32

temp = 8192 ndash j4 Key = 0

檢查是否有鍵值

將鍵值存入Key

Yes

No

設定Key值所對應的 j值

If P30 == 1Then P30 = 0 temp = 8192 ndash j4Else P30 = 1 temp=8192ndash880+j4

TH0 = temp 32 TL0 = temp 32

Start Timer0中斷副程式

啟動Timer0

等待Timer0中斷

返回主程式

圖 41 PWM 軟體設計流程圖

37

在此總共設計了五個按鈕分別代表不同的轉速停止正轉〈慢〉正轉

〈快〉逆轉〈慢〉和逆轉〈快〉使用Timer0是因為8051之計時中斷比延遲程

式來的準確故可以達到準確的計時程式設計理念中並沒有將中斷致能清除

因此Timer0會一直處於計時的狀態程式執行時將一邊檢查鍵值〈KeyStatus〉一

邊進行計時當計時完畢便呼叫中斷副程式然後執行改變Port 30的輸出狀

態若是為high則變為low反之若是為low即變為high同時並重設計時時間

Timer0繼續計時

當鍵值改變時計時的時間也會跟著改變如此一來Timer0將ㄧ直重覆上

述動作直到電源切掉Timer0才會停止計時

42 模糊控制之程式規劃與撰寫

本專題目標在完成了先前所規劃的硬體電路之後接著就是要達成利用模糊

控制理論來設計控制器在此採用了單晶片8051目的是為了以硬體實現方式來

代替電腦模擬期望能夠按照原訂計畫完成本專題「具模糊控制理論與雙脈寬調

變法之直流馬達驅動電路設計」

單晶片 8051 模糊控制的程式撰寫採下列幾個步驟依序完成

1 設定變數轉速誤差〈dspeed〉目前轉速〈sspeed〉

2 模糊化採用三角形歸屬函數採用三角形歸屬函數的原因

〈1〉 三角形函數為一連續函數

〈2〉 三角形函數為線性的函數所以計算速度較快

〈3〉 是具有發散也有收斂的函數和指數函數一樣接近

事實

3 模糊推論模糊規則將其所有可能發生情況以 IFhellipTHENhellip表示

並建立控制規則表

4 解模糊化採用重心法

38

421 歸屬函數

設定變數為目前轉速〈sspeed〉與轉速誤差〈dspeed〉因此此模糊控制器共

有兩個輸入訊號與一輸出訊號輸出訊號為脈寬長度該加或是減多少又因為有

五種不同的轉速因此各分別設計了不同的歸屬函數如下

1 當轉速 = 0

ml h

s s p e e d

d s p e e d

r p m0 5 0 1 0 0- 5 0- 1 0 0

mv l l h v h

r p m0- 3 0- 6 0- 1 0 0 3 0 6 0 1 0 0 圖 42 停止時之歸屬函數

2 正轉〈慢〉

ml hsspeed

dspeed

rpm150 225 300750

mvl l h vh

rpm150100500 200 250 300

圖 43 正轉〈慢〉之歸屬函數

39

3 正轉〈快〉

ml hsspeed

dspeed

rpm520 670 820370220

mvl l h vh

rpm500400300200 600 700 800

圖 44 正轉〈快〉之歸屬函數

4 逆轉〈慢〉

ml hsspeed

dspeed

rpm100 250 400500

mvl l h vh

rpm10050250 200 300 400 圖 45 逆轉〈慢〉之歸屬函數

40

5 逆轉〈快〉

ml hsspeed

dspeed

rpm300 450 600150

mvl l h vh

rpm450350250150 550 650 750

750

圖 46 逆轉〈快〉之歸屬函數

6 輸出

OutputMVL L H VH

rpm0-50-150-250 50 150 250

圖 47 輸出之歸屬函數

41

422 模糊規則庫

表 41 為吾人所設計的模糊控制規則庫並利用 Matlab 之 Fuzzy ToolBox 來

建立此規則庫以進行模擬推論圖 48 為當馬達輸入指令為正轉慢時推論後所得

到的三維空間圖

表 41 模糊控制規則表

Dspeed

vl l m h vh

l H M L VL VL

m VH H M L VL sspeed

h VH VH H M L

圖 48 推論後的三維空間圖

42

423 模糊控制器之軟體設計流程

Start 外部中斷副程式

ADCWR = 0 ADCWR = 1

〈令AD開始轉換〉

檢查鍵值以得到對應的歸屬函數

取得目前轉速與

轉速誤差

Fuzzy Rules決策

得到輸出訊號

Delay 10ms

ADC = 0 讀取AD值 ADCRD = 0

將AD值換算成轉速

ADCWR = 0 ADCWR = 1

〈AD開始轉換〉

返回主程式

致能外部中斷

圖 49 Fuzzy Controller 程式流程圖

當控制器一開始動作時便先執行AD轉換的工作當AD轉換完成時其

INTR的接腳便會觸發8051的外部中斷INTR0於是程式便發生外部中斷執行

外部中斷副程式的指令

43

在外部中斷副程式中AD將ㄧ直進行轉換與讀取的工作同時並將轉換後

的值直接換算成目前轉速與轉速誤差以供模糊控制器使用換算目前encoder

的頻率其公式為

160-V2000 times=頻率 〈4-1〉

式4-1之公式是根據表31所導出來的其中V為encoder之頻率轉成電壓之值

又假設所讀取的AD轉換值為value因為

AD的解析度 = bit256

5V+ = 511 ( Vbit ) 〈4-2〉

故value值與電壓V之關係為

511 value V times= 〈4-3〉

所以encoder之頻率與value值的關係為

頻率= 2000times ⎟⎠⎞

⎜⎝⎛ times

511 value - 160 〈4-4〉

故目前轉速為

sspeed = ( )rpm 60 200

times頻率 〈4-5〉

另ㄧ方面在主程式中程式會先去檢查鍵值也就等於檢查輸入指令以

找出符合使用的歸屬函數並將AD所獲得的轉速對應到歸屬函數中然後執行

決策判斷即進入規則庫中尋找出適當的決策判斷最後將此決策送入PWM程

式裡進行脈寬長度的調整使馬達在合理的要求下達到理想的轉速控制不會

因為外在環境的影響而使馬達轉速受到干擾

43 LCD 顯示轉速

此專題最後再增加一LCD顯示幕以顯示目前的轉速否則在程式設計完成

後人卻因無法以肉眼得知目前轉速而不能肯定馬達轉速是否有達到控制的目

標因此增加一顯示幕LCD是有必要的不僅隨時得知目前的轉速還能知道

44

設計出來的軟體其控制性是否夠好夠穩定

431 LCD 顯示幕之軟體流程

Start

設定LCD模組的初始狀態

設定外部中斷INTR0

與Timer0

設定TH0 = (65536 ndash 5000) 256 TL0 = (65536 ndash 5000)256

令ADCWR = 0 ADCWR = 1 AD開始轉換

等待中斷

外部中斷副程式

ADCRD = 0 讀取AD值 ADCRD = 1

將AD值換算成速度

ADCWR = 0 ADCWR = 1 AD開始轉換

Timer0中斷副程式

顯示LCD第一行

ldquoMotor Speed =

顯示LCD第二行ldquoxxxxxxx rpm其中 xxxxxx為外部中斷副程式所換算出的轉速

重設TH0與TL0

返回主程式返回主程式

圖 410 LCD 顯示幕之程式流程圖

此程式主要由兩個部分完成一為外部中斷副程式另ㄧ為 Timer0 中斷副

程式當主程式完成外部與 Timer0 兩個中斷的設定後隨即命令 AD 開始轉換

之後便一直停在 while〈1〉的迴圈裡不做任何動作而由兩個中斷副程式來完

成整個轉換與顯示的工作

45

外部中斷副程式主要負責 AD 的轉換讀取與轉速換算的工作AD 第一

次的轉換由主程式來下達命令當轉換完成後AD 的 INTR 接腳將觸發外部中

斷〈INTR0〉副程式此時程式便進入外部中斷副程式執行讀取 AD 值與轉速

換算的工作當這些工作完成時外部中斷副程式再次下達 AD 開始轉換的命

令而離開中斷副程式當 AD 再次轉換完成時又將再次執行中斷副程式

如此週而復始中斷副程式將ㄧ直進行讀取換算與轉換的工作

而 Timer0 中斷副程式主要負責 LCD 顯示之工作當主程式所設定的計時時

間計數完時程式便進入 Timer0 中斷副程式一旦進入 Timer0 中斷副程式程

式將執行 LCD 的顯示然後再重設 Timer0 的計數時間Timer0 將重新計數當

計數完時程式又將再度進入 Timer0 中斷副程式執行因為程式中並無清除

Timer0 的中斷致能故 Timer0 中斷副程式和外部中斷副程式ㄧ樣週而復始的

執行其副程式的工作

46

第五章 結論

本計劃主旨為具模糊控制理論與雙脈寬調變法之直流馬達驅動電路設計主

要是針對傳統電路設計之缺點提出改良之方法以TPWM取代PWM電路以模

糊理論基礎設計之控制器替代傳統PID控制器

TPWM轉速控制優於PWM之處在於

1 TPWM只需使用單電源即可達到正轉和逆轉的轉速控制而PWM必須

加上逆向開關或是雙電源才能使馬達產生正轉和逆轉

2 TPWM可控制馬達處於停止狀態無論在正向或逆向加上負載皆無法使

馬達產生轉動

3 馬達消耗定額功率輸出轉矩為額定值

4 馬達由停止到某定轉速時反應時間較快

模糊控制器優於PID控制器

1 不須導出繁雜的數學模型

2 適用於非線性系統

3 強健性與容錯性較高

本專題至此雖說大致的目標都已達到但是此系統仍然有許多不完美而需要

改進的地方例如在實驗過程中發現整個轉速的控制在回授上其反應時間

有點慢探討其原因有可能是控制器之程式上的問題

1 因為使用C語言撰寫程式故其執行速度較慢

2 程式可能寫的太累贅

3 模糊控制規則庫建立不良

若想改善這些問題可以嘗試著將C語言改為組合語言來撰寫並盡量減少

47

不必要的指令相信此動作一定能大大提昇程式的執行速度其次就是多做測

試利用測試中所學到的經驗來幫助模糊控制規則庫的改寫同時也能從測試中

發現更多的問題若是都能對問題加以一一解決的話相信必定能將此控制系統

做的更盡善盡美

48

參考文獻

﹝1﹞ 李適中直流馬達速度控制伺服控制〈基礎篇〉全華科技圖書股份有

限公司民 74

﹝2﹞ 廖錦文ldquo直流電動機之雙脈寬調變是〈TPWM〉驅動電路研究電

子技術月刊第 69 期pp94-1021992

﹝3﹞ 楊英魁孫宗瀛鄭魁香林建德蔣旭堂模糊控制理論與技術全華

科技圖書股份有限公司民 85

﹝4﹞ 林敦煌陳憬德直流馬達定位及轉速的模糊控制逢甲大學自動控制工

程學系學士論文民 87

﹝5﹞ LAZadehldquo Fuzzy Sets Information and Control Vol8 pp338-353

1965

﹝6﹞ EHMamdani and SAsslianldquo A fuzzy logic controller for a dynamic

plant Internation Journal of Man-Machine Studies Vol7 pp1-13 1975

﹝7﹞ 孫宗瀛楊英魁Fuzzy 控制理論實作與應用全華科技圖書股份有

限公司民 83 年

﹝8﹞ 許中平黃煌嘉直流電動機控制電路設計全華科技圖書股份有限公司

民 75

﹝9﹞ 盧明智黃敏祥OP Amp 應用+實驗模擬全華科技圖書股份有限公司

民 83

﹝10﹞陳文耀電動機控制工程復文書局2003

﹝11﹞許中平林全福電動機運轉控制技術全華科技圖書股份有限公司民

77

﹝12﹞楊明豐8051 單晶片 C 語言設計實務碁峯資訊2003 年

﹝13﹞蔡朝洋單晶片微電腦 80518951 原理與應用全華科技圖書股份有限公

司民 91

49

﹝14﹞王文俊認識 Fuzzy全華科技圖書股份有限公司民 90

50

附錄 A 專題硬體展示圖

圖 A-1 硬體整體圖

圖 A-2 硬體整體鳥瞰圖

51

圖 A-3 硬體側視圖

圖 A-4 操作與顯示面板

圖 A-5 間距脈波電路與 FV 電路

52

圖 A-6 橋型驅動功率放大電路

圖 A-7 操作與控制面板

53

附錄 B PWM 與模糊控制之程式

include reg51h include stdioh sbit ADCRD = P3^1 設定 RD 控制線接腳為 P31 sbit ADCWR = P3^3 設定 WR 控制線接腳為 P33 sbit P2_0 = 0xA0 接腳定義 sbit P2_1 = 0xA1 接腳定義 sbit P3_0 = 0xB0 接腳定義 sbit P3_1 = 0xB1 接腳定義 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P3_6 = 0xB6 接腳定義 void KeyStatus(void) 函數原型宣告 void feedback(void) 函數原型宣告 void compute_grade(void) 函數原型宣告 void delay1ms(int count) 函數原型宣告 void convert() 函數原型宣告 void condition() 函數原型宣告 void CW(void) 函數原型宣告 int j i 對應 PWM 的寬度 unsigned int temp 所設計的計時器時間 int sample = 1000 取樣率設定消除顯示值跳動 long int value r1 讀取 ADC0804 數位資料 long int set n condition select long int r grade_reg[2] grade[15] error1 error2 long int a1 b1 I long int membership[5][3]membership1[3][3] 定義歸屬函數 long int membership2[3][3] = -10-50-5050510 long int error[2] int Rule[15][3] = 113213313 定義判斷規則庫 212223323 311232333 411241342 511251351

54

main() 主程式 j = PWM = 110 設定 PWM 初始值 IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x00 設定計時器 0 工作於模式 0 temp=8192-j4 設定計時器 0 初值 TH0 = temp 32 TL0 = temp 32 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 P3_4 = 1 P3_5 = 0 P3_6 = 0 ADCWR = 0 令 ADC0804 的 WR = 0 ADCWR = 1 令 ADC0804 的 WR = 1 while (1) KeyStatus() 檢查鍵值 void KeyStatus(void) 檢查鍵值並給對應的 PWM 值 char KeyScan(void) 按鍵掃描函數宣告 unsigned char KeyStatus unsigned char Key = 0 KeyStatus=KeyScan() 呼叫按鍵掃描函數 if (KeyStatus = 0) 已有按鍵輸入 Key = KeyStatus Key = 鍵值 if (Key == 0x01) 假如輸入為按鍵 1 i = 110 PWM 為 110us j = i P3_4 = 1 LED 亮第一顆〈表馬達停止〉 P3_5 = 0 P3_6 = 0

55

else if (Key == 0x02 ) 假如輸入為按鍵 2 i = 140 PWM 為 140us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x04 ) 假如輸入為按鍵 3 i = 180 PWM 為 180us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x08 ) 假如輸入為按鍵 4 i = 80 PWM 為 80us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 else if (Key == 0x10 ) 假如輸入為按鍵 5 i = 40 PWM 為 40us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 PWM = j delay1ms(10) 呼叫延遲函數 feedback() 模糊控制判斷

56

void To_int(void) interrupt 1 Timer0 中斷函數 if (P3_0 == 0) 假如 PWM 輸出為 Low P3_0 = 1 變更 PWM 輸出為 High temp=8192-j4 設定 High 的時間 else 若 PWM 輸出為 High P3_0 = 0 變更 PWM 輸出為 Low temp=8192-880+j4 設定 Low 的時間 TH0 = temp 32 Timer0 的計時時間 TL0 = temp 32 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 char KeyScan(void) 檢查鍵值 char KeyStatus 按鍵狀態 P0=0xff 設定 P0 為輸入模式 KeyStatus=~P0 讀取按鍵狀態 return(KeyStatus) 將鍵值送回程式 void feedback(void) 模糊判斷 void Fuzzycontroller() 函數原型宣告 void condition1() 函數原型宣告

57

void condition2() 函數原型宣告 error1 = ((value)40-160)03 輸入變數 1 delay10ms(10) 延遲 10ms error2 = ((value)40-160)03 輸入變數 2 if (key == 0x01 ) 當按鍵 1找出對應的歸屬函數 並做出模糊控制判斷

int membership[5][3]= -100-60-30-60-300-30030030603060100

int membership1[3][3]=-100-500-50050050100 Fuzzycontroller() condition() if (key == 0x02 ) 當按鍵 2找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

05010050100150100150200150200250200250300 int membership1[3][3]=07515075150225150225300 Fuzzycontroller() condition() else if (key == 0x04) 當按鍵 3找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

200320400300400500400500600500600700600700800 int membership1[3][3]=220370520370520670520670820 Fuzzycontroller() condition() else if (key == 0x08) 當按鍵 4找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

02550255010050100200100200300200300400 int membership1[3][3]=05010050100250100250400 Fuzzycontroller() condition()

58

else if (key == 0x10) 當按鍵 5找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

150250350250350450350450550450550650550650750 int membership1[3][3]=150300450300450600450600750 Fuzzycontroller() condition2() void Fuzzycontroller() 模糊控制判斷 void compute_grade() 函數原型宣告 void compute_grade1() 函數原型宣告 a1 = 0 b1 = 001 I = 0 for (n=0 nlt=14 n++) r = error1 set = Rule[n][0]-1 compute_grade() 計算輸入變數 1 與

模糊程度的歸屬函數 condition = 1 r = error2 set = Rule[n][1]-1 compute_grade1() 計算輸入變數 2 與 模糊程度的歸屬函數 grade[n] = MIN(grade_reg[0] grade_reg[1]) a1 = a1 + (grade[n]membership2[Rule[n][2]-1][1]) b1 = b1 + grade[n] I = a1 b1 得到模糊控制判斷的結果 void compute_grade() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership[set][0]) || (r gt membership[set][2])) 當輸入變數不在 歸屬函數內

59

grade_reg[condition] = 0 else if ((r gt membership[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership[set][2]-r) (membership[set][2] - membership[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership[set][0]) (membership[set][1] - membership[set][0]) void compute_grade1() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership1[set][0]) || (r gt membership1[set][2])) 當輸入變數不在 歸屬函數內 grade_reg[condition] = 0 else if ((r gt membership1[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership1[set][2]-r) (membership1[set][2]-membership1[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership1[set][0]) (membership1[set][1]-membership1[set][0])

60

void condition() P2_0 = 1 設定 P20 為輸入模式 P2_1 = 1 設定 P21 為輸入模式 if ( (P2_0 == 1) ampamp (P2_1 == 0)) 當馬達為正轉時 if ( I gt 0 ) 若模糊判斷結果為正 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 若模糊判斷結果為零 PWM = PWM + 0 PWM 寬度不變 if ( I lt 0 ) 若模糊控制結果小於零 PWM = PWM + 1 PWM 寬度加 1 else if ( (P2_0 == 0) ampamp (P2_1 == 1) ) 若馬達為反轉 if ( I lt 0 ) 模糊控制小於零 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 模糊控制等於零 PWM = PWM + 0 PWM 寬度不變 if ( I gt 0 ) 模糊控制大於零 PWM = PWM + 1 PWM 寬度加 1 CW() 判斷 PWM 寬度上下限

61

void CW() 判斷 PWM 寬度上下限 if ( PWM gt= 215 ) 若 PWM 寬度 gt= 最大寬度 j = 215 PWM 寬度維持於 215us if ( PWM lt= 5 ) 若 PWM 寬度 lt= 最小寬度 j = 5 PWM 寬度維持在 5us if ( PWM gt 5 ampamp PWM lt 215 ) PWM 寬度介於最大與最小間 j = PWM PWM 依模糊控制判斷結果增減 void delay1ms(int count) 延遲 1ms int x y for ( x = 0 x lt count x++ ) for ( y = 0 y lt 122 y++ ) void convert() 數位資料換算成馬達轉速 r1 = ((value)40)-160

62

附錄 C LCD 顯示之程式

includereg51h 含 8051 所有暫存器宣告 include mathh define RS P3_5 LCD 指令資料選擇控制 define RW P3_4 LCD 讀寫控制腳 define Enable P3_3 LCD 致能接腳 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P0_0 = 0x80 接腳定義 sbit P0_1 = 0x81 接腳定義 sbit P0_2 = 0x82 接腳定義 sbit P0_3 = 0x83 接腳定義 sbit P0_4 = 0x84 接腳定義 sbit P0_5 = 0x85 接腳定義 sbit P0_6 = 0x86 接腳定義 sbit ADCRD = P3^7 設定 RD 控制線接腳為 P37 sbit ADCWR = P3^6 設定 WR 控制線接腳為 P36 void delay(void) 函數原型宣告 void delay10ms(int count) 函數原型宣告 void display(void) 函數原型宣告 void InitialLCD(void) 函數原型宣告 void WriteIns(char) 函數原型宣告 void WriteData(char) 函數原型宣告 void WriteString(charchar) 函數原型宣告 void CheckBusy(void) 函數原型宣告 void convert(void) 函數原型宣告 char MSG0[] = Motor Speed = 定義字串 MSG0 char MSG2[] = rpm 定義字串 MSG2 unsigned char MSG1[8]=0000000 定義字串 MSG1 unsigned long int value 讀取 ADC0804 數位資料 int sample = 1000 取樣率設定消除顯示值跳動 long int rpm

63

main() 主程式 InitialLCD() 初始化 LCD IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x01 設定計時器 0 工作於模式 1 TH0 = (65536-5000)256 設定計時器 0 初值 TL0 = (65536-5000)256 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 while(1) 等待中斷 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 while (--sample == 0) 取樣率減 1 sample = 1000 重設取樣率 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 void T0_int(void) interrupt 1 LCD 顯示動態掃描 display() 動態掃描顯示 TH0 = (65536-65535)256 重設計時初值 TL0 = (65536-65535)256

64

void InitialLCD(void) 設定 LCD 模組初始狀態 delay() 延遲函數 WriteIns(0x38) 設定 LCD 模組為 WriteIns(0x38) 2 行顯示 WriteIns(0x38) 8 位元介面 WriteIns(0x38) 5x7 點字型 WriteIns(0x08) 關閉顯示器 WriteIns(0x01) 清除 LCD 螢幕 WriteIns(0x0c) 令顯示器 ON但游標不顯示 WriteIns(0x06) 令 LCD 模組每接收到 1Byte 資料 AC 值自動加 1 void display() 掃描顯示 WriteIns(0x80) 設定 LCD 座標 WriteString(13MSG0) 將字串 MSG0 寫入 LCD 中 WriteIns(0xc0) 設定 LCD 座標 WriteString(8MSG1) 將字串 MSG1 寫入 LCD 中 WriteIns(0xc8) 設定 LCD 座標 WriteString(4MSG2) 將字串 MSG2 寫入 LCD 中 void convert(void) 換算轉速 long int freq freq = ((value)4000) - 16000 數位資料換成頻率公式 rpm = freq3 頻率換算轉速公式 MSG1[0] = (rpm1000000)+0x30 將結果存入字串 MSG1 中 MSG1[1] = ((rpm1000000)100000)+0x30 MSG1[2] = ((rpm100000)10000)+0x30 MSG1[3] = ((rpm10000)1000)+0x30 MSG1[4] = 0x2e MSG1[5] = ((rpm1000)100)+0x30 MSG1[6] = ((rpm100)10)+0x30 MSG1[7] = rpm10+0x30

65

void WriteIns(char instruction) 寫命令至 LCD 中 RS = 0 選擇指令暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = instruction 輸出命令至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteData(char i) 寫資料至 LCD 中 RS = 1 選擇資料暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = i 輸出資料至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteString(countMSG) 寫字串至 LCD 中 char count 字串長度 char MSG[] 字串資料 char i 定義位元組變數 for(i=0 iltcount i++) count 個位元組 WriteData(MSG[i]) 寫入一位元組的資料至 LCD 中 void CheckBusy(void) char i=0x80 檢查忙碌旗標 while(iamp0x80) 忙錄旗標 BF = 1 RS = 0 選擇指令暫存器 RW = 1 讀取 Enable = 1 致能 LCD i = P2 讀取 LCD 指令暫存器內的資料

66

Enable = 0 除能 LCD delay() 延遲函數 void delay() 延遲 5ms int i for(i=0 ilt250 i++)

  • 畢業專題封面pdf
  • File0004pdf
  • 最終版pdfpdf
Page 18: Based on Fuzzy Control Theorem and TPWM Method for DC ... · 使吾人想設計一模糊控制器來做為馬達轉速的閉迴路控制,以解決非線性系統的 問題。除此之外,flcs

9

圖 23 三角型歸屬函數

〈3〉梯型歸屬函數

梯型歸屬函數可由四個參數加以決定

=Aμ trapezoid(xabcd)

⎪⎪⎪⎪

⎪⎪⎪⎪

leleminusminus

ltle

ltleminusminus

=

other

dxcdcdx

cxb

bxaabax

0

1 〈23〉

圖 24 梯型歸屬函數

10

214 模糊推論與模糊規則

模糊推論〈fuzzy inference〉是根據知識庫保存的規則(rule)和給予的事實

推導出新的結論與傳統推論不同的地方是Fuzzy推論不只可以處理明確命題也

可以處理Fuzzy命題Fuzzy推論是依據近似推理〈approximate reasoning〉的概念

發展出來的比傳統推論的嚴正推理〈exact reasoning〉更合理也更具彈性近

似推理是兩種嚴正推理General Modus Ponens〈簡稱GMP〉及Genera Modus

Tollens〈簡稱GMT〉的一般化此原理是從傳統二值邏輯中的肯定律〈modus

ponens〉和否定律〈modus tollens〉推廣而來其中GMP又可稱為前向推理而

GMT則可稱為反向推理

〈1〉 GMP〈General Modus Ponens〉

規則IF x is A THEN y is B

事實x is Arsquo

結論y ix Brsquo 〈24〉

〈2〉 GMT〈General Modus Tollens〉

規則IF x is A THEN y is B

事實y is Brsquo

結論x is Arsquo 〈25〉

上式中IF x is A THEN y is B即為模糊規則〈fuzzy rules〉AArsquoBBrsquo

分別是定義在論域X及Y的模糊集合xy代表輸入變數及輸出變數的語言變數

一般來說「x is A」稱為前件部〈antecedent〉而「Y is B」則稱為後件部

〈consequence〉Fuzzy知識庫〈Fuzzy Knowledge Base簡稱FKB〉即由這些模

糊規則所組成的規則庫〈rule base〉和存放描述領域知識的Fuzzy變數及語言變數

的資料庫〈data base〉所組成所以FKB是用來描述受控對象所涉及的領域知

11

識和操控目標的一些定性及定量的資訊模糊知識庫和模糊推論是構成Fuzzy規

則系統核心的兩個重要部門﹝7﹞

模糊推論是模糊系統的核心根據知識庫的模糊法則進行模糊理論的合成運

算來模擬人類的思考決策模式一般來說規則的建立是採取十分主觀直覺的

方式依據相關領域專家的經驗與知識透過詢問進而將其知識經驗歸納條列出

重點再轉換成模糊規則的形式表現出來但是並非所有的專家或操作員都能

將自身的經驗知識以言詞的方式充分的表達出來且未必能整理成條列的模糊規

則所以知識規則的萃取工作往往是在建構模糊系統時最常遭遇到的困難之

215 模糊控制器

模糊控制是智慧型控制〈intelligent control〉系統的一種典型其基本特點

是不完全依賴受控對象的數學模型主要是利用人的操作經驗知識和推理技

術以及控制系統的某些訊息和性能得出對應的控制動作模糊控制是以並行

〈parallel〉方式處理規則的推理工作〈如圖25〉其近似推理會包容每個對操

控系統有貢獻的規則即使某些貢獻程度很小的規則也不會忽略

圖 25 模糊控制系統的構造

12

一個控制器的輸入通常是確定數值而非模糊輸出也是如此才能對被控對象

發生作用但是模糊邏輯控制器〈Fuzzy Logic Controller簡稱FLC〉則是以語

言化的控制規則為主體為了能夠把輸入的確定值與語言化之後的控制規則結

合必須把輸入的確定值模糊化〈fuzzification〉以便對應到FLC語言變數的論

域範圍中同樣的經過規則庫推理出來的結果是對應到輸出語言變數的論域

中所以也必須對其做解模糊化〈defuzzification〉的工作才能達成實際的控制

目標

一般模糊控制器的架構包含了五個主要部分定義變數模糊化知識庫

模糊推論及解模糊化

〈1〉 定義輸入及輸出變數

決定程序被觀察的狀況及考慮控制的動作輸入變數可以是擷取

自受控系統的觀測量也可以是推導出來的資料輸出變數則為操控

受控系統的操作量例如在一般控制問題上輸入變數通常為輸出

誤差e與輸出誤差之變化率e而控制變數則為下一個狀態之輸入

u其中eeu統稱為模糊變數

〈2〉 模糊化

將量測值轉換為語言變數的過程將外界所輸入的確定數值經由

一比例映射傳送到輸入變數所對應的模糊論域然後再利用模糊化

函數將此輸入資料轉換成適當的口語值以供模糊運算使用此口語

化變數稱之為模糊子集合

〈3〉 知識庫

模糊知識庫是模糊控制的依據由它來定義所有使用到的語言控

制法則及相關各項參數知識庫可說是整個控制系統資料核心其包

含了兩個部分資料庫〈data base〉與規則庫〈rules base〉

1 資料庫

提供處理模糊數據之相關定義資料庫所存放的資料是關

13

於如何將明確的資料轉換成模糊數值而資料的存放方式是以

歸屬函數表示該選用哪一種歸屬函數依實際的需要選定

以三角形歸屬函數最常被使用因其運算最為容易且又能充分

的表達模糊概念

2 規則庫

利用語言化的條件式控制規則描述控制目標和策略通常

控制規則可以由操控人員的經驗或專家的知識推導出來多個

控制規則所組成的集合就是規則庫

〈4〉 模糊推論

模糊推論為模糊控制最重要的核心其最主要的工作就是做實際

的決策過程處理模糊推論具有模擬人類做決策判斷的能力其基本

理論就是根據人類特有的近似推理方式如之前已說明的GMP和

GMTGMP為前向推理而GMT為逆向推理因為模糊推論為前向

運算因此GMP非常適合使用為模糊控制的推論機構

〈5〉 解模糊化

將推論完成所得到的模糊輸出量轉換成實際的明確數值以便和

外界溝通解模糊化的方法有很多例最大歸屬度法重心法高

度法面積法等

圖 26 模糊系統的基本架構

14

22 直流馬達數學模型

圖27為直流馬達等效電路簡圖其中

iV = 輸入電壓 ai = 電樞電流

zR = 電樞電阻 gT = 轉矩

aL = 電樞電感 bE = 反電動勢

φ = 空氣隙磁通量 ω = 轉子角速度

B = 黏滯摩擦係數 J = 轉動慣量

圖 27 直流馬達等效電路簡圖

由克希荷夫電壓定律知

( ) ( ) ( )tEdt

tdiLtiRV b

aaaai ++= 〈26〉

由於反電動勢 bE 與轉軸的角速度 ( )tω 及空氣隙磁通量φ之乘積成正比即

( ) ( ) ( )tKtKtE emb ωφω == 〈27〉

15

又轉矩的平衡方程式為

( ) ( ) ( )dt

tdJtBtTgωω += 〈28〉

且馬達轉矩 gT 與電樞電流 ( )tia 及空氣隙磁通量φ乘積成正比即

( ) ( ) ( )tiKtiKtT ataag == φ 〈29〉

取〈26〉~〈29〉式之拉氏變換得

( ) ( ) ( ) ( )sEssILsIRsV baaaai ++= 〈210〉

( ) ( )sKsE eb Ω= 〈211〉

( ) ( ) ( )sJssBsTg Ω+Ω= 〈212〉

( ) ( )sIKsT atg = 〈213〉

則馬達輸入電流與轉速為

( ) ( ) ( )( ) ( )( )

sR

sEsV

sLRsEsV

sIe

a

bi

aa

bia τ+

minus

=+minus

=1

〈214〉

( ) ( ) ( )

sB

sT

sJBsT

sm

gg

τ+=

+=Ω

1 〈215〉

其中a

ae R

L=τ 為電樞電流的電氣時間常數 BJ

m =τ 為馬達轉動的機械時間

常數

直流馬達轉速對輸入電壓的轉移函數 ( )sG 為

( ) ( )( ) ( )( ) etaa

t

i KKBJsRsLK

sVssG

+++=

Ω=

( )( ) etmea

t

KKssBRK

+++=

ττ 11 〈216〉

16

在一般情況電樞電感很小所以 eτ 可以忽略不計因此上式成為一階落後

方程式

( ) ( )( ) ( ) m

m

etma

t

i sTK

KKsBRK

sVssG

+=

++=

Ω=

11 τ 〈217〉

其中

eta

mam KKBR

BRT

+=

τ

eta

tm KKBR

KK

+=

所以直流馬達數學模式可以以圖28表之﹝8﹞

圖 28 直流馬達數學模式方塊圖

17

第三章 系統功能分析與製作規劃

31 專題製作流程

如圖 31 所示本專題主要分為兩條路徑進行一為硬體另一則為軟體程

式撰寫本章著重硬體的規劃設計軟體則在第四章中介紹在完成 AB 信號

產生電路驅動功率放大電路與間距脈波產生電路設計與製作後須先接上馬達

做一連串的測試〈此時系統並無回受控制〉測試間距脈波是否太長或太短硬

體電路是否有缺失hellip等等另一方面也著手撰寫模糊控制程式並將其與硬體電

路結合最後做閉迴路系統的整合測試若發現系統的運作結果並不如預期

則需分別從硬體與軟體兩方面去改良

直流馬達轉速之模糊控制

文獻蒐集與整理

AB信號產生電路設計與製作

驅動功率放大電路設計與製作

間距脈波產生電路設計與製作

測試間距脈波是否太長或太短

系統測試測試馬達轉速是否

達到控制目的

結束與論文寫作

重新設計間距脈波長度

Yes

No

系統整合與修正

輸出信號與Fuzzy控制器之連結設計

規劃輸出與輸入歸屬函數

規劃模糊知識庫

撰寫主程式並加入模糊知識庫

程式編譯及連結

軟硬體整合測試馬達是否運作

程式調整及最佳化

No

YesYes

No

圖 31 專題製作流程圖

18

32 雙脈寬調變法之直流馬達驅動電路設計

本專題製作的雙脈寬調變法之直流馬達驅動電路設計大致可以分為二大部

分第一雙脈寬調變法之電路設計第二橋型驅動功率放大電路

雙脈寬調變〈Two Pulse Width Modulation簡稱TPWM〉之電路設計主要

是先製作一脈寬調變〈Pulse Width Modulation簡稱PWM〉波形然後再將此

波形各別經由一緩衝器〈buffer〉和反向器〈inverter〉則可產生AB驅動信號

脈波此即為TPWM

321 脈寬調變電路

如圖32先利用兩顆op產生三角波電路再利用一個比較器比較三角波

和誤差值之大小

150k

1M

20k

+12V

-12V

+12V

-12V10k

+12V

-12V

10k

+12V

-12V-

+-

+

-

+ PWMLM324

LM324

LM324

2200pF

圖 32 脈寬調變電路

〈1〉 三角波產生電路

三角波產生電路通常至少需要兩個運算放大器其電路如圖33OP1

為一個反相積分器OP2為一個史密特磁滯比較器將OP2的輸出方波經

19

OP1反相積分以後得到Vo1三角波此三角波又同時加到OP2控制其狀

態的改變

當方波產生器的輸出是正的則三角波產生器的輸出是斜向負相似

地當方波產生器的輸出是負則三角波產生器的輸出是斜向正這個動

作將產生三角波的輸出同時也輸出方波﹝9﹞

+VCC

-VCC

-

+

R1

R2

R3

+VCC

-VCC

-

+

OP1

OP2

Vo2Vo1

圖 33 三角波產生電路

對OP2而言是磁滯比較必須先找到OP2的 THV 和 TLV

232

21

32

3oo v

RRR

vRR

Rv

++

+=+ 〈31〉

當 0=+v 時

23

21 oo v

RR

v minus= 〈32〉

表要達到OP2的 0=+v 必須有這麼大的 1ov

當 12 sato Ev = 時

TLsato VERR

v =minus= 13

21 〈33〉

當 22 sato Ev minus= 時

THsato VERR

v =+= 23

21 〈34〉

20

對OP1而言是反相積分器 2ov 為其輸入 1ov 為其輸出則

tCIt

Rv

Ct

CRv

dtvCR

v oooo

11

2

11

22

111

11minus=minus=minus=minus= int 〈35〉

因為

1

2

Rvv

I o minusminus= 0=minusv 〈因為虛接地〉 〈36〉

所以

1

2

Rv

I o= 〈37〉

又因運算放大器的輸入阻抗非常大則流經 1C 的電流也為 I 相當於以定

電流對電容C 充電

當 12 sato Ev = 時 1ov 為下降斜波

tR

EC

v sato

1

1

11

1minus= 〈38〉

當 22 sato Ev minus= 時 1ov 上升斜波

( )

tRE

Cv sat

o1

2

11

1 minusminus= 〈39〉

由此可知三角波的上升與下降斜波乃因 1C 的充電與放電且時間

常數為 11CR

三角波週期分析如下

1 上升斜波的時間 1T

tCR

vv o

o1

1

21 minus= 11

2

1 CRvv

to

ominus=

1Tt = TLTHo VVv minus=1 22 sato Ev =

11111

21

sat

TLTH

sat

TLTH

EVV

CRCRE

VVT

minus=

minusminus= 〈310〉

2 下降斜波的時間 2T

tCR

vv o

o1

1

21 minus= 11

2

1 CRvv

to

ominus=

21

2Tt = THTLo VVv minus=1 12 sato Ev =

1

11111

1sat

TLTH

sat

THTL

EVV

CRCRE

VVT

minus=

minusminus= 〈311〉

3 週期 21 TTT +=

若 1satE = 2satE = satE 且3

22RR

VV TLTH =minus satE

3

2114

RR

CRT=

若R3 = nR2

則nCR

T 114=

114 CR

nf = 〈312〉

《實驗結果》

必須注意的是三角波的頻率太低將導致馬達的轉動產生脈動現象

故將工作頻率設計在1kHz以上

Ω= k1501R Ω= k102R

Ω= k203R pFC 22001 =

所得到的三角波頻率為

15kHz10220010001504

00010100020

f 12- =timestimestimestimes

timestimes

=

圖 34 三角波輸出波形

22

〈2〉 脈寬調變電路〈PWM〉

+12V

-12V

10k

+12V

-12V -

+ PWM輸出LM324三角波輸入

圖 35 脈寬調變電路

PWM系統往往連接至直流電源供應放大器的工作是以固定的頻率開

閉直流供應電壓其激發角是可以調整的因此得到波寬可調的輸出

將固定頻率的三角波與反向輸入的電壓做比較便可輸出一脈寬〈見圖

36〉反向電阻值的不同將導致反向輸入電壓不同故其輸出為一可調但

頻率固定的脈寬也正因為如此故稱為脈寬調變〈PWM〉由於輸出的

dutycycle不同故馬達將接收到不同的平均電壓因而可以藉由PWM控制

馬達的轉速

反相輸入電壓

PWM

圖 36 三角波與反相輸入電壓比較

23

PWM的優點在於馬達驅動電路的電晶體之控制信號改以脈波列來控

制使電晶體操作成類似開關的動作不是完全導通就是完全截止故電晶

體不是一直操作於作用區所以其功率消耗不大整體效率較高

《實驗結果》

圖 37 PWM 輸出波形

322 橋型驅動功率放大電路

如圖38所示主要由四個功率電晶體組成利用不同的電晶體對使直流

馬達做正逆轉控制當Q5Q8導通使馬達正轉當Q6Q7導通馬達則逆

轉電路中的電晶體扮演開關的作用

此種電路簡單只要一組直流電源供應且電晶體分擔了部份的電壓保護

電晶體迅速工作於截止與飽和狀態之間故沒有功率散逸損失之虞

但是在設計時切勿使Q5Q6同時導通以免燒毀電路上之元件因為在

AB兩脈波短暫的交變時間內由於電晶體本身之最小延遲時間有可能使Q5

Q6同時ON與Q7Q8在很短時間同時ON因此在15kHz交變下容易燒毀功

率電晶體

因此設計一間距脈波電路主要之功用使Q5Q6和Q7Q8均不同時導通

24

以拉長AB兩者交換時間

M

20k

10k

20k

10k

+24V

A 信號 B 信號

2N3055 2N3055

2N2955 2N2955

1N40021N4002

C1815 C1815

C1815 C1815

Q5

Q8Q6

Q7

圖 38 橋型驅動功率放大電路

圖 39 橋型驅動功率放大電路實體圖

25

此外若考慮電晶體BE間的電壓則電路會出現約 plusmn 06V的不感帶〈ded

band〉即電晶體的 oV 對 inV 間的關係如圖3101假使 inV 電壓為正弦波則 oV 變

成如圖3102為了改善這種缺失吾人利用兩個二極體接在電路上如圖38

用來補償電晶體BE間的壓降﹝10﹞

約06V

Dead band

Vo

Vin

圖 3101 呈現不感帶的轉移函數

圖 3102 輸出電壓波形

26

323 間距脈波產生電路

RCext15

Cext14 74123

A3

B2

Q13

CLR1

Q4

7486100k

2200pF

10k

10000pF

+5V

間距脈波輸出

圖 311 間距脈波產生電路

間距脈波的產生方式是根據脈寬調變〈PWM〉後的訊號再經由積分電路的

電阻兩端取出且經由兩倍頻器〈74LS86〉檢示出PWM的正負緣脈波最後

再利用單穩態IC〈74LS123〉將檢出信號之脈寬拉長至01ms此即為間距脈波

74LS123有兩個輸入端子A及B分別為下降波緣輸入端子及上升波緣輸入端

子當輸入A之脈波由ldquoH變成ldquoL之瞬間Q輸出變為ldquoH其持續時間長

短由RC時間常數決定反之當輸入B之脈波由ldquoL變成ldquoH之瞬間Q輸出

變成ldquoH維持一定時間

74LS123的輸出脈波之寬度是由電阻及電容之時間常數所決定概略計算公

式如下

CR045T timestimes=

電容 C 必須大於 1000pF

27

《實驗結果》

R=24kΩ C=10000pF

所以得到間距脈波為

( )msec0110810000p24k045T cong=timestimes= μ

圖 312 間距脈波

研究經分析後發現

1 間距 T 愈大愈能確保電路之安全性愈有保護作用

2 間距 T 愈大相對的使驅動信號脈波減少愈多造成馬達旋轉扭力大

大減弱

3 適當的間距 T不但不會影響馬達的輸出轉矩而且兼具保護電路的

效果

33 編碼器

轉動編碼器不只可以作為轉速的感測也能做位置的感測又適合於數位處

理故被廣泛使用若就信號來看轉動編碼器可分為增量型與絕對型若以檢

測的方式來分可分為光學式和磁式兩種在本專題中所使用的編碼器為光學式

增量型編碼器﹝11﹞

光學式轉動編碼器的原理如圖 313在附有細縫轉盤的兩側分別裝置發光元

28

件與受光元件如果只有一組光電檢測元件則輸出信號就只有一相的脈波信

號此種裝置稱為脈波產生器圖 314 為增量型轉碼器的輸出信號它是利用

兩組光電元件所產生的脈波信號A 相和 B 相間有相位差正轉時 A 相領前 B

相逆轉時 B 相領前 A 相因此利用此兩相做檢測馬達為正轉或逆轉的工作

並利用 A 相或 B 相的頻率檢測出目前的轉速

吾人計算出編碼器每一轉可以產生約 200 個脈波故檢測 A 相或 B 相其頻

率為 N則轉速應為 60200

timesN

〈rpm〉

圖 313 光學式轉動編碼器的原理圖

圖 314 編碼器的輸出信號波形

29

34 LM2917 FV 電路設計

對 LM2907 而言磁滯比較器和電流汞是構成頻率對電壓轉換的基本架構

並且預留一個運算放大器及一個電晶體供各種不同的使用圖 315 為吾人所設

計的 FV 電路圖中 C1 用以抑制電流汞動作時所產生的漣波變化正常使用時

此電容應大於 10C若 C1 太大也將造成轉換速度下降

因為單晶片 8051 之輸入電壓最高為 5V故必須設計其馬達最高轉速頻率所

轉成的電壓必須在 5V 以內由於馬達轉速頻率範圍極大故吾人給予 LM2917

+12V 的電壓以擴大它可以轉換的電壓範圍並將所需維持在 5V 內

a1

14

b1

1

a1

13

b1

2

a1

12

b1

3

a1

11

b1

4

1

a1

10

b1

5

a1

8

b1

7

a1

9

b1

6

L2917

Encoder輸 入

1uF

+12V

FV輸出1000pF

45k 10kC1

C2

圖 315 FV 電路

30

《實驗結果》

根據統計結果每 50mV 相對於 100Hz如此一來吾人想得知馬達目前

的轉速只要將單晶片所接收到的電壓值經過換算即可得知目前 encoder 所量測

的頻率吾人知道 encoder 一圈可產生 200 個脈波故馬達的轉速便可經過下列

公式換算得知

轉速〈rpm〉 60200

times=f

其中 =f encoder 所量測到的頻率

表 31 頻率與轉換電壓之關係

頻率

(Hz) 1 2 3 4 5 6 7 8 9

電壓(V) 0006 0006 0007 0008 0009 0009 0009 0009 001

頻率

(Hz) 10 20 30 40 50 60 70 80 90

電壓(V) 008 009 010 010 011 011 012 012 013

頻率

(Hz) 100 200 300 400 500 600 700 800 900

電壓(V) 013 018 023 028 033 038 043 049 054

頻率

(Hz) 1000 2000 3000 4000 5000 6000 7000 8000 9000

電壓(V) 059 109 16 209 257 304 3508 4006 45

31

圖 316 頻率對電壓曲線

35 單晶片介面電路

單晶片介面包括了二大部分分別為單晶片 8051AD converter

〈1〉8051 單晶片

為本控制系統的核心一切動作皆經由它控制

〈2〉AD converter

將類比開關所送出來的類比訊號經由 ADC 0804 轉換成數位訊號傳送

到單晶片的輸入埠

351 AD 轉換

以單晶片 8051 控制 ADC0804則單晶片 8051 必須下達ldquo開始轉換rdquo的命令

給 ADC0804然後 ADC0804 就開始讀入類比輸入端的電壓在內部開始轉換

經過一段轉換時間後〈約 100μ s〉ADC0804 就將轉換完成的值放在其內部的三

態輸出栓鎖緩衝器裡然後將轉換完成輸出腳〈INTR〉降為 low以通知單晶片

可以去讀轉換完成資料

當WR和CS 同時為ldquo0rdquo時表示對 ADC0804 下達ldquo開始轉換rdquo命令再經過

32

一段轉換時間〈100μ s〉後轉換完成ADC0804 會將其轉換完成的數位資料放

在其內部 8 位元緩衝區裡且將 INTR 降為ldquo0rdquo因此單晶片只要下達ldquo開始轉換rdquo

命令後去檢查 INTR 的狀態就可以知道是否轉換完畢其方法有兩種

1 輪詢法〈polling〉

2 中斷法〈interrupt〉

所謂輪詢法就是將 ADC0804 的 INTR接到 CPU 的一條 IO 線上然後以軟體指

令主動偵測其狀態當偵測到為ldquo0rdquo時就可以去讀出 ADC0804 裡的緩衝區的轉

換值

中斷法是一個很理想的 IO 方式因為不像輪詢法必須讓 CPU 等 ADC0804

轉換當 CPU 下達ldquo開始轉換rdquo命令後就可以做其他工作當 ADC0804 轉換完

畢後 INTR會降為ldquo0rdquo可以利用此信號去中斷 CPU再由中斷副程式去讀入

轉換值即可因此大大提高了程式的效率

當 CPU 接收到 ADC0804 發出ldquo轉換完畢rdquo的信號〈 INTR =0〉後就可以去

讀出轉換值其讀出的方法是將CS 與RD設為ldquo0rdquo即可讀到轉換值這個讀值的

動作又會使得 INTR恢復成ldquo1rdquo

1 CPU 下達ldquo開始轉換rdquo命令〈CS =0WR =0〉

2 ADC0804ldquo轉換完畢rdquo 〈 INTR =0〉

3 CPU 讀取轉換值〈 RD =0CS =0〉

4 讀完後 INTR =1

ADC0804 主要規格摘要如下

1 +5V 單電源工作電壓

2 類比電壓輸入範圍 0~+5V

33

3 參考電壓為 25V

4 轉換時間為 100μ s〈 CLKf =640kHz〉

5 解析度為 8 位元

6 誤差plusmn 1LSB

7 讀取時間 135ns

36 電源供應系統

本專題中所有電路及硬體設備所需的電源採用交流電源 110V 經由 PT-31

變壓器後再經過橋式整流後提供了直流電源而因為各個電路所需電源不同

因此製作了多組的變壓電路如下

1電壓源 DC5V選擇了 7805 的穩壓 IC 搭配電容得到了+5V 的電壓源

供〈1〉8051 微處理器 〈2〉ADC 0804 〈3〉74LS8674LS12374LS04

74LS02CD4013 〈4〉馬達 Encoder

2電壓源 DC12V使用 7812 穩壓 IC 搭配電容得到+12V 的電壓源供

LM2917 使用

3電壓源 DC24V利用 7824 的穩壓 IC 搭配電容獲得+24V 的直流電壓

源供電路之橋型驅動功率放大之電晶體使用

Vin1

+12V2

GND3

LM7812

2200uF 10000pF 2200uF 10000pF

+12V outputAC

圖 317 直流電源電路

34

圖 318 直流電源電路實體圖

37 馬達轉速的量測

表 33 PWM 輸出對應 encoder 週期

PWM dutycycle encoder 週期 PWM dutycycle encoder 週期

40 sμ 172 sμ 440 sμ 0 sμ

80 sμ 188 sμ 480 sμ 0 sμ

120 sμ 204 sμ 520 sμ 0 sμ

160 sμ 230 sμ 560 sμ 0 sμ

200 sμ 272 sμ 600 sμ 0 sμ

240 sμ 328 sμ 640 sμ 0 sμ

280 sμ 416 sμ 680 sμ 1320 sμ

320 sμ 540 sμ 720 sμ 750 sμ

360 sμ 800 sμ 760 sμ 510 sμ

400 sμ 1320 sμ 800 sμ 400 sμ

35

圖 319 PWM 輸出對應 encoder 週期

由統計可知道此馬達並不是一顆線性馬達故相信若使用模糊控制理論來

作為其回授控制系統的控制器一定能達到比傳統控制器的性能還要好而且若能

在模糊控制裡加上 PID 控制器的觀念一定能在系統的響應時間上升時間

安定時間和超越量達到最佳的控制另一方面馬達在其反方向的內阻較大需

要更大的力量才能使馬達驅動

36

第四章 軟體規劃與製作

41 PWM 之軟體設計

因為之前所介紹的硬體方式是以調整可變電阻來達到轉速的調整因此無法

得知所給予的脈寬長度和轉速大小尤其在回授時也不易給予適當的訊號來調整

轉速因此改良之方法就是以8051之軟體撰寫方式來產生固定的脈寬也就等

於給予轉速的命令而在其回授控制時也只要在內部程式给予適當的指令便可

達到脈寬長度的調整以達到閉迴路之受控系統

411 PWM 軟體流程

設定Timer0模式為0

TH0 = temp 32 TL0 = temp 32

temp = 8192 ndash j4 Key = 0

檢查是否有鍵值

將鍵值存入Key

Yes

No

設定Key值所對應的 j值

If P30 == 1Then P30 = 0 temp = 8192 ndash j4Else P30 = 1 temp=8192ndash880+j4

TH0 = temp 32 TL0 = temp 32

Start Timer0中斷副程式

啟動Timer0

等待Timer0中斷

返回主程式

圖 41 PWM 軟體設計流程圖

37

在此總共設計了五個按鈕分別代表不同的轉速停止正轉〈慢〉正轉

〈快〉逆轉〈慢〉和逆轉〈快〉使用Timer0是因為8051之計時中斷比延遲程

式來的準確故可以達到準確的計時程式設計理念中並沒有將中斷致能清除

因此Timer0會一直處於計時的狀態程式執行時將一邊檢查鍵值〈KeyStatus〉一

邊進行計時當計時完畢便呼叫中斷副程式然後執行改變Port 30的輸出狀

態若是為high則變為low反之若是為low即變為high同時並重設計時時間

Timer0繼續計時

當鍵值改變時計時的時間也會跟著改變如此一來Timer0將ㄧ直重覆上

述動作直到電源切掉Timer0才會停止計時

42 模糊控制之程式規劃與撰寫

本專題目標在完成了先前所規劃的硬體電路之後接著就是要達成利用模糊

控制理論來設計控制器在此採用了單晶片8051目的是為了以硬體實現方式來

代替電腦模擬期望能夠按照原訂計畫完成本專題「具模糊控制理論與雙脈寬調

變法之直流馬達驅動電路設計」

單晶片 8051 模糊控制的程式撰寫採下列幾個步驟依序完成

1 設定變數轉速誤差〈dspeed〉目前轉速〈sspeed〉

2 模糊化採用三角形歸屬函數採用三角形歸屬函數的原因

〈1〉 三角形函數為一連續函數

〈2〉 三角形函數為線性的函數所以計算速度較快

〈3〉 是具有發散也有收斂的函數和指數函數一樣接近

事實

3 模糊推論模糊規則將其所有可能發生情況以 IFhellipTHENhellip表示

並建立控制規則表

4 解模糊化採用重心法

38

421 歸屬函數

設定變數為目前轉速〈sspeed〉與轉速誤差〈dspeed〉因此此模糊控制器共

有兩個輸入訊號與一輸出訊號輸出訊號為脈寬長度該加或是減多少又因為有

五種不同的轉速因此各分別設計了不同的歸屬函數如下

1 當轉速 = 0

ml h

s s p e e d

d s p e e d

r p m0 5 0 1 0 0- 5 0- 1 0 0

mv l l h v h

r p m0- 3 0- 6 0- 1 0 0 3 0 6 0 1 0 0 圖 42 停止時之歸屬函數

2 正轉〈慢〉

ml hsspeed

dspeed

rpm150 225 300750

mvl l h vh

rpm150100500 200 250 300

圖 43 正轉〈慢〉之歸屬函數

39

3 正轉〈快〉

ml hsspeed

dspeed

rpm520 670 820370220

mvl l h vh

rpm500400300200 600 700 800

圖 44 正轉〈快〉之歸屬函數

4 逆轉〈慢〉

ml hsspeed

dspeed

rpm100 250 400500

mvl l h vh

rpm10050250 200 300 400 圖 45 逆轉〈慢〉之歸屬函數

40

5 逆轉〈快〉

ml hsspeed

dspeed

rpm300 450 600150

mvl l h vh

rpm450350250150 550 650 750

750

圖 46 逆轉〈快〉之歸屬函數

6 輸出

OutputMVL L H VH

rpm0-50-150-250 50 150 250

圖 47 輸出之歸屬函數

41

422 模糊規則庫

表 41 為吾人所設計的模糊控制規則庫並利用 Matlab 之 Fuzzy ToolBox 來

建立此規則庫以進行模擬推論圖 48 為當馬達輸入指令為正轉慢時推論後所得

到的三維空間圖

表 41 模糊控制規則表

Dspeed

vl l m h vh

l H M L VL VL

m VH H M L VL sspeed

h VH VH H M L

圖 48 推論後的三維空間圖

42

423 模糊控制器之軟體設計流程

Start 外部中斷副程式

ADCWR = 0 ADCWR = 1

〈令AD開始轉換〉

檢查鍵值以得到對應的歸屬函數

取得目前轉速與

轉速誤差

Fuzzy Rules決策

得到輸出訊號

Delay 10ms

ADC = 0 讀取AD值 ADCRD = 0

將AD值換算成轉速

ADCWR = 0 ADCWR = 1

〈AD開始轉換〉

返回主程式

致能外部中斷

圖 49 Fuzzy Controller 程式流程圖

當控制器一開始動作時便先執行AD轉換的工作當AD轉換完成時其

INTR的接腳便會觸發8051的外部中斷INTR0於是程式便發生外部中斷執行

外部中斷副程式的指令

43

在外部中斷副程式中AD將ㄧ直進行轉換與讀取的工作同時並將轉換後

的值直接換算成目前轉速與轉速誤差以供模糊控制器使用換算目前encoder

的頻率其公式為

160-V2000 times=頻率 〈4-1〉

式4-1之公式是根據表31所導出來的其中V為encoder之頻率轉成電壓之值

又假設所讀取的AD轉換值為value因為

AD的解析度 = bit256

5V+ = 511 ( Vbit ) 〈4-2〉

故value值與電壓V之關係為

511 value V times= 〈4-3〉

所以encoder之頻率與value值的關係為

頻率= 2000times ⎟⎠⎞

⎜⎝⎛ times

511 value - 160 〈4-4〉

故目前轉速為

sspeed = ( )rpm 60 200

times頻率 〈4-5〉

另ㄧ方面在主程式中程式會先去檢查鍵值也就等於檢查輸入指令以

找出符合使用的歸屬函數並將AD所獲得的轉速對應到歸屬函數中然後執行

決策判斷即進入規則庫中尋找出適當的決策判斷最後將此決策送入PWM程

式裡進行脈寬長度的調整使馬達在合理的要求下達到理想的轉速控制不會

因為外在環境的影響而使馬達轉速受到干擾

43 LCD 顯示轉速

此專題最後再增加一LCD顯示幕以顯示目前的轉速否則在程式設計完成

後人卻因無法以肉眼得知目前轉速而不能肯定馬達轉速是否有達到控制的目

標因此增加一顯示幕LCD是有必要的不僅隨時得知目前的轉速還能知道

44

設計出來的軟體其控制性是否夠好夠穩定

431 LCD 顯示幕之軟體流程

Start

設定LCD模組的初始狀態

設定外部中斷INTR0

與Timer0

設定TH0 = (65536 ndash 5000) 256 TL0 = (65536 ndash 5000)256

令ADCWR = 0 ADCWR = 1 AD開始轉換

等待中斷

外部中斷副程式

ADCRD = 0 讀取AD值 ADCRD = 1

將AD值換算成速度

ADCWR = 0 ADCWR = 1 AD開始轉換

Timer0中斷副程式

顯示LCD第一行

ldquoMotor Speed =

顯示LCD第二行ldquoxxxxxxx rpm其中 xxxxxx為外部中斷副程式所換算出的轉速

重設TH0與TL0

返回主程式返回主程式

圖 410 LCD 顯示幕之程式流程圖

此程式主要由兩個部分完成一為外部中斷副程式另ㄧ為 Timer0 中斷副

程式當主程式完成外部與 Timer0 兩個中斷的設定後隨即命令 AD 開始轉換

之後便一直停在 while〈1〉的迴圈裡不做任何動作而由兩個中斷副程式來完

成整個轉換與顯示的工作

45

外部中斷副程式主要負責 AD 的轉換讀取與轉速換算的工作AD 第一

次的轉換由主程式來下達命令當轉換完成後AD 的 INTR 接腳將觸發外部中

斷〈INTR0〉副程式此時程式便進入外部中斷副程式執行讀取 AD 值與轉速

換算的工作當這些工作完成時外部中斷副程式再次下達 AD 開始轉換的命

令而離開中斷副程式當 AD 再次轉換完成時又將再次執行中斷副程式

如此週而復始中斷副程式將ㄧ直進行讀取換算與轉換的工作

而 Timer0 中斷副程式主要負責 LCD 顯示之工作當主程式所設定的計時時

間計數完時程式便進入 Timer0 中斷副程式一旦進入 Timer0 中斷副程式程

式將執行 LCD 的顯示然後再重設 Timer0 的計數時間Timer0 將重新計數當

計數完時程式又將再度進入 Timer0 中斷副程式執行因為程式中並無清除

Timer0 的中斷致能故 Timer0 中斷副程式和外部中斷副程式ㄧ樣週而復始的

執行其副程式的工作

46

第五章 結論

本計劃主旨為具模糊控制理論與雙脈寬調變法之直流馬達驅動電路設計主

要是針對傳統電路設計之缺點提出改良之方法以TPWM取代PWM電路以模

糊理論基礎設計之控制器替代傳統PID控制器

TPWM轉速控制優於PWM之處在於

1 TPWM只需使用單電源即可達到正轉和逆轉的轉速控制而PWM必須

加上逆向開關或是雙電源才能使馬達產生正轉和逆轉

2 TPWM可控制馬達處於停止狀態無論在正向或逆向加上負載皆無法使

馬達產生轉動

3 馬達消耗定額功率輸出轉矩為額定值

4 馬達由停止到某定轉速時反應時間較快

模糊控制器優於PID控制器

1 不須導出繁雜的數學模型

2 適用於非線性系統

3 強健性與容錯性較高

本專題至此雖說大致的目標都已達到但是此系統仍然有許多不完美而需要

改進的地方例如在實驗過程中發現整個轉速的控制在回授上其反應時間

有點慢探討其原因有可能是控制器之程式上的問題

1 因為使用C語言撰寫程式故其執行速度較慢

2 程式可能寫的太累贅

3 模糊控制規則庫建立不良

若想改善這些問題可以嘗試著將C語言改為組合語言來撰寫並盡量減少

47

不必要的指令相信此動作一定能大大提昇程式的執行速度其次就是多做測

試利用測試中所學到的經驗來幫助模糊控制規則庫的改寫同時也能從測試中

發現更多的問題若是都能對問題加以一一解決的話相信必定能將此控制系統

做的更盡善盡美

48

參考文獻

﹝1﹞ 李適中直流馬達速度控制伺服控制〈基礎篇〉全華科技圖書股份有

限公司民 74

﹝2﹞ 廖錦文ldquo直流電動機之雙脈寬調變是〈TPWM〉驅動電路研究電

子技術月刊第 69 期pp94-1021992

﹝3﹞ 楊英魁孫宗瀛鄭魁香林建德蔣旭堂模糊控制理論與技術全華

科技圖書股份有限公司民 85

﹝4﹞ 林敦煌陳憬德直流馬達定位及轉速的模糊控制逢甲大學自動控制工

程學系學士論文民 87

﹝5﹞ LAZadehldquo Fuzzy Sets Information and Control Vol8 pp338-353

1965

﹝6﹞ EHMamdani and SAsslianldquo A fuzzy logic controller for a dynamic

plant Internation Journal of Man-Machine Studies Vol7 pp1-13 1975

﹝7﹞ 孫宗瀛楊英魁Fuzzy 控制理論實作與應用全華科技圖書股份有

限公司民 83 年

﹝8﹞ 許中平黃煌嘉直流電動機控制電路設計全華科技圖書股份有限公司

民 75

﹝9﹞ 盧明智黃敏祥OP Amp 應用+實驗模擬全華科技圖書股份有限公司

民 83

﹝10﹞陳文耀電動機控制工程復文書局2003

﹝11﹞許中平林全福電動機運轉控制技術全華科技圖書股份有限公司民

77

﹝12﹞楊明豐8051 單晶片 C 語言設計實務碁峯資訊2003 年

﹝13﹞蔡朝洋單晶片微電腦 80518951 原理與應用全華科技圖書股份有限公

司民 91

49

﹝14﹞王文俊認識 Fuzzy全華科技圖書股份有限公司民 90

50

附錄 A 專題硬體展示圖

圖 A-1 硬體整體圖

圖 A-2 硬體整體鳥瞰圖

51

圖 A-3 硬體側視圖

圖 A-4 操作與顯示面板

圖 A-5 間距脈波電路與 FV 電路

52

圖 A-6 橋型驅動功率放大電路

圖 A-7 操作與控制面板

53

附錄 B PWM 與模糊控制之程式

include reg51h include stdioh sbit ADCRD = P3^1 設定 RD 控制線接腳為 P31 sbit ADCWR = P3^3 設定 WR 控制線接腳為 P33 sbit P2_0 = 0xA0 接腳定義 sbit P2_1 = 0xA1 接腳定義 sbit P3_0 = 0xB0 接腳定義 sbit P3_1 = 0xB1 接腳定義 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P3_6 = 0xB6 接腳定義 void KeyStatus(void) 函數原型宣告 void feedback(void) 函數原型宣告 void compute_grade(void) 函數原型宣告 void delay1ms(int count) 函數原型宣告 void convert() 函數原型宣告 void condition() 函數原型宣告 void CW(void) 函數原型宣告 int j i 對應 PWM 的寬度 unsigned int temp 所設計的計時器時間 int sample = 1000 取樣率設定消除顯示值跳動 long int value r1 讀取 ADC0804 數位資料 long int set n condition select long int r grade_reg[2] grade[15] error1 error2 long int a1 b1 I long int membership[5][3]membership1[3][3] 定義歸屬函數 long int membership2[3][3] = -10-50-5050510 long int error[2] int Rule[15][3] = 113213313 定義判斷規則庫 212223323 311232333 411241342 511251351

54

main() 主程式 j = PWM = 110 設定 PWM 初始值 IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x00 設定計時器 0 工作於模式 0 temp=8192-j4 設定計時器 0 初值 TH0 = temp 32 TL0 = temp 32 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 P3_4 = 1 P3_5 = 0 P3_6 = 0 ADCWR = 0 令 ADC0804 的 WR = 0 ADCWR = 1 令 ADC0804 的 WR = 1 while (1) KeyStatus() 檢查鍵值 void KeyStatus(void) 檢查鍵值並給對應的 PWM 值 char KeyScan(void) 按鍵掃描函數宣告 unsigned char KeyStatus unsigned char Key = 0 KeyStatus=KeyScan() 呼叫按鍵掃描函數 if (KeyStatus = 0) 已有按鍵輸入 Key = KeyStatus Key = 鍵值 if (Key == 0x01) 假如輸入為按鍵 1 i = 110 PWM 為 110us j = i P3_4 = 1 LED 亮第一顆〈表馬達停止〉 P3_5 = 0 P3_6 = 0

55

else if (Key == 0x02 ) 假如輸入為按鍵 2 i = 140 PWM 為 140us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x04 ) 假如輸入為按鍵 3 i = 180 PWM 為 180us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x08 ) 假如輸入為按鍵 4 i = 80 PWM 為 80us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 else if (Key == 0x10 ) 假如輸入為按鍵 5 i = 40 PWM 為 40us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 PWM = j delay1ms(10) 呼叫延遲函數 feedback() 模糊控制判斷

56

void To_int(void) interrupt 1 Timer0 中斷函數 if (P3_0 == 0) 假如 PWM 輸出為 Low P3_0 = 1 變更 PWM 輸出為 High temp=8192-j4 設定 High 的時間 else 若 PWM 輸出為 High P3_0 = 0 變更 PWM 輸出為 Low temp=8192-880+j4 設定 Low 的時間 TH0 = temp 32 Timer0 的計時時間 TL0 = temp 32 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 char KeyScan(void) 檢查鍵值 char KeyStatus 按鍵狀態 P0=0xff 設定 P0 為輸入模式 KeyStatus=~P0 讀取按鍵狀態 return(KeyStatus) 將鍵值送回程式 void feedback(void) 模糊判斷 void Fuzzycontroller() 函數原型宣告 void condition1() 函數原型宣告

57

void condition2() 函數原型宣告 error1 = ((value)40-160)03 輸入變數 1 delay10ms(10) 延遲 10ms error2 = ((value)40-160)03 輸入變數 2 if (key == 0x01 ) 當按鍵 1找出對應的歸屬函數 並做出模糊控制判斷

int membership[5][3]= -100-60-30-60-300-30030030603060100

int membership1[3][3]=-100-500-50050050100 Fuzzycontroller() condition() if (key == 0x02 ) 當按鍵 2找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

05010050100150100150200150200250200250300 int membership1[3][3]=07515075150225150225300 Fuzzycontroller() condition() else if (key == 0x04) 當按鍵 3找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

200320400300400500400500600500600700600700800 int membership1[3][3]=220370520370520670520670820 Fuzzycontroller() condition() else if (key == 0x08) 當按鍵 4找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

02550255010050100200100200300200300400 int membership1[3][3]=05010050100250100250400 Fuzzycontroller() condition()

58

else if (key == 0x10) 當按鍵 5找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

150250350250350450350450550450550650550650750 int membership1[3][3]=150300450300450600450600750 Fuzzycontroller() condition2() void Fuzzycontroller() 模糊控制判斷 void compute_grade() 函數原型宣告 void compute_grade1() 函數原型宣告 a1 = 0 b1 = 001 I = 0 for (n=0 nlt=14 n++) r = error1 set = Rule[n][0]-1 compute_grade() 計算輸入變數 1 與

模糊程度的歸屬函數 condition = 1 r = error2 set = Rule[n][1]-1 compute_grade1() 計算輸入變數 2 與 模糊程度的歸屬函數 grade[n] = MIN(grade_reg[0] grade_reg[1]) a1 = a1 + (grade[n]membership2[Rule[n][2]-1][1]) b1 = b1 + grade[n] I = a1 b1 得到模糊控制判斷的結果 void compute_grade() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership[set][0]) || (r gt membership[set][2])) 當輸入變數不在 歸屬函數內

59

grade_reg[condition] = 0 else if ((r gt membership[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership[set][2]-r) (membership[set][2] - membership[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership[set][0]) (membership[set][1] - membership[set][0]) void compute_grade1() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership1[set][0]) || (r gt membership1[set][2])) 當輸入變數不在 歸屬函數內 grade_reg[condition] = 0 else if ((r gt membership1[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership1[set][2]-r) (membership1[set][2]-membership1[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership1[set][0]) (membership1[set][1]-membership1[set][0])

60

void condition() P2_0 = 1 設定 P20 為輸入模式 P2_1 = 1 設定 P21 為輸入模式 if ( (P2_0 == 1) ampamp (P2_1 == 0)) 當馬達為正轉時 if ( I gt 0 ) 若模糊判斷結果為正 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 若模糊判斷結果為零 PWM = PWM + 0 PWM 寬度不變 if ( I lt 0 ) 若模糊控制結果小於零 PWM = PWM + 1 PWM 寬度加 1 else if ( (P2_0 == 0) ampamp (P2_1 == 1) ) 若馬達為反轉 if ( I lt 0 ) 模糊控制小於零 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 模糊控制等於零 PWM = PWM + 0 PWM 寬度不變 if ( I gt 0 ) 模糊控制大於零 PWM = PWM + 1 PWM 寬度加 1 CW() 判斷 PWM 寬度上下限

61

void CW() 判斷 PWM 寬度上下限 if ( PWM gt= 215 ) 若 PWM 寬度 gt= 最大寬度 j = 215 PWM 寬度維持於 215us if ( PWM lt= 5 ) 若 PWM 寬度 lt= 最小寬度 j = 5 PWM 寬度維持在 5us if ( PWM gt 5 ampamp PWM lt 215 ) PWM 寬度介於最大與最小間 j = PWM PWM 依模糊控制判斷結果增減 void delay1ms(int count) 延遲 1ms int x y for ( x = 0 x lt count x++ ) for ( y = 0 y lt 122 y++ ) void convert() 數位資料換算成馬達轉速 r1 = ((value)40)-160

62

附錄 C LCD 顯示之程式

includereg51h 含 8051 所有暫存器宣告 include mathh define RS P3_5 LCD 指令資料選擇控制 define RW P3_4 LCD 讀寫控制腳 define Enable P3_3 LCD 致能接腳 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P0_0 = 0x80 接腳定義 sbit P0_1 = 0x81 接腳定義 sbit P0_2 = 0x82 接腳定義 sbit P0_3 = 0x83 接腳定義 sbit P0_4 = 0x84 接腳定義 sbit P0_5 = 0x85 接腳定義 sbit P0_6 = 0x86 接腳定義 sbit ADCRD = P3^7 設定 RD 控制線接腳為 P37 sbit ADCWR = P3^6 設定 WR 控制線接腳為 P36 void delay(void) 函數原型宣告 void delay10ms(int count) 函數原型宣告 void display(void) 函數原型宣告 void InitialLCD(void) 函數原型宣告 void WriteIns(char) 函數原型宣告 void WriteData(char) 函數原型宣告 void WriteString(charchar) 函數原型宣告 void CheckBusy(void) 函數原型宣告 void convert(void) 函數原型宣告 char MSG0[] = Motor Speed = 定義字串 MSG0 char MSG2[] = rpm 定義字串 MSG2 unsigned char MSG1[8]=0000000 定義字串 MSG1 unsigned long int value 讀取 ADC0804 數位資料 int sample = 1000 取樣率設定消除顯示值跳動 long int rpm

63

main() 主程式 InitialLCD() 初始化 LCD IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x01 設定計時器 0 工作於模式 1 TH0 = (65536-5000)256 設定計時器 0 初值 TL0 = (65536-5000)256 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 while(1) 等待中斷 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 while (--sample == 0) 取樣率減 1 sample = 1000 重設取樣率 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 void T0_int(void) interrupt 1 LCD 顯示動態掃描 display() 動態掃描顯示 TH0 = (65536-65535)256 重設計時初值 TL0 = (65536-65535)256

64

void InitialLCD(void) 設定 LCD 模組初始狀態 delay() 延遲函數 WriteIns(0x38) 設定 LCD 模組為 WriteIns(0x38) 2 行顯示 WriteIns(0x38) 8 位元介面 WriteIns(0x38) 5x7 點字型 WriteIns(0x08) 關閉顯示器 WriteIns(0x01) 清除 LCD 螢幕 WriteIns(0x0c) 令顯示器 ON但游標不顯示 WriteIns(0x06) 令 LCD 模組每接收到 1Byte 資料 AC 值自動加 1 void display() 掃描顯示 WriteIns(0x80) 設定 LCD 座標 WriteString(13MSG0) 將字串 MSG0 寫入 LCD 中 WriteIns(0xc0) 設定 LCD 座標 WriteString(8MSG1) 將字串 MSG1 寫入 LCD 中 WriteIns(0xc8) 設定 LCD 座標 WriteString(4MSG2) 將字串 MSG2 寫入 LCD 中 void convert(void) 換算轉速 long int freq freq = ((value)4000) - 16000 數位資料換成頻率公式 rpm = freq3 頻率換算轉速公式 MSG1[0] = (rpm1000000)+0x30 將結果存入字串 MSG1 中 MSG1[1] = ((rpm1000000)100000)+0x30 MSG1[2] = ((rpm100000)10000)+0x30 MSG1[3] = ((rpm10000)1000)+0x30 MSG1[4] = 0x2e MSG1[5] = ((rpm1000)100)+0x30 MSG1[6] = ((rpm100)10)+0x30 MSG1[7] = rpm10+0x30

65

void WriteIns(char instruction) 寫命令至 LCD 中 RS = 0 選擇指令暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = instruction 輸出命令至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteData(char i) 寫資料至 LCD 中 RS = 1 選擇資料暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = i 輸出資料至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteString(countMSG) 寫字串至 LCD 中 char count 字串長度 char MSG[] 字串資料 char i 定義位元組變數 for(i=0 iltcount i++) count 個位元組 WriteData(MSG[i]) 寫入一位元組的資料至 LCD 中 void CheckBusy(void) char i=0x80 檢查忙碌旗標 while(iamp0x80) 忙錄旗標 BF = 1 RS = 0 選擇指令暫存器 RW = 1 讀取 Enable = 1 致能 LCD i = P2 讀取 LCD 指令暫存器內的資料

66

Enable = 0 除能 LCD delay() 延遲函數 void delay() 延遲 5ms int i for(i=0 ilt250 i++)

  • 畢業專題封面pdf
  • File0004pdf
  • 最終版pdfpdf
Page 19: Based on Fuzzy Control Theorem and TPWM Method for DC ... · 使吾人想設計一模糊控制器來做為馬達轉速的閉迴路控制,以解決非線性系統的 問題。除此之外,flcs

10

214 模糊推論與模糊規則

模糊推論〈fuzzy inference〉是根據知識庫保存的規則(rule)和給予的事實

推導出新的結論與傳統推論不同的地方是Fuzzy推論不只可以處理明確命題也

可以處理Fuzzy命題Fuzzy推論是依據近似推理〈approximate reasoning〉的概念

發展出來的比傳統推論的嚴正推理〈exact reasoning〉更合理也更具彈性近

似推理是兩種嚴正推理General Modus Ponens〈簡稱GMP〉及Genera Modus

Tollens〈簡稱GMT〉的一般化此原理是從傳統二值邏輯中的肯定律〈modus

ponens〉和否定律〈modus tollens〉推廣而來其中GMP又可稱為前向推理而

GMT則可稱為反向推理

〈1〉 GMP〈General Modus Ponens〉

規則IF x is A THEN y is B

事實x is Arsquo

結論y ix Brsquo 〈24〉

〈2〉 GMT〈General Modus Tollens〉

規則IF x is A THEN y is B

事實y is Brsquo

結論x is Arsquo 〈25〉

上式中IF x is A THEN y is B即為模糊規則〈fuzzy rules〉AArsquoBBrsquo

分別是定義在論域X及Y的模糊集合xy代表輸入變數及輸出變數的語言變數

一般來說「x is A」稱為前件部〈antecedent〉而「Y is B」則稱為後件部

〈consequence〉Fuzzy知識庫〈Fuzzy Knowledge Base簡稱FKB〉即由這些模

糊規則所組成的規則庫〈rule base〉和存放描述領域知識的Fuzzy變數及語言變數

的資料庫〈data base〉所組成所以FKB是用來描述受控對象所涉及的領域知

11

識和操控目標的一些定性及定量的資訊模糊知識庫和模糊推論是構成Fuzzy規

則系統核心的兩個重要部門﹝7﹞

模糊推論是模糊系統的核心根據知識庫的模糊法則進行模糊理論的合成運

算來模擬人類的思考決策模式一般來說規則的建立是採取十分主觀直覺的

方式依據相關領域專家的經驗與知識透過詢問進而將其知識經驗歸納條列出

重點再轉換成模糊規則的形式表現出來但是並非所有的專家或操作員都能

將自身的經驗知識以言詞的方式充分的表達出來且未必能整理成條列的模糊規

則所以知識規則的萃取工作往往是在建構模糊系統時最常遭遇到的困難之

215 模糊控制器

模糊控制是智慧型控制〈intelligent control〉系統的一種典型其基本特點

是不完全依賴受控對象的數學模型主要是利用人的操作經驗知識和推理技

術以及控制系統的某些訊息和性能得出對應的控制動作模糊控制是以並行

〈parallel〉方式處理規則的推理工作〈如圖25〉其近似推理會包容每個對操

控系統有貢獻的規則即使某些貢獻程度很小的規則也不會忽略

圖 25 模糊控制系統的構造

12

一個控制器的輸入通常是確定數值而非模糊輸出也是如此才能對被控對象

發生作用但是模糊邏輯控制器〈Fuzzy Logic Controller簡稱FLC〉則是以語

言化的控制規則為主體為了能夠把輸入的確定值與語言化之後的控制規則結

合必須把輸入的確定值模糊化〈fuzzification〉以便對應到FLC語言變數的論

域範圍中同樣的經過規則庫推理出來的結果是對應到輸出語言變數的論域

中所以也必須對其做解模糊化〈defuzzification〉的工作才能達成實際的控制

目標

一般模糊控制器的架構包含了五個主要部分定義變數模糊化知識庫

模糊推論及解模糊化

〈1〉 定義輸入及輸出變數

決定程序被觀察的狀況及考慮控制的動作輸入變數可以是擷取

自受控系統的觀測量也可以是推導出來的資料輸出變數則為操控

受控系統的操作量例如在一般控制問題上輸入變數通常為輸出

誤差e與輸出誤差之變化率e而控制變數則為下一個狀態之輸入

u其中eeu統稱為模糊變數

〈2〉 模糊化

將量測值轉換為語言變數的過程將外界所輸入的確定數值經由

一比例映射傳送到輸入變數所對應的模糊論域然後再利用模糊化

函數將此輸入資料轉換成適當的口語值以供模糊運算使用此口語

化變數稱之為模糊子集合

〈3〉 知識庫

模糊知識庫是模糊控制的依據由它來定義所有使用到的語言控

制法則及相關各項參數知識庫可說是整個控制系統資料核心其包

含了兩個部分資料庫〈data base〉與規則庫〈rules base〉

1 資料庫

提供處理模糊數據之相關定義資料庫所存放的資料是關

13

於如何將明確的資料轉換成模糊數值而資料的存放方式是以

歸屬函數表示該選用哪一種歸屬函數依實際的需要選定

以三角形歸屬函數最常被使用因其運算最為容易且又能充分

的表達模糊概念

2 規則庫

利用語言化的條件式控制規則描述控制目標和策略通常

控制規則可以由操控人員的經驗或專家的知識推導出來多個

控制規則所組成的集合就是規則庫

〈4〉 模糊推論

模糊推論為模糊控制最重要的核心其最主要的工作就是做實際

的決策過程處理模糊推論具有模擬人類做決策判斷的能力其基本

理論就是根據人類特有的近似推理方式如之前已說明的GMP和

GMTGMP為前向推理而GMT為逆向推理因為模糊推論為前向

運算因此GMP非常適合使用為模糊控制的推論機構

〈5〉 解模糊化

將推論完成所得到的模糊輸出量轉換成實際的明確數值以便和

外界溝通解模糊化的方法有很多例最大歸屬度法重心法高

度法面積法等

圖 26 模糊系統的基本架構

14

22 直流馬達數學模型

圖27為直流馬達等效電路簡圖其中

iV = 輸入電壓 ai = 電樞電流

zR = 電樞電阻 gT = 轉矩

aL = 電樞電感 bE = 反電動勢

φ = 空氣隙磁通量 ω = 轉子角速度

B = 黏滯摩擦係數 J = 轉動慣量

圖 27 直流馬達等效電路簡圖

由克希荷夫電壓定律知

( ) ( ) ( )tEdt

tdiLtiRV b

aaaai ++= 〈26〉

由於反電動勢 bE 與轉軸的角速度 ( )tω 及空氣隙磁通量φ之乘積成正比即

( ) ( ) ( )tKtKtE emb ωφω == 〈27〉

15

又轉矩的平衡方程式為

( ) ( ) ( )dt

tdJtBtTgωω += 〈28〉

且馬達轉矩 gT 與電樞電流 ( )tia 及空氣隙磁通量φ乘積成正比即

( ) ( ) ( )tiKtiKtT ataag == φ 〈29〉

取〈26〉~〈29〉式之拉氏變換得

( ) ( ) ( ) ( )sEssILsIRsV baaaai ++= 〈210〉

( ) ( )sKsE eb Ω= 〈211〉

( ) ( ) ( )sJssBsTg Ω+Ω= 〈212〉

( ) ( )sIKsT atg = 〈213〉

則馬達輸入電流與轉速為

( ) ( ) ( )( ) ( )( )

sR

sEsV

sLRsEsV

sIe

a

bi

aa

bia τ+

minus

=+minus

=1

〈214〉

( ) ( ) ( )

sB

sT

sJBsT

sm

gg

τ+=

+=Ω

1 〈215〉

其中a

ae R

L=τ 為電樞電流的電氣時間常數 BJ

m =τ 為馬達轉動的機械時間

常數

直流馬達轉速對輸入電壓的轉移函數 ( )sG 為

( ) ( )( ) ( )( ) etaa

t

i KKBJsRsLK

sVssG

+++=

Ω=

( )( ) etmea

t

KKssBRK

+++=

ττ 11 〈216〉

16

在一般情況電樞電感很小所以 eτ 可以忽略不計因此上式成為一階落後

方程式

( ) ( )( ) ( ) m

m

etma

t

i sTK

KKsBRK

sVssG

+=

++=

Ω=

11 τ 〈217〉

其中

eta

mam KKBR

BRT

+=

τ

eta

tm KKBR

KK

+=

所以直流馬達數學模式可以以圖28表之﹝8﹞

圖 28 直流馬達數學模式方塊圖

17

第三章 系統功能分析與製作規劃

31 專題製作流程

如圖 31 所示本專題主要分為兩條路徑進行一為硬體另一則為軟體程

式撰寫本章著重硬體的規劃設計軟體則在第四章中介紹在完成 AB 信號

產生電路驅動功率放大電路與間距脈波產生電路設計與製作後須先接上馬達

做一連串的測試〈此時系統並無回受控制〉測試間距脈波是否太長或太短硬

體電路是否有缺失hellip等等另一方面也著手撰寫模糊控制程式並將其與硬體電

路結合最後做閉迴路系統的整合測試若發現系統的運作結果並不如預期

則需分別從硬體與軟體兩方面去改良

直流馬達轉速之模糊控制

文獻蒐集與整理

AB信號產生電路設計與製作

驅動功率放大電路設計與製作

間距脈波產生電路設計與製作

測試間距脈波是否太長或太短

系統測試測試馬達轉速是否

達到控制目的

結束與論文寫作

重新設計間距脈波長度

Yes

No

系統整合與修正

輸出信號與Fuzzy控制器之連結設計

規劃輸出與輸入歸屬函數

規劃模糊知識庫

撰寫主程式並加入模糊知識庫

程式編譯及連結

軟硬體整合測試馬達是否運作

程式調整及最佳化

No

YesYes

No

圖 31 專題製作流程圖

18

32 雙脈寬調變法之直流馬達驅動電路設計

本專題製作的雙脈寬調變法之直流馬達驅動電路設計大致可以分為二大部

分第一雙脈寬調變法之電路設計第二橋型驅動功率放大電路

雙脈寬調變〈Two Pulse Width Modulation簡稱TPWM〉之電路設計主要

是先製作一脈寬調變〈Pulse Width Modulation簡稱PWM〉波形然後再將此

波形各別經由一緩衝器〈buffer〉和反向器〈inverter〉則可產生AB驅動信號

脈波此即為TPWM

321 脈寬調變電路

如圖32先利用兩顆op產生三角波電路再利用一個比較器比較三角波

和誤差值之大小

150k

1M

20k

+12V

-12V

+12V

-12V10k

+12V

-12V

10k

+12V

-12V-

+-

+

-

+ PWMLM324

LM324

LM324

2200pF

圖 32 脈寬調變電路

〈1〉 三角波產生電路

三角波產生電路通常至少需要兩個運算放大器其電路如圖33OP1

為一個反相積分器OP2為一個史密特磁滯比較器將OP2的輸出方波經

19

OP1反相積分以後得到Vo1三角波此三角波又同時加到OP2控制其狀

態的改變

當方波產生器的輸出是正的則三角波產生器的輸出是斜向負相似

地當方波產生器的輸出是負則三角波產生器的輸出是斜向正這個動

作將產生三角波的輸出同時也輸出方波﹝9﹞

+VCC

-VCC

-

+

R1

R2

R3

+VCC

-VCC

-

+

OP1

OP2

Vo2Vo1

圖 33 三角波產生電路

對OP2而言是磁滯比較必須先找到OP2的 THV 和 TLV

232

21

32

3oo v

RRR

vRR

Rv

++

+=+ 〈31〉

當 0=+v 時

23

21 oo v

RR

v minus= 〈32〉

表要達到OP2的 0=+v 必須有這麼大的 1ov

當 12 sato Ev = 時

TLsato VERR

v =minus= 13

21 〈33〉

當 22 sato Ev minus= 時

THsato VERR

v =+= 23

21 〈34〉

20

對OP1而言是反相積分器 2ov 為其輸入 1ov 為其輸出則

tCIt

Rv

Ct

CRv

dtvCR

v oooo

11

2

11

22

111

11minus=minus=minus=minus= int 〈35〉

因為

1

2

Rvv

I o minusminus= 0=minusv 〈因為虛接地〉 〈36〉

所以

1

2

Rv

I o= 〈37〉

又因運算放大器的輸入阻抗非常大則流經 1C 的電流也為 I 相當於以定

電流對電容C 充電

當 12 sato Ev = 時 1ov 為下降斜波

tR

EC

v sato

1

1

11

1minus= 〈38〉

當 22 sato Ev minus= 時 1ov 上升斜波

( )

tRE

Cv sat

o1

2

11

1 minusminus= 〈39〉

由此可知三角波的上升與下降斜波乃因 1C 的充電與放電且時間

常數為 11CR

三角波週期分析如下

1 上升斜波的時間 1T

tCR

vv o

o1

1

21 minus= 11

2

1 CRvv

to

ominus=

1Tt = TLTHo VVv minus=1 22 sato Ev =

11111

21

sat

TLTH

sat

TLTH

EVV

CRCRE

VVT

minus=

minusminus= 〈310〉

2 下降斜波的時間 2T

tCR

vv o

o1

1

21 minus= 11

2

1 CRvv

to

ominus=

21

2Tt = THTLo VVv minus=1 12 sato Ev =

1

11111

1sat

TLTH

sat

THTL

EVV

CRCRE

VVT

minus=

minusminus= 〈311〉

3 週期 21 TTT +=

若 1satE = 2satE = satE 且3

22RR

VV TLTH =minus satE

3

2114

RR

CRT=

若R3 = nR2

則nCR

T 114=

114 CR

nf = 〈312〉

《實驗結果》

必須注意的是三角波的頻率太低將導致馬達的轉動產生脈動現象

故將工作頻率設計在1kHz以上

Ω= k1501R Ω= k102R

Ω= k203R pFC 22001 =

所得到的三角波頻率為

15kHz10220010001504

00010100020

f 12- =timestimestimestimes

timestimes

=

圖 34 三角波輸出波形

22

〈2〉 脈寬調變電路〈PWM〉

+12V

-12V

10k

+12V

-12V -

+ PWM輸出LM324三角波輸入

圖 35 脈寬調變電路

PWM系統往往連接至直流電源供應放大器的工作是以固定的頻率開

閉直流供應電壓其激發角是可以調整的因此得到波寬可調的輸出

將固定頻率的三角波與反向輸入的電壓做比較便可輸出一脈寬〈見圖

36〉反向電阻值的不同將導致反向輸入電壓不同故其輸出為一可調但

頻率固定的脈寬也正因為如此故稱為脈寬調變〈PWM〉由於輸出的

dutycycle不同故馬達將接收到不同的平均電壓因而可以藉由PWM控制

馬達的轉速

反相輸入電壓

PWM

圖 36 三角波與反相輸入電壓比較

23

PWM的優點在於馬達驅動電路的電晶體之控制信號改以脈波列來控

制使電晶體操作成類似開關的動作不是完全導通就是完全截止故電晶

體不是一直操作於作用區所以其功率消耗不大整體效率較高

《實驗結果》

圖 37 PWM 輸出波形

322 橋型驅動功率放大電路

如圖38所示主要由四個功率電晶體組成利用不同的電晶體對使直流

馬達做正逆轉控制當Q5Q8導通使馬達正轉當Q6Q7導通馬達則逆

轉電路中的電晶體扮演開關的作用

此種電路簡單只要一組直流電源供應且電晶體分擔了部份的電壓保護

電晶體迅速工作於截止與飽和狀態之間故沒有功率散逸損失之虞

但是在設計時切勿使Q5Q6同時導通以免燒毀電路上之元件因為在

AB兩脈波短暫的交變時間內由於電晶體本身之最小延遲時間有可能使Q5

Q6同時ON與Q7Q8在很短時間同時ON因此在15kHz交變下容易燒毀功

率電晶體

因此設計一間距脈波電路主要之功用使Q5Q6和Q7Q8均不同時導通

24

以拉長AB兩者交換時間

M

20k

10k

20k

10k

+24V

A 信號 B 信號

2N3055 2N3055

2N2955 2N2955

1N40021N4002

C1815 C1815

C1815 C1815

Q5

Q8Q6

Q7

圖 38 橋型驅動功率放大電路

圖 39 橋型驅動功率放大電路實體圖

25

此外若考慮電晶體BE間的電壓則電路會出現約 plusmn 06V的不感帶〈ded

band〉即電晶體的 oV 對 inV 間的關係如圖3101假使 inV 電壓為正弦波則 oV 變

成如圖3102為了改善這種缺失吾人利用兩個二極體接在電路上如圖38

用來補償電晶體BE間的壓降﹝10﹞

約06V

Dead band

Vo

Vin

圖 3101 呈現不感帶的轉移函數

圖 3102 輸出電壓波形

26

323 間距脈波產生電路

RCext15

Cext14 74123

A3

B2

Q13

CLR1

Q4

7486100k

2200pF

10k

10000pF

+5V

間距脈波輸出

圖 311 間距脈波產生電路

間距脈波的產生方式是根據脈寬調變〈PWM〉後的訊號再經由積分電路的

電阻兩端取出且經由兩倍頻器〈74LS86〉檢示出PWM的正負緣脈波最後

再利用單穩態IC〈74LS123〉將檢出信號之脈寬拉長至01ms此即為間距脈波

74LS123有兩個輸入端子A及B分別為下降波緣輸入端子及上升波緣輸入端

子當輸入A之脈波由ldquoH變成ldquoL之瞬間Q輸出變為ldquoH其持續時間長

短由RC時間常數決定反之當輸入B之脈波由ldquoL變成ldquoH之瞬間Q輸出

變成ldquoH維持一定時間

74LS123的輸出脈波之寬度是由電阻及電容之時間常數所決定概略計算公

式如下

CR045T timestimes=

電容 C 必須大於 1000pF

27

《實驗結果》

R=24kΩ C=10000pF

所以得到間距脈波為

( )msec0110810000p24k045T cong=timestimes= μ

圖 312 間距脈波

研究經分析後發現

1 間距 T 愈大愈能確保電路之安全性愈有保護作用

2 間距 T 愈大相對的使驅動信號脈波減少愈多造成馬達旋轉扭力大

大減弱

3 適當的間距 T不但不會影響馬達的輸出轉矩而且兼具保護電路的

效果

33 編碼器

轉動編碼器不只可以作為轉速的感測也能做位置的感測又適合於數位處

理故被廣泛使用若就信號來看轉動編碼器可分為增量型與絕對型若以檢

測的方式來分可分為光學式和磁式兩種在本專題中所使用的編碼器為光學式

增量型編碼器﹝11﹞

光學式轉動編碼器的原理如圖 313在附有細縫轉盤的兩側分別裝置發光元

28

件與受光元件如果只有一組光電檢測元件則輸出信號就只有一相的脈波信

號此種裝置稱為脈波產生器圖 314 為增量型轉碼器的輸出信號它是利用

兩組光電元件所產生的脈波信號A 相和 B 相間有相位差正轉時 A 相領前 B

相逆轉時 B 相領前 A 相因此利用此兩相做檢測馬達為正轉或逆轉的工作

並利用 A 相或 B 相的頻率檢測出目前的轉速

吾人計算出編碼器每一轉可以產生約 200 個脈波故檢測 A 相或 B 相其頻

率為 N則轉速應為 60200

timesN

〈rpm〉

圖 313 光學式轉動編碼器的原理圖

圖 314 編碼器的輸出信號波形

29

34 LM2917 FV 電路設計

對 LM2907 而言磁滯比較器和電流汞是構成頻率對電壓轉換的基本架構

並且預留一個運算放大器及一個電晶體供各種不同的使用圖 315 為吾人所設

計的 FV 電路圖中 C1 用以抑制電流汞動作時所產生的漣波變化正常使用時

此電容應大於 10C若 C1 太大也將造成轉換速度下降

因為單晶片 8051 之輸入電壓最高為 5V故必須設計其馬達最高轉速頻率所

轉成的電壓必須在 5V 以內由於馬達轉速頻率範圍極大故吾人給予 LM2917

+12V 的電壓以擴大它可以轉換的電壓範圍並將所需維持在 5V 內

a1

14

b1

1

a1

13

b1

2

a1

12

b1

3

a1

11

b1

4

1

a1

10

b1

5

a1

8

b1

7

a1

9

b1

6

L2917

Encoder輸 入

1uF

+12V

FV輸出1000pF

45k 10kC1

C2

圖 315 FV 電路

30

《實驗結果》

根據統計結果每 50mV 相對於 100Hz如此一來吾人想得知馬達目前

的轉速只要將單晶片所接收到的電壓值經過換算即可得知目前 encoder 所量測

的頻率吾人知道 encoder 一圈可產生 200 個脈波故馬達的轉速便可經過下列

公式換算得知

轉速〈rpm〉 60200

times=f

其中 =f encoder 所量測到的頻率

表 31 頻率與轉換電壓之關係

頻率

(Hz) 1 2 3 4 5 6 7 8 9

電壓(V) 0006 0006 0007 0008 0009 0009 0009 0009 001

頻率

(Hz) 10 20 30 40 50 60 70 80 90

電壓(V) 008 009 010 010 011 011 012 012 013

頻率

(Hz) 100 200 300 400 500 600 700 800 900

電壓(V) 013 018 023 028 033 038 043 049 054

頻率

(Hz) 1000 2000 3000 4000 5000 6000 7000 8000 9000

電壓(V) 059 109 16 209 257 304 3508 4006 45

31

圖 316 頻率對電壓曲線

35 單晶片介面電路

單晶片介面包括了二大部分分別為單晶片 8051AD converter

〈1〉8051 單晶片

為本控制系統的核心一切動作皆經由它控制

〈2〉AD converter

將類比開關所送出來的類比訊號經由 ADC 0804 轉換成數位訊號傳送

到單晶片的輸入埠

351 AD 轉換

以單晶片 8051 控制 ADC0804則單晶片 8051 必須下達ldquo開始轉換rdquo的命令

給 ADC0804然後 ADC0804 就開始讀入類比輸入端的電壓在內部開始轉換

經過一段轉換時間後〈約 100μ s〉ADC0804 就將轉換完成的值放在其內部的三

態輸出栓鎖緩衝器裡然後將轉換完成輸出腳〈INTR〉降為 low以通知單晶片

可以去讀轉換完成資料

當WR和CS 同時為ldquo0rdquo時表示對 ADC0804 下達ldquo開始轉換rdquo命令再經過

32

一段轉換時間〈100μ s〉後轉換完成ADC0804 會將其轉換完成的數位資料放

在其內部 8 位元緩衝區裡且將 INTR 降為ldquo0rdquo因此單晶片只要下達ldquo開始轉換rdquo

命令後去檢查 INTR 的狀態就可以知道是否轉換完畢其方法有兩種

1 輪詢法〈polling〉

2 中斷法〈interrupt〉

所謂輪詢法就是將 ADC0804 的 INTR接到 CPU 的一條 IO 線上然後以軟體指

令主動偵測其狀態當偵測到為ldquo0rdquo時就可以去讀出 ADC0804 裡的緩衝區的轉

換值

中斷法是一個很理想的 IO 方式因為不像輪詢法必須讓 CPU 等 ADC0804

轉換當 CPU 下達ldquo開始轉換rdquo命令後就可以做其他工作當 ADC0804 轉換完

畢後 INTR會降為ldquo0rdquo可以利用此信號去中斷 CPU再由中斷副程式去讀入

轉換值即可因此大大提高了程式的效率

當 CPU 接收到 ADC0804 發出ldquo轉換完畢rdquo的信號〈 INTR =0〉後就可以去

讀出轉換值其讀出的方法是將CS 與RD設為ldquo0rdquo即可讀到轉換值這個讀值的

動作又會使得 INTR恢復成ldquo1rdquo

1 CPU 下達ldquo開始轉換rdquo命令〈CS =0WR =0〉

2 ADC0804ldquo轉換完畢rdquo 〈 INTR =0〉

3 CPU 讀取轉換值〈 RD =0CS =0〉

4 讀完後 INTR =1

ADC0804 主要規格摘要如下

1 +5V 單電源工作電壓

2 類比電壓輸入範圍 0~+5V

33

3 參考電壓為 25V

4 轉換時間為 100μ s〈 CLKf =640kHz〉

5 解析度為 8 位元

6 誤差plusmn 1LSB

7 讀取時間 135ns

36 電源供應系統

本專題中所有電路及硬體設備所需的電源採用交流電源 110V 經由 PT-31

變壓器後再經過橋式整流後提供了直流電源而因為各個電路所需電源不同

因此製作了多組的變壓電路如下

1電壓源 DC5V選擇了 7805 的穩壓 IC 搭配電容得到了+5V 的電壓源

供〈1〉8051 微處理器 〈2〉ADC 0804 〈3〉74LS8674LS12374LS04

74LS02CD4013 〈4〉馬達 Encoder

2電壓源 DC12V使用 7812 穩壓 IC 搭配電容得到+12V 的電壓源供

LM2917 使用

3電壓源 DC24V利用 7824 的穩壓 IC 搭配電容獲得+24V 的直流電壓

源供電路之橋型驅動功率放大之電晶體使用

Vin1

+12V2

GND3

LM7812

2200uF 10000pF 2200uF 10000pF

+12V outputAC

圖 317 直流電源電路

34

圖 318 直流電源電路實體圖

37 馬達轉速的量測

表 33 PWM 輸出對應 encoder 週期

PWM dutycycle encoder 週期 PWM dutycycle encoder 週期

40 sμ 172 sμ 440 sμ 0 sμ

80 sμ 188 sμ 480 sμ 0 sμ

120 sμ 204 sμ 520 sμ 0 sμ

160 sμ 230 sμ 560 sμ 0 sμ

200 sμ 272 sμ 600 sμ 0 sμ

240 sμ 328 sμ 640 sμ 0 sμ

280 sμ 416 sμ 680 sμ 1320 sμ

320 sμ 540 sμ 720 sμ 750 sμ

360 sμ 800 sμ 760 sμ 510 sμ

400 sμ 1320 sμ 800 sμ 400 sμ

35

圖 319 PWM 輸出對應 encoder 週期

由統計可知道此馬達並不是一顆線性馬達故相信若使用模糊控制理論來

作為其回授控制系統的控制器一定能達到比傳統控制器的性能還要好而且若能

在模糊控制裡加上 PID 控制器的觀念一定能在系統的響應時間上升時間

安定時間和超越量達到最佳的控制另一方面馬達在其反方向的內阻較大需

要更大的力量才能使馬達驅動

36

第四章 軟體規劃與製作

41 PWM 之軟體設計

因為之前所介紹的硬體方式是以調整可變電阻來達到轉速的調整因此無法

得知所給予的脈寬長度和轉速大小尤其在回授時也不易給予適當的訊號來調整

轉速因此改良之方法就是以8051之軟體撰寫方式來產生固定的脈寬也就等

於給予轉速的命令而在其回授控制時也只要在內部程式给予適當的指令便可

達到脈寬長度的調整以達到閉迴路之受控系統

411 PWM 軟體流程

設定Timer0模式為0

TH0 = temp 32 TL0 = temp 32

temp = 8192 ndash j4 Key = 0

檢查是否有鍵值

將鍵值存入Key

Yes

No

設定Key值所對應的 j值

If P30 == 1Then P30 = 0 temp = 8192 ndash j4Else P30 = 1 temp=8192ndash880+j4

TH0 = temp 32 TL0 = temp 32

Start Timer0中斷副程式

啟動Timer0

等待Timer0中斷

返回主程式

圖 41 PWM 軟體設計流程圖

37

在此總共設計了五個按鈕分別代表不同的轉速停止正轉〈慢〉正轉

〈快〉逆轉〈慢〉和逆轉〈快〉使用Timer0是因為8051之計時中斷比延遲程

式來的準確故可以達到準確的計時程式設計理念中並沒有將中斷致能清除

因此Timer0會一直處於計時的狀態程式執行時將一邊檢查鍵值〈KeyStatus〉一

邊進行計時當計時完畢便呼叫中斷副程式然後執行改變Port 30的輸出狀

態若是為high則變為low反之若是為low即變為high同時並重設計時時間

Timer0繼續計時

當鍵值改變時計時的時間也會跟著改變如此一來Timer0將ㄧ直重覆上

述動作直到電源切掉Timer0才會停止計時

42 模糊控制之程式規劃與撰寫

本專題目標在完成了先前所規劃的硬體電路之後接著就是要達成利用模糊

控制理論來設計控制器在此採用了單晶片8051目的是為了以硬體實現方式來

代替電腦模擬期望能夠按照原訂計畫完成本專題「具模糊控制理論與雙脈寬調

變法之直流馬達驅動電路設計」

單晶片 8051 模糊控制的程式撰寫採下列幾個步驟依序完成

1 設定變數轉速誤差〈dspeed〉目前轉速〈sspeed〉

2 模糊化採用三角形歸屬函數採用三角形歸屬函數的原因

〈1〉 三角形函數為一連續函數

〈2〉 三角形函數為線性的函數所以計算速度較快

〈3〉 是具有發散也有收斂的函數和指數函數一樣接近

事實

3 模糊推論模糊規則將其所有可能發生情況以 IFhellipTHENhellip表示

並建立控制規則表

4 解模糊化採用重心法

38

421 歸屬函數

設定變數為目前轉速〈sspeed〉與轉速誤差〈dspeed〉因此此模糊控制器共

有兩個輸入訊號與一輸出訊號輸出訊號為脈寬長度該加或是減多少又因為有

五種不同的轉速因此各分別設計了不同的歸屬函數如下

1 當轉速 = 0

ml h

s s p e e d

d s p e e d

r p m0 5 0 1 0 0- 5 0- 1 0 0

mv l l h v h

r p m0- 3 0- 6 0- 1 0 0 3 0 6 0 1 0 0 圖 42 停止時之歸屬函數

2 正轉〈慢〉

ml hsspeed

dspeed

rpm150 225 300750

mvl l h vh

rpm150100500 200 250 300

圖 43 正轉〈慢〉之歸屬函數

39

3 正轉〈快〉

ml hsspeed

dspeed

rpm520 670 820370220

mvl l h vh

rpm500400300200 600 700 800

圖 44 正轉〈快〉之歸屬函數

4 逆轉〈慢〉

ml hsspeed

dspeed

rpm100 250 400500

mvl l h vh

rpm10050250 200 300 400 圖 45 逆轉〈慢〉之歸屬函數

40

5 逆轉〈快〉

ml hsspeed

dspeed

rpm300 450 600150

mvl l h vh

rpm450350250150 550 650 750

750

圖 46 逆轉〈快〉之歸屬函數

6 輸出

OutputMVL L H VH

rpm0-50-150-250 50 150 250

圖 47 輸出之歸屬函數

41

422 模糊規則庫

表 41 為吾人所設計的模糊控制規則庫並利用 Matlab 之 Fuzzy ToolBox 來

建立此規則庫以進行模擬推論圖 48 為當馬達輸入指令為正轉慢時推論後所得

到的三維空間圖

表 41 模糊控制規則表

Dspeed

vl l m h vh

l H M L VL VL

m VH H M L VL sspeed

h VH VH H M L

圖 48 推論後的三維空間圖

42

423 模糊控制器之軟體設計流程

Start 外部中斷副程式

ADCWR = 0 ADCWR = 1

〈令AD開始轉換〉

檢查鍵值以得到對應的歸屬函數

取得目前轉速與

轉速誤差

Fuzzy Rules決策

得到輸出訊號

Delay 10ms

ADC = 0 讀取AD值 ADCRD = 0

將AD值換算成轉速

ADCWR = 0 ADCWR = 1

〈AD開始轉換〉

返回主程式

致能外部中斷

圖 49 Fuzzy Controller 程式流程圖

當控制器一開始動作時便先執行AD轉換的工作當AD轉換完成時其

INTR的接腳便會觸發8051的外部中斷INTR0於是程式便發生外部中斷執行

外部中斷副程式的指令

43

在外部中斷副程式中AD將ㄧ直進行轉換與讀取的工作同時並將轉換後

的值直接換算成目前轉速與轉速誤差以供模糊控制器使用換算目前encoder

的頻率其公式為

160-V2000 times=頻率 〈4-1〉

式4-1之公式是根據表31所導出來的其中V為encoder之頻率轉成電壓之值

又假設所讀取的AD轉換值為value因為

AD的解析度 = bit256

5V+ = 511 ( Vbit ) 〈4-2〉

故value值與電壓V之關係為

511 value V times= 〈4-3〉

所以encoder之頻率與value值的關係為

頻率= 2000times ⎟⎠⎞

⎜⎝⎛ times

511 value - 160 〈4-4〉

故目前轉速為

sspeed = ( )rpm 60 200

times頻率 〈4-5〉

另ㄧ方面在主程式中程式會先去檢查鍵值也就等於檢查輸入指令以

找出符合使用的歸屬函數並將AD所獲得的轉速對應到歸屬函數中然後執行

決策判斷即進入規則庫中尋找出適當的決策判斷最後將此決策送入PWM程

式裡進行脈寬長度的調整使馬達在合理的要求下達到理想的轉速控制不會

因為外在環境的影響而使馬達轉速受到干擾

43 LCD 顯示轉速

此專題最後再增加一LCD顯示幕以顯示目前的轉速否則在程式設計完成

後人卻因無法以肉眼得知目前轉速而不能肯定馬達轉速是否有達到控制的目

標因此增加一顯示幕LCD是有必要的不僅隨時得知目前的轉速還能知道

44

設計出來的軟體其控制性是否夠好夠穩定

431 LCD 顯示幕之軟體流程

Start

設定LCD模組的初始狀態

設定外部中斷INTR0

與Timer0

設定TH0 = (65536 ndash 5000) 256 TL0 = (65536 ndash 5000)256

令ADCWR = 0 ADCWR = 1 AD開始轉換

等待中斷

外部中斷副程式

ADCRD = 0 讀取AD值 ADCRD = 1

將AD值換算成速度

ADCWR = 0 ADCWR = 1 AD開始轉換

Timer0中斷副程式

顯示LCD第一行

ldquoMotor Speed =

顯示LCD第二行ldquoxxxxxxx rpm其中 xxxxxx為外部中斷副程式所換算出的轉速

重設TH0與TL0

返回主程式返回主程式

圖 410 LCD 顯示幕之程式流程圖

此程式主要由兩個部分完成一為外部中斷副程式另ㄧ為 Timer0 中斷副

程式當主程式完成外部與 Timer0 兩個中斷的設定後隨即命令 AD 開始轉換

之後便一直停在 while〈1〉的迴圈裡不做任何動作而由兩個中斷副程式來完

成整個轉換與顯示的工作

45

外部中斷副程式主要負責 AD 的轉換讀取與轉速換算的工作AD 第一

次的轉換由主程式來下達命令當轉換完成後AD 的 INTR 接腳將觸發外部中

斷〈INTR0〉副程式此時程式便進入外部中斷副程式執行讀取 AD 值與轉速

換算的工作當這些工作完成時外部中斷副程式再次下達 AD 開始轉換的命

令而離開中斷副程式當 AD 再次轉換完成時又將再次執行中斷副程式

如此週而復始中斷副程式將ㄧ直進行讀取換算與轉換的工作

而 Timer0 中斷副程式主要負責 LCD 顯示之工作當主程式所設定的計時時

間計數完時程式便進入 Timer0 中斷副程式一旦進入 Timer0 中斷副程式程

式將執行 LCD 的顯示然後再重設 Timer0 的計數時間Timer0 將重新計數當

計數完時程式又將再度進入 Timer0 中斷副程式執行因為程式中並無清除

Timer0 的中斷致能故 Timer0 中斷副程式和外部中斷副程式ㄧ樣週而復始的

執行其副程式的工作

46

第五章 結論

本計劃主旨為具模糊控制理論與雙脈寬調變法之直流馬達驅動電路設計主

要是針對傳統電路設計之缺點提出改良之方法以TPWM取代PWM電路以模

糊理論基礎設計之控制器替代傳統PID控制器

TPWM轉速控制優於PWM之處在於

1 TPWM只需使用單電源即可達到正轉和逆轉的轉速控制而PWM必須

加上逆向開關或是雙電源才能使馬達產生正轉和逆轉

2 TPWM可控制馬達處於停止狀態無論在正向或逆向加上負載皆無法使

馬達產生轉動

3 馬達消耗定額功率輸出轉矩為額定值

4 馬達由停止到某定轉速時反應時間較快

模糊控制器優於PID控制器

1 不須導出繁雜的數學模型

2 適用於非線性系統

3 強健性與容錯性較高

本專題至此雖說大致的目標都已達到但是此系統仍然有許多不完美而需要

改進的地方例如在實驗過程中發現整個轉速的控制在回授上其反應時間

有點慢探討其原因有可能是控制器之程式上的問題

1 因為使用C語言撰寫程式故其執行速度較慢

2 程式可能寫的太累贅

3 模糊控制規則庫建立不良

若想改善這些問題可以嘗試著將C語言改為組合語言來撰寫並盡量減少

47

不必要的指令相信此動作一定能大大提昇程式的執行速度其次就是多做測

試利用測試中所學到的經驗來幫助模糊控制規則庫的改寫同時也能從測試中

發現更多的問題若是都能對問題加以一一解決的話相信必定能將此控制系統

做的更盡善盡美

48

參考文獻

﹝1﹞ 李適中直流馬達速度控制伺服控制〈基礎篇〉全華科技圖書股份有

限公司民 74

﹝2﹞ 廖錦文ldquo直流電動機之雙脈寬調變是〈TPWM〉驅動電路研究電

子技術月刊第 69 期pp94-1021992

﹝3﹞ 楊英魁孫宗瀛鄭魁香林建德蔣旭堂模糊控制理論與技術全華

科技圖書股份有限公司民 85

﹝4﹞ 林敦煌陳憬德直流馬達定位及轉速的模糊控制逢甲大學自動控制工

程學系學士論文民 87

﹝5﹞ LAZadehldquo Fuzzy Sets Information and Control Vol8 pp338-353

1965

﹝6﹞ EHMamdani and SAsslianldquo A fuzzy logic controller for a dynamic

plant Internation Journal of Man-Machine Studies Vol7 pp1-13 1975

﹝7﹞ 孫宗瀛楊英魁Fuzzy 控制理論實作與應用全華科技圖書股份有

限公司民 83 年

﹝8﹞ 許中平黃煌嘉直流電動機控制電路設計全華科技圖書股份有限公司

民 75

﹝9﹞ 盧明智黃敏祥OP Amp 應用+實驗模擬全華科技圖書股份有限公司

民 83

﹝10﹞陳文耀電動機控制工程復文書局2003

﹝11﹞許中平林全福電動機運轉控制技術全華科技圖書股份有限公司民

77

﹝12﹞楊明豐8051 單晶片 C 語言設計實務碁峯資訊2003 年

﹝13﹞蔡朝洋單晶片微電腦 80518951 原理與應用全華科技圖書股份有限公

司民 91

49

﹝14﹞王文俊認識 Fuzzy全華科技圖書股份有限公司民 90

50

附錄 A 專題硬體展示圖

圖 A-1 硬體整體圖

圖 A-2 硬體整體鳥瞰圖

51

圖 A-3 硬體側視圖

圖 A-4 操作與顯示面板

圖 A-5 間距脈波電路與 FV 電路

52

圖 A-6 橋型驅動功率放大電路

圖 A-7 操作與控制面板

53

附錄 B PWM 與模糊控制之程式

include reg51h include stdioh sbit ADCRD = P3^1 設定 RD 控制線接腳為 P31 sbit ADCWR = P3^3 設定 WR 控制線接腳為 P33 sbit P2_0 = 0xA0 接腳定義 sbit P2_1 = 0xA1 接腳定義 sbit P3_0 = 0xB0 接腳定義 sbit P3_1 = 0xB1 接腳定義 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P3_6 = 0xB6 接腳定義 void KeyStatus(void) 函數原型宣告 void feedback(void) 函數原型宣告 void compute_grade(void) 函數原型宣告 void delay1ms(int count) 函數原型宣告 void convert() 函數原型宣告 void condition() 函數原型宣告 void CW(void) 函數原型宣告 int j i 對應 PWM 的寬度 unsigned int temp 所設計的計時器時間 int sample = 1000 取樣率設定消除顯示值跳動 long int value r1 讀取 ADC0804 數位資料 long int set n condition select long int r grade_reg[2] grade[15] error1 error2 long int a1 b1 I long int membership[5][3]membership1[3][3] 定義歸屬函數 long int membership2[3][3] = -10-50-5050510 long int error[2] int Rule[15][3] = 113213313 定義判斷規則庫 212223323 311232333 411241342 511251351

54

main() 主程式 j = PWM = 110 設定 PWM 初始值 IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x00 設定計時器 0 工作於模式 0 temp=8192-j4 設定計時器 0 初值 TH0 = temp 32 TL0 = temp 32 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 P3_4 = 1 P3_5 = 0 P3_6 = 0 ADCWR = 0 令 ADC0804 的 WR = 0 ADCWR = 1 令 ADC0804 的 WR = 1 while (1) KeyStatus() 檢查鍵值 void KeyStatus(void) 檢查鍵值並給對應的 PWM 值 char KeyScan(void) 按鍵掃描函數宣告 unsigned char KeyStatus unsigned char Key = 0 KeyStatus=KeyScan() 呼叫按鍵掃描函數 if (KeyStatus = 0) 已有按鍵輸入 Key = KeyStatus Key = 鍵值 if (Key == 0x01) 假如輸入為按鍵 1 i = 110 PWM 為 110us j = i P3_4 = 1 LED 亮第一顆〈表馬達停止〉 P3_5 = 0 P3_6 = 0

55

else if (Key == 0x02 ) 假如輸入為按鍵 2 i = 140 PWM 為 140us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x04 ) 假如輸入為按鍵 3 i = 180 PWM 為 180us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x08 ) 假如輸入為按鍵 4 i = 80 PWM 為 80us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 else if (Key == 0x10 ) 假如輸入為按鍵 5 i = 40 PWM 為 40us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 PWM = j delay1ms(10) 呼叫延遲函數 feedback() 模糊控制判斷

56

void To_int(void) interrupt 1 Timer0 中斷函數 if (P3_0 == 0) 假如 PWM 輸出為 Low P3_0 = 1 變更 PWM 輸出為 High temp=8192-j4 設定 High 的時間 else 若 PWM 輸出為 High P3_0 = 0 變更 PWM 輸出為 Low temp=8192-880+j4 設定 Low 的時間 TH0 = temp 32 Timer0 的計時時間 TL0 = temp 32 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 char KeyScan(void) 檢查鍵值 char KeyStatus 按鍵狀態 P0=0xff 設定 P0 為輸入模式 KeyStatus=~P0 讀取按鍵狀態 return(KeyStatus) 將鍵值送回程式 void feedback(void) 模糊判斷 void Fuzzycontroller() 函數原型宣告 void condition1() 函數原型宣告

57

void condition2() 函數原型宣告 error1 = ((value)40-160)03 輸入變數 1 delay10ms(10) 延遲 10ms error2 = ((value)40-160)03 輸入變數 2 if (key == 0x01 ) 當按鍵 1找出對應的歸屬函數 並做出模糊控制判斷

int membership[5][3]= -100-60-30-60-300-30030030603060100

int membership1[3][3]=-100-500-50050050100 Fuzzycontroller() condition() if (key == 0x02 ) 當按鍵 2找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

05010050100150100150200150200250200250300 int membership1[3][3]=07515075150225150225300 Fuzzycontroller() condition() else if (key == 0x04) 當按鍵 3找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

200320400300400500400500600500600700600700800 int membership1[3][3]=220370520370520670520670820 Fuzzycontroller() condition() else if (key == 0x08) 當按鍵 4找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

02550255010050100200100200300200300400 int membership1[3][3]=05010050100250100250400 Fuzzycontroller() condition()

58

else if (key == 0x10) 當按鍵 5找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

150250350250350450350450550450550650550650750 int membership1[3][3]=150300450300450600450600750 Fuzzycontroller() condition2() void Fuzzycontroller() 模糊控制判斷 void compute_grade() 函數原型宣告 void compute_grade1() 函數原型宣告 a1 = 0 b1 = 001 I = 0 for (n=0 nlt=14 n++) r = error1 set = Rule[n][0]-1 compute_grade() 計算輸入變數 1 與

模糊程度的歸屬函數 condition = 1 r = error2 set = Rule[n][1]-1 compute_grade1() 計算輸入變數 2 與 模糊程度的歸屬函數 grade[n] = MIN(grade_reg[0] grade_reg[1]) a1 = a1 + (grade[n]membership2[Rule[n][2]-1][1]) b1 = b1 + grade[n] I = a1 b1 得到模糊控制判斷的結果 void compute_grade() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership[set][0]) || (r gt membership[set][2])) 當輸入變數不在 歸屬函數內

59

grade_reg[condition] = 0 else if ((r gt membership[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership[set][2]-r) (membership[set][2] - membership[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership[set][0]) (membership[set][1] - membership[set][0]) void compute_grade1() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership1[set][0]) || (r gt membership1[set][2])) 當輸入變數不在 歸屬函數內 grade_reg[condition] = 0 else if ((r gt membership1[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership1[set][2]-r) (membership1[set][2]-membership1[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership1[set][0]) (membership1[set][1]-membership1[set][0])

60

void condition() P2_0 = 1 設定 P20 為輸入模式 P2_1 = 1 設定 P21 為輸入模式 if ( (P2_0 == 1) ampamp (P2_1 == 0)) 當馬達為正轉時 if ( I gt 0 ) 若模糊判斷結果為正 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 若模糊判斷結果為零 PWM = PWM + 0 PWM 寬度不變 if ( I lt 0 ) 若模糊控制結果小於零 PWM = PWM + 1 PWM 寬度加 1 else if ( (P2_0 == 0) ampamp (P2_1 == 1) ) 若馬達為反轉 if ( I lt 0 ) 模糊控制小於零 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 模糊控制等於零 PWM = PWM + 0 PWM 寬度不變 if ( I gt 0 ) 模糊控制大於零 PWM = PWM + 1 PWM 寬度加 1 CW() 判斷 PWM 寬度上下限

61

void CW() 判斷 PWM 寬度上下限 if ( PWM gt= 215 ) 若 PWM 寬度 gt= 最大寬度 j = 215 PWM 寬度維持於 215us if ( PWM lt= 5 ) 若 PWM 寬度 lt= 最小寬度 j = 5 PWM 寬度維持在 5us if ( PWM gt 5 ampamp PWM lt 215 ) PWM 寬度介於最大與最小間 j = PWM PWM 依模糊控制判斷結果增減 void delay1ms(int count) 延遲 1ms int x y for ( x = 0 x lt count x++ ) for ( y = 0 y lt 122 y++ ) void convert() 數位資料換算成馬達轉速 r1 = ((value)40)-160

62

附錄 C LCD 顯示之程式

includereg51h 含 8051 所有暫存器宣告 include mathh define RS P3_5 LCD 指令資料選擇控制 define RW P3_4 LCD 讀寫控制腳 define Enable P3_3 LCD 致能接腳 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P0_0 = 0x80 接腳定義 sbit P0_1 = 0x81 接腳定義 sbit P0_2 = 0x82 接腳定義 sbit P0_3 = 0x83 接腳定義 sbit P0_4 = 0x84 接腳定義 sbit P0_5 = 0x85 接腳定義 sbit P0_6 = 0x86 接腳定義 sbit ADCRD = P3^7 設定 RD 控制線接腳為 P37 sbit ADCWR = P3^6 設定 WR 控制線接腳為 P36 void delay(void) 函數原型宣告 void delay10ms(int count) 函數原型宣告 void display(void) 函數原型宣告 void InitialLCD(void) 函數原型宣告 void WriteIns(char) 函數原型宣告 void WriteData(char) 函數原型宣告 void WriteString(charchar) 函數原型宣告 void CheckBusy(void) 函數原型宣告 void convert(void) 函數原型宣告 char MSG0[] = Motor Speed = 定義字串 MSG0 char MSG2[] = rpm 定義字串 MSG2 unsigned char MSG1[8]=0000000 定義字串 MSG1 unsigned long int value 讀取 ADC0804 數位資料 int sample = 1000 取樣率設定消除顯示值跳動 long int rpm

63

main() 主程式 InitialLCD() 初始化 LCD IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x01 設定計時器 0 工作於模式 1 TH0 = (65536-5000)256 設定計時器 0 初值 TL0 = (65536-5000)256 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 while(1) 等待中斷 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 while (--sample == 0) 取樣率減 1 sample = 1000 重設取樣率 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 void T0_int(void) interrupt 1 LCD 顯示動態掃描 display() 動態掃描顯示 TH0 = (65536-65535)256 重設計時初值 TL0 = (65536-65535)256

64

void InitialLCD(void) 設定 LCD 模組初始狀態 delay() 延遲函數 WriteIns(0x38) 設定 LCD 模組為 WriteIns(0x38) 2 行顯示 WriteIns(0x38) 8 位元介面 WriteIns(0x38) 5x7 點字型 WriteIns(0x08) 關閉顯示器 WriteIns(0x01) 清除 LCD 螢幕 WriteIns(0x0c) 令顯示器 ON但游標不顯示 WriteIns(0x06) 令 LCD 模組每接收到 1Byte 資料 AC 值自動加 1 void display() 掃描顯示 WriteIns(0x80) 設定 LCD 座標 WriteString(13MSG0) 將字串 MSG0 寫入 LCD 中 WriteIns(0xc0) 設定 LCD 座標 WriteString(8MSG1) 將字串 MSG1 寫入 LCD 中 WriteIns(0xc8) 設定 LCD 座標 WriteString(4MSG2) 將字串 MSG2 寫入 LCD 中 void convert(void) 換算轉速 long int freq freq = ((value)4000) - 16000 數位資料換成頻率公式 rpm = freq3 頻率換算轉速公式 MSG1[0] = (rpm1000000)+0x30 將結果存入字串 MSG1 中 MSG1[1] = ((rpm1000000)100000)+0x30 MSG1[2] = ((rpm100000)10000)+0x30 MSG1[3] = ((rpm10000)1000)+0x30 MSG1[4] = 0x2e MSG1[5] = ((rpm1000)100)+0x30 MSG1[6] = ((rpm100)10)+0x30 MSG1[7] = rpm10+0x30

65

void WriteIns(char instruction) 寫命令至 LCD 中 RS = 0 選擇指令暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = instruction 輸出命令至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteData(char i) 寫資料至 LCD 中 RS = 1 選擇資料暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = i 輸出資料至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteString(countMSG) 寫字串至 LCD 中 char count 字串長度 char MSG[] 字串資料 char i 定義位元組變數 for(i=0 iltcount i++) count 個位元組 WriteData(MSG[i]) 寫入一位元組的資料至 LCD 中 void CheckBusy(void) char i=0x80 檢查忙碌旗標 while(iamp0x80) 忙錄旗標 BF = 1 RS = 0 選擇指令暫存器 RW = 1 讀取 Enable = 1 致能 LCD i = P2 讀取 LCD 指令暫存器內的資料

66

Enable = 0 除能 LCD delay() 延遲函數 void delay() 延遲 5ms int i for(i=0 ilt250 i++)

  • 畢業專題封面pdf
  • File0004pdf
  • 最終版pdfpdf
Page 20: Based on Fuzzy Control Theorem and TPWM Method for DC ... · 使吾人想設計一模糊控制器來做為馬達轉速的閉迴路控制,以解決非線性系統的 問題。除此之外,flcs

11

識和操控目標的一些定性及定量的資訊模糊知識庫和模糊推論是構成Fuzzy規

則系統核心的兩個重要部門﹝7﹞

模糊推論是模糊系統的核心根據知識庫的模糊法則進行模糊理論的合成運

算來模擬人類的思考決策模式一般來說規則的建立是採取十分主觀直覺的

方式依據相關領域專家的經驗與知識透過詢問進而將其知識經驗歸納條列出

重點再轉換成模糊規則的形式表現出來但是並非所有的專家或操作員都能

將自身的經驗知識以言詞的方式充分的表達出來且未必能整理成條列的模糊規

則所以知識規則的萃取工作往往是在建構模糊系統時最常遭遇到的困難之

215 模糊控制器

模糊控制是智慧型控制〈intelligent control〉系統的一種典型其基本特點

是不完全依賴受控對象的數學模型主要是利用人的操作經驗知識和推理技

術以及控制系統的某些訊息和性能得出對應的控制動作模糊控制是以並行

〈parallel〉方式處理規則的推理工作〈如圖25〉其近似推理會包容每個對操

控系統有貢獻的規則即使某些貢獻程度很小的規則也不會忽略

圖 25 模糊控制系統的構造

12

一個控制器的輸入通常是確定數值而非模糊輸出也是如此才能對被控對象

發生作用但是模糊邏輯控制器〈Fuzzy Logic Controller簡稱FLC〉則是以語

言化的控制規則為主體為了能夠把輸入的確定值與語言化之後的控制規則結

合必須把輸入的確定值模糊化〈fuzzification〉以便對應到FLC語言變數的論

域範圍中同樣的經過規則庫推理出來的結果是對應到輸出語言變數的論域

中所以也必須對其做解模糊化〈defuzzification〉的工作才能達成實際的控制

目標

一般模糊控制器的架構包含了五個主要部分定義變數模糊化知識庫

模糊推論及解模糊化

〈1〉 定義輸入及輸出變數

決定程序被觀察的狀況及考慮控制的動作輸入變數可以是擷取

自受控系統的觀測量也可以是推導出來的資料輸出變數則為操控

受控系統的操作量例如在一般控制問題上輸入變數通常為輸出

誤差e與輸出誤差之變化率e而控制變數則為下一個狀態之輸入

u其中eeu統稱為模糊變數

〈2〉 模糊化

將量測值轉換為語言變數的過程將外界所輸入的確定數值經由

一比例映射傳送到輸入變數所對應的模糊論域然後再利用模糊化

函數將此輸入資料轉換成適當的口語值以供模糊運算使用此口語

化變數稱之為模糊子集合

〈3〉 知識庫

模糊知識庫是模糊控制的依據由它來定義所有使用到的語言控

制法則及相關各項參數知識庫可說是整個控制系統資料核心其包

含了兩個部分資料庫〈data base〉與規則庫〈rules base〉

1 資料庫

提供處理模糊數據之相關定義資料庫所存放的資料是關

13

於如何將明確的資料轉換成模糊數值而資料的存放方式是以

歸屬函數表示該選用哪一種歸屬函數依實際的需要選定

以三角形歸屬函數最常被使用因其運算最為容易且又能充分

的表達模糊概念

2 規則庫

利用語言化的條件式控制規則描述控制目標和策略通常

控制規則可以由操控人員的經驗或專家的知識推導出來多個

控制規則所組成的集合就是規則庫

〈4〉 模糊推論

模糊推論為模糊控制最重要的核心其最主要的工作就是做實際

的決策過程處理模糊推論具有模擬人類做決策判斷的能力其基本

理論就是根據人類特有的近似推理方式如之前已說明的GMP和

GMTGMP為前向推理而GMT為逆向推理因為模糊推論為前向

運算因此GMP非常適合使用為模糊控制的推論機構

〈5〉 解模糊化

將推論完成所得到的模糊輸出量轉換成實際的明確數值以便和

外界溝通解模糊化的方法有很多例最大歸屬度法重心法高

度法面積法等

圖 26 模糊系統的基本架構

14

22 直流馬達數學模型

圖27為直流馬達等效電路簡圖其中

iV = 輸入電壓 ai = 電樞電流

zR = 電樞電阻 gT = 轉矩

aL = 電樞電感 bE = 反電動勢

φ = 空氣隙磁通量 ω = 轉子角速度

B = 黏滯摩擦係數 J = 轉動慣量

圖 27 直流馬達等效電路簡圖

由克希荷夫電壓定律知

( ) ( ) ( )tEdt

tdiLtiRV b

aaaai ++= 〈26〉

由於反電動勢 bE 與轉軸的角速度 ( )tω 及空氣隙磁通量φ之乘積成正比即

( ) ( ) ( )tKtKtE emb ωφω == 〈27〉

15

又轉矩的平衡方程式為

( ) ( ) ( )dt

tdJtBtTgωω += 〈28〉

且馬達轉矩 gT 與電樞電流 ( )tia 及空氣隙磁通量φ乘積成正比即

( ) ( ) ( )tiKtiKtT ataag == φ 〈29〉

取〈26〉~〈29〉式之拉氏變換得

( ) ( ) ( ) ( )sEssILsIRsV baaaai ++= 〈210〉

( ) ( )sKsE eb Ω= 〈211〉

( ) ( ) ( )sJssBsTg Ω+Ω= 〈212〉

( ) ( )sIKsT atg = 〈213〉

則馬達輸入電流與轉速為

( ) ( ) ( )( ) ( )( )

sR

sEsV

sLRsEsV

sIe

a

bi

aa

bia τ+

minus

=+minus

=1

〈214〉

( ) ( ) ( )

sB

sT

sJBsT

sm

gg

τ+=

+=Ω

1 〈215〉

其中a

ae R

L=τ 為電樞電流的電氣時間常數 BJ

m =τ 為馬達轉動的機械時間

常數

直流馬達轉速對輸入電壓的轉移函數 ( )sG 為

( ) ( )( ) ( )( ) etaa

t

i KKBJsRsLK

sVssG

+++=

Ω=

( )( ) etmea

t

KKssBRK

+++=

ττ 11 〈216〉

16

在一般情況電樞電感很小所以 eτ 可以忽略不計因此上式成為一階落後

方程式

( ) ( )( ) ( ) m

m

etma

t

i sTK

KKsBRK

sVssG

+=

++=

Ω=

11 τ 〈217〉

其中

eta

mam KKBR

BRT

+=

τ

eta

tm KKBR

KK

+=

所以直流馬達數學模式可以以圖28表之﹝8﹞

圖 28 直流馬達數學模式方塊圖

17

第三章 系統功能分析與製作規劃

31 專題製作流程

如圖 31 所示本專題主要分為兩條路徑進行一為硬體另一則為軟體程

式撰寫本章著重硬體的規劃設計軟體則在第四章中介紹在完成 AB 信號

產生電路驅動功率放大電路與間距脈波產生電路設計與製作後須先接上馬達

做一連串的測試〈此時系統並無回受控制〉測試間距脈波是否太長或太短硬

體電路是否有缺失hellip等等另一方面也著手撰寫模糊控制程式並將其與硬體電

路結合最後做閉迴路系統的整合測試若發現系統的運作結果並不如預期

則需分別從硬體與軟體兩方面去改良

直流馬達轉速之模糊控制

文獻蒐集與整理

AB信號產生電路設計與製作

驅動功率放大電路設計與製作

間距脈波產生電路設計與製作

測試間距脈波是否太長或太短

系統測試測試馬達轉速是否

達到控制目的

結束與論文寫作

重新設計間距脈波長度

Yes

No

系統整合與修正

輸出信號與Fuzzy控制器之連結設計

規劃輸出與輸入歸屬函數

規劃模糊知識庫

撰寫主程式並加入模糊知識庫

程式編譯及連結

軟硬體整合測試馬達是否運作

程式調整及最佳化

No

YesYes

No

圖 31 專題製作流程圖

18

32 雙脈寬調變法之直流馬達驅動電路設計

本專題製作的雙脈寬調變法之直流馬達驅動電路設計大致可以分為二大部

分第一雙脈寬調變法之電路設計第二橋型驅動功率放大電路

雙脈寬調變〈Two Pulse Width Modulation簡稱TPWM〉之電路設計主要

是先製作一脈寬調變〈Pulse Width Modulation簡稱PWM〉波形然後再將此

波形各別經由一緩衝器〈buffer〉和反向器〈inverter〉則可產生AB驅動信號

脈波此即為TPWM

321 脈寬調變電路

如圖32先利用兩顆op產生三角波電路再利用一個比較器比較三角波

和誤差值之大小

150k

1M

20k

+12V

-12V

+12V

-12V10k

+12V

-12V

10k

+12V

-12V-

+-

+

-

+ PWMLM324

LM324

LM324

2200pF

圖 32 脈寬調變電路

〈1〉 三角波產生電路

三角波產生電路通常至少需要兩個運算放大器其電路如圖33OP1

為一個反相積分器OP2為一個史密特磁滯比較器將OP2的輸出方波經

19

OP1反相積分以後得到Vo1三角波此三角波又同時加到OP2控制其狀

態的改變

當方波產生器的輸出是正的則三角波產生器的輸出是斜向負相似

地當方波產生器的輸出是負則三角波產生器的輸出是斜向正這個動

作將產生三角波的輸出同時也輸出方波﹝9﹞

+VCC

-VCC

-

+

R1

R2

R3

+VCC

-VCC

-

+

OP1

OP2

Vo2Vo1

圖 33 三角波產生電路

對OP2而言是磁滯比較必須先找到OP2的 THV 和 TLV

232

21

32

3oo v

RRR

vRR

Rv

++

+=+ 〈31〉

當 0=+v 時

23

21 oo v

RR

v minus= 〈32〉

表要達到OP2的 0=+v 必須有這麼大的 1ov

當 12 sato Ev = 時

TLsato VERR

v =minus= 13

21 〈33〉

當 22 sato Ev minus= 時

THsato VERR

v =+= 23

21 〈34〉

20

對OP1而言是反相積分器 2ov 為其輸入 1ov 為其輸出則

tCIt

Rv

Ct

CRv

dtvCR

v oooo

11

2

11

22

111

11minus=minus=minus=minus= int 〈35〉

因為

1

2

Rvv

I o minusminus= 0=minusv 〈因為虛接地〉 〈36〉

所以

1

2

Rv

I o= 〈37〉

又因運算放大器的輸入阻抗非常大則流經 1C 的電流也為 I 相當於以定

電流對電容C 充電

當 12 sato Ev = 時 1ov 為下降斜波

tR

EC

v sato

1

1

11

1minus= 〈38〉

當 22 sato Ev minus= 時 1ov 上升斜波

( )

tRE

Cv sat

o1

2

11

1 minusminus= 〈39〉

由此可知三角波的上升與下降斜波乃因 1C 的充電與放電且時間

常數為 11CR

三角波週期分析如下

1 上升斜波的時間 1T

tCR

vv o

o1

1

21 minus= 11

2

1 CRvv

to

ominus=

1Tt = TLTHo VVv minus=1 22 sato Ev =

11111

21

sat

TLTH

sat

TLTH

EVV

CRCRE

VVT

minus=

minusminus= 〈310〉

2 下降斜波的時間 2T

tCR

vv o

o1

1

21 minus= 11

2

1 CRvv

to

ominus=

21

2Tt = THTLo VVv minus=1 12 sato Ev =

1

11111

1sat

TLTH

sat

THTL

EVV

CRCRE

VVT

minus=

minusminus= 〈311〉

3 週期 21 TTT +=

若 1satE = 2satE = satE 且3

22RR

VV TLTH =minus satE

3

2114

RR

CRT=

若R3 = nR2

則nCR

T 114=

114 CR

nf = 〈312〉

《實驗結果》

必須注意的是三角波的頻率太低將導致馬達的轉動產生脈動現象

故將工作頻率設計在1kHz以上

Ω= k1501R Ω= k102R

Ω= k203R pFC 22001 =

所得到的三角波頻率為

15kHz10220010001504

00010100020

f 12- =timestimestimestimes

timestimes

=

圖 34 三角波輸出波形

22

〈2〉 脈寬調變電路〈PWM〉

+12V

-12V

10k

+12V

-12V -

+ PWM輸出LM324三角波輸入

圖 35 脈寬調變電路

PWM系統往往連接至直流電源供應放大器的工作是以固定的頻率開

閉直流供應電壓其激發角是可以調整的因此得到波寬可調的輸出

將固定頻率的三角波與反向輸入的電壓做比較便可輸出一脈寬〈見圖

36〉反向電阻值的不同將導致反向輸入電壓不同故其輸出為一可調但

頻率固定的脈寬也正因為如此故稱為脈寬調變〈PWM〉由於輸出的

dutycycle不同故馬達將接收到不同的平均電壓因而可以藉由PWM控制

馬達的轉速

反相輸入電壓

PWM

圖 36 三角波與反相輸入電壓比較

23

PWM的優點在於馬達驅動電路的電晶體之控制信號改以脈波列來控

制使電晶體操作成類似開關的動作不是完全導通就是完全截止故電晶

體不是一直操作於作用區所以其功率消耗不大整體效率較高

《實驗結果》

圖 37 PWM 輸出波形

322 橋型驅動功率放大電路

如圖38所示主要由四個功率電晶體組成利用不同的電晶體對使直流

馬達做正逆轉控制當Q5Q8導通使馬達正轉當Q6Q7導通馬達則逆

轉電路中的電晶體扮演開關的作用

此種電路簡單只要一組直流電源供應且電晶體分擔了部份的電壓保護

電晶體迅速工作於截止與飽和狀態之間故沒有功率散逸損失之虞

但是在設計時切勿使Q5Q6同時導通以免燒毀電路上之元件因為在

AB兩脈波短暫的交變時間內由於電晶體本身之最小延遲時間有可能使Q5

Q6同時ON與Q7Q8在很短時間同時ON因此在15kHz交變下容易燒毀功

率電晶體

因此設計一間距脈波電路主要之功用使Q5Q6和Q7Q8均不同時導通

24

以拉長AB兩者交換時間

M

20k

10k

20k

10k

+24V

A 信號 B 信號

2N3055 2N3055

2N2955 2N2955

1N40021N4002

C1815 C1815

C1815 C1815

Q5

Q8Q6

Q7

圖 38 橋型驅動功率放大電路

圖 39 橋型驅動功率放大電路實體圖

25

此外若考慮電晶體BE間的電壓則電路會出現約 plusmn 06V的不感帶〈ded

band〉即電晶體的 oV 對 inV 間的關係如圖3101假使 inV 電壓為正弦波則 oV 變

成如圖3102為了改善這種缺失吾人利用兩個二極體接在電路上如圖38

用來補償電晶體BE間的壓降﹝10﹞

約06V

Dead band

Vo

Vin

圖 3101 呈現不感帶的轉移函數

圖 3102 輸出電壓波形

26

323 間距脈波產生電路

RCext15

Cext14 74123

A3

B2

Q13

CLR1

Q4

7486100k

2200pF

10k

10000pF

+5V

間距脈波輸出

圖 311 間距脈波產生電路

間距脈波的產生方式是根據脈寬調變〈PWM〉後的訊號再經由積分電路的

電阻兩端取出且經由兩倍頻器〈74LS86〉檢示出PWM的正負緣脈波最後

再利用單穩態IC〈74LS123〉將檢出信號之脈寬拉長至01ms此即為間距脈波

74LS123有兩個輸入端子A及B分別為下降波緣輸入端子及上升波緣輸入端

子當輸入A之脈波由ldquoH變成ldquoL之瞬間Q輸出變為ldquoH其持續時間長

短由RC時間常數決定反之當輸入B之脈波由ldquoL變成ldquoH之瞬間Q輸出

變成ldquoH維持一定時間

74LS123的輸出脈波之寬度是由電阻及電容之時間常數所決定概略計算公

式如下

CR045T timestimes=

電容 C 必須大於 1000pF

27

《實驗結果》

R=24kΩ C=10000pF

所以得到間距脈波為

( )msec0110810000p24k045T cong=timestimes= μ

圖 312 間距脈波

研究經分析後發現

1 間距 T 愈大愈能確保電路之安全性愈有保護作用

2 間距 T 愈大相對的使驅動信號脈波減少愈多造成馬達旋轉扭力大

大減弱

3 適當的間距 T不但不會影響馬達的輸出轉矩而且兼具保護電路的

效果

33 編碼器

轉動編碼器不只可以作為轉速的感測也能做位置的感測又適合於數位處

理故被廣泛使用若就信號來看轉動編碼器可分為增量型與絕對型若以檢

測的方式來分可分為光學式和磁式兩種在本專題中所使用的編碼器為光學式

增量型編碼器﹝11﹞

光學式轉動編碼器的原理如圖 313在附有細縫轉盤的兩側分別裝置發光元

28

件與受光元件如果只有一組光電檢測元件則輸出信號就只有一相的脈波信

號此種裝置稱為脈波產生器圖 314 為增量型轉碼器的輸出信號它是利用

兩組光電元件所產生的脈波信號A 相和 B 相間有相位差正轉時 A 相領前 B

相逆轉時 B 相領前 A 相因此利用此兩相做檢測馬達為正轉或逆轉的工作

並利用 A 相或 B 相的頻率檢測出目前的轉速

吾人計算出編碼器每一轉可以產生約 200 個脈波故檢測 A 相或 B 相其頻

率為 N則轉速應為 60200

timesN

〈rpm〉

圖 313 光學式轉動編碼器的原理圖

圖 314 編碼器的輸出信號波形

29

34 LM2917 FV 電路設計

對 LM2907 而言磁滯比較器和電流汞是構成頻率對電壓轉換的基本架構

並且預留一個運算放大器及一個電晶體供各種不同的使用圖 315 為吾人所設

計的 FV 電路圖中 C1 用以抑制電流汞動作時所產生的漣波變化正常使用時

此電容應大於 10C若 C1 太大也將造成轉換速度下降

因為單晶片 8051 之輸入電壓最高為 5V故必須設計其馬達最高轉速頻率所

轉成的電壓必須在 5V 以內由於馬達轉速頻率範圍極大故吾人給予 LM2917

+12V 的電壓以擴大它可以轉換的電壓範圍並將所需維持在 5V 內

a1

14

b1

1

a1

13

b1

2

a1

12

b1

3

a1

11

b1

4

1

a1

10

b1

5

a1

8

b1

7

a1

9

b1

6

L2917

Encoder輸 入

1uF

+12V

FV輸出1000pF

45k 10kC1

C2

圖 315 FV 電路

30

《實驗結果》

根據統計結果每 50mV 相對於 100Hz如此一來吾人想得知馬達目前

的轉速只要將單晶片所接收到的電壓值經過換算即可得知目前 encoder 所量測

的頻率吾人知道 encoder 一圈可產生 200 個脈波故馬達的轉速便可經過下列

公式換算得知

轉速〈rpm〉 60200

times=f

其中 =f encoder 所量測到的頻率

表 31 頻率與轉換電壓之關係

頻率

(Hz) 1 2 3 4 5 6 7 8 9

電壓(V) 0006 0006 0007 0008 0009 0009 0009 0009 001

頻率

(Hz) 10 20 30 40 50 60 70 80 90

電壓(V) 008 009 010 010 011 011 012 012 013

頻率

(Hz) 100 200 300 400 500 600 700 800 900

電壓(V) 013 018 023 028 033 038 043 049 054

頻率

(Hz) 1000 2000 3000 4000 5000 6000 7000 8000 9000

電壓(V) 059 109 16 209 257 304 3508 4006 45

31

圖 316 頻率對電壓曲線

35 單晶片介面電路

單晶片介面包括了二大部分分別為單晶片 8051AD converter

〈1〉8051 單晶片

為本控制系統的核心一切動作皆經由它控制

〈2〉AD converter

將類比開關所送出來的類比訊號經由 ADC 0804 轉換成數位訊號傳送

到單晶片的輸入埠

351 AD 轉換

以單晶片 8051 控制 ADC0804則單晶片 8051 必須下達ldquo開始轉換rdquo的命令

給 ADC0804然後 ADC0804 就開始讀入類比輸入端的電壓在內部開始轉換

經過一段轉換時間後〈約 100μ s〉ADC0804 就將轉換完成的值放在其內部的三

態輸出栓鎖緩衝器裡然後將轉換完成輸出腳〈INTR〉降為 low以通知單晶片

可以去讀轉換完成資料

當WR和CS 同時為ldquo0rdquo時表示對 ADC0804 下達ldquo開始轉換rdquo命令再經過

32

一段轉換時間〈100μ s〉後轉換完成ADC0804 會將其轉換完成的數位資料放

在其內部 8 位元緩衝區裡且將 INTR 降為ldquo0rdquo因此單晶片只要下達ldquo開始轉換rdquo

命令後去檢查 INTR 的狀態就可以知道是否轉換完畢其方法有兩種

1 輪詢法〈polling〉

2 中斷法〈interrupt〉

所謂輪詢法就是將 ADC0804 的 INTR接到 CPU 的一條 IO 線上然後以軟體指

令主動偵測其狀態當偵測到為ldquo0rdquo時就可以去讀出 ADC0804 裡的緩衝區的轉

換值

中斷法是一個很理想的 IO 方式因為不像輪詢法必須讓 CPU 等 ADC0804

轉換當 CPU 下達ldquo開始轉換rdquo命令後就可以做其他工作當 ADC0804 轉換完

畢後 INTR會降為ldquo0rdquo可以利用此信號去中斷 CPU再由中斷副程式去讀入

轉換值即可因此大大提高了程式的效率

當 CPU 接收到 ADC0804 發出ldquo轉換完畢rdquo的信號〈 INTR =0〉後就可以去

讀出轉換值其讀出的方法是將CS 與RD設為ldquo0rdquo即可讀到轉換值這個讀值的

動作又會使得 INTR恢復成ldquo1rdquo

1 CPU 下達ldquo開始轉換rdquo命令〈CS =0WR =0〉

2 ADC0804ldquo轉換完畢rdquo 〈 INTR =0〉

3 CPU 讀取轉換值〈 RD =0CS =0〉

4 讀完後 INTR =1

ADC0804 主要規格摘要如下

1 +5V 單電源工作電壓

2 類比電壓輸入範圍 0~+5V

33

3 參考電壓為 25V

4 轉換時間為 100μ s〈 CLKf =640kHz〉

5 解析度為 8 位元

6 誤差plusmn 1LSB

7 讀取時間 135ns

36 電源供應系統

本專題中所有電路及硬體設備所需的電源採用交流電源 110V 經由 PT-31

變壓器後再經過橋式整流後提供了直流電源而因為各個電路所需電源不同

因此製作了多組的變壓電路如下

1電壓源 DC5V選擇了 7805 的穩壓 IC 搭配電容得到了+5V 的電壓源

供〈1〉8051 微處理器 〈2〉ADC 0804 〈3〉74LS8674LS12374LS04

74LS02CD4013 〈4〉馬達 Encoder

2電壓源 DC12V使用 7812 穩壓 IC 搭配電容得到+12V 的電壓源供

LM2917 使用

3電壓源 DC24V利用 7824 的穩壓 IC 搭配電容獲得+24V 的直流電壓

源供電路之橋型驅動功率放大之電晶體使用

Vin1

+12V2

GND3

LM7812

2200uF 10000pF 2200uF 10000pF

+12V outputAC

圖 317 直流電源電路

34

圖 318 直流電源電路實體圖

37 馬達轉速的量測

表 33 PWM 輸出對應 encoder 週期

PWM dutycycle encoder 週期 PWM dutycycle encoder 週期

40 sμ 172 sμ 440 sμ 0 sμ

80 sμ 188 sμ 480 sμ 0 sμ

120 sμ 204 sμ 520 sμ 0 sμ

160 sμ 230 sμ 560 sμ 0 sμ

200 sμ 272 sμ 600 sμ 0 sμ

240 sμ 328 sμ 640 sμ 0 sμ

280 sμ 416 sμ 680 sμ 1320 sμ

320 sμ 540 sμ 720 sμ 750 sμ

360 sμ 800 sμ 760 sμ 510 sμ

400 sμ 1320 sμ 800 sμ 400 sμ

35

圖 319 PWM 輸出對應 encoder 週期

由統計可知道此馬達並不是一顆線性馬達故相信若使用模糊控制理論來

作為其回授控制系統的控制器一定能達到比傳統控制器的性能還要好而且若能

在模糊控制裡加上 PID 控制器的觀念一定能在系統的響應時間上升時間

安定時間和超越量達到最佳的控制另一方面馬達在其反方向的內阻較大需

要更大的力量才能使馬達驅動

36

第四章 軟體規劃與製作

41 PWM 之軟體設計

因為之前所介紹的硬體方式是以調整可變電阻來達到轉速的調整因此無法

得知所給予的脈寬長度和轉速大小尤其在回授時也不易給予適當的訊號來調整

轉速因此改良之方法就是以8051之軟體撰寫方式來產生固定的脈寬也就等

於給予轉速的命令而在其回授控制時也只要在內部程式给予適當的指令便可

達到脈寬長度的調整以達到閉迴路之受控系統

411 PWM 軟體流程

設定Timer0模式為0

TH0 = temp 32 TL0 = temp 32

temp = 8192 ndash j4 Key = 0

檢查是否有鍵值

將鍵值存入Key

Yes

No

設定Key值所對應的 j值

If P30 == 1Then P30 = 0 temp = 8192 ndash j4Else P30 = 1 temp=8192ndash880+j4

TH0 = temp 32 TL0 = temp 32

Start Timer0中斷副程式

啟動Timer0

等待Timer0中斷

返回主程式

圖 41 PWM 軟體設計流程圖

37

在此總共設計了五個按鈕分別代表不同的轉速停止正轉〈慢〉正轉

〈快〉逆轉〈慢〉和逆轉〈快〉使用Timer0是因為8051之計時中斷比延遲程

式來的準確故可以達到準確的計時程式設計理念中並沒有將中斷致能清除

因此Timer0會一直處於計時的狀態程式執行時將一邊檢查鍵值〈KeyStatus〉一

邊進行計時當計時完畢便呼叫中斷副程式然後執行改變Port 30的輸出狀

態若是為high則變為low反之若是為low即變為high同時並重設計時時間

Timer0繼續計時

當鍵值改變時計時的時間也會跟著改變如此一來Timer0將ㄧ直重覆上

述動作直到電源切掉Timer0才會停止計時

42 模糊控制之程式規劃與撰寫

本專題目標在完成了先前所規劃的硬體電路之後接著就是要達成利用模糊

控制理論來設計控制器在此採用了單晶片8051目的是為了以硬體實現方式來

代替電腦模擬期望能夠按照原訂計畫完成本專題「具模糊控制理論與雙脈寬調

變法之直流馬達驅動電路設計」

單晶片 8051 模糊控制的程式撰寫採下列幾個步驟依序完成

1 設定變數轉速誤差〈dspeed〉目前轉速〈sspeed〉

2 模糊化採用三角形歸屬函數採用三角形歸屬函數的原因

〈1〉 三角形函數為一連續函數

〈2〉 三角形函數為線性的函數所以計算速度較快

〈3〉 是具有發散也有收斂的函數和指數函數一樣接近

事實

3 模糊推論模糊規則將其所有可能發生情況以 IFhellipTHENhellip表示

並建立控制規則表

4 解模糊化採用重心法

38

421 歸屬函數

設定變數為目前轉速〈sspeed〉與轉速誤差〈dspeed〉因此此模糊控制器共

有兩個輸入訊號與一輸出訊號輸出訊號為脈寬長度該加或是減多少又因為有

五種不同的轉速因此各分別設計了不同的歸屬函數如下

1 當轉速 = 0

ml h

s s p e e d

d s p e e d

r p m0 5 0 1 0 0- 5 0- 1 0 0

mv l l h v h

r p m0- 3 0- 6 0- 1 0 0 3 0 6 0 1 0 0 圖 42 停止時之歸屬函數

2 正轉〈慢〉

ml hsspeed

dspeed

rpm150 225 300750

mvl l h vh

rpm150100500 200 250 300

圖 43 正轉〈慢〉之歸屬函數

39

3 正轉〈快〉

ml hsspeed

dspeed

rpm520 670 820370220

mvl l h vh

rpm500400300200 600 700 800

圖 44 正轉〈快〉之歸屬函數

4 逆轉〈慢〉

ml hsspeed

dspeed

rpm100 250 400500

mvl l h vh

rpm10050250 200 300 400 圖 45 逆轉〈慢〉之歸屬函數

40

5 逆轉〈快〉

ml hsspeed

dspeed

rpm300 450 600150

mvl l h vh

rpm450350250150 550 650 750

750

圖 46 逆轉〈快〉之歸屬函數

6 輸出

OutputMVL L H VH

rpm0-50-150-250 50 150 250

圖 47 輸出之歸屬函數

41

422 模糊規則庫

表 41 為吾人所設計的模糊控制規則庫並利用 Matlab 之 Fuzzy ToolBox 來

建立此規則庫以進行模擬推論圖 48 為當馬達輸入指令為正轉慢時推論後所得

到的三維空間圖

表 41 模糊控制規則表

Dspeed

vl l m h vh

l H M L VL VL

m VH H M L VL sspeed

h VH VH H M L

圖 48 推論後的三維空間圖

42

423 模糊控制器之軟體設計流程

Start 外部中斷副程式

ADCWR = 0 ADCWR = 1

〈令AD開始轉換〉

檢查鍵值以得到對應的歸屬函數

取得目前轉速與

轉速誤差

Fuzzy Rules決策

得到輸出訊號

Delay 10ms

ADC = 0 讀取AD值 ADCRD = 0

將AD值換算成轉速

ADCWR = 0 ADCWR = 1

〈AD開始轉換〉

返回主程式

致能外部中斷

圖 49 Fuzzy Controller 程式流程圖

當控制器一開始動作時便先執行AD轉換的工作當AD轉換完成時其

INTR的接腳便會觸發8051的外部中斷INTR0於是程式便發生外部中斷執行

外部中斷副程式的指令

43

在外部中斷副程式中AD將ㄧ直進行轉換與讀取的工作同時並將轉換後

的值直接換算成目前轉速與轉速誤差以供模糊控制器使用換算目前encoder

的頻率其公式為

160-V2000 times=頻率 〈4-1〉

式4-1之公式是根據表31所導出來的其中V為encoder之頻率轉成電壓之值

又假設所讀取的AD轉換值為value因為

AD的解析度 = bit256

5V+ = 511 ( Vbit ) 〈4-2〉

故value值與電壓V之關係為

511 value V times= 〈4-3〉

所以encoder之頻率與value值的關係為

頻率= 2000times ⎟⎠⎞

⎜⎝⎛ times

511 value - 160 〈4-4〉

故目前轉速為

sspeed = ( )rpm 60 200

times頻率 〈4-5〉

另ㄧ方面在主程式中程式會先去檢查鍵值也就等於檢查輸入指令以

找出符合使用的歸屬函數並將AD所獲得的轉速對應到歸屬函數中然後執行

決策判斷即進入規則庫中尋找出適當的決策判斷最後將此決策送入PWM程

式裡進行脈寬長度的調整使馬達在合理的要求下達到理想的轉速控制不會

因為外在環境的影響而使馬達轉速受到干擾

43 LCD 顯示轉速

此專題最後再增加一LCD顯示幕以顯示目前的轉速否則在程式設計完成

後人卻因無法以肉眼得知目前轉速而不能肯定馬達轉速是否有達到控制的目

標因此增加一顯示幕LCD是有必要的不僅隨時得知目前的轉速還能知道

44

設計出來的軟體其控制性是否夠好夠穩定

431 LCD 顯示幕之軟體流程

Start

設定LCD模組的初始狀態

設定外部中斷INTR0

與Timer0

設定TH0 = (65536 ndash 5000) 256 TL0 = (65536 ndash 5000)256

令ADCWR = 0 ADCWR = 1 AD開始轉換

等待中斷

外部中斷副程式

ADCRD = 0 讀取AD值 ADCRD = 1

將AD值換算成速度

ADCWR = 0 ADCWR = 1 AD開始轉換

Timer0中斷副程式

顯示LCD第一行

ldquoMotor Speed =

顯示LCD第二行ldquoxxxxxxx rpm其中 xxxxxx為外部中斷副程式所換算出的轉速

重設TH0與TL0

返回主程式返回主程式

圖 410 LCD 顯示幕之程式流程圖

此程式主要由兩個部分完成一為外部中斷副程式另ㄧ為 Timer0 中斷副

程式當主程式完成外部與 Timer0 兩個中斷的設定後隨即命令 AD 開始轉換

之後便一直停在 while〈1〉的迴圈裡不做任何動作而由兩個中斷副程式來完

成整個轉換與顯示的工作

45

外部中斷副程式主要負責 AD 的轉換讀取與轉速換算的工作AD 第一

次的轉換由主程式來下達命令當轉換完成後AD 的 INTR 接腳將觸發外部中

斷〈INTR0〉副程式此時程式便進入外部中斷副程式執行讀取 AD 值與轉速

換算的工作當這些工作完成時外部中斷副程式再次下達 AD 開始轉換的命

令而離開中斷副程式當 AD 再次轉換完成時又將再次執行中斷副程式

如此週而復始中斷副程式將ㄧ直進行讀取換算與轉換的工作

而 Timer0 中斷副程式主要負責 LCD 顯示之工作當主程式所設定的計時時

間計數完時程式便進入 Timer0 中斷副程式一旦進入 Timer0 中斷副程式程

式將執行 LCD 的顯示然後再重設 Timer0 的計數時間Timer0 將重新計數當

計數完時程式又將再度進入 Timer0 中斷副程式執行因為程式中並無清除

Timer0 的中斷致能故 Timer0 中斷副程式和外部中斷副程式ㄧ樣週而復始的

執行其副程式的工作

46

第五章 結論

本計劃主旨為具模糊控制理論與雙脈寬調變法之直流馬達驅動電路設計主

要是針對傳統電路設計之缺點提出改良之方法以TPWM取代PWM電路以模

糊理論基礎設計之控制器替代傳統PID控制器

TPWM轉速控制優於PWM之處在於

1 TPWM只需使用單電源即可達到正轉和逆轉的轉速控制而PWM必須

加上逆向開關或是雙電源才能使馬達產生正轉和逆轉

2 TPWM可控制馬達處於停止狀態無論在正向或逆向加上負載皆無法使

馬達產生轉動

3 馬達消耗定額功率輸出轉矩為額定值

4 馬達由停止到某定轉速時反應時間較快

模糊控制器優於PID控制器

1 不須導出繁雜的數學模型

2 適用於非線性系統

3 強健性與容錯性較高

本專題至此雖說大致的目標都已達到但是此系統仍然有許多不完美而需要

改進的地方例如在實驗過程中發現整個轉速的控制在回授上其反應時間

有點慢探討其原因有可能是控制器之程式上的問題

1 因為使用C語言撰寫程式故其執行速度較慢

2 程式可能寫的太累贅

3 模糊控制規則庫建立不良

若想改善這些問題可以嘗試著將C語言改為組合語言來撰寫並盡量減少

47

不必要的指令相信此動作一定能大大提昇程式的執行速度其次就是多做測

試利用測試中所學到的經驗來幫助模糊控制規則庫的改寫同時也能從測試中

發現更多的問題若是都能對問題加以一一解決的話相信必定能將此控制系統

做的更盡善盡美

48

參考文獻

﹝1﹞ 李適中直流馬達速度控制伺服控制〈基礎篇〉全華科技圖書股份有

限公司民 74

﹝2﹞ 廖錦文ldquo直流電動機之雙脈寬調變是〈TPWM〉驅動電路研究電

子技術月刊第 69 期pp94-1021992

﹝3﹞ 楊英魁孫宗瀛鄭魁香林建德蔣旭堂模糊控制理論與技術全華

科技圖書股份有限公司民 85

﹝4﹞ 林敦煌陳憬德直流馬達定位及轉速的模糊控制逢甲大學自動控制工

程學系學士論文民 87

﹝5﹞ LAZadehldquo Fuzzy Sets Information and Control Vol8 pp338-353

1965

﹝6﹞ EHMamdani and SAsslianldquo A fuzzy logic controller for a dynamic

plant Internation Journal of Man-Machine Studies Vol7 pp1-13 1975

﹝7﹞ 孫宗瀛楊英魁Fuzzy 控制理論實作與應用全華科技圖書股份有

限公司民 83 年

﹝8﹞ 許中平黃煌嘉直流電動機控制電路設計全華科技圖書股份有限公司

民 75

﹝9﹞ 盧明智黃敏祥OP Amp 應用+實驗模擬全華科技圖書股份有限公司

民 83

﹝10﹞陳文耀電動機控制工程復文書局2003

﹝11﹞許中平林全福電動機運轉控制技術全華科技圖書股份有限公司民

77

﹝12﹞楊明豐8051 單晶片 C 語言設計實務碁峯資訊2003 年

﹝13﹞蔡朝洋單晶片微電腦 80518951 原理與應用全華科技圖書股份有限公

司民 91

49

﹝14﹞王文俊認識 Fuzzy全華科技圖書股份有限公司民 90

50

附錄 A 專題硬體展示圖

圖 A-1 硬體整體圖

圖 A-2 硬體整體鳥瞰圖

51

圖 A-3 硬體側視圖

圖 A-4 操作與顯示面板

圖 A-5 間距脈波電路與 FV 電路

52

圖 A-6 橋型驅動功率放大電路

圖 A-7 操作與控制面板

53

附錄 B PWM 與模糊控制之程式

include reg51h include stdioh sbit ADCRD = P3^1 設定 RD 控制線接腳為 P31 sbit ADCWR = P3^3 設定 WR 控制線接腳為 P33 sbit P2_0 = 0xA0 接腳定義 sbit P2_1 = 0xA1 接腳定義 sbit P3_0 = 0xB0 接腳定義 sbit P3_1 = 0xB1 接腳定義 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P3_6 = 0xB6 接腳定義 void KeyStatus(void) 函數原型宣告 void feedback(void) 函數原型宣告 void compute_grade(void) 函數原型宣告 void delay1ms(int count) 函數原型宣告 void convert() 函數原型宣告 void condition() 函數原型宣告 void CW(void) 函數原型宣告 int j i 對應 PWM 的寬度 unsigned int temp 所設計的計時器時間 int sample = 1000 取樣率設定消除顯示值跳動 long int value r1 讀取 ADC0804 數位資料 long int set n condition select long int r grade_reg[2] grade[15] error1 error2 long int a1 b1 I long int membership[5][3]membership1[3][3] 定義歸屬函數 long int membership2[3][3] = -10-50-5050510 long int error[2] int Rule[15][3] = 113213313 定義判斷規則庫 212223323 311232333 411241342 511251351

54

main() 主程式 j = PWM = 110 設定 PWM 初始值 IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x00 設定計時器 0 工作於模式 0 temp=8192-j4 設定計時器 0 初值 TH0 = temp 32 TL0 = temp 32 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 P3_4 = 1 P3_5 = 0 P3_6 = 0 ADCWR = 0 令 ADC0804 的 WR = 0 ADCWR = 1 令 ADC0804 的 WR = 1 while (1) KeyStatus() 檢查鍵值 void KeyStatus(void) 檢查鍵值並給對應的 PWM 值 char KeyScan(void) 按鍵掃描函數宣告 unsigned char KeyStatus unsigned char Key = 0 KeyStatus=KeyScan() 呼叫按鍵掃描函數 if (KeyStatus = 0) 已有按鍵輸入 Key = KeyStatus Key = 鍵值 if (Key == 0x01) 假如輸入為按鍵 1 i = 110 PWM 為 110us j = i P3_4 = 1 LED 亮第一顆〈表馬達停止〉 P3_5 = 0 P3_6 = 0

55

else if (Key == 0x02 ) 假如輸入為按鍵 2 i = 140 PWM 為 140us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x04 ) 假如輸入為按鍵 3 i = 180 PWM 為 180us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x08 ) 假如輸入為按鍵 4 i = 80 PWM 為 80us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 else if (Key == 0x10 ) 假如輸入為按鍵 5 i = 40 PWM 為 40us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 PWM = j delay1ms(10) 呼叫延遲函數 feedback() 模糊控制判斷

56

void To_int(void) interrupt 1 Timer0 中斷函數 if (P3_0 == 0) 假如 PWM 輸出為 Low P3_0 = 1 變更 PWM 輸出為 High temp=8192-j4 設定 High 的時間 else 若 PWM 輸出為 High P3_0 = 0 變更 PWM 輸出為 Low temp=8192-880+j4 設定 Low 的時間 TH0 = temp 32 Timer0 的計時時間 TL0 = temp 32 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 char KeyScan(void) 檢查鍵值 char KeyStatus 按鍵狀態 P0=0xff 設定 P0 為輸入模式 KeyStatus=~P0 讀取按鍵狀態 return(KeyStatus) 將鍵值送回程式 void feedback(void) 模糊判斷 void Fuzzycontroller() 函數原型宣告 void condition1() 函數原型宣告

57

void condition2() 函數原型宣告 error1 = ((value)40-160)03 輸入變數 1 delay10ms(10) 延遲 10ms error2 = ((value)40-160)03 輸入變數 2 if (key == 0x01 ) 當按鍵 1找出對應的歸屬函數 並做出模糊控制判斷

int membership[5][3]= -100-60-30-60-300-30030030603060100

int membership1[3][3]=-100-500-50050050100 Fuzzycontroller() condition() if (key == 0x02 ) 當按鍵 2找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

05010050100150100150200150200250200250300 int membership1[3][3]=07515075150225150225300 Fuzzycontroller() condition() else if (key == 0x04) 當按鍵 3找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

200320400300400500400500600500600700600700800 int membership1[3][3]=220370520370520670520670820 Fuzzycontroller() condition() else if (key == 0x08) 當按鍵 4找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

02550255010050100200100200300200300400 int membership1[3][3]=05010050100250100250400 Fuzzycontroller() condition()

58

else if (key == 0x10) 當按鍵 5找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

150250350250350450350450550450550650550650750 int membership1[3][3]=150300450300450600450600750 Fuzzycontroller() condition2() void Fuzzycontroller() 模糊控制判斷 void compute_grade() 函數原型宣告 void compute_grade1() 函數原型宣告 a1 = 0 b1 = 001 I = 0 for (n=0 nlt=14 n++) r = error1 set = Rule[n][0]-1 compute_grade() 計算輸入變數 1 與

模糊程度的歸屬函數 condition = 1 r = error2 set = Rule[n][1]-1 compute_grade1() 計算輸入變數 2 與 模糊程度的歸屬函數 grade[n] = MIN(grade_reg[0] grade_reg[1]) a1 = a1 + (grade[n]membership2[Rule[n][2]-1][1]) b1 = b1 + grade[n] I = a1 b1 得到模糊控制判斷的結果 void compute_grade() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership[set][0]) || (r gt membership[set][2])) 當輸入變數不在 歸屬函數內

59

grade_reg[condition] = 0 else if ((r gt membership[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership[set][2]-r) (membership[set][2] - membership[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership[set][0]) (membership[set][1] - membership[set][0]) void compute_grade1() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership1[set][0]) || (r gt membership1[set][2])) 當輸入變數不在 歸屬函數內 grade_reg[condition] = 0 else if ((r gt membership1[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership1[set][2]-r) (membership1[set][2]-membership1[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership1[set][0]) (membership1[set][1]-membership1[set][0])

60

void condition() P2_0 = 1 設定 P20 為輸入模式 P2_1 = 1 設定 P21 為輸入模式 if ( (P2_0 == 1) ampamp (P2_1 == 0)) 當馬達為正轉時 if ( I gt 0 ) 若模糊判斷結果為正 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 若模糊判斷結果為零 PWM = PWM + 0 PWM 寬度不變 if ( I lt 0 ) 若模糊控制結果小於零 PWM = PWM + 1 PWM 寬度加 1 else if ( (P2_0 == 0) ampamp (P2_1 == 1) ) 若馬達為反轉 if ( I lt 0 ) 模糊控制小於零 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 模糊控制等於零 PWM = PWM + 0 PWM 寬度不變 if ( I gt 0 ) 模糊控制大於零 PWM = PWM + 1 PWM 寬度加 1 CW() 判斷 PWM 寬度上下限

61

void CW() 判斷 PWM 寬度上下限 if ( PWM gt= 215 ) 若 PWM 寬度 gt= 最大寬度 j = 215 PWM 寬度維持於 215us if ( PWM lt= 5 ) 若 PWM 寬度 lt= 最小寬度 j = 5 PWM 寬度維持在 5us if ( PWM gt 5 ampamp PWM lt 215 ) PWM 寬度介於最大與最小間 j = PWM PWM 依模糊控制判斷結果增減 void delay1ms(int count) 延遲 1ms int x y for ( x = 0 x lt count x++ ) for ( y = 0 y lt 122 y++ ) void convert() 數位資料換算成馬達轉速 r1 = ((value)40)-160

62

附錄 C LCD 顯示之程式

includereg51h 含 8051 所有暫存器宣告 include mathh define RS P3_5 LCD 指令資料選擇控制 define RW P3_4 LCD 讀寫控制腳 define Enable P3_3 LCD 致能接腳 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P0_0 = 0x80 接腳定義 sbit P0_1 = 0x81 接腳定義 sbit P0_2 = 0x82 接腳定義 sbit P0_3 = 0x83 接腳定義 sbit P0_4 = 0x84 接腳定義 sbit P0_5 = 0x85 接腳定義 sbit P0_6 = 0x86 接腳定義 sbit ADCRD = P3^7 設定 RD 控制線接腳為 P37 sbit ADCWR = P3^6 設定 WR 控制線接腳為 P36 void delay(void) 函數原型宣告 void delay10ms(int count) 函數原型宣告 void display(void) 函數原型宣告 void InitialLCD(void) 函數原型宣告 void WriteIns(char) 函數原型宣告 void WriteData(char) 函數原型宣告 void WriteString(charchar) 函數原型宣告 void CheckBusy(void) 函數原型宣告 void convert(void) 函數原型宣告 char MSG0[] = Motor Speed = 定義字串 MSG0 char MSG2[] = rpm 定義字串 MSG2 unsigned char MSG1[8]=0000000 定義字串 MSG1 unsigned long int value 讀取 ADC0804 數位資料 int sample = 1000 取樣率設定消除顯示值跳動 long int rpm

63

main() 主程式 InitialLCD() 初始化 LCD IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x01 設定計時器 0 工作於模式 1 TH0 = (65536-5000)256 設定計時器 0 初值 TL0 = (65536-5000)256 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 while(1) 等待中斷 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 while (--sample == 0) 取樣率減 1 sample = 1000 重設取樣率 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 void T0_int(void) interrupt 1 LCD 顯示動態掃描 display() 動態掃描顯示 TH0 = (65536-65535)256 重設計時初值 TL0 = (65536-65535)256

64

void InitialLCD(void) 設定 LCD 模組初始狀態 delay() 延遲函數 WriteIns(0x38) 設定 LCD 模組為 WriteIns(0x38) 2 行顯示 WriteIns(0x38) 8 位元介面 WriteIns(0x38) 5x7 點字型 WriteIns(0x08) 關閉顯示器 WriteIns(0x01) 清除 LCD 螢幕 WriteIns(0x0c) 令顯示器 ON但游標不顯示 WriteIns(0x06) 令 LCD 模組每接收到 1Byte 資料 AC 值自動加 1 void display() 掃描顯示 WriteIns(0x80) 設定 LCD 座標 WriteString(13MSG0) 將字串 MSG0 寫入 LCD 中 WriteIns(0xc0) 設定 LCD 座標 WriteString(8MSG1) 將字串 MSG1 寫入 LCD 中 WriteIns(0xc8) 設定 LCD 座標 WriteString(4MSG2) 將字串 MSG2 寫入 LCD 中 void convert(void) 換算轉速 long int freq freq = ((value)4000) - 16000 數位資料換成頻率公式 rpm = freq3 頻率換算轉速公式 MSG1[0] = (rpm1000000)+0x30 將結果存入字串 MSG1 中 MSG1[1] = ((rpm1000000)100000)+0x30 MSG1[2] = ((rpm100000)10000)+0x30 MSG1[3] = ((rpm10000)1000)+0x30 MSG1[4] = 0x2e MSG1[5] = ((rpm1000)100)+0x30 MSG1[6] = ((rpm100)10)+0x30 MSG1[7] = rpm10+0x30

65

void WriteIns(char instruction) 寫命令至 LCD 中 RS = 0 選擇指令暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = instruction 輸出命令至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteData(char i) 寫資料至 LCD 中 RS = 1 選擇資料暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = i 輸出資料至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteString(countMSG) 寫字串至 LCD 中 char count 字串長度 char MSG[] 字串資料 char i 定義位元組變數 for(i=0 iltcount i++) count 個位元組 WriteData(MSG[i]) 寫入一位元組的資料至 LCD 中 void CheckBusy(void) char i=0x80 檢查忙碌旗標 while(iamp0x80) 忙錄旗標 BF = 1 RS = 0 選擇指令暫存器 RW = 1 讀取 Enable = 1 致能 LCD i = P2 讀取 LCD 指令暫存器內的資料

66

Enable = 0 除能 LCD delay() 延遲函數 void delay() 延遲 5ms int i for(i=0 ilt250 i++)

  • 畢業專題封面pdf
  • File0004pdf
  • 最終版pdfpdf
Page 21: Based on Fuzzy Control Theorem and TPWM Method for DC ... · 使吾人想設計一模糊控制器來做為馬達轉速的閉迴路控制,以解決非線性系統的 問題。除此之外,flcs

12

一個控制器的輸入通常是確定數值而非模糊輸出也是如此才能對被控對象

發生作用但是模糊邏輯控制器〈Fuzzy Logic Controller簡稱FLC〉則是以語

言化的控制規則為主體為了能夠把輸入的確定值與語言化之後的控制規則結

合必須把輸入的確定值模糊化〈fuzzification〉以便對應到FLC語言變數的論

域範圍中同樣的經過規則庫推理出來的結果是對應到輸出語言變數的論域

中所以也必須對其做解模糊化〈defuzzification〉的工作才能達成實際的控制

目標

一般模糊控制器的架構包含了五個主要部分定義變數模糊化知識庫

模糊推論及解模糊化

〈1〉 定義輸入及輸出變數

決定程序被觀察的狀況及考慮控制的動作輸入變數可以是擷取

自受控系統的觀測量也可以是推導出來的資料輸出變數則為操控

受控系統的操作量例如在一般控制問題上輸入變數通常為輸出

誤差e與輸出誤差之變化率e而控制變數則為下一個狀態之輸入

u其中eeu統稱為模糊變數

〈2〉 模糊化

將量測值轉換為語言變數的過程將外界所輸入的確定數值經由

一比例映射傳送到輸入變數所對應的模糊論域然後再利用模糊化

函數將此輸入資料轉換成適當的口語值以供模糊運算使用此口語

化變數稱之為模糊子集合

〈3〉 知識庫

模糊知識庫是模糊控制的依據由它來定義所有使用到的語言控

制法則及相關各項參數知識庫可說是整個控制系統資料核心其包

含了兩個部分資料庫〈data base〉與規則庫〈rules base〉

1 資料庫

提供處理模糊數據之相關定義資料庫所存放的資料是關

13

於如何將明確的資料轉換成模糊數值而資料的存放方式是以

歸屬函數表示該選用哪一種歸屬函數依實際的需要選定

以三角形歸屬函數最常被使用因其運算最為容易且又能充分

的表達模糊概念

2 規則庫

利用語言化的條件式控制規則描述控制目標和策略通常

控制規則可以由操控人員的經驗或專家的知識推導出來多個

控制規則所組成的集合就是規則庫

〈4〉 模糊推論

模糊推論為模糊控制最重要的核心其最主要的工作就是做實際

的決策過程處理模糊推論具有模擬人類做決策判斷的能力其基本

理論就是根據人類特有的近似推理方式如之前已說明的GMP和

GMTGMP為前向推理而GMT為逆向推理因為模糊推論為前向

運算因此GMP非常適合使用為模糊控制的推論機構

〈5〉 解模糊化

將推論完成所得到的模糊輸出量轉換成實際的明確數值以便和

外界溝通解模糊化的方法有很多例最大歸屬度法重心法高

度法面積法等

圖 26 模糊系統的基本架構

14

22 直流馬達數學模型

圖27為直流馬達等效電路簡圖其中

iV = 輸入電壓 ai = 電樞電流

zR = 電樞電阻 gT = 轉矩

aL = 電樞電感 bE = 反電動勢

φ = 空氣隙磁通量 ω = 轉子角速度

B = 黏滯摩擦係數 J = 轉動慣量

圖 27 直流馬達等效電路簡圖

由克希荷夫電壓定律知

( ) ( ) ( )tEdt

tdiLtiRV b

aaaai ++= 〈26〉

由於反電動勢 bE 與轉軸的角速度 ( )tω 及空氣隙磁通量φ之乘積成正比即

( ) ( ) ( )tKtKtE emb ωφω == 〈27〉

15

又轉矩的平衡方程式為

( ) ( ) ( )dt

tdJtBtTgωω += 〈28〉

且馬達轉矩 gT 與電樞電流 ( )tia 及空氣隙磁通量φ乘積成正比即

( ) ( ) ( )tiKtiKtT ataag == φ 〈29〉

取〈26〉~〈29〉式之拉氏變換得

( ) ( ) ( ) ( )sEssILsIRsV baaaai ++= 〈210〉

( ) ( )sKsE eb Ω= 〈211〉

( ) ( ) ( )sJssBsTg Ω+Ω= 〈212〉

( ) ( )sIKsT atg = 〈213〉

則馬達輸入電流與轉速為

( ) ( ) ( )( ) ( )( )

sR

sEsV

sLRsEsV

sIe

a

bi

aa

bia τ+

minus

=+minus

=1

〈214〉

( ) ( ) ( )

sB

sT

sJBsT

sm

gg

τ+=

+=Ω

1 〈215〉

其中a

ae R

L=τ 為電樞電流的電氣時間常數 BJ

m =τ 為馬達轉動的機械時間

常數

直流馬達轉速對輸入電壓的轉移函數 ( )sG 為

( ) ( )( ) ( )( ) etaa

t

i KKBJsRsLK

sVssG

+++=

Ω=

( )( ) etmea

t

KKssBRK

+++=

ττ 11 〈216〉

16

在一般情況電樞電感很小所以 eτ 可以忽略不計因此上式成為一階落後

方程式

( ) ( )( ) ( ) m

m

etma

t

i sTK

KKsBRK

sVssG

+=

++=

Ω=

11 τ 〈217〉

其中

eta

mam KKBR

BRT

+=

τ

eta

tm KKBR

KK

+=

所以直流馬達數學模式可以以圖28表之﹝8﹞

圖 28 直流馬達數學模式方塊圖

17

第三章 系統功能分析與製作規劃

31 專題製作流程

如圖 31 所示本專題主要分為兩條路徑進行一為硬體另一則為軟體程

式撰寫本章著重硬體的規劃設計軟體則在第四章中介紹在完成 AB 信號

產生電路驅動功率放大電路與間距脈波產生電路設計與製作後須先接上馬達

做一連串的測試〈此時系統並無回受控制〉測試間距脈波是否太長或太短硬

體電路是否有缺失hellip等等另一方面也著手撰寫模糊控制程式並將其與硬體電

路結合最後做閉迴路系統的整合測試若發現系統的運作結果並不如預期

則需分別從硬體與軟體兩方面去改良

直流馬達轉速之模糊控制

文獻蒐集與整理

AB信號產生電路設計與製作

驅動功率放大電路設計與製作

間距脈波產生電路設計與製作

測試間距脈波是否太長或太短

系統測試測試馬達轉速是否

達到控制目的

結束與論文寫作

重新設計間距脈波長度

Yes

No

系統整合與修正

輸出信號與Fuzzy控制器之連結設計

規劃輸出與輸入歸屬函數

規劃模糊知識庫

撰寫主程式並加入模糊知識庫

程式編譯及連結

軟硬體整合測試馬達是否運作

程式調整及最佳化

No

YesYes

No

圖 31 專題製作流程圖

18

32 雙脈寬調變法之直流馬達驅動電路設計

本專題製作的雙脈寬調變法之直流馬達驅動電路設計大致可以分為二大部

分第一雙脈寬調變法之電路設計第二橋型驅動功率放大電路

雙脈寬調變〈Two Pulse Width Modulation簡稱TPWM〉之電路設計主要

是先製作一脈寬調變〈Pulse Width Modulation簡稱PWM〉波形然後再將此

波形各別經由一緩衝器〈buffer〉和反向器〈inverter〉則可產生AB驅動信號

脈波此即為TPWM

321 脈寬調變電路

如圖32先利用兩顆op產生三角波電路再利用一個比較器比較三角波

和誤差值之大小

150k

1M

20k

+12V

-12V

+12V

-12V10k

+12V

-12V

10k

+12V

-12V-

+-

+

-

+ PWMLM324

LM324

LM324

2200pF

圖 32 脈寬調變電路

〈1〉 三角波產生電路

三角波產生電路通常至少需要兩個運算放大器其電路如圖33OP1

為一個反相積分器OP2為一個史密特磁滯比較器將OP2的輸出方波經

19

OP1反相積分以後得到Vo1三角波此三角波又同時加到OP2控制其狀

態的改變

當方波產生器的輸出是正的則三角波產生器的輸出是斜向負相似

地當方波產生器的輸出是負則三角波產生器的輸出是斜向正這個動

作將產生三角波的輸出同時也輸出方波﹝9﹞

+VCC

-VCC

-

+

R1

R2

R3

+VCC

-VCC

-

+

OP1

OP2

Vo2Vo1

圖 33 三角波產生電路

對OP2而言是磁滯比較必須先找到OP2的 THV 和 TLV

232

21

32

3oo v

RRR

vRR

Rv

++

+=+ 〈31〉

當 0=+v 時

23

21 oo v

RR

v minus= 〈32〉

表要達到OP2的 0=+v 必須有這麼大的 1ov

當 12 sato Ev = 時

TLsato VERR

v =minus= 13

21 〈33〉

當 22 sato Ev minus= 時

THsato VERR

v =+= 23

21 〈34〉

20

對OP1而言是反相積分器 2ov 為其輸入 1ov 為其輸出則

tCIt

Rv

Ct

CRv

dtvCR

v oooo

11

2

11

22

111

11minus=minus=minus=minus= int 〈35〉

因為

1

2

Rvv

I o minusminus= 0=minusv 〈因為虛接地〉 〈36〉

所以

1

2

Rv

I o= 〈37〉

又因運算放大器的輸入阻抗非常大則流經 1C 的電流也為 I 相當於以定

電流對電容C 充電

當 12 sato Ev = 時 1ov 為下降斜波

tR

EC

v sato

1

1

11

1minus= 〈38〉

當 22 sato Ev minus= 時 1ov 上升斜波

( )

tRE

Cv sat

o1

2

11

1 minusminus= 〈39〉

由此可知三角波的上升與下降斜波乃因 1C 的充電與放電且時間

常數為 11CR

三角波週期分析如下

1 上升斜波的時間 1T

tCR

vv o

o1

1

21 minus= 11

2

1 CRvv

to

ominus=

1Tt = TLTHo VVv minus=1 22 sato Ev =

11111

21

sat

TLTH

sat

TLTH

EVV

CRCRE

VVT

minus=

minusminus= 〈310〉

2 下降斜波的時間 2T

tCR

vv o

o1

1

21 minus= 11

2

1 CRvv

to

ominus=

21

2Tt = THTLo VVv minus=1 12 sato Ev =

1

11111

1sat

TLTH

sat

THTL

EVV

CRCRE

VVT

minus=

minusminus= 〈311〉

3 週期 21 TTT +=

若 1satE = 2satE = satE 且3

22RR

VV TLTH =minus satE

3

2114

RR

CRT=

若R3 = nR2

則nCR

T 114=

114 CR

nf = 〈312〉

《實驗結果》

必須注意的是三角波的頻率太低將導致馬達的轉動產生脈動現象

故將工作頻率設計在1kHz以上

Ω= k1501R Ω= k102R

Ω= k203R pFC 22001 =

所得到的三角波頻率為

15kHz10220010001504

00010100020

f 12- =timestimestimestimes

timestimes

=

圖 34 三角波輸出波形

22

〈2〉 脈寬調變電路〈PWM〉

+12V

-12V

10k

+12V

-12V -

+ PWM輸出LM324三角波輸入

圖 35 脈寬調變電路

PWM系統往往連接至直流電源供應放大器的工作是以固定的頻率開

閉直流供應電壓其激發角是可以調整的因此得到波寬可調的輸出

將固定頻率的三角波與反向輸入的電壓做比較便可輸出一脈寬〈見圖

36〉反向電阻值的不同將導致反向輸入電壓不同故其輸出為一可調但

頻率固定的脈寬也正因為如此故稱為脈寬調變〈PWM〉由於輸出的

dutycycle不同故馬達將接收到不同的平均電壓因而可以藉由PWM控制

馬達的轉速

反相輸入電壓

PWM

圖 36 三角波與反相輸入電壓比較

23

PWM的優點在於馬達驅動電路的電晶體之控制信號改以脈波列來控

制使電晶體操作成類似開關的動作不是完全導通就是完全截止故電晶

體不是一直操作於作用區所以其功率消耗不大整體效率較高

《實驗結果》

圖 37 PWM 輸出波形

322 橋型驅動功率放大電路

如圖38所示主要由四個功率電晶體組成利用不同的電晶體對使直流

馬達做正逆轉控制當Q5Q8導通使馬達正轉當Q6Q7導通馬達則逆

轉電路中的電晶體扮演開關的作用

此種電路簡單只要一組直流電源供應且電晶體分擔了部份的電壓保護

電晶體迅速工作於截止與飽和狀態之間故沒有功率散逸損失之虞

但是在設計時切勿使Q5Q6同時導通以免燒毀電路上之元件因為在

AB兩脈波短暫的交變時間內由於電晶體本身之最小延遲時間有可能使Q5

Q6同時ON與Q7Q8在很短時間同時ON因此在15kHz交變下容易燒毀功

率電晶體

因此設計一間距脈波電路主要之功用使Q5Q6和Q7Q8均不同時導通

24

以拉長AB兩者交換時間

M

20k

10k

20k

10k

+24V

A 信號 B 信號

2N3055 2N3055

2N2955 2N2955

1N40021N4002

C1815 C1815

C1815 C1815

Q5

Q8Q6

Q7

圖 38 橋型驅動功率放大電路

圖 39 橋型驅動功率放大電路實體圖

25

此外若考慮電晶體BE間的電壓則電路會出現約 plusmn 06V的不感帶〈ded

band〉即電晶體的 oV 對 inV 間的關係如圖3101假使 inV 電壓為正弦波則 oV 變

成如圖3102為了改善這種缺失吾人利用兩個二極體接在電路上如圖38

用來補償電晶體BE間的壓降﹝10﹞

約06V

Dead band

Vo

Vin

圖 3101 呈現不感帶的轉移函數

圖 3102 輸出電壓波形

26

323 間距脈波產生電路

RCext15

Cext14 74123

A3

B2

Q13

CLR1

Q4

7486100k

2200pF

10k

10000pF

+5V

間距脈波輸出

圖 311 間距脈波產生電路

間距脈波的產生方式是根據脈寬調變〈PWM〉後的訊號再經由積分電路的

電阻兩端取出且經由兩倍頻器〈74LS86〉檢示出PWM的正負緣脈波最後

再利用單穩態IC〈74LS123〉將檢出信號之脈寬拉長至01ms此即為間距脈波

74LS123有兩個輸入端子A及B分別為下降波緣輸入端子及上升波緣輸入端

子當輸入A之脈波由ldquoH變成ldquoL之瞬間Q輸出變為ldquoH其持續時間長

短由RC時間常數決定反之當輸入B之脈波由ldquoL變成ldquoH之瞬間Q輸出

變成ldquoH維持一定時間

74LS123的輸出脈波之寬度是由電阻及電容之時間常數所決定概略計算公

式如下

CR045T timestimes=

電容 C 必須大於 1000pF

27

《實驗結果》

R=24kΩ C=10000pF

所以得到間距脈波為

( )msec0110810000p24k045T cong=timestimes= μ

圖 312 間距脈波

研究經分析後發現

1 間距 T 愈大愈能確保電路之安全性愈有保護作用

2 間距 T 愈大相對的使驅動信號脈波減少愈多造成馬達旋轉扭力大

大減弱

3 適當的間距 T不但不會影響馬達的輸出轉矩而且兼具保護電路的

效果

33 編碼器

轉動編碼器不只可以作為轉速的感測也能做位置的感測又適合於數位處

理故被廣泛使用若就信號來看轉動編碼器可分為增量型與絕對型若以檢

測的方式來分可分為光學式和磁式兩種在本專題中所使用的編碼器為光學式

增量型編碼器﹝11﹞

光學式轉動編碼器的原理如圖 313在附有細縫轉盤的兩側分別裝置發光元

28

件與受光元件如果只有一組光電檢測元件則輸出信號就只有一相的脈波信

號此種裝置稱為脈波產生器圖 314 為增量型轉碼器的輸出信號它是利用

兩組光電元件所產生的脈波信號A 相和 B 相間有相位差正轉時 A 相領前 B

相逆轉時 B 相領前 A 相因此利用此兩相做檢測馬達為正轉或逆轉的工作

並利用 A 相或 B 相的頻率檢測出目前的轉速

吾人計算出編碼器每一轉可以產生約 200 個脈波故檢測 A 相或 B 相其頻

率為 N則轉速應為 60200

timesN

〈rpm〉

圖 313 光學式轉動編碼器的原理圖

圖 314 編碼器的輸出信號波形

29

34 LM2917 FV 電路設計

對 LM2907 而言磁滯比較器和電流汞是構成頻率對電壓轉換的基本架構

並且預留一個運算放大器及一個電晶體供各種不同的使用圖 315 為吾人所設

計的 FV 電路圖中 C1 用以抑制電流汞動作時所產生的漣波變化正常使用時

此電容應大於 10C若 C1 太大也將造成轉換速度下降

因為單晶片 8051 之輸入電壓最高為 5V故必須設計其馬達最高轉速頻率所

轉成的電壓必須在 5V 以內由於馬達轉速頻率範圍極大故吾人給予 LM2917

+12V 的電壓以擴大它可以轉換的電壓範圍並將所需維持在 5V 內

a1

14

b1

1

a1

13

b1

2

a1

12

b1

3

a1

11

b1

4

1

a1

10

b1

5

a1

8

b1

7

a1

9

b1

6

L2917

Encoder輸 入

1uF

+12V

FV輸出1000pF

45k 10kC1

C2

圖 315 FV 電路

30

《實驗結果》

根據統計結果每 50mV 相對於 100Hz如此一來吾人想得知馬達目前

的轉速只要將單晶片所接收到的電壓值經過換算即可得知目前 encoder 所量測

的頻率吾人知道 encoder 一圈可產生 200 個脈波故馬達的轉速便可經過下列

公式換算得知

轉速〈rpm〉 60200

times=f

其中 =f encoder 所量測到的頻率

表 31 頻率與轉換電壓之關係

頻率

(Hz) 1 2 3 4 5 6 7 8 9

電壓(V) 0006 0006 0007 0008 0009 0009 0009 0009 001

頻率

(Hz) 10 20 30 40 50 60 70 80 90

電壓(V) 008 009 010 010 011 011 012 012 013

頻率

(Hz) 100 200 300 400 500 600 700 800 900

電壓(V) 013 018 023 028 033 038 043 049 054

頻率

(Hz) 1000 2000 3000 4000 5000 6000 7000 8000 9000

電壓(V) 059 109 16 209 257 304 3508 4006 45

31

圖 316 頻率對電壓曲線

35 單晶片介面電路

單晶片介面包括了二大部分分別為單晶片 8051AD converter

〈1〉8051 單晶片

為本控制系統的核心一切動作皆經由它控制

〈2〉AD converter

將類比開關所送出來的類比訊號經由 ADC 0804 轉換成數位訊號傳送

到單晶片的輸入埠

351 AD 轉換

以單晶片 8051 控制 ADC0804則單晶片 8051 必須下達ldquo開始轉換rdquo的命令

給 ADC0804然後 ADC0804 就開始讀入類比輸入端的電壓在內部開始轉換

經過一段轉換時間後〈約 100μ s〉ADC0804 就將轉換完成的值放在其內部的三

態輸出栓鎖緩衝器裡然後將轉換完成輸出腳〈INTR〉降為 low以通知單晶片

可以去讀轉換完成資料

當WR和CS 同時為ldquo0rdquo時表示對 ADC0804 下達ldquo開始轉換rdquo命令再經過

32

一段轉換時間〈100μ s〉後轉換完成ADC0804 會將其轉換完成的數位資料放

在其內部 8 位元緩衝區裡且將 INTR 降為ldquo0rdquo因此單晶片只要下達ldquo開始轉換rdquo

命令後去檢查 INTR 的狀態就可以知道是否轉換完畢其方法有兩種

1 輪詢法〈polling〉

2 中斷法〈interrupt〉

所謂輪詢法就是將 ADC0804 的 INTR接到 CPU 的一條 IO 線上然後以軟體指

令主動偵測其狀態當偵測到為ldquo0rdquo時就可以去讀出 ADC0804 裡的緩衝區的轉

換值

中斷法是一個很理想的 IO 方式因為不像輪詢法必須讓 CPU 等 ADC0804

轉換當 CPU 下達ldquo開始轉換rdquo命令後就可以做其他工作當 ADC0804 轉換完

畢後 INTR會降為ldquo0rdquo可以利用此信號去中斷 CPU再由中斷副程式去讀入

轉換值即可因此大大提高了程式的效率

當 CPU 接收到 ADC0804 發出ldquo轉換完畢rdquo的信號〈 INTR =0〉後就可以去

讀出轉換值其讀出的方法是將CS 與RD設為ldquo0rdquo即可讀到轉換值這個讀值的

動作又會使得 INTR恢復成ldquo1rdquo

1 CPU 下達ldquo開始轉換rdquo命令〈CS =0WR =0〉

2 ADC0804ldquo轉換完畢rdquo 〈 INTR =0〉

3 CPU 讀取轉換值〈 RD =0CS =0〉

4 讀完後 INTR =1

ADC0804 主要規格摘要如下

1 +5V 單電源工作電壓

2 類比電壓輸入範圍 0~+5V

33

3 參考電壓為 25V

4 轉換時間為 100μ s〈 CLKf =640kHz〉

5 解析度為 8 位元

6 誤差plusmn 1LSB

7 讀取時間 135ns

36 電源供應系統

本專題中所有電路及硬體設備所需的電源採用交流電源 110V 經由 PT-31

變壓器後再經過橋式整流後提供了直流電源而因為各個電路所需電源不同

因此製作了多組的變壓電路如下

1電壓源 DC5V選擇了 7805 的穩壓 IC 搭配電容得到了+5V 的電壓源

供〈1〉8051 微處理器 〈2〉ADC 0804 〈3〉74LS8674LS12374LS04

74LS02CD4013 〈4〉馬達 Encoder

2電壓源 DC12V使用 7812 穩壓 IC 搭配電容得到+12V 的電壓源供

LM2917 使用

3電壓源 DC24V利用 7824 的穩壓 IC 搭配電容獲得+24V 的直流電壓

源供電路之橋型驅動功率放大之電晶體使用

Vin1

+12V2

GND3

LM7812

2200uF 10000pF 2200uF 10000pF

+12V outputAC

圖 317 直流電源電路

34

圖 318 直流電源電路實體圖

37 馬達轉速的量測

表 33 PWM 輸出對應 encoder 週期

PWM dutycycle encoder 週期 PWM dutycycle encoder 週期

40 sμ 172 sμ 440 sμ 0 sμ

80 sμ 188 sμ 480 sμ 0 sμ

120 sμ 204 sμ 520 sμ 0 sμ

160 sμ 230 sμ 560 sμ 0 sμ

200 sμ 272 sμ 600 sμ 0 sμ

240 sμ 328 sμ 640 sμ 0 sμ

280 sμ 416 sμ 680 sμ 1320 sμ

320 sμ 540 sμ 720 sμ 750 sμ

360 sμ 800 sμ 760 sμ 510 sμ

400 sμ 1320 sμ 800 sμ 400 sμ

35

圖 319 PWM 輸出對應 encoder 週期

由統計可知道此馬達並不是一顆線性馬達故相信若使用模糊控制理論來

作為其回授控制系統的控制器一定能達到比傳統控制器的性能還要好而且若能

在模糊控制裡加上 PID 控制器的觀念一定能在系統的響應時間上升時間

安定時間和超越量達到最佳的控制另一方面馬達在其反方向的內阻較大需

要更大的力量才能使馬達驅動

36

第四章 軟體規劃與製作

41 PWM 之軟體設計

因為之前所介紹的硬體方式是以調整可變電阻來達到轉速的調整因此無法

得知所給予的脈寬長度和轉速大小尤其在回授時也不易給予適當的訊號來調整

轉速因此改良之方法就是以8051之軟體撰寫方式來產生固定的脈寬也就等

於給予轉速的命令而在其回授控制時也只要在內部程式给予適當的指令便可

達到脈寬長度的調整以達到閉迴路之受控系統

411 PWM 軟體流程

設定Timer0模式為0

TH0 = temp 32 TL0 = temp 32

temp = 8192 ndash j4 Key = 0

檢查是否有鍵值

將鍵值存入Key

Yes

No

設定Key值所對應的 j值

If P30 == 1Then P30 = 0 temp = 8192 ndash j4Else P30 = 1 temp=8192ndash880+j4

TH0 = temp 32 TL0 = temp 32

Start Timer0中斷副程式

啟動Timer0

等待Timer0中斷

返回主程式

圖 41 PWM 軟體設計流程圖

37

在此總共設計了五個按鈕分別代表不同的轉速停止正轉〈慢〉正轉

〈快〉逆轉〈慢〉和逆轉〈快〉使用Timer0是因為8051之計時中斷比延遲程

式來的準確故可以達到準確的計時程式設計理念中並沒有將中斷致能清除

因此Timer0會一直處於計時的狀態程式執行時將一邊檢查鍵值〈KeyStatus〉一

邊進行計時當計時完畢便呼叫中斷副程式然後執行改變Port 30的輸出狀

態若是為high則變為low反之若是為low即變為high同時並重設計時時間

Timer0繼續計時

當鍵值改變時計時的時間也會跟著改變如此一來Timer0將ㄧ直重覆上

述動作直到電源切掉Timer0才會停止計時

42 模糊控制之程式規劃與撰寫

本專題目標在完成了先前所規劃的硬體電路之後接著就是要達成利用模糊

控制理論來設計控制器在此採用了單晶片8051目的是為了以硬體實現方式來

代替電腦模擬期望能夠按照原訂計畫完成本專題「具模糊控制理論與雙脈寬調

變法之直流馬達驅動電路設計」

單晶片 8051 模糊控制的程式撰寫採下列幾個步驟依序完成

1 設定變數轉速誤差〈dspeed〉目前轉速〈sspeed〉

2 模糊化採用三角形歸屬函數採用三角形歸屬函數的原因

〈1〉 三角形函數為一連續函數

〈2〉 三角形函數為線性的函數所以計算速度較快

〈3〉 是具有發散也有收斂的函數和指數函數一樣接近

事實

3 模糊推論模糊規則將其所有可能發生情況以 IFhellipTHENhellip表示

並建立控制規則表

4 解模糊化採用重心法

38

421 歸屬函數

設定變數為目前轉速〈sspeed〉與轉速誤差〈dspeed〉因此此模糊控制器共

有兩個輸入訊號與一輸出訊號輸出訊號為脈寬長度該加或是減多少又因為有

五種不同的轉速因此各分別設計了不同的歸屬函數如下

1 當轉速 = 0

ml h

s s p e e d

d s p e e d

r p m0 5 0 1 0 0- 5 0- 1 0 0

mv l l h v h

r p m0- 3 0- 6 0- 1 0 0 3 0 6 0 1 0 0 圖 42 停止時之歸屬函數

2 正轉〈慢〉

ml hsspeed

dspeed

rpm150 225 300750

mvl l h vh

rpm150100500 200 250 300

圖 43 正轉〈慢〉之歸屬函數

39

3 正轉〈快〉

ml hsspeed

dspeed

rpm520 670 820370220

mvl l h vh

rpm500400300200 600 700 800

圖 44 正轉〈快〉之歸屬函數

4 逆轉〈慢〉

ml hsspeed

dspeed

rpm100 250 400500

mvl l h vh

rpm10050250 200 300 400 圖 45 逆轉〈慢〉之歸屬函數

40

5 逆轉〈快〉

ml hsspeed

dspeed

rpm300 450 600150

mvl l h vh

rpm450350250150 550 650 750

750

圖 46 逆轉〈快〉之歸屬函數

6 輸出

OutputMVL L H VH

rpm0-50-150-250 50 150 250

圖 47 輸出之歸屬函數

41

422 模糊規則庫

表 41 為吾人所設計的模糊控制規則庫並利用 Matlab 之 Fuzzy ToolBox 來

建立此規則庫以進行模擬推論圖 48 為當馬達輸入指令為正轉慢時推論後所得

到的三維空間圖

表 41 模糊控制規則表

Dspeed

vl l m h vh

l H M L VL VL

m VH H M L VL sspeed

h VH VH H M L

圖 48 推論後的三維空間圖

42

423 模糊控制器之軟體設計流程

Start 外部中斷副程式

ADCWR = 0 ADCWR = 1

〈令AD開始轉換〉

檢查鍵值以得到對應的歸屬函數

取得目前轉速與

轉速誤差

Fuzzy Rules決策

得到輸出訊號

Delay 10ms

ADC = 0 讀取AD值 ADCRD = 0

將AD值換算成轉速

ADCWR = 0 ADCWR = 1

〈AD開始轉換〉

返回主程式

致能外部中斷

圖 49 Fuzzy Controller 程式流程圖

當控制器一開始動作時便先執行AD轉換的工作當AD轉換完成時其

INTR的接腳便會觸發8051的外部中斷INTR0於是程式便發生外部中斷執行

外部中斷副程式的指令

43

在外部中斷副程式中AD將ㄧ直進行轉換與讀取的工作同時並將轉換後

的值直接換算成目前轉速與轉速誤差以供模糊控制器使用換算目前encoder

的頻率其公式為

160-V2000 times=頻率 〈4-1〉

式4-1之公式是根據表31所導出來的其中V為encoder之頻率轉成電壓之值

又假設所讀取的AD轉換值為value因為

AD的解析度 = bit256

5V+ = 511 ( Vbit ) 〈4-2〉

故value值與電壓V之關係為

511 value V times= 〈4-3〉

所以encoder之頻率與value值的關係為

頻率= 2000times ⎟⎠⎞

⎜⎝⎛ times

511 value - 160 〈4-4〉

故目前轉速為

sspeed = ( )rpm 60 200

times頻率 〈4-5〉

另ㄧ方面在主程式中程式會先去檢查鍵值也就等於檢查輸入指令以

找出符合使用的歸屬函數並將AD所獲得的轉速對應到歸屬函數中然後執行

決策判斷即進入規則庫中尋找出適當的決策判斷最後將此決策送入PWM程

式裡進行脈寬長度的調整使馬達在合理的要求下達到理想的轉速控制不會

因為外在環境的影響而使馬達轉速受到干擾

43 LCD 顯示轉速

此專題最後再增加一LCD顯示幕以顯示目前的轉速否則在程式設計完成

後人卻因無法以肉眼得知目前轉速而不能肯定馬達轉速是否有達到控制的目

標因此增加一顯示幕LCD是有必要的不僅隨時得知目前的轉速還能知道

44

設計出來的軟體其控制性是否夠好夠穩定

431 LCD 顯示幕之軟體流程

Start

設定LCD模組的初始狀態

設定外部中斷INTR0

與Timer0

設定TH0 = (65536 ndash 5000) 256 TL0 = (65536 ndash 5000)256

令ADCWR = 0 ADCWR = 1 AD開始轉換

等待中斷

外部中斷副程式

ADCRD = 0 讀取AD值 ADCRD = 1

將AD值換算成速度

ADCWR = 0 ADCWR = 1 AD開始轉換

Timer0中斷副程式

顯示LCD第一行

ldquoMotor Speed =

顯示LCD第二行ldquoxxxxxxx rpm其中 xxxxxx為外部中斷副程式所換算出的轉速

重設TH0與TL0

返回主程式返回主程式

圖 410 LCD 顯示幕之程式流程圖

此程式主要由兩個部分完成一為外部中斷副程式另ㄧ為 Timer0 中斷副

程式當主程式完成外部與 Timer0 兩個中斷的設定後隨即命令 AD 開始轉換

之後便一直停在 while〈1〉的迴圈裡不做任何動作而由兩個中斷副程式來完

成整個轉換與顯示的工作

45

外部中斷副程式主要負責 AD 的轉換讀取與轉速換算的工作AD 第一

次的轉換由主程式來下達命令當轉換完成後AD 的 INTR 接腳將觸發外部中

斷〈INTR0〉副程式此時程式便進入外部中斷副程式執行讀取 AD 值與轉速

換算的工作當這些工作完成時外部中斷副程式再次下達 AD 開始轉換的命

令而離開中斷副程式當 AD 再次轉換完成時又將再次執行中斷副程式

如此週而復始中斷副程式將ㄧ直進行讀取換算與轉換的工作

而 Timer0 中斷副程式主要負責 LCD 顯示之工作當主程式所設定的計時時

間計數完時程式便進入 Timer0 中斷副程式一旦進入 Timer0 中斷副程式程

式將執行 LCD 的顯示然後再重設 Timer0 的計數時間Timer0 將重新計數當

計數完時程式又將再度進入 Timer0 中斷副程式執行因為程式中並無清除

Timer0 的中斷致能故 Timer0 中斷副程式和外部中斷副程式ㄧ樣週而復始的

執行其副程式的工作

46

第五章 結論

本計劃主旨為具模糊控制理論與雙脈寬調變法之直流馬達驅動電路設計主

要是針對傳統電路設計之缺點提出改良之方法以TPWM取代PWM電路以模

糊理論基礎設計之控制器替代傳統PID控制器

TPWM轉速控制優於PWM之處在於

1 TPWM只需使用單電源即可達到正轉和逆轉的轉速控制而PWM必須

加上逆向開關或是雙電源才能使馬達產生正轉和逆轉

2 TPWM可控制馬達處於停止狀態無論在正向或逆向加上負載皆無法使

馬達產生轉動

3 馬達消耗定額功率輸出轉矩為額定值

4 馬達由停止到某定轉速時反應時間較快

模糊控制器優於PID控制器

1 不須導出繁雜的數學模型

2 適用於非線性系統

3 強健性與容錯性較高

本專題至此雖說大致的目標都已達到但是此系統仍然有許多不完美而需要

改進的地方例如在實驗過程中發現整個轉速的控制在回授上其反應時間

有點慢探討其原因有可能是控制器之程式上的問題

1 因為使用C語言撰寫程式故其執行速度較慢

2 程式可能寫的太累贅

3 模糊控制規則庫建立不良

若想改善這些問題可以嘗試著將C語言改為組合語言來撰寫並盡量減少

47

不必要的指令相信此動作一定能大大提昇程式的執行速度其次就是多做測

試利用測試中所學到的經驗來幫助模糊控制規則庫的改寫同時也能從測試中

發現更多的問題若是都能對問題加以一一解決的話相信必定能將此控制系統

做的更盡善盡美

48

參考文獻

﹝1﹞ 李適中直流馬達速度控制伺服控制〈基礎篇〉全華科技圖書股份有

限公司民 74

﹝2﹞ 廖錦文ldquo直流電動機之雙脈寬調變是〈TPWM〉驅動電路研究電

子技術月刊第 69 期pp94-1021992

﹝3﹞ 楊英魁孫宗瀛鄭魁香林建德蔣旭堂模糊控制理論與技術全華

科技圖書股份有限公司民 85

﹝4﹞ 林敦煌陳憬德直流馬達定位及轉速的模糊控制逢甲大學自動控制工

程學系學士論文民 87

﹝5﹞ LAZadehldquo Fuzzy Sets Information and Control Vol8 pp338-353

1965

﹝6﹞ EHMamdani and SAsslianldquo A fuzzy logic controller for a dynamic

plant Internation Journal of Man-Machine Studies Vol7 pp1-13 1975

﹝7﹞ 孫宗瀛楊英魁Fuzzy 控制理論實作與應用全華科技圖書股份有

限公司民 83 年

﹝8﹞ 許中平黃煌嘉直流電動機控制電路設計全華科技圖書股份有限公司

民 75

﹝9﹞ 盧明智黃敏祥OP Amp 應用+實驗模擬全華科技圖書股份有限公司

民 83

﹝10﹞陳文耀電動機控制工程復文書局2003

﹝11﹞許中平林全福電動機運轉控制技術全華科技圖書股份有限公司民

77

﹝12﹞楊明豐8051 單晶片 C 語言設計實務碁峯資訊2003 年

﹝13﹞蔡朝洋單晶片微電腦 80518951 原理與應用全華科技圖書股份有限公

司民 91

49

﹝14﹞王文俊認識 Fuzzy全華科技圖書股份有限公司民 90

50

附錄 A 專題硬體展示圖

圖 A-1 硬體整體圖

圖 A-2 硬體整體鳥瞰圖

51

圖 A-3 硬體側視圖

圖 A-4 操作與顯示面板

圖 A-5 間距脈波電路與 FV 電路

52

圖 A-6 橋型驅動功率放大電路

圖 A-7 操作與控制面板

53

附錄 B PWM 與模糊控制之程式

include reg51h include stdioh sbit ADCRD = P3^1 設定 RD 控制線接腳為 P31 sbit ADCWR = P3^3 設定 WR 控制線接腳為 P33 sbit P2_0 = 0xA0 接腳定義 sbit P2_1 = 0xA1 接腳定義 sbit P3_0 = 0xB0 接腳定義 sbit P3_1 = 0xB1 接腳定義 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P3_6 = 0xB6 接腳定義 void KeyStatus(void) 函數原型宣告 void feedback(void) 函數原型宣告 void compute_grade(void) 函數原型宣告 void delay1ms(int count) 函數原型宣告 void convert() 函數原型宣告 void condition() 函數原型宣告 void CW(void) 函數原型宣告 int j i 對應 PWM 的寬度 unsigned int temp 所設計的計時器時間 int sample = 1000 取樣率設定消除顯示值跳動 long int value r1 讀取 ADC0804 數位資料 long int set n condition select long int r grade_reg[2] grade[15] error1 error2 long int a1 b1 I long int membership[5][3]membership1[3][3] 定義歸屬函數 long int membership2[3][3] = -10-50-5050510 long int error[2] int Rule[15][3] = 113213313 定義判斷規則庫 212223323 311232333 411241342 511251351

54

main() 主程式 j = PWM = 110 設定 PWM 初始值 IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x00 設定計時器 0 工作於模式 0 temp=8192-j4 設定計時器 0 初值 TH0 = temp 32 TL0 = temp 32 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 P3_4 = 1 P3_5 = 0 P3_6 = 0 ADCWR = 0 令 ADC0804 的 WR = 0 ADCWR = 1 令 ADC0804 的 WR = 1 while (1) KeyStatus() 檢查鍵值 void KeyStatus(void) 檢查鍵值並給對應的 PWM 值 char KeyScan(void) 按鍵掃描函數宣告 unsigned char KeyStatus unsigned char Key = 0 KeyStatus=KeyScan() 呼叫按鍵掃描函數 if (KeyStatus = 0) 已有按鍵輸入 Key = KeyStatus Key = 鍵值 if (Key == 0x01) 假如輸入為按鍵 1 i = 110 PWM 為 110us j = i P3_4 = 1 LED 亮第一顆〈表馬達停止〉 P3_5 = 0 P3_6 = 0

55

else if (Key == 0x02 ) 假如輸入為按鍵 2 i = 140 PWM 為 140us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x04 ) 假如輸入為按鍵 3 i = 180 PWM 為 180us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x08 ) 假如輸入為按鍵 4 i = 80 PWM 為 80us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 else if (Key == 0x10 ) 假如輸入為按鍵 5 i = 40 PWM 為 40us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 PWM = j delay1ms(10) 呼叫延遲函數 feedback() 模糊控制判斷

56

void To_int(void) interrupt 1 Timer0 中斷函數 if (P3_0 == 0) 假如 PWM 輸出為 Low P3_0 = 1 變更 PWM 輸出為 High temp=8192-j4 設定 High 的時間 else 若 PWM 輸出為 High P3_0 = 0 變更 PWM 輸出為 Low temp=8192-880+j4 設定 Low 的時間 TH0 = temp 32 Timer0 的計時時間 TL0 = temp 32 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 char KeyScan(void) 檢查鍵值 char KeyStatus 按鍵狀態 P0=0xff 設定 P0 為輸入模式 KeyStatus=~P0 讀取按鍵狀態 return(KeyStatus) 將鍵值送回程式 void feedback(void) 模糊判斷 void Fuzzycontroller() 函數原型宣告 void condition1() 函數原型宣告

57

void condition2() 函數原型宣告 error1 = ((value)40-160)03 輸入變數 1 delay10ms(10) 延遲 10ms error2 = ((value)40-160)03 輸入變數 2 if (key == 0x01 ) 當按鍵 1找出對應的歸屬函數 並做出模糊控制判斷

int membership[5][3]= -100-60-30-60-300-30030030603060100

int membership1[3][3]=-100-500-50050050100 Fuzzycontroller() condition() if (key == 0x02 ) 當按鍵 2找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

05010050100150100150200150200250200250300 int membership1[3][3]=07515075150225150225300 Fuzzycontroller() condition() else if (key == 0x04) 當按鍵 3找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

200320400300400500400500600500600700600700800 int membership1[3][3]=220370520370520670520670820 Fuzzycontroller() condition() else if (key == 0x08) 當按鍵 4找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

02550255010050100200100200300200300400 int membership1[3][3]=05010050100250100250400 Fuzzycontroller() condition()

58

else if (key == 0x10) 當按鍵 5找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

150250350250350450350450550450550650550650750 int membership1[3][3]=150300450300450600450600750 Fuzzycontroller() condition2() void Fuzzycontroller() 模糊控制判斷 void compute_grade() 函數原型宣告 void compute_grade1() 函數原型宣告 a1 = 0 b1 = 001 I = 0 for (n=0 nlt=14 n++) r = error1 set = Rule[n][0]-1 compute_grade() 計算輸入變數 1 與

模糊程度的歸屬函數 condition = 1 r = error2 set = Rule[n][1]-1 compute_grade1() 計算輸入變數 2 與 模糊程度的歸屬函數 grade[n] = MIN(grade_reg[0] grade_reg[1]) a1 = a1 + (grade[n]membership2[Rule[n][2]-1][1]) b1 = b1 + grade[n] I = a1 b1 得到模糊控制判斷的結果 void compute_grade() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership[set][0]) || (r gt membership[set][2])) 當輸入變數不在 歸屬函數內

59

grade_reg[condition] = 0 else if ((r gt membership[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership[set][2]-r) (membership[set][2] - membership[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership[set][0]) (membership[set][1] - membership[set][0]) void compute_grade1() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership1[set][0]) || (r gt membership1[set][2])) 當輸入變數不在 歸屬函數內 grade_reg[condition] = 0 else if ((r gt membership1[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership1[set][2]-r) (membership1[set][2]-membership1[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership1[set][0]) (membership1[set][1]-membership1[set][0])

60

void condition() P2_0 = 1 設定 P20 為輸入模式 P2_1 = 1 設定 P21 為輸入模式 if ( (P2_0 == 1) ampamp (P2_1 == 0)) 當馬達為正轉時 if ( I gt 0 ) 若模糊判斷結果為正 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 若模糊判斷結果為零 PWM = PWM + 0 PWM 寬度不變 if ( I lt 0 ) 若模糊控制結果小於零 PWM = PWM + 1 PWM 寬度加 1 else if ( (P2_0 == 0) ampamp (P2_1 == 1) ) 若馬達為反轉 if ( I lt 0 ) 模糊控制小於零 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 模糊控制等於零 PWM = PWM + 0 PWM 寬度不變 if ( I gt 0 ) 模糊控制大於零 PWM = PWM + 1 PWM 寬度加 1 CW() 判斷 PWM 寬度上下限

61

void CW() 判斷 PWM 寬度上下限 if ( PWM gt= 215 ) 若 PWM 寬度 gt= 最大寬度 j = 215 PWM 寬度維持於 215us if ( PWM lt= 5 ) 若 PWM 寬度 lt= 最小寬度 j = 5 PWM 寬度維持在 5us if ( PWM gt 5 ampamp PWM lt 215 ) PWM 寬度介於最大與最小間 j = PWM PWM 依模糊控制判斷結果增減 void delay1ms(int count) 延遲 1ms int x y for ( x = 0 x lt count x++ ) for ( y = 0 y lt 122 y++ ) void convert() 數位資料換算成馬達轉速 r1 = ((value)40)-160

62

附錄 C LCD 顯示之程式

includereg51h 含 8051 所有暫存器宣告 include mathh define RS P3_5 LCD 指令資料選擇控制 define RW P3_4 LCD 讀寫控制腳 define Enable P3_3 LCD 致能接腳 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P0_0 = 0x80 接腳定義 sbit P0_1 = 0x81 接腳定義 sbit P0_2 = 0x82 接腳定義 sbit P0_3 = 0x83 接腳定義 sbit P0_4 = 0x84 接腳定義 sbit P0_5 = 0x85 接腳定義 sbit P0_6 = 0x86 接腳定義 sbit ADCRD = P3^7 設定 RD 控制線接腳為 P37 sbit ADCWR = P3^6 設定 WR 控制線接腳為 P36 void delay(void) 函數原型宣告 void delay10ms(int count) 函數原型宣告 void display(void) 函數原型宣告 void InitialLCD(void) 函數原型宣告 void WriteIns(char) 函數原型宣告 void WriteData(char) 函數原型宣告 void WriteString(charchar) 函數原型宣告 void CheckBusy(void) 函數原型宣告 void convert(void) 函數原型宣告 char MSG0[] = Motor Speed = 定義字串 MSG0 char MSG2[] = rpm 定義字串 MSG2 unsigned char MSG1[8]=0000000 定義字串 MSG1 unsigned long int value 讀取 ADC0804 數位資料 int sample = 1000 取樣率設定消除顯示值跳動 long int rpm

63

main() 主程式 InitialLCD() 初始化 LCD IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x01 設定計時器 0 工作於模式 1 TH0 = (65536-5000)256 設定計時器 0 初值 TL0 = (65536-5000)256 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 while(1) 等待中斷 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 while (--sample == 0) 取樣率減 1 sample = 1000 重設取樣率 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 void T0_int(void) interrupt 1 LCD 顯示動態掃描 display() 動態掃描顯示 TH0 = (65536-65535)256 重設計時初值 TL0 = (65536-65535)256

64

void InitialLCD(void) 設定 LCD 模組初始狀態 delay() 延遲函數 WriteIns(0x38) 設定 LCD 模組為 WriteIns(0x38) 2 行顯示 WriteIns(0x38) 8 位元介面 WriteIns(0x38) 5x7 點字型 WriteIns(0x08) 關閉顯示器 WriteIns(0x01) 清除 LCD 螢幕 WriteIns(0x0c) 令顯示器 ON但游標不顯示 WriteIns(0x06) 令 LCD 模組每接收到 1Byte 資料 AC 值自動加 1 void display() 掃描顯示 WriteIns(0x80) 設定 LCD 座標 WriteString(13MSG0) 將字串 MSG0 寫入 LCD 中 WriteIns(0xc0) 設定 LCD 座標 WriteString(8MSG1) 將字串 MSG1 寫入 LCD 中 WriteIns(0xc8) 設定 LCD 座標 WriteString(4MSG2) 將字串 MSG2 寫入 LCD 中 void convert(void) 換算轉速 long int freq freq = ((value)4000) - 16000 數位資料換成頻率公式 rpm = freq3 頻率換算轉速公式 MSG1[0] = (rpm1000000)+0x30 將結果存入字串 MSG1 中 MSG1[1] = ((rpm1000000)100000)+0x30 MSG1[2] = ((rpm100000)10000)+0x30 MSG1[3] = ((rpm10000)1000)+0x30 MSG1[4] = 0x2e MSG1[5] = ((rpm1000)100)+0x30 MSG1[6] = ((rpm100)10)+0x30 MSG1[7] = rpm10+0x30

65

void WriteIns(char instruction) 寫命令至 LCD 中 RS = 0 選擇指令暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = instruction 輸出命令至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteData(char i) 寫資料至 LCD 中 RS = 1 選擇資料暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = i 輸出資料至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteString(countMSG) 寫字串至 LCD 中 char count 字串長度 char MSG[] 字串資料 char i 定義位元組變數 for(i=0 iltcount i++) count 個位元組 WriteData(MSG[i]) 寫入一位元組的資料至 LCD 中 void CheckBusy(void) char i=0x80 檢查忙碌旗標 while(iamp0x80) 忙錄旗標 BF = 1 RS = 0 選擇指令暫存器 RW = 1 讀取 Enable = 1 致能 LCD i = P2 讀取 LCD 指令暫存器內的資料

66

Enable = 0 除能 LCD delay() 延遲函數 void delay() 延遲 5ms int i for(i=0 ilt250 i++)

  • 畢業專題封面pdf
  • File0004pdf
  • 最終版pdfpdf
Page 22: Based on Fuzzy Control Theorem and TPWM Method for DC ... · 使吾人想設計一模糊控制器來做為馬達轉速的閉迴路控制,以解決非線性系統的 問題。除此之外,flcs

13

於如何將明確的資料轉換成模糊數值而資料的存放方式是以

歸屬函數表示該選用哪一種歸屬函數依實際的需要選定

以三角形歸屬函數最常被使用因其運算最為容易且又能充分

的表達模糊概念

2 規則庫

利用語言化的條件式控制規則描述控制目標和策略通常

控制規則可以由操控人員的經驗或專家的知識推導出來多個

控制規則所組成的集合就是規則庫

〈4〉 模糊推論

模糊推論為模糊控制最重要的核心其最主要的工作就是做實際

的決策過程處理模糊推論具有模擬人類做決策判斷的能力其基本

理論就是根據人類特有的近似推理方式如之前已說明的GMP和

GMTGMP為前向推理而GMT為逆向推理因為模糊推論為前向

運算因此GMP非常適合使用為模糊控制的推論機構

〈5〉 解模糊化

將推論完成所得到的模糊輸出量轉換成實際的明確數值以便和

外界溝通解模糊化的方法有很多例最大歸屬度法重心法高

度法面積法等

圖 26 模糊系統的基本架構

14

22 直流馬達數學模型

圖27為直流馬達等效電路簡圖其中

iV = 輸入電壓 ai = 電樞電流

zR = 電樞電阻 gT = 轉矩

aL = 電樞電感 bE = 反電動勢

φ = 空氣隙磁通量 ω = 轉子角速度

B = 黏滯摩擦係數 J = 轉動慣量

圖 27 直流馬達等效電路簡圖

由克希荷夫電壓定律知

( ) ( ) ( )tEdt

tdiLtiRV b

aaaai ++= 〈26〉

由於反電動勢 bE 與轉軸的角速度 ( )tω 及空氣隙磁通量φ之乘積成正比即

( ) ( ) ( )tKtKtE emb ωφω == 〈27〉

15

又轉矩的平衡方程式為

( ) ( ) ( )dt

tdJtBtTgωω += 〈28〉

且馬達轉矩 gT 與電樞電流 ( )tia 及空氣隙磁通量φ乘積成正比即

( ) ( ) ( )tiKtiKtT ataag == φ 〈29〉

取〈26〉~〈29〉式之拉氏變換得

( ) ( ) ( ) ( )sEssILsIRsV baaaai ++= 〈210〉

( ) ( )sKsE eb Ω= 〈211〉

( ) ( ) ( )sJssBsTg Ω+Ω= 〈212〉

( ) ( )sIKsT atg = 〈213〉

則馬達輸入電流與轉速為

( ) ( ) ( )( ) ( )( )

sR

sEsV

sLRsEsV

sIe

a

bi

aa

bia τ+

minus

=+minus

=1

〈214〉

( ) ( ) ( )

sB

sT

sJBsT

sm

gg

τ+=

+=Ω

1 〈215〉

其中a

ae R

L=τ 為電樞電流的電氣時間常數 BJ

m =τ 為馬達轉動的機械時間

常數

直流馬達轉速對輸入電壓的轉移函數 ( )sG 為

( ) ( )( ) ( )( ) etaa

t

i KKBJsRsLK

sVssG

+++=

Ω=

( )( ) etmea

t

KKssBRK

+++=

ττ 11 〈216〉

16

在一般情況電樞電感很小所以 eτ 可以忽略不計因此上式成為一階落後

方程式

( ) ( )( ) ( ) m

m

etma

t

i sTK

KKsBRK

sVssG

+=

++=

Ω=

11 τ 〈217〉

其中

eta

mam KKBR

BRT

+=

τ

eta

tm KKBR

KK

+=

所以直流馬達數學模式可以以圖28表之﹝8﹞

圖 28 直流馬達數學模式方塊圖

17

第三章 系統功能分析與製作規劃

31 專題製作流程

如圖 31 所示本專題主要分為兩條路徑進行一為硬體另一則為軟體程

式撰寫本章著重硬體的規劃設計軟體則在第四章中介紹在完成 AB 信號

產生電路驅動功率放大電路與間距脈波產生電路設計與製作後須先接上馬達

做一連串的測試〈此時系統並無回受控制〉測試間距脈波是否太長或太短硬

體電路是否有缺失hellip等等另一方面也著手撰寫模糊控制程式並將其與硬體電

路結合最後做閉迴路系統的整合測試若發現系統的運作結果並不如預期

則需分別從硬體與軟體兩方面去改良

直流馬達轉速之模糊控制

文獻蒐集與整理

AB信號產生電路設計與製作

驅動功率放大電路設計與製作

間距脈波產生電路設計與製作

測試間距脈波是否太長或太短

系統測試測試馬達轉速是否

達到控制目的

結束與論文寫作

重新設計間距脈波長度

Yes

No

系統整合與修正

輸出信號與Fuzzy控制器之連結設計

規劃輸出與輸入歸屬函數

規劃模糊知識庫

撰寫主程式並加入模糊知識庫

程式編譯及連結

軟硬體整合測試馬達是否運作

程式調整及最佳化

No

YesYes

No

圖 31 專題製作流程圖

18

32 雙脈寬調變法之直流馬達驅動電路設計

本專題製作的雙脈寬調變法之直流馬達驅動電路設計大致可以分為二大部

分第一雙脈寬調變法之電路設計第二橋型驅動功率放大電路

雙脈寬調變〈Two Pulse Width Modulation簡稱TPWM〉之電路設計主要

是先製作一脈寬調變〈Pulse Width Modulation簡稱PWM〉波形然後再將此

波形各別經由一緩衝器〈buffer〉和反向器〈inverter〉則可產生AB驅動信號

脈波此即為TPWM

321 脈寬調變電路

如圖32先利用兩顆op產生三角波電路再利用一個比較器比較三角波

和誤差值之大小

150k

1M

20k

+12V

-12V

+12V

-12V10k

+12V

-12V

10k

+12V

-12V-

+-

+

-

+ PWMLM324

LM324

LM324

2200pF

圖 32 脈寬調變電路

〈1〉 三角波產生電路

三角波產生電路通常至少需要兩個運算放大器其電路如圖33OP1

為一個反相積分器OP2為一個史密特磁滯比較器將OP2的輸出方波經

19

OP1反相積分以後得到Vo1三角波此三角波又同時加到OP2控制其狀

態的改變

當方波產生器的輸出是正的則三角波產生器的輸出是斜向負相似

地當方波產生器的輸出是負則三角波產生器的輸出是斜向正這個動

作將產生三角波的輸出同時也輸出方波﹝9﹞

+VCC

-VCC

-

+

R1

R2

R3

+VCC

-VCC

-

+

OP1

OP2

Vo2Vo1

圖 33 三角波產生電路

對OP2而言是磁滯比較必須先找到OP2的 THV 和 TLV

232

21

32

3oo v

RRR

vRR

Rv

++

+=+ 〈31〉

當 0=+v 時

23

21 oo v

RR

v minus= 〈32〉

表要達到OP2的 0=+v 必須有這麼大的 1ov

當 12 sato Ev = 時

TLsato VERR

v =minus= 13

21 〈33〉

當 22 sato Ev minus= 時

THsato VERR

v =+= 23

21 〈34〉

20

對OP1而言是反相積分器 2ov 為其輸入 1ov 為其輸出則

tCIt

Rv

Ct

CRv

dtvCR

v oooo

11

2

11

22

111

11minus=minus=minus=minus= int 〈35〉

因為

1

2

Rvv

I o minusminus= 0=minusv 〈因為虛接地〉 〈36〉

所以

1

2

Rv

I o= 〈37〉

又因運算放大器的輸入阻抗非常大則流經 1C 的電流也為 I 相當於以定

電流對電容C 充電

當 12 sato Ev = 時 1ov 為下降斜波

tR

EC

v sato

1

1

11

1minus= 〈38〉

當 22 sato Ev minus= 時 1ov 上升斜波

( )

tRE

Cv sat

o1

2

11

1 minusminus= 〈39〉

由此可知三角波的上升與下降斜波乃因 1C 的充電與放電且時間

常數為 11CR

三角波週期分析如下

1 上升斜波的時間 1T

tCR

vv o

o1

1

21 minus= 11

2

1 CRvv

to

ominus=

1Tt = TLTHo VVv minus=1 22 sato Ev =

11111

21

sat

TLTH

sat

TLTH

EVV

CRCRE

VVT

minus=

minusminus= 〈310〉

2 下降斜波的時間 2T

tCR

vv o

o1

1

21 minus= 11

2

1 CRvv

to

ominus=

21

2Tt = THTLo VVv minus=1 12 sato Ev =

1

11111

1sat

TLTH

sat

THTL

EVV

CRCRE

VVT

minus=

minusminus= 〈311〉

3 週期 21 TTT +=

若 1satE = 2satE = satE 且3

22RR

VV TLTH =minus satE

3

2114

RR

CRT=

若R3 = nR2

則nCR

T 114=

114 CR

nf = 〈312〉

《實驗結果》

必須注意的是三角波的頻率太低將導致馬達的轉動產生脈動現象

故將工作頻率設計在1kHz以上

Ω= k1501R Ω= k102R

Ω= k203R pFC 22001 =

所得到的三角波頻率為

15kHz10220010001504

00010100020

f 12- =timestimestimestimes

timestimes

=

圖 34 三角波輸出波形

22

〈2〉 脈寬調變電路〈PWM〉

+12V

-12V

10k

+12V

-12V -

+ PWM輸出LM324三角波輸入

圖 35 脈寬調變電路

PWM系統往往連接至直流電源供應放大器的工作是以固定的頻率開

閉直流供應電壓其激發角是可以調整的因此得到波寬可調的輸出

將固定頻率的三角波與反向輸入的電壓做比較便可輸出一脈寬〈見圖

36〉反向電阻值的不同將導致反向輸入電壓不同故其輸出為一可調但

頻率固定的脈寬也正因為如此故稱為脈寬調變〈PWM〉由於輸出的

dutycycle不同故馬達將接收到不同的平均電壓因而可以藉由PWM控制

馬達的轉速

反相輸入電壓

PWM

圖 36 三角波與反相輸入電壓比較

23

PWM的優點在於馬達驅動電路的電晶體之控制信號改以脈波列來控

制使電晶體操作成類似開關的動作不是完全導通就是完全截止故電晶

體不是一直操作於作用區所以其功率消耗不大整體效率較高

《實驗結果》

圖 37 PWM 輸出波形

322 橋型驅動功率放大電路

如圖38所示主要由四個功率電晶體組成利用不同的電晶體對使直流

馬達做正逆轉控制當Q5Q8導通使馬達正轉當Q6Q7導通馬達則逆

轉電路中的電晶體扮演開關的作用

此種電路簡單只要一組直流電源供應且電晶體分擔了部份的電壓保護

電晶體迅速工作於截止與飽和狀態之間故沒有功率散逸損失之虞

但是在設計時切勿使Q5Q6同時導通以免燒毀電路上之元件因為在

AB兩脈波短暫的交變時間內由於電晶體本身之最小延遲時間有可能使Q5

Q6同時ON與Q7Q8在很短時間同時ON因此在15kHz交變下容易燒毀功

率電晶體

因此設計一間距脈波電路主要之功用使Q5Q6和Q7Q8均不同時導通

24

以拉長AB兩者交換時間

M

20k

10k

20k

10k

+24V

A 信號 B 信號

2N3055 2N3055

2N2955 2N2955

1N40021N4002

C1815 C1815

C1815 C1815

Q5

Q8Q6

Q7

圖 38 橋型驅動功率放大電路

圖 39 橋型驅動功率放大電路實體圖

25

此外若考慮電晶體BE間的電壓則電路會出現約 plusmn 06V的不感帶〈ded

band〉即電晶體的 oV 對 inV 間的關係如圖3101假使 inV 電壓為正弦波則 oV 變

成如圖3102為了改善這種缺失吾人利用兩個二極體接在電路上如圖38

用來補償電晶體BE間的壓降﹝10﹞

約06V

Dead band

Vo

Vin

圖 3101 呈現不感帶的轉移函數

圖 3102 輸出電壓波形

26

323 間距脈波產生電路

RCext15

Cext14 74123

A3

B2

Q13

CLR1

Q4

7486100k

2200pF

10k

10000pF

+5V

間距脈波輸出

圖 311 間距脈波產生電路

間距脈波的產生方式是根據脈寬調變〈PWM〉後的訊號再經由積分電路的

電阻兩端取出且經由兩倍頻器〈74LS86〉檢示出PWM的正負緣脈波最後

再利用單穩態IC〈74LS123〉將檢出信號之脈寬拉長至01ms此即為間距脈波

74LS123有兩個輸入端子A及B分別為下降波緣輸入端子及上升波緣輸入端

子當輸入A之脈波由ldquoH變成ldquoL之瞬間Q輸出變為ldquoH其持續時間長

短由RC時間常數決定反之當輸入B之脈波由ldquoL變成ldquoH之瞬間Q輸出

變成ldquoH維持一定時間

74LS123的輸出脈波之寬度是由電阻及電容之時間常數所決定概略計算公

式如下

CR045T timestimes=

電容 C 必須大於 1000pF

27

《實驗結果》

R=24kΩ C=10000pF

所以得到間距脈波為

( )msec0110810000p24k045T cong=timestimes= μ

圖 312 間距脈波

研究經分析後發現

1 間距 T 愈大愈能確保電路之安全性愈有保護作用

2 間距 T 愈大相對的使驅動信號脈波減少愈多造成馬達旋轉扭力大

大減弱

3 適當的間距 T不但不會影響馬達的輸出轉矩而且兼具保護電路的

效果

33 編碼器

轉動編碼器不只可以作為轉速的感測也能做位置的感測又適合於數位處

理故被廣泛使用若就信號來看轉動編碼器可分為增量型與絕對型若以檢

測的方式來分可分為光學式和磁式兩種在本專題中所使用的編碼器為光學式

增量型編碼器﹝11﹞

光學式轉動編碼器的原理如圖 313在附有細縫轉盤的兩側分別裝置發光元

28

件與受光元件如果只有一組光電檢測元件則輸出信號就只有一相的脈波信

號此種裝置稱為脈波產生器圖 314 為增量型轉碼器的輸出信號它是利用

兩組光電元件所產生的脈波信號A 相和 B 相間有相位差正轉時 A 相領前 B

相逆轉時 B 相領前 A 相因此利用此兩相做檢測馬達為正轉或逆轉的工作

並利用 A 相或 B 相的頻率檢測出目前的轉速

吾人計算出編碼器每一轉可以產生約 200 個脈波故檢測 A 相或 B 相其頻

率為 N則轉速應為 60200

timesN

〈rpm〉

圖 313 光學式轉動編碼器的原理圖

圖 314 編碼器的輸出信號波形

29

34 LM2917 FV 電路設計

對 LM2907 而言磁滯比較器和電流汞是構成頻率對電壓轉換的基本架構

並且預留一個運算放大器及一個電晶體供各種不同的使用圖 315 為吾人所設

計的 FV 電路圖中 C1 用以抑制電流汞動作時所產生的漣波變化正常使用時

此電容應大於 10C若 C1 太大也將造成轉換速度下降

因為單晶片 8051 之輸入電壓最高為 5V故必須設計其馬達最高轉速頻率所

轉成的電壓必須在 5V 以內由於馬達轉速頻率範圍極大故吾人給予 LM2917

+12V 的電壓以擴大它可以轉換的電壓範圍並將所需維持在 5V 內

a1

14

b1

1

a1

13

b1

2

a1

12

b1

3

a1

11

b1

4

1

a1

10

b1

5

a1

8

b1

7

a1

9

b1

6

L2917

Encoder輸 入

1uF

+12V

FV輸出1000pF

45k 10kC1

C2

圖 315 FV 電路

30

《實驗結果》

根據統計結果每 50mV 相對於 100Hz如此一來吾人想得知馬達目前

的轉速只要將單晶片所接收到的電壓值經過換算即可得知目前 encoder 所量測

的頻率吾人知道 encoder 一圈可產生 200 個脈波故馬達的轉速便可經過下列

公式換算得知

轉速〈rpm〉 60200

times=f

其中 =f encoder 所量測到的頻率

表 31 頻率與轉換電壓之關係

頻率

(Hz) 1 2 3 4 5 6 7 8 9

電壓(V) 0006 0006 0007 0008 0009 0009 0009 0009 001

頻率

(Hz) 10 20 30 40 50 60 70 80 90

電壓(V) 008 009 010 010 011 011 012 012 013

頻率

(Hz) 100 200 300 400 500 600 700 800 900

電壓(V) 013 018 023 028 033 038 043 049 054

頻率

(Hz) 1000 2000 3000 4000 5000 6000 7000 8000 9000

電壓(V) 059 109 16 209 257 304 3508 4006 45

31

圖 316 頻率對電壓曲線

35 單晶片介面電路

單晶片介面包括了二大部分分別為單晶片 8051AD converter

〈1〉8051 單晶片

為本控制系統的核心一切動作皆經由它控制

〈2〉AD converter

將類比開關所送出來的類比訊號經由 ADC 0804 轉換成數位訊號傳送

到單晶片的輸入埠

351 AD 轉換

以單晶片 8051 控制 ADC0804則單晶片 8051 必須下達ldquo開始轉換rdquo的命令

給 ADC0804然後 ADC0804 就開始讀入類比輸入端的電壓在內部開始轉換

經過一段轉換時間後〈約 100μ s〉ADC0804 就將轉換完成的值放在其內部的三

態輸出栓鎖緩衝器裡然後將轉換完成輸出腳〈INTR〉降為 low以通知單晶片

可以去讀轉換完成資料

當WR和CS 同時為ldquo0rdquo時表示對 ADC0804 下達ldquo開始轉換rdquo命令再經過

32

一段轉換時間〈100μ s〉後轉換完成ADC0804 會將其轉換完成的數位資料放

在其內部 8 位元緩衝區裡且將 INTR 降為ldquo0rdquo因此單晶片只要下達ldquo開始轉換rdquo

命令後去檢查 INTR 的狀態就可以知道是否轉換完畢其方法有兩種

1 輪詢法〈polling〉

2 中斷法〈interrupt〉

所謂輪詢法就是將 ADC0804 的 INTR接到 CPU 的一條 IO 線上然後以軟體指

令主動偵測其狀態當偵測到為ldquo0rdquo時就可以去讀出 ADC0804 裡的緩衝區的轉

換值

中斷法是一個很理想的 IO 方式因為不像輪詢法必須讓 CPU 等 ADC0804

轉換當 CPU 下達ldquo開始轉換rdquo命令後就可以做其他工作當 ADC0804 轉換完

畢後 INTR會降為ldquo0rdquo可以利用此信號去中斷 CPU再由中斷副程式去讀入

轉換值即可因此大大提高了程式的效率

當 CPU 接收到 ADC0804 發出ldquo轉換完畢rdquo的信號〈 INTR =0〉後就可以去

讀出轉換值其讀出的方法是將CS 與RD設為ldquo0rdquo即可讀到轉換值這個讀值的

動作又會使得 INTR恢復成ldquo1rdquo

1 CPU 下達ldquo開始轉換rdquo命令〈CS =0WR =0〉

2 ADC0804ldquo轉換完畢rdquo 〈 INTR =0〉

3 CPU 讀取轉換值〈 RD =0CS =0〉

4 讀完後 INTR =1

ADC0804 主要規格摘要如下

1 +5V 單電源工作電壓

2 類比電壓輸入範圍 0~+5V

33

3 參考電壓為 25V

4 轉換時間為 100μ s〈 CLKf =640kHz〉

5 解析度為 8 位元

6 誤差plusmn 1LSB

7 讀取時間 135ns

36 電源供應系統

本專題中所有電路及硬體設備所需的電源採用交流電源 110V 經由 PT-31

變壓器後再經過橋式整流後提供了直流電源而因為各個電路所需電源不同

因此製作了多組的變壓電路如下

1電壓源 DC5V選擇了 7805 的穩壓 IC 搭配電容得到了+5V 的電壓源

供〈1〉8051 微處理器 〈2〉ADC 0804 〈3〉74LS8674LS12374LS04

74LS02CD4013 〈4〉馬達 Encoder

2電壓源 DC12V使用 7812 穩壓 IC 搭配電容得到+12V 的電壓源供

LM2917 使用

3電壓源 DC24V利用 7824 的穩壓 IC 搭配電容獲得+24V 的直流電壓

源供電路之橋型驅動功率放大之電晶體使用

Vin1

+12V2

GND3

LM7812

2200uF 10000pF 2200uF 10000pF

+12V outputAC

圖 317 直流電源電路

34

圖 318 直流電源電路實體圖

37 馬達轉速的量測

表 33 PWM 輸出對應 encoder 週期

PWM dutycycle encoder 週期 PWM dutycycle encoder 週期

40 sμ 172 sμ 440 sμ 0 sμ

80 sμ 188 sμ 480 sμ 0 sμ

120 sμ 204 sμ 520 sμ 0 sμ

160 sμ 230 sμ 560 sμ 0 sμ

200 sμ 272 sμ 600 sμ 0 sμ

240 sμ 328 sμ 640 sμ 0 sμ

280 sμ 416 sμ 680 sμ 1320 sμ

320 sμ 540 sμ 720 sμ 750 sμ

360 sμ 800 sμ 760 sμ 510 sμ

400 sμ 1320 sμ 800 sμ 400 sμ

35

圖 319 PWM 輸出對應 encoder 週期

由統計可知道此馬達並不是一顆線性馬達故相信若使用模糊控制理論來

作為其回授控制系統的控制器一定能達到比傳統控制器的性能還要好而且若能

在模糊控制裡加上 PID 控制器的觀念一定能在系統的響應時間上升時間

安定時間和超越量達到最佳的控制另一方面馬達在其反方向的內阻較大需

要更大的力量才能使馬達驅動

36

第四章 軟體規劃與製作

41 PWM 之軟體設計

因為之前所介紹的硬體方式是以調整可變電阻來達到轉速的調整因此無法

得知所給予的脈寬長度和轉速大小尤其在回授時也不易給予適當的訊號來調整

轉速因此改良之方法就是以8051之軟體撰寫方式來產生固定的脈寬也就等

於給予轉速的命令而在其回授控制時也只要在內部程式给予適當的指令便可

達到脈寬長度的調整以達到閉迴路之受控系統

411 PWM 軟體流程

設定Timer0模式為0

TH0 = temp 32 TL0 = temp 32

temp = 8192 ndash j4 Key = 0

檢查是否有鍵值

將鍵值存入Key

Yes

No

設定Key值所對應的 j值

If P30 == 1Then P30 = 0 temp = 8192 ndash j4Else P30 = 1 temp=8192ndash880+j4

TH0 = temp 32 TL0 = temp 32

Start Timer0中斷副程式

啟動Timer0

等待Timer0中斷

返回主程式

圖 41 PWM 軟體設計流程圖

37

在此總共設計了五個按鈕分別代表不同的轉速停止正轉〈慢〉正轉

〈快〉逆轉〈慢〉和逆轉〈快〉使用Timer0是因為8051之計時中斷比延遲程

式來的準確故可以達到準確的計時程式設計理念中並沒有將中斷致能清除

因此Timer0會一直處於計時的狀態程式執行時將一邊檢查鍵值〈KeyStatus〉一

邊進行計時當計時完畢便呼叫中斷副程式然後執行改變Port 30的輸出狀

態若是為high則變為low反之若是為low即變為high同時並重設計時時間

Timer0繼續計時

當鍵值改變時計時的時間也會跟著改變如此一來Timer0將ㄧ直重覆上

述動作直到電源切掉Timer0才會停止計時

42 模糊控制之程式規劃與撰寫

本專題目標在完成了先前所規劃的硬體電路之後接著就是要達成利用模糊

控制理論來設計控制器在此採用了單晶片8051目的是為了以硬體實現方式來

代替電腦模擬期望能夠按照原訂計畫完成本專題「具模糊控制理論與雙脈寬調

變法之直流馬達驅動電路設計」

單晶片 8051 模糊控制的程式撰寫採下列幾個步驟依序完成

1 設定變數轉速誤差〈dspeed〉目前轉速〈sspeed〉

2 模糊化採用三角形歸屬函數採用三角形歸屬函數的原因

〈1〉 三角形函數為一連續函數

〈2〉 三角形函數為線性的函數所以計算速度較快

〈3〉 是具有發散也有收斂的函數和指數函數一樣接近

事實

3 模糊推論模糊規則將其所有可能發生情況以 IFhellipTHENhellip表示

並建立控制規則表

4 解模糊化採用重心法

38

421 歸屬函數

設定變數為目前轉速〈sspeed〉與轉速誤差〈dspeed〉因此此模糊控制器共

有兩個輸入訊號與一輸出訊號輸出訊號為脈寬長度該加或是減多少又因為有

五種不同的轉速因此各分別設計了不同的歸屬函數如下

1 當轉速 = 0

ml h

s s p e e d

d s p e e d

r p m0 5 0 1 0 0- 5 0- 1 0 0

mv l l h v h

r p m0- 3 0- 6 0- 1 0 0 3 0 6 0 1 0 0 圖 42 停止時之歸屬函數

2 正轉〈慢〉

ml hsspeed

dspeed

rpm150 225 300750

mvl l h vh

rpm150100500 200 250 300

圖 43 正轉〈慢〉之歸屬函數

39

3 正轉〈快〉

ml hsspeed

dspeed

rpm520 670 820370220

mvl l h vh

rpm500400300200 600 700 800

圖 44 正轉〈快〉之歸屬函數

4 逆轉〈慢〉

ml hsspeed

dspeed

rpm100 250 400500

mvl l h vh

rpm10050250 200 300 400 圖 45 逆轉〈慢〉之歸屬函數

40

5 逆轉〈快〉

ml hsspeed

dspeed

rpm300 450 600150

mvl l h vh

rpm450350250150 550 650 750

750

圖 46 逆轉〈快〉之歸屬函數

6 輸出

OutputMVL L H VH

rpm0-50-150-250 50 150 250

圖 47 輸出之歸屬函數

41

422 模糊規則庫

表 41 為吾人所設計的模糊控制規則庫並利用 Matlab 之 Fuzzy ToolBox 來

建立此規則庫以進行模擬推論圖 48 為當馬達輸入指令為正轉慢時推論後所得

到的三維空間圖

表 41 模糊控制規則表

Dspeed

vl l m h vh

l H M L VL VL

m VH H M L VL sspeed

h VH VH H M L

圖 48 推論後的三維空間圖

42

423 模糊控制器之軟體設計流程

Start 外部中斷副程式

ADCWR = 0 ADCWR = 1

〈令AD開始轉換〉

檢查鍵值以得到對應的歸屬函數

取得目前轉速與

轉速誤差

Fuzzy Rules決策

得到輸出訊號

Delay 10ms

ADC = 0 讀取AD值 ADCRD = 0

將AD值換算成轉速

ADCWR = 0 ADCWR = 1

〈AD開始轉換〉

返回主程式

致能外部中斷

圖 49 Fuzzy Controller 程式流程圖

當控制器一開始動作時便先執行AD轉換的工作當AD轉換完成時其

INTR的接腳便會觸發8051的外部中斷INTR0於是程式便發生外部中斷執行

外部中斷副程式的指令

43

在外部中斷副程式中AD將ㄧ直進行轉換與讀取的工作同時並將轉換後

的值直接換算成目前轉速與轉速誤差以供模糊控制器使用換算目前encoder

的頻率其公式為

160-V2000 times=頻率 〈4-1〉

式4-1之公式是根據表31所導出來的其中V為encoder之頻率轉成電壓之值

又假設所讀取的AD轉換值為value因為

AD的解析度 = bit256

5V+ = 511 ( Vbit ) 〈4-2〉

故value值與電壓V之關係為

511 value V times= 〈4-3〉

所以encoder之頻率與value值的關係為

頻率= 2000times ⎟⎠⎞

⎜⎝⎛ times

511 value - 160 〈4-4〉

故目前轉速為

sspeed = ( )rpm 60 200

times頻率 〈4-5〉

另ㄧ方面在主程式中程式會先去檢查鍵值也就等於檢查輸入指令以

找出符合使用的歸屬函數並將AD所獲得的轉速對應到歸屬函數中然後執行

決策判斷即進入規則庫中尋找出適當的決策判斷最後將此決策送入PWM程

式裡進行脈寬長度的調整使馬達在合理的要求下達到理想的轉速控制不會

因為外在環境的影響而使馬達轉速受到干擾

43 LCD 顯示轉速

此專題最後再增加一LCD顯示幕以顯示目前的轉速否則在程式設計完成

後人卻因無法以肉眼得知目前轉速而不能肯定馬達轉速是否有達到控制的目

標因此增加一顯示幕LCD是有必要的不僅隨時得知目前的轉速還能知道

44

設計出來的軟體其控制性是否夠好夠穩定

431 LCD 顯示幕之軟體流程

Start

設定LCD模組的初始狀態

設定外部中斷INTR0

與Timer0

設定TH0 = (65536 ndash 5000) 256 TL0 = (65536 ndash 5000)256

令ADCWR = 0 ADCWR = 1 AD開始轉換

等待中斷

外部中斷副程式

ADCRD = 0 讀取AD值 ADCRD = 1

將AD值換算成速度

ADCWR = 0 ADCWR = 1 AD開始轉換

Timer0中斷副程式

顯示LCD第一行

ldquoMotor Speed =

顯示LCD第二行ldquoxxxxxxx rpm其中 xxxxxx為外部中斷副程式所換算出的轉速

重設TH0與TL0

返回主程式返回主程式

圖 410 LCD 顯示幕之程式流程圖

此程式主要由兩個部分完成一為外部中斷副程式另ㄧ為 Timer0 中斷副

程式當主程式完成外部與 Timer0 兩個中斷的設定後隨即命令 AD 開始轉換

之後便一直停在 while〈1〉的迴圈裡不做任何動作而由兩個中斷副程式來完

成整個轉換與顯示的工作

45

外部中斷副程式主要負責 AD 的轉換讀取與轉速換算的工作AD 第一

次的轉換由主程式來下達命令當轉換完成後AD 的 INTR 接腳將觸發外部中

斷〈INTR0〉副程式此時程式便進入外部中斷副程式執行讀取 AD 值與轉速

換算的工作當這些工作完成時外部中斷副程式再次下達 AD 開始轉換的命

令而離開中斷副程式當 AD 再次轉換完成時又將再次執行中斷副程式

如此週而復始中斷副程式將ㄧ直進行讀取換算與轉換的工作

而 Timer0 中斷副程式主要負責 LCD 顯示之工作當主程式所設定的計時時

間計數完時程式便進入 Timer0 中斷副程式一旦進入 Timer0 中斷副程式程

式將執行 LCD 的顯示然後再重設 Timer0 的計數時間Timer0 將重新計數當

計數完時程式又將再度進入 Timer0 中斷副程式執行因為程式中並無清除

Timer0 的中斷致能故 Timer0 中斷副程式和外部中斷副程式ㄧ樣週而復始的

執行其副程式的工作

46

第五章 結論

本計劃主旨為具模糊控制理論與雙脈寬調變法之直流馬達驅動電路設計主

要是針對傳統電路設計之缺點提出改良之方法以TPWM取代PWM電路以模

糊理論基礎設計之控制器替代傳統PID控制器

TPWM轉速控制優於PWM之處在於

1 TPWM只需使用單電源即可達到正轉和逆轉的轉速控制而PWM必須

加上逆向開關或是雙電源才能使馬達產生正轉和逆轉

2 TPWM可控制馬達處於停止狀態無論在正向或逆向加上負載皆無法使

馬達產生轉動

3 馬達消耗定額功率輸出轉矩為額定值

4 馬達由停止到某定轉速時反應時間較快

模糊控制器優於PID控制器

1 不須導出繁雜的數學模型

2 適用於非線性系統

3 強健性與容錯性較高

本專題至此雖說大致的目標都已達到但是此系統仍然有許多不完美而需要

改進的地方例如在實驗過程中發現整個轉速的控制在回授上其反應時間

有點慢探討其原因有可能是控制器之程式上的問題

1 因為使用C語言撰寫程式故其執行速度較慢

2 程式可能寫的太累贅

3 模糊控制規則庫建立不良

若想改善這些問題可以嘗試著將C語言改為組合語言來撰寫並盡量減少

47

不必要的指令相信此動作一定能大大提昇程式的執行速度其次就是多做測

試利用測試中所學到的經驗來幫助模糊控制規則庫的改寫同時也能從測試中

發現更多的問題若是都能對問題加以一一解決的話相信必定能將此控制系統

做的更盡善盡美

48

參考文獻

﹝1﹞ 李適中直流馬達速度控制伺服控制〈基礎篇〉全華科技圖書股份有

限公司民 74

﹝2﹞ 廖錦文ldquo直流電動機之雙脈寬調變是〈TPWM〉驅動電路研究電

子技術月刊第 69 期pp94-1021992

﹝3﹞ 楊英魁孫宗瀛鄭魁香林建德蔣旭堂模糊控制理論與技術全華

科技圖書股份有限公司民 85

﹝4﹞ 林敦煌陳憬德直流馬達定位及轉速的模糊控制逢甲大學自動控制工

程學系學士論文民 87

﹝5﹞ LAZadehldquo Fuzzy Sets Information and Control Vol8 pp338-353

1965

﹝6﹞ EHMamdani and SAsslianldquo A fuzzy logic controller for a dynamic

plant Internation Journal of Man-Machine Studies Vol7 pp1-13 1975

﹝7﹞ 孫宗瀛楊英魁Fuzzy 控制理論實作與應用全華科技圖書股份有

限公司民 83 年

﹝8﹞ 許中平黃煌嘉直流電動機控制電路設計全華科技圖書股份有限公司

民 75

﹝9﹞ 盧明智黃敏祥OP Amp 應用+實驗模擬全華科技圖書股份有限公司

民 83

﹝10﹞陳文耀電動機控制工程復文書局2003

﹝11﹞許中平林全福電動機運轉控制技術全華科技圖書股份有限公司民

77

﹝12﹞楊明豐8051 單晶片 C 語言設計實務碁峯資訊2003 年

﹝13﹞蔡朝洋單晶片微電腦 80518951 原理與應用全華科技圖書股份有限公

司民 91

49

﹝14﹞王文俊認識 Fuzzy全華科技圖書股份有限公司民 90

50

附錄 A 專題硬體展示圖

圖 A-1 硬體整體圖

圖 A-2 硬體整體鳥瞰圖

51

圖 A-3 硬體側視圖

圖 A-4 操作與顯示面板

圖 A-5 間距脈波電路與 FV 電路

52

圖 A-6 橋型驅動功率放大電路

圖 A-7 操作與控制面板

53

附錄 B PWM 與模糊控制之程式

include reg51h include stdioh sbit ADCRD = P3^1 設定 RD 控制線接腳為 P31 sbit ADCWR = P3^3 設定 WR 控制線接腳為 P33 sbit P2_0 = 0xA0 接腳定義 sbit P2_1 = 0xA1 接腳定義 sbit P3_0 = 0xB0 接腳定義 sbit P3_1 = 0xB1 接腳定義 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P3_6 = 0xB6 接腳定義 void KeyStatus(void) 函數原型宣告 void feedback(void) 函數原型宣告 void compute_grade(void) 函數原型宣告 void delay1ms(int count) 函數原型宣告 void convert() 函數原型宣告 void condition() 函數原型宣告 void CW(void) 函數原型宣告 int j i 對應 PWM 的寬度 unsigned int temp 所設計的計時器時間 int sample = 1000 取樣率設定消除顯示值跳動 long int value r1 讀取 ADC0804 數位資料 long int set n condition select long int r grade_reg[2] grade[15] error1 error2 long int a1 b1 I long int membership[5][3]membership1[3][3] 定義歸屬函數 long int membership2[3][3] = -10-50-5050510 long int error[2] int Rule[15][3] = 113213313 定義判斷規則庫 212223323 311232333 411241342 511251351

54

main() 主程式 j = PWM = 110 設定 PWM 初始值 IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x00 設定計時器 0 工作於模式 0 temp=8192-j4 設定計時器 0 初值 TH0 = temp 32 TL0 = temp 32 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 P3_4 = 1 P3_5 = 0 P3_6 = 0 ADCWR = 0 令 ADC0804 的 WR = 0 ADCWR = 1 令 ADC0804 的 WR = 1 while (1) KeyStatus() 檢查鍵值 void KeyStatus(void) 檢查鍵值並給對應的 PWM 值 char KeyScan(void) 按鍵掃描函數宣告 unsigned char KeyStatus unsigned char Key = 0 KeyStatus=KeyScan() 呼叫按鍵掃描函數 if (KeyStatus = 0) 已有按鍵輸入 Key = KeyStatus Key = 鍵值 if (Key == 0x01) 假如輸入為按鍵 1 i = 110 PWM 為 110us j = i P3_4 = 1 LED 亮第一顆〈表馬達停止〉 P3_5 = 0 P3_6 = 0

55

else if (Key == 0x02 ) 假如輸入為按鍵 2 i = 140 PWM 為 140us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x04 ) 假如輸入為按鍵 3 i = 180 PWM 為 180us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x08 ) 假如輸入為按鍵 4 i = 80 PWM 為 80us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 else if (Key == 0x10 ) 假如輸入為按鍵 5 i = 40 PWM 為 40us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 PWM = j delay1ms(10) 呼叫延遲函數 feedback() 模糊控制判斷

56

void To_int(void) interrupt 1 Timer0 中斷函數 if (P3_0 == 0) 假如 PWM 輸出為 Low P3_0 = 1 變更 PWM 輸出為 High temp=8192-j4 設定 High 的時間 else 若 PWM 輸出為 High P3_0 = 0 變更 PWM 輸出為 Low temp=8192-880+j4 設定 Low 的時間 TH0 = temp 32 Timer0 的計時時間 TL0 = temp 32 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 char KeyScan(void) 檢查鍵值 char KeyStatus 按鍵狀態 P0=0xff 設定 P0 為輸入模式 KeyStatus=~P0 讀取按鍵狀態 return(KeyStatus) 將鍵值送回程式 void feedback(void) 模糊判斷 void Fuzzycontroller() 函數原型宣告 void condition1() 函數原型宣告

57

void condition2() 函數原型宣告 error1 = ((value)40-160)03 輸入變數 1 delay10ms(10) 延遲 10ms error2 = ((value)40-160)03 輸入變數 2 if (key == 0x01 ) 當按鍵 1找出對應的歸屬函數 並做出模糊控制判斷

int membership[5][3]= -100-60-30-60-300-30030030603060100

int membership1[3][3]=-100-500-50050050100 Fuzzycontroller() condition() if (key == 0x02 ) 當按鍵 2找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

05010050100150100150200150200250200250300 int membership1[3][3]=07515075150225150225300 Fuzzycontroller() condition() else if (key == 0x04) 當按鍵 3找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

200320400300400500400500600500600700600700800 int membership1[3][3]=220370520370520670520670820 Fuzzycontroller() condition() else if (key == 0x08) 當按鍵 4找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

02550255010050100200100200300200300400 int membership1[3][3]=05010050100250100250400 Fuzzycontroller() condition()

58

else if (key == 0x10) 當按鍵 5找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

150250350250350450350450550450550650550650750 int membership1[3][3]=150300450300450600450600750 Fuzzycontroller() condition2() void Fuzzycontroller() 模糊控制判斷 void compute_grade() 函數原型宣告 void compute_grade1() 函數原型宣告 a1 = 0 b1 = 001 I = 0 for (n=0 nlt=14 n++) r = error1 set = Rule[n][0]-1 compute_grade() 計算輸入變數 1 與

模糊程度的歸屬函數 condition = 1 r = error2 set = Rule[n][1]-1 compute_grade1() 計算輸入變數 2 與 模糊程度的歸屬函數 grade[n] = MIN(grade_reg[0] grade_reg[1]) a1 = a1 + (grade[n]membership2[Rule[n][2]-1][1]) b1 = b1 + grade[n] I = a1 b1 得到模糊控制判斷的結果 void compute_grade() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership[set][0]) || (r gt membership[set][2])) 當輸入變數不在 歸屬函數內

59

grade_reg[condition] = 0 else if ((r gt membership[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership[set][2]-r) (membership[set][2] - membership[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership[set][0]) (membership[set][1] - membership[set][0]) void compute_grade1() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership1[set][0]) || (r gt membership1[set][2])) 當輸入變數不在 歸屬函數內 grade_reg[condition] = 0 else if ((r gt membership1[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership1[set][2]-r) (membership1[set][2]-membership1[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership1[set][0]) (membership1[set][1]-membership1[set][0])

60

void condition() P2_0 = 1 設定 P20 為輸入模式 P2_1 = 1 設定 P21 為輸入模式 if ( (P2_0 == 1) ampamp (P2_1 == 0)) 當馬達為正轉時 if ( I gt 0 ) 若模糊判斷結果為正 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 若模糊判斷結果為零 PWM = PWM + 0 PWM 寬度不變 if ( I lt 0 ) 若模糊控制結果小於零 PWM = PWM + 1 PWM 寬度加 1 else if ( (P2_0 == 0) ampamp (P2_1 == 1) ) 若馬達為反轉 if ( I lt 0 ) 模糊控制小於零 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 模糊控制等於零 PWM = PWM + 0 PWM 寬度不變 if ( I gt 0 ) 模糊控制大於零 PWM = PWM + 1 PWM 寬度加 1 CW() 判斷 PWM 寬度上下限

61

void CW() 判斷 PWM 寬度上下限 if ( PWM gt= 215 ) 若 PWM 寬度 gt= 最大寬度 j = 215 PWM 寬度維持於 215us if ( PWM lt= 5 ) 若 PWM 寬度 lt= 最小寬度 j = 5 PWM 寬度維持在 5us if ( PWM gt 5 ampamp PWM lt 215 ) PWM 寬度介於最大與最小間 j = PWM PWM 依模糊控制判斷結果增減 void delay1ms(int count) 延遲 1ms int x y for ( x = 0 x lt count x++ ) for ( y = 0 y lt 122 y++ ) void convert() 數位資料換算成馬達轉速 r1 = ((value)40)-160

62

附錄 C LCD 顯示之程式

includereg51h 含 8051 所有暫存器宣告 include mathh define RS P3_5 LCD 指令資料選擇控制 define RW P3_4 LCD 讀寫控制腳 define Enable P3_3 LCD 致能接腳 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P0_0 = 0x80 接腳定義 sbit P0_1 = 0x81 接腳定義 sbit P0_2 = 0x82 接腳定義 sbit P0_3 = 0x83 接腳定義 sbit P0_4 = 0x84 接腳定義 sbit P0_5 = 0x85 接腳定義 sbit P0_6 = 0x86 接腳定義 sbit ADCRD = P3^7 設定 RD 控制線接腳為 P37 sbit ADCWR = P3^6 設定 WR 控制線接腳為 P36 void delay(void) 函數原型宣告 void delay10ms(int count) 函數原型宣告 void display(void) 函數原型宣告 void InitialLCD(void) 函數原型宣告 void WriteIns(char) 函數原型宣告 void WriteData(char) 函數原型宣告 void WriteString(charchar) 函數原型宣告 void CheckBusy(void) 函數原型宣告 void convert(void) 函數原型宣告 char MSG0[] = Motor Speed = 定義字串 MSG0 char MSG2[] = rpm 定義字串 MSG2 unsigned char MSG1[8]=0000000 定義字串 MSG1 unsigned long int value 讀取 ADC0804 數位資料 int sample = 1000 取樣率設定消除顯示值跳動 long int rpm

63

main() 主程式 InitialLCD() 初始化 LCD IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x01 設定計時器 0 工作於模式 1 TH0 = (65536-5000)256 設定計時器 0 初值 TL0 = (65536-5000)256 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 while(1) 等待中斷 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 while (--sample == 0) 取樣率減 1 sample = 1000 重設取樣率 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 void T0_int(void) interrupt 1 LCD 顯示動態掃描 display() 動態掃描顯示 TH0 = (65536-65535)256 重設計時初值 TL0 = (65536-65535)256

64

void InitialLCD(void) 設定 LCD 模組初始狀態 delay() 延遲函數 WriteIns(0x38) 設定 LCD 模組為 WriteIns(0x38) 2 行顯示 WriteIns(0x38) 8 位元介面 WriteIns(0x38) 5x7 點字型 WriteIns(0x08) 關閉顯示器 WriteIns(0x01) 清除 LCD 螢幕 WriteIns(0x0c) 令顯示器 ON但游標不顯示 WriteIns(0x06) 令 LCD 模組每接收到 1Byte 資料 AC 值自動加 1 void display() 掃描顯示 WriteIns(0x80) 設定 LCD 座標 WriteString(13MSG0) 將字串 MSG0 寫入 LCD 中 WriteIns(0xc0) 設定 LCD 座標 WriteString(8MSG1) 將字串 MSG1 寫入 LCD 中 WriteIns(0xc8) 設定 LCD 座標 WriteString(4MSG2) 將字串 MSG2 寫入 LCD 中 void convert(void) 換算轉速 long int freq freq = ((value)4000) - 16000 數位資料換成頻率公式 rpm = freq3 頻率換算轉速公式 MSG1[0] = (rpm1000000)+0x30 將結果存入字串 MSG1 中 MSG1[1] = ((rpm1000000)100000)+0x30 MSG1[2] = ((rpm100000)10000)+0x30 MSG1[3] = ((rpm10000)1000)+0x30 MSG1[4] = 0x2e MSG1[5] = ((rpm1000)100)+0x30 MSG1[6] = ((rpm100)10)+0x30 MSG1[7] = rpm10+0x30

65

void WriteIns(char instruction) 寫命令至 LCD 中 RS = 0 選擇指令暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = instruction 輸出命令至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteData(char i) 寫資料至 LCD 中 RS = 1 選擇資料暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = i 輸出資料至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteString(countMSG) 寫字串至 LCD 中 char count 字串長度 char MSG[] 字串資料 char i 定義位元組變數 for(i=0 iltcount i++) count 個位元組 WriteData(MSG[i]) 寫入一位元組的資料至 LCD 中 void CheckBusy(void) char i=0x80 檢查忙碌旗標 while(iamp0x80) 忙錄旗標 BF = 1 RS = 0 選擇指令暫存器 RW = 1 讀取 Enable = 1 致能 LCD i = P2 讀取 LCD 指令暫存器內的資料

66

Enable = 0 除能 LCD delay() 延遲函數 void delay() 延遲 5ms int i for(i=0 ilt250 i++)

  • 畢業專題封面pdf
  • File0004pdf
  • 最終版pdfpdf
Page 23: Based on Fuzzy Control Theorem and TPWM Method for DC ... · 使吾人想設計一模糊控制器來做為馬達轉速的閉迴路控制,以解決非線性系統的 問題。除此之外,flcs

14

22 直流馬達數學模型

圖27為直流馬達等效電路簡圖其中

iV = 輸入電壓 ai = 電樞電流

zR = 電樞電阻 gT = 轉矩

aL = 電樞電感 bE = 反電動勢

φ = 空氣隙磁通量 ω = 轉子角速度

B = 黏滯摩擦係數 J = 轉動慣量

圖 27 直流馬達等效電路簡圖

由克希荷夫電壓定律知

( ) ( ) ( )tEdt

tdiLtiRV b

aaaai ++= 〈26〉

由於反電動勢 bE 與轉軸的角速度 ( )tω 及空氣隙磁通量φ之乘積成正比即

( ) ( ) ( )tKtKtE emb ωφω == 〈27〉

15

又轉矩的平衡方程式為

( ) ( ) ( )dt

tdJtBtTgωω += 〈28〉

且馬達轉矩 gT 與電樞電流 ( )tia 及空氣隙磁通量φ乘積成正比即

( ) ( ) ( )tiKtiKtT ataag == φ 〈29〉

取〈26〉~〈29〉式之拉氏變換得

( ) ( ) ( ) ( )sEssILsIRsV baaaai ++= 〈210〉

( ) ( )sKsE eb Ω= 〈211〉

( ) ( ) ( )sJssBsTg Ω+Ω= 〈212〉

( ) ( )sIKsT atg = 〈213〉

則馬達輸入電流與轉速為

( ) ( ) ( )( ) ( )( )

sR

sEsV

sLRsEsV

sIe

a

bi

aa

bia τ+

minus

=+minus

=1

〈214〉

( ) ( ) ( )

sB

sT

sJBsT

sm

gg

τ+=

+=Ω

1 〈215〉

其中a

ae R

L=τ 為電樞電流的電氣時間常數 BJ

m =τ 為馬達轉動的機械時間

常數

直流馬達轉速對輸入電壓的轉移函數 ( )sG 為

( ) ( )( ) ( )( ) etaa

t

i KKBJsRsLK

sVssG

+++=

Ω=

( )( ) etmea

t

KKssBRK

+++=

ττ 11 〈216〉

16

在一般情況電樞電感很小所以 eτ 可以忽略不計因此上式成為一階落後

方程式

( ) ( )( ) ( ) m

m

etma

t

i sTK

KKsBRK

sVssG

+=

++=

Ω=

11 τ 〈217〉

其中

eta

mam KKBR

BRT

+=

τ

eta

tm KKBR

KK

+=

所以直流馬達數學模式可以以圖28表之﹝8﹞

圖 28 直流馬達數學模式方塊圖

17

第三章 系統功能分析與製作規劃

31 專題製作流程

如圖 31 所示本專題主要分為兩條路徑進行一為硬體另一則為軟體程

式撰寫本章著重硬體的規劃設計軟體則在第四章中介紹在完成 AB 信號

產生電路驅動功率放大電路與間距脈波產生電路設計與製作後須先接上馬達

做一連串的測試〈此時系統並無回受控制〉測試間距脈波是否太長或太短硬

體電路是否有缺失hellip等等另一方面也著手撰寫模糊控制程式並將其與硬體電

路結合最後做閉迴路系統的整合測試若發現系統的運作結果並不如預期

則需分別從硬體與軟體兩方面去改良

直流馬達轉速之模糊控制

文獻蒐集與整理

AB信號產生電路設計與製作

驅動功率放大電路設計與製作

間距脈波產生電路設計與製作

測試間距脈波是否太長或太短

系統測試測試馬達轉速是否

達到控制目的

結束與論文寫作

重新設計間距脈波長度

Yes

No

系統整合與修正

輸出信號與Fuzzy控制器之連結設計

規劃輸出與輸入歸屬函數

規劃模糊知識庫

撰寫主程式並加入模糊知識庫

程式編譯及連結

軟硬體整合測試馬達是否運作

程式調整及最佳化

No

YesYes

No

圖 31 專題製作流程圖

18

32 雙脈寬調變法之直流馬達驅動電路設計

本專題製作的雙脈寬調變法之直流馬達驅動電路設計大致可以分為二大部

分第一雙脈寬調變法之電路設計第二橋型驅動功率放大電路

雙脈寬調變〈Two Pulse Width Modulation簡稱TPWM〉之電路設計主要

是先製作一脈寬調變〈Pulse Width Modulation簡稱PWM〉波形然後再將此

波形各別經由一緩衝器〈buffer〉和反向器〈inverter〉則可產生AB驅動信號

脈波此即為TPWM

321 脈寬調變電路

如圖32先利用兩顆op產生三角波電路再利用一個比較器比較三角波

和誤差值之大小

150k

1M

20k

+12V

-12V

+12V

-12V10k

+12V

-12V

10k

+12V

-12V-

+-

+

-

+ PWMLM324

LM324

LM324

2200pF

圖 32 脈寬調變電路

〈1〉 三角波產生電路

三角波產生電路通常至少需要兩個運算放大器其電路如圖33OP1

為一個反相積分器OP2為一個史密特磁滯比較器將OP2的輸出方波經

19

OP1反相積分以後得到Vo1三角波此三角波又同時加到OP2控制其狀

態的改變

當方波產生器的輸出是正的則三角波產生器的輸出是斜向負相似

地當方波產生器的輸出是負則三角波產生器的輸出是斜向正這個動

作將產生三角波的輸出同時也輸出方波﹝9﹞

+VCC

-VCC

-

+

R1

R2

R3

+VCC

-VCC

-

+

OP1

OP2

Vo2Vo1

圖 33 三角波產生電路

對OP2而言是磁滯比較必須先找到OP2的 THV 和 TLV

232

21

32

3oo v

RRR

vRR

Rv

++

+=+ 〈31〉

當 0=+v 時

23

21 oo v

RR

v minus= 〈32〉

表要達到OP2的 0=+v 必須有這麼大的 1ov

當 12 sato Ev = 時

TLsato VERR

v =minus= 13

21 〈33〉

當 22 sato Ev minus= 時

THsato VERR

v =+= 23

21 〈34〉

20

對OP1而言是反相積分器 2ov 為其輸入 1ov 為其輸出則

tCIt

Rv

Ct

CRv

dtvCR

v oooo

11

2

11

22

111

11minus=minus=minus=minus= int 〈35〉

因為

1

2

Rvv

I o minusminus= 0=minusv 〈因為虛接地〉 〈36〉

所以

1

2

Rv

I o= 〈37〉

又因運算放大器的輸入阻抗非常大則流經 1C 的電流也為 I 相當於以定

電流對電容C 充電

當 12 sato Ev = 時 1ov 為下降斜波

tR

EC

v sato

1

1

11

1minus= 〈38〉

當 22 sato Ev minus= 時 1ov 上升斜波

( )

tRE

Cv sat

o1

2

11

1 minusminus= 〈39〉

由此可知三角波的上升與下降斜波乃因 1C 的充電與放電且時間

常數為 11CR

三角波週期分析如下

1 上升斜波的時間 1T

tCR

vv o

o1

1

21 minus= 11

2

1 CRvv

to

ominus=

1Tt = TLTHo VVv minus=1 22 sato Ev =

11111

21

sat

TLTH

sat

TLTH

EVV

CRCRE

VVT

minus=

minusminus= 〈310〉

2 下降斜波的時間 2T

tCR

vv o

o1

1

21 minus= 11

2

1 CRvv

to

ominus=

21

2Tt = THTLo VVv minus=1 12 sato Ev =

1

11111

1sat

TLTH

sat

THTL

EVV

CRCRE

VVT

minus=

minusminus= 〈311〉

3 週期 21 TTT +=

若 1satE = 2satE = satE 且3

22RR

VV TLTH =minus satE

3

2114

RR

CRT=

若R3 = nR2

則nCR

T 114=

114 CR

nf = 〈312〉

《實驗結果》

必須注意的是三角波的頻率太低將導致馬達的轉動產生脈動現象

故將工作頻率設計在1kHz以上

Ω= k1501R Ω= k102R

Ω= k203R pFC 22001 =

所得到的三角波頻率為

15kHz10220010001504

00010100020

f 12- =timestimestimestimes

timestimes

=

圖 34 三角波輸出波形

22

〈2〉 脈寬調變電路〈PWM〉

+12V

-12V

10k

+12V

-12V -

+ PWM輸出LM324三角波輸入

圖 35 脈寬調變電路

PWM系統往往連接至直流電源供應放大器的工作是以固定的頻率開

閉直流供應電壓其激發角是可以調整的因此得到波寬可調的輸出

將固定頻率的三角波與反向輸入的電壓做比較便可輸出一脈寬〈見圖

36〉反向電阻值的不同將導致反向輸入電壓不同故其輸出為一可調但

頻率固定的脈寬也正因為如此故稱為脈寬調變〈PWM〉由於輸出的

dutycycle不同故馬達將接收到不同的平均電壓因而可以藉由PWM控制

馬達的轉速

反相輸入電壓

PWM

圖 36 三角波與反相輸入電壓比較

23

PWM的優點在於馬達驅動電路的電晶體之控制信號改以脈波列來控

制使電晶體操作成類似開關的動作不是完全導通就是完全截止故電晶

體不是一直操作於作用區所以其功率消耗不大整體效率較高

《實驗結果》

圖 37 PWM 輸出波形

322 橋型驅動功率放大電路

如圖38所示主要由四個功率電晶體組成利用不同的電晶體對使直流

馬達做正逆轉控制當Q5Q8導通使馬達正轉當Q6Q7導通馬達則逆

轉電路中的電晶體扮演開關的作用

此種電路簡單只要一組直流電源供應且電晶體分擔了部份的電壓保護

電晶體迅速工作於截止與飽和狀態之間故沒有功率散逸損失之虞

但是在設計時切勿使Q5Q6同時導通以免燒毀電路上之元件因為在

AB兩脈波短暫的交變時間內由於電晶體本身之最小延遲時間有可能使Q5

Q6同時ON與Q7Q8在很短時間同時ON因此在15kHz交變下容易燒毀功

率電晶體

因此設計一間距脈波電路主要之功用使Q5Q6和Q7Q8均不同時導通

24

以拉長AB兩者交換時間

M

20k

10k

20k

10k

+24V

A 信號 B 信號

2N3055 2N3055

2N2955 2N2955

1N40021N4002

C1815 C1815

C1815 C1815

Q5

Q8Q6

Q7

圖 38 橋型驅動功率放大電路

圖 39 橋型驅動功率放大電路實體圖

25

此外若考慮電晶體BE間的電壓則電路會出現約 plusmn 06V的不感帶〈ded

band〉即電晶體的 oV 對 inV 間的關係如圖3101假使 inV 電壓為正弦波則 oV 變

成如圖3102為了改善這種缺失吾人利用兩個二極體接在電路上如圖38

用來補償電晶體BE間的壓降﹝10﹞

約06V

Dead band

Vo

Vin

圖 3101 呈現不感帶的轉移函數

圖 3102 輸出電壓波形

26

323 間距脈波產生電路

RCext15

Cext14 74123

A3

B2

Q13

CLR1

Q4

7486100k

2200pF

10k

10000pF

+5V

間距脈波輸出

圖 311 間距脈波產生電路

間距脈波的產生方式是根據脈寬調變〈PWM〉後的訊號再經由積分電路的

電阻兩端取出且經由兩倍頻器〈74LS86〉檢示出PWM的正負緣脈波最後

再利用單穩態IC〈74LS123〉將檢出信號之脈寬拉長至01ms此即為間距脈波

74LS123有兩個輸入端子A及B分別為下降波緣輸入端子及上升波緣輸入端

子當輸入A之脈波由ldquoH變成ldquoL之瞬間Q輸出變為ldquoH其持續時間長

短由RC時間常數決定反之當輸入B之脈波由ldquoL變成ldquoH之瞬間Q輸出

變成ldquoH維持一定時間

74LS123的輸出脈波之寬度是由電阻及電容之時間常數所決定概略計算公

式如下

CR045T timestimes=

電容 C 必須大於 1000pF

27

《實驗結果》

R=24kΩ C=10000pF

所以得到間距脈波為

( )msec0110810000p24k045T cong=timestimes= μ

圖 312 間距脈波

研究經分析後發現

1 間距 T 愈大愈能確保電路之安全性愈有保護作用

2 間距 T 愈大相對的使驅動信號脈波減少愈多造成馬達旋轉扭力大

大減弱

3 適當的間距 T不但不會影響馬達的輸出轉矩而且兼具保護電路的

效果

33 編碼器

轉動編碼器不只可以作為轉速的感測也能做位置的感測又適合於數位處

理故被廣泛使用若就信號來看轉動編碼器可分為增量型與絕對型若以檢

測的方式來分可分為光學式和磁式兩種在本專題中所使用的編碼器為光學式

增量型編碼器﹝11﹞

光學式轉動編碼器的原理如圖 313在附有細縫轉盤的兩側分別裝置發光元

28

件與受光元件如果只有一組光電檢測元件則輸出信號就只有一相的脈波信

號此種裝置稱為脈波產生器圖 314 為增量型轉碼器的輸出信號它是利用

兩組光電元件所產生的脈波信號A 相和 B 相間有相位差正轉時 A 相領前 B

相逆轉時 B 相領前 A 相因此利用此兩相做檢測馬達為正轉或逆轉的工作

並利用 A 相或 B 相的頻率檢測出目前的轉速

吾人計算出編碼器每一轉可以產生約 200 個脈波故檢測 A 相或 B 相其頻

率為 N則轉速應為 60200

timesN

〈rpm〉

圖 313 光學式轉動編碼器的原理圖

圖 314 編碼器的輸出信號波形

29

34 LM2917 FV 電路設計

對 LM2907 而言磁滯比較器和電流汞是構成頻率對電壓轉換的基本架構

並且預留一個運算放大器及一個電晶體供各種不同的使用圖 315 為吾人所設

計的 FV 電路圖中 C1 用以抑制電流汞動作時所產生的漣波變化正常使用時

此電容應大於 10C若 C1 太大也將造成轉換速度下降

因為單晶片 8051 之輸入電壓最高為 5V故必須設計其馬達最高轉速頻率所

轉成的電壓必須在 5V 以內由於馬達轉速頻率範圍極大故吾人給予 LM2917

+12V 的電壓以擴大它可以轉換的電壓範圍並將所需維持在 5V 內

a1

14

b1

1

a1

13

b1

2

a1

12

b1

3

a1

11

b1

4

1

a1

10

b1

5

a1

8

b1

7

a1

9

b1

6

L2917

Encoder輸 入

1uF

+12V

FV輸出1000pF

45k 10kC1

C2

圖 315 FV 電路

30

《實驗結果》

根據統計結果每 50mV 相對於 100Hz如此一來吾人想得知馬達目前

的轉速只要將單晶片所接收到的電壓值經過換算即可得知目前 encoder 所量測

的頻率吾人知道 encoder 一圈可產生 200 個脈波故馬達的轉速便可經過下列

公式換算得知

轉速〈rpm〉 60200

times=f

其中 =f encoder 所量測到的頻率

表 31 頻率與轉換電壓之關係

頻率

(Hz) 1 2 3 4 5 6 7 8 9

電壓(V) 0006 0006 0007 0008 0009 0009 0009 0009 001

頻率

(Hz) 10 20 30 40 50 60 70 80 90

電壓(V) 008 009 010 010 011 011 012 012 013

頻率

(Hz) 100 200 300 400 500 600 700 800 900

電壓(V) 013 018 023 028 033 038 043 049 054

頻率

(Hz) 1000 2000 3000 4000 5000 6000 7000 8000 9000

電壓(V) 059 109 16 209 257 304 3508 4006 45

31

圖 316 頻率對電壓曲線

35 單晶片介面電路

單晶片介面包括了二大部分分別為單晶片 8051AD converter

〈1〉8051 單晶片

為本控制系統的核心一切動作皆經由它控制

〈2〉AD converter

將類比開關所送出來的類比訊號經由 ADC 0804 轉換成數位訊號傳送

到單晶片的輸入埠

351 AD 轉換

以單晶片 8051 控制 ADC0804則單晶片 8051 必須下達ldquo開始轉換rdquo的命令

給 ADC0804然後 ADC0804 就開始讀入類比輸入端的電壓在內部開始轉換

經過一段轉換時間後〈約 100μ s〉ADC0804 就將轉換完成的值放在其內部的三

態輸出栓鎖緩衝器裡然後將轉換完成輸出腳〈INTR〉降為 low以通知單晶片

可以去讀轉換完成資料

當WR和CS 同時為ldquo0rdquo時表示對 ADC0804 下達ldquo開始轉換rdquo命令再經過

32

一段轉換時間〈100μ s〉後轉換完成ADC0804 會將其轉換完成的數位資料放

在其內部 8 位元緩衝區裡且將 INTR 降為ldquo0rdquo因此單晶片只要下達ldquo開始轉換rdquo

命令後去檢查 INTR 的狀態就可以知道是否轉換完畢其方法有兩種

1 輪詢法〈polling〉

2 中斷法〈interrupt〉

所謂輪詢法就是將 ADC0804 的 INTR接到 CPU 的一條 IO 線上然後以軟體指

令主動偵測其狀態當偵測到為ldquo0rdquo時就可以去讀出 ADC0804 裡的緩衝區的轉

換值

中斷法是一個很理想的 IO 方式因為不像輪詢法必須讓 CPU 等 ADC0804

轉換當 CPU 下達ldquo開始轉換rdquo命令後就可以做其他工作當 ADC0804 轉換完

畢後 INTR會降為ldquo0rdquo可以利用此信號去中斷 CPU再由中斷副程式去讀入

轉換值即可因此大大提高了程式的效率

當 CPU 接收到 ADC0804 發出ldquo轉換完畢rdquo的信號〈 INTR =0〉後就可以去

讀出轉換值其讀出的方法是將CS 與RD設為ldquo0rdquo即可讀到轉換值這個讀值的

動作又會使得 INTR恢復成ldquo1rdquo

1 CPU 下達ldquo開始轉換rdquo命令〈CS =0WR =0〉

2 ADC0804ldquo轉換完畢rdquo 〈 INTR =0〉

3 CPU 讀取轉換值〈 RD =0CS =0〉

4 讀完後 INTR =1

ADC0804 主要規格摘要如下

1 +5V 單電源工作電壓

2 類比電壓輸入範圍 0~+5V

33

3 參考電壓為 25V

4 轉換時間為 100μ s〈 CLKf =640kHz〉

5 解析度為 8 位元

6 誤差plusmn 1LSB

7 讀取時間 135ns

36 電源供應系統

本專題中所有電路及硬體設備所需的電源採用交流電源 110V 經由 PT-31

變壓器後再經過橋式整流後提供了直流電源而因為各個電路所需電源不同

因此製作了多組的變壓電路如下

1電壓源 DC5V選擇了 7805 的穩壓 IC 搭配電容得到了+5V 的電壓源

供〈1〉8051 微處理器 〈2〉ADC 0804 〈3〉74LS8674LS12374LS04

74LS02CD4013 〈4〉馬達 Encoder

2電壓源 DC12V使用 7812 穩壓 IC 搭配電容得到+12V 的電壓源供

LM2917 使用

3電壓源 DC24V利用 7824 的穩壓 IC 搭配電容獲得+24V 的直流電壓

源供電路之橋型驅動功率放大之電晶體使用

Vin1

+12V2

GND3

LM7812

2200uF 10000pF 2200uF 10000pF

+12V outputAC

圖 317 直流電源電路

34

圖 318 直流電源電路實體圖

37 馬達轉速的量測

表 33 PWM 輸出對應 encoder 週期

PWM dutycycle encoder 週期 PWM dutycycle encoder 週期

40 sμ 172 sμ 440 sμ 0 sμ

80 sμ 188 sμ 480 sμ 0 sμ

120 sμ 204 sμ 520 sμ 0 sμ

160 sμ 230 sμ 560 sμ 0 sμ

200 sμ 272 sμ 600 sμ 0 sμ

240 sμ 328 sμ 640 sμ 0 sμ

280 sμ 416 sμ 680 sμ 1320 sμ

320 sμ 540 sμ 720 sμ 750 sμ

360 sμ 800 sμ 760 sμ 510 sμ

400 sμ 1320 sμ 800 sμ 400 sμ

35

圖 319 PWM 輸出對應 encoder 週期

由統計可知道此馬達並不是一顆線性馬達故相信若使用模糊控制理論來

作為其回授控制系統的控制器一定能達到比傳統控制器的性能還要好而且若能

在模糊控制裡加上 PID 控制器的觀念一定能在系統的響應時間上升時間

安定時間和超越量達到最佳的控制另一方面馬達在其反方向的內阻較大需

要更大的力量才能使馬達驅動

36

第四章 軟體規劃與製作

41 PWM 之軟體設計

因為之前所介紹的硬體方式是以調整可變電阻來達到轉速的調整因此無法

得知所給予的脈寬長度和轉速大小尤其在回授時也不易給予適當的訊號來調整

轉速因此改良之方法就是以8051之軟體撰寫方式來產生固定的脈寬也就等

於給予轉速的命令而在其回授控制時也只要在內部程式给予適當的指令便可

達到脈寬長度的調整以達到閉迴路之受控系統

411 PWM 軟體流程

設定Timer0模式為0

TH0 = temp 32 TL0 = temp 32

temp = 8192 ndash j4 Key = 0

檢查是否有鍵值

將鍵值存入Key

Yes

No

設定Key值所對應的 j值

If P30 == 1Then P30 = 0 temp = 8192 ndash j4Else P30 = 1 temp=8192ndash880+j4

TH0 = temp 32 TL0 = temp 32

Start Timer0中斷副程式

啟動Timer0

等待Timer0中斷

返回主程式

圖 41 PWM 軟體設計流程圖

37

在此總共設計了五個按鈕分別代表不同的轉速停止正轉〈慢〉正轉

〈快〉逆轉〈慢〉和逆轉〈快〉使用Timer0是因為8051之計時中斷比延遲程

式來的準確故可以達到準確的計時程式設計理念中並沒有將中斷致能清除

因此Timer0會一直處於計時的狀態程式執行時將一邊檢查鍵值〈KeyStatus〉一

邊進行計時當計時完畢便呼叫中斷副程式然後執行改變Port 30的輸出狀

態若是為high則變為low反之若是為low即變為high同時並重設計時時間

Timer0繼續計時

當鍵值改變時計時的時間也會跟著改變如此一來Timer0將ㄧ直重覆上

述動作直到電源切掉Timer0才會停止計時

42 模糊控制之程式規劃與撰寫

本專題目標在完成了先前所規劃的硬體電路之後接著就是要達成利用模糊

控制理論來設計控制器在此採用了單晶片8051目的是為了以硬體實現方式來

代替電腦模擬期望能夠按照原訂計畫完成本專題「具模糊控制理論與雙脈寬調

變法之直流馬達驅動電路設計」

單晶片 8051 模糊控制的程式撰寫採下列幾個步驟依序完成

1 設定變數轉速誤差〈dspeed〉目前轉速〈sspeed〉

2 模糊化採用三角形歸屬函數採用三角形歸屬函數的原因

〈1〉 三角形函數為一連續函數

〈2〉 三角形函數為線性的函數所以計算速度較快

〈3〉 是具有發散也有收斂的函數和指數函數一樣接近

事實

3 模糊推論模糊規則將其所有可能發生情況以 IFhellipTHENhellip表示

並建立控制規則表

4 解模糊化採用重心法

38

421 歸屬函數

設定變數為目前轉速〈sspeed〉與轉速誤差〈dspeed〉因此此模糊控制器共

有兩個輸入訊號與一輸出訊號輸出訊號為脈寬長度該加或是減多少又因為有

五種不同的轉速因此各分別設計了不同的歸屬函數如下

1 當轉速 = 0

ml h

s s p e e d

d s p e e d

r p m0 5 0 1 0 0- 5 0- 1 0 0

mv l l h v h

r p m0- 3 0- 6 0- 1 0 0 3 0 6 0 1 0 0 圖 42 停止時之歸屬函數

2 正轉〈慢〉

ml hsspeed

dspeed

rpm150 225 300750

mvl l h vh

rpm150100500 200 250 300

圖 43 正轉〈慢〉之歸屬函數

39

3 正轉〈快〉

ml hsspeed

dspeed

rpm520 670 820370220

mvl l h vh

rpm500400300200 600 700 800

圖 44 正轉〈快〉之歸屬函數

4 逆轉〈慢〉

ml hsspeed

dspeed

rpm100 250 400500

mvl l h vh

rpm10050250 200 300 400 圖 45 逆轉〈慢〉之歸屬函數

40

5 逆轉〈快〉

ml hsspeed

dspeed

rpm300 450 600150

mvl l h vh

rpm450350250150 550 650 750

750

圖 46 逆轉〈快〉之歸屬函數

6 輸出

OutputMVL L H VH

rpm0-50-150-250 50 150 250

圖 47 輸出之歸屬函數

41

422 模糊規則庫

表 41 為吾人所設計的模糊控制規則庫並利用 Matlab 之 Fuzzy ToolBox 來

建立此規則庫以進行模擬推論圖 48 為當馬達輸入指令為正轉慢時推論後所得

到的三維空間圖

表 41 模糊控制規則表

Dspeed

vl l m h vh

l H M L VL VL

m VH H M L VL sspeed

h VH VH H M L

圖 48 推論後的三維空間圖

42

423 模糊控制器之軟體設計流程

Start 外部中斷副程式

ADCWR = 0 ADCWR = 1

〈令AD開始轉換〉

檢查鍵值以得到對應的歸屬函數

取得目前轉速與

轉速誤差

Fuzzy Rules決策

得到輸出訊號

Delay 10ms

ADC = 0 讀取AD值 ADCRD = 0

將AD值換算成轉速

ADCWR = 0 ADCWR = 1

〈AD開始轉換〉

返回主程式

致能外部中斷

圖 49 Fuzzy Controller 程式流程圖

當控制器一開始動作時便先執行AD轉換的工作當AD轉換完成時其

INTR的接腳便會觸發8051的外部中斷INTR0於是程式便發生外部中斷執行

外部中斷副程式的指令

43

在外部中斷副程式中AD將ㄧ直進行轉換與讀取的工作同時並將轉換後

的值直接換算成目前轉速與轉速誤差以供模糊控制器使用換算目前encoder

的頻率其公式為

160-V2000 times=頻率 〈4-1〉

式4-1之公式是根據表31所導出來的其中V為encoder之頻率轉成電壓之值

又假設所讀取的AD轉換值為value因為

AD的解析度 = bit256

5V+ = 511 ( Vbit ) 〈4-2〉

故value值與電壓V之關係為

511 value V times= 〈4-3〉

所以encoder之頻率與value值的關係為

頻率= 2000times ⎟⎠⎞

⎜⎝⎛ times

511 value - 160 〈4-4〉

故目前轉速為

sspeed = ( )rpm 60 200

times頻率 〈4-5〉

另ㄧ方面在主程式中程式會先去檢查鍵值也就等於檢查輸入指令以

找出符合使用的歸屬函數並將AD所獲得的轉速對應到歸屬函數中然後執行

決策判斷即進入規則庫中尋找出適當的決策判斷最後將此決策送入PWM程

式裡進行脈寬長度的調整使馬達在合理的要求下達到理想的轉速控制不會

因為外在環境的影響而使馬達轉速受到干擾

43 LCD 顯示轉速

此專題最後再增加一LCD顯示幕以顯示目前的轉速否則在程式設計完成

後人卻因無法以肉眼得知目前轉速而不能肯定馬達轉速是否有達到控制的目

標因此增加一顯示幕LCD是有必要的不僅隨時得知目前的轉速還能知道

44

設計出來的軟體其控制性是否夠好夠穩定

431 LCD 顯示幕之軟體流程

Start

設定LCD模組的初始狀態

設定外部中斷INTR0

與Timer0

設定TH0 = (65536 ndash 5000) 256 TL0 = (65536 ndash 5000)256

令ADCWR = 0 ADCWR = 1 AD開始轉換

等待中斷

外部中斷副程式

ADCRD = 0 讀取AD值 ADCRD = 1

將AD值換算成速度

ADCWR = 0 ADCWR = 1 AD開始轉換

Timer0中斷副程式

顯示LCD第一行

ldquoMotor Speed =

顯示LCD第二行ldquoxxxxxxx rpm其中 xxxxxx為外部中斷副程式所換算出的轉速

重設TH0與TL0

返回主程式返回主程式

圖 410 LCD 顯示幕之程式流程圖

此程式主要由兩個部分完成一為外部中斷副程式另ㄧ為 Timer0 中斷副

程式當主程式完成外部與 Timer0 兩個中斷的設定後隨即命令 AD 開始轉換

之後便一直停在 while〈1〉的迴圈裡不做任何動作而由兩個中斷副程式來完

成整個轉換與顯示的工作

45

外部中斷副程式主要負責 AD 的轉換讀取與轉速換算的工作AD 第一

次的轉換由主程式來下達命令當轉換完成後AD 的 INTR 接腳將觸發外部中

斷〈INTR0〉副程式此時程式便進入外部中斷副程式執行讀取 AD 值與轉速

換算的工作當這些工作完成時外部中斷副程式再次下達 AD 開始轉換的命

令而離開中斷副程式當 AD 再次轉換完成時又將再次執行中斷副程式

如此週而復始中斷副程式將ㄧ直進行讀取換算與轉換的工作

而 Timer0 中斷副程式主要負責 LCD 顯示之工作當主程式所設定的計時時

間計數完時程式便進入 Timer0 中斷副程式一旦進入 Timer0 中斷副程式程

式將執行 LCD 的顯示然後再重設 Timer0 的計數時間Timer0 將重新計數當

計數完時程式又將再度進入 Timer0 中斷副程式執行因為程式中並無清除

Timer0 的中斷致能故 Timer0 中斷副程式和外部中斷副程式ㄧ樣週而復始的

執行其副程式的工作

46

第五章 結論

本計劃主旨為具模糊控制理論與雙脈寬調變法之直流馬達驅動電路設計主

要是針對傳統電路設計之缺點提出改良之方法以TPWM取代PWM電路以模

糊理論基礎設計之控制器替代傳統PID控制器

TPWM轉速控制優於PWM之處在於

1 TPWM只需使用單電源即可達到正轉和逆轉的轉速控制而PWM必須

加上逆向開關或是雙電源才能使馬達產生正轉和逆轉

2 TPWM可控制馬達處於停止狀態無論在正向或逆向加上負載皆無法使

馬達產生轉動

3 馬達消耗定額功率輸出轉矩為額定值

4 馬達由停止到某定轉速時反應時間較快

模糊控制器優於PID控制器

1 不須導出繁雜的數學模型

2 適用於非線性系統

3 強健性與容錯性較高

本專題至此雖說大致的目標都已達到但是此系統仍然有許多不完美而需要

改進的地方例如在實驗過程中發現整個轉速的控制在回授上其反應時間

有點慢探討其原因有可能是控制器之程式上的問題

1 因為使用C語言撰寫程式故其執行速度較慢

2 程式可能寫的太累贅

3 模糊控制規則庫建立不良

若想改善這些問題可以嘗試著將C語言改為組合語言來撰寫並盡量減少

47

不必要的指令相信此動作一定能大大提昇程式的執行速度其次就是多做測

試利用測試中所學到的經驗來幫助模糊控制規則庫的改寫同時也能從測試中

發現更多的問題若是都能對問題加以一一解決的話相信必定能將此控制系統

做的更盡善盡美

48

參考文獻

﹝1﹞ 李適中直流馬達速度控制伺服控制〈基礎篇〉全華科技圖書股份有

限公司民 74

﹝2﹞ 廖錦文ldquo直流電動機之雙脈寬調變是〈TPWM〉驅動電路研究電

子技術月刊第 69 期pp94-1021992

﹝3﹞ 楊英魁孫宗瀛鄭魁香林建德蔣旭堂模糊控制理論與技術全華

科技圖書股份有限公司民 85

﹝4﹞ 林敦煌陳憬德直流馬達定位及轉速的模糊控制逢甲大學自動控制工

程學系學士論文民 87

﹝5﹞ LAZadehldquo Fuzzy Sets Information and Control Vol8 pp338-353

1965

﹝6﹞ EHMamdani and SAsslianldquo A fuzzy logic controller for a dynamic

plant Internation Journal of Man-Machine Studies Vol7 pp1-13 1975

﹝7﹞ 孫宗瀛楊英魁Fuzzy 控制理論實作與應用全華科技圖書股份有

限公司民 83 年

﹝8﹞ 許中平黃煌嘉直流電動機控制電路設計全華科技圖書股份有限公司

民 75

﹝9﹞ 盧明智黃敏祥OP Amp 應用+實驗模擬全華科技圖書股份有限公司

民 83

﹝10﹞陳文耀電動機控制工程復文書局2003

﹝11﹞許中平林全福電動機運轉控制技術全華科技圖書股份有限公司民

77

﹝12﹞楊明豐8051 單晶片 C 語言設計實務碁峯資訊2003 年

﹝13﹞蔡朝洋單晶片微電腦 80518951 原理與應用全華科技圖書股份有限公

司民 91

49

﹝14﹞王文俊認識 Fuzzy全華科技圖書股份有限公司民 90

50

附錄 A 專題硬體展示圖

圖 A-1 硬體整體圖

圖 A-2 硬體整體鳥瞰圖

51

圖 A-3 硬體側視圖

圖 A-4 操作與顯示面板

圖 A-5 間距脈波電路與 FV 電路

52

圖 A-6 橋型驅動功率放大電路

圖 A-7 操作與控制面板

53

附錄 B PWM 與模糊控制之程式

include reg51h include stdioh sbit ADCRD = P3^1 設定 RD 控制線接腳為 P31 sbit ADCWR = P3^3 設定 WR 控制線接腳為 P33 sbit P2_0 = 0xA0 接腳定義 sbit P2_1 = 0xA1 接腳定義 sbit P3_0 = 0xB0 接腳定義 sbit P3_1 = 0xB1 接腳定義 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P3_6 = 0xB6 接腳定義 void KeyStatus(void) 函數原型宣告 void feedback(void) 函數原型宣告 void compute_grade(void) 函數原型宣告 void delay1ms(int count) 函數原型宣告 void convert() 函數原型宣告 void condition() 函數原型宣告 void CW(void) 函數原型宣告 int j i 對應 PWM 的寬度 unsigned int temp 所設計的計時器時間 int sample = 1000 取樣率設定消除顯示值跳動 long int value r1 讀取 ADC0804 數位資料 long int set n condition select long int r grade_reg[2] grade[15] error1 error2 long int a1 b1 I long int membership[5][3]membership1[3][3] 定義歸屬函數 long int membership2[3][3] = -10-50-5050510 long int error[2] int Rule[15][3] = 113213313 定義判斷規則庫 212223323 311232333 411241342 511251351

54

main() 主程式 j = PWM = 110 設定 PWM 初始值 IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x00 設定計時器 0 工作於模式 0 temp=8192-j4 設定計時器 0 初值 TH0 = temp 32 TL0 = temp 32 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 P3_4 = 1 P3_5 = 0 P3_6 = 0 ADCWR = 0 令 ADC0804 的 WR = 0 ADCWR = 1 令 ADC0804 的 WR = 1 while (1) KeyStatus() 檢查鍵值 void KeyStatus(void) 檢查鍵值並給對應的 PWM 值 char KeyScan(void) 按鍵掃描函數宣告 unsigned char KeyStatus unsigned char Key = 0 KeyStatus=KeyScan() 呼叫按鍵掃描函數 if (KeyStatus = 0) 已有按鍵輸入 Key = KeyStatus Key = 鍵值 if (Key == 0x01) 假如輸入為按鍵 1 i = 110 PWM 為 110us j = i P3_4 = 1 LED 亮第一顆〈表馬達停止〉 P3_5 = 0 P3_6 = 0

55

else if (Key == 0x02 ) 假如輸入為按鍵 2 i = 140 PWM 為 140us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x04 ) 假如輸入為按鍵 3 i = 180 PWM 為 180us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x08 ) 假如輸入為按鍵 4 i = 80 PWM 為 80us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 else if (Key == 0x10 ) 假如輸入為按鍵 5 i = 40 PWM 為 40us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 PWM = j delay1ms(10) 呼叫延遲函數 feedback() 模糊控制判斷

56

void To_int(void) interrupt 1 Timer0 中斷函數 if (P3_0 == 0) 假如 PWM 輸出為 Low P3_0 = 1 變更 PWM 輸出為 High temp=8192-j4 設定 High 的時間 else 若 PWM 輸出為 High P3_0 = 0 變更 PWM 輸出為 Low temp=8192-880+j4 設定 Low 的時間 TH0 = temp 32 Timer0 的計時時間 TL0 = temp 32 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 char KeyScan(void) 檢查鍵值 char KeyStatus 按鍵狀態 P0=0xff 設定 P0 為輸入模式 KeyStatus=~P0 讀取按鍵狀態 return(KeyStatus) 將鍵值送回程式 void feedback(void) 模糊判斷 void Fuzzycontroller() 函數原型宣告 void condition1() 函數原型宣告

57

void condition2() 函數原型宣告 error1 = ((value)40-160)03 輸入變數 1 delay10ms(10) 延遲 10ms error2 = ((value)40-160)03 輸入變數 2 if (key == 0x01 ) 當按鍵 1找出對應的歸屬函數 並做出模糊控制判斷

int membership[5][3]= -100-60-30-60-300-30030030603060100

int membership1[3][3]=-100-500-50050050100 Fuzzycontroller() condition() if (key == 0x02 ) 當按鍵 2找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

05010050100150100150200150200250200250300 int membership1[3][3]=07515075150225150225300 Fuzzycontroller() condition() else if (key == 0x04) 當按鍵 3找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

200320400300400500400500600500600700600700800 int membership1[3][3]=220370520370520670520670820 Fuzzycontroller() condition() else if (key == 0x08) 當按鍵 4找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

02550255010050100200100200300200300400 int membership1[3][3]=05010050100250100250400 Fuzzycontroller() condition()

58

else if (key == 0x10) 當按鍵 5找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

150250350250350450350450550450550650550650750 int membership1[3][3]=150300450300450600450600750 Fuzzycontroller() condition2() void Fuzzycontroller() 模糊控制判斷 void compute_grade() 函數原型宣告 void compute_grade1() 函數原型宣告 a1 = 0 b1 = 001 I = 0 for (n=0 nlt=14 n++) r = error1 set = Rule[n][0]-1 compute_grade() 計算輸入變數 1 與

模糊程度的歸屬函數 condition = 1 r = error2 set = Rule[n][1]-1 compute_grade1() 計算輸入變數 2 與 模糊程度的歸屬函數 grade[n] = MIN(grade_reg[0] grade_reg[1]) a1 = a1 + (grade[n]membership2[Rule[n][2]-1][1]) b1 = b1 + grade[n] I = a1 b1 得到模糊控制判斷的結果 void compute_grade() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership[set][0]) || (r gt membership[set][2])) 當輸入變數不在 歸屬函數內

59

grade_reg[condition] = 0 else if ((r gt membership[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership[set][2]-r) (membership[set][2] - membership[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership[set][0]) (membership[set][1] - membership[set][0]) void compute_grade1() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership1[set][0]) || (r gt membership1[set][2])) 當輸入變數不在 歸屬函數內 grade_reg[condition] = 0 else if ((r gt membership1[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership1[set][2]-r) (membership1[set][2]-membership1[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership1[set][0]) (membership1[set][1]-membership1[set][0])

60

void condition() P2_0 = 1 設定 P20 為輸入模式 P2_1 = 1 設定 P21 為輸入模式 if ( (P2_0 == 1) ampamp (P2_1 == 0)) 當馬達為正轉時 if ( I gt 0 ) 若模糊判斷結果為正 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 若模糊判斷結果為零 PWM = PWM + 0 PWM 寬度不變 if ( I lt 0 ) 若模糊控制結果小於零 PWM = PWM + 1 PWM 寬度加 1 else if ( (P2_0 == 0) ampamp (P2_1 == 1) ) 若馬達為反轉 if ( I lt 0 ) 模糊控制小於零 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 模糊控制等於零 PWM = PWM + 0 PWM 寬度不變 if ( I gt 0 ) 模糊控制大於零 PWM = PWM + 1 PWM 寬度加 1 CW() 判斷 PWM 寬度上下限

61

void CW() 判斷 PWM 寬度上下限 if ( PWM gt= 215 ) 若 PWM 寬度 gt= 最大寬度 j = 215 PWM 寬度維持於 215us if ( PWM lt= 5 ) 若 PWM 寬度 lt= 最小寬度 j = 5 PWM 寬度維持在 5us if ( PWM gt 5 ampamp PWM lt 215 ) PWM 寬度介於最大與最小間 j = PWM PWM 依模糊控制判斷結果增減 void delay1ms(int count) 延遲 1ms int x y for ( x = 0 x lt count x++ ) for ( y = 0 y lt 122 y++ ) void convert() 數位資料換算成馬達轉速 r1 = ((value)40)-160

62

附錄 C LCD 顯示之程式

includereg51h 含 8051 所有暫存器宣告 include mathh define RS P3_5 LCD 指令資料選擇控制 define RW P3_4 LCD 讀寫控制腳 define Enable P3_3 LCD 致能接腳 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P0_0 = 0x80 接腳定義 sbit P0_1 = 0x81 接腳定義 sbit P0_2 = 0x82 接腳定義 sbit P0_3 = 0x83 接腳定義 sbit P0_4 = 0x84 接腳定義 sbit P0_5 = 0x85 接腳定義 sbit P0_6 = 0x86 接腳定義 sbit ADCRD = P3^7 設定 RD 控制線接腳為 P37 sbit ADCWR = P3^6 設定 WR 控制線接腳為 P36 void delay(void) 函數原型宣告 void delay10ms(int count) 函數原型宣告 void display(void) 函數原型宣告 void InitialLCD(void) 函數原型宣告 void WriteIns(char) 函數原型宣告 void WriteData(char) 函數原型宣告 void WriteString(charchar) 函數原型宣告 void CheckBusy(void) 函數原型宣告 void convert(void) 函數原型宣告 char MSG0[] = Motor Speed = 定義字串 MSG0 char MSG2[] = rpm 定義字串 MSG2 unsigned char MSG1[8]=0000000 定義字串 MSG1 unsigned long int value 讀取 ADC0804 數位資料 int sample = 1000 取樣率設定消除顯示值跳動 long int rpm

63

main() 主程式 InitialLCD() 初始化 LCD IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x01 設定計時器 0 工作於模式 1 TH0 = (65536-5000)256 設定計時器 0 初值 TL0 = (65536-5000)256 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 while(1) 等待中斷 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 while (--sample == 0) 取樣率減 1 sample = 1000 重設取樣率 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 void T0_int(void) interrupt 1 LCD 顯示動態掃描 display() 動態掃描顯示 TH0 = (65536-65535)256 重設計時初值 TL0 = (65536-65535)256

64

void InitialLCD(void) 設定 LCD 模組初始狀態 delay() 延遲函數 WriteIns(0x38) 設定 LCD 模組為 WriteIns(0x38) 2 行顯示 WriteIns(0x38) 8 位元介面 WriteIns(0x38) 5x7 點字型 WriteIns(0x08) 關閉顯示器 WriteIns(0x01) 清除 LCD 螢幕 WriteIns(0x0c) 令顯示器 ON但游標不顯示 WriteIns(0x06) 令 LCD 模組每接收到 1Byte 資料 AC 值自動加 1 void display() 掃描顯示 WriteIns(0x80) 設定 LCD 座標 WriteString(13MSG0) 將字串 MSG0 寫入 LCD 中 WriteIns(0xc0) 設定 LCD 座標 WriteString(8MSG1) 將字串 MSG1 寫入 LCD 中 WriteIns(0xc8) 設定 LCD 座標 WriteString(4MSG2) 將字串 MSG2 寫入 LCD 中 void convert(void) 換算轉速 long int freq freq = ((value)4000) - 16000 數位資料換成頻率公式 rpm = freq3 頻率換算轉速公式 MSG1[0] = (rpm1000000)+0x30 將結果存入字串 MSG1 中 MSG1[1] = ((rpm1000000)100000)+0x30 MSG1[2] = ((rpm100000)10000)+0x30 MSG1[3] = ((rpm10000)1000)+0x30 MSG1[4] = 0x2e MSG1[5] = ((rpm1000)100)+0x30 MSG1[6] = ((rpm100)10)+0x30 MSG1[7] = rpm10+0x30

65

void WriteIns(char instruction) 寫命令至 LCD 中 RS = 0 選擇指令暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = instruction 輸出命令至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteData(char i) 寫資料至 LCD 中 RS = 1 選擇資料暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = i 輸出資料至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteString(countMSG) 寫字串至 LCD 中 char count 字串長度 char MSG[] 字串資料 char i 定義位元組變數 for(i=0 iltcount i++) count 個位元組 WriteData(MSG[i]) 寫入一位元組的資料至 LCD 中 void CheckBusy(void) char i=0x80 檢查忙碌旗標 while(iamp0x80) 忙錄旗標 BF = 1 RS = 0 選擇指令暫存器 RW = 1 讀取 Enable = 1 致能 LCD i = P2 讀取 LCD 指令暫存器內的資料

66

Enable = 0 除能 LCD delay() 延遲函數 void delay() 延遲 5ms int i for(i=0 ilt250 i++)

  • 畢業專題封面pdf
  • File0004pdf
  • 最終版pdfpdf
Page 24: Based on Fuzzy Control Theorem and TPWM Method for DC ... · 使吾人想設計一模糊控制器來做為馬達轉速的閉迴路控制,以解決非線性系統的 問題。除此之外,flcs

15

又轉矩的平衡方程式為

( ) ( ) ( )dt

tdJtBtTgωω += 〈28〉

且馬達轉矩 gT 與電樞電流 ( )tia 及空氣隙磁通量φ乘積成正比即

( ) ( ) ( )tiKtiKtT ataag == φ 〈29〉

取〈26〉~〈29〉式之拉氏變換得

( ) ( ) ( ) ( )sEssILsIRsV baaaai ++= 〈210〉

( ) ( )sKsE eb Ω= 〈211〉

( ) ( ) ( )sJssBsTg Ω+Ω= 〈212〉

( ) ( )sIKsT atg = 〈213〉

則馬達輸入電流與轉速為

( ) ( ) ( )( ) ( )( )

sR

sEsV

sLRsEsV

sIe

a

bi

aa

bia τ+

minus

=+minus

=1

〈214〉

( ) ( ) ( )

sB

sT

sJBsT

sm

gg

τ+=

+=Ω

1 〈215〉

其中a

ae R

L=τ 為電樞電流的電氣時間常數 BJ

m =τ 為馬達轉動的機械時間

常數

直流馬達轉速對輸入電壓的轉移函數 ( )sG 為

( ) ( )( ) ( )( ) etaa

t

i KKBJsRsLK

sVssG

+++=

Ω=

( )( ) etmea

t

KKssBRK

+++=

ττ 11 〈216〉

16

在一般情況電樞電感很小所以 eτ 可以忽略不計因此上式成為一階落後

方程式

( ) ( )( ) ( ) m

m

etma

t

i sTK

KKsBRK

sVssG

+=

++=

Ω=

11 τ 〈217〉

其中

eta

mam KKBR

BRT

+=

τ

eta

tm KKBR

KK

+=

所以直流馬達數學模式可以以圖28表之﹝8﹞

圖 28 直流馬達數學模式方塊圖

17

第三章 系統功能分析與製作規劃

31 專題製作流程

如圖 31 所示本專題主要分為兩條路徑進行一為硬體另一則為軟體程

式撰寫本章著重硬體的規劃設計軟體則在第四章中介紹在完成 AB 信號

產生電路驅動功率放大電路與間距脈波產生電路設計與製作後須先接上馬達

做一連串的測試〈此時系統並無回受控制〉測試間距脈波是否太長或太短硬

體電路是否有缺失hellip等等另一方面也著手撰寫模糊控制程式並將其與硬體電

路結合最後做閉迴路系統的整合測試若發現系統的運作結果並不如預期

則需分別從硬體與軟體兩方面去改良

直流馬達轉速之模糊控制

文獻蒐集與整理

AB信號產生電路設計與製作

驅動功率放大電路設計與製作

間距脈波產生電路設計與製作

測試間距脈波是否太長或太短

系統測試測試馬達轉速是否

達到控制目的

結束與論文寫作

重新設計間距脈波長度

Yes

No

系統整合與修正

輸出信號與Fuzzy控制器之連結設計

規劃輸出與輸入歸屬函數

規劃模糊知識庫

撰寫主程式並加入模糊知識庫

程式編譯及連結

軟硬體整合測試馬達是否運作

程式調整及最佳化

No

YesYes

No

圖 31 專題製作流程圖

18

32 雙脈寬調變法之直流馬達驅動電路設計

本專題製作的雙脈寬調變法之直流馬達驅動電路設計大致可以分為二大部

分第一雙脈寬調變法之電路設計第二橋型驅動功率放大電路

雙脈寬調變〈Two Pulse Width Modulation簡稱TPWM〉之電路設計主要

是先製作一脈寬調變〈Pulse Width Modulation簡稱PWM〉波形然後再將此

波形各別經由一緩衝器〈buffer〉和反向器〈inverter〉則可產生AB驅動信號

脈波此即為TPWM

321 脈寬調變電路

如圖32先利用兩顆op產生三角波電路再利用一個比較器比較三角波

和誤差值之大小

150k

1M

20k

+12V

-12V

+12V

-12V10k

+12V

-12V

10k

+12V

-12V-

+-

+

-

+ PWMLM324

LM324

LM324

2200pF

圖 32 脈寬調變電路

〈1〉 三角波產生電路

三角波產生電路通常至少需要兩個運算放大器其電路如圖33OP1

為一個反相積分器OP2為一個史密特磁滯比較器將OP2的輸出方波經

19

OP1反相積分以後得到Vo1三角波此三角波又同時加到OP2控制其狀

態的改變

當方波產生器的輸出是正的則三角波產生器的輸出是斜向負相似

地當方波產生器的輸出是負則三角波產生器的輸出是斜向正這個動

作將產生三角波的輸出同時也輸出方波﹝9﹞

+VCC

-VCC

-

+

R1

R2

R3

+VCC

-VCC

-

+

OP1

OP2

Vo2Vo1

圖 33 三角波產生電路

對OP2而言是磁滯比較必須先找到OP2的 THV 和 TLV

232

21

32

3oo v

RRR

vRR

Rv

++

+=+ 〈31〉

當 0=+v 時

23

21 oo v

RR

v minus= 〈32〉

表要達到OP2的 0=+v 必須有這麼大的 1ov

當 12 sato Ev = 時

TLsato VERR

v =minus= 13

21 〈33〉

當 22 sato Ev minus= 時

THsato VERR

v =+= 23

21 〈34〉

20

對OP1而言是反相積分器 2ov 為其輸入 1ov 為其輸出則

tCIt

Rv

Ct

CRv

dtvCR

v oooo

11

2

11

22

111

11minus=minus=minus=minus= int 〈35〉

因為

1

2

Rvv

I o minusminus= 0=minusv 〈因為虛接地〉 〈36〉

所以

1

2

Rv

I o= 〈37〉

又因運算放大器的輸入阻抗非常大則流經 1C 的電流也為 I 相當於以定

電流對電容C 充電

當 12 sato Ev = 時 1ov 為下降斜波

tR

EC

v sato

1

1

11

1minus= 〈38〉

當 22 sato Ev minus= 時 1ov 上升斜波

( )

tRE

Cv sat

o1

2

11

1 minusminus= 〈39〉

由此可知三角波的上升與下降斜波乃因 1C 的充電與放電且時間

常數為 11CR

三角波週期分析如下

1 上升斜波的時間 1T

tCR

vv o

o1

1

21 minus= 11

2

1 CRvv

to

ominus=

1Tt = TLTHo VVv minus=1 22 sato Ev =

11111

21

sat

TLTH

sat

TLTH

EVV

CRCRE

VVT

minus=

minusminus= 〈310〉

2 下降斜波的時間 2T

tCR

vv o

o1

1

21 minus= 11

2

1 CRvv

to

ominus=

21

2Tt = THTLo VVv minus=1 12 sato Ev =

1

11111

1sat

TLTH

sat

THTL

EVV

CRCRE

VVT

minus=

minusminus= 〈311〉

3 週期 21 TTT +=

若 1satE = 2satE = satE 且3

22RR

VV TLTH =minus satE

3

2114

RR

CRT=

若R3 = nR2

則nCR

T 114=

114 CR

nf = 〈312〉

《實驗結果》

必須注意的是三角波的頻率太低將導致馬達的轉動產生脈動現象

故將工作頻率設計在1kHz以上

Ω= k1501R Ω= k102R

Ω= k203R pFC 22001 =

所得到的三角波頻率為

15kHz10220010001504

00010100020

f 12- =timestimestimestimes

timestimes

=

圖 34 三角波輸出波形

22

〈2〉 脈寬調變電路〈PWM〉

+12V

-12V

10k

+12V

-12V -

+ PWM輸出LM324三角波輸入

圖 35 脈寬調變電路

PWM系統往往連接至直流電源供應放大器的工作是以固定的頻率開

閉直流供應電壓其激發角是可以調整的因此得到波寬可調的輸出

將固定頻率的三角波與反向輸入的電壓做比較便可輸出一脈寬〈見圖

36〉反向電阻值的不同將導致反向輸入電壓不同故其輸出為一可調但

頻率固定的脈寬也正因為如此故稱為脈寬調變〈PWM〉由於輸出的

dutycycle不同故馬達將接收到不同的平均電壓因而可以藉由PWM控制

馬達的轉速

反相輸入電壓

PWM

圖 36 三角波與反相輸入電壓比較

23

PWM的優點在於馬達驅動電路的電晶體之控制信號改以脈波列來控

制使電晶體操作成類似開關的動作不是完全導通就是完全截止故電晶

體不是一直操作於作用區所以其功率消耗不大整體效率較高

《實驗結果》

圖 37 PWM 輸出波形

322 橋型驅動功率放大電路

如圖38所示主要由四個功率電晶體組成利用不同的電晶體對使直流

馬達做正逆轉控制當Q5Q8導通使馬達正轉當Q6Q7導通馬達則逆

轉電路中的電晶體扮演開關的作用

此種電路簡單只要一組直流電源供應且電晶體分擔了部份的電壓保護

電晶體迅速工作於截止與飽和狀態之間故沒有功率散逸損失之虞

但是在設計時切勿使Q5Q6同時導通以免燒毀電路上之元件因為在

AB兩脈波短暫的交變時間內由於電晶體本身之最小延遲時間有可能使Q5

Q6同時ON與Q7Q8在很短時間同時ON因此在15kHz交變下容易燒毀功

率電晶體

因此設計一間距脈波電路主要之功用使Q5Q6和Q7Q8均不同時導通

24

以拉長AB兩者交換時間

M

20k

10k

20k

10k

+24V

A 信號 B 信號

2N3055 2N3055

2N2955 2N2955

1N40021N4002

C1815 C1815

C1815 C1815

Q5

Q8Q6

Q7

圖 38 橋型驅動功率放大電路

圖 39 橋型驅動功率放大電路實體圖

25

此外若考慮電晶體BE間的電壓則電路會出現約 plusmn 06V的不感帶〈ded

band〉即電晶體的 oV 對 inV 間的關係如圖3101假使 inV 電壓為正弦波則 oV 變

成如圖3102為了改善這種缺失吾人利用兩個二極體接在電路上如圖38

用來補償電晶體BE間的壓降﹝10﹞

約06V

Dead band

Vo

Vin

圖 3101 呈現不感帶的轉移函數

圖 3102 輸出電壓波形

26

323 間距脈波產生電路

RCext15

Cext14 74123

A3

B2

Q13

CLR1

Q4

7486100k

2200pF

10k

10000pF

+5V

間距脈波輸出

圖 311 間距脈波產生電路

間距脈波的產生方式是根據脈寬調變〈PWM〉後的訊號再經由積分電路的

電阻兩端取出且經由兩倍頻器〈74LS86〉檢示出PWM的正負緣脈波最後

再利用單穩態IC〈74LS123〉將檢出信號之脈寬拉長至01ms此即為間距脈波

74LS123有兩個輸入端子A及B分別為下降波緣輸入端子及上升波緣輸入端

子當輸入A之脈波由ldquoH變成ldquoL之瞬間Q輸出變為ldquoH其持續時間長

短由RC時間常數決定反之當輸入B之脈波由ldquoL變成ldquoH之瞬間Q輸出

變成ldquoH維持一定時間

74LS123的輸出脈波之寬度是由電阻及電容之時間常數所決定概略計算公

式如下

CR045T timestimes=

電容 C 必須大於 1000pF

27

《實驗結果》

R=24kΩ C=10000pF

所以得到間距脈波為

( )msec0110810000p24k045T cong=timestimes= μ

圖 312 間距脈波

研究經分析後發現

1 間距 T 愈大愈能確保電路之安全性愈有保護作用

2 間距 T 愈大相對的使驅動信號脈波減少愈多造成馬達旋轉扭力大

大減弱

3 適當的間距 T不但不會影響馬達的輸出轉矩而且兼具保護電路的

效果

33 編碼器

轉動編碼器不只可以作為轉速的感測也能做位置的感測又適合於數位處

理故被廣泛使用若就信號來看轉動編碼器可分為增量型與絕對型若以檢

測的方式來分可分為光學式和磁式兩種在本專題中所使用的編碼器為光學式

增量型編碼器﹝11﹞

光學式轉動編碼器的原理如圖 313在附有細縫轉盤的兩側分別裝置發光元

28

件與受光元件如果只有一組光電檢測元件則輸出信號就只有一相的脈波信

號此種裝置稱為脈波產生器圖 314 為增量型轉碼器的輸出信號它是利用

兩組光電元件所產生的脈波信號A 相和 B 相間有相位差正轉時 A 相領前 B

相逆轉時 B 相領前 A 相因此利用此兩相做檢測馬達為正轉或逆轉的工作

並利用 A 相或 B 相的頻率檢測出目前的轉速

吾人計算出編碼器每一轉可以產生約 200 個脈波故檢測 A 相或 B 相其頻

率為 N則轉速應為 60200

timesN

〈rpm〉

圖 313 光學式轉動編碼器的原理圖

圖 314 編碼器的輸出信號波形

29

34 LM2917 FV 電路設計

對 LM2907 而言磁滯比較器和電流汞是構成頻率對電壓轉換的基本架構

並且預留一個運算放大器及一個電晶體供各種不同的使用圖 315 為吾人所設

計的 FV 電路圖中 C1 用以抑制電流汞動作時所產生的漣波變化正常使用時

此電容應大於 10C若 C1 太大也將造成轉換速度下降

因為單晶片 8051 之輸入電壓最高為 5V故必須設計其馬達最高轉速頻率所

轉成的電壓必須在 5V 以內由於馬達轉速頻率範圍極大故吾人給予 LM2917

+12V 的電壓以擴大它可以轉換的電壓範圍並將所需維持在 5V 內

a1

14

b1

1

a1

13

b1

2

a1

12

b1

3

a1

11

b1

4

1

a1

10

b1

5

a1

8

b1

7

a1

9

b1

6

L2917

Encoder輸 入

1uF

+12V

FV輸出1000pF

45k 10kC1

C2

圖 315 FV 電路

30

《實驗結果》

根據統計結果每 50mV 相對於 100Hz如此一來吾人想得知馬達目前

的轉速只要將單晶片所接收到的電壓值經過換算即可得知目前 encoder 所量測

的頻率吾人知道 encoder 一圈可產生 200 個脈波故馬達的轉速便可經過下列

公式換算得知

轉速〈rpm〉 60200

times=f

其中 =f encoder 所量測到的頻率

表 31 頻率與轉換電壓之關係

頻率

(Hz) 1 2 3 4 5 6 7 8 9

電壓(V) 0006 0006 0007 0008 0009 0009 0009 0009 001

頻率

(Hz) 10 20 30 40 50 60 70 80 90

電壓(V) 008 009 010 010 011 011 012 012 013

頻率

(Hz) 100 200 300 400 500 600 700 800 900

電壓(V) 013 018 023 028 033 038 043 049 054

頻率

(Hz) 1000 2000 3000 4000 5000 6000 7000 8000 9000

電壓(V) 059 109 16 209 257 304 3508 4006 45

31

圖 316 頻率對電壓曲線

35 單晶片介面電路

單晶片介面包括了二大部分分別為單晶片 8051AD converter

〈1〉8051 單晶片

為本控制系統的核心一切動作皆經由它控制

〈2〉AD converter

將類比開關所送出來的類比訊號經由 ADC 0804 轉換成數位訊號傳送

到單晶片的輸入埠

351 AD 轉換

以單晶片 8051 控制 ADC0804則單晶片 8051 必須下達ldquo開始轉換rdquo的命令

給 ADC0804然後 ADC0804 就開始讀入類比輸入端的電壓在內部開始轉換

經過一段轉換時間後〈約 100μ s〉ADC0804 就將轉換完成的值放在其內部的三

態輸出栓鎖緩衝器裡然後將轉換完成輸出腳〈INTR〉降為 low以通知單晶片

可以去讀轉換完成資料

當WR和CS 同時為ldquo0rdquo時表示對 ADC0804 下達ldquo開始轉換rdquo命令再經過

32

一段轉換時間〈100μ s〉後轉換完成ADC0804 會將其轉換完成的數位資料放

在其內部 8 位元緩衝區裡且將 INTR 降為ldquo0rdquo因此單晶片只要下達ldquo開始轉換rdquo

命令後去檢查 INTR 的狀態就可以知道是否轉換完畢其方法有兩種

1 輪詢法〈polling〉

2 中斷法〈interrupt〉

所謂輪詢法就是將 ADC0804 的 INTR接到 CPU 的一條 IO 線上然後以軟體指

令主動偵測其狀態當偵測到為ldquo0rdquo時就可以去讀出 ADC0804 裡的緩衝區的轉

換值

中斷法是一個很理想的 IO 方式因為不像輪詢法必須讓 CPU 等 ADC0804

轉換當 CPU 下達ldquo開始轉換rdquo命令後就可以做其他工作當 ADC0804 轉換完

畢後 INTR會降為ldquo0rdquo可以利用此信號去中斷 CPU再由中斷副程式去讀入

轉換值即可因此大大提高了程式的效率

當 CPU 接收到 ADC0804 發出ldquo轉換完畢rdquo的信號〈 INTR =0〉後就可以去

讀出轉換值其讀出的方法是將CS 與RD設為ldquo0rdquo即可讀到轉換值這個讀值的

動作又會使得 INTR恢復成ldquo1rdquo

1 CPU 下達ldquo開始轉換rdquo命令〈CS =0WR =0〉

2 ADC0804ldquo轉換完畢rdquo 〈 INTR =0〉

3 CPU 讀取轉換值〈 RD =0CS =0〉

4 讀完後 INTR =1

ADC0804 主要規格摘要如下

1 +5V 單電源工作電壓

2 類比電壓輸入範圍 0~+5V

33

3 參考電壓為 25V

4 轉換時間為 100μ s〈 CLKf =640kHz〉

5 解析度為 8 位元

6 誤差plusmn 1LSB

7 讀取時間 135ns

36 電源供應系統

本專題中所有電路及硬體設備所需的電源採用交流電源 110V 經由 PT-31

變壓器後再經過橋式整流後提供了直流電源而因為各個電路所需電源不同

因此製作了多組的變壓電路如下

1電壓源 DC5V選擇了 7805 的穩壓 IC 搭配電容得到了+5V 的電壓源

供〈1〉8051 微處理器 〈2〉ADC 0804 〈3〉74LS8674LS12374LS04

74LS02CD4013 〈4〉馬達 Encoder

2電壓源 DC12V使用 7812 穩壓 IC 搭配電容得到+12V 的電壓源供

LM2917 使用

3電壓源 DC24V利用 7824 的穩壓 IC 搭配電容獲得+24V 的直流電壓

源供電路之橋型驅動功率放大之電晶體使用

Vin1

+12V2

GND3

LM7812

2200uF 10000pF 2200uF 10000pF

+12V outputAC

圖 317 直流電源電路

34

圖 318 直流電源電路實體圖

37 馬達轉速的量測

表 33 PWM 輸出對應 encoder 週期

PWM dutycycle encoder 週期 PWM dutycycle encoder 週期

40 sμ 172 sμ 440 sμ 0 sμ

80 sμ 188 sμ 480 sμ 0 sμ

120 sμ 204 sμ 520 sμ 0 sμ

160 sμ 230 sμ 560 sμ 0 sμ

200 sμ 272 sμ 600 sμ 0 sμ

240 sμ 328 sμ 640 sμ 0 sμ

280 sμ 416 sμ 680 sμ 1320 sμ

320 sμ 540 sμ 720 sμ 750 sμ

360 sμ 800 sμ 760 sμ 510 sμ

400 sμ 1320 sμ 800 sμ 400 sμ

35

圖 319 PWM 輸出對應 encoder 週期

由統計可知道此馬達並不是一顆線性馬達故相信若使用模糊控制理論來

作為其回授控制系統的控制器一定能達到比傳統控制器的性能還要好而且若能

在模糊控制裡加上 PID 控制器的觀念一定能在系統的響應時間上升時間

安定時間和超越量達到最佳的控制另一方面馬達在其反方向的內阻較大需

要更大的力量才能使馬達驅動

36

第四章 軟體規劃與製作

41 PWM 之軟體設計

因為之前所介紹的硬體方式是以調整可變電阻來達到轉速的調整因此無法

得知所給予的脈寬長度和轉速大小尤其在回授時也不易給予適當的訊號來調整

轉速因此改良之方法就是以8051之軟體撰寫方式來產生固定的脈寬也就等

於給予轉速的命令而在其回授控制時也只要在內部程式给予適當的指令便可

達到脈寬長度的調整以達到閉迴路之受控系統

411 PWM 軟體流程

設定Timer0模式為0

TH0 = temp 32 TL0 = temp 32

temp = 8192 ndash j4 Key = 0

檢查是否有鍵值

將鍵值存入Key

Yes

No

設定Key值所對應的 j值

If P30 == 1Then P30 = 0 temp = 8192 ndash j4Else P30 = 1 temp=8192ndash880+j4

TH0 = temp 32 TL0 = temp 32

Start Timer0中斷副程式

啟動Timer0

等待Timer0中斷

返回主程式

圖 41 PWM 軟體設計流程圖

37

在此總共設計了五個按鈕分別代表不同的轉速停止正轉〈慢〉正轉

〈快〉逆轉〈慢〉和逆轉〈快〉使用Timer0是因為8051之計時中斷比延遲程

式來的準確故可以達到準確的計時程式設計理念中並沒有將中斷致能清除

因此Timer0會一直處於計時的狀態程式執行時將一邊檢查鍵值〈KeyStatus〉一

邊進行計時當計時完畢便呼叫中斷副程式然後執行改變Port 30的輸出狀

態若是為high則變為low反之若是為low即變為high同時並重設計時時間

Timer0繼續計時

當鍵值改變時計時的時間也會跟著改變如此一來Timer0將ㄧ直重覆上

述動作直到電源切掉Timer0才會停止計時

42 模糊控制之程式規劃與撰寫

本專題目標在完成了先前所規劃的硬體電路之後接著就是要達成利用模糊

控制理論來設計控制器在此採用了單晶片8051目的是為了以硬體實現方式來

代替電腦模擬期望能夠按照原訂計畫完成本專題「具模糊控制理論與雙脈寬調

變法之直流馬達驅動電路設計」

單晶片 8051 模糊控制的程式撰寫採下列幾個步驟依序完成

1 設定變數轉速誤差〈dspeed〉目前轉速〈sspeed〉

2 模糊化採用三角形歸屬函數採用三角形歸屬函數的原因

〈1〉 三角形函數為一連續函數

〈2〉 三角形函數為線性的函數所以計算速度較快

〈3〉 是具有發散也有收斂的函數和指數函數一樣接近

事實

3 模糊推論模糊規則將其所有可能發生情況以 IFhellipTHENhellip表示

並建立控制規則表

4 解模糊化採用重心法

38

421 歸屬函數

設定變數為目前轉速〈sspeed〉與轉速誤差〈dspeed〉因此此模糊控制器共

有兩個輸入訊號與一輸出訊號輸出訊號為脈寬長度該加或是減多少又因為有

五種不同的轉速因此各分別設計了不同的歸屬函數如下

1 當轉速 = 0

ml h

s s p e e d

d s p e e d

r p m0 5 0 1 0 0- 5 0- 1 0 0

mv l l h v h

r p m0- 3 0- 6 0- 1 0 0 3 0 6 0 1 0 0 圖 42 停止時之歸屬函數

2 正轉〈慢〉

ml hsspeed

dspeed

rpm150 225 300750

mvl l h vh

rpm150100500 200 250 300

圖 43 正轉〈慢〉之歸屬函數

39

3 正轉〈快〉

ml hsspeed

dspeed

rpm520 670 820370220

mvl l h vh

rpm500400300200 600 700 800

圖 44 正轉〈快〉之歸屬函數

4 逆轉〈慢〉

ml hsspeed

dspeed

rpm100 250 400500

mvl l h vh

rpm10050250 200 300 400 圖 45 逆轉〈慢〉之歸屬函數

40

5 逆轉〈快〉

ml hsspeed

dspeed

rpm300 450 600150

mvl l h vh

rpm450350250150 550 650 750

750

圖 46 逆轉〈快〉之歸屬函數

6 輸出

OutputMVL L H VH

rpm0-50-150-250 50 150 250

圖 47 輸出之歸屬函數

41

422 模糊規則庫

表 41 為吾人所設計的模糊控制規則庫並利用 Matlab 之 Fuzzy ToolBox 來

建立此規則庫以進行模擬推論圖 48 為當馬達輸入指令為正轉慢時推論後所得

到的三維空間圖

表 41 模糊控制規則表

Dspeed

vl l m h vh

l H M L VL VL

m VH H M L VL sspeed

h VH VH H M L

圖 48 推論後的三維空間圖

42

423 模糊控制器之軟體設計流程

Start 外部中斷副程式

ADCWR = 0 ADCWR = 1

〈令AD開始轉換〉

檢查鍵值以得到對應的歸屬函數

取得目前轉速與

轉速誤差

Fuzzy Rules決策

得到輸出訊號

Delay 10ms

ADC = 0 讀取AD值 ADCRD = 0

將AD值換算成轉速

ADCWR = 0 ADCWR = 1

〈AD開始轉換〉

返回主程式

致能外部中斷

圖 49 Fuzzy Controller 程式流程圖

當控制器一開始動作時便先執行AD轉換的工作當AD轉換完成時其

INTR的接腳便會觸發8051的外部中斷INTR0於是程式便發生外部中斷執行

外部中斷副程式的指令

43

在外部中斷副程式中AD將ㄧ直進行轉換與讀取的工作同時並將轉換後

的值直接換算成目前轉速與轉速誤差以供模糊控制器使用換算目前encoder

的頻率其公式為

160-V2000 times=頻率 〈4-1〉

式4-1之公式是根據表31所導出來的其中V為encoder之頻率轉成電壓之值

又假設所讀取的AD轉換值為value因為

AD的解析度 = bit256

5V+ = 511 ( Vbit ) 〈4-2〉

故value值與電壓V之關係為

511 value V times= 〈4-3〉

所以encoder之頻率與value值的關係為

頻率= 2000times ⎟⎠⎞

⎜⎝⎛ times

511 value - 160 〈4-4〉

故目前轉速為

sspeed = ( )rpm 60 200

times頻率 〈4-5〉

另ㄧ方面在主程式中程式會先去檢查鍵值也就等於檢查輸入指令以

找出符合使用的歸屬函數並將AD所獲得的轉速對應到歸屬函數中然後執行

決策判斷即進入規則庫中尋找出適當的決策判斷最後將此決策送入PWM程

式裡進行脈寬長度的調整使馬達在合理的要求下達到理想的轉速控制不會

因為外在環境的影響而使馬達轉速受到干擾

43 LCD 顯示轉速

此專題最後再增加一LCD顯示幕以顯示目前的轉速否則在程式設計完成

後人卻因無法以肉眼得知目前轉速而不能肯定馬達轉速是否有達到控制的目

標因此增加一顯示幕LCD是有必要的不僅隨時得知目前的轉速還能知道

44

設計出來的軟體其控制性是否夠好夠穩定

431 LCD 顯示幕之軟體流程

Start

設定LCD模組的初始狀態

設定外部中斷INTR0

與Timer0

設定TH0 = (65536 ndash 5000) 256 TL0 = (65536 ndash 5000)256

令ADCWR = 0 ADCWR = 1 AD開始轉換

等待中斷

外部中斷副程式

ADCRD = 0 讀取AD值 ADCRD = 1

將AD值換算成速度

ADCWR = 0 ADCWR = 1 AD開始轉換

Timer0中斷副程式

顯示LCD第一行

ldquoMotor Speed =

顯示LCD第二行ldquoxxxxxxx rpm其中 xxxxxx為外部中斷副程式所換算出的轉速

重設TH0與TL0

返回主程式返回主程式

圖 410 LCD 顯示幕之程式流程圖

此程式主要由兩個部分完成一為外部中斷副程式另ㄧ為 Timer0 中斷副

程式當主程式完成外部與 Timer0 兩個中斷的設定後隨即命令 AD 開始轉換

之後便一直停在 while〈1〉的迴圈裡不做任何動作而由兩個中斷副程式來完

成整個轉換與顯示的工作

45

外部中斷副程式主要負責 AD 的轉換讀取與轉速換算的工作AD 第一

次的轉換由主程式來下達命令當轉換完成後AD 的 INTR 接腳將觸發外部中

斷〈INTR0〉副程式此時程式便進入外部中斷副程式執行讀取 AD 值與轉速

換算的工作當這些工作完成時外部中斷副程式再次下達 AD 開始轉換的命

令而離開中斷副程式當 AD 再次轉換完成時又將再次執行中斷副程式

如此週而復始中斷副程式將ㄧ直進行讀取換算與轉換的工作

而 Timer0 中斷副程式主要負責 LCD 顯示之工作當主程式所設定的計時時

間計數完時程式便進入 Timer0 中斷副程式一旦進入 Timer0 中斷副程式程

式將執行 LCD 的顯示然後再重設 Timer0 的計數時間Timer0 將重新計數當

計數完時程式又將再度進入 Timer0 中斷副程式執行因為程式中並無清除

Timer0 的中斷致能故 Timer0 中斷副程式和外部中斷副程式ㄧ樣週而復始的

執行其副程式的工作

46

第五章 結論

本計劃主旨為具模糊控制理論與雙脈寬調變法之直流馬達驅動電路設計主

要是針對傳統電路設計之缺點提出改良之方法以TPWM取代PWM電路以模

糊理論基礎設計之控制器替代傳統PID控制器

TPWM轉速控制優於PWM之處在於

1 TPWM只需使用單電源即可達到正轉和逆轉的轉速控制而PWM必須

加上逆向開關或是雙電源才能使馬達產生正轉和逆轉

2 TPWM可控制馬達處於停止狀態無論在正向或逆向加上負載皆無法使

馬達產生轉動

3 馬達消耗定額功率輸出轉矩為額定值

4 馬達由停止到某定轉速時反應時間較快

模糊控制器優於PID控制器

1 不須導出繁雜的數學模型

2 適用於非線性系統

3 強健性與容錯性較高

本專題至此雖說大致的目標都已達到但是此系統仍然有許多不完美而需要

改進的地方例如在實驗過程中發現整個轉速的控制在回授上其反應時間

有點慢探討其原因有可能是控制器之程式上的問題

1 因為使用C語言撰寫程式故其執行速度較慢

2 程式可能寫的太累贅

3 模糊控制規則庫建立不良

若想改善這些問題可以嘗試著將C語言改為組合語言來撰寫並盡量減少

47

不必要的指令相信此動作一定能大大提昇程式的執行速度其次就是多做測

試利用測試中所學到的經驗來幫助模糊控制規則庫的改寫同時也能從測試中

發現更多的問題若是都能對問題加以一一解決的話相信必定能將此控制系統

做的更盡善盡美

48

參考文獻

﹝1﹞ 李適中直流馬達速度控制伺服控制〈基礎篇〉全華科技圖書股份有

限公司民 74

﹝2﹞ 廖錦文ldquo直流電動機之雙脈寬調變是〈TPWM〉驅動電路研究電

子技術月刊第 69 期pp94-1021992

﹝3﹞ 楊英魁孫宗瀛鄭魁香林建德蔣旭堂模糊控制理論與技術全華

科技圖書股份有限公司民 85

﹝4﹞ 林敦煌陳憬德直流馬達定位及轉速的模糊控制逢甲大學自動控制工

程學系學士論文民 87

﹝5﹞ LAZadehldquo Fuzzy Sets Information and Control Vol8 pp338-353

1965

﹝6﹞ EHMamdani and SAsslianldquo A fuzzy logic controller for a dynamic

plant Internation Journal of Man-Machine Studies Vol7 pp1-13 1975

﹝7﹞ 孫宗瀛楊英魁Fuzzy 控制理論實作與應用全華科技圖書股份有

限公司民 83 年

﹝8﹞ 許中平黃煌嘉直流電動機控制電路設計全華科技圖書股份有限公司

民 75

﹝9﹞ 盧明智黃敏祥OP Amp 應用+實驗模擬全華科技圖書股份有限公司

民 83

﹝10﹞陳文耀電動機控制工程復文書局2003

﹝11﹞許中平林全福電動機運轉控制技術全華科技圖書股份有限公司民

77

﹝12﹞楊明豐8051 單晶片 C 語言設計實務碁峯資訊2003 年

﹝13﹞蔡朝洋單晶片微電腦 80518951 原理與應用全華科技圖書股份有限公

司民 91

49

﹝14﹞王文俊認識 Fuzzy全華科技圖書股份有限公司民 90

50

附錄 A 專題硬體展示圖

圖 A-1 硬體整體圖

圖 A-2 硬體整體鳥瞰圖

51

圖 A-3 硬體側視圖

圖 A-4 操作與顯示面板

圖 A-5 間距脈波電路與 FV 電路

52

圖 A-6 橋型驅動功率放大電路

圖 A-7 操作與控制面板

53

附錄 B PWM 與模糊控制之程式

include reg51h include stdioh sbit ADCRD = P3^1 設定 RD 控制線接腳為 P31 sbit ADCWR = P3^3 設定 WR 控制線接腳為 P33 sbit P2_0 = 0xA0 接腳定義 sbit P2_1 = 0xA1 接腳定義 sbit P3_0 = 0xB0 接腳定義 sbit P3_1 = 0xB1 接腳定義 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P3_6 = 0xB6 接腳定義 void KeyStatus(void) 函數原型宣告 void feedback(void) 函數原型宣告 void compute_grade(void) 函數原型宣告 void delay1ms(int count) 函數原型宣告 void convert() 函數原型宣告 void condition() 函數原型宣告 void CW(void) 函數原型宣告 int j i 對應 PWM 的寬度 unsigned int temp 所設計的計時器時間 int sample = 1000 取樣率設定消除顯示值跳動 long int value r1 讀取 ADC0804 數位資料 long int set n condition select long int r grade_reg[2] grade[15] error1 error2 long int a1 b1 I long int membership[5][3]membership1[3][3] 定義歸屬函數 long int membership2[3][3] = -10-50-5050510 long int error[2] int Rule[15][3] = 113213313 定義判斷規則庫 212223323 311232333 411241342 511251351

54

main() 主程式 j = PWM = 110 設定 PWM 初始值 IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x00 設定計時器 0 工作於模式 0 temp=8192-j4 設定計時器 0 初值 TH0 = temp 32 TL0 = temp 32 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 P3_4 = 1 P3_5 = 0 P3_6 = 0 ADCWR = 0 令 ADC0804 的 WR = 0 ADCWR = 1 令 ADC0804 的 WR = 1 while (1) KeyStatus() 檢查鍵值 void KeyStatus(void) 檢查鍵值並給對應的 PWM 值 char KeyScan(void) 按鍵掃描函數宣告 unsigned char KeyStatus unsigned char Key = 0 KeyStatus=KeyScan() 呼叫按鍵掃描函數 if (KeyStatus = 0) 已有按鍵輸入 Key = KeyStatus Key = 鍵值 if (Key == 0x01) 假如輸入為按鍵 1 i = 110 PWM 為 110us j = i P3_4 = 1 LED 亮第一顆〈表馬達停止〉 P3_5 = 0 P3_6 = 0

55

else if (Key == 0x02 ) 假如輸入為按鍵 2 i = 140 PWM 為 140us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x04 ) 假如輸入為按鍵 3 i = 180 PWM 為 180us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x08 ) 假如輸入為按鍵 4 i = 80 PWM 為 80us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 else if (Key == 0x10 ) 假如輸入為按鍵 5 i = 40 PWM 為 40us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 PWM = j delay1ms(10) 呼叫延遲函數 feedback() 模糊控制判斷

56

void To_int(void) interrupt 1 Timer0 中斷函數 if (P3_0 == 0) 假如 PWM 輸出為 Low P3_0 = 1 變更 PWM 輸出為 High temp=8192-j4 設定 High 的時間 else 若 PWM 輸出為 High P3_0 = 0 變更 PWM 輸出為 Low temp=8192-880+j4 設定 Low 的時間 TH0 = temp 32 Timer0 的計時時間 TL0 = temp 32 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 char KeyScan(void) 檢查鍵值 char KeyStatus 按鍵狀態 P0=0xff 設定 P0 為輸入模式 KeyStatus=~P0 讀取按鍵狀態 return(KeyStatus) 將鍵值送回程式 void feedback(void) 模糊判斷 void Fuzzycontroller() 函數原型宣告 void condition1() 函數原型宣告

57

void condition2() 函數原型宣告 error1 = ((value)40-160)03 輸入變數 1 delay10ms(10) 延遲 10ms error2 = ((value)40-160)03 輸入變數 2 if (key == 0x01 ) 當按鍵 1找出對應的歸屬函數 並做出模糊控制判斷

int membership[5][3]= -100-60-30-60-300-30030030603060100

int membership1[3][3]=-100-500-50050050100 Fuzzycontroller() condition() if (key == 0x02 ) 當按鍵 2找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

05010050100150100150200150200250200250300 int membership1[3][3]=07515075150225150225300 Fuzzycontroller() condition() else if (key == 0x04) 當按鍵 3找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

200320400300400500400500600500600700600700800 int membership1[3][3]=220370520370520670520670820 Fuzzycontroller() condition() else if (key == 0x08) 當按鍵 4找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

02550255010050100200100200300200300400 int membership1[3][3]=05010050100250100250400 Fuzzycontroller() condition()

58

else if (key == 0x10) 當按鍵 5找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

150250350250350450350450550450550650550650750 int membership1[3][3]=150300450300450600450600750 Fuzzycontroller() condition2() void Fuzzycontroller() 模糊控制判斷 void compute_grade() 函數原型宣告 void compute_grade1() 函數原型宣告 a1 = 0 b1 = 001 I = 0 for (n=0 nlt=14 n++) r = error1 set = Rule[n][0]-1 compute_grade() 計算輸入變數 1 與

模糊程度的歸屬函數 condition = 1 r = error2 set = Rule[n][1]-1 compute_grade1() 計算輸入變數 2 與 模糊程度的歸屬函數 grade[n] = MIN(grade_reg[0] grade_reg[1]) a1 = a1 + (grade[n]membership2[Rule[n][2]-1][1]) b1 = b1 + grade[n] I = a1 b1 得到模糊控制判斷的結果 void compute_grade() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership[set][0]) || (r gt membership[set][2])) 當輸入變數不在 歸屬函數內

59

grade_reg[condition] = 0 else if ((r gt membership[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership[set][2]-r) (membership[set][2] - membership[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership[set][0]) (membership[set][1] - membership[set][0]) void compute_grade1() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership1[set][0]) || (r gt membership1[set][2])) 當輸入變數不在 歸屬函數內 grade_reg[condition] = 0 else if ((r gt membership1[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership1[set][2]-r) (membership1[set][2]-membership1[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership1[set][0]) (membership1[set][1]-membership1[set][0])

60

void condition() P2_0 = 1 設定 P20 為輸入模式 P2_1 = 1 設定 P21 為輸入模式 if ( (P2_0 == 1) ampamp (P2_1 == 0)) 當馬達為正轉時 if ( I gt 0 ) 若模糊判斷結果為正 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 若模糊判斷結果為零 PWM = PWM + 0 PWM 寬度不變 if ( I lt 0 ) 若模糊控制結果小於零 PWM = PWM + 1 PWM 寬度加 1 else if ( (P2_0 == 0) ampamp (P2_1 == 1) ) 若馬達為反轉 if ( I lt 0 ) 模糊控制小於零 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 模糊控制等於零 PWM = PWM + 0 PWM 寬度不變 if ( I gt 0 ) 模糊控制大於零 PWM = PWM + 1 PWM 寬度加 1 CW() 判斷 PWM 寬度上下限

61

void CW() 判斷 PWM 寬度上下限 if ( PWM gt= 215 ) 若 PWM 寬度 gt= 最大寬度 j = 215 PWM 寬度維持於 215us if ( PWM lt= 5 ) 若 PWM 寬度 lt= 最小寬度 j = 5 PWM 寬度維持在 5us if ( PWM gt 5 ampamp PWM lt 215 ) PWM 寬度介於最大與最小間 j = PWM PWM 依模糊控制判斷結果增減 void delay1ms(int count) 延遲 1ms int x y for ( x = 0 x lt count x++ ) for ( y = 0 y lt 122 y++ ) void convert() 數位資料換算成馬達轉速 r1 = ((value)40)-160

62

附錄 C LCD 顯示之程式

includereg51h 含 8051 所有暫存器宣告 include mathh define RS P3_5 LCD 指令資料選擇控制 define RW P3_4 LCD 讀寫控制腳 define Enable P3_3 LCD 致能接腳 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P0_0 = 0x80 接腳定義 sbit P0_1 = 0x81 接腳定義 sbit P0_2 = 0x82 接腳定義 sbit P0_3 = 0x83 接腳定義 sbit P0_4 = 0x84 接腳定義 sbit P0_5 = 0x85 接腳定義 sbit P0_6 = 0x86 接腳定義 sbit ADCRD = P3^7 設定 RD 控制線接腳為 P37 sbit ADCWR = P3^6 設定 WR 控制線接腳為 P36 void delay(void) 函數原型宣告 void delay10ms(int count) 函數原型宣告 void display(void) 函數原型宣告 void InitialLCD(void) 函數原型宣告 void WriteIns(char) 函數原型宣告 void WriteData(char) 函數原型宣告 void WriteString(charchar) 函數原型宣告 void CheckBusy(void) 函數原型宣告 void convert(void) 函數原型宣告 char MSG0[] = Motor Speed = 定義字串 MSG0 char MSG2[] = rpm 定義字串 MSG2 unsigned char MSG1[8]=0000000 定義字串 MSG1 unsigned long int value 讀取 ADC0804 數位資料 int sample = 1000 取樣率設定消除顯示值跳動 long int rpm

63

main() 主程式 InitialLCD() 初始化 LCD IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x01 設定計時器 0 工作於模式 1 TH0 = (65536-5000)256 設定計時器 0 初值 TL0 = (65536-5000)256 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 while(1) 等待中斷 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 while (--sample == 0) 取樣率減 1 sample = 1000 重設取樣率 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 void T0_int(void) interrupt 1 LCD 顯示動態掃描 display() 動態掃描顯示 TH0 = (65536-65535)256 重設計時初值 TL0 = (65536-65535)256

64

void InitialLCD(void) 設定 LCD 模組初始狀態 delay() 延遲函數 WriteIns(0x38) 設定 LCD 模組為 WriteIns(0x38) 2 行顯示 WriteIns(0x38) 8 位元介面 WriteIns(0x38) 5x7 點字型 WriteIns(0x08) 關閉顯示器 WriteIns(0x01) 清除 LCD 螢幕 WriteIns(0x0c) 令顯示器 ON但游標不顯示 WriteIns(0x06) 令 LCD 模組每接收到 1Byte 資料 AC 值自動加 1 void display() 掃描顯示 WriteIns(0x80) 設定 LCD 座標 WriteString(13MSG0) 將字串 MSG0 寫入 LCD 中 WriteIns(0xc0) 設定 LCD 座標 WriteString(8MSG1) 將字串 MSG1 寫入 LCD 中 WriteIns(0xc8) 設定 LCD 座標 WriteString(4MSG2) 將字串 MSG2 寫入 LCD 中 void convert(void) 換算轉速 long int freq freq = ((value)4000) - 16000 數位資料換成頻率公式 rpm = freq3 頻率換算轉速公式 MSG1[0] = (rpm1000000)+0x30 將結果存入字串 MSG1 中 MSG1[1] = ((rpm1000000)100000)+0x30 MSG1[2] = ((rpm100000)10000)+0x30 MSG1[3] = ((rpm10000)1000)+0x30 MSG1[4] = 0x2e MSG1[5] = ((rpm1000)100)+0x30 MSG1[6] = ((rpm100)10)+0x30 MSG1[7] = rpm10+0x30

65

void WriteIns(char instruction) 寫命令至 LCD 中 RS = 0 選擇指令暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = instruction 輸出命令至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteData(char i) 寫資料至 LCD 中 RS = 1 選擇資料暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = i 輸出資料至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteString(countMSG) 寫字串至 LCD 中 char count 字串長度 char MSG[] 字串資料 char i 定義位元組變數 for(i=0 iltcount i++) count 個位元組 WriteData(MSG[i]) 寫入一位元組的資料至 LCD 中 void CheckBusy(void) char i=0x80 檢查忙碌旗標 while(iamp0x80) 忙錄旗標 BF = 1 RS = 0 選擇指令暫存器 RW = 1 讀取 Enable = 1 致能 LCD i = P2 讀取 LCD 指令暫存器內的資料

66

Enable = 0 除能 LCD delay() 延遲函數 void delay() 延遲 5ms int i for(i=0 ilt250 i++)

  • 畢業專題封面pdf
  • File0004pdf
  • 最終版pdfpdf
Page 25: Based on Fuzzy Control Theorem and TPWM Method for DC ... · 使吾人想設計一模糊控制器來做為馬達轉速的閉迴路控制,以解決非線性系統的 問題。除此之外,flcs

16

在一般情況電樞電感很小所以 eτ 可以忽略不計因此上式成為一階落後

方程式

( ) ( )( ) ( ) m

m

etma

t

i sTK

KKsBRK

sVssG

+=

++=

Ω=

11 τ 〈217〉

其中

eta

mam KKBR

BRT

+=

τ

eta

tm KKBR

KK

+=

所以直流馬達數學模式可以以圖28表之﹝8﹞

圖 28 直流馬達數學模式方塊圖

17

第三章 系統功能分析與製作規劃

31 專題製作流程

如圖 31 所示本專題主要分為兩條路徑進行一為硬體另一則為軟體程

式撰寫本章著重硬體的規劃設計軟體則在第四章中介紹在完成 AB 信號

產生電路驅動功率放大電路與間距脈波產生電路設計與製作後須先接上馬達

做一連串的測試〈此時系統並無回受控制〉測試間距脈波是否太長或太短硬

體電路是否有缺失hellip等等另一方面也著手撰寫模糊控制程式並將其與硬體電

路結合最後做閉迴路系統的整合測試若發現系統的運作結果並不如預期

則需分別從硬體與軟體兩方面去改良

直流馬達轉速之模糊控制

文獻蒐集與整理

AB信號產生電路設計與製作

驅動功率放大電路設計與製作

間距脈波產生電路設計與製作

測試間距脈波是否太長或太短

系統測試測試馬達轉速是否

達到控制目的

結束與論文寫作

重新設計間距脈波長度

Yes

No

系統整合與修正

輸出信號與Fuzzy控制器之連結設計

規劃輸出與輸入歸屬函數

規劃模糊知識庫

撰寫主程式並加入模糊知識庫

程式編譯及連結

軟硬體整合測試馬達是否運作

程式調整及最佳化

No

YesYes

No

圖 31 專題製作流程圖

18

32 雙脈寬調變法之直流馬達驅動電路設計

本專題製作的雙脈寬調變法之直流馬達驅動電路設計大致可以分為二大部

分第一雙脈寬調變法之電路設計第二橋型驅動功率放大電路

雙脈寬調變〈Two Pulse Width Modulation簡稱TPWM〉之電路設計主要

是先製作一脈寬調變〈Pulse Width Modulation簡稱PWM〉波形然後再將此

波形各別經由一緩衝器〈buffer〉和反向器〈inverter〉則可產生AB驅動信號

脈波此即為TPWM

321 脈寬調變電路

如圖32先利用兩顆op產生三角波電路再利用一個比較器比較三角波

和誤差值之大小

150k

1M

20k

+12V

-12V

+12V

-12V10k

+12V

-12V

10k

+12V

-12V-

+-

+

-

+ PWMLM324

LM324

LM324

2200pF

圖 32 脈寬調變電路

〈1〉 三角波產生電路

三角波產生電路通常至少需要兩個運算放大器其電路如圖33OP1

為一個反相積分器OP2為一個史密特磁滯比較器將OP2的輸出方波經

19

OP1反相積分以後得到Vo1三角波此三角波又同時加到OP2控制其狀

態的改變

當方波產生器的輸出是正的則三角波產生器的輸出是斜向負相似

地當方波產生器的輸出是負則三角波產生器的輸出是斜向正這個動

作將產生三角波的輸出同時也輸出方波﹝9﹞

+VCC

-VCC

-

+

R1

R2

R3

+VCC

-VCC

-

+

OP1

OP2

Vo2Vo1

圖 33 三角波產生電路

對OP2而言是磁滯比較必須先找到OP2的 THV 和 TLV

232

21

32

3oo v

RRR

vRR

Rv

++

+=+ 〈31〉

當 0=+v 時

23

21 oo v

RR

v minus= 〈32〉

表要達到OP2的 0=+v 必須有這麼大的 1ov

當 12 sato Ev = 時

TLsato VERR

v =minus= 13

21 〈33〉

當 22 sato Ev minus= 時

THsato VERR

v =+= 23

21 〈34〉

20

對OP1而言是反相積分器 2ov 為其輸入 1ov 為其輸出則

tCIt

Rv

Ct

CRv

dtvCR

v oooo

11

2

11

22

111

11minus=minus=minus=minus= int 〈35〉

因為

1

2

Rvv

I o minusminus= 0=minusv 〈因為虛接地〉 〈36〉

所以

1

2

Rv

I o= 〈37〉

又因運算放大器的輸入阻抗非常大則流經 1C 的電流也為 I 相當於以定

電流對電容C 充電

當 12 sato Ev = 時 1ov 為下降斜波

tR

EC

v sato

1

1

11

1minus= 〈38〉

當 22 sato Ev minus= 時 1ov 上升斜波

( )

tRE

Cv sat

o1

2

11

1 minusminus= 〈39〉

由此可知三角波的上升與下降斜波乃因 1C 的充電與放電且時間

常數為 11CR

三角波週期分析如下

1 上升斜波的時間 1T

tCR

vv o

o1

1

21 minus= 11

2

1 CRvv

to

ominus=

1Tt = TLTHo VVv minus=1 22 sato Ev =

11111

21

sat

TLTH

sat

TLTH

EVV

CRCRE

VVT

minus=

minusminus= 〈310〉

2 下降斜波的時間 2T

tCR

vv o

o1

1

21 minus= 11

2

1 CRvv

to

ominus=

21

2Tt = THTLo VVv minus=1 12 sato Ev =

1

11111

1sat

TLTH

sat

THTL

EVV

CRCRE

VVT

minus=

minusminus= 〈311〉

3 週期 21 TTT +=

若 1satE = 2satE = satE 且3

22RR

VV TLTH =minus satE

3

2114

RR

CRT=

若R3 = nR2

則nCR

T 114=

114 CR

nf = 〈312〉

《實驗結果》

必須注意的是三角波的頻率太低將導致馬達的轉動產生脈動現象

故將工作頻率設計在1kHz以上

Ω= k1501R Ω= k102R

Ω= k203R pFC 22001 =

所得到的三角波頻率為

15kHz10220010001504

00010100020

f 12- =timestimestimestimes

timestimes

=

圖 34 三角波輸出波形

22

〈2〉 脈寬調變電路〈PWM〉

+12V

-12V

10k

+12V

-12V -

+ PWM輸出LM324三角波輸入

圖 35 脈寬調變電路

PWM系統往往連接至直流電源供應放大器的工作是以固定的頻率開

閉直流供應電壓其激發角是可以調整的因此得到波寬可調的輸出

將固定頻率的三角波與反向輸入的電壓做比較便可輸出一脈寬〈見圖

36〉反向電阻值的不同將導致反向輸入電壓不同故其輸出為一可調但

頻率固定的脈寬也正因為如此故稱為脈寬調變〈PWM〉由於輸出的

dutycycle不同故馬達將接收到不同的平均電壓因而可以藉由PWM控制

馬達的轉速

反相輸入電壓

PWM

圖 36 三角波與反相輸入電壓比較

23

PWM的優點在於馬達驅動電路的電晶體之控制信號改以脈波列來控

制使電晶體操作成類似開關的動作不是完全導通就是完全截止故電晶

體不是一直操作於作用區所以其功率消耗不大整體效率較高

《實驗結果》

圖 37 PWM 輸出波形

322 橋型驅動功率放大電路

如圖38所示主要由四個功率電晶體組成利用不同的電晶體對使直流

馬達做正逆轉控制當Q5Q8導通使馬達正轉當Q6Q7導通馬達則逆

轉電路中的電晶體扮演開關的作用

此種電路簡單只要一組直流電源供應且電晶體分擔了部份的電壓保護

電晶體迅速工作於截止與飽和狀態之間故沒有功率散逸損失之虞

但是在設計時切勿使Q5Q6同時導通以免燒毀電路上之元件因為在

AB兩脈波短暫的交變時間內由於電晶體本身之最小延遲時間有可能使Q5

Q6同時ON與Q7Q8在很短時間同時ON因此在15kHz交變下容易燒毀功

率電晶體

因此設計一間距脈波電路主要之功用使Q5Q6和Q7Q8均不同時導通

24

以拉長AB兩者交換時間

M

20k

10k

20k

10k

+24V

A 信號 B 信號

2N3055 2N3055

2N2955 2N2955

1N40021N4002

C1815 C1815

C1815 C1815

Q5

Q8Q6

Q7

圖 38 橋型驅動功率放大電路

圖 39 橋型驅動功率放大電路實體圖

25

此外若考慮電晶體BE間的電壓則電路會出現約 plusmn 06V的不感帶〈ded

band〉即電晶體的 oV 對 inV 間的關係如圖3101假使 inV 電壓為正弦波則 oV 變

成如圖3102為了改善這種缺失吾人利用兩個二極體接在電路上如圖38

用來補償電晶體BE間的壓降﹝10﹞

約06V

Dead band

Vo

Vin

圖 3101 呈現不感帶的轉移函數

圖 3102 輸出電壓波形

26

323 間距脈波產生電路

RCext15

Cext14 74123

A3

B2

Q13

CLR1

Q4

7486100k

2200pF

10k

10000pF

+5V

間距脈波輸出

圖 311 間距脈波產生電路

間距脈波的產生方式是根據脈寬調變〈PWM〉後的訊號再經由積分電路的

電阻兩端取出且經由兩倍頻器〈74LS86〉檢示出PWM的正負緣脈波最後

再利用單穩態IC〈74LS123〉將檢出信號之脈寬拉長至01ms此即為間距脈波

74LS123有兩個輸入端子A及B分別為下降波緣輸入端子及上升波緣輸入端

子當輸入A之脈波由ldquoH變成ldquoL之瞬間Q輸出變為ldquoH其持續時間長

短由RC時間常數決定反之當輸入B之脈波由ldquoL變成ldquoH之瞬間Q輸出

變成ldquoH維持一定時間

74LS123的輸出脈波之寬度是由電阻及電容之時間常數所決定概略計算公

式如下

CR045T timestimes=

電容 C 必須大於 1000pF

27

《實驗結果》

R=24kΩ C=10000pF

所以得到間距脈波為

( )msec0110810000p24k045T cong=timestimes= μ

圖 312 間距脈波

研究經分析後發現

1 間距 T 愈大愈能確保電路之安全性愈有保護作用

2 間距 T 愈大相對的使驅動信號脈波減少愈多造成馬達旋轉扭力大

大減弱

3 適當的間距 T不但不會影響馬達的輸出轉矩而且兼具保護電路的

效果

33 編碼器

轉動編碼器不只可以作為轉速的感測也能做位置的感測又適合於數位處

理故被廣泛使用若就信號來看轉動編碼器可分為增量型與絕對型若以檢

測的方式來分可分為光學式和磁式兩種在本專題中所使用的編碼器為光學式

增量型編碼器﹝11﹞

光學式轉動編碼器的原理如圖 313在附有細縫轉盤的兩側分別裝置發光元

28

件與受光元件如果只有一組光電檢測元件則輸出信號就只有一相的脈波信

號此種裝置稱為脈波產生器圖 314 為增量型轉碼器的輸出信號它是利用

兩組光電元件所產生的脈波信號A 相和 B 相間有相位差正轉時 A 相領前 B

相逆轉時 B 相領前 A 相因此利用此兩相做檢測馬達為正轉或逆轉的工作

並利用 A 相或 B 相的頻率檢測出目前的轉速

吾人計算出編碼器每一轉可以產生約 200 個脈波故檢測 A 相或 B 相其頻

率為 N則轉速應為 60200

timesN

〈rpm〉

圖 313 光學式轉動編碼器的原理圖

圖 314 編碼器的輸出信號波形

29

34 LM2917 FV 電路設計

對 LM2907 而言磁滯比較器和電流汞是構成頻率對電壓轉換的基本架構

並且預留一個運算放大器及一個電晶體供各種不同的使用圖 315 為吾人所設

計的 FV 電路圖中 C1 用以抑制電流汞動作時所產生的漣波變化正常使用時

此電容應大於 10C若 C1 太大也將造成轉換速度下降

因為單晶片 8051 之輸入電壓最高為 5V故必須設計其馬達最高轉速頻率所

轉成的電壓必須在 5V 以內由於馬達轉速頻率範圍極大故吾人給予 LM2917

+12V 的電壓以擴大它可以轉換的電壓範圍並將所需維持在 5V 內

a1

14

b1

1

a1

13

b1

2

a1

12

b1

3

a1

11

b1

4

1

a1

10

b1

5

a1

8

b1

7

a1

9

b1

6

L2917

Encoder輸 入

1uF

+12V

FV輸出1000pF

45k 10kC1

C2

圖 315 FV 電路

30

《實驗結果》

根據統計結果每 50mV 相對於 100Hz如此一來吾人想得知馬達目前

的轉速只要將單晶片所接收到的電壓值經過換算即可得知目前 encoder 所量測

的頻率吾人知道 encoder 一圈可產生 200 個脈波故馬達的轉速便可經過下列

公式換算得知

轉速〈rpm〉 60200

times=f

其中 =f encoder 所量測到的頻率

表 31 頻率與轉換電壓之關係

頻率

(Hz) 1 2 3 4 5 6 7 8 9

電壓(V) 0006 0006 0007 0008 0009 0009 0009 0009 001

頻率

(Hz) 10 20 30 40 50 60 70 80 90

電壓(V) 008 009 010 010 011 011 012 012 013

頻率

(Hz) 100 200 300 400 500 600 700 800 900

電壓(V) 013 018 023 028 033 038 043 049 054

頻率

(Hz) 1000 2000 3000 4000 5000 6000 7000 8000 9000

電壓(V) 059 109 16 209 257 304 3508 4006 45

31

圖 316 頻率對電壓曲線

35 單晶片介面電路

單晶片介面包括了二大部分分別為單晶片 8051AD converter

〈1〉8051 單晶片

為本控制系統的核心一切動作皆經由它控制

〈2〉AD converter

將類比開關所送出來的類比訊號經由 ADC 0804 轉換成數位訊號傳送

到單晶片的輸入埠

351 AD 轉換

以單晶片 8051 控制 ADC0804則單晶片 8051 必須下達ldquo開始轉換rdquo的命令

給 ADC0804然後 ADC0804 就開始讀入類比輸入端的電壓在內部開始轉換

經過一段轉換時間後〈約 100μ s〉ADC0804 就將轉換完成的值放在其內部的三

態輸出栓鎖緩衝器裡然後將轉換完成輸出腳〈INTR〉降為 low以通知單晶片

可以去讀轉換完成資料

當WR和CS 同時為ldquo0rdquo時表示對 ADC0804 下達ldquo開始轉換rdquo命令再經過

32

一段轉換時間〈100μ s〉後轉換完成ADC0804 會將其轉換完成的數位資料放

在其內部 8 位元緩衝區裡且將 INTR 降為ldquo0rdquo因此單晶片只要下達ldquo開始轉換rdquo

命令後去檢查 INTR 的狀態就可以知道是否轉換完畢其方法有兩種

1 輪詢法〈polling〉

2 中斷法〈interrupt〉

所謂輪詢法就是將 ADC0804 的 INTR接到 CPU 的一條 IO 線上然後以軟體指

令主動偵測其狀態當偵測到為ldquo0rdquo時就可以去讀出 ADC0804 裡的緩衝區的轉

換值

中斷法是一個很理想的 IO 方式因為不像輪詢法必須讓 CPU 等 ADC0804

轉換當 CPU 下達ldquo開始轉換rdquo命令後就可以做其他工作當 ADC0804 轉換完

畢後 INTR會降為ldquo0rdquo可以利用此信號去中斷 CPU再由中斷副程式去讀入

轉換值即可因此大大提高了程式的效率

當 CPU 接收到 ADC0804 發出ldquo轉換完畢rdquo的信號〈 INTR =0〉後就可以去

讀出轉換值其讀出的方法是將CS 與RD設為ldquo0rdquo即可讀到轉換值這個讀值的

動作又會使得 INTR恢復成ldquo1rdquo

1 CPU 下達ldquo開始轉換rdquo命令〈CS =0WR =0〉

2 ADC0804ldquo轉換完畢rdquo 〈 INTR =0〉

3 CPU 讀取轉換值〈 RD =0CS =0〉

4 讀完後 INTR =1

ADC0804 主要規格摘要如下

1 +5V 單電源工作電壓

2 類比電壓輸入範圍 0~+5V

33

3 參考電壓為 25V

4 轉換時間為 100μ s〈 CLKf =640kHz〉

5 解析度為 8 位元

6 誤差plusmn 1LSB

7 讀取時間 135ns

36 電源供應系統

本專題中所有電路及硬體設備所需的電源採用交流電源 110V 經由 PT-31

變壓器後再經過橋式整流後提供了直流電源而因為各個電路所需電源不同

因此製作了多組的變壓電路如下

1電壓源 DC5V選擇了 7805 的穩壓 IC 搭配電容得到了+5V 的電壓源

供〈1〉8051 微處理器 〈2〉ADC 0804 〈3〉74LS8674LS12374LS04

74LS02CD4013 〈4〉馬達 Encoder

2電壓源 DC12V使用 7812 穩壓 IC 搭配電容得到+12V 的電壓源供

LM2917 使用

3電壓源 DC24V利用 7824 的穩壓 IC 搭配電容獲得+24V 的直流電壓

源供電路之橋型驅動功率放大之電晶體使用

Vin1

+12V2

GND3

LM7812

2200uF 10000pF 2200uF 10000pF

+12V outputAC

圖 317 直流電源電路

34

圖 318 直流電源電路實體圖

37 馬達轉速的量測

表 33 PWM 輸出對應 encoder 週期

PWM dutycycle encoder 週期 PWM dutycycle encoder 週期

40 sμ 172 sμ 440 sμ 0 sμ

80 sμ 188 sμ 480 sμ 0 sμ

120 sμ 204 sμ 520 sμ 0 sμ

160 sμ 230 sμ 560 sμ 0 sμ

200 sμ 272 sμ 600 sμ 0 sμ

240 sμ 328 sμ 640 sμ 0 sμ

280 sμ 416 sμ 680 sμ 1320 sμ

320 sμ 540 sμ 720 sμ 750 sμ

360 sμ 800 sμ 760 sμ 510 sμ

400 sμ 1320 sμ 800 sμ 400 sμ

35

圖 319 PWM 輸出對應 encoder 週期

由統計可知道此馬達並不是一顆線性馬達故相信若使用模糊控制理論來

作為其回授控制系統的控制器一定能達到比傳統控制器的性能還要好而且若能

在模糊控制裡加上 PID 控制器的觀念一定能在系統的響應時間上升時間

安定時間和超越量達到最佳的控制另一方面馬達在其反方向的內阻較大需

要更大的力量才能使馬達驅動

36

第四章 軟體規劃與製作

41 PWM 之軟體設計

因為之前所介紹的硬體方式是以調整可變電阻來達到轉速的調整因此無法

得知所給予的脈寬長度和轉速大小尤其在回授時也不易給予適當的訊號來調整

轉速因此改良之方法就是以8051之軟體撰寫方式來產生固定的脈寬也就等

於給予轉速的命令而在其回授控制時也只要在內部程式给予適當的指令便可

達到脈寬長度的調整以達到閉迴路之受控系統

411 PWM 軟體流程

設定Timer0模式為0

TH0 = temp 32 TL0 = temp 32

temp = 8192 ndash j4 Key = 0

檢查是否有鍵值

將鍵值存入Key

Yes

No

設定Key值所對應的 j值

If P30 == 1Then P30 = 0 temp = 8192 ndash j4Else P30 = 1 temp=8192ndash880+j4

TH0 = temp 32 TL0 = temp 32

Start Timer0中斷副程式

啟動Timer0

等待Timer0中斷

返回主程式

圖 41 PWM 軟體設計流程圖

37

在此總共設計了五個按鈕分別代表不同的轉速停止正轉〈慢〉正轉

〈快〉逆轉〈慢〉和逆轉〈快〉使用Timer0是因為8051之計時中斷比延遲程

式來的準確故可以達到準確的計時程式設計理念中並沒有將中斷致能清除

因此Timer0會一直處於計時的狀態程式執行時將一邊檢查鍵值〈KeyStatus〉一

邊進行計時當計時完畢便呼叫中斷副程式然後執行改變Port 30的輸出狀

態若是為high則變為low反之若是為low即變為high同時並重設計時時間

Timer0繼續計時

當鍵值改變時計時的時間也會跟著改變如此一來Timer0將ㄧ直重覆上

述動作直到電源切掉Timer0才會停止計時

42 模糊控制之程式規劃與撰寫

本專題目標在完成了先前所規劃的硬體電路之後接著就是要達成利用模糊

控制理論來設計控制器在此採用了單晶片8051目的是為了以硬體實現方式來

代替電腦模擬期望能夠按照原訂計畫完成本專題「具模糊控制理論與雙脈寬調

變法之直流馬達驅動電路設計」

單晶片 8051 模糊控制的程式撰寫採下列幾個步驟依序完成

1 設定變數轉速誤差〈dspeed〉目前轉速〈sspeed〉

2 模糊化採用三角形歸屬函數採用三角形歸屬函數的原因

〈1〉 三角形函數為一連續函數

〈2〉 三角形函數為線性的函數所以計算速度較快

〈3〉 是具有發散也有收斂的函數和指數函數一樣接近

事實

3 模糊推論模糊規則將其所有可能發生情況以 IFhellipTHENhellip表示

並建立控制規則表

4 解模糊化採用重心法

38

421 歸屬函數

設定變數為目前轉速〈sspeed〉與轉速誤差〈dspeed〉因此此模糊控制器共

有兩個輸入訊號與一輸出訊號輸出訊號為脈寬長度該加或是減多少又因為有

五種不同的轉速因此各分別設計了不同的歸屬函數如下

1 當轉速 = 0

ml h

s s p e e d

d s p e e d

r p m0 5 0 1 0 0- 5 0- 1 0 0

mv l l h v h

r p m0- 3 0- 6 0- 1 0 0 3 0 6 0 1 0 0 圖 42 停止時之歸屬函數

2 正轉〈慢〉

ml hsspeed

dspeed

rpm150 225 300750

mvl l h vh

rpm150100500 200 250 300

圖 43 正轉〈慢〉之歸屬函數

39

3 正轉〈快〉

ml hsspeed

dspeed

rpm520 670 820370220

mvl l h vh

rpm500400300200 600 700 800

圖 44 正轉〈快〉之歸屬函數

4 逆轉〈慢〉

ml hsspeed

dspeed

rpm100 250 400500

mvl l h vh

rpm10050250 200 300 400 圖 45 逆轉〈慢〉之歸屬函數

40

5 逆轉〈快〉

ml hsspeed

dspeed

rpm300 450 600150

mvl l h vh

rpm450350250150 550 650 750

750

圖 46 逆轉〈快〉之歸屬函數

6 輸出

OutputMVL L H VH

rpm0-50-150-250 50 150 250

圖 47 輸出之歸屬函數

41

422 模糊規則庫

表 41 為吾人所設計的模糊控制規則庫並利用 Matlab 之 Fuzzy ToolBox 來

建立此規則庫以進行模擬推論圖 48 為當馬達輸入指令為正轉慢時推論後所得

到的三維空間圖

表 41 模糊控制規則表

Dspeed

vl l m h vh

l H M L VL VL

m VH H M L VL sspeed

h VH VH H M L

圖 48 推論後的三維空間圖

42

423 模糊控制器之軟體設計流程

Start 外部中斷副程式

ADCWR = 0 ADCWR = 1

〈令AD開始轉換〉

檢查鍵值以得到對應的歸屬函數

取得目前轉速與

轉速誤差

Fuzzy Rules決策

得到輸出訊號

Delay 10ms

ADC = 0 讀取AD值 ADCRD = 0

將AD值換算成轉速

ADCWR = 0 ADCWR = 1

〈AD開始轉換〉

返回主程式

致能外部中斷

圖 49 Fuzzy Controller 程式流程圖

當控制器一開始動作時便先執行AD轉換的工作當AD轉換完成時其

INTR的接腳便會觸發8051的外部中斷INTR0於是程式便發生外部中斷執行

外部中斷副程式的指令

43

在外部中斷副程式中AD將ㄧ直進行轉換與讀取的工作同時並將轉換後

的值直接換算成目前轉速與轉速誤差以供模糊控制器使用換算目前encoder

的頻率其公式為

160-V2000 times=頻率 〈4-1〉

式4-1之公式是根據表31所導出來的其中V為encoder之頻率轉成電壓之值

又假設所讀取的AD轉換值為value因為

AD的解析度 = bit256

5V+ = 511 ( Vbit ) 〈4-2〉

故value值與電壓V之關係為

511 value V times= 〈4-3〉

所以encoder之頻率與value值的關係為

頻率= 2000times ⎟⎠⎞

⎜⎝⎛ times

511 value - 160 〈4-4〉

故目前轉速為

sspeed = ( )rpm 60 200

times頻率 〈4-5〉

另ㄧ方面在主程式中程式會先去檢查鍵值也就等於檢查輸入指令以

找出符合使用的歸屬函數並將AD所獲得的轉速對應到歸屬函數中然後執行

決策判斷即進入規則庫中尋找出適當的決策判斷最後將此決策送入PWM程

式裡進行脈寬長度的調整使馬達在合理的要求下達到理想的轉速控制不會

因為外在環境的影響而使馬達轉速受到干擾

43 LCD 顯示轉速

此專題最後再增加一LCD顯示幕以顯示目前的轉速否則在程式設計完成

後人卻因無法以肉眼得知目前轉速而不能肯定馬達轉速是否有達到控制的目

標因此增加一顯示幕LCD是有必要的不僅隨時得知目前的轉速還能知道

44

設計出來的軟體其控制性是否夠好夠穩定

431 LCD 顯示幕之軟體流程

Start

設定LCD模組的初始狀態

設定外部中斷INTR0

與Timer0

設定TH0 = (65536 ndash 5000) 256 TL0 = (65536 ndash 5000)256

令ADCWR = 0 ADCWR = 1 AD開始轉換

等待中斷

外部中斷副程式

ADCRD = 0 讀取AD值 ADCRD = 1

將AD值換算成速度

ADCWR = 0 ADCWR = 1 AD開始轉換

Timer0中斷副程式

顯示LCD第一行

ldquoMotor Speed =

顯示LCD第二行ldquoxxxxxxx rpm其中 xxxxxx為外部中斷副程式所換算出的轉速

重設TH0與TL0

返回主程式返回主程式

圖 410 LCD 顯示幕之程式流程圖

此程式主要由兩個部分完成一為外部中斷副程式另ㄧ為 Timer0 中斷副

程式當主程式完成外部與 Timer0 兩個中斷的設定後隨即命令 AD 開始轉換

之後便一直停在 while〈1〉的迴圈裡不做任何動作而由兩個中斷副程式來完

成整個轉換與顯示的工作

45

外部中斷副程式主要負責 AD 的轉換讀取與轉速換算的工作AD 第一

次的轉換由主程式來下達命令當轉換完成後AD 的 INTR 接腳將觸發外部中

斷〈INTR0〉副程式此時程式便進入外部中斷副程式執行讀取 AD 值與轉速

換算的工作當這些工作完成時外部中斷副程式再次下達 AD 開始轉換的命

令而離開中斷副程式當 AD 再次轉換完成時又將再次執行中斷副程式

如此週而復始中斷副程式將ㄧ直進行讀取換算與轉換的工作

而 Timer0 中斷副程式主要負責 LCD 顯示之工作當主程式所設定的計時時

間計數完時程式便進入 Timer0 中斷副程式一旦進入 Timer0 中斷副程式程

式將執行 LCD 的顯示然後再重設 Timer0 的計數時間Timer0 將重新計數當

計數完時程式又將再度進入 Timer0 中斷副程式執行因為程式中並無清除

Timer0 的中斷致能故 Timer0 中斷副程式和外部中斷副程式ㄧ樣週而復始的

執行其副程式的工作

46

第五章 結論

本計劃主旨為具模糊控制理論與雙脈寬調變法之直流馬達驅動電路設計主

要是針對傳統電路設計之缺點提出改良之方法以TPWM取代PWM電路以模

糊理論基礎設計之控制器替代傳統PID控制器

TPWM轉速控制優於PWM之處在於

1 TPWM只需使用單電源即可達到正轉和逆轉的轉速控制而PWM必須

加上逆向開關或是雙電源才能使馬達產生正轉和逆轉

2 TPWM可控制馬達處於停止狀態無論在正向或逆向加上負載皆無法使

馬達產生轉動

3 馬達消耗定額功率輸出轉矩為額定值

4 馬達由停止到某定轉速時反應時間較快

模糊控制器優於PID控制器

1 不須導出繁雜的數學模型

2 適用於非線性系統

3 強健性與容錯性較高

本專題至此雖說大致的目標都已達到但是此系統仍然有許多不完美而需要

改進的地方例如在實驗過程中發現整個轉速的控制在回授上其反應時間

有點慢探討其原因有可能是控制器之程式上的問題

1 因為使用C語言撰寫程式故其執行速度較慢

2 程式可能寫的太累贅

3 模糊控制規則庫建立不良

若想改善這些問題可以嘗試著將C語言改為組合語言來撰寫並盡量減少

47

不必要的指令相信此動作一定能大大提昇程式的執行速度其次就是多做測

試利用測試中所學到的經驗來幫助模糊控制規則庫的改寫同時也能從測試中

發現更多的問題若是都能對問題加以一一解決的話相信必定能將此控制系統

做的更盡善盡美

48

參考文獻

﹝1﹞ 李適中直流馬達速度控制伺服控制〈基礎篇〉全華科技圖書股份有

限公司民 74

﹝2﹞ 廖錦文ldquo直流電動機之雙脈寬調變是〈TPWM〉驅動電路研究電

子技術月刊第 69 期pp94-1021992

﹝3﹞ 楊英魁孫宗瀛鄭魁香林建德蔣旭堂模糊控制理論與技術全華

科技圖書股份有限公司民 85

﹝4﹞ 林敦煌陳憬德直流馬達定位及轉速的模糊控制逢甲大學自動控制工

程學系學士論文民 87

﹝5﹞ LAZadehldquo Fuzzy Sets Information and Control Vol8 pp338-353

1965

﹝6﹞ EHMamdani and SAsslianldquo A fuzzy logic controller for a dynamic

plant Internation Journal of Man-Machine Studies Vol7 pp1-13 1975

﹝7﹞ 孫宗瀛楊英魁Fuzzy 控制理論實作與應用全華科技圖書股份有

限公司民 83 年

﹝8﹞ 許中平黃煌嘉直流電動機控制電路設計全華科技圖書股份有限公司

民 75

﹝9﹞ 盧明智黃敏祥OP Amp 應用+實驗模擬全華科技圖書股份有限公司

民 83

﹝10﹞陳文耀電動機控制工程復文書局2003

﹝11﹞許中平林全福電動機運轉控制技術全華科技圖書股份有限公司民

77

﹝12﹞楊明豐8051 單晶片 C 語言設計實務碁峯資訊2003 年

﹝13﹞蔡朝洋單晶片微電腦 80518951 原理與應用全華科技圖書股份有限公

司民 91

49

﹝14﹞王文俊認識 Fuzzy全華科技圖書股份有限公司民 90

50

附錄 A 專題硬體展示圖

圖 A-1 硬體整體圖

圖 A-2 硬體整體鳥瞰圖

51

圖 A-3 硬體側視圖

圖 A-4 操作與顯示面板

圖 A-5 間距脈波電路與 FV 電路

52

圖 A-6 橋型驅動功率放大電路

圖 A-7 操作與控制面板

53

附錄 B PWM 與模糊控制之程式

include reg51h include stdioh sbit ADCRD = P3^1 設定 RD 控制線接腳為 P31 sbit ADCWR = P3^3 設定 WR 控制線接腳為 P33 sbit P2_0 = 0xA0 接腳定義 sbit P2_1 = 0xA1 接腳定義 sbit P3_0 = 0xB0 接腳定義 sbit P3_1 = 0xB1 接腳定義 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P3_6 = 0xB6 接腳定義 void KeyStatus(void) 函數原型宣告 void feedback(void) 函數原型宣告 void compute_grade(void) 函數原型宣告 void delay1ms(int count) 函數原型宣告 void convert() 函數原型宣告 void condition() 函數原型宣告 void CW(void) 函數原型宣告 int j i 對應 PWM 的寬度 unsigned int temp 所設計的計時器時間 int sample = 1000 取樣率設定消除顯示值跳動 long int value r1 讀取 ADC0804 數位資料 long int set n condition select long int r grade_reg[2] grade[15] error1 error2 long int a1 b1 I long int membership[5][3]membership1[3][3] 定義歸屬函數 long int membership2[3][3] = -10-50-5050510 long int error[2] int Rule[15][3] = 113213313 定義判斷規則庫 212223323 311232333 411241342 511251351

54

main() 主程式 j = PWM = 110 設定 PWM 初始值 IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x00 設定計時器 0 工作於模式 0 temp=8192-j4 設定計時器 0 初值 TH0 = temp 32 TL0 = temp 32 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 P3_4 = 1 P3_5 = 0 P3_6 = 0 ADCWR = 0 令 ADC0804 的 WR = 0 ADCWR = 1 令 ADC0804 的 WR = 1 while (1) KeyStatus() 檢查鍵值 void KeyStatus(void) 檢查鍵值並給對應的 PWM 值 char KeyScan(void) 按鍵掃描函數宣告 unsigned char KeyStatus unsigned char Key = 0 KeyStatus=KeyScan() 呼叫按鍵掃描函數 if (KeyStatus = 0) 已有按鍵輸入 Key = KeyStatus Key = 鍵值 if (Key == 0x01) 假如輸入為按鍵 1 i = 110 PWM 為 110us j = i P3_4 = 1 LED 亮第一顆〈表馬達停止〉 P3_5 = 0 P3_6 = 0

55

else if (Key == 0x02 ) 假如輸入為按鍵 2 i = 140 PWM 為 140us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x04 ) 假如輸入為按鍵 3 i = 180 PWM 為 180us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x08 ) 假如輸入為按鍵 4 i = 80 PWM 為 80us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 else if (Key == 0x10 ) 假如輸入為按鍵 5 i = 40 PWM 為 40us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 PWM = j delay1ms(10) 呼叫延遲函數 feedback() 模糊控制判斷

56

void To_int(void) interrupt 1 Timer0 中斷函數 if (P3_0 == 0) 假如 PWM 輸出為 Low P3_0 = 1 變更 PWM 輸出為 High temp=8192-j4 設定 High 的時間 else 若 PWM 輸出為 High P3_0 = 0 變更 PWM 輸出為 Low temp=8192-880+j4 設定 Low 的時間 TH0 = temp 32 Timer0 的計時時間 TL0 = temp 32 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 char KeyScan(void) 檢查鍵值 char KeyStatus 按鍵狀態 P0=0xff 設定 P0 為輸入模式 KeyStatus=~P0 讀取按鍵狀態 return(KeyStatus) 將鍵值送回程式 void feedback(void) 模糊判斷 void Fuzzycontroller() 函數原型宣告 void condition1() 函數原型宣告

57

void condition2() 函數原型宣告 error1 = ((value)40-160)03 輸入變數 1 delay10ms(10) 延遲 10ms error2 = ((value)40-160)03 輸入變數 2 if (key == 0x01 ) 當按鍵 1找出對應的歸屬函數 並做出模糊控制判斷

int membership[5][3]= -100-60-30-60-300-30030030603060100

int membership1[3][3]=-100-500-50050050100 Fuzzycontroller() condition() if (key == 0x02 ) 當按鍵 2找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

05010050100150100150200150200250200250300 int membership1[3][3]=07515075150225150225300 Fuzzycontroller() condition() else if (key == 0x04) 當按鍵 3找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

200320400300400500400500600500600700600700800 int membership1[3][3]=220370520370520670520670820 Fuzzycontroller() condition() else if (key == 0x08) 當按鍵 4找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

02550255010050100200100200300200300400 int membership1[3][3]=05010050100250100250400 Fuzzycontroller() condition()

58

else if (key == 0x10) 當按鍵 5找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

150250350250350450350450550450550650550650750 int membership1[3][3]=150300450300450600450600750 Fuzzycontroller() condition2() void Fuzzycontroller() 模糊控制判斷 void compute_grade() 函數原型宣告 void compute_grade1() 函數原型宣告 a1 = 0 b1 = 001 I = 0 for (n=0 nlt=14 n++) r = error1 set = Rule[n][0]-1 compute_grade() 計算輸入變數 1 與

模糊程度的歸屬函數 condition = 1 r = error2 set = Rule[n][1]-1 compute_grade1() 計算輸入變數 2 與 模糊程度的歸屬函數 grade[n] = MIN(grade_reg[0] grade_reg[1]) a1 = a1 + (grade[n]membership2[Rule[n][2]-1][1]) b1 = b1 + grade[n] I = a1 b1 得到模糊控制判斷的結果 void compute_grade() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership[set][0]) || (r gt membership[set][2])) 當輸入變數不在 歸屬函數內

59

grade_reg[condition] = 0 else if ((r gt membership[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership[set][2]-r) (membership[set][2] - membership[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership[set][0]) (membership[set][1] - membership[set][0]) void compute_grade1() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership1[set][0]) || (r gt membership1[set][2])) 當輸入變數不在 歸屬函數內 grade_reg[condition] = 0 else if ((r gt membership1[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership1[set][2]-r) (membership1[set][2]-membership1[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership1[set][0]) (membership1[set][1]-membership1[set][0])

60

void condition() P2_0 = 1 設定 P20 為輸入模式 P2_1 = 1 設定 P21 為輸入模式 if ( (P2_0 == 1) ampamp (P2_1 == 0)) 當馬達為正轉時 if ( I gt 0 ) 若模糊判斷結果為正 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 若模糊判斷結果為零 PWM = PWM + 0 PWM 寬度不變 if ( I lt 0 ) 若模糊控制結果小於零 PWM = PWM + 1 PWM 寬度加 1 else if ( (P2_0 == 0) ampamp (P2_1 == 1) ) 若馬達為反轉 if ( I lt 0 ) 模糊控制小於零 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 模糊控制等於零 PWM = PWM + 0 PWM 寬度不變 if ( I gt 0 ) 模糊控制大於零 PWM = PWM + 1 PWM 寬度加 1 CW() 判斷 PWM 寬度上下限

61

void CW() 判斷 PWM 寬度上下限 if ( PWM gt= 215 ) 若 PWM 寬度 gt= 最大寬度 j = 215 PWM 寬度維持於 215us if ( PWM lt= 5 ) 若 PWM 寬度 lt= 最小寬度 j = 5 PWM 寬度維持在 5us if ( PWM gt 5 ampamp PWM lt 215 ) PWM 寬度介於最大與最小間 j = PWM PWM 依模糊控制判斷結果增減 void delay1ms(int count) 延遲 1ms int x y for ( x = 0 x lt count x++ ) for ( y = 0 y lt 122 y++ ) void convert() 數位資料換算成馬達轉速 r1 = ((value)40)-160

62

附錄 C LCD 顯示之程式

includereg51h 含 8051 所有暫存器宣告 include mathh define RS P3_5 LCD 指令資料選擇控制 define RW P3_4 LCD 讀寫控制腳 define Enable P3_3 LCD 致能接腳 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P0_0 = 0x80 接腳定義 sbit P0_1 = 0x81 接腳定義 sbit P0_2 = 0x82 接腳定義 sbit P0_3 = 0x83 接腳定義 sbit P0_4 = 0x84 接腳定義 sbit P0_5 = 0x85 接腳定義 sbit P0_6 = 0x86 接腳定義 sbit ADCRD = P3^7 設定 RD 控制線接腳為 P37 sbit ADCWR = P3^6 設定 WR 控制線接腳為 P36 void delay(void) 函數原型宣告 void delay10ms(int count) 函數原型宣告 void display(void) 函數原型宣告 void InitialLCD(void) 函數原型宣告 void WriteIns(char) 函數原型宣告 void WriteData(char) 函數原型宣告 void WriteString(charchar) 函數原型宣告 void CheckBusy(void) 函數原型宣告 void convert(void) 函數原型宣告 char MSG0[] = Motor Speed = 定義字串 MSG0 char MSG2[] = rpm 定義字串 MSG2 unsigned char MSG1[8]=0000000 定義字串 MSG1 unsigned long int value 讀取 ADC0804 數位資料 int sample = 1000 取樣率設定消除顯示值跳動 long int rpm

63

main() 主程式 InitialLCD() 初始化 LCD IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x01 設定計時器 0 工作於模式 1 TH0 = (65536-5000)256 設定計時器 0 初值 TL0 = (65536-5000)256 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 while(1) 等待中斷 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 while (--sample == 0) 取樣率減 1 sample = 1000 重設取樣率 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 void T0_int(void) interrupt 1 LCD 顯示動態掃描 display() 動態掃描顯示 TH0 = (65536-65535)256 重設計時初值 TL0 = (65536-65535)256

64

void InitialLCD(void) 設定 LCD 模組初始狀態 delay() 延遲函數 WriteIns(0x38) 設定 LCD 模組為 WriteIns(0x38) 2 行顯示 WriteIns(0x38) 8 位元介面 WriteIns(0x38) 5x7 點字型 WriteIns(0x08) 關閉顯示器 WriteIns(0x01) 清除 LCD 螢幕 WriteIns(0x0c) 令顯示器 ON但游標不顯示 WriteIns(0x06) 令 LCD 模組每接收到 1Byte 資料 AC 值自動加 1 void display() 掃描顯示 WriteIns(0x80) 設定 LCD 座標 WriteString(13MSG0) 將字串 MSG0 寫入 LCD 中 WriteIns(0xc0) 設定 LCD 座標 WriteString(8MSG1) 將字串 MSG1 寫入 LCD 中 WriteIns(0xc8) 設定 LCD 座標 WriteString(4MSG2) 將字串 MSG2 寫入 LCD 中 void convert(void) 換算轉速 long int freq freq = ((value)4000) - 16000 數位資料換成頻率公式 rpm = freq3 頻率換算轉速公式 MSG1[0] = (rpm1000000)+0x30 將結果存入字串 MSG1 中 MSG1[1] = ((rpm1000000)100000)+0x30 MSG1[2] = ((rpm100000)10000)+0x30 MSG1[3] = ((rpm10000)1000)+0x30 MSG1[4] = 0x2e MSG1[5] = ((rpm1000)100)+0x30 MSG1[6] = ((rpm100)10)+0x30 MSG1[7] = rpm10+0x30

65

void WriteIns(char instruction) 寫命令至 LCD 中 RS = 0 選擇指令暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = instruction 輸出命令至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteData(char i) 寫資料至 LCD 中 RS = 1 選擇資料暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = i 輸出資料至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteString(countMSG) 寫字串至 LCD 中 char count 字串長度 char MSG[] 字串資料 char i 定義位元組變數 for(i=0 iltcount i++) count 個位元組 WriteData(MSG[i]) 寫入一位元組的資料至 LCD 中 void CheckBusy(void) char i=0x80 檢查忙碌旗標 while(iamp0x80) 忙錄旗標 BF = 1 RS = 0 選擇指令暫存器 RW = 1 讀取 Enable = 1 致能 LCD i = P2 讀取 LCD 指令暫存器內的資料

66

Enable = 0 除能 LCD delay() 延遲函數 void delay() 延遲 5ms int i for(i=0 ilt250 i++)

  • 畢業專題封面pdf
  • File0004pdf
  • 最終版pdfpdf
Page 26: Based on Fuzzy Control Theorem and TPWM Method for DC ... · 使吾人想設計一模糊控制器來做為馬達轉速的閉迴路控制,以解決非線性系統的 問題。除此之外,flcs

17

第三章 系統功能分析與製作規劃

31 專題製作流程

如圖 31 所示本專題主要分為兩條路徑進行一為硬體另一則為軟體程

式撰寫本章著重硬體的規劃設計軟體則在第四章中介紹在完成 AB 信號

產生電路驅動功率放大電路與間距脈波產生電路設計與製作後須先接上馬達

做一連串的測試〈此時系統並無回受控制〉測試間距脈波是否太長或太短硬

體電路是否有缺失hellip等等另一方面也著手撰寫模糊控制程式並將其與硬體電

路結合最後做閉迴路系統的整合測試若發現系統的運作結果並不如預期

則需分別從硬體與軟體兩方面去改良

直流馬達轉速之模糊控制

文獻蒐集與整理

AB信號產生電路設計與製作

驅動功率放大電路設計與製作

間距脈波產生電路設計與製作

測試間距脈波是否太長或太短

系統測試測試馬達轉速是否

達到控制目的

結束與論文寫作

重新設計間距脈波長度

Yes

No

系統整合與修正

輸出信號與Fuzzy控制器之連結設計

規劃輸出與輸入歸屬函數

規劃模糊知識庫

撰寫主程式並加入模糊知識庫

程式編譯及連結

軟硬體整合測試馬達是否運作

程式調整及最佳化

No

YesYes

No

圖 31 專題製作流程圖

18

32 雙脈寬調變法之直流馬達驅動電路設計

本專題製作的雙脈寬調變法之直流馬達驅動電路設計大致可以分為二大部

分第一雙脈寬調變法之電路設計第二橋型驅動功率放大電路

雙脈寬調變〈Two Pulse Width Modulation簡稱TPWM〉之電路設計主要

是先製作一脈寬調變〈Pulse Width Modulation簡稱PWM〉波形然後再將此

波形各別經由一緩衝器〈buffer〉和反向器〈inverter〉則可產生AB驅動信號

脈波此即為TPWM

321 脈寬調變電路

如圖32先利用兩顆op產生三角波電路再利用一個比較器比較三角波

和誤差值之大小

150k

1M

20k

+12V

-12V

+12V

-12V10k

+12V

-12V

10k

+12V

-12V-

+-

+

-

+ PWMLM324

LM324

LM324

2200pF

圖 32 脈寬調變電路

〈1〉 三角波產生電路

三角波產生電路通常至少需要兩個運算放大器其電路如圖33OP1

為一個反相積分器OP2為一個史密特磁滯比較器將OP2的輸出方波經

19

OP1反相積分以後得到Vo1三角波此三角波又同時加到OP2控制其狀

態的改變

當方波產生器的輸出是正的則三角波產生器的輸出是斜向負相似

地當方波產生器的輸出是負則三角波產生器的輸出是斜向正這個動

作將產生三角波的輸出同時也輸出方波﹝9﹞

+VCC

-VCC

-

+

R1

R2

R3

+VCC

-VCC

-

+

OP1

OP2

Vo2Vo1

圖 33 三角波產生電路

對OP2而言是磁滯比較必須先找到OP2的 THV 和 TLV

232

21

32

3oo v

RRR

vRR

Rv

++

+=+ 〈31〉

當 0=+v 時

23

21 oo v

RR

v minus= 〈32〉

表要達到OP2的 0=+v 必須有這麼大的 1ov

當 12 sato Ev = 時

TLsato VERR

v =minus= 13

21 〈33〉

當 22 sato Ev minus= 時

THsato VERR

v =+= 23

21 〈34〉

20

對OP1而言是反相積分器 2ov 為其輸入 1ov 為其輸出則

tCIt

Rv

Ct

CRv

dtvCR

v oooo

11

2

11

22

111

11minus=minus=minus=minus= int 〈35〉

因為

1

2

Rvv

I o minusminus= 0=minusv 〈因為虛接地〉 〈36〉

所以

1

2

Rv

I o= 〈37〉

又因運算放大器的輸入阻抗非常大則流經 1C 的電流也為 I 相當於以定

電流對電容C 充電

當 12 sato Ev = 時 1ov 為下降斜波

tR

EC

v sato

1

1

11

1minus= 〈38〉

當 22 sato Ev minus= 時 1ov 上升斜波

( )

tRE

Cv sat

o1

2

11

1 minusminus= 〈39〉

由此可知三角波的上升與下降斜波乃因 1C 的充電與放電且時間

常數為 11CR

三角波週期分析如下

1 上升斜波的時間 1T

tCR

vv o

o1

1

21 minus= 11

2

1 CRvv

to

ominus=

1Tt = TLTHo VVv minus=1 22 sato Ev =

11111

21

sat

TLTH

sat

TLTH

EVV

CRCRE

VVT

minus=

minusminus= 〈310〉

2 下降斜波的時間 2T

tCR

vv o

o1

1

21 minus= 11

2

1 CRvv

to

ominus=

21

2Tt = THTLo VVv minus=1 12 sato Ev =

1

11111

1sat

TLTH

sat

THTL

EVV

CRCRE

VVT

minus=

minusminus= 〈311〉

3 週期 21 TTT +=

若 1satE = 2satE = satE 且3

22RR

VV TLTH =minus satE

3

2114

RR

CRT=

若R3 = nR2

則nCR

T 114=

114 CR

nf = 〈312〉

《實驗結果》

必須注意的是三角波的頻率太低將導致馬達的轉動產生脈動現象

故將工作頻率設計在1kHz以上

Ω= k1501R Ω= k102R

Ω= k203R pFC 22001 =

所得到的三角波頻率為

15kHz10220010001504

00010100020

f 12- =timestimestimestimes

timestimes

=

圖 34 三角波輸出波形

22

〈2〉 脈寬調變電路〈PWM〉

+12V

-12V

10k

+12V

-12V -

+ PWM輸出LM324三角波輸入

圖 35 脈寬調變電路

PWM系統往往連接至直流電源供應放大器的工作是以固定的頻率開

閉直流供應電壓其激發角是可以調整的因此得到波寬可調的輸出

將固定頻率的三角波與反向輸入的電壓做比較便可輸出一脈寬〈見圖

36〉反向電阻值的不同將導致反向輸入電壓不同故其輸出為一可調但

頻率固定的脈寬也正因為如此故稱為脈寬調變〈PWM〉由於輸出的

dutycycle不同故馬達將接收到不同的平均電壓因而可以藉由PWM控制

馬達的轉速

反相輸入電壓

PWM

圖 36 三角波與反相輸入電壓比較

23

PWM的優點在於馬達驅動電路的電晶體之控制信號改以脈波列來控

制使電晶體操作成類似開關的動作不是完全導通就是完全截止故電晶

體不是一直操作於作用區所以其功率消耗不大整體效率較高

《實驗結果》

圖 37 PWM 輸出波形

322 橋型驅動功率放大電路

如圖38所示主要由四個功率電晶體組成利用不同的電晶體對使直流

馬達做正逆轉控制當Q5Q8導通使馬達正轉當Q6Q7導通馬達則逆

轉電路中的電晶體扮演開關的作用

此種電路簡單只要一組直流電源供應且電晶體分擔了部份的電壓保護

電晶體迅速工作於截止與飽和狀態之間故沒有功率散逸損失之虞

但是在設計時切勿使Q5Q6同時導通以免燒毀電路上之元件因為在

AB兩脈波短暫的交變時間內由於電晶體本身之最小延遲時間有可能使Q5

Q6同時ON與Q7Q8在很短時間同時ON因此在15kHz交變下容易燒毀功

率電晶體

因此設計一間距脈波電路主要之功用使Q5Q6和Q7Q8均不同時導通

24

以拉長AB兩者交換時間

M

20k

10k

20k

10k

+24V

A 信號 B 信號

2N3055 2N3055

2N2955 2N2955

1N40021N4002

C1815 C1815

C1815 C1815

Q5

Q8Q6

Q7

圖 38 橋型驅動功率放大電路

圖 39 橋型驅動功率放大電路實體圖

25

此外若考慮電晶體BE間的電壓則電路會出現約 plusmn 06V的不感帶〈ded

band〉即電晶體的 oV 對 inV 間的關係如圖3101假使 inV 電壓為正弦波則 oV 變

成如圖3102為了改善這種缺失吾人利用兩個二極體接在電路上如圖38

用來補償電晶體BE間的壓降﹝10﹞

約06V

Dead band

Vo

Vin

圖 3101 呈現不感帶的轉移函數

圖 3102 輸出電壓波形

26

323 間距脈波產生電路

RCext15

Cext14 74123

A3

B2

Q13

CLR1

Q4

7486100k

2200pF

10k

10000pF

+5V

間距脈波輸出

圖 311 間距脈波產生電路

間距脈波的產生方式是根據脈寬調變〈PWM〉後的訊號再經由積分電路的

電阻兩端取出且經由兩倍頻器〈74LS86〉檢示出PWM的正負緣脈波最後

再利用單穩態IC〈74LS123〉將檢出信號之脈寬拉長至01ms此即為間距脈波

74LS123有兩個輸入端子A及B分別為下降波緣輸入端子及上升波緣輸入端

子當輸入A之脈波由ldquoH變成ldquoL之瞬間Q輸出變為ldquoH其持續時間長

短由RC時間常數決定反之當輸入B之脈波由ldquoL變成ldquoH之瞬間Q輸出

變成ldquoH維持一定時間

74LS123的輸出脈波之寬度是由電阻及電容之時間常數所決定概略計算公

式如下

CR045T timestimes=

電容 C 必須大於 1000pF

27

《實驗結果》

R=24kΩ C=10000pF

所以得到間距脈波為

( )msec0110810000p24k045T cong=timestimes= μ

圖 312 間距脈波

研究經分析後發現

1 間距 T 愈大愈能確保電路之安全性愈有保護作用

2 間距 T 愈大相對的使驅動信號脈波減少愈多造成馬達旋轉扭力大

大減弱

3 適當的間距 T不但不會影響馬達的輸出轉矩而且兼具保護電路的

效果

33 編碼器

轉動編碼器不只可以作為轉速的感測也能做位置的感測又適合於數位處

理故被廣泛使用若就信號來看轉動編碼器可分為增量型與絕對型若以檢

測的方式來分可分為光學式和磁式兩種在本專題中所使用的編碼器為光學式

增量型編碼器﹝11﹞

光學式轉動編碼器的原理如圖 313在附有細縫轉盤的兩側分別裝置發光元

28

件與受光元件如果只有一組光電檢測元件則輸出信號就只有一相的脈波信

號此種裝置稱為脈波產生器圖 314 為增量型轉碼器的輸出信號它是利用

兩組光電元件所產生的脈波信號A 相和 B 相間有相位差正轉時 A 相領前 B

相逆轉時 B 相領前 A 相因此利用此兩相做檢測馬達為正轉或逆轉的工作

並利用 A 相或 B 相的頻率檢測出目前的轉速

吾人計算出編碼器每一轉可以產生約 200 個脈波故檢測 A 相或 B 相其頻

率為 N則轉速應為 60200

timesN

〈rpm〉

圖 313 光學式轉動編碼器的原理圖

圖 314 編碼器的輸出信號波形

29

34 LM2917 FV 電路設計

對 LM2907 而言磁滯比較器和電流汞是構成頻率對電壓轉換的基本架構

並且預留一個運算放大器及一個電晶體供各種不同的使用圖 315 為吾人所設

計的 FV 電路圖中 C1 用以抑制電流汞動作時所產生的漣波變化正常使用時

此電容應大於 10C若 C1 太大也將造成轉換速度下降

因為單晶片 8051 之輸入電壓最高為 5V故必須設計其馬達最高轉速頻率所

轉成的電壓必須在 5V 以內由於馬達轉速頻率範圍極大故吾人給予 LM2917

+12V 的電壓以擴大它可以轉換的電壓範圍並將所需維持在 5V 內

a1

14

b1

1

a1

13

b1

2

a1

12

b1

3

a1

11

b1

4

1

a1

10

b1

5

a1

8

b1

7

a1

9

b1

6

L2917

Encoder輸 入

1uF

+12V

FV輸出1000pF

45k 10kC1

C2

圖 315 FV 電路

30

《實驗結果》

根據統計結果每 50mV 相對於 100Hz如此一來吾人想得知馬達目前

的轉速只要將單晶片所接收到的電壓值經過換算即可得知目前 encoder 所量測

的頻率吾人知道 encoder 一圈可產生 200 個脈波故馬達的轉速便可經過下列

公式換算得知

轉速〈rpm〉 60200

times=f

其中 =f encoder 所量測到的頻率

表 31 頻率與轉換電壓之關係

頻率

(Hz) 1 2 3 4 5 6 7 8 9

電壓(V) 0006 0006 0007 0008 0009 0009 0009 0009 001

頻率

(Hz) 10 20 30 40 50 60 70 80 90

電壓(V) 008 009 010 010 011 011 012 012 013

頻率

(Hz) 100 200 300 400 500 600 700 800 900

電壓(V) 013 018 023 028 033 038 043 049 054

頻率

(Hz) 1000 2000 3000 4000 5000 6000 7000 8000 9000

電壓(V) 059 109 16 209 257 304 3508 4006 45

31

圖 316 頻率對電壓曲線

35 單晶片介面電路

單晶片介面包括了二大部分分別為單晶片 8051AD converter

〈1〉8051 單晶片

為本控制系統的核心一切動作皆經由它控制

〈2〉AD converter

將類比開關所送出來的類比訊號經由 ADC 0804 轉換成數位訊號傳送

到單晶片的輸入埠

351 AD 轉換

以單晶片 8051 控制 ADC0804則單晶片 8051 必須下達ldquo開始轉換rdquo的命令

給 ADC0804然後 ADC0804 就開始讀入類比輸入端的電壓在內部開始轉換

經過一段轉換時間後〈約 100μ s〉ADC0804 就將轉換完成的值放在其內部的三

態輸出栓鎖緩衝器裡然後將轉換完成輸出腳〈INTR〉降為 low以通知單晶片

可以去讀轉換完成資料

當WR和CS 同時為ldquo0rdquo時表示對 ADC0804 下達ldquo開始轉換rdquo命令再經過

32

一段轉換時間〈100μ s〉後轉換完成ADC0804 會將其轉換完成的數位資料放

在其內部 8 位元緩衝區裡且將 INTR 降為ldquo0rdquo因此單晶片只要下達ldquo開始轉換rdquo

命令後去檢查 INTR 的狀態就可以知道是否轉換完畢其方法有兩種

1 輪詢法〈polling〉

2 中斷法〈interrupt〉

所謂輪詢法就是將 ADC0804 的 INTR接到 CPU 的一條 IO 線上然後以軟體指

令主動偵測其狀態當偵測到為ldquo0rdquo時就可以去讀出 ADC0804 裡的緩衝區的轉

換值

中斷法是一個很理想的 IO 方式因為不像輪詢法必須讓 CPU 等 ADC0804

轉換當 CPU 下達ldquo開始轉換rdquo命令後就可以做其他工作當 ADC0804 轉換完

畢後 INTR會降為ldquo0rdquo可以利用此信號去中斷 CPU再由中斷副程式去讀入

轉換值即可因此大大提高了程式的效率

當 CPU 接收到 ADC0804 發出ldquo轉換完畢rdquo的信號〈 INTR =0〉後就可以去

讀出轉換值其讀出的方法是將CS 與RD設為ldquo0rdquo即可讀到轉換值這個讀值的

動作又會使得 INTR恢復成ldquo1rdquo

1 CPU 下達ldquo開始轉換rdquo命令〈CS =0WR =0〉

2 ADC0804ldquo轉換完畢rdquo 〈 INTR =0〉

3 CPU 讀取轉換值〈 RD =0CS =0〉

4 讀完後 INTR =1

ADC0804 主要規格摘要如下

1 +5V 單電源工作電壓

2 類比電壓輸入範圍 0~+5V

33

3 參考電壓為 25V

4 轉換時間為 100μ s〈 CLKf =640kHz〉

5 解析度為 8 位元

6 誤差plusmn 1LSB

7 讀取時間 135ns

36 電源供應系統

本專題中所有電路及硬體設備所需的電源採用交流電源 110V 經由 PT-31

變壓器後再經過橋式整流後提供了直流電源而因為各個電路所需電源不同

因此製作了多組的變壓電路如下

1電壓源 DC5V選擇了 7805 的穩壓 IC 搭配電容得到了+5V 的電壓源

供〈1〉8051 微處理器 〈2〉ADC 0804 〈3〉74LS8674LS12374LS04

74LS02CD4013 〈4〉馬達 Encoder

2電壓源 DC12V使用 7812 穩壓 IC 搭配電容得到+12V 的電壓源供

LM2917 使用

3電壓源 DC24V利用 7824 的穩壓 IC 搭配電容獲得+24V 的直流電壓

源供電路之橋型驅動功率放大之電晶體使用

Vin1

+12V2

GND3

LM7812

2200uF 10000pF 2200uF 10000pF

+12V outputAC

圖 317 直流電源電路

34

圖 318 直流電源電路實體圖

37 馬達轉速的量測

表 33 PWM 輸出對應 encoder 週期

PWM dutycycle encoder 週期 PWM dutycycle encoder 週期

40 sμ 172 sμ 440 sμ 0 sμ

80 sμ 188 sμ 480 sμ 0 sμ

120 sμ 204 sμ 520 sμ 0 sμ

160 sμ 230 sμ 560 sμ 0 sμ

200 sμ 272 sμ 600 sμ 0 sμ

240 sμ 328 sμ 640 sμ 0 sμ

280 sμ 416 sμ 680 sμ 1320 sμ

320 sμ 540 sμ 720 sμ 750 sμ

360 sμ 800 sμ 760 sμ 510 sμ

400 sμ 1320 sμ 800 sμ 400 sμ

35

圖 319 PWM 輸出對應 encoder 週期

由統計可知道此馬達並不是一顆線性馬達故相信若使用模糊控制理論來

作為其回授控制系統的控制器一定能達到比傳統控制器的性能還要好而且若能

在模糊控制裡加上 PID 控制器的觀念一定能在系統的響應時間上升時間

安定時間和超越量達到最佳的控制另一方面馬達在其反方向的內阻較大需

要更大的力量才能使馬達驅動

36

第四章 軟體規劃與製作

41 PWM 之軟體設計

因為之前所介紹的硬體方式是以調整可變電阻來達到轉速的調整因此無法

得知所給予的脈寬長度和轉速大小尤其在回授時也不易給予適當的訊號來調整

轉速因此改良之方法就是以8051之軟體撰寫方式來產生固定的脈寬也就等

於給予轉速的命令而在其回授控制時也只要在內部程式给予適當的指令便可

達到脈寬長度的調整以達到閉迴路之受控系統

411 PWM 軟體流程

設定Timer0模式為0

TH0 = temp 32 TL0 = temp 32

temp = 8192 ndash j4 Key = 0

檢查是否有鍵值

將鍵值存入Key

Yes

No

設定Key值所對應的 j值

If P30 == 1Then P30 = 0 temp = 8192 ndash j4Else P30 = 1 temp=8192ndash880+j4

TH0 = temp 32 TL0 = temp 32

Start Timer0中斷副程式

啟動Timer0

等待Timer0中斷

返回主程式

圖 41 PWM 軟體設計流程圖

37

在此總共設計了五個按鈕分別代表不同的轉速停止正轉〈慢〉正轉

〈快〉逆轉〈慢〉和逆轉〈快〉使用Timer0是因為8051之計時中斷比延遲程

式來的準確故可以達到準確的計時程式設計理念中並沒有將中斷致能清除

因此Timer0會一直處於計時的狀態程式執行時將一邊檢查鍵值〈KeyStatus〉一

邊進行計時當計時完畢便呼叫中斷副程式然後執行改變Port 30的輸出狀

態若是為high則變為low反之若是為low即變為high同時並重設計時時間

Timer0繼續計時

當鍵值改變時計時的時間也會跟著改變如此一來Timer0將ㄧ直重覆上

述動作直到電源切掉Timer0才會停止計時

42 模糊控制之程式規劃與撰寫

本專題目標在完成了先前所規劃的硬體電路之後接著就是要達成利用模糊

控制理論來設計控制器在此採用了單晶片8051目的是為了以硬體實現方式來

代替電腦模擬期望能夠按照原訂計畫完成本專題「具模糊控制理論與雙脈寬調

變法之直流馬達驅動電路設計」

單晶片 8051 模糊控制的程式撰寫採下列幾個步驟依序完成

1 設定變數轉速誤差〈dspeed〉目前轉速〈sspeed〉

2 模糊化採用三角形歸屬函數採用三角形歸屬函數的原因

〈1〉 三角形函數為一連續函數

〈2〉 三角形函數為線性的函數所以計算速度較快

〈3〉 是具有發散也有收斂的函數和指數函數一樣接近

事實

3 模糊推論模糊規則將其所有可能發生情況以 IFhellipTHENhellip表示

並建立控制規則表

4 解模糊化採用重心法

38

421 歸屬函數

設定變數為目前轉速〈sspeed〉與轉速誤差〈dspeed〉因此此模糊控制器共

有兩個輸入訊號與一輸出訊號輸出訊號為脈寬長度該加或是減多少又因為有

五種不同的轉速因此各分別設計了不同的歸屬函數如下

1 當轉速 = 0

ml h

s s p e e d

d s p e e d

r p m0 5 0 1 0 0- 5 0- 1 0 0

mv l l h v h

r p m0- 3 0- 6 0- 1 0 0 3 0 6 0 1 0 0 圖 42 停止時之歸屬函數

2 正轉〈慢〉

ml hsspeed

dspeed

rpm150 225 300750

mvl l h vh

rpm150100500 200 250 300

圖 43 正轉〈慢〉之歸屬函數

39

3 正轉〈快〉

ml hsspeed

dspeed

rpm520 670 820370220

mvl l h vh

rpm500400300200 600 700 800

圖 44 正轉〈快〉之歸屬函數

4 逆轉〈慢〉

ml hsspeed

dspeed

rpm100 250 400500

mvl l h vh

rpm10050250 200 300 400 圖 45 逆轉〈慢〉之歸屬函數

40

5 逆轉〈快〉

ml hsspeed

dspeed

rpm300 450 600150

mvl l h vh

rpm450350250150 550 650 750

750

圖 46 逆轉〈快〉之歸屬函數

6 輸出

OutputMVL L H VH

rpm0-50-150-250 50 150 250

圖 47 輸出之歸屬函數

41

422 模糊規則庫

表 41 為吾人所設計的模糊控制規則庫並利用 Matlab 之 Fuzzy ToolBox 來

建立此規則庫以進行模擬推論圖 48 為當馬達輸入指令為正轉慢時推論後所得

到的三維空間圖

表 41 模糊控制規則表

Dspeed

vl l m h vh

l H M L VL VL

m VH H M L VL sspeed

h VH VH H M L

圖 48 推論後的三維空間圖

42

423 模糊控制器之軟體設計流程

Start 外部中斷副程式

ADCWR = 0 ADCWR = 1

〈令AD開始轉換〉

檢查鍵值以得到對應的歸屬函數

取得目前轉速與

轉速誤差

Fuzzy Rules決策

得到輸出訊號

Delay 10ms

ADC = 0 讀取AD值 ADCRD = 0

將AD值換算成轉速

ADCWR = 0 ADCWR = 1

〈AD開始轉換〉

返回主程式

致能外部中斷

圖 49 Fuzzy Controller 程式流程圖

當控制器一開始動作時便先執行AD轉換的工作當AD轉換完成時其

INTR的接腳便會觸發8051的外部中斷INTR0於是程式便發生外部中斷執行

外部中斷副程式的指令

43

在外部中斷副程式中AD將ㄧ直進行轉換與讀取的工作同時並將轉換後

的值直接換算成目前轉速與轉速誤差以供模糊控制器使用換算目前encoder

的頻率其公式為

160-V2000 times=頻率 〈4-1〉

式4-1之公式是根據表31所導出來的其中V為encoder之頻率轉成電壓之值

又假設所讀取的AD轉換值為value因為

AD的解析度 = bit256

5V+ = 511 ( Vbit ) 〈4-2〉

故value值與電壓V之關係為

511 value V times= 〈4-3〉

所以encoder之頻率與value值的關係為

頻率= 2000times ⎟⎠⎞

⎜⎝⎛ times

511 value - 160 〈4-4〉

故目前轉速為

sspeed = ( )rpm 60 200

times頻率 〈4-5〉

另ㄧ方面在主程式中程式會先去檢查鍵值也就等於檢查輸入指令以

找出符合使用的歸屬函數並將AD所獲得的轉速對應到歸屬函數中然後執行

決策判斷即進入規則庫中尋找出適當的決策判斷最後將此決策送入PWM程

式裡進行脈寬長度的調整使馬達在合理的要求下達到理想的轉速控制不會

因為外在環境的影響而使馬達轉速受到干擾

43 LCD 顯示轉速

此專題最後再增加一LCD顯示幕以顯示目前的轉速否則在程式設計完成

後人卻因無法以肉眼得知目前轉速而不能肯定馬達轉速是否有達到控制的目

標因此增加一顯示幕LCD是有必要的不僅隨時得知目前的轉速還能知道

44

設計出來的軟體其控制性是否夠好夠穩定

431 LCD 顯示幕之軟體流程

Start

設定LCD模組的初始狀態

設定外部中斷INTR0

與Timer0

設定TH0 = (65536 ndash 5000) 256 TL0 = (65536 ndash 5000)256

令ADCWR = 0 ADCWR = 1 AD開始轉換

等待中斷

外部中斷副程式

ADCRD = 0 讀取AD值 ADCRD = 1

將AD值換算成速度

ADCWR = 0 ADCWR = 1 AD開始轉換

Timer0中斷副程式

顯示LCD第一行

ldquoMotor Speed =

顯示LCD第二行ldquoxxxxxxx rpm其中 xxxxxx為外部中斷副程式所換算出的轉速

重設TH0與TL0

返回主程式返回主程式

圖 410 LCD 顯示幕之程式流程圖

此程式主要由兩個部分完成一為外部中斷副程式另ㄧ為 Timer0 中斷副

程式當主程式完成外部與 Timer0 兩個中斷的設定後隨即命令 AD 開始轉換

之後便一直停在 while〈1〉的迴圈裡不做任何動作而由兩個中斷副程式來完

成整個轉換與顯示的工作

45

外部中斷副程式主要負責 AD 的轉換讀取與轉速換算的工作AD 第一

次的轉換由主程式來下達命令當轉換完成後AD 的 INTR 接腳將觸發外部中

斷〈INTR0〉副程式此時程式便進入外部中斷副程式執行讀取 AD 值與轉速

換算的工作當這些工作完成時外部中斷副程式再次下達 AD 開始轉換的命

令而離開中斷副程式當 AD 再次轉換完成時又將再次執行中斷副程式

如此週而復始中斷副程式將ㄧ直進行讀取換算與轉換的工作

而 Timer0 中斷副程式主要負責 LCD 顯示之工作當主程式所設定的計時時

間計數完時程式便進入 Timer0 中斷副程式一旦進入 Timer0 中斷副程式程

式將執行 LCD 的顯示然後再重設 Timer0 的計數時間Timer0 將重新計數當

計數完時程式又將再度進入 Timer0 中斷副程式執行因為程式中並無清除

Timer0 的中斷致能故 Timer0 中斷副程式和外部中斷副程式ㄧ樣週而復始的

執行其副程式的工作

46

第五章 結論

本計劃主旨為具模糊控制理論與雙脈寬調變法之直流馬達驅動電路設計主

要是針對傳統電路設計之缺點提出改良之方法以TPWM取代PWM電路以模

糊理論基礎設計之控制器替代傳統PID控制器

TPWM轉速控制優於PWM之處在於

1 TPWM只需使用單電源即可達到正轉和逆轉的轉速控制而PWM必須

加上逆向開關或是雙電源才能使馬達產生正轉和逆轉

2 TPWM可控制馬達處於停止狀態無論在正向或逆向加上負載皆無法使

馬達產生轉動

3 馬達消耗定額功率輸出轉矩為額定值

4 馬達由停止到某定轉速時反應時間較快

模糊控制器優於PID控制器

1 不須導出繁雜的數學模型

2 適用於非線性系統

3 強健性與容錯性較高

本專題至此雖說大致的目標都已達到但是此系統仍然有許多不完美而需要

改進的地方例如在實驗過程中發現整個轉速的控制在回授上其反應時間

有點慢探討其原因有可能是控制器之程式上的問題

1 因為使用C語言撰寫程式故其執行速度較慢

2 程式可能寫的太累贅

3 模糊控制規則庫建立不良

若想改善這些問題可以嘗試著將C語言改為組合語言來撰寫並盡量減少

47

不必要的指令相信此動作一定能大大提昇程式的執行速度其次就是多做測

試利用測試中所學到的經驗來幫助模糊控制規則庫的改寫同時也能從測試中

發現更多的問題若是都能對問題加以一一解決的話相信必定能將此控制系統

做的更盡善盡美

48

參考文獻

﹝1﹞ 李適中直流馬達速度控制伺服控制〈基礎篇〉全華科技圖書股份有

限公司民 74

﹝2﹞ 廖錦文ldquo直流電動機之雙脈寬調變是〈TPWM〉驅動電路研究電

子技術月刊第 69 期pp94-1021992

﹝3﹞ 楊英魁孫宗瀛鄭魁香林建德蔣旭堂模糊控制理論與技術全華

科技圖書股份有限公司民 85

﹝4﹞ 林敦煌陳憬德直流馬達定位及轉速的模糊控制逢甲大學自動控制工

程學系學士論文民 87

﹝5﹞ LAZadehldquo Fuzzy Sets Information and Control Vol8 pp338-353

1965

﹝6﹞ EHMamdani and SAsslianldquo A fuzzy logic controller for a dynamic

plant Internation Journal of Man-Machine Studies Vol7 pp1-13 1975

﹝7﹞ 孫宗瀛楊英魁Fuzzy 控制理論實作與應用全華科技圖書股份有

限公司民 83 年

﹝8﹞ 許中平黃煌嘉直流電動機控制電路設計全華科技圖書股份有限公司

民 75

﹝9﹞ 盧明智黃敏祥OP Amp 應用+實驗模擬全華科技圖書股份有限公司

民 83

﹝10﹞陳文耀電動機控制工程復文書局2003

﹝11﹞許中平林全福電動機運轉控制技術全華科技圖書股份有限公司民

77

﹝12﹞楊明豐8051 單晶片 C 語言設計實務碁峯資訊2003 年

﹝13﹞蔡朝洋單晶片微電腦 80518951 原理與應用全華科技圖書股份有限公

司民 91

49

﹝14﹞王文俊認識 Fuzzy全華科技圖書股份有限公司民 90

50

附錄 A 專題硬體展示圖

圖 A-1 硬體整體圖

圖 A-2 硬體整體鳥瞰圖

51

圖 A-3 硬體側視圖

圖 A-4 操作與顯示面板

圖 A-5 間距脈波電路與 FV 電路

52

圖 A-6 橋型驅動功率放大電路

圖 A-7 操作與控制面板

53

附錄 B PWM 與模糊控制之程式

include reg51h include stdioh sbit ADCRD = P3^1 設定 RD 控制線接腳為 P31 sbit ADCWR = P3^3 設定 WR 控制線接腳為 P33 sbit P2_0 = 0xA0 接腳定義 sbit P2_1 = 0xA1 接腳定義 sbit P3_0 = 0xB0 接腳定義 sbit P3_1 = 0xB1 接腳定義 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P3_6 = 0xB6 接腳定義 void KeyStatus(void) 函數原型宣告 void feedback(void) 函數原型宣告 void compute_grade(void) 函數原型宣告 void delay1ms(int count) 函數原型宣告 void convert() 函數原型宣告 void condition() 函數原型宣告 void CW(void) 函數原型宣告 int j i 對應 PWM 的寬度 unsigned int temp 所設計的計時器時間 int sample = 1000 取樣率設定消除顯示值跳動 long int value r1 讀取 ADC0804 數位資料 long int set n condition select long int r grade_reg[2] grade[15] error1 error2 long int a1 b1 I long int membership[5][3]membership1[3][3] 定義歸屬函數 long int membership2[3][3] = -10-50-5050510 long int error[2] int Rule[15][3] = 113213313 定義判斷規則庫 212223323 311232333 411241342 511251351

54

main() 主程式 j = PWM = 110 設定 PWM 初始值 IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x00 設定計時器 0 工作於模式 0 temp=8192-j4 設定計時器 0 初值 TH0 = temp 32 TL0 = temp 32 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 P3_4 = 1 P3_5 = 0 P3_6 = 0 ADCWR = 0 令 ADC0804 的 WR = 0 ADCWR = 1 令 ADC0804 的 WR = 1 while (1) KeyStatus() 檢查鍵值 void KeyStatus(void) 檢查鍵值並給對應的 PWM 值 char KeyScan(void) 按鍵掃描函數宣告 unsigned char KeyStatus unsigned char Key = 0 KeyStatus=KeyScan() 呼叫按鍵掃描函數 if (KeyStatus = 0) 已有按鍵輸入 Key = KeyStatus Key = 鍵值 if (Key == 0x01) 假如輸入為按鍵 1 i = 110 PWM 為 110us j = i P3_4 = 1 LED 亮第一顆〈表馬達停止〉 P3_5 = 0 P3_6 = 0

55

else if (Key == 0x02 ) 假如輸入為按鍵 2 i = 140 PWM 為 140us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x04 ) 假如輸入為按鍵 3 i = 180 PWM 為 180us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x08 ) 假如輸入為按鍵 4 i = 80 PWM 為 80us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 else if (Key == 0x10 ) 假如輸入為按鍵 5 i = 40 PWM 為 40us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 PWM = j delay1ms(10) 呼叫延遲函數 feedback() 模糊控制判斷

56

void To_int(void) interrupt 1 Timer0 中斷函數 if (P3_0 == 0) 假如 PWM 輸出為 Low P3_0 = 1 變更 PWM 輸出為 High temp=8192-j4 設定 High 的時間 else 若 PWM 輸出為 High P3_0 = 0 變更 PWM 輸出為 Low temp=8192-880+j4 設定 Low 的時間 TH0 = temp 32 Timer0 的計時時間 TL0 = temp 32 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 char KeyScan(void) 檢查鍵值 char KeyStatus 按鍵狀態 P0=0xff 設定 P0 為輸入模式 KeyStatus=~P0 讀取按鍵狀態 return(KeyStatus) 將鍵值送回程式 void feedback(void) 模糊判斷 void Fuzzycontroller() 函數原型宣告 void condition1() 函數原型宣告

57

void condition2() 函數原型宣告 error1 = ((value)40-160)03 輸入變數 1 delay10ms(10) 延遲 10ms error2 = ((value)40-160)03 輸入變數 2 if (key == 0x01 ) 當按鍵 1找出對應的歸屬函數 並做出模糊控制判斷

int membership[5][3]= -100-60-30-60-300-30030030603060100

int membership1[3][3]=-100-500-50050050100 Fuzzycontroller() condition() if (key == 0x02 ) 當按鍵 2找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

05010050100150100150200150200250200250300 int membership1[3][3]=07515075150225150225300 Fuzzycontroller() condition() else if (key == 0x04) 當按鍵 3找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

200320400300400500400500600500600700600700800 int membership1[3][3]=220370520370520670520670820 Fuzzycontroller() condition() else if (key == 0x08) 當按鍵 4找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

02550255010050100200100200300200300400 int membership1[3][3]=05010050100250100250400 Fuzzycontroller() condition()

58

else if (key == 0x10) 當按鍵 5找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

150250350250350450350450550450550650550650750 int membership1[3][3]=150300450300450600450600750 Fuzzycontroller() condition2() void Fuzzycontroller() 模糊控制判斷 void compute_grade() 函數原型宣告 void compute_grade1() 函數原型宣告 a1 = 0 b1 = 001 I = 0 for (n=0 nlt=14 n++) r = error1 set = Rule[n][0]-1 compute_grade() 計算輸入變數 1 與

模糊程度的歸屬函數 condition = 1 r = error2 set = Rule[n][1]-1 compute_grade1() 計算輸入變數 2 與 模糊程度的歸屬函數 grade[n] = MIN(grade_reg[0] grade_reg[1]) a1 = a1 + (grade[n]membership2[Rule[n][2]-1][1]) b1 = b1 + grade[n] I = a1 b1 得到模糊控制判斷的結果 void compute_grade() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership[set][0]) || (r gt membership[set][2])) 當輸入變數不在 歸屬函數內

59

grade_reg[condition] = 0 else if ((r gt membership[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership[set][2]-r) (membership[set][2] - membership[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership[set][0]) (membership[set][1] - membership[set][0]) void compute_grade1() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership1[set][0]) || (r gt membership1[set][2])) 當輸入變數不在 歸屬函數內 grade_reg[condition] = 0 else if ((r gt membership1[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership1[set][2]-r) (membership1[set][2]-membership1[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership1[set][0]) (membership1[set][1]-membership1[set][0])

60

void condition() P2_0 = 1 設定 P20 為輸入模式 P2_1 = 1 設定 P21 為輸入模式 if ( (P2_0 == 1) ampamp (P2_1 == 0)) 當馬達為正轉時 if ( I gt 0 ) 若模糊判斷結果為正 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 若模糊判斷結果為零 PWM = PWM + 0 PWM 寬度不變 if ( I lt 0 ) 若模糊控制結果小於零 PWM = PWM + 1 PWM 寬度加 1 else if ( (P2_0 == 0) ampamp (P2_1 == 1) ) 若馬達為反轉 if ( I lt 0 ) 模糊控制小於零 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 模糊控制等於零 PWM = PWM + 0 PWM 寬度不變 if ( I gt 0 ) 模糊控制大於零 PWM = PWM + 1 PWM 寬度加 1 CW() 判斷 PWM 寬度上下限

61

void CW() 判斷 PWM 寬度上下限 if ( PWM gt= 215 ) 若 PWM 寬度 gt= 最大寬度 j = 215 PWM 寬度維持於 215us if ( PWM lt= 5 ) 若 PWM 寬度 lt= 最小寬度 j = 5 PWM 寬度維持在 5us if ( PWM gt 5 ampamp PWM lt 215 ) PWM 寬度介於最大與最小間 j = PWM PWM 依模糊控制判斷結果增減 void delay1ms(int count) 延遲 1ms int x y for ( x = 0 x lt count x++ ) for ( y = 0 y lt 122 y++ ) void convert() 數位資料換算成馬達轉速 r1 = ((value)40)-160

62

附錄 C LCD 顯示之程式

includereg51h 含 8051 所有暫存器宣告 include mathh define RS P3_5 LCD 指令資料選擇控制 define RW P3_4 LCD 讀寫控制腳 define Enable P3_3 LCD 致能接腳 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P0_0 = 0x80 接腳定義 sbit P0_1 = 0x81 接腳定義 sbit P0_2 = 0x82 接腳定義 sbit P0_3 = 0x83 接腳定義 sbit P0_4 = 0x84 接腳定義 sbit P0_5 = 0x85 接腳定義 sbit P0_6 = 0x86 接腳定義 sbit ADCRD = P3^7 設定 RD 控制線接腳為 P37 sbit ADCWR = P3^6 設定 WR 控制線接腳為 P36 void delay(void) 函數原型宣告 void delay10ms(int count) 函數原型宣告 void display(void) 函數原型宣告 void InitialLCD(void) 函數原型宣告 void WriteIns(char) 函數原型宣告 void WriteData(char) 函數原型宣告 void WriteString(charchar) 函數原型宣告 void CheckBusy(void) 函數原型宣告 void convert(void) 函數原型宣告 char MSG0[] = Motor Speed = 定義字串 MSG0 char MSG2[] = rpm 定義字串 MSG2 unsigned char MSG1[8]=0000000 定義字串 MSG1 unsigned long int value 讀取 ADC0804 數位資料 int sample = 1000 取樣率設定消除顯示值跳動 long int rpm

63

main() 主程式 InitialLCD() 初始化 LCD IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x01 設定計時器 0 工作於模式 1 TH0 = (65536-5000)256 設定計時器 0 初值 TL0 = (65536-5000)256 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 while(1) 等待中斷 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 while (--sample == 0) 取樣率減 1 sample = 1000 重設取樣率 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 void T0_int(void) interrupt 1 LCD 顯示動態掃描 display() 動態掃描顯示 TH0 = (65536-65535)256 重設計時初值 TL0 = (65536-65535)256

64

void InitialLCD(void) 設定 LCD 模組初始狀態 delay() 延遲函數 WriteIns(0x38) 設定 LCD 模組為 WriteIns(0x38) 2 行顯示 WriteIns(0x38) 8 位元介面 WriteIns(0x38) 5x7 點字型 WriteIns(0x08) 關閉顯示器 WriteIns(0x01) 清除 LCD 螢幕 WriteIns(0x0c) 令顯示器 ON但游標不顯示 WriteIns(0x06) 令 LCD 模組每接收到 1Byte 資料 AC 值自動加 1 void display() 掃描顯示 WriteIns(0x80) 設定 LCD 座標 WriteString(13MSG0) 將字串 MSG0 寫入 LCD 中 WriteIns(0xc0) 設定 LCD 座標 WriteString(8MSG1) 將字串 MSG1 寫入 LCD 中 WriteIns(0xc8) 設定 LCD 座標 WriteString(4MSG2) 將字串 MSG2 寫入 LCD 中 void convert(void) 換算轉速 long int freq freq = ((value)4000) - 16000 數位資料換成頻率公式 rpm = freq3 頻率換算轉速公式 MSG1[0] = (rpm1000000)+0x30 將結果存入字串 MSG1 中 MSG1[1] = ((rpm1000000)100000)+0x30 MSG1[2] = ((rpm100000)10000)+0x30 MSG1[3] = ((rpm10000)1000)+0x30 MSG1[4] = 0x2e MSG1[5] = ((rpm1000)100)+0x30 MSG1[6] = ((rpm100)10)+0x30 MSG1[7] = rpm10+0x30

65

void WriteIns(char instruction) 寫命令至 LCD 中 RS = 0 選擇指令暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = instruction 輸出命令至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteData(char i) 寫資料至 LCD 中 RS = 1 選擇資料暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = i 輸出資料至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteString(countMSG) 寫字串至 LCD 中 char count 字串長度 char MSG[] 字串資料 char i 定義位元組變數 for(i=0 iltcount i++) count 個位元組 WriteData(MSG[i]) 寫入一位元組的資料至 LCD 中 void CheckBusy(void) char i=0x80 檢查忙碌旗標 while(iamp0x80) 忙錄旗標 BF = 1 RS = 0 選擇指令暫存器 RW = 1 讀取 Enable = 1 致能 LCD i = P2 讀取 LCD 指令暫存器內的資料

66

Enable = 0 除能 LCD delay() 延遲函數 void delay() 延遲 5ms int i for(i=0 ilt250 i++)

  • 畢業專題封面pdf
  • File0004pdf
  • 最終版pdfpdf
Page 27: Based on Fuzzy Control Theorem and TPWM Method for DC ... · 使吾人想設計一模糊控制器來做為馬達轉速的閉迴路控制,以解決非線性系統的 問題。除此之外,flcs

18

32 雙脈寬調變法之直流馬達驅動電路設計

本專題製作的雙脈寬調變法之直流馬達驅動電路設計大致可以分為二大部

分第一雙脈寬調變法之電路設計第二橋型驅動功率放大電路

雙脈寬調變〈Two Pulse Width Modulation簡稱TPWM〉之電路設計主要

是先製作一脈寬調變〈Pulse Width Modulation簡稱PWM〉波形然後再將此

波形各別經由一緩衝器〈buffer〉和反向器〈inverter〉則可產生AB驅動信號

脈波此即為TPWM

321 脈寬調變電路

如圖32先利用兩顆op產生三角波電路再利用一個比較器比較三角波

和誤差值之大小

150k

1M

20k

+12V

-12V

+12V

-12V10k

+12V

-12V

10k

+12V

-12V-

+-

+

-

+ PWMLM324

LM324

LM324

2200pF

圖 32 脈寬調變電路

〈1〉 三角波產生電路

三角波產生電路通常至少需要兩個運算放大器其電路如圖33OP1

為一個反相積分器OP2為一個史密特磁滯比較器將OP2的輸出方波經

19

OP1反相積分以後得到Vo1三角波此三角波又同時加到OP2控制其狀

態的改變

當方波產生器的輸出是正的則三角波產生器的輸出是斜向負相似

地當方波產生器的輸出是負則三角波產生器的輸出是斜向正這個動

作將產生三角波的輸出同時也輸出方波﹝9﹞

+VCC

-VCC

-

+

R1

R2

R3

+VCC

-VCC

-

+

OP1

OP2

Vo2Vo1

圖 33 三角波產生電路

對OP2而言是磁滯比較必須先找到OP2的 THV 和 TLV

232

21

32

3oo v

RRR

vRR

Rv

++

+=+ 〈31〉

當 0=+v 時

23

21 oo v

RR

v minus= 〈32〉

表要達到OP2的 0=+v 必須有這麼大的 1ov

當 12 sato Ev = 時

TLsato VERR

v =minus= 13

21 〈33〉

當 22 sato Ev minus= 時

THsato VERR

v =+= 23

21 〈34〉

20

對OP1而言是反相積分器 2ov 為其輸入 1ov 為其輸出則

tCIt

Rv

Ct

CRv

dtvCR

v oooo

11

2

11

22

111

11minus=minus=minus=minus= int 〈35〉

因為

1

2

Rvv

I o minusminus= 0=minusv 〈因為虛接地〉 〈36〉

所以

1

2

Rv

I o= 〈37〉

又因運算放大器的輸入阻抗非常大則流經 1C 的電流也為 I 相當於以定

電流對電容C 充電

當 12 sato Ev = 時 1ov 為下降斜波

tR

EC

v sato

1

1

11

1minus= 〈38〉

當 22 sato Ev minus= 時 1ov 上升斜波

( )

tRE

Cv sat

o1

2

11

1 minusminus= 〈39〉

由此可知三角波的上升與下降斜波乃因 1C 的充電與放電且時間

常數為 11CR

三角波週期分析如下

1 上升斜波的時間 1T

tCR

vv o

o1

1

21 minus= 11

2

1 CRvv

to

ominus=

1Tt = TLTHo VVv minus=1 22 sato Ev =

11111

21

sat

TLTH

sat

TLTH

EVV

CRCRE

VVT

minus=

minusminus= 〈310〉

2 下降斜波的時間 2T

tCR

vv o

o1

1

21 minus= 11

2

1 CRvv

to

ominus=

21

2Tt = THTLo VVv minus=1 12 sato Ev =

1

11111

1sat

TLTH

sat

THTL

EVV

CRCRE

VVT

minus=

minusminus= 〈311〉

3 週期 21 TTT +=

若 1satE = 2satE = satE 且3

22RR

VV TLTH =minus satE

3

2114

RR

CRT=

若R3 = nR2

則nCR

T 114=

114 CR

nf = 〈312〉

《實驗結果》

必須注意的是三角波的頻率太低將導致馬達的轉動產生脈動現象

故將工作頻率設計在1kHz以上

Ω= k1501R Ω= k102R

Ω= k203R pFC 22001 =

所得到的三角波頻率為

15kHz10220010001504

00010100020

f 12- =timestimestimestimes

timestimes

=

圖 34 三角波輸出波形

22

〈2〉 脈寬調變電路〈PWM〉

+12V

-12V

10k

+12V

-12V -

+ PWM輸出LM324三角波輸入

圖 35 脈寬調變電路

PWM系統往往連接至直流電源供應放大器的工作是以固定的頻率開

閉直流供應電壓其激發角是可以調整的因此得到波寬可調的輸出

將固定頻率的三角波與反向輸入的電壓做比較便可輸出一脈寬〈見圖

36〉反向電阻值的不同將導致反向輸入電壓不同故其輸出為一可調但

頻率固定的脈寬也正因為如此故稱為脈寬調變〈PWM〉由於輸出的

dutycycle不同故馬達將接收到不同的平均電壓因而可以藉由PWM控制

馬達的轉速

反相輸入電壓

PWM

圖 36 三角波與反相輸入電壓比較

23

PWM的優點在於馬達驅動電路的電晶體之控制信號改以脈波列來控

制使電晶體操作成類似開關的動作不是完全導通就是完全截止故電晶

體不是一直操作於作用區所以其功率消耗不大整體效率較高

《實驗結果》

圖 37 PWM 輸出波形

322 橋型驅動功率放大電路

如圖38所示主要由四個功率電晶體組成利用不同的電晶體對使直流

馬達做正逆轉控制當Q5Q8導通使馬達正轉當Q6Q7導通馬達則逆

轉電路中的電晶體扮演開關的作用

此種電路簡單只要一組直流電源供應且電晶體分擔了部份的電壓保護

電晶體迅速工作於截止與飽和狀態之間故沒有功率散逸損失之虞

但是在設計時切勿使Q5Q6同時導通以免燒毀電路上之元件因為在

AB兩脈波短暫的交變時間內由於電晶體本身之最小延遲時間有可能使Q5

Q6同時ON與Q7Q8在很短時間同時ON因此在15kHz交變下容易燒毀功

率電晶體

因此設計一間距脈波電路主要之功用使Q5Q6和Q7Q8均不同時導通

24

以拉長AB兩者交換時間

M

20k

10k

20k

10k

+24V

A 信號 B 信號

2N3055 2N3055

2N2955 2N2955

1N40021N4002

C1815 C1815

C1815 C1815

Q5

Q8Q6

Q7

圖 38 橋型驅動功率放大電路

圖 39 橋型驅動功率放大電路實體圖

25

此外若考慮電晶體BE間的電壓則電路會出現約 plusmn 06V的不感帶〈ded

band〉即電晶體的 oV 對 inV 間的關係如圖3101假使 inV 電壓為正弦波則 oV 變

成如圖3102為了改善這種缺失吾人利用兩個二極體接在電路上如圖38

用來補償電晶體BE間的壓降﹝10﹞

約06V

Dead band

Vo

Vin

圖 3101 呈現不感帶的轉移函數

圖 3102 輸出電壓波形

26

323 間距脈波產生電路

RCext15

Cext14 74123

A3

B2

Q13

CLR1

Q4

7486100k

2200pF

10k

10000pF

+5V

間距脈波輸出

圖 311 間距脈波產生電路

間距脈波的產生方式是根據脈寬調變〈PWM〉後的訊號再經由積分電路的

電阻兩端取出且經由兩倍頻器〈74LS86〉檢示出PWM的正負緣脈波最後

再利用單穩態IC〈74LS123〉將檢出信號之脈寬拉長至01ms此即為間距脈波

74LS123有兩個輸入端子A及B分別為下降波緣輸入端子及上升波緣輸入端

子當輸入A之脈波由ldquoH變成ldquoL之瞬間Q輸出變為ldquoH其持續時間長

短由RC時間常數決定反之當輸入B之脈波由ldquoL變成ldquoH之瞬間Q輸出

變成ldquoH維持一定時間

74LS123的輸出脈波之寬度是由電阻及電容之時間常數所決定概略計算公

式如下

CR045T timestimes=

電容 C 必須大於 1000pF

27

《實驗結果》

R=24kΩ C=10000pF

所以得到間距脈波為

( )msec0110810000p24k045T cong=timestimes= μ

圖 312 間距脈波

研究經分析後發現

1 間距 T 愈大愈能確保電路之安全性愈有保護作用

2 間距 T 愈大相對的使驅動信號脈波減少愈多造成馬達旋轉扭力大

大減弱

3 適當的間距 T不但不會影響馬達的輸出轉矩而且兼具保護電路的

效果

33 編碼器

轉動編碼器不只可以作為轉速的感測也能做位置的感測又適合於數位處

理故被廣泛使用若就信號來看轉動編碼器可分為增量型與絕對型若以檢

測的方式來分可分為光學式和磁式兩種在本專題中所使用的編碼器為光學式

增量型編碼器﹝11﹞

光學式轉動編碼器的原理如圖 313在附有細縫轉盤的兩側分別裝置發光元

28

件與受光元件如果只有一組光電檢測元件則輸出信號就只有一相的脈波信

號此種裝置稱為脈波產生器圖 314 為增量型轉碼器的輸出信號它是利用

兩組光電元件所產生的脈波信號A 相和 B 相間有相位差正轉時 A 相領前 B

相逆轉時 B 相領前 A 相因此利用此兩相做檢測馬達為正轉或逆轉的工作

並利用 A 相或 B 相的頻率檢測出目前的轉速

吾人計算出編碼器每一轉可以產生約 200 個脈波故檢測 A 相或 B 相其頻

率為 N則轉速應為 60200

timesN

〈rpm〉

圖 313 光學式轉動編碼器的原理圖

圖 314 編碼器的輸出信號波形

29

34 LM2917 FV 電路設計

對 LM2907 而言磁滯比較器和電流汞是構成頻率對電壓轉換的基本架構

並且預留一個運算放大器及一個電晶體供各種不同的使用圖 315 為吾人所設

計的 FV 電路圖中 C1 用以抑制電流汞動作時所產生的漣波變化正常使用時

此電容應大於 10C若 C1 太大也將造成轉換速度下降

因為單晶片 8051 之輸入電壓最高為 5V故必須設計其馬達最高轉速頻率所

轉成的電壓必須在 5V 以內由於馬達轉速頻率範圍極大故吾人給予 LM2917

+12V 的電壓以擴大它可以轉換的電壓範圍並將所需維持在 5V 內

a1

14

b1

1

a1

13

b1

2

a1

12

b1

3

a1

11

b1

4

1

a1

10

b1

5

a1

8

b1

7

a1

9

b1

6

L2917

Encoder輸 入

1uF

+12V

FV輸出1000pF

45k 10kC1

C2

圖 315 FV 電路

30

《實驗結果》

根據統計結果每 50mV 相對於 100Hz如此一來吾人想得知馬達目前

的轉速只要將單晶片所接收到的電壓值經過換算即可得知目前 encoder 所量測

的頻率吾人知道 encoder 一圈可產生 200 個脈波故馬達的轉速便可經過下列

公式換算得知

轉速〈rpm〉 60200

times=f

其中 =f encoder 所量測到的頻率

表 31 頻率與轉換電壓之關係

頻率

(Hz) 1 2 3 4 5 6 7 8 9

電壓(V) 0006 0006 0007 0008 0009 0009 0009 0009 001

頻率

(Hz) 10 20 30 40 50 60 70 80 90

電壓(V) 008 009 010 010 011 011 012 012 013

頻率

(Hz) 100 200 300 400 500 600 700 800 900

電壓(V) 013 018 023 028 033 038 043 049 054

頻率

(Hz) 1000 2000 3000 4000 5000 6000 7000 8000 9000

電壓(V) 059 109 16 209 257 304 3508 4006 45

31

圖 316 頻率對電壓曲線

35 單晶片介面電路

單晶片介面包括了二大部分分別為單晶片 8051AD converter

〈1〉8051 單晶片

為本控制系統的核心一切動作皆經由它控制

〈2〉AD converter

將類比開關所送出來的類比訊號經由 ADC 0804 轉換成數位訊號傳送

到單晶片的輸入埠

351 AD 轉換

以單晶片 8051 控制 ADC0804則單晶片 8051 必須下達ldquo開始轉換rdquo的命令

給 ADC0804然後 ADC0804 就開始讀入類比輸入端的電壓在內部開始轉換

經過一段轉換時間後〈約 100μ s〉ADC0804 就將轉換完成的值放在其內部的三

態輸出栓鎖緩衝器裡然後將轉換完成輸出腳〈INTR〉降為 low以通知單晶片

可以去讀轉換完成資料

當WR和CS 同時為ldquo0rdquo時表示對 ADC0804 下達ldquo開始轉換rdquo命令再經過

32

一段轉換時間〈100μ s〉後轉換完成ADC0804 會將其轉換完成的數位資料放

在其內部 8 位元緩衝區裡且將 INTR 降為ldquo0rdquo因此單晶片只要下達ldquo開始轉換rdquo

命令後去檢查 INTR 的狀態就可以知道是否轉換完畢其方法有兩種

1 輪詢法〈polling〉

2 中斷法〈interrupt〉

所謂輪詢法就是將 ADC0804 的 INTR接到 CPU 的一條 IO 線上然後以軟體指

令主動偵測其狀態當偵測到為ldquo0rdquo時就可以去讀出 ADC0804 裡的緩衝區的轉

換值

中斷法是一個很理想的 IO 方式因為不像輪詢法必須讓 CPU 等 ADC0804

轉換當 CPU 下達ldquo開始轉換rdquo命令後就可以做其他工作當 ADC0804 轉換完

畢後 INTR會降為ldquo0rdquo可以利用此信號去中斷 CPU再由中斷副程式去讀入

轉換值即可因此大大提高了程式的效率

當 CPU 接收到 ADC0804 發出ldquo轉換完畢rdquo的信號〈 INTR =0〉後就可以去

讀出轉換值其讀出的方法是將CS 與RD設為ldquo0rdquo即可讀到轉換值這個讀值的

動作又會使得 INTR恢復成ldquo1rdquo

1 CPU 下達ldquo開始轉換rdquo命令〈CS =0WR =0〉

2 ADC0804ldquo轉換完畢rdquo 〈 INTR =0〉

3 CPU 讀取轉換值〈 RD =0CS =0〉

4 讀完後 INTR =1

ADC0804 主要規格摘要如下

1 +5V 單電源工作電壓

2 類比電壓輸入範圍 0~+5V

33

3 參考電壓為 25V

4 轉換時間為 100μ s〈 CLKf =640kHz〉

5 解析度為 8 位元

6 誤差plusmn 1LSB

7 讀取時間 135ns

36 電源供應系統

本專題中所有電路及硬體設備所需的電源採用交流電源 110V 經由 PT-31

變壓器後再經過橋式整流後提供了直流電源而因為各個電路所需電源不同

因此製作了多組的變壓電路如下

1電壓源 DC5V選擇了 7805 的穩壓 IC 搭配電容得到了+5V 的電壓源

供〈1〉8051 微處理器 〈2〉ADC 0804 〈3〉74LS8674LS12374LS04

74LS02CD4013 〈4〉馬達 Encoder

2電壓源 DC12V使用 7812 穩壓 IC 搭配電容得到+12V 的電壓源供

LM2917 使用

3電壓源 DC24V利用 7824 的穩壓 IC 搭配電容獲得+24V 的直流電壓

源供電路之橋型驅動功率放大之電晶體使用

Vin1

+12V2

GND3

LM7812

2200uF 10000pF 2200uF 10000pF

+12V outputAC

圖 317 直流電源電路

34

圖 318 直流電源電路實體圖

37 馬達轉速的量測

表 33 PWM 輸出對應 encoder 週期

PWM dutycycle encoder 週期 PWM dutycycle encoder 週期

40 sμ 172 sμ 440 sμ 0 sμ

80 sμ 188 sμ 480 sμ 0 sμ

120 sμ 204 sμ 520 sμ 0 sμ

160 sμ 230 sμ 560 sμ 0 sμ

200 sμ 272 sμ 600 sμ 0 sμ

240 sμ 328 sμ 640 sμ 0 sμ

280 sμ 416 sμ 680 sμ 1320 sμ

320 sμ 540 sμ 720 sμ 750 sμ

360 sμ 800 sμ 760 sμ 510 sμ

400 sμ 1320 sμ 800 sμ 400 sμ

35

圖 319 PWM 輸出對應 encoder 週期

由統計可知道此馬達並不是一顆線性馬達故相信若使用模糊控制理論來

作為其回授控制系統的控制器一定能達到比傳統控制器的性能還要好而且若能

在模糊控制裡加上 PID 控制器的觀念一定能在系統的響應時間上升時間

安定時間和超越量達到最佳的控制另一方面馬達在其反方向的內阻較大需

要更大的力量才能使馬達驅動

36

第四章 軟體規劃與製作

41 PWM 之軟體設計

因為之前所介紹的硬體方式是以調整可變電阻來達到轉速的調整因此無法

得知所給予的脈寬長度和轉速大小尤其在回授時也不易給予適當的訊號來調整

轉速因此改良之方法就是以8051之軟體撰寫方式來產生固定的脈寬也就等

於給予轉速的命令而在其回授控制時也只要在內部程式给予適當的指令便可

達到脈寬長度的調整以達到閉迴路之受控系統

411 PWM 軟體流程

設定Timer0模式為0

TH0 = temp 32 TL0 = temp 32

temp = 8192 ndash j4 Key = 0

檢查是否有鍵值

將鍵值存入Key

Yes

No

設定Key值所對應的 j值

If P30 == 1Then P30 = 0 temp = 8192 ndash j4Else P30 = 1 temp=8192ndash880+j4

TH0 = temp 32 TL0 = temp 32

Start Timer0中斷副程式

啟動Timer0

等待Timer0中斷

返回主程式

圖 41 PWM 軟體設計流程圖

37

在此總共設計了五個按鈕分別代表不同的轉速停止正轉〈慢〉正轉

〈快〉逆轉〈慢〉和逆轉〈快〉使用Timer0是因為8051之計時中斷比延遲程

式來的準確故可以達到準確的計時程式設計理念中並沒有將中斷致能清除

因此Timer0會一直處於計時的狀態程式執行時將一邊檢查鍵值〈KeyStatus〉一

邊進行計時當計時完畢便呼叫中斷副程式然後執行改變Port 30的輸出狀

態若是為high則變為low反之若是為low即變為high同時並重設計時時間

Timer0繼續計時

當鍵值改變時計時的時間也會跟著改變如此一來Timer0將ㄧ直重覆上

述動作直到電源切掉Timer0才會停止計時

42 模糊控制之程式規劃與撰寫

本專題目標在完成了先前所規劃的硬體電路之後接著就是要達成利用模糊

控制理論來設計控制器在此採用了單晶片8051目的是為了以硬體實現方式來

代替電腦模擬期望能夠按照原訂計畫完成本專題「具模糊控制理論與雙脈寬調

變法之直流馬達驅動電路設計」

單晶片 8051 模糊控制的程式撰寫採下列幾個步驟依序完成

1 設定變數轉速誤差〈dspeed〉目前轉速〈sspeed〉

2 模糊化採用三角形歸屬函數採用三角形歸屬函數的原因

〈1〉 三角形函數為一連續函數

〈2〉 三角形函數為線性的函數所以計算速度較快

〈3〉 是具有發散也有收斂的函數和指數函數一樣接近

事實

3 模糊推論模糊規則將其所有可能發生情況以 IFhellipTHENhellip表示

並建立控制規則表

4 解模糊化採用重心法

38

421 歸屬函數

設定變數為目前轉速〈sspeed〉與轉速誤差〈dspeed〉因此此模糊控制器共

有兩個輸入訊號與一輸出訊號輸出訊號為脈寬長度該加或是減多少又因為有

五種不同的轉速因此各分別設計了不同的歸屬函數如下

1 當轉速 = 0

ml h

s s p e e d

d s p e e d

r p m0 5 0 1 0 0- 5 0- 1 0 0

mv l l h v h

r p m0- 3 0- 6 0- 1 0 0 3 0 6 0 1 0 0 圖 42 停止時之歸屬函數

2 正轉〈慢〉

ml hsspeed

dspeed

rpm150 225 300750

mvl l h vh

rpm150100500 200 250 300

圖 43 正轉〈慢〉之歸屬函數

39

3 正轉〈快〉

ml hsspeed

dspeed

rpm520 670 820370220

mvl l h vh

rpm500400300200 600 700 800

圖 44 正轉〈快〉之歸屬函數

4 逆轉〈慢〉

ml hsspeed

dspeed

rpm100 250 400500

mvl l h vh

rpm10050250 200 300 400 圖 45 逆轉〈慢〉之歸屬函數

40

5 逆轉〈快〉

ml hsspeed

dspeed

rpm300 450 600150

mvl l h vh

rpm450350250150 550 650 750

750

圖 46 逆轉〈快〉之歸屬函數

6 輸出

OutputMVL L H VH

rpm0-50-150-250 50 150 250

圖 47 輸出之歸屬函數

41

422 模糊規則庫

表 41 為吾人所設計的模糊控制規則庫並利用 Matlab 之 Fuzzy ToolBox 來

建立此規則庫以進行模擬推論圖 48 為當馬達輸入指令為正轉慢時推論後所得

到的三維空間圖

表 41 模糊控制規則表

Dspeed

vl l m h vh

l H M L VL VL

m VH H M L VL sspeed

h VH VH H M L

圖 48 推論後的三維空間圖

42

423 模糊控制器之軟體設計流程

Start 外部中斷副程式

ADCWR = 0 ADCWR = 1

〈令AD開始轉換〉

檢查鍵值以得到對應的歸屬函數

取得目前轉速與

轉速誤差

Fuzzy Rules決策

得到輸出訊號

Delay 10ms

ADC = 0 讀取AD值 ADCRD = 0

將AD值換算成轉速

ADCWR = 0 ADCWR = 1

〈AD開始轉換〉

返回主程式

致能外部中斷

圖 49 Fuzzy Controller 程式流程圖

當控制器一開始動作時便先執行AD轉換的工作當AD轉換完成時其

INTR的接腳便會觸發8051的外部中斷INTR0於是程式便發生外部中斷執行

外部中斷副程式的指令

43

在外部中斷副程式中AD將ㄧ直進行轉換與讀取的工作同時並將轉換後

的值直接換算成目前轉速與轉速誤差以供模糊控制器使用換算目前encoder

的頻率其公式為

160-V2000 times=頻率 〈4-1〉

式4-1之公式是根據表31所導出來的其中V為encoder之頻率轉成電壓之值

又假設所讀取的AD轉換值為value因為

AD的解析度 = bit256

5V+ = 511 ( Vbit ) 〈4-2〉

故value值與電壓V之關係為

511 value V times= 〈4-3〉

所以encoder之頻率與value值的關係為

頻率= 2000times ⎟⎠⎞

⎜⎝⎛ times

511 value - 160 〈4-4〉

故目前轉速為

sspeed = ( )rpm 60 200

times頻率 〈4-5〉

另ㄧ方面在主程式中程式會先去檢查鍵值也就等於檢查輸入指令以

找出符合使用的歸屬函數並將AD所獲得的轉速對應到歸屬函數中然後執行

決策判斷即進入規則庫中尋找出適當的決策判斷最後將此決策送入PWM程

式裡進行脈寬長度的調整使馬達在合理的要求下達到理想的轉速控制不會

因為外在環境的影響而使馬達轉速受到干擾

43 LCD 顯示轉速

此專題最後再增加一LCD顯示幕以顯示目前的轉速否則在程式設計完成

後人卻因無法以肉眼得知目前轉速而不能肯定馬達轉速是否有達到控制的目

標因此增加一顯示幕LCD是有必要的不僅隨時得知目前的轉速還能知道

44

設計出來的軟體其控制性是否夠好夠穩定

431 LCD 顯示幕之軟體流程

Start

設定LCD模組的初始狀態

設定外部中斷INTR0

與Timer0

設定TH0 = (65536 ndash 5000) 256 TL0 = (65536 ndash 5000)256

令ADCWR = 0 ADCWR = 1 AD開始轉換

等待中斷

外部中斷副程式

ADCRD = 0 讀取AD值 ADCRD = 1

將AD值換算成速度

ADCWR = 0 ADCWR = 1 AD開始轉換

Timer0中斷副程式

顯示LCD第一行

ldquoMotor Speed =

顯示LCD第二行ldquoxxxxxxx rpm其中 xxxxxx為外部中斷副程式所換算出的轉速

重設TH0與TL0

返回主程式返回主程式

圖 410 LCD 顯示幕之程式流程圖

此程式主要由兩個部分完成一為外部中斷副程式另ㄧ為 Timer0 中斷副

程式當主程式完成外部與 Timer0 兩個中斷的設定後隨即命令 AD 開始轉換

之後便一直停在 while〈1〉的迴圈裡不做任何動作而由兩個中斷副程式來完

成整個轉換與顯示的工作

45

外部中斷副程式主要負責 AD 的轉換讀取與轉速換算的工作AD 第一

次的轉換由主程式來下達命令當轉換完成後AD 的 INTR 接腳將觸發外部中

斷〈INTR0〉副程式此時程式便進入外部中斷副程式執行讀取 AD 值與轉速

換算的工作當這些工作完成時外部中斷副程式再次下達 AD 開始轉換的命

令而離開中斷副程式當 AD 再次轉換完成時又將再次執行中斷副程式

如此週而復始中斷副程式將ㄧ直進行讀取換算與轉換的工作

而 Timer0 中斷副程式主要負責 LCD 顯示之工作當主程式所設定的計時時

間計數完時程式便進入 Timer0 中斷副程式一旦進入 Timer0 中斷副程式程

式將執行 LCD 的顯示然後再重設 Timer0 的計數時間Timer0 將重新計數當

計數完時程式又將再度進入 Timer0 中斷副程式執行因為程式中並無清除

Timer0 的中斷致能故 Timer0 中斷副程式和外部中斷副程式ㄧ樣週而復始的

執行其副程式的工作

46

第五章 結論

本計劃主旨為具模糊控制理論與雙脈寬調變法之直流馬達驅動電路設計主

要是針對傳統電路設計之缺點提出改良之方法以TPWM取代PWM電路以模

糊理論基礎設計之控制器替代傳統PID控制器

TPWM轉速控制優於PWM之處在於

1 TPWM只需使用單電源即可達到正轉和逆轉的轉速控制而PWM必須

加上逆向開關或是雙電源才能使馬達產生正轉和逆轉

2 TPWM可控制馬達處於停止狀態無論在正向或逆向加上負載皆無法使

馬達產生轉動

3 馬達消耗定額功率輸出轉矩為額定值

4 馬達由停止到某定轉速時反應時間較快

模糊控制器優於PID控制器

1 不須導出繁雜的數學模型

2 適用於非線性系統

3 強健性與容錯性較高

本專題至此雖說大致的目標都已達到但是此系統仍然有許多不完美而需要

改進的地方例如在實驗過程中發現整個轉速的控制在回授上其反應時間

有點慢探討其原因有可能是控制器之程式上的問題

1 因為使用C語言撰寫程式故其執行速度較慢

2 程式可能寫的太累贅

3 模糊控制規則庫建立不良

若想改善這些問題可以嘗試著將C語言改為組合語言來撰寫並盡量減少

47

不必要的指令相信此動作一定能大大提昇程式的執行速度其次就是多做測

試利用測試中所學到的經驗來幫助模糊控制規則庫的改寫同時也能從測試中

發現更多的問題若是都能對問題加以一一解決的話相信必定能將此控制系統

做的更盡善盡美

48

參考文獻

﹝1﹞ 李適中直流馬達速度控制伺服控制〈基礎篇〉全華科技圖書股份有

限公司民 74

﹝2﹞ 廖錦文ldquo直流電動機之雙脈寬調變是〈TPWM〉驅動電路研究電

子技術月刊第 69 期pp94-1021992

﹝3﹞ 楊英魁孫宗瀛鄭魁香林建德蔣旭堂模糊控制理論與技術全華

科技圖書股份有限公司民 85

﹝4﹞ 林敦煌陳憬德直流馬達定位及轉速的模糊控制逢甲大學自動控制工

程學系學士論文民 87

﹝5﹞ LAZadehldquo Fuzzy Sets Information and Control Vol8 pp338-353

1965

﹝6﹞ EHMamdani and SAsslianldquo A fuzzy logic controller for a dynamic

plant Internation Journal of Man-Machine Studies Vol7 pp1-13 1975

﹝7﹞ 孫宗瀛楊英魁Fuzzy 控制理論實作與應用全華科技圖書股份有

限公司民 83 年

﹝8﹞ 許中平黃煌嘉直流電動機控制電路設計全華科技圖書股份有限公司

民 75

﹝9﹞ 盧明智黃敏祥OP Amp 應用+實驗模擬全華科技圖書股份有限公司

民 83

﹝10﹞陳文耀電動機控制工程復文書局2003

﹝11﹞許中平林全福電動機運轉控制技術全華科技圖書股份有限公司民

77

﹝12﹞楊明豐8051 單晶片 C 語言設計實務碁峯資訊2003 年

﹝13﹞蔡朝洋單晶片微電腦 80518951 原理與應用全華科技圖書股份有限公

司民 91

49

﹝14﹞王文俊認識 Fuzzy全華科技圖書股份有限公司民 90

50

附錄 A 專題硬體展示圖

圖 A-1 硬體整體圖

圖 A-2 硬體整體鳥瞰圖

51

圖 A-3 硬體側視圖

圖 A-4 操作與顯示面板

圖 A-5 間距脈波電路與 FV 電路

52

圖 A-6 橋型驅動功率放大電路

圖 A-7 操作與控制面板

53

附錄 B PWM 與模糊控制之程式

include reg51h include stdioh sbit ADCRD = P3^1 設定 RD 控制線接腳為 P31 sbit ADCWR = P3^3 設定 WR 控制線接腳為 P33 sbit P2_0 = 0xA0 接腳定義 sbit P2_1 = 0xA1 接腳定義 sbit P3_0 = 0xB0 接腳定義 sbit P3_1 = 0xB1 接腳定義 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P3_6 = 0xB6 接腳定義 void KeyStatus(void) 函數原型宣告 void feedback(void) 函數原型宣告 void compute_grade(void) 函數原型宣告 void delay1ms(int count) 函數原型宣告 void convert() 函數原型宣告 void condition() 函數原型宣告 void CW(void) 函數原型宣告 int j i 對應 PWM 的寬度 unsigned int temp 所設計的計時器時間 int sample = 1000 取樣率設定消除顯示值跳動 long int value r1 讀取 ADC0804 數位資料 long int set n condition select long int r grade_reg[2] grade[15] error1 error2 long int a1 b1 I long int membership[5][3]membership1[3][3] 定義歸屬函數 long int membership2[3][3] = -10-50-5050510 long int error[2] int Rule[15][3] = 113213313 定義判斷規則庫 212223323 311232333 411241342 511251351

54

main() 主程式 j = PWM = 110 設定 PWM 初始值 IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x00 設定計時器 0 工作於模式 0 temp=8192-j4 設定計時器 0 初值 TH0 = temp 32 TL0 = temp 32 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 P3_4 = 1 P3_5 = 0 P3_6 = 0 ADCWR = 0 令 ADC0804 的 WR = 0 ADCWR = 1 令 ADC0804 的 WR = 1 while (1) KeyStatus() 檢查鍵值 void KeyStatus(void) 檢查鍵值並給對應的 PWM 值 char KeyScan(void) 按鍵掃描函數宣告 unsigned char KeyStatus unsigned char Key = 0 KeyStatus=KeyScan() 呼叫按鍵掃描函數 if (KeyStatus = 0) 已有按鍵輸入 Key = KeyStatus Key = 鍵值 if (Key == 0x01) 假如輸入為按鍵 1 i = 110 PWM 為 110us j = i P3_4 = 1 LED 亮第一顆〈表馬達停止〉 P3_5 = 0 P3_6 = 0

55

else if (Key == 0x02 ) 假如輸入為按鍵 2 i = 140 PWM 為 140us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x04 ) 假如輸入為按鍵 3 i = 180 PWM 為 180us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x08 ) 假如輸入為按鍵 4 i = 80 PWM 為 80us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 else if (Key == 0x10 ) 假如輸入為按鍵 5 i = 40 PWM 為 40us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 PWM = j delay1ms(10) 呼叫延遲函數 feedback() 模糊控制判斷

56

void To_int(void) interrupt 1 Timer0 中斷函數 if (P3_0 == 0) 假如 PWM 輸出為 Low P3_0 = 1 變更 PWM 輸出為 High temp=8192-j4 設定 High 的時間 else 若 PWM 輸出為 High P3_0 = 0 變更 PWM 輸出為 Low temp=8192-880+j4 設定 Low 的時間 TH0 = temp 32 Timer0 的計時時間 TL0 = temp 32 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 char KeyScan(void) 檢查鍵值 char KeyStatus 按鍵狀態 P0=0xff 設定 P0 為輸入模式 KeyStatus=~P0 讀取按鍵狀態 return(KeyStatus) 將鍵值送回程式 void feedback(void) 模糊判斷 void Fuzzycontroller() 函數原型宣告 void condition1() 函數原型宣告

57

void condition2() 函數原型宣告 error1 = ((value)40-160)03 輸入變數 1 delay10ms(10) 延遲 10ms error2 = ((value)40-160)03 輸入變數 2 if (key == 0x01 ) 當按鍵 1找出對應的歸屬函數 並做出模糊控制判斷

int membership[5][3]= -100-60-30-60-300-30030030603060100

int membership1[3][3]=-100-500-50050050100 Fuzzycontroller() condition() if (key == 0x02 ) 當按鍵 2找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

05010050100150100150200150200250200250300 int membership1[3][3]=07515075150225150225300 Fuzzycontroller() condition() else if (key == 0x04) 當按鍵 3找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

200320400300400500400500600500600700600700800 int membership1[3][3]=220370520370520670520670820 Fuzzycontroller() condition() else if (key == 0x08) 當按鍵 4找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

02550255010050100200100200300200300400 int membership1[3][3]=05010050100250100250400 Fuzzycontroller() condition()

58

else if (key == 0x10) 當按鍵 5找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

150250350250350450350450550450550650550650750 int membership1[3][3]=150300450300450600450600750 Fuzzycontroller() condition2() void Fuzzycontroller() 模糊控制判斷 void compute_grade() 函數原型宣告 void compute_grade1() 函數原型宣告 a1 = 0 b1 = 001 I = 0 for (n=0 nlt=14 n++) r = error1 set = Rule[n][0]-1 compute_grade() 計算輸入變數 1 與

模糊程度的歸屬函數 condition = 1 r = error2 set = Rule[n][1]-1 compute_grade1() 計算輸入變數 2 與 模糊程度的歸屬函數 grade[n] = MIN(grade_reg[0] grade_reg[1]) a1 = a1 + (grade[n]membership2[Rule[n][2]-1][1]) b1 = b1 + grade[n] I = a1 b1 得到模糊控制判斷的結果 void compute_grade() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership[set][0]) || (r gt membership[set][2])) 當輸入變數不在 歸屬函數內

59

grade_reg[condition] = 0 else if ((r gt membership[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership[set][2]-r) (membership[set][2] - membership[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership[set][0]) (membership[set][1] - membership[set][0]) void compute_grade1() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership1[set][0]) || (r gt membership1[set][2])) 當輸入變數不在 歸屬函數內 grade_reg[condition] = 0 else if ((r gt membership1[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership1[set][2]-r) (membership1[set][2]-membership1[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership1[set][0]) (membership1[set][1]-membership1[set][0])

60

void condition() P2_0 = 1 設定 P20 為輸入模式 P2_1 = 1 設定 P21 為輸入模式 if ( (P2_0 == 1) ampamp (P2_1 == 0)) 當馬達為正轉時 if ( I gt 0 ) 若模糊判斷結果為正 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 若模糊判斷結果為零 PWM = PWM + 0 PWM 寬度不變 if ( I lt 0 ) 若模糊控制結果小於零 PWM = PWM + 1 PWM 寬度加 1 else if ( (P2_0 == 0) ampamp (P2_1 == 1) ) 若馬達為反轉 if ( I lt 0 ) 模糊控制小於零 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 模糊控制等於零 PWM = PWM + 0 PWM 寬度不變 if ( I gt 0 ) 模糊控制大於零 PWM = PWM + 1 PWM 寬度加 1 CW() 判斷 PWM 寬度上下限

61

void CW() 判斷 PWM 寬度上下限 if ( PWM gt= 215 ) 若 PWM 寬度 gt= 最大寬度 j = 215 PWM 寬度維持於 215us if ( PWM lt= 5 ) 若 PWM 寬度 lt= 最小寬度 j = 5 PWM 寬度維持在 5us if ( PWM gt 5 ampamp PWM lt 215 ) PWM 寬度介於最大與最小間 j = PWM PWM 依模糊控制判斷結果增減 void delay1ms(int count) 延遲 1ms int x y for ( x = 0 x lt count x++ ) for ( y = 0 y lt 122 y++ ) void convert() 數位資料換算成馬達轉速 r1 = ((value)40)-160

62

附錄 C LCD 顯示之程式

includereg51h 含 8051 所有暫存器宣告 include mathh define RS P3_5 LCD 指令資料選擇控制 define RW P3_4 LCD 讀寫控制腳 define Enable P3_3 LCD 致能接腳 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P0_0 = 0x80 接腳定義 sbit P0_1 = 0x81 接腳定義 sbit P0_2 = 0x82 接腳定義 sbit P0_3 = 0x83 接腳定義 sbit P0_4 = 0x84 接腳定義 sbit P0_5 = 0x85 接腳定義 sbit P0_6 = 0x86 接腳定義 sbit ADCRD = P3^7 設定 RD 控制線接腳為 P37 sbit ADCWR = P3^6 設定 WR 控制線接腳為 P36 void delay(void) 函數原型宣告 void delay10ms(int count) 函數原型宣告 void display(void) 函數原型宣告 void InitialLCD(void) 函數原型宣告 void WriteIns(char) 函數原型宣告 void WriteData(char) 函數原型宣告 void WriteString(charchar) 函數原型宣告 void CheckBusy(void) 函數原型宣告 void convert(void) 函數原型宣告 char MSG0[] = Motor Speed = 定義字串 MSG0 char MSG2[] = rpm 定義字串 MSG2 unsigned char MSG1[8]=0000000 定義字串 MSG1 unsigned long int value 讀取 ADC0804 數位資料 int sample = 1000 取樣率設定消除顯示值跳動 long int rpm

63

main() 主程式 InitialLCD() 初始化 LCD IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x01 設定計時器 0 工作於模式 1 TH0 = (65536-5000)256 設定計時器 0 初值 TL0 = (65536-5000)256 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 while(1) 等待中斷 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 while (--sample == 0) 取樣率減 1 sample = 1000 重設取樣率 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 void T0_int(void) interrupt 1 LCD 顯示動態掃描 display() 動態掃描顯示 TH0 = (65536-65535)256 重設計時初值 TL0 = (65536-65535)256

64

void InitialLCD(void) 設定 LCD 模組初始狀態 delay() 延遲函數 WriteIns(0x38) 設定 LCD 模組為 WriteIns(0x38) 2 行顯示 WriteIns(0x38) 8 位元介面 WriteIns(0x38) 5x7 點字型 WriteIns(0x08) 關閉顯示器 WriteIns(0x01) 清除 LCD 螢幕 WriteIns(0x0c) 令顯示器 ON但游標不顯示 WriteIns(0x06) 令 LCD 模組每接收到 1Byte 資料 AC 值自動加 1 void display() 掃描顯示 WriteIns(0x80) 設定 LCD 座標 WriteString(13MSG0) 將字串 MSG0 寫入 LCD 中 WriteIns(0xc0) 設定 LCD 座標 WriteString(8MSG1) 將字串 MSG1 寫入 LCD 中 WriteIns(0xc8) 設定 LCD 座標 WriteString(4MSG2) 將字串 MSG2 寫入 LCD 中 void convert(void) 換算轉速 long int freq freq = ((value)4000) - 16000 數位資料換成頻率公式 rpm = freq3 頻率換算轉速公式 MSG1[0] = (rpm1000000)+0x30 將結果存入字串 MSG1 中 MSG1[1] = ((rpm1000000)100000)+0x30 MSG1[2] = ((rpm100000)10000)+0x30 MSG1[3] = ((rpm10000)1000)+0x30 MSG1[4] = 0x2e MSG1[5] = ((rpm1000)100)+0x30 MSG1[6] = ((rpm100)10)+0x30 MSG1[7] = rpm10+0x30

65

void WriteIns(char instruction) 寫命令至 LCD 中 RS = 0 選擇指令暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = instruction 輸出命令至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteData(char i) 寫資料至 LCD 中 RS = 1 選擇資料暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = i 輸出資料至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteString(countMSG) 寫字串至 LCD 中 char count 字串長度 char MSG[] 字串資料 char i 定義位元組變數 for(i=0 iltcount i++) count 個位元組 WriteData(MSG[i]) 寫入一位元組的資料至 LCD 中 void CheckBusy(void) char i=0x80 檢查忙碌旗標 while(iamp0x80) 忙錄旗標 BF = 1 RS = 0 選擇指令暫存器 RW = 1 讀取 Enable = 1 致能 LCD i = P2 讀取 LCD 指令暫存器內的資料

66

Enable = 0 除能 LCD delay() 延遲函數 void delay() 延遲 5ms int i for(i=0 ilt250 i++)

  • 畢業專題封面pdf
  • File0004pdf
  • 最終版pdfpdf
Page 28: Based on Fuzzy Control Theorem and TPWM Method for DC ... · 使吾人想設計一模糊控制器來做為馬達轉速的閉迴路控制,以解決非線性系統的 問題。除此之外,flcs

19

OP1反相積分以後得到Vo1三角波此三角波又同時加到OP2控制其狀

態的改變

當方波產生器的輸出是正的則三角波產生器的輸出是斜向負相似

地當方波產生器的輸出是負則三角波產生器的輸出是斜向正這個動

作將產生三角波的輸出同時也輸出方波﹝9﹞

+VCC

-VCC

-

+

R1

R2

R3

+VCC

-VCC

-

+

OP1

OP2

Vo2Vo1

圖 33 三角波產生電路

對OP2而言是磁滯比較必須先找到OP2的 THV 和 TLV

232

21

32

3oo v

RRR

vRR

Rv

++

+=+ 〈31〉

當 0=+v 時

23

21 oo v

RR

v minus= 〈32〉

表要達到OP2的 0=+v 必須有這麼大的 1ov

當 12 sato Ev = 時

TLsato VERR

v =minus= 13

21 〈33〉

當 22 sato Ev minus= 時

THsato VERR

v =+= 23

21 〈34〉

20

對OP1而言是反相積分器 2ov 為其輸入 1ov 為其輸出則

tCIt

Rv

Ct

CRv

dtvCR

v oooo

11

2

11

22

111

11minus=minus=minus=minus= int 〈35〉

因為

1

2

Rvv

I o minusminus= 0=minusv 〈因為虛接地〉 〈36〉

所以

1

2

Rv

I o= 〈37〉

又因運算放大器的輸入阻抗非常大則流經 1C 的電流也為 I 相當於以定

電流對電容C 充電

當 12 sato Ev = 時 1ov 為下降斜波

tR

EC

v sato

1

1

11

1minus= 〈38〉

當 22 sato Ev minus= 時 1ov 上升斜波

( )

tRE

Cv sat

o1

2

11

1 minusminus= 〈39〉

由此可知三角波的上升與下降斜波乃因 1C 的充電與放電且時間

常數為 11CR

三角波週期分析如下

1 上升斜波的時間 1T

tCR

vv o

o1

1

21 minus= 11

2

1 CRvv

to

ominus=

1Tt = TLTHo VVv minus=1 22 sato Ev =

11111

21

sat

TLTH

sat

TLTH

EVV

CRCRE

VVT

minus=

minusminus= 〈310〉

2 下降斜波的時間 2T

tCR

vv o

o1

1

21 minus= 11

2

1 CRvv

to

ominus=

21

2Tt = THTLo VVv minus=1 12 sato Ev =

1

11111

1sat

TLTH

sat

THTL

EVV

CRCRE

VVT

minus=

minusminus= 〈311〉

3 週期 21 TTT +=

若 1satE = 2satE = satE 且3

22RR

VV TLTH =minus satE

3

2114

RR

CRT=

若R3 = nR2

則nCR

T 114=

114 CR

nf = 〈312〉

《實驗結果》

必須注意的是三角波的頻率太低將導致馬達的轉動產生脈動現象

故將工作頻率設計在1kHz以上

Ω= k1501R Ω= k102R

Ω= k203R pFC 22001 =

所得到的三角波頻率為

15kHz10220010001504

00010100020

f 12- =timestimestimestimes

timestimes

=

圖 34 三角波輸出波形

22

〈2〉 脈寬調變電路〈PWM〉

+12V

-12V

10k

+12V

-12V -

+ PWM輸出LM324三角波輸入

圖 35 脈寬調變電路

PWM系統往往連接至直流電源供應放大器的工作是以固定的頻率開

閉直流供應電壓其激發角是可以調整的因此得到波寬可調的輸出

將固定頻率的三角波與反向輸入的電壓做比較便可輸出一脈寬〈見圖

36〉反向電阻值的不同將導致反向輸入電壓不同故其輸出為一可調但

頻率固定的脈寬也正因為如此故稱為脈寬調變〈PWM〉由於輸出的

dutycycle不同故馬達將接收到不同的平均電壓因而可以藉由PWM控制

馬達的轉速

反相輸入電壓

PWM

圖 36 三角波與反相輸入電壓比較

23

PWM的優點在於馬達驅動電路的電晶體之控制信號改以脈波列來控

制使電晶體操作成類似開關的動作不是完全導通就是完全截止故電晶

體不是一直操作於作用區所以其功率消耗不大整體效率較高

《實驗結果》

圖 37 PWM 輸出波形

322 橋型驅動功率放大電路

如圖38所示主要由四個功率電晶體組成利用不同的電晶體對使直流

馬達做正逆轉控制當Q5Q8導通使馬達正轉當Q6Q7導通馬達則逆

轉電路中的電晶體扮演開關的作用

此種電路簡單只要一組直流電源供應且電晶體分擔了部份的電壓保護

電晶體迅速工作於截止與飽和狀態之間故沒有功率散逸損失之虞

但是在設計時切勿使Q5Q6同時導通以免燒毀電路上之元件因為在

AB兩脈波短暫的交變時間內由於電晶體本身之最小延遲時間有可能使Q5

Q6同時ON與Q7Q8在很短時間同時ON因此在15kHz交變下容易燒毀功

率電晶體

因此設計一間距脈波電路主要之功用使Q5Q6和Q7Q8均不同時導通

24

以拉長AB兩者交換時間

M

20k

10k

20k

10k

+24V

A 信號 B 信號

2N3055 2N3055

2N2955 2N2955

1N40021N4002

C1815 C1815

C1815 C1815

Q5

Q8Q6

Q7

圖 38 橋型驅動功率放大電路

圖 39 橋型驅動功率放大電路實體圖

25

此外若考慮電晶體BE間的電壓則電路會出現約 plusmn 06V的不感帶〈ded

band〉即電晶體的 oV 對 inV 間的關係如圖3101假使 inV 電壓為正弦波則 oV 變

成如圖3102為了改善這種缺失吾人利用兩個二極體接在電路上如圖38

用來補償電晶體BE間的壓降﹝10﹞

約06V

Dead band

Vo

Vin

圖 3101 呈現不感帶的轉移函數

圖 3102 輸出電壓波形

26

323 間距脈波產生電路

RCext15

Cext14 74123

A3

B2

Q13

CLR1

Q4

7486100k

2200pF

10k

10000pF

+5V

間距脈波輸出

圖 311 間距脈波產生電路

間距脈波的產生方式是根據脈寬調變〈PWM〉後的訊號再經由積分電路的

電阻兩端取出且經由兩倍頻器〈74LS86〉檢示出PWM的正負緣脈波最後

再利用單穩態IC〈74LS123〉將檢出信號之脈寬拉長至01ms此即為間距脈波

74LS123有兩個輸入端子A及B分別為下降波緣輸入端子及上升波緣輸入端

子當輸入A之脈波由ldquoH變成ldquoL之瞬間Q輸出變為ldquoH其持續時間長

短由RC時間常數決定反之當輸入B之脈波由ldquoL變成ldquoH之瞬間Q輸出

變成ldquoH維持一定時間

74LS123的輸出脈波之寬度是由電阻及電容之時間常數所決定概略計算公

式如下

CR045T timestimes=

電容 C 必須大於 1000pF

27

《實驗結果》

R=24kΩ C=10000pF

所以得到間距脈波為

( )msec0110810000p24k045T cong=timestimes= μ

圖 312 間距脈波

研究經分析後發現

1 間距 T 愈大愈能確保電路之安全性愈有保護作用

2 間距 T 愈大相對的使驅動信號脈波減少愈多造成馬達旋轉扭力大

大減弱

3 適當的間距 T不但不會影響馬達的輸出轉矩而且兼具保護電路的

效果

33 編碼器

轉動編碼器不只可以作為轉速的感測也能做位置的感測又適合於數位處

理故被廣泛使用若就信號來看轉動編碼器可分為增量型與絕對型若以檢

測的方式來分可分為光學式和磁式兩種在本專題中所使用的編碼器為光學式

增量型編碼器﹝11﹞

光學式轉動編碼器的原理如圖 313在附有細縫轉盤的兩側分別裝置發光元

28

件與受光元件如果只有一組光電檢測元件則輸出信號就只有一相的脈波信

號此種裝置稱為脈波產生器圖 314 為增量型轉碼器的輸出信號它是利用

兩組光電元件所產生的脈波信號A 相和 B 相間有相位差正轉時 A 相領前 B

相逆轉時 B 相領前 A 相因此利用此兩相做檢測馬達為正轉或逆轉的工作

並利用 A 相或 B 相的頻率檢測出目前的轉速

吾人計算出編碼器每一轉可以產生約 200 個脈波故檢測 A 相或 B 相其頻

率為 N則轉速應為 60200

timesN

〈rpm〉

圖 313 光學式轉動編碼器的原理圖

圖 314 編碼器的輸出信號波形

29

34 LM2917 FV 電路設計

對 LM2907 而言磁滯比較器和電流汞是構成頻率對電壓轉換的基本架構

並且預留一個運算放大器及一個電晶體供各種不同的使用圖 315 為吾人所設

計的 FV 電路圖中 C1 用以抑制電流汞動作時所產生的漣波變化正常使用時

此電容應大於 10C若 C1 太大也將造成轉換速度下降

因為單晶片 8051 之輸入電壓最高為 5V故必須設計其馬達最高轉速頻率所

轉成的電壓必須在 5V 以內由於馬達轉速頻率範圍極大故吾人給予 LM2917

+12V 的電壓以擴大它可以轉換的電壓範圍並將所需維持在 5V 內

a1

14

b1

1

a1

13

b1

2

a1

12

b1

3

a1

11

b1

4

1

a1

10

b1

5

a1

8

b1

7

a1

9

b1

6

L2917

Encoder輸 入

1uF

+12V

FV輸出1000pF

45k 10kC1

C2

圖 315 FV 電路

30

《實驗結果》

根據統計結果每 50mV 相對於 100Hz如此一來吾人想得知馬達目前

的轉速只要將單晶片所接收到的電壓值經過換算即可得知目前 encoder 所量測

的頻率吾人知道 encoder 一圈可產生 200 個脈波故馬達的轉速便可經過下列

公式換算得知

轉速〈rpm〉 60200

times=f

其中 =f encoder 所量測到的頻率

表 31 頻率與轉換電壓之關係

頻率

(Hz) 1 2 3 4 5 6 7 8 9

電壓(V) 0006 0006 0007 0008 0009 0009 0009 0009 001

頻率

(Hz) 10 20 30 40 50 60 70 80 90

電壓(V) 008 009 010 010 011 011 012 012 013

頻率

(Hz) 100 200 300 400 500 600 700 800 900

電壓(V) 013 018 023 028 033 038 043 049 054

頻率

(Hz) 1000 2000 3000 4000 5000 6000 7000 8000 9000

電壓(V) 059 109 16 209 257 304 3508 4006 45

31

圖 316 頻率對電壓曲線

35 單晶片介面電路

單晶片介面包括了二大部分分別為單晶片 8051AD converter

〈1〉8051 單晶片

為本控制系統的核心一切動作皆經由它控制

〈2〉AD converter

將類比開關所送出來的類比訊號經由 ADC 0804 轉換成數位訊號傳送

到單晶片的輸入埠

351 AD 轉換

以單晶片 8051 控制 ADC0804則單晶片 8051 必須下達ldquo開始轉換rdquo的命令

給 ADC0804然後 ADC0804 就開始讀入類比輸入端的電壓在內部開始轉換

經過一段轉換時間後〈約 100μ s〉ADC0804 就將轉換完成的值放在其內部的三

態輸出栓鎖緩衝器裡然後將轉換完成輸出腳〈INTR〉降為 low以通知單晶片

可以去讀轉換完成資料

當WR和CS 同時為ldquo0rdquo時表示對 ADC0804 下達ldquo開始轉換rdquo命令再經過

32

一段轉換時間〈100μ s〉後轉換完成ADC0804 會將其轉換完成的數位資料放

在其內部 8 位元緩衝區裡且將 INTR 降為ldquo0rdquo因此單晶片只要下達ldquo開始轉換rdquo

命令後去檢查 INTR 的狀態就可以知道是否轉換完畢其方法有兩種

1 輪詢法〈polling〉

2 中斷法〈interrupt〉

所謂輪詢法就是將 ADC0804 的 INTR接到 CPU 的一條 IO 線上然後以軟體指

令主動偵測其狀態當偵測到為ldquo0rdquo時就可以去讀出 ADC0804 裡的緩衝區的轉

換值

中斷法是一個很理想的 IO 方式因為不像輪詢法必須讓 CPU 等 ADC0804

轉換當 CPU 下達ldquo開始轉換rdquo命令後就可以做其他工作當 ADC0804 轉換完

畢後 INTR會降為ldquo0rdquo可以利用此信號去中斷 CPU再由中斷副程式去讀入

轉換值即可因此大大提高了程式的效率

當 CPU 接收到 ADC0804 發出ldquo轉換完畢rdquo的信號〈 INTR =0〉後就可以去

讀出轉換值其讀出的方法是將CS 與RD設為ldquo0rdquo即可讀到轉換值這個讀值的

動作又會使得 INTR恢復成ldquo1rdquo

1 CPU 下達ldquo開始轉換rdquo命令〈CS =0WR =0〉

2 ADC0804ldquo轉換完畢rdquo 〈 INTR =0〉

3 CPU 讀取轉換值〈 RD =0CS =0〉

4 讀完後 INTR =1

ADC0804 主要規格摘要如下

1 +5V 單電源工作電壓

2 類比電壓輸入範圍 0~+5V

33

3 參考電壓為 25V

4 轉換時間為 100μ s〈 CLKf =640kHz〉

5 解析度為 8 位元

6 誤差plusmn 1LSB

7 讀取時間 135ns

36 電源供應系統

本專題中所有電路及硬體設備所需的電源採用交流電源 110V 經由 PT-31

變壓器後再經過橋式整流後提供了直流電源而因為各個電路所需電源不同

因此製作了多組的變壓電路如下

1電壓源 DC5V選擇了 7805 的穩壓 IC 搭配電容得到了+5V 的電壓源

供〈1〉8051 微處理器 〈2〉ADC 0804 〈3〉74LS8674LS12374LS04

74LS02CD4013 〈4〉馬達 Encoder

2電壓源 DC12V使用 7812 穩壓 IC 搭配電容得到+12V 的電壓源供

LM2917 使用

3電壓源 DC24V利用 7824 的穩壓 IC 搭配電容獲得+24V 的直流電壓

源供電路之橋型驅動功率放大之電晶體使用

Vin1

+12V2

GND3

LM7812

2200uF 10000pF 2200uF 10000pF

+12V outputAC

圖 317 直流電源電路

34

圖 318 直流電源電路實體圖

37 馬達轉速的量測

表 33 PWM 輸出對應 encoder 週期

PWM dutycycle encoder 週期 PWM dutycycle encoder 週期

40 sμ 172 sμ 440 sμ 0 sμ

80 sμ 188 sμ 480 sμ 0 sμ

120 sμ 204 sμ 520 sμ 0 sμ

160 sμ 230 sμ 560 sμ 0 sμ

200 sμ 272 sμ 600 sμ 0 sμ

240 sμ 328 sμ 640 sμ 0 sμ

280 sμ 416 sμ 680 sμ 1320 sμ

320 sμ 540 sμ 720 sμ 750 sμ

360 sμ 800 sμ 760 sμ 510 sμ

400 sμ 1320 sμ 800 sμ 400 sμ

35

圖 319 PWM 輸出對應 encoder 週期

由統計可知道此馬達並不是一顆線性馬達故相信若使用模糊控制理論來

作為其回授控制系統的控制器一定能達到比傳統控制器的性能還要好而且若能

在模糊控制裡加上 PID 控制器的觀念一定能在系統的響應時間上升時間

安定時間和超越量達到最佳的控制另一方面馬達在其反方向的內阻較大需

要更大的力量才能使馬達驅動

36

第四章 軟體規劃與製作

41 PWM 之軟體設計

因為之前所介紹的硬體方式是以調整可變電阻來達到轉速的調整因此無法

得知所給予的脈寬長度和轉速大小尤其在回授時也不易給予適當的訊號來調整

轉速因此改良之方法就是以8051之軟體撰寫方式來產生固定的脈寬也就等

於給予轉速的命令而在其回授控制時也只要在內部程式给予適當的指令便可

達到脈寬長度的調整以達到閉迴路之受控系統

411 PWM 軟體流程

設定Timer0模式為0

TH0 = temp 32 TL0 = temp 32

temp = 8192 ndash j4 Key = 0

檢查是否有鍵值

將鍵值存入Key

Yes

No

設定Key值所對應的 j值

If P30 == 1Then P30 = 0 temp = 8192 ndash j4Else P30 = 1 temp=8192ndash880+j4

TH0 = temp 32 TL0 = temp 32

Start Timer0中斷副程式

啟動Timer0

等待Timer0中斷

返回主程式

圖 41 PWM 軟體設計流程圖

37

在此總共設計了五個按鈕分別代表不同的轉速停止正轉〈慢〉正轉

〈快〉逆轉〈慢〉和逆轉〈快〉使用Timer0是因為8051之計時中斷比延遲程

式來的準確故可以達到準確的計時程式設計理念中並沒有將中斷致能清除

因此Timer0會一直處於計時的狀態程式執行時將一邊檢查鍵值〈KeyStatus〉一

邊進行計時當計時完畢便呼叫中斷副程式然後執行改變Port 30的輸出狀

態若是為high則變為low反之若是為low即變為high同時並重設計時時間

Timer0繼續計時

當鍵值改變時計時的時間也會跟著改變如此一來Timer0將ㄧ直重覆上

述動作直到電源切掉Timer0才會停止計時

42 模糊控制之程式規劃與撰寫

本專題目標在完成了先前所規劃的硬體電路之後接著就是要達成利用模糊

控制理論來設計控制器在此採用了單晶片8051目的是為了以硬體實現方式來

代替電腦模擬期望能夠按照原訂計畫完成本專題「具模糊控制理論與雙脈寬調

變法之直流馬達驅動電路設計」

單晶片 8051 模糊控制的程式撰寫採下列幾個步驟依序完成

1 設定變數轉速誤差〈dspeed〉目前轉速〈sspeed〉

2 模糊化採用三角形歸屬函數採用三角形歸屬函數的原因

〈1〉 三角形函數為一連續函數

〈2〉 三角形函數為線性的函數所以計算速度較快

〈3〉 是具有發散也有收斂的函數和指數函數一樣接近

事實

3 模糊推論模糊規則將其所有可能發生情況以 IFhellipTHENhellip表示

並建立控制規則表

4 解模糊化採用重心法

38

421 歸屬函數

設定變數為目前轉速〈sspeed〉與轉速誤差〈dspeed〉因此此模糊控制器共

有兩個輸入訊號與一輸出訊號輸出訊號為脈寬長度該加或是減多少又因為有

五種不同的轉速因此各分別設計了不同的歸屬函數如下

1 當轉速 = 0

ml h

s s p e e d

d s p e e d

r p m0 5 0 1 0 0- 5 0- 1 0 0

mv l l h v h

r p m0- 3 0- 6 0- 1 0 0 3 0 6 0 1 0 0 圖 42 停止時之歸屬函數

2 正轉〈慢〉

ml hsspeed

dspeed

rpm150 225 300750

mvl l h vh

rpm150100500 200 250 300

圖 43 正轉〈慢〉之歸屬函數

39

3 正轉〈快〉

ml hsspeed

dspeed

rpm520 670 820370220

mvl l h vh

rpm500400300200 600 700 800

圖 44 正轉〈快〉之歸屬函數

4 逆轉〈慢〉

ml hsspeed

dspeed

rpm100 250 400500

mvl l h vh

rpm10050250 200 300 400 圖 45 逆轉〈慢〉之歸屬函數

40

5 逆轉〈快〉

ml hsspeed

dspeed

rpm300 450 600150

mvl l h vh

rpm450350250150 550 650 750

750

圖 46 逆轉〈快〉之歸屬函數

6 輸出

OutputMVL L H VH

rpm0-50-150-250 50 150 250

圖 47 輸出之歸屬函數

41

422 模糊規則庫

表 41 為吾人所設計的模糊控制規則庫並利用 Matlab 之 Fuzzy ToolBox 來

建立此規則庫以進行模擬推論圖 48 為當馬達輸入指令為正轉慢時推論後所得

到的三維空間圖

表 41 模糊控制規則表

Dspeed

vl l m h vh

l H M L VL VL

m VH H M L VL sspeed

h VH VH H M L

圖 48 推論後的三維空間圖

42

423 模糊控制器之軟體設計流程

Start 外部中斷副程式

ADCWR = 0 ADCWR = 1

〈令AD開始轉換〉

檢查鍵值以得到對應的歸屬函數

取得目前轉速與

轉速誤差

Fuzzy Rules決策

得到輸出訊號

Delay 10ms

ADC = 0 讀取AD值 ADCRD = 0

將AD值換算成轉速

ADCWR = 0 ADCWR = 1

〈AD開始轉換〉

返回主程式

致能外部中斷

圖 49 Fuzzy Controller 程式流程圖

當控制器一開始動作時便先執行AD轉換的工作當AD轉換完成時其

INTR的接腳便會觸發8051的外部中斷INTR0於是程式便發生外部中斷執行

外部中斷副程式的指令

43

在外部中斷副程式中AD將ㄧ直進行轉換與讀取的工作同時並將轉換後

的值直接換算成目前轉速與轉速誤差以供模糊控制器使用換算目前encoder

的頻率其公式為

160-V2000 times=頻率 〈4-1〉

式4-1之公式是根據表31所導出來的其中V為encoder之頻率轉成電壓之值

又假設所讀取的AD轉換值為value因為

AD的解析度 = bit256

5V+ = 511 ( Vbit ) 〈4-2〉

故value值與電壓V之關係為

511 value V times= 〈4-3〉

所以encoder之頻率與value值的關係為

頻率= 2000times ⎟⎠⎞

⎜⎝⎛ times

511 value - 160 〈4-4〉

故目前轉速為

sspeed = ( )rpm 60 200

times頻率 〈4-5〉

另ㄧ方面在主程式中程式會先去檢查鍵值也就等於檢查輸入指令以

找出符合使用的歸屬函數並將AD所獲得的轉速對應到歸屬函數中然後執行

決策判斷即進入規則庫中尋找出適當的決策判斷最後將此決策送入PWM程

式裡進行脈寬長度的調整使馬達在合理的要求下達到理想的轉速控制不會

因為外在環境的影響而使馬達轉速受到干擾

43 LCD 顯示轉速

此專題最後再增加一LCD顯示幕以顯示目前的轉速否則在程式設計完成

後人卻因無法以肉眼得知目前轉速而不能肯定馬達轉速是否有達到控制的目

標因此增加一顯示幕LCD是有必要的不僅隨時得知目前的轉速還能知道

44

設計出來的軟體其控制性是否夠好夠穩定

431 LCD 顯示幕之軟體流程

Start

設定LCD模組的初始狀態

設定外部中斷INTR0

與Timer0

設定TH0 = (65536 ndash 5000) 256 TL0 = (65536 ndash 5000)256

令ADCWR = 0 ADCWR = 1 AD開始轉換

等待中斷

外部中斷副程式

ADCRD = 0 讀取AD值 ADCRD = 1

將AD值換算成速度

ADCWR = 0 ADCWR = 1 AD開始轉換

Timer0中斷副程式

顯示LCD第一行

ldquoMotor Speed =

顯示LCD第二行ldquoxxxxxxx rpm其中 xxxxxx為外部中斷副程式所換算出的轉速

重設TH0與TL0

返回主程式返回主程式

圖 410 LCD 顯示幕之程式流程圖

此程式主要由兩個部分完成一為外部中斷副程式另ㄧ為 Timer0 中斷副

程式當主程式完成外部與 Timer0 兩個中斷的設定後隨即命令 AD 開始轉換

之後便一直停在 while〈1〉的迴圈裡不做任何動作而由兩個中斷副程式來完

成整個轉換與顯示的工作

45

外部中斷副程式主要負責 AD 的轉換讀取與轉速換算的工作AD 第一

次的轉換由主程式來下達命令當轉換完成後AD 的 INTR 接腳將觸發外部中

斷〈INTR0〉副程式此時程式便進入外部中斷副程式執行讀取 AD 值與轉速

換算的工作當這些工作完成時外部中斷副程式再次下達 AD 開始轉換的命

令而離開中斷副程式當 AD 再次轉換完成時又將再次執行中斷副程式

如此週而復始中斷副程式將ㄧ直進行讀取換算與轉換的工作

而 Timer0 中斷副程式主要負責 LCD 顯示之工作當主程式所設定的計時時

間計數完時程式便進入 Timer0 中斷副程式一旦進入 Timer0 中斷副程式程

式將執行 LCD 的顯示然後再重設 Timer0 的計數時間Timer0 將重新計數當

計數完時程式又將再度進入 Timer0 中斷副程式執行因為程式中並無清除

Timer0 的中斷致能故 Timer0 中斷副程式和外部中斷副程式ㄧ樣週而復始的

執行其副程式的工作

46

第五章 結論

本計劃主旨為具模糊控制理論與雙脈寬調變法之直流馬達驅動電路設計主

要是針對傳統電路設計之缺點提出改良之方法以TPWM取代PWM電路以模

糊理論基礎設計之控制器替代傳統PID控制器

TPWM轉速控制優於PWM之處在於

1 TPWM只需使用單電源即可達到正轉和逆轉的轉速控制而PWM必須

加上逆向開關或是雙電源才能使馬達產生正轉和逆轉

2 TPWM可控制馬達處於停止狀態無論在正向或逆向加上負載皆無法使

馬達產生轉動

3 馬達消耗定額功率輸出轉矩為額定值

4 馬達由停止到某定轉速時反應時間較快

模糊控制器優於PID控制器

1 不須導出繁雜的數學模型

2 適用於非線性系統

3 強健性與容錯性較高

本專題至此雖說大致的目標都已達到但是此系統仍然有許多不完美而需要

改進的地方例如在實驗過程中發現整個轉速的控制在回授上其反應時間

有點慢探討其原因有可能是控制器之程式上的問題

1 因為使用C語言撰寫程式故其執行速度較慢

2 程式可能寫的太累贅

3 模糊控制規則庫建立不良

若想改善這些問題可以嘗試著將C語言改為組合語言來撰寫並盡量減少

47

不必要的指令相信此動作一定能大大提昇程式的執行速度其次就是多做測

試利用測試中所學到的經驗來幫助模糊控制規則庫的改寫同時也能從測試中

發現更多的問題若是都能對問題加以一一解決的話相信必定能將此控制系統

做的更盡善盡美

48

參考文獻

﹝1﹞ 李適中直流馬達速度控制伺服控制〈基礎篇〉全華科技圖書股份有

限公司民 74

﹝2﹞ 廖錦文ldquo直流電動機之雙脈寬調變是〈TPWM〉驅動電路研究電

子技術月刊第 69 期pp94-1021992

﹝3﹞ 楊英魁孫宗瀛鄭魁香林建德蔣旭堂模糊控制理論與技術全華

科技圖書股份有限公司民 85

﹝4﹞ 林敦煌陳憬德直流馬達定位及轉速的模糊控制逢甲大學自動控制工

程學系學士論文民 87

﹝5﹞ LAZadehldquo Fuzzy Sets Information and Control Vol8 pp338-353

1965

﹝6﹞ EHMamdani and SAsslianldquo A fuzzy logic controller for a dynamic

plant Internation Journal of Man-Machine Studies Vol7 pp1-13 1975

﹝7﹞ 孫宗瀛楊英魁Fuzzy 控制理論實作與應用全華科技圖書股份有

限公司民 83 年

﹝8﹞ 許中平黃煌嘉直流電動機控制電路設計全華科技圖書股份有限公司

民 75

﹝9﹞ 盧明智黃敏祥OP Amp 應用+實驗模擬全華科技圖書股份有限公司

民 83

﹝10﹞陳文耀電動機控制工程復文書局2003

﹝11﹞許中平林全福電動機運轉控制技術全華科技圖書股份有限公司民

77

﹝12﹞楊明豐8051 單晶片 C 語言設計實務碁峯資訊2003 年

﹝13﹞蔡朝洋單晶片微電腦 80518951 原理與應用全華科技圖書股份有限公

司民 91

49

﹝14﹞王文俊認識 Fuzzy全華科技圖書股份有限公司民 90

50

附錄 A 專題硬體展示圖

圖 A-1 硬體整體圖

圖 A-2 硬體整體鳥瞰圖

51

圖 A-3 硬體側視圖

圖 A-4 操作與顯示面板

圖 A-5 間距脈波電路與 FV 電路

52

圖 A-6 橋型驅動功率放大電路

圖 A-7 操作與控制面板

53

附錄 B PWM 與模糊控制之程式

include reg51h include stdioh sbit ADCRD = P3^1 設定 RD 控制線接腳為 P31 sbit ADCWR = P3^3 設定 WR 控制線接腳為 P33 sbit P2_0 = 0xA0 接腳定義 sbit P2_1 = 0xA1 接腳定義 sbit P3_0 = 0xB0 接腳定義 sbit P3_1 = 0xB1 接腳定義 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P3_6 = 0xB6 接腳定義 void KeyStatus(void) 函數原型宣告 void feedback(void) 函數原型宣告 void compute_grade(void) 函數原型宣告 void delay1ms(int count) 函數原型宣告 void convert() 函數原型宣告 void condition() 函數原型宣告 void CW(void) 函數原型宣告 int j i 對應 PWM 的寬度 unsigned int temp 所設計的計時器時間 int sample = 1000 取樣率設定消除顯示值跳動 long int value r1 讀取 ADC0804 數位資料 long int set n condition select long int r grade_reg[2] grade[15] error1 error2 long int a1 b1 I long int membership[5][3]membership1[3][3] 定義歸屬函數 long int membership2[3][3] = -10-50-5050510 long int error[2] int Rule[15][3] = 113213313 定義判斷規則庫 212223323 311232333 411241342 511251351

54

main() 主程式 j = PWM = 110 設定 PWM 初始值 IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x00 設定計時器 0 工作於模式 0 temp=8192-j4 設定計時器 0 初值 TH0 = temp 32 TL0 = temp 32 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 P3_4 = 1 P3_5 = 0 P3_6 = 0 ADCWR = 0 令 ADC0804 的 WR = 0 ADCWR = 1 令 ADC0804 的 WR = 1 while (1) KeyStatus() 檢查鍵值 void KeyStatus(void) 檢查鍵值並給對應的 PWM 值 char KeyScan(void) 按鍵掃描函數宣告 unsigned char KeyStatus unsigned char Key = 0 KeyStatus=KeyScan() 呼叫按鍵掃描函數 if (KeyStatus = 0) 已有按鍵輸入 Key = KeyStatus Key = 鍵值 if (Key == 0x01) 假如輸入為按鍵 1 i = 110 PWM 為 110us j = i P3_4 = 1 LED 亮第一顆〈表馬達停止〉 P3_5 = 0 P3_6 = 0

55

else if (Key == 0x02 ) 假如輸入為按鍵 2 i = 140 PWM 為 140us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x04 ) 假如輸入為按鍵 3 i = 180 PWM 為 180us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x08 ) 假如輸入為按鍵 4 i = 80 PWM 為 80us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 else if (Key == 0x10 ) 假如輸入為按鍵 5 i = 40 PWM 為 40us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 PWM = j delay1ms(10) 呼叫延遲函數 feedback() 模糊控制判斷

56

void To_int(void) interrupt 1 Timer0 中斷函數 if (P3_0 == 0) 假如 PWM 輸出為 Low P3_0 = 1 變更 PWM 輸出為 High temp=8192-j4 設定 High 的時間 else 若 PWM 輸出為 High P3_0 = 0 變更 PWM 輸出為 Low temp=8192-880+j4 設定 Low 的時間 TH0 = temp 32 Timer0 的計時時間 TL0 = temp 32 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 char KeyScan(void) 檢查鍵值 char KeyStatus 按鍵狀態 P0=0xff 設定 P0 為輸入模式 KeyStatus=~P0 讀取按鍵狀態 return(KeyStatus) 將鍵值送回程式 void feedback(void) 模糊判斷 void Fuzzycontroller() 函數原型宣告 void condition1() 函數原型宣告

57

void condition2() 函數原型宣告 error1 = ((value)40-160)03 輸入變數 1 delay10ms(10) 延遲 10ms error2 = ((value)40-160)03 輸入變數 2 if (key == 0x01 ) 當按鍵 1找出對應的歸屬函數 並做出模糊控制判斷

int membership[5][3]= -100-60-30-60-300-30030030603060100

int membership1[3][3]=-100-500-50050050100 Fuzzycontroller() condition() if (key == 0x02 ) 當按鍵 2找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

05010050100150100150200150200250200250300 int membership1[3][3]=07515075150225150225300 Fuzzycontroller() condition() else if (key == 0x04) 當按鍵 3找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

200320400300400500400500600500600700600700800 int membership1[3][3]=220370520370520670520670820 Fuzzycontroller() condition() else if (key == 0x08) 當按鍵 4找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

02550255010050100200100200300200300400 int membership1[3][3]=05010050100250100250400 Fuzzycontroller() condition()

58

else if (key == 0x10) 當按鍵 5找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

150250350250350450350450550450550650550650750 int membership1[3][3]=150300450300450600450600750 Fuzzycontroller() condition2() void Fuzzycontroller() 模糊控制判斷 void compute_grade() 函數原型宣告 void compute_grade1() 函數原型宣告 a1 = 0 b1 = 001 I = 0 for (n=0 nlt=14 n++) r = error1 set = Rule[n][0]-1 compute_grade() 計算輸入變數 1 與

模糊程度的歸屬函數 condition = 1 r = error2 set = Rule[n][1]-1 compute_grade1() 計算輸入變數 2 與 模糊程度的歸屬函數 grade[n] = MIN(grade_reg[0] grade_reg[1]) a1 = a1 + (grade[n]membership2[Rule[n][2]-1][1]) b1 = b1 + grade[n] I = a1 b1 得到模糊控制判斷的結果 void compute_grade() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership[set][0]) || (r gt membership[set][2])) 當輸入變數不在 歸屬函數內

59

grade_reg[condition] = 0 else if ((r gt membership[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership[set][2]-r) (membership[set][2] - membership[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership[set][0]) (membership[set][1] - membership[set][0]) void compute_grade1() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership1[set][0]) || (r gt membership1[set][2])) 當輸入變數不在 歸屬函數內 grade_reg[condition] = 0 else if ((r gt membership1[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership1[set][2]-r) (membership1[set][2]-membership1[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership1[set][0]) (membership1[set][1]-membership1[set][0])

60

void condition() P2_0 = 1 設定 P20 為輸入模式 P2_1 = 1 設定 P21 為輸入模式 if ( (P2_0 == 1) ampamp (P2_1 == 0)) 當馬達為正轉時 if ( I gt 0 ) 若模糊判斷結果為正 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 若模糊判斷結果為零 PWM = PWM + 0 PWM 寬度不變 if ( I lt 0 ) 若模糊控制結果小於零 PWM = PWM + 1 PWM 寬度加 1 else if ( (P2_0 == 0) ampamp (P2_1 == 1) ) 若馬達為反轉 if ( I lt 0 ) 模糊控制小於零 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 模糊控制等於零 PWM = PWM + 0 PWM 寬度不變 if ( I gt 0 ) 模糊控制大於零 PWM = PWM + 1 PWM 寬度加 1 CW() 判斷 PWM 寬度上下限

61

void CW() 判斷 PWM 寬度上下限 if ( PWM gt= 215 ) 若 PWM 寬度 gt= 最大寬度 j = 215 PWM 寬度維持於 215us if ( PWM lt= 5 ) 若 PWM 寬度 lt= 最小寬度 j = 5 PWM 寬度維持在 5us if ( PWM gt 5 ampamp PWM lt 215 ) PWM 寬度介於最大與最小間 j = PWM PWM 依模糊控制判斷結果增減 void delay1ms(int count) 延遲 1ms int x y for ( x = 0 x lt count x++ ) for ( y = 0 y lt 122 y++ ) void convert() 數位資料換算成馬達轉速 r1 = ((value)40)-160

62

附錄 C LCD 顯示之程式

includereg51h 含 8051 所有暫存器宣告 include mathh define RS P3_5 LCD 指令資料選擇控制 define RW P3_4 LCD 讀寫控制腳 define Enable P3_3 LCD 致能接腳 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P0_0 = 0x80 接腳定義 sbit P0_1 = 0x81 接腳定義 sbit P0_2 = 0x82 接腳定義 sbit P0_3 = 0x83 接腳定義 sbit P0_4 = 0x84 接腳定義 sbit P0_5 = 0x85 接腳定義 sbit P0_6 = 0x86 接腳定義 sbit ADCRD = P3^7 設定 RD 控制線接腳為 P37 sbit ADCWR = P3^6 設定 WR 控制線接腳為 P36 void delay(void) 函數原型宣告 void delay10ms(int count) 函數原型宣告 void display(void) 函數原型宣告 void InitialLCD(void) 函數原型宣告 void WriteIns(char) 函數原型宣告 void WriteData(char) 函數原型宣告 void WriteString(charchar) 函數原型宣告 void CheckBusy(void) 函數原型宣告 void convert(void) 函數原型宣告 char MSG0[] = Motor Speed = 定義字串 MSG0 char MSG2[] = rpm 定義字串 MSG2 unsigned char MSG1[8]=0000000 定義字串 MSG1 unsigned long int value 讀取 ADC0804 數位資料 int sample = 1000 取樣率設定消除顯示值跳動 long int rpm

63

main() 主程式 InitialLCD() 初始化 LCD IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x01 設定計時器 0 工作於模式 1 TH0 = (65536-5000)256 設定計時器 0 初值 TL0 = (65536-5000)256 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 while(1) 等待中斷 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 while (--sample == 0) 取樣率減 1 sample = 1000 重設取樣率 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 void T0_int(void) interrupt 1 LCD 顯示動態掃描 display() 動態掃描顯示 TH0 = (65536-65535)256 重設計時初值 TL0 = (65536-65535)256

64

void InitialLCD(void) 設定 LCD 模組初始狀態 delay() 延遲函數 WriteIns(0x38) 設定 LCD 模組為 WriteIns(0x38) 2 行顯示 WriteIns(0x38) 8 位元介面 WriteIns(0x38) 5x7 點字型 WriteIns(0x08) 關閉顯示器 WriteIns(0x01) 清除 LCD 螢幕 WriteIns(0x0c) 令顯示器 ON但游標不顯示 WriteIns(0x06) 令 LCD 模組每接收到 1Byte 資料 AC 值自動加 1 void display() 掃描顯示 WriteIns(0x80) 設定 LCD 座標 WriteString(13MSG0) 將字串 MSG0 寫入 LCD 中 WriteIns(0xc0) 設定 LCD 座標 WriteString(8MSG1) 將字串 MSG1 寫入 LCD 中 WriteIns(0xc8) 設定 LCD 座標 WriteString(4MSG2) 將字串 MSG2 寫入 LCD 中 void convert(void) 換算轉速 long int freq freq = ((value)4000) - 16000 數位資料換成頻率公式 rpm = freq3 頻率換算轉速公式 MSG1[0] = (rpm1000000)+0x30 將結果存入字串 MSG1 中 MSG1[1] = ((rpm1000000)100000)+0x30 MSG1[2] = ((rpm100000)10000)+0x30 MSG1[3] = ((rpm10000)1000)+0x30 MSG1[4] = 0x2e MSG1[5] = ((rpm1000)100)+0x30 MSG1[6] = ((rpm100)10)+0x30 MSG1[7] = rpm10+0x30

65

void WriteIns(char instruction) 寫命令至 LCD 中 RS = 0 選擇指令暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = instruction 輸出命令至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteData(char i) 寫資料至 LCD 中 RS = 1 選擇資料暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = i 輸出資料至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteString(countMSG) 寫字串至 LCD 中 char count 字串長度 char MSG[] 字串資料 char i 定義位元組變數 for(i=0 iltcount i++) count 個位元組 WriteData(MSG[i]) 寫入一位元組的資料至 LCD 中 void CheckBusy(void) char i=0x80 檢查忙碌旗標 while(iamp0x80) 忙錄旗標 BF = 1 RS = 0 選擇指令暫存器 RW = 1 讀取 Enable = 1 致能 LCD i = P2 讀取 LCD 指令暫存器內的資料

66

Enable = 0 除能 LCD delay() 延遲函數 void delay() 延遲 5ms int i for(i=0 ilt250 i++)

  • 畢業專題封面pdf
  • File0004pdf
  • 最終版pdfpdf
Page 29: Based on Fuzzy Control Theorem and TPWM Method for DC ... · 使吾人想設計一模糊控制器來做為馬達轉速的閉迴路控制,以解決非線性系統的 問題。除此之外,flcs

20

對OP1而言是反相積分器 2ov 為其輸入 1ov 為其輸出則

tCIt

Rv

Ct

CRv

dtvCR

v oooo

11

2

11

22

111

11minus=minus=minus=minus= int 〈35〉

因為

1

2

Rvv

I o minusminus= 0=minusv 〈因為虛接地〉 〈36〉

所以

1

2

Rv

I o= 〈37〉

又因運算放大器的輸入阻抗非常大則流經 1C 的電流也為 I 相當於以定

電流對電容C 充電

當 12 sato Ev = 時 1ov 為下降斜波

tR

EC

v sato

1

1

11

1minus= 〈38〉

當 22 sato Ev minus= 時 1ov 上升斜波

( )

tRE

Cv sat

o1

2

11

1 minusminus= 〈39〉

由此可知三角波的上升與下降斜波乃因 1C 的充電與放電且時間

常數為 11CR

三角波週期分析如下

1 上升斜波的時間 1T

tCR

vv o

o1

1

21 minus= 11

2

1 CRvv

to

ominus=

1Tt = TLTHo VVv minus=1 22 sato Ev =

11111

21

sat

TLTH

sat

TLTH

EVV

CRCRE

VVT

minus=

minusminus= 〈310〉

2 下降斜波的時間 2T

tCR

vv o

o1

1

21 minus= 11

2

1 CRvv

to

ominus=

21

2Tt = THTLo VVv minus=1 12 sato Ev =

1

11111

1sat

TLTH

sat

THTL

EVV

CRCRE

VVT

minus=

minusminus= 〈311〉

3 週期 21 TTT +=

若 1satE = 2satE = satE 且3

22RR

VV TLTH =minus satE

3

2114

RR

CRT=

若R3 = nR2

則nCR

T 114=

114 CR

nf = 〈312〉

《實驗結果》

必須注意的是三角波的頻率太低將導致馬達的轉動產生脈動現象

故將工作頻率設計在1kHz以上

Ω= k1501R Ω= k102R

Ω= k203R pFC 22001 =

所得到的三角波頻率為

15kHz10220010001504

00010100020

f 12- =timestimestimestimes

timestimes

=

圖 34 三角波輸出波形

22

〈2〉 脈寬調變電路〈PWM〉

+12V

-12V

10k

+12V

-12V -

+ PWM輸出LM324三角波輸入

圖 35 脈寬調變電路

PWM系統往往連接至直流電源供應放大器的工作是以固定的頻率開

閉直流供應電壓其激發角是可以調整的因此得到波寬可調的輸出

將固定頻率的三角波與反向輸入的電壓做比較便可輸出一脈寬〈見圖

36〉反向電阻值的不同將導致反向輸入電壓不同故其輸出為一可調但

頻率固定的脈寬也正因為如此故稱為脈寬調變〈PWM〉由於輸出的

dutycycle不同故馬達將接收到不同的平均電壓因而可以藉由PWM控制

馬達的轉速

反相輸入電壓

PWM

圖 36 三角波與反相輸入電壓比較

23

PWM的優點在於馬達驅動電路的電晶體之控制信號改以脈波列來控

制使電晶體操作成類似開關的動作不是完全導通就是完全截止故電晶

體不是一直操作於作用區所以其功率消耗不大整體效率較高

《實驗結果》

圖 37 PWM 輸出波形

322 橋型驅動功率放大電路

如圖38所示主要由四個功率電晶體組成利用不同的電晶體對使直流

馬達做正逆轉控制當Q5Q8導通使馬達正轉當Q6Q7導通馬達則逆

轉電路中的電晶體扮演開關的作用

此種電路簡單只要一組直流電源供應且電晶體分擔了部份的電壓保護

電晶體迅速工作於截止與飽和狀態之間故沒有功率散逸損失之虞

但是在設計時切勿使Q5Q6同時導通以免燒毀電路上之元件因為在

AB兩脈波短暫的交變時間內由於電晶體本身之最小延遲時間有可能使Q5

Q6同時ON與Q7Q8在很短時間同時ON因此在15kHz交變下容易燒毀功

率電晶體

因此設計一間距脈波電路主要之功用使Q5Q6和Q7Q8均不同時導通

24

以拉長AB兩者交換時間

M

20k

10k

20k

10k

+24V

A 信號 B 信號

2N3055 2N3055

2N2955 2N2955

1N40021N4002

C1815 C1815

C1815 C1815

Q5

Q8Q6

Q7

圖 38 橋型驅動功率放大電路

圖 39 橋型驅動功率放大電路實體圖

25

此外若考慮電晶體BE間的電壓則電路會出現約 plusmn 06V的不感帶〈ded

band〉即電晶體的 oV 對 inV 間的關係如圖3101假使 inV 電壓為正弦波則 oV 變

成如圖3102為了改善這種缺失吾人利用兩個二極體接在電路上如圖38

用來補償電晶體BE間的壓降﹝10﹞

約06V

Dead band

Vo

Vin

圖 3101 呈現不感帶的轉移函數

圖 3102 輸出電壓波形

26

323 間距脈波產生電路

RCext15

Cext14 74123

A3

B2

Q13

CLR1

Q4

7486100k

2200pF

10k

10000pF

+5V

間距脈波輸出

圖 311 間距脈波產生電路

間距脈波的產生方式是根據脈寬調變〈PWM〉後的訊號再經由積分電路的

電阻兩端取出且經由兩倍頻器〈74LS86〉檢示出PWM的正負緣脈波最後

再利用單穩態IC〈74LS123〉將檢出信號之脈寬拉長至01ms此即為間距脈波

74LS123有兩個輸入端子A及B分別為下降波緣輸入端子及上升波緣輸入端

子當輸入A之脈波由ldquoH變成ldquoL之瞬間Q輸出變為ldquoH其持續時間長

短由RC時間常數決定反之當輸入B之脈波由ldquoL變成ldquoH之瞬間Q輸出

變成ldquoH維持一定時間

74LS123的輸出脈波之寬度是由電阻及電容之時間常數所決定概略計算公

式如下

CR045T timestimes=

電容 C 必須大於 1000pF

27

《實驗結果》

R=24kΩ C=10000pF

所以得到間距脈波為

( )msec0110810000p24k045T cong=timestimes= μ

圖 312 間距脈波

研究經分析後發現

1 間距 T 愈大愈能確保電路之安全性愈有保護作用

2 間距 T 愈大相對的使驅動信號脈波減少愈多造成馬達旋轉扭力大

大減弱

3 適當的間距 T不但不會影響馬達的輸出轉矩而且兼具保護電路的

效果

33 編碼器

轉動編碼器不只可以作為轉速的感測也能做位置的感測又適合於數位處

理故被廣泛使用若就信號來看轉動編碼器可分為增量型與絕對型若以檢

測的方式來分可分為光學式和磁式兩種在本專題中所使用的編碼器為光學式

增量型編碼器﹝11﹞

光學式轉動編碼器的原理如圖 313在附有細縫轉盤的兩側分別裝置發光元

28

件與受光元件如果只有一組光電檢測元件則輸出信號就只有一相的脈波信

號此種裝置稱為脈波產生器圖 314 為增量型轉碼器的輸出信號它是利用

兩組光電元件所產生的脈波信號A 相和 B 相間有相位差正轉時 A 相領前 B

相逆轉時 B 相領前 A 相因此利用此兩相做檢測馬達為正轉或逆轉的工作

並利用 A 相或 B 相的頻率檢測出目前的轉速

吾人計算出編碼器每一轉可以產生約 200 個脈波故檢測 A 相或 B 相其頻

率為 N則轉速應為 60200

timesN

〈rpm〉

圖 313 光學式轉動編碼器的原理圖

圖 314 編碼器的輸出信號波形

29

34 LM2917 FV 電路設計

對 LM2907 而言磁滯比較器和電流汞是構成頻率對電壓轉換的基本架構

並且預留一個運算放大器及一個電晶體供各種不同的使用圖 315 為吾人所設

計的 FV 電路圖中 C1 用以抑制電流汞動作時所產生的漣波變化正常使用時

此電容應大於 10C若 C1 太大也將造成轉換速度下降

因為單晶片 8051 之輸入電壓最高為 5V故必須設計其馬達最高轉速頻率所

轉成的電壓必須在 5V 以內由於馬達轉速頻率範圍極大故吾人給予 LM2917

+12V 的電壓以擴大它可以轉換的電壓範圍並將所需維持在 5V 內

a1

14

b1

1

a1

13

b1

2

a1

12

b1

3

a1

11

b1

4

1

a1

10

b1

5

a1

8

b1

7

a1

9

b1

6

L2917

Encoder輸 入

1uF

+12V

FV輸出1000pF

45k 10kC1

C2

圖 315 FV 電路

30

《實驗結果》

根據統計結果每 50mV 相對於 100Hz如此一來吾人想得知馬達目前

的轉速只要將單晶片所接收到的電壓值經過換算即可得知目前 encoder 所量測

的頻率吾人知道 encoder 一圈可產生 200 個脈波故馬達的轉速便可經過下列

公式換算得知

轉速〈rpm〉 60200

times=f

其中 =f encoder 所量測到的頻率

表 31 頻率與轉換電壓之關係

頻率

(Hz) 1 2 3 4 5 6 7 8 9

電壓(V) 0006 0006 0007 0008 0009 0009 0009 0009 001

頻率

(Hz) 10 20 30 40 50 60 70 80 90

電壓(V) 008 009 010 010 011 011 012 012 013

頻率

(Hz) 100 200 300 400 500 600 700 800 900

電壓(V) 013 018 023 028 033 038 043 049 054

頻率

(Hz) 1000 2000 3000 4000 5000 6000 7000 8000 9000

電壓(V) 059 109 16 209 257 304 3508 4006 45

31

圖 316 頻率對電壓曲線

35 單晶片介面電路

單晶片介面包括了二大部分分別為單晶片 8051AD converter

〈1〉8051 單晶片

為本控制系統的核心一切動作皆經由它控制

〈2〉AD converter

將類比開關所送出來的類比訊號經由 ADC 0804 轉換成數位訊號傳送

到單晶片的輸入埠

351 AD 轉換

以單晶片 8051 控制 ADC0804則單晶片 8051 必須下達ldquo開始轉換rdquo的命令

給 ADC0804然後 ADC0804 就開始讀入類比輸入端的電壓在內部開始轉換

經過一段轉換時間後〈約 100μ s〉ADC0804 就將轉換完成的值放在其內部的三

態輸出栓鎖緩衝器裡然後將轉換完成輸出腳〈INTR〉降為 low以通知單晶片

可以去讀轉換完成資料

當WR和CS 同時為ldquo0rdquo時表示對 ADC0804 下達ldquo開始轉換rdquo命令再經過

32

一段轉換時間〈100μ s〉後轉換完成ADC0804 會將其轉換完成的數位資料放

在其內部 8 位元緩衝區裡且將 INTR 降為ldquo0rdquo因此單晶片只要下達ldquo開始轉換rdquo

命令後去檢查 INTR 的狀態就可以知道是否轉換完畢其方法有兩種

1 輪詢法〈polling〉

2 中斷法〈interrupt〉

所謂輪詢法就是將 ADC0804 的 INTR接到 CPU 的一條 IO 線上然後以軟體指

令主動偵測其狀態當偵測到為ldquo0rdquo時就可以去讀出 ADC0804 裡的緩衝區的轉

換值

中斷法是一個很理想的 IO 方式因為不像輪詢法必須讓 CPU 等 ADC0804

轉換當 CPU 下達ldquo開始轉換rdquo命令後就可以做其他工作當 ADC0804 轉換完

畢後 INTR會降為ldquo0rdquo可以利用此信號去中斷 CPU再由中斷副程式去讀入

轉換值即可因此大大提高了程式的效率

當 CPU 接收到 ADC0804 發出ldquo轉換完畢rdquo的信號〈 INTR =0〉後就可以去

讀出轉換值其讀出的方法是將CS 與RD設為ldquo0rdquo即可讀到轉換值這個讀值的

動作又會使得 INTR恢復成ldquo1rdquo

1 CPU 下達ldquo開始轉換rdquo命令〈CS =0WR =0〉

2 ADC0804ldquo轉換完畢rdquo 〈 INTR =0〉

3 CPU 讀取轉換值〈 RD =0CS =0〉

4 讀完後 INTR =1

ADC0804 主要規格摘要如下

1 +5V 單電源工作電壓

2 類比電壓輸入範圍 0~+5V

33

3 參考電壓為 25V

4 轉換時間為 100μ s〈 CLKf =640kHz〉

5 解析度為 8 位元

6 誤差plusmn 1LSB

7 讀取時間 135ns

36 電源供應系統

本專題中所有電路及硬體設備所需的電源採用交流電源 110V 經由 PT-31

變壓器後再經過橋式整流後提供了直流電源而因為各個電路所需電源不同

因此製作了多組的變壓電路如下

1電壓源 DC5V選擇了 7805 的穩壓 IC 搭配電容得到了+5V 的電壓源

供〈1〉8051 微處理器 〈2〉ADC 0804 〈3〉74LS8674LS12374LS04

74LS02CD4013 〈4〉馬達 Encoder

2電壓源 DC12V使用 7812 穩壓 IC 搭配電容得到+12V 的電壓源供

LM2917 使用

3電壓源 DC24V利用 7824 的穩壓 IC 搭配電容獲得+24V 的直流電壓

源供電路之橋型驅動功率放大之電晶體使用

Vin1

+12V2

GND3

LM7812

2200uF 10000pF 2200uF 10000pF

+12V outputAC

圖 317 直流電源電路

34

圖 318 直流電源電路實體圖

37 馬達轉速的量測

表 33 PWM 輸出對應 encoder 週期

PWM dutycycle encoder 週期 PWM dutycycle encoder 週期

40 sμ 172 sμ 440 sμ 0 sμ

80 sμ 188 sμ 480 sμ 0 sμ

120 sμ 204 sμ 520 sμ 0 sμ

160 sμ 230 sμ 560 sμ 0 sμ

200 sμ 272 sμ 600 sμ 0 sμ

240 sμ 328 sμ 640 sμ 0 sμ

280 sμ 416 sμ 680 sμ 1320 sμ

320 sμ 540 sμ 720 sμ 750 sμ

360 sμ 800 sμ 760 sμ 510 sμ

400 sμ 1320 sμ 800 sμ 400 sμ

35

圖 319 PWM 輸出對應 encoder 週期

由統計可知道此馬達並不是一顆線性馬達故相信若使用模糊控制理論來

作為其回授控制系統的控制器一定能達到比傳統控制器的性能還要好而且若能

在模糊控制裡加上 PID 控制器的觀念一定能在系統的響應時間上升時間

安定時間和超越量達到最佳的控制另一方面馬達在其反方向的內阻較大需

要更大的力量才能使馬達驅動

36

第四章 軟體規劃與製作

41 PWM 之軟體設計

因為之前所介紹的硬體方式是以調整可變電阻來達到轉速的調整因此無法

得知所給予的脈寬長度和轉速大小尤其在回授時也不易給予適當的訊號來調整

轉速因此改良之方法就是以8051之軟體撰寫方式來產生固定的脈寬也就等

於給予轉速的命令而在其回授控制時也只要在內部程式给予適當的指令便可

達到脈寬長度的調整以達到閉迴路之受控系統

411 PWM 軟體流程

設定Timer0模式為0

TH0 = temp 32 TL0 = temp 32

temp = 8192 ndash j4 Key = 0

檢查是否有鍵值

將鍵值存入Key

Yes

No

設定Key值所對應的 j值

If P30 == 1Then P30 = 0 temp = 8192 ndash j4Else P30 = 1 temp=8192ndash880+j4

TH0 = temp 32 TL0 = temp 32

Start Timer0中斷副程式

啟動Timer0

等待Timer0中斷

返回主程式

圖 41 PWM 軟體設計流程圖

37

在此總共設計了五個按鈕分別代表不同的轉速停止正轉〈慢〉正轉

〈快〉逆轉〈慢〉和逆轉〈快〉使用Timer0是因為8051之計時中斷比延遲程

式來的準確故可以達到準確的計時程式設計理念中並沒有將中斷致能清除

因此Timer0會一直處於計時的狀態程式執行時將一邊檢查鍵值〈KeyStatus〉一

邊進行計時當計時完畢便呼叫中斷副程式然後執行改變Port 30的輸出狀

態若是為high則變為low反之若是為low即變為high同時並重設計時時間

Timer0繼續計時

當鍵值改變時計時的時間也會跟著改變如此一來Timer0將ㄧ直重覆上

述動作直到電源切掉Timer0才會停止計時

42 模糊控制之程式規劃與撰寫

本專題目標在完成了先前所規劃的硬體電路之後接著就是要達成利用模糊

控制理論來設計控制器在此採用了單晶片8051目的是為了以硬體實現方式來

代替電腦模擬期望能夠按照原訂計畫完成本專題「具模糊控制理論與雙脈寬調

變法之直流馬達驅動電路設計」

單晶片 8051 模糊控制的程式撰寫採下列幾個步驟依序完成

1 設定變數轉速誤差〈dspeed〉目前轉速〈sspeed〉

2 模糊化採用三角形歸屬函數採用三角形歸屬函數的原因

〈1〉 三角形函數為一連續函數

〈2〉 三角形函數為線性的函數所以計算速度較快

〈3〉 是具有發散也有收斂的函數和指數函數一樣接近

事實

3 模糊推論模糊規則將其所有可能發生情況以 IFhellipTHENhellip表示

並建立控制規則表

4 解模糊化採用重心法

38

421 歸屬函數

設定變數為目前轉速〈sspeed〉與轉速誤差〈dspeed〉因此此模糊控制器共

有兩個輸入訊號與一輸出訊號輸出訊號為脈寬長度該加或是減多少又因為有

五種不同的轉速因此各分別設計了不同的歸屬函數如下

1 當轉速 = 0

ml h

s s p e e d

d s p e e d

r p m0 5 0 1 0 0- 5 0- 1 0 0

mv l l h v h

r p m0- 3 0- 6 0- 1 0 0 3 0 6 0 1 0 0 圖 42 停止時之歸屬函數

2 正轉〈慢〉

ml hsspeed

dspeed

rpm150 225 300750

mvl l h vh

rpm150100500 200 250 300

圖 43 正轉〈慢〉之歸屬函數

39

3 正轉〈快〉

ml hsspeed

dspeed

rpm520 670 820370220

mvl l h vh

rpm500400300200 600 700 800

圖 44 正轉〈快〉之歸屬函數

4 逆轉〈慢〉

ml hsspeed

dspeed

rpm100 250 400500

mvl l h vh

rpm10050250 200 300 400 圖 45 逆轉〈慢〉之歸屬函數

40

5 逆轉〈快〉

ml hsspeed

dspeed

rpm300 450 600150

mvl l h vh

rpm450350250150 550 650 750

750

圖 46 逆轉〈快〉之歸屬函數

6 輸出

OutputMVL L H VH

rpm0-50-150-250 50 150 250

圖 47 輸出之歸屬函數

41

422 模糊規則庫

表 41 為吾人所設計的模糊控制規則庫並利用 Matlab 之 Fuzzy ToolBox 來

建立此規則庫以進行模擬推論圖 48 為當馬達輸入指令為正轉慢時推論後所得

到的三維空間圖

表 41 模糊控制規則表

Dspeed

vl l m h vh

l H M L VL VL

m VH H M L VL sspeed

h VH VH H M L

圖 48 推論後的三維空間圖

42

423 模糊控制器之軟體設計流程

Start 外部中斷副程式

ADCWR = 0 ADCWR = 1

〈令AD開始轉換〉

檢查鍵值以得到對應的歸屬函數

取得目前轉速與

轉速誤差

Fuzzy Rules決策

得到輸出訊號

Delay 10ms

ADC = 0 讀取AD值 ADCRD = 0

將AD值換算成轉速

ADCWR = 0 ADCWR = 1

〈AD開始轉換〉

返回主程式

致能外部中斷

圖 49 Fuzzy Controller 程式流程圖

當控制器一開始動作時便先執行AD轉換的工作當AD轉換完成時其

INTR的接腳便會觸發8051的外部中斷INTR0於是程式便發生外部中斷執行

外部中斷副程式的指令

43

在外部中斷副程式中AD將ㄧ直進行轉換與讀取的工作同時並將轉換後

的值直接換算成目前轉速與轉速誤差以供模糊控制器使用換算目前encoder

的頻率其公式為

160-V2000 times=頻率 〈4-1〉

式4-1之公式是根據表31所導出來的其中V為encoder之頻率轉成電壓之值

又假設所讀取的AD轉換值為value因為

AD的解析度 = bit256

5V+ = 511 ( Vbit ) 〈4-2〉

故value值與電壓V之關係為

511 value V times= 〈4-3〉

所以encoder之頻率與value值的關係為

頻率= 2000times ⎟⎠⎞

⎜⎝⎛ times

511 value - 160 〈4-4〉

故目前轉速為

sspeed = ( )rpm 60 200

times頻率 〈4-5〉

另ㄧ方面在主程式中程式會先去檢查鍵值也就等於檢查輸入指令以

找出符合使用的歸屬函數並將AD所獲得的轉速對應到歸屬函數中然後執行

決策判斷即進入規則庫中尋找出適當的決策判斷最後將此決策送入PWM程

式裡進行脈寬長度的調整使馬達在合理的要求下達到理想的轉速控制不會

因為外在環境的影響而使馬達轉速受到干擾

43 LCD 顯示轉速

此專題最後再增加一LCD顯示幕以顯示目前的轉速否則在程式設計完成

後人卻因無法以肉眼得知目前轉速而不能肯定馬達轉速是否有達到控制的目

標因此增加一顯示幕LCD是有必要的不僅隨時得知目前的轉速還能知道

44

設計出來的軟體其控制性是否夠好夠穩定

431 LCD 顯示幕之軟體流程

Start

設定LCD模組的初始狀態

設定外部中斷INTR0

與Timer0

設定TH0 = (65536 ndash 5000) 256 TL0 = (65536 ndash 5000)256

令ADCWR = 0 ADCWR = 1 AD開始轉換

等待中斷

外部中斷副程式

ADCRD = 0 讀取AD值 ADCRD = 1

將AD值換算成速度

ADCWR = 0 ADCWR = 1 AD開始轉換

Timer0中斷副程式

顯示LCD第一行

ldquoMotor Speed =

顯示LCD第二行ldquoxxxxxxx rpm其中 xxxxxx為外部中斷副程式所換算出的轉速

重設TH0與TL0

返回主程式返回主程式

圖 410 LCD 顯示幕之程式流程圖

此程式主要由兩個部分完成一為外部中斷副程式另ㄧ為 Timer0 中斷副

程式當主程式完成外部與 Timer0 兩個中斷的設定後隨即命令 AD 開始轉換

之後便一直停在 while〈1〉的迴圈裡不做任何動作而由兩個中斷副程式來完

成整個轉換與顯示的工作

45

外部中斷副程式主要負責 AD 的轉換讀取與轉速換算的工作AD 第一

次的轉換由主程式來下達命令當轉換完成後AD 的 INTR 接腳將觸發外部中

斷〈INTR0〉副程式此時程式便進入外部中斷副程式執行讀取 AD 值與轉速

換算的工作當這些工作完成時外部中斷副程式再次下達 AD 開始轉換的命

令而離開中斷副程式當 AD 再次轉換完成時又將再次執行中斷副程式

如此週而復始中斷副程式將ㄧ直進行讀取換算與轉換的工作

而 Timer0 中斷副程式主要負責 LCD 顯示之工作當主程式所設定的計時時

間計數完時程式便進入 Timer0 中斷副程式一旦進入 Timer0 中斷副程式程

式將執行 LCD 的顯示然後再重設 Timer0 的計數時間Timer0 將重新計數當

計數完時程式又將再度進入 Timer0 中斷副程式執行因為程式中並無清除

Timer0 的中斷致能故 Timer0 中斷副程式和外部中斷副程式ㄧ樣週而復始的

執行其副程式的工作

46

第五章 結論

本計劃主旨為具模糊控制理論與雙脈寬調變法之直流馬達驅動電路設計主

要是針對傳統電路設計之缺點提出改良之方法以TPWM取代PWM電路以模

糊理論基礎設計之控制器替代傳統PID控制器

TPWM轉速控制優於PWM之處在於

1 TPWM只需使用單電源即可達到正轉和逆轉的轉速控制而PWM必須

加上逆向開關或是雙電源才能使馬達產生正轉和逆轉

2 TPWM可控制馬達處於停止狀態無論在正向或逆向加上負載皆無法使

馬達產生轉動

3 馬達消耗定額功率輸出轉矩為額定值

4 馬達由停止到某定轉速時反應時間較快

模糊控制器優於PID控制器

1 不須導出繁雜的數學模型

2 適用於非線性系統

3 強健性與容錯性較高

本專題至此雖說大致的目標都已達到但是此系統仍然有許多不完美而需要

改進的地方例如在實驗過程中發現整個轉速的控制在回授上其反應時間

有點慢探討其原因有可能是控制器之程式上的問題

1 因為使用C語言撰寫程式故其執行速度較慢

2 程式可能寫的太累贅

3 模糊控制規則庫建立不良

若想改善這些問題可以嘗試著將C語言改為組合語言來撰寫並盡量減少

47

不必要的指令相信此動作一定能大大提昇程式的執行速度其次就是多做測

試利用測試中所學到的經驗來幫助模糊控制規則庫的改寫同時也能從測試中

發現更多的問題若是都能對問題加以一一解決的話相信必定能將此控制系統

做的更盡善盡美

48

參考文獻

﹝1﹞ 李適中直流馬達速度控制伺服控制〈基礎篇〉全華科技圖書股份有

限公司民 74

﹝2﹞ 廖錦文ldquo直流電動機之雙脈寬調變是〈TPWM〉驅動電路研究電

子技術月刊第 69 期pp94-1021992

﹝3﹞ 楊英魁孫宗瀛鄭魁香林建德蔣旭堂模糊控制理論與技術全華

科技圖書股份有限公司民 85

﹝4﹞ 林敦煌陳憬德直流馬達定位及轉速的模糊控制逢甲大學自動控制工

程學系學士論文民 87

﹝5﹞ LAZadehldquo Fuzzy Sets Information and Control Vol8 pp338-353

1965

﹝6﹞ EHMamdani and SAsslianldquo A fuzzy logic controller for a dynamic

plant Internation Journal of Man-Machine Studies Vol7 pp1-13 1975

﹝7﹞ 孫宗瀛楊英魁Fuzzy 控制理論實作與應用全華科技圖書股份有

限公司民 83 年

﹝8﹞ 許中平黃煌嘉直流電動機控制電路設計全華科技圖書股份有限公司

民 75

﹝9﹞ 盧明智黃敏祥OP Amp 應用+實驗模擬全華科技圖書股份有限公司

民 83

﹝10﹞陳文耀電動機控制工程復文書局2003

﹝11﹞許中平林全福電動機運轉控制技術全華科技圖書股份有限公司民

77

﹝12﹞楊明豐8051 單晶片 C 語言設計實務碁峯資訊2003 年

﹝13﹞蔡朝洋單晶片微電腦 80518951 原理與應用全華科技圖書股份有限公

司民 91

49

﹝14﹞王文俊認識 Fuzzy全華科技圖書股份有限公司民 90

50

附錄 A 專題硬體展示圖

圖 A-1 硬體整體圖

圖 A-2 硬體整體鳥瞰圖

51

圖 A-3 硬體側視圖

圖 A-4 操作與顯示面板

圖 A-5 間距脈波電路與 FV 電路

52

圖 A-6 橋型驅動功率放大電路

圖 A-7 操作與控制面板

53

附錄 B PWM 與模糊控制之程式

include reg51h include stdioh sbit ADCRD = P3^1 設定 RD 控制線接腳為 P31 sbit ADCWR = P3^3 設定 WR 控制線接腳為 P33 sbit P2_0 = 0xA0 接腳定義 sbit P2_1 = 0xA1 接腳定義 sbit P3_0 = 0xB0 接腳定義 sbit P3_1 = 0xB1 接腳定義 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P3_6 = 0xB6 接腳定義 void KeyStatus(void) 函數原型宣告 void feedback(void) 函數原型宣告 void compute_grade(void) 函數原型宣告 void delay1ms(int count) 函數原型宣告 void convert() 函數原型宣告 void condition() 函數原型宣告 void CW(void) 函數原型宣告 int j i 對應 PWM 的寬度 unsigned int temp 所設計的計時器時間 int sample = 1000 取樣率設定消除顯示值跳動 long int value r1 讀取 ADC0804 數位資料 long int set n condition select long int r grade_reg[2] grade[15] error1 error2 long int a1 b1 I long int membership[5][3]membership1[3][3] 定義歸屬函數 long int membership2[3][3] = -10-50-5050510 long int error[2] int Rule[15][3] = 113213313 定義判斷規則庫 212223323 311232333 411241342 511251351

54

main() 主程式 j = PWM = 110 設定 PWM 初始值 IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x00 設定計時器 0 工作於模式 0 temp=8192-j4 設定計時器 0 初值 TH0 = temp 32 TL0 = temp 32 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 P3_4 = 1 P3_5 = 0 P3_6 = 0 ADCWR = 0 令 ADC0804 的 WR = 0 ADCWR = 1 令 ADC0804 的 WR = 1 while (1) KeyStatus() 檢查鍵值 void KeyStatus(void) 檢查鍵值並給對應的 PWM 值 char KeyScan(void) 按鍵掃描函數宣告 unsigned char KeyStatus unsigned char Key = 0 KeyStatus=KeyScan() 呼叫按鍵掃描函數 if (KeyStatus = 0) 已有按鍵輸入 Key = KeyStatus Key = 鍵值 if (Key == 0x01) 假如輸入為按鍵 1 i = 110 PWM 為 110us j = i P3_4 = 1 LED 亮第一顆〈表馬達停止〉 P3_5 = 0 P3_6 = 0

55

else if (Key == 0x02 ) 假如輸入為按鍵 2 i = 140 PWM 為 140us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x04 ) 假如輸入為按鍵 3 i = 180 PWM 為 180us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x08 ) 假如輸入為按鍵 4 i = 80 PWM 為 80us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 else if (Key == 0x10 ) 假如輸入為按鍵 5 i = 40 PWM 為 40us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 PWM = j delay1ms(10) 呼叫延遲函數 feedback() 模糊控制判斷

56

void To_int(void) interrupt 1 Timer0 中斷函數 if (P3_0 == 0) 假如 PWM 輸出為 Low P3_0 = 1 變更 PWM 輸出為 High temp=8192-j4 設定 High 的時間 else 若 PWM 輸出為 High P3_0 = 0 變更 PWM 輸出為 Low temp=8192-880+j4 設定 Low 的時間 TH0 = temp 32 Timer0 的計時時間 TL0 = temp 32 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 char KeyScan(void) 檢查鍵值 char KeyStatus 按鍵狀態 P0=0xff 設定 P0 為輸入模式 KeyStatus=~P0 讀取按鍵狀態 return(KeyStatus) 將鍵值送回程式 void feedback(void) 模糊判斷 void Fuzzycontroller() 函數原型宣告 void condition1() 函數原型宣告

57

void condition2() 函數原型宣告 error1 = ((value)40-160)03 輸入變數 1 delay10ms(10) 延遲 10ms error2 = ((value)40-160)03 輸入變數 2 if (key == 0x01 ) 當按鍵 1找出對應的歸屬函數 並做出模糊控制判斷

int membership[5][3]= -100-60-30-60-300-30030030603060100

int membership1[3][3]=-100-500-50050050100 Fuzzycontroller() condition() if (key == 0x02 ) 當按鍵 2找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

05010050100150100150200150200250200250300 int membership1[3][3]=07515075150225150225300 Fuzzycontroller() condition() else if (key == 0x04) 當按鍵 3找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

200320400300400500400500600500600700600700800 int membership1[3][3]=220370520370520670520670820 Fuzzycontroller() condition() else if (key == 0x08) 當按鍵 4找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

02550255010050100200100200300200300400 int membership1[3][3]=05010050100250100250400 Fuzzycontroller() condition()

58

else if (key == 0x10) 當按鍵 5找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

150250350250350450350450550450550650550650750 int membership1[3][3]=150300450300450600450600750 Fuzzycontroller() condition2() void Fuzzycontroller() 模糊控制判斷 void compute_grade() 函數原型宣告 void compute_grade1() 函數原型宣告 a1 = 0 b1 = 001 I = 0 for (n=0 nlt=14 n++) r = error1 set = Rule[n][0]-1 compute_grade() 計算輸入變數 1 與

模糊程度的歸屬函數 condition = 1 r = error2 set = Rule[n][1]-1 compute_grade1() 計算輸入變數 2 與 模糊程度的歸屬函數 grade[n] = MIN(grade_reg[0] grade_reg[1]) a1 = a1 + (grade[n]membership2[Rule[n][2]-1][1]) b1 = b1 + grade[n] I = a1 b1 得到模糊控制判斷的結果 void compute_grade() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership[set][0]) || (r gt membership[set][2])) 當輸入變數不在 歸屬函數內

59

grade_reg[condition] = 0 else if ((r gt membership[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership[set][2]-r) (membership[set][2] - membership[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership[set][0]) (membership[set][1] - membership[set][0]) void compute_grade1() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership1[set][0]) || (r gt membership1[set][2])) 當輸入變數不在 歸屬函數內 grade_reg[condition] = 0 else if ((r gt membership1[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership1[set][2]-r) (membership1[set][2]-membership1[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership1[set][0]) (membership1[set][1]-membership1[set][0])

60

void condition() P2_0 = 1 設定 P20 為輸入模式 P2_1 = 1 設定 P21 為輸入模式 if ( (P2_0 == 1) ampamp (P2_1 == 0)) 當馬達為正轉時 if ( I gt 0 ) 若模糊判斷結果為正 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 若模糊判斷結果為零 PWM = PWM + 0 PWM 寬度不變 if ( I lt 0 ) 若模糊控制結果小於零 PWM = PWM + 1 PWM 寬度加 1 else if ( (P2_0 == 0) ampamp (P2_1 == 1) ) 若馬達為反轉 if ( I lt 0 ) 模糊控制小於零 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 模糊控制等於零 PWM = PWM + 0 PWM 寬度不變 if ( I gt 0 ) 模糊控制大於零 PWM = PWM + 1 PWM 寬度加 1 CW() 判斷 PWM 寬度上下限

61

void CW() 判斷 PWM 寬度上下限 if ( PWM gt= 215 ) 若 PWM 寬度 gt= 最大寬度 j = 215 PWM 寬度維持於 215us if ( PWM lt= 5 ) 若 PWM 寬度 lt= 最小寬度 j = 5 PWM 寬度維持在 5us if ( PWM gt 5 ampamp PWM lt 215 ) PWM 寬度介於最大與最小間 j = PWM PWM 依模糊控制判斷結果增減 void delay1ms(int count) 延遲 1ms int x y for ( x = 0 x lt count x++ ) for ( y = 0 y lt 122 y++ ) void convert() 數位資料換算成馬達轉速 r1 = ((value)40)-160

62

附錄 C LCD 顯示之程式

includereg51h 含 8051 所有暫存器宣告 include mathh define RS P3_5 LCD 指令資料選擇控制 define RW P3_4 LCD 讀寫控制腳 define Enable P3_3 LCD 致能接腳 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P0_0 = 0x80 接腳定義 sbit P0_1 = 0x81 接腳定義 sbit P0_2 = 0x82 接腳定義 sbit P0_3 = 0x83 接腳定義 sbit P0_4 = 0x84 接腳定義 sbit P0_5 = 0x85 接腳定義 sbit P0_6 = 0x86 接腳定義 sbit ADCRD = P3^7 設定 RD 控制線接腳為 P37 sbit ADCWR = P3^6 設定 WR 控制線接腳為 P36 void delay(void) 函數原型宣告 void delay10ms(int count) 函數原型宣告 void display(void) 函數原型宣告 void InitialLCD(void) 函數原型宣告 void WriteIns(char) 函數原型宣告 void WriteData(char) 函數原型宣告 void WriteString(charchar) 函數原型宣告 void CheckBusy(void) 函數原型宣告 void convert(void) 函數原型宣告 char MSG0[] = Motor Speed = 定義字串 MSG0 char MSG2[] = rpm 定義字串 MSG2 unsigned char MSG1[8]=0000000 定義字串 MSG1 unsigned long int value 讀取 ADC0804 數位資料 int sample = 1000 取樣率設定消除顯示值跳動 long int rpm

63

main() 主程式 InitialLCD() 初始化 LCD IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x01 設定計時器 0 工作於模式 1 TH0 = (65536-5000)256 設定計時器 0 初值 TL0 = (65536-5000)256 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 while(1) 等待中斷 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 while (--sample == 0) 取樣率減 1 sample = 1000 重設取樣率 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 void T0_int(void) interrupt 1 LCD 顯示動態掃描 display() 動態掃描顯示 TH0 = (65536-65535)256 重設計時初值 TL0 = (65536-65535)256

64

void InitialLCD(void) 設定 LCD 模組初始狀態 delay() 延遲函數 WriteIns(0x38) 設定 LCD 模組為 WriteIns(0x38) 2 行顯示 WriteIns(0x38) 8 位元介面 WriteIns(0x38) 5x7 點字型 WriteIns(0x08) 關閉顯示器 WriteIns(0x01) 清除 LCD 螢幕 WriteIns(0x0c) 令顯示器 ON但游標不顯示 WriteIns(0x06) 令 LCD 模組每接收到 1Byte 資料 AC 值自動加 1 void display() 掃描顯示 WriteIns(0x80) 設定 LCD 座標 WriteString(13MSG0) 將字串 MSG0 寫入 LCD 中 WriteIns(0xc0) 設定 LCD 座標 WriteString(8MSG1) 將字串 MSG1 寫入 LCD 中 WriteIns(0xc8) 設定 LCD 座標 WriteString(4MSG2) 將字串 MSG2 寫入 LCD 中 void convert(void) 換算轉速 long int freq freq = ((value)4000) - 16000 數位資料換成頻率公式 rpm = freq3 頻率換算轉速公式 MSG1[0] = (rpm1000000)+0x30 將結果存入字串 MSG1 中 MSG1[1] = ((rpm1000000)100000)+0x30 MSG1[2] = ((rpm100000)10000)+0x30 MSG1[3] = ((rpm10000)1000)+0x30 MSG1[4] = 0x2e MSG1[5] = ((rpm1000)100)+0x30 MSG1[6] = ((rpm100)10)+0x30 MSG1[7] = rpm10+0x30

65

void WriteIns(char instruction) 寫命令至 LCD 中 RS = 0 選擇指令暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = instruction 輸出命令至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteData(char i) 寫資料至 LCD 中 RS = 1 選擇資料暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = i 輸出資料至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteString(countMSG) 寫字串至 LCD 中 char count 字串長度 char MSG[] 字串資料 char i 定義位元組變數 for(i=0 iltcount i++) count 個位元組 WriteData(MSG[i]) 寫入一位元組的資料至 LCD 中 void CheckBusy(void) char i=0x80 檢查忙碌旗標 while(iamp0x80) 忙錄旗標 BF = 1 RS = 0 選擇指令暫存器 RW = 1 讀取 Enable = 1 致能 LCD i = P2 讀取 LCD 指令暫存器內的資料

66

Enable = 0 除能 LCD delay() 延遲函數 void delay() 延遲 5ms int i for(i=0 ilt250 i++)

  • 畢業專題封面pdf
  • File0004pdf
  • 最終版pdfpdf
Page 30: Based on Fuzzy Control Theorem and TPWM Method for DC ... · 使吾人想設計一模糊控制器來做為馬達轉速的閉迴路控制,以解決非線性系統的 問題。除此之外,flcs

21

2Tt = THTLo VVv minus=1 12 sato Ev =

1

11111

1sat

TLTH

sat

THTL

EVV

CRCRE

VVT

minus=

minusminus= 〈311〉

3 週期 21 TTT +=

若 1satE = 2satE = satE 且3

22RR

VV TLTH =minus satE

3

2114

RR

CRT=

若R3 = nR2

則nCR

T 114=

114 CR

nf = 〈312〉

《實驗結果》

必須注意的是三角波的頻率太低將導致馬達的轉動產生脈動現象

故將工作頻率設計在1kHz以上

Ω= k1501R Ω= k102R

Ω= k203R pFC 22001 =

所得到的三角波頻率為

15kHz10220010001504

00010100020

f 12- =timestimestimestimes

timestimes

=

圖 34 三角波輸出波形

22

〈2〉 脈寬調變電路〈PWM〉

+12V

-12V

10k

+12V

-12V -

+ PWM輸出LM324三角波輸入

圖 35 脈寬調變電路

PWM系統往往連接至直流電源供應放大器的工作是以固定的頻率開

閉直流供應電壓其激發角是可以調整的因此得到波寬可調的輸出

將固定頻率的三角波與反向輸入的電壓做比較便可輸出一脈寬〈見圖

36〉反向電阻值的不同將導致反向輸入電壓不同故其輸出為一可調但

頻率固定的脈寬也正因為如此故稱為脈寬調變〈PWM〉由於輸出的

dutycycle不同故馬達將接收到不同的平均電壓因而可以藉由PWM控制

馬達的轉速

反相輸入電壓

PWM

圖 36 三角波與反相輸入電壓比較

23

PWM的優點在於馬達驅動電路的電晶體之控制信號改以脈波列來控

制使電晶體操作成類似開關的動作不是完全導通就是完全截止故電晶

體不是一直操作於作用區所以其功率消耗不大整體效率較高

《實驗結果》

圖 37 PWM 輸出波形

322 橋型驅動功率放大電路

如圖38所示主要由四個功率電晶體組成利用不同的電晶體對使直流

馬達做正逆轉控制當Q5Q8導通使馬達正轉當Q6Q7導通馬達則逆

轉電路中的電晶體扮演開關的作用

此種電路簡單只要一組直流電源供應且電晶體分擔了部份的電壓保護

電晶體迅速工作於截止與飽和狀態之間故沒有功率散逸損失之虞

但是在設計時切勿使Q5Q6同時導通以免燒毀電路上之元件因為在

AB兩脈波短暫的交變時間內由於電晶體本身之最小延遲時間有可能使Q5

Q6同時ON與Q7Q8在很短時間同時ON因此在15kHz交變下容易燒毀功

率電晶體

因此設計一間距脈波電路主要之功用使Q5Q6和Q7Q8均不同時導通

24

以拉長AB兩者交換時間

M

20k

10k

20k

10k

+24V

A 信號 B 信號

2N3055 2N3055

2N2955 2N2955

1N40021N4002

C1815 C1815

C1815 C1815

Q5

Q8Q6

Q7

圖 38 橋型驅動功率放大電路

圖 39 橋型驅動功率放大電路實體圖

25

此外若考慮電晶體BE間的電壓則電路會出現約 plusmn 06V的不感帶〈ded

band〉即電晶體的 oV 對 inV 間的關係如圖3101假使 inV 電壓為正弦波則 oV 變

成如圖3102為了改善這種缺失吾人利用兩個二極體接在電路上如圖38

用來補償電晶體BE間的壓降﹝10﹞

約06V

Dead band

Vo

Vin

圖 3101 呈現不感帶的轉移函數

圖 3102 輸出電壓波形

26

323 間距脈波產生電路

RCext15

Cext14 74123

A3

B2

Q13

CLR1

Q4

7486100k

2200pF

10k

10000pF

+5V

間距脈波輸出

圖 311 間距脈波產生電路

間距脈波的產生方式是根據脈寬調變〈PWM〉後的訊號再經由積分電路的

電阻兩端取出且經由兩倍頻器〈74LS86〉檢示出PWM的正負緣脈波最後

再利用單穩態IC〈74LS123〉將檢出信號之脈寬拉長至01ms此即為間距脈波

74LS123有兩個輸入端子A及B分別為下降波緣輸入端子及上升波緣輸入端

子當輸入A之脈波由ldquoH變成ldquoL之瞬間Q輸出變為ldquoH其持續時間長

短由RC時間常數決定反之當輸入B之脈波由ldquoL變成ldquoH之瞬間Q輸出

變成ldquoH維持一定時間

74LS123的輸出脈波之寬度是由電阻及電容之時間常數所決定概略計算公

式如下

CR045T timestimes=

電容 C 必須大於 1000pF

27

《實驗結果》

R=24kΩ C=10000pF

所以得到間距脈波為

( )msec0110810000p24k045T cong=timestimes= μ

圖 312 間距脈波

研究經分析後發現

1 間距 T 愈大愈能確保電路之安全性愈有保護作用

2 間距 T 愈大相對的使驅動信號脈波減少愈多造成馬達旋轉扭力大

大減弱

3 適當的間距 T不但不會影響馬達的輸出轉矩而且兼具保護電路的

效果

33 編碼器

轉動編碼器不只可以作為轉速的感測也能做位置的感測又適合於數位處

理故被廣泛使用若就信號來看轉動編碼器可分為增量型與絕對型若以檢

測的方式來分可分為光學式和磁式兩種在本專題中所使用的編碼器為光學式

增量型編碼器﹝11﹞

光學式轉動編碼器的原理如圖 313在附有細縫轉盤的兩側分別裝置發光元

28

件與受光元件如果只有一組光電檢測元件則輸出信號就只有一相的脈波信

號此種裝置稱為脈波產生器圖 314 為增量型轉碼器的輸出信號它是利用

兩組光電元件所產生的脈波信號A 相和 B 相間有相位差正轉時 A 相領前 B

相逆轉時 B 相領前 A 相因此利用此兩相做檢測馬達為正轉或逆轉的工作

並利用 A 相或 B 相的頻率檢測出目前的轉速

吾人計算出編碼器每一轉可以產生約 200 個脈波故檢測 A 相或 B 相其頻

率為 N則轉速應為 60200

timesN

〈rpm〉

圖 313 光學式轉動編碼器的原理圖

圖 314 編碼器的輸出信號波形

29

34 LM2917 FV 電路設計

對 LM2907 而言磁滯比較器和電流汞是構成頻率對電壓轉換的基本架構

並且預留一個運算放大器及一個電晶體供各種不同的使用圖 315 為吾人所設

計的 FV 電路圖中 C1 用以抑制電流汞動作時所產生的漣波變化正常使用時

此電容應大於 10C若 C1 太大也將造成轉換速度下降

因為單晶片 8051 之輸入電壓最高為 5V故必須設計其馬達最高轉速頻率所

轉成的電壓必須在 5V 以內由於馬達轉速頻率範圍極大故吾人給予 LM2917

+12V 的電壓以擴大它可以轉換的電壓範圍並將所需維持在 5V 內

a1

14

b1

1

a1

13

b1

2

a1

12

b1

3

a1

11

b1

4

1

a1

10

b1

5

a1

8

b1

7

a1

9

b1

6

L2917

Encoder輸 入

1uF

+12V

FV輸出1000pF

45k 10kC1

C2

圖 315 FV 電路

30

《實驗結果》

根據統計結果每 50mV 相對於 100Hz如此一來吾人想得知馬達目前

的轉速只要將單晶片所接收到的電壓值經過換算即可得知目前 encoder 所量測

的頻率吾人知道 encoder 一圈可產生 200 個脈波故馬達的轉速便可經過下列

公式換算得知

轉速〈rpm〉 60200

times=f

其中 =f encoder 所量測到的頻率

表 31 頻率與轉換電壓之關係

頻率

(Hz) 1 2 3 4 5 6 7 8 9

電壓(V) 0006 0006 0007 0008 0009 0009 0009 0009 001

頻率

(Hz) 10 20 30 40 50 60 70 80 90

電壓(V) 008 009 010 010 011 011 012 012 013

頻率

(Hz) 100 200 300 400 500 600 700 800 900

電壓(V) 013 018 023 028 033 038 043 049 054

頻率

(Hz) 1000 2000 3000 4000 5000 6000 7000 8000 9000

電壓(V) 059 109 16 209 257 304 3508 4006 45

31

圖 316 頻率對電壓曲線

35 單晶片介面電路

單晶片介面包括了二大部分分別為單晶片 8051AD converter

〈1〉8051 單晶片

為本控制系統的核心一切動作皆經由它控制

〈2〉AD converter

將類比開關所送出來的類比訊號經由 ADC 0804 轉換成數位訊號傳送

到單晶片的輸入埠

351 AD 轉換

以單晶片 8051 控制 ADC0804則單晶片 8051 必須下達ldquo開始轉換rdquo的命令

給 ADC0804然後 ADC0804 就開始讀入類比輸入端的電壓在內部開始轉換

經過一段轉換時間後〈約 100μ s〉ADC0804 就將轉換完成的值放在其內部的三

態輸出栓鎖緩衝器裡然後將轉換完成輸出腳〈INTR〉降為 low以通知單晶片

可以去讀轉換完成資料

當WR和CS 同時為ldquo0rdquo時表示對 ADC0804 下達ldquo開始轉換rdquo命令再經過

32

一段轉換時間〈100μ s〉後轉換完成ADC0804 會將其轉換完成的數位資料放

在其內部 8 位元緩衝區裡且將 INTR 降為ldquo0rdquo因此單晶片只要下達ldquo開始轉換rdquo

命令後去檢查 INTR 的狀態就可以知道是否轉換完畢其方法有兩種

1 輪詢法〈polling〉

2 中斷法〈interrupt〉

所謂輪詢法就是將 ADC0804 的 INTR接到 CPU 的一條 IO 線上然後以軟體指

令主動偵測其狀態當偵測到為ldquo0rdquo時就可以去讀出 ADC0804 裡的緩衝區的轉

換值

中斷法是一個很理想的 IO 方式因為不像輪詢法必須讓 CPU 等 ADC0804

轉換當 CPU 下達ldquo開始轉換rdquo命令後就可以做其他工作當 ADC0804 轉換完

畢後 INTR會降為ldquo0rdquo可以利用此信號去中斷 CPU再由中斷副程式去讀入

轉換值即可因此大大提高了程式的效率

當 CPU 接收到 ADC0804 發出ldquo轉換完畢rdquo的信號〈 INTR =0〉後就可以去

讀出轉換值其讀出的方法是將CS 與RD設為ldquo0rdquo即可讀到轉換值這個讀值的

動作又會使得 INTR恢復成ldquo1rdquo

1 CPU 下達ldquo開始轉換rdquo命令〈CS =0WR =0〉

2 ADC0804ldquo轉換完畢rdquo 〈 INTR =0〉

3 CPU 讀取轉換值〈 RD =0CS =0〉

4 讀完後 INTR =1

ADC0804 主要規格摘要如下

1 +5V 單電源工作電壓

2 類比電壓輸入範圍 0~+5V

33

3 參考電壓為 25V

4 轉換時間為 100μ s〈 CLKf =640kHz〉

5 解析度為 8 位元

6 誤差plusmn 1LSB

7 讀取時間 135ns

36 電源供應系統

本專題中所有電路及硬體設備所需的電源採用交流電源 110V 經由 PT-31

變壓器後再經過橋式整流後提供了直流電源而因為各個電路所需電源不同

因此製作了多組的變壓電路如下

1電壓源 DC5V選擇了 7805 的穩壓 IC 搭配電容得到了+5V 的電壓源

供〈1〉8051 微處理器 〈2〉ADC 0804 〈3〉74LS8674LS12374LS04

74LS02CD4013 〈4〉馬達 Encoder

2電壓源 DC12V使用 7812 穩壓 IC 搭配電容得到+12V 的電壓源供

LM2917 使用

3電壓源 DC24V利用 7824 的穩壓 IC 搭配電容獲得+24V 的直流電壓

源供電路之橋型驅動功率放大之電晶體使用

Vin1

+12V2

GND3

LM7812

2200uF 10000pF 2200uF 10000pF

+12V outputAC

圖 317 直流電源電路

34

圖 318 直流電源電路實體圖

37 馬達轉速的量測

表 33 PWM 輸出對應 encoder 週期

PWM dutycycle encoder 週期 PWM dutycycle encoder 週期

40 sμ 172 sμ 440 sμ 0 sμ

80 sμ 188 sμ 480 sμ 0 sμ

120 sμ 204 sμ 520 sμ 0 sμ

160 sμ 230 sμ 560 sμ 0 sμ

200 sμ 272 sμ 600 sμ 0 sμ

240 sμ 328 sμ 640 sμ 0 sμ

280 sμ 416 sμ 680 sμ 1320 sμ

320 sμ 540 sμ 720 sμ 750 sμ

360 sμ 800 sμ 760 sμ 510 sμ

400 sμ 1320 sμ 800 sμ 400 sμ

35

圖 319 PWM 輸出對應 encoder 週期

由統計可知道此馬達並不是一顆線性馬達故相信若使用模糊控制理論來

作為其回授控制系統的控制器一定能達到比傳統控制器的性能還要好而且若能

在模糊控制裡加上 PID 控制器的觀念一定能在系統的響應時間上升時間

安定時間和超越量達到最佳的控制另一方面馬達在其反方向的內阻較大需

要更大的力量才能使馬達驅動

36

第四章 軟體規劃與製作

41 PWM 之軟體設計

因為之前所介紹的硬體方式是以調整可變電阻來達到轉速的調整因此無法

得知所給予的脈寬長度和轉速大小尤其在回授時也不易給予適當的訊號來調整

轉速因此改良之方法就是以8051之軟體撰寫方式來產生固定的脈寬也就等

於給予轉速的命令而在其回授控制時也只要在內部程式给予適當的指令便可

達到脈寬長度的調整以達到閉迴路之受控系統

411 PWM 軟體流程

設定Timer0模式為0

TH0 = temp 32 TL0 = temp 32

temp = 8192 ndash j4 Key = 0

檢查是否有鍵值

將鍵值存入Key

Yes

No

設定Key值所對應的 j值

If P30 == 1Then P30 = 0 temp = 8192 ndash j4Else P30 = 1 temp=8192ndash880+j4

TH0 = temp 32 TL0 = temp 32

Start Timer0中斷副程式

啟動Timer0

等待Timer0中斷

返回主程式

圖 41 PWM 軟體設計流程圖

37

在此總共設計了五個按鈕分別代表不同的轉速停止正轉〈慢〉正轉

〈快〉逆轉〈慢〉和逆轉〈快〉使用Timer0是因為8051之計時中斷比延遲程

式來的準確故可以達到準確的計時程式設計理念中並沒有將中斷致能清除

因此Timer0會一直處於計時的狀態程式執行時將一邊檢查鍵值〈KeyStatus〉一

邊進行計時當計時完畢便呼叫中斷副程式然後執行改變Port 30的輸出狀

態若是為high則變為low反之若是為low即變為high同時並重設計時時間

Timer0繼續計時

當鍵值改變時計時的時間也會跟著改變如此一來Timer0將ㄧ直重覆上

述動作直到電源切掉Timer0才會停止計時

42 模糊控制之程式規劃與撰寫

本專題目標在完成了先前所規劃的硬體電路之後接著就是要達成利用模糊

控制理論來設計控制器在此採用了單晶片8051目的是為了以硬體實現方式來

代替電腦模擬期望能夠按照原訂計畫完成本專題「具模糊控制理論與雙脈寬調

變法之直流馬達驅動電路設計」

單晶片 8051 模糊控制的程式撰寫採下列幾個步驟依序完成

1 設定變數轉速誤差〈dspeed〉目前轉速〈sspeed〉

2 模糊化採用三角形歸屬函數採用三角形歸屬函數的原因

〈1〉 三角形函數為一連續函數

〈2〉 三角形函數為線性的函數所以計算速度較快

〈3〉 是具有發散也有收斂的函數和指數函數一樣接近

事實

3 模糊推論模糊規則將其所有可能發生情況以 IFhellipTHENhellip表示

並建立控制規則表

4 解模糊化採用重心法

38

421 歸屬函數

設定變數為目前轉速〈sspeed〉與轉速誤差〈dspeed〉因此此模糊控制器共

有兩個輸入訊號與一輸出訊號輸出訊號為脈寬長度該加或是減多少又因為有

五種不同的轉速因此各分別設計了不同的歸屬函數如下

1 當轉速 = 0

ml h

s s p e e d

d s p e e d

r p m0 5 0 1 0 0- 5 0- 1 0 0

mv l l h v h

r p m0- 3 0- 6 0- 1 0 0 3 0 6 0 1 0 0 圖 42 停止時之歸屬函數

2 正轉〈慢〉

ml hsspeed

dspeed

rpm150 225 300750

mvl l h vh

rpm150100500 200 250 300

圖 43 正轉〈慢〉之歸屬函數

39

3 正轉〈快〉

ml hsspeed

dspeed

rpm520 670 820370220

mvl l h vh

rpm500400300200 600 700 800

圖 44 正轉〈快〉之歸屬函數

4 逆轉〈慢〉

ml hsspeed

dspeed

rpm100 250 400500

mvl l h vh

rpm10050250 200 300 400 圖 45 逆轉〈慢〉之歸屬函數

40

5 逆轉〈快〉

ml hsspeed

dspeed

rpm300 450 600150

mvl l h vh

rpm450350250150 550 650 750

750

圖 46 逆轉〈快〉之歸屬函數

6 輸出

OutputMVL L H VH

rpm0-50-150-250 50 150 250

圖 47 輸出之歸屬函數

41

422 模糊規則庫

表 41 為吾人所設計的模糊控制規則庫並利用 Matlab 之 Fuzzy ToolBox 來

建立此規則庫以進行模擬推論圖 48 為當馬達輸入指令為正轉慢時推論後所得

到的三維空間圖

表 41 模糊控制規則表

Dspeed

vl l m h vh

l H M L VL VL

m VH H M L VL sspeed

h VH VH H M L

圖 48 推論後的三維空間圖

42

423 模糊控制器之軟體設計流程

Start 外部中斷副程式

ADCWR = 0 ADCWR = 1

〈令AD開始轉換〉

檢查鍵值以得到對應的歸屬函數

取得目前轉速與

轉速誤差

Fuzzy Rules決策

得到輸出訊號

Delay 10ms

ADC = 0 讀取AD值 ADCRD = 0

將AD值換算成轉速

ADCWR = 0 ADCWR = 1

〈AD開始轉換〉

返回主程式

致能外部中斷

圖 49 Fuzzy Controller 程式流程圖

當控制器一開始動作時便先執行AD轉換的工作當AD轉換完成時其

INTR的接腳便會觸發8051的外部中斷INTR0於是程式便發生外部中斷執行

外部中斷副程式的指令

43

在外部中斷副程式中AD將ㄧ直進行轉換與讀取的工作同時並將轉換後

的值直接換算成目前轉速與轉速誤差以供模糊控制器使用換算目前encoder

的頻率其公式為

160-V2000 times=頻率 〈4-1〉

式4-1之公式是根據表31所導出來的其中V為encoder之頻率轉成電壓之值

又假設所讀取的AD轉換值為value因為

AD的解析度 = bit256

5V+ = 511 ( Vbit ) 〈4-2〉

故value值與電壓V之關係為

511 value V times= 〈4-3〉

所以encoder之頻率與value值的關係為

頻率= 2000times ⎟⎠⎞

⎜⎝⎛ times

511 value - 160 〈4-4〉

故目前轉速為

sspeed = ( )rpm 60 200

times頻率 〈4-5〉

另ㄧ方面在主程式中程式會先去檢查鍵值也就等於檢查輸入指令以

找出符合使用的歸屬函數並將AD所獲得的轉速對應到歸屬函數中然後執行

決策判斷即進入規則庫中尋找出適當的決策判斷最後將此決策送入PWM程

式裡進行脈寬長度的調整使馬達在合理的要求下達到理想的轉速控制不會

因為外在環境的影響而使馬達轉速受到干擾

43 LCD 顯示轉速

此專題最後再增加一LCD顯示幕以顯示目前的轉速否則在程式設計完成

後人卻因無法以肉眼得知目前轉速而不能肯定馬達轉速是否有達到控制的目

標因此增加一顯示幕LCD是有必要的不僅隨時得知目前的轉速還能知道

44

設計出來的軟體其控制性是否夠好夠穩定

431 LCD 顯示幕之軟體流程

Start

設定LCD模組的初始狀態

設定外部中斷INTR0

與Timer0

設定TH0 = (65536 ndash 5000) 256 TL0 = (65536 ndash 5000)256

令ADCWR = 0 ADCWR = 1 AD開始轉換

等待中斷

外部中斷副程式

ADCRD = 0 讀取AD值 ADCRD = 1

將AD值換算成速度

ADCWR = 0 ADCWR = 1 AD開始轉換

Timer0中斷副程式

顯示LCD第一行

ldquoMotor Speed =

顯示LCD第二行ldquoxxxxxxx rpm其中 xxxxxx為外部中斷副程式所換算出的轉速

重設TH0與TL0

返回主程式返回主程式

圖 410 LCD 顯示幕之程式流程圖

此程式主要由兩個部分完成一為外部中斷副程式另ㄧ為 Timer0 中斷副

程式當主程式完成外部與 Timer0 兩個中斷的設定後隨即命令 AD 開始轉換

之後便一直停在 while〈1〉的迴圈裡不做任何動作而由兩個中斷副程式來完

成整個轉換與顯示的工作

45

外部中斷副程式主要負責 AD 的轉換讀取與轉速換算的工作AD 第一

次的轉換由主程式來下達命令當轉換完成後AD 的 INTR 接腳將觸發外部中

斷〈INTR0〉副程式此時程式便進入外部中斷副程式執行讀取 AD 值與轉速

換算的工作當這些工作完成時外部中斷副程式再次下達 AD 開始轉換的命

令而離開中斷副程式當 AD 再次轉換完成時又將再次執行中斷副程式

如此週而復始中斷副程式將ㄧ直進行讀取換算與轉換的工作

而 Timer0 中斷副程式主要負責 LCD 顯示之工作當主程式所設定的計時時

間計數完時程式便進入 Timer0 中斷副程式一旦進入 Timer0 中斷副程式程

式將執行 LCD 的顯示然後再重設 Timer0 的計數時間Timer0 將重新計數當

計數完時程式又將再度進入 Timer0 中斷副程式執行因為程式中並無清除

Timer0 的中斷致能故 Timer0 中斷副程式和外部中斷副程式ㄧ樣週而復始的

執行其副程式的工作

46

第五章 結論

本計劃主旨為具模糊控制理論與雙脈寬調變法之直流馬達驅動電路設計主

要是針對傳統電路設計之缺點提出改良之方法以TPWM取代PWM電路以模

糊理論基礎設計之控制器替代傳統PID控制器

TPWM轉速控制優於PWM之處在於

1 TPWM只需使用單電源即可達到正轉和逆轉的轉速控制而PWM必須

加上逆向開關或是雙電源才能使馬達產生正轉和逆轉

2 TPWM可控制馬達處於停止狀態無論在正向或逆向加上負載皆無法使

馬達產生轉動

3 馬達消耗定額功率輸出轉矩為額定值

4 馬達由停止到某定轉速時反應時間較快

模糊控制器優於PID控制器

1 不須導出繁雜的數學模型

2 適用於非線性系統

3 強健性與容錯性較高

本專題至此雖說大致的目標都已達到但是此系統仍然有許多不完美而需要

改進的地方例如在實驗過程中發現整個轉速的控制在回授上其反應時間

有點慢探討其原因有可能是控制器之程式上的問題

1 因為使用C語言撰寫程式故其執行速度較慢

2 程式可能寫的太累贅

3 模糊控制規則庫建立不良

若想改善這些問題可以嘗試著將C語言改為組合語言來撰寫並盡量減少

47

不必要的指令相信此動作一定能大大提昇程式的執行速度其次就是多做測

試利用測試中所學到的經驗來幫助模糊控制規則庫的改寫同時也能從測試中

發現更多的問題若是都能對問題加以一一解決的話相信必定能將此控制系統

做的更盡善盡美

48

參考文獻

﹝1﹞ 李適中直流馬達速度控制伺服控制〈基礎篇〉全華科技圖書股份有

限公司民 74

﹝2﹞ 廖錦文ldquo直流電動機之雙脈寬調變是〈TPWM〉驅動電路研究電

子技術月刊第 69 期pp94-1021992

﹝3﹞ 楊英魁孫宗瀛鄭魁香林建德蔣旭堂模糊控制理論與技術全華

科技圖書股份有限公司民 85

﹝4﹞ 林敦煌陳憬德直流馬達定位及轉速的模糊控制逢甲大學自動控制工

程學系學士論文民 87

﹝5﹞ LAZadehldquo Fuzzy Sets Information and Control Vol8 pp338-353

1965

﹝6﹞ EHMamdani and SAsslianldquo A fuzzy logic controller for a dynamic

plant Internation Journal of Man-Machine Studies Vol7 pp1-13 1975

﹝7﹞ 孫宗瀛楊英魁Fuzzy 控制理論實作與應用全華科技圖書股份有

限公司民 83 年

﹝8﹞ 許中平黃煌嘉直流電動機控制電路設計全華科技圖書股份有限公司

民 75

﹝9﹞ 盧明智黃敏祥OP Amp 應用+實驗模擬全華科技圖書股份有限公司

民 83

﹝10﹞陳文耀電動機控制工程復文書局2003

﹝11﹞許中平林全福電動機運轉控制技術全華科技圖書股份有限公司民

77

﹝12﹞楊明豐8051 單晶片 C 語言設計實務碁峯資訊2003 年

﹝13﹞蔡朝洋單晶片微電腦 80518951 原理與應用全華科技圖書股份有限公

司民 91

49

﹝14﹞王文俊認識 Fuzzy全華科技圖書股份有限公司民 90

50

附錄 A 專題硬體展示圖

圖 A-1 硬體整體圖

圖 A-2 硬體整體鳥瞰圖

51

圖 A-3 硬體側視圖

圖 A-4 操作與顯示面板

圖 A-5 間距脈波電路與 FV 電路

52

圖 A-6 橋型驅動功率放大電路

圖 A-7 操作與控制面板

53

附錄 B PWM 與模糊控制之程式

include reg51h include stdioh sbit ADCRD = P3^1 設定 RD 控制線接腳為 P31 sbit ADCWR = P3^3 設定 WR 控制線接腳為 P33 sbit P2_0 = 0xA0 接腳定義 sbit P2_1 = 0xA1 接腳定義 sbit P3_0 = 0xB0 接腳定義 sbit P3_1 = 0xB1 接腳定義 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P3_6 = 0xB6 接腳定義 void KeyStatus(void) 函數原型宣告 void feedback(void) 函數原型宣告 void compute_grade(void) 函數原型宣告 void delay1ms(int count) 函數原型宣告 void convert() 函數原型宣告 void condition() 函數原型宣告 void CW(void) 函數原型宣告 int j i 對應 PWM 的寬度 unsigned int temp 所設計的計時器時間 int sample = 1000 取樣率設定消除顯示值跳動 long int value r1 讀取 ADC0804 數位資料 long int set n condition select long int r grade_reg[2] grade[15] error1 error2 long int a1 b1 I long int membership[5][3]membership1[3][3] 定義歸屬函數 long int membership2[3][3] = -10-50-5050510 long int error[2] int Rule[15][3] = 113213313 定義判斷規則庫 212223323 311232333 411241342 511251351

54

main() 主程式 j = PWM = 110 設定 PWM 初始值 IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x00 設定計時器 0 工作於模式 0 temp=8192-j4 設定計時器 0 初值 TH0 = temp 32 TL0 = temp 32 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 P3_4 = 1 P3_5 = 0 P3_6 = 0 ADCWR = 0 令 ADC0804 的 WR = 0 ADCWR = 1 令 ADC0804 的 WR = 1 while (1) KeyStatus() 檢查鍵值 void KeyStatus(void) 檢查鍵值並給對應的 PWM 值 char KeyScan(void) 按鍵掃描函數宣告 unsigned char KeyStatus unsigned char Key = 0 KeyStatus=KeyScan() 呼叫按鍵掃描函數 if (KeyStatus = 0) 已有按鍵輸入 Key = KeyStatus Key = 鍵值 if (Key == 0x01) 假如輸入為按鍵 1 i = 110 PWM 為 110us j = i P3_4 = 1 LED 亮第一顆〈表馬達停止〉 P3_5 = 0 P3_6 = 0

55

else if (Key == 0x02 ) 假如輸入為按鍵 2 i = 140 PWM 為 140us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x04 ) 假如輸入為按鍵 3 i = 180 PWM 為 180us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x08 ) 假如輸入為按鍵 4 i = 80 PWM 為 80us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 else if (Key == 0x10 ) 假如輸入為按鍵 5 i = 40 PWM 為 40us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 PWM = j delay1ms(10) 呼叫延遲函數 feedback() 模糊控制判斷

56

void To_int(void) interrupt 1 Timer0 中斷函數 if (P3_0 == 0) 假如 PWM 輸出為 Low P3_0 = 1 變更 PWM 輸出為 High temp=8192-j4 設定 High 的時間 else 若 PWM 輸出為 High P3_0 = 0 變更 PWM 輸出為 Low temp=8192-880+j4 設定 Low 的時間 TH0 = temp 32 Timer0 的計時時間 TL0 = temp 32 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 char KeyScan(void) 檢查鍵值 char KeyStatus 按鍵狀態 P0=0xff 設定 P0 為輸入模式 KeyStatus=~P0 讀取按鍵狀態 return(KeyStatus) 將鍵值送回程式 void feedback(void) 模糊判斷 void Fuzzycontroller() 函數原型宣告 void condition1() 函數原型宣告

57

void condition2() 函數原型宣告 error1 = ((value)40-160)03 輸入變數 1 delay10ms(10) 延遲 10ms error2 = ((value)40-160)03 輸入變數 2 if (key == 0x01 ) 當按鍵 1找出對應的歸屬函數 並做出模糊控制判斷

int membership[5][3]= -100-60-30-60-300-30030030603060100

int membership1[3][3]=-100-500-50050050100 Fuzzycontroller() condition() if (key == 0x02 ) 當按鍵 2找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

05010050100150100150200150200250200250300 int membership1[3][3]=07515075150225150225300 Fuzzycontroller() condition() else if (key == 0x04) 當按鍵 3找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

200320400300400500400500600500600700600700800 int membership1[3][3]=220370520370520670520670820 Fuzzycontroller() condition() else if (key == 0x08) 當按鍵 4找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

02550255010050100200100200300200300400 int membership1[3][3]=05010050100250100250400 Fuzzycontroller() condition()

58

else if (key == 0x10) 當按鍵 5找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

150250350250350450350450550450550650550650750 int membership1[3][3]=150300450300450600450600750 Fuzzycontroller() condition2() void Fuzzycontroller() 模糊控制判斷 void compute_grade() 函數原型宣告 void compute_grade1() 函數原型宣告 a1 = 0 b1 = 001 I = 0 for (n=0 nlt=14 n++) r = error1 set = Rule[n][0]-1 compute_grade() 計算輸入變數 1 與

模糊程度的歸屬函數 condition = 1 r = error2 set = Rule[n][1]-1 compute_grade1() 計算輸入變數 2 與 模糊程度的歸屬函數 grade[n] = MIN(grade_reg[0] grade_reg[1]) a1 = a1 + (grade[n]membership2[Rule[n][2]-1][1]) b1 = b1 + grade[n] I = a1 b1 得到模糊控制判斷的結果 void compute_grade() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership[set][0]) || (r gt membership[set][2])) 當輸入變數不在 歸屬函數內

59

grade_reg[condition] = 0 else if ((r gt membership[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership[set][2]-r) (membership[set][2] - membership[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership[set][0]) (membership[set][1] - membership[set][0]) void compute_grade1() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership1[set][0]) || (r gt membership1[set][2])) 當輸入變數不在 歸屬函數內 grade_reg[condition] = 0 else if ((r gt membership1[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership1[set][2]-r) (membership1[set][2]-membership1[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership1[set][0]) (membership1[set][1]-membership1[set][0])

60

void condition() P2_0 = 1 設定 P20 為輸入模式 P2_1 = 1 設定 P21 為輸入模式 if ( (P2_0 == 1) ampamp (P2_1 == 0)) 當馬達為正轉時 if ( I gt 0 ) 若模糊判斷結果為正 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 若模糊判斷結果為零 PWM = PWM + 0 PWM 寬度不變 if ( I lt 0 ) 若模糊控制結果小於零 PWM = PWM + 1 PWM 寬度加 1 else if ( (P2_0 == 0) ampamp (P2_1 == 1) ) 若馬達為反轉 if ( I lt 0 ) 模糊控制小於零 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 模糊控制等於零 PWM = PWM + 0 PWM 寬度不變 if ( I gt 0 ) 模糊控制大於零 PWM = PWM + 1 PWM 寬度加 1 CW() 判斷 PWM 寬度上下限

61

void CW() 判斷 PWM 寬度上下限 if ( PWM gt= 215 ) 若 PWM 寬度 gt= 最大寬度 j = 215 PWM 寬度維持於 215us if ( PWM lt= 5 ) 若 PWM 寬度 lt= 最小寬度 j = 5 PWM 寬度維持在 5us if ( PWM gt 5 ampamp PWM lt 215 ) PWM 寬度介於最大與最小間 j = PWM PWM 依模糊控制判斷結果增減 void delay1ms(int count) 延遲 1ms int x y for ( x = 0 x lt count x++ ) for ( y = 0 y lt 122 y++ ) void convert() 數位資料換算成馬達轉速 r1 = ((value)40)-160

62

附錄 C LCD 顯示之程式

includereg51h 含 8051 所有暫存器宣告 include mathh define RS P3_5 LCD 指令資料選擇控制 define RW P3_4 LCD 讀寫控制腳 define Enable P3_3 LCD 致能接腳 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P0_0 = 0x80 接腳定義 sbit P0_1 = 0x81 接腳定義 sbit P0_2 = 0x82 接腳定義 sbit P0_3 = 0x83 接腳定義 sbit P0_4 = 0x84 接腳定義 sbit P0_5 = 0x85 接腳定義 sbit P0_6 = 0x86 接腳定義 sbit ADCRD = P3^7 設定 RD 控制線接腳為 P37 sbit ADCWR = P3^6 設定 WR 控制線接腳為 P36 void delay(void) 函數原型宣告 void delay10ms(int count) 函數原型宣告 void display(void) 函數原型宣告 void InitialLCD(void) 函數原型宣告 void WriteIns(char) 函數原型宣告 void WriteData(char) 函數原型宣告 void WriteString(charchar) 函數原型宣告 void CheckBusy(void) 函數原型宣告 void convert(void) 函數原型宣告 char MSG0[] = Motor Speed = 定義字串 MSG0 char MSG2[] = rpm 定義字串 MSG2 unsigned char MSG1[8]=0000000 定義字串 MSG1 unsigned long int value 讀取 ADC0804 數位資料 int sample = 1000 取樣率設定消除顯示值跳動 long int rpm

63

main() 主程式 InitialLCD() 初始化 LCD IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x01 設定計時器 0 工作於模式 1 TH0 = (65536-5000)256 設定計時器 0 初值 TL0 = (65536-5000)256 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 while(1) 等待中斷 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 while (--sample == 0) 取樣率減 1 sample = 1000 重設取樣率 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 void T0_int(void) interrupt 1 LCD 顯示動態掃描 display() 動態掃描顯示 TH0 = (65536-65535)256 重設計時初值 TL0 = (65536-65535)256

64

void InitialLCD(void) 設定 LCD 模組初始狀態 delay() 延遲函數 WriteIns(0x38) 設定 LCD 模組為 WriteIns(0x38) 2 行顯示 WriteIns(0x38) 8 位元介面 WriteIns(0x38) 5x7 點字型 WriteIns(0x08) 關閉顯示器 WriteIns(0x01) 清除 LCD 螢幕 WriteIns(0x0c) 令顯示器 ON但游標不顯示 WriteIns(0x06) 令 LCD 模組每接收到 1Byte 資料 AC 值自動加 1 void display() 掃描顯示 WriteIns(0x80) 設定 LCD 座標 WriteString(13MSG0) 將字串 MSG0 寫入 LCD 中 WriteIns(0xc0) 設定 LCD 座標 WriteString(8MSG1) 將字串 MSG1 寫入 LCD 中 WriteIns(0xc8) 設定 LCD 座標 WriteString(4MSG2) 將字串 MSG2 寫入 LCD 中 void convert(void) 換算轉速 long int freq freq = ((value)4000) - 16000 數位資料換成頻率公式 rpm = freq3 頻率換算轉速公式 MSG1[0] = (rpm1000000)+0x30 將結果存入字串 MSG1 中 MSG1[1] = ((rpm1000000)100000)+0x30 MSG1[2] = ((rpm100000)10000)+0x30 MSG1[3] = ((rpm10000)1000)+0x30 MSG1[4] = 0x2e MSG1[5] = ((rpm1000)100)+0x30 MSG1[6] = ((rpm100)10)+0x30 MSG1[7] = rpm10+0x30

65

void WriteIns(char instruction) 寫命令至 LCD 中 RS = 0 選擇指令暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = instruction 輸出命令至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteData(char i) 寫資料至 LCD 中 RS = 1 選擇資料暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = i 輸出資料至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteString(countMSG) 寫字串至 LCD 中 char count 字串長度 char MSG[] 字串資料 char i 定義位元組變數 for(i=0 iltcount i++) count 個位元組 WriteData(MSG[i]) 寫入一位元組的資料至 LCD 中 void CheckBusy(void) char i=0x80 檢查忙碌旗標 while(iamp0x80) 忙錄旗標 BF = 1 RS = 0 選擇指令暫存器 RW = 1 讀取 Enable = 1 致能 LCD i = P2 讀取 LCD 指令暫存器內的資料

66

Enable = 0 除能 LCD delay() 延遲函數 void delay() 延遲 5ms int i for(i=0 ilt250 i++)

  • 畢業專題封面pdf
  • File0004pdf
  • 最終版pdfpdf
Page 31: Based on Fuzzy Control Theorem and TPWM Method for DC ... · 使吾人想設計一模糊控制器來做為馬達轉速的閉迴路控制,以解決非線性系統的 問題。除此之外,flcs

22

〈2〉 脈寬調變電路〈PWM〉

+12V

-12V

10k

+12V

-12V -

+ PWM輸出LM324三角波輸入

圖 35 脈寬調變電路

PWM系統往往連接至直流電源供應放大器的工作是以固定的頻率開

閉直流供應電壓其激發角是可以調整的因此得到波寬可調的輸出

將固定頻率的三角波與反向輸入的電壓做比較便可輸出一脈寬〈見圖

36〉反向電阻值的不同將導致反向輸入電壓不同故其輸出為一可調但

頻率固定的脈寬也正因為如此故稱為脈寬調變〈PWM〉由於輸出的

dutycycle不同故馬達將接收到不同的平均電壓因而可以藉由PWM控制

馬達的轉速

反相輸入電壓

PWM

圖 36 三角波與反相輸入電壓比較

23

PWM的優點在於馬達驅動電路的電晶體之控制信號改以脈波列來控

制使電晶體操作成類似開關的動作不是完全導通就是完全截止故電晶

體不是一直操作於作用區所以其功率消耗不大整體效率較高

《實驗結果》

圖 37 PWM 輸出波形

322 橋型驅動功率放大電路

如圖38所示主要由四個功率電晶體組成利用不同的電晶體對使直流

馬達做正逆轉控制當Q5Q8導通使馬達正轉當Q6Q7導通馬達則逆

轉電路中的電晶體扮演開關的作用

此種電路簡單只要一組直流電源供應且電晶體分擔了部份的電壓保護

電晶體迅速工作於截止與飽和狀態之間故沒有功率散逸損失之虞

但是在設計時切勿使Q5Q6同時導通以免燒毀電路上之元件因為在

AB兩脈波短暫的交變時間內由於電晶體本身之最小延遲時間有可能使Q5

Q6同時ON與Q7Q8在很短時間同時ON因此在15kHz交變下容易燒毀功

率電晶體

因此設計一間距脈波電路主要之功用使Q5Q6和Q7Q8均不同時導通

24

以拉長AB兩者交換時間

M

20k

10k

20k

10k

+24V

A 信號 B 信號

2N3055 2N3055

2N2955 2N2955

1N40021N4002

C1815 C1815

C1815 C1815

Q5

Q8Q6

Q7

圖 38 橋型驅動功率放大電路

圖 39 橋型驅動功率放大電路實體圖

25

此外若考慮電晶體BE間的電壓則電路會出現約 plusmn 06V的不感帶〈ded

band〉即電晶體的 oV 對 inV 間的關係如圖3101假使 inV 電壓為正弦波則 oV 變

成如圖3102為了改善這種缺失吾人利用兩個二極體接在電路上如圖38

用來補償電晶體BE間的壓降﹝10﹞

約06V

Dead band

Vo

Vin

圖 3101 呈現不感帶的轉移函數

圖 3102 輸出電壓波形

26

323 間距脈波產生電路

RCext15

Cext14 74123

A3

B2

Q13

CLR1

Q4

7486100k

2200pF

10k

10000pF

+5V

間距脈波輸出

圖 311 間距脈波產生電路

間距脈波的產生方式是根據脈寬調變〈PWM〉後的訊號再經由積分電路的

電阻兩端取出且經由兩倍頻器〈74LS86〉檢示出PWM的正負緣脈波最後

再利用單穩態IC〈74LS123〉將檢出信號之脈寬拉長至01ms此即為間距脈波

74LS123有兩個輸入端子A及B分別為下降波緣輸入端子及上升波緣輸入端

子當輸入A之脈波由ldquoH變成ldquoL之瞬間Q輸出變為ldquoH其持續時間長

短由RC時間常數決定反之當輸入B之脈波由ldquoL變成ldquoH之瞬間Q輸出

變成ldquoH維持一定時間

74LS123的輸出脈波之寬度是由電阻及電容之時間常數所決定概略計算公

式如下

CR045T timestimes=

電容 C 必須大於 1000pF

27

《實驗結果》

R=24kΩ C=10000pF

所以得到間距脈波為

( )msec0110810000p24k045T cong=timestimes= μ

圖 312 間距脈波

研究經分析後發現

1 間距 T 愈大愈能確保電路之安全性愈有保護作用

2 間距 T 愈大相對的使驅動信號脈波減少愈多造成馬達旋轉扭力大

大減弱

3 適當的間距 T不但不會影響馬達的輸出轉矩而且兼具保護電路的

效果

33 編碼器

轉動編碼器不只可以作為轉速的感測也能做位置的感測又適合於數位處

理故被廣泛使用若就信號來看轉動編碼器可分為增量型與絕對型若以檢

測的方式來分可分為光學式和磁式兩種在本專題中所使用的編碼器為光學式

增量型編碼器﹝11﹞

光學式轉動編碼器的原理如圖 313在附有細縫轉盤的兩側分別裝置發光元

28

件與受光元件如果只有一組光電檢測元件則輸出信號就只有一相的脈波信

號此種裝置稱為脈波產生器圖 314 為增量型轉碼器的輸出信號它是利用

兩組光電元件所產生的脈波信號A 相和 B 相間有相位差正轉時 A 相領前 B

相逆轉時 B 相領前 A 相因此利用此兩相做檢測馬達為正轉或逆轉的工作

並利用 A 相或 B 相的頻率檢測出目前的轉速

吾人計算出編碼器每一轉可以產生約 200 個脈波故檢測 A 相或 B 相其頻

率為 N則轉速應為 60200

timesN

〈rpm〉

圖 313 光學式轉動編碼器的原理圖

圖 314 編碼器的輸出信號波形

29

34 LM2917 FV 電路設計

對 LM2907 而言磁滯比較器和電流汞是構成頻率對電壓轉換的基本架構

並且預留一個運算放大器及一個電晶體供各種不同的使用圖 315 為吾人所設

計的 FV 電路圖中 C1 用以抑制電流汞動作時所產生的漣波變化正常使用時

此電容應大於 10C若 C1 太大也將造成轉換速度下降

因為單晶片 8051 之輸入電壓最高為 5V故必須設計其馬達最高轉速頻率所

轉成的電壓必須在 5V 以內由於馬達轉速頻率範圍極大故吾人給予 LM2917

+12V 的電壓以擴大它可以轉換的電壓範圍並將所需維持在 5V 內

a1

14

b1

1

a1

13

b1

2

a1

12

b1

3

a1

11

b1

4

1

a1

10

b1

5

a1

8

b1

7

a1

9

b1

6

L2917

Encoder輸 入

1uF

+12V

FV輸出1000pF

45k 10kC1

C2

圖 315 FV 電路

30

《實驗結果》

根據統計結果每 50mV 相對於 100Hz如此一來吾人想得知馬達目前

的轉速只要將單晶片所接收到的電壓值經過換算即可得知目前 encoder 所量測

的頻率吾人知道 encoder 一圈可產生 200 個脈波故馬達的轉速便可經過下列

公式換算得知

轉速〈rpm〉 60200

times=f

其中 =f encoder 所量測到的頻率

表 31 頻率與轉換電壓之關係

頻率

(Hz) 1 2 3 4 5 6 7 8 9

電壓(V) 0006 0006 0007 0008 0009 0009 0009 0009 001

頻率

(Hz) 10 20 30 40 50 60 70 80 90

電壓(V) 008 009 010 010 011 011 012 012 013

頻率

(Hz) 100 200 300 400 500 600 700 800 900

電壓(V) 013 018 023 028 033 038 043 049 054

頻率

(Hz) 1000 2000 3000 4000 5000 6000 7000 8000 9000

電壓(V) 059 109 16 209 257 304 3508 4006 45

31

圖 316 頻率對電壓曲線

35 單晶片介面電路

單晶片介面包括了二大部分分別為單晶片 8051AD converter

〈1〉8051 單晶片

為本控制系統的核心一切動作皆經由它控制

〈2〉AD converter

將類比開關所送出來的類比訊號經由 ADC 0804 轉換成數位訊號傳送

到單晶片的輸入埠

351 AD 轉換

以單晶片 8051 控制 ADC0804則單晶片 8051 必須下達ldquo開始轉換rdquo的命令

給 ADC0804然後 ADC0804 就開始讀入類比輸入端的電壓在內部開始轉換

經過一段轉換時間後〈約 100μ s〉ADC0804 就將轉換完成的值放在其內部的三

態輸出栓鎖緩衝器裡然後將轉換完成輸出腳〈INTR〉降為 low以通知單晶片

可以去讀轉換完成資料

當WR和CS 同時為ldquo0rdquo時表示對 ADC0804 下達ldquo開始轉換rdquo命令再經過

32

一段轉換時間〈100μ s〉後轉換完成ADC0804 會將其轉換完成的數位資料放

在其內部 8 位元緩衝區裡且將 INTR 降為ldquo0rdquo因此單晶片只要下達ldquo開始轉換rdquo

命令後去檢查 INTR 的狀態就可以知道是否轉換完畢其方法有兩種

1 輪詢法〈polling〉

2 中斷法〈interrupt〉

所謂輪詢法就是將 ADC0804 的 INTR接到 CPU 的一條 IO 線上然後以軟體指

令主動偵測其狀態當偵測到為ldquo0rdquo時就可以去讀出 ADC0804 裡的緩衝區的轉

換值

中斷法是一個很理想的 IO 方式因為不像輪詢法必須讓 CPU 等 ADC0804

轉換當 CPU 下達ldquo開始轉換rdquo命令後就可以做其他工作當 ADC0804 轉換完

畢後 INTR會降為ldquo0rdquo可以利用此信號去中斷 CPU再由中斷副程式去讀入

轉換值即可因此大大提高了程式的效率

當 CPU 接收到 ADC0804 發出ldquo轉換完畢rdquo的信號〈 INTR =0〉後就可以去

讀出轉換值其讀出的方法是將CS 與RD設為ldquo0rdquo即可讀到轉換值這個讀值的

動作又會使得 INTR恢復成ldquo1rdquo

1 CPU 下達ldquo開始轉換rdquo命令〈CS =0WR =0〉

2 ADC0804ldquo轉換完畢rdquo 〈 INTR =0〉

3 CPU 讀取轉換值〈 RD =0CS =0〉

4 讀完後 INTR =1

ADC0804 主要規格摘要如下

1 +5V 單電源工作電壓

2 類比電壓輸入範圍 0~+5V

33

3 參考電壓為 25V

4 轉換時間為 100μ s〈 CLKf =640kHz〉

5 解析度為 8 位元

6 誤差plusmn 1LSB

7 讀取時間 135ns

36 電源供應系統

本專題中所有電路及硬體設備所需的電源採用交流電源 110V 經由 PT-31

變壓器後再經過橋式整流後提供了直流電源而因為各個電路所需電源不同

因此製作了多組的變壓電路如下

1電壓源 DC5V選擇了 7805 的穩壓 IC 搭配電容得到了+5V 的電壓源

供〈1〉8051 微處理器 〈2〉ADC 0804 〈3〉74LS8674LS12374LS04

74LS02CD4013 〈4〉馬達 Encoder

2電壓源 DC12V使用 7812 穩壓 IC 搭配電容得到+12V 的電壓源供

LM2917 使用

3電壓源 DC24V利用 7824 的穩壓 IC 搭配電容獲得+24V 的直流電壓

源供電路之橋型驅動功率放大之電晶體使用

Vin1

+12V2

GND3

LM7812

2200uF 10000pF 2200uF 10000pF

+12V outputAC

圖 317 直流電源電路

34

圖 318 直流電源電路實體圖

37 馬達轉速的量測

表 33 PWM 輸出對應 encoder 週期

PWM dutycycle encoder 週期 PWM dutycycle encoder 週期

40 sμ 172 sμ 440 sμ 0 sμ

80 sμ 188 sμ 480 sμ 0 sμ

120 sμ 204 sμ 520 sμ 0 sμ

160 sμ 230 sμ 560 sμ 0 sμ

200 sμ 272 sμ 600 sμ 0 sμ

240 sμ 328 sμ 640 sμ 0 sμ

280 sμ 416 sμ 680 sμ 1320 sμ

320 sμ 540 sμ 720 sμ 750 sμ

360 sμ 800 sμ 760 sμ 510 sμ

400 sμ 1320 sμ 800 sμ 400 sμ

35

圖 319 PWM 輸出對應 encoder 週期

由統計可知道此馬達並不是一顆線性馬達故相信若使用模糊控制理論來

作為其回授控制系統的控制器一定能達到比傳統控制器的性能還要好而且若能

在模糊控制裡加上 PID 控制器的觀念一定能在系統的響應時間上升時間

安定時間和超越量達到最佳的控制另一方面馬達在其反方向的內阻較大需

要更大的力量才能使馬達驅動

36

第四章 軟體規劃與製作

41 PWM 之軟體設計

因為之前所介紹的硬體方式是以調整可變電阻來達到轉速的調整因此無法

得知所給予的脈寬長度和轉速大小尤其在回授時也不易給予適當的訊號來調整

轉速因此改良之方法就是以8051之軟體撰寫方式來產生固定的脈寬也就等

於給予轉速的命令而在其回授控制時也只要在內部程式给予適當的指令便可

達到脈寬長度的調整以達到閉迴路之受控系統

411 PWM 軟體流程

設定Timer0模式為0

TH0 = temp 32 TL0 = temp 32

temp = 8192 ndash j4 Key = 0

檢查是否有鍵值

將鍵值存入Key

Yes

No

設定Key值所對應的 j值

If P30 == 1Then P30 = 0 temp = 8192 ndash j4Else P30 = 1 temp=8192ndash880+j4

TH0 = temp 32 TL0 = temp 32

Start Timer0中斷副程式

啟動Timer0

等待Timer0中斷

返回主程式

圖 41 PWM 軟體設計流程圖

37

在此總共設計了五個按鈕分別代表不同的轉速停止正轉〈慢〉正轉

〈快〉逆轉〈慢〉和逆轉〈快〉使用Timer0是因為8051之計時中斷比延遲程

式來的準確故可以達到準確的計時程式設計理念中並沒有將中斷致能清除

因此Timer0會一直處於計時的狀態程式執行時將一邊檢查鍵值〈KeyStatus〉一

邊進行計時當計時完畢便呼叫中斷副程式然後執行改變Port 30的輸出狀

態若是為high則變為low反之若是為low即變為high同時並重設計時時間

Timer0繼續計時

當鍵值改變時計時的時間也會跟著改變如此一來Timer0將ㄧ直重覆上

述動作直到電源切掉Timer0才會停止計時

42 模糊控制之程式規劃與撰寫

本專題目標在完成了先前所規劃的硬體電路之後接著就是要達成利用模糊

控制理論來設計控制器在此採用了單晶片8051目的是為了以硬體實現方式來

代替電腦模擬期望能夠按照原訂計畫完成本專題「具模糊控制理論與雙脈寬調

變法之直流馬達驅動電路設計」

單晶片 8051 模糊控制的程式撰寫採下列幾個步驟依序完成

1 設定變數轉速誤差〈dspeed〉目前轉速〈sspeed〉

2 模糊化採用三角形歸屬函數採用三角形歸屬函數的原因

〈1〉 三角形函數為一連續函數

〈2〉 三角形函數為線性的函數所以計算速度較快

〈3〉 是具有發散也有收斂的函數和指數函數一樣接近

事實

3 模糊推論模糊規則將其所有可能發生情況以 IFhellipTHENhellip表示

並建立控制規則表

4 解模糊化採用重心法

38

421 歸屬函數

設定變數為目前轉速〈sspeed〉與轉速誤差〈dspeed〉因此此模糊控制器共

有兩個輸入訊號與一輸出訊號輸出訊號為脈寬長度該加或是減多少又因為有

五種不同的轉速因此各分別設計了不同的歸屬函數如下

1 當轉速 = 0

ml h

s s p e e d

d s p e e d

r p m0 5 0 1 0 0- 5 0- 1 0 0

mv l l h v h

r p m0- 3 0- 6 0- 1 0 0 3 0 6 0 1 0 0 圖 42 停止時之歸屬函數

2 正轉〈慢〉

ml hsspeed

dspeed

rpm150 225 300750

mvl l h vh

rpm150100500 200 250 300

圖 43 正轉〈慢〉之歸屬函數

39

3 正轉〈快〉

ml hsspeed

dspeed

rpm520 670 820370220

mvl l h vh

rpm500400300200 600 700 800

圖 44 正轉〈快〉之歸屬函數

4 逆轉〈慢〉

ml hsspeed

dspeed

rpm100 250 400500

mvl l h vh

rpm10050250 200 300 400 圖 45 逆轉〈慢〉之歸屬函數

40

5 逆轉〈快〉

ml hsspeed

dspeed

rpm300 450 600150

mvl l h vh

rpm450350250150 550 650 750

750

圖 46 逆轉〈快〉之歸屬函數

6 輸出

OutputMVL L H VH

rpm0-50-150-250 50 150 250

圖 47 輸出之歸屬函數

41

422 模糊規則庫

表 41 為吾人所設計的模糊控制規則庫並利用 Matlab 之 Fuzzy ToolBox 來

建立此規則庫以進行模擬推論圖 48 為當馬達輸入指令為正轉慢時推論後所得

到的三維空間圖

表 41 模糊控制規則表

Dspeed

vl l m h vh

l H M L VL VL

m VH H M L VL sspeed

h VH VH H M L

圖 48 推論後的三維空間圖

42

423 模糊控制器之軟體設計流程

Start 外部中斷副程式

ADCWR = 0 ADCWR = 1

〈令AD開始轉換〉

檢查鍵值以得到對應的歸屬函數

取得目前轉速與

轉速誤差

Fuzzy Rules決策

得到輸出訊號

Delay 10ms

ADC = 0 讀取AD值 ADCRD = 0

將AD值換算成轉速

ADCWR = 0 ADCWR = 1

〈AD開始轉換〉

返回主程式

致能外部中斷

圖 49 Fuzzy Controller 程式流程圖

當控制器一開始動作時便先執行AD轉換的工作當AD轉換完成時其

INTR的接腳便會觸發8051的外部中斷INTR0於是程式便發生外部中斷執行

外部中斷副程式的指令

43

在外部中斷副程式中AD將ㄧ直進行轉換與讀取的工作同時並將轉換後

的值直接換算成目前轉速與轉速誤差以供模糊控制器使用換算目前encoder

的頻率其公式為

160-V2000 times=頻率 〈4-1〉

式4-1之公式是根據表31所導出來的其中V為encoder之頻率轉成電壓之值

又假設所讀取的AD轉換值為value因為

AD的解析度 = bit256

5V+ = 511 ( Vbit ) 〈4-2〉

故value值與電壓V之關係為

511 value V times= 〈4-3〉

所以encoder之頻率與value值的關係為

頻率= 2000times ⎟⎠⎞

⎜⎝⎛ times

511 value - 160 〈4-4〉

故目前轉速為

sspeed = ( )rpm 60 200

times頻率 〈4-5〉

另ㄧ方面在主程式中程式會先去檢查鍵值也就等於檢查輸入指令以

找出符合使用的歸屬函數並將AD所獲得的轉速對應到歸屬函數中然後執行

決策判斷即進入規則庫中尋找出適當的決策判斷最後將此決策送入PWM程

式裡進行脈寬長度的調整使馬達在合理的要求下達到理想的轉速控制不會

因為外在環境的影響而使馬達轉速受到干擾

43 LCD 顯示轉速

此專題最後再增加一LCD顯示幕以顯示目前的轉速否則在程式設計完成

後人卻因無法以肉眼得知目前轉速而不能肯定馬達轉速是否有達到控制的目

標因此增加一顯示幕LCD是有必要的不僅隨時得知目前的轉速還能知道

44

設計出來的軟體其控制性是否夠好夠穩定

431 LCD 顯示幕之軟體流程

Start

設定LCD模組的初始狀態

設定外部中斷INTR0

與Timer0

設定TH0 = (65536 ndash 5000) 256 TL0 = (65536 ndash 5000)256

令ADCWR = 0 ADCWR = 1 AD開始轉換

等待中斷

外部中斷副程式

ADCRD = 0 讀取AD值 ADCRD = 1

將AD值換算成速度

ADCWR = 0 ADCWR = 1 AD開始轉換

Timer0中斷副程式

顯示LCD第一行

ldquoMotor Speed =

顯示LCD第二行ldquoxxxxxxx rpm其中 xxxxxx為外部中斷副程式所換算出的轉速

重設TH0與TL0

返回主程式返回主程式

圖 410 LCD 顯示幕之程式流程圖

此程式主要由兩個部分完成一為外部中斷副程式另ㄧ為 Timer0 中斷副

程式當主程式完成外部與 Timer0 兩個中斷的設定後隨即命令 AD 開始轉換

之後便一直停在 while〈1〉的迴圈裡不做任何動作而由兩個中斷副程式來完

成整個轉換與顯示的工作

45

外部中斷副程式主要負責 AD 的轉換讀取與轉速換算的工作AD 第一

次的轉換由主程式來下達命令當轉換完成後AD 的 INTR 接腳將觸發外部中

斷〈INTR0〉副程式此時程式便進入外部中斷副程式執行讀取 AD 值與轉速

換算的工作當這些工作完成時外部中斷副程式再次下達 AD 開始轉換的命

令而離開中斷副程式當 AD 再次轉換完成時又將再次執行中斷副程式

如此週而復始中斷副程式將ㄧ直進行讀取換算與轉換的工作

而 Timer0 中斷副程式主要負責 LCD 顯示之工作當主程式所設定的計時時

間計數完時程式便進入 Timer0 中斷副程式一旦進入 Timer0 中斷副程式程

式將執行 LCD 的顯示然後再重設 Timer0 的計數時間Timer0 將重新計數當

計數完時程式又將再度進入 Timer0 中斷副程式執行因為程式中並無清除

Timer0 的中斷致能故 Timer0 中斷副程式和外部中斷副程式ㄧ樣週而復始的

執行其副程式的工作

46

第五章 結論

本計劃主旨為具模糊控制理論與雙脈寬調變法之直流馬達驅動電路設計主

要是針對傳統電路設計之缺點提出改良之方法以TPWM取代PWM電路以模

糊理論基礎設計之控制器替代傳統PID控制器

TPWM轉速控制優於PWM之處在於

1 TPWM只需使用單電源即可達到正轉和逆轉的轉速控制而PWM必須

加上逆向開關或是雙電源才能使馬達產生正轉和逆轉

2 TPWM可控制馬達處於停止狀態無論在正向或逆向加上負載皆無法使

馬達產生轉動

3 馬達消耗定額功率輸出轉矩為額定值

4 馬達由停止到某定轉速時反應時間較快

模糊控制器優於PID控制器

1 不須導出繁雜的數學模型

2 適用於非線性系統

3 強健性與容錯性較高

本專題至此雖說大致的目標都已達到但是此系統仍然有許多不完美而需要

改進的地方例如在實驗過程中發現整個轉速的控制在回授上其反應時間

有點慢探討其原因有可能是控制器之程式上的問題

1 因為使用C語言撰寫程式故其執行速度較慢

2 程式可能寫的太累贅

3 模糊控制規則庫建立不良

若想改善這些問題可以嘗試著將C語言改為組合語言來撰寫並盡量減少

47

不必要的指令相信此動作一定能大大提昇程式的執行速度其次就是多做測

試利用測試中所學到的經驗來幫助模糊控制規則庫的改寫同時也能從測試中

發現更多的問題若是都能對問題加以一一解決的話相信必定能將此控制系統

做的更盡善盡美

48

參考文獻

﹝1﹞ 李適中直流馬達速度控制伺服控制〈基礎篇〉全華科技圖書股份有

限公司民 74

﹝2﹞ 廖錦文ldquo直流電動機之雙脈寬調變是〈TPWM〉驅動電路研究電

子技術月刊第 69 期pp94-1021992

﹝3﹞ 楊英魁孫宗瀛鄭魁香林建德蔣旭堂模糊控制理論與技術全華

科技圖書股份有限公司民 85

﹝4﹞ 林敦煌陳憬德直流馬達定位及轉速的模糊控制逢甲大學自動控制工

程學系學士論文民 87

﹝5﹞ LAZadehldquo Fuzzy Sets Information and Control Vol8 pp338-353

1965

﹝6﹞ EHMamdani and SAsslianldquo A fuzzy logic controller for a dynamic

plant Internation Journal of Man-Machine Studies Vol7 pp1-13 1975

﹝7﹞ 孫宗瀛楊英魁Fuzzy 控制理論實作與應用全華科技圖書股份有

限公司民 83 年

﹝8﹞ 許中平黃煌嘉直流電動機控制電路設計全華科技圖書股份有限公司

民 75

﹝9﹞ 盧明智黃敏祥OP Amp 應用+實驗模擬全華科技圖書股份有限公司

民 83

﹝10﹞陳文耀電動機控制工程復文書局2003

﹝11﹞許中平林全福電動機運轉控制技術全華科技圖書股份有限公司民

77

﹝12﹞楊明豐8051 單晶片 C 語言設計實務碁峯資訊2003 年

﹝13﹞蔡朝洋單晶片微電腦 80518951 原理與應用全華科技圖書股份有限公

司民 91

49

﹝14﹞王文俊認識 Fuzzy全華科技圖書股份有限公司民 90

50

附錄 A 專題硬體展示圖

圖 A-1 硬體整體圖

圖 A-2 硬體整體鳥瞰圖

51

圖 A-3 硬體側視圖

圖 A-4 操作與顯示面板

圖 A-5 間距脈波電路與 FV 電路

52

圖 A-6 橋型驅動功率放大電路

圖 A-7 操作與控制面板

53

附錄 B PWM 與模糊控制之程式

include reg51h include stdioh sbit ADCRD = P3^1 設定 RD 控制線接腳為 P31 sbit ADCWR = P3^3 設定 WR 控制線接腳為 P33 sbit P2_0 = 0xA0 接腳定義 sbit P2_1 = 0xA1 接腳定義 sbit P3_0 = 0xB0 接腳定義 sbit P3_1 = 0xB1 接腳定義 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P3_6 = 0xB6 接腳定義 void KeyStatus(void) 函數原型宣告 void feedback(void) 函數原型宣告 void compute_grade(void) 函數原型宣告 void delay1ms(int count) 函數原型宣告 void convert() 函數原型宣告 void condition() 函數原型宣告 void CW(void) 函數原型宣告 int j i 對應 PWM 的寬度 unsigned int temp 所設計的計時器時間 int sample = 1000 取樣率設定消除顯示值跳動 long int value r1 讀取 ADC0804 數位資料 long int set n condition select long int r grade_reg[2] grade[15] error1 error2 long int a1 b1 I long int membership[5][3]membership1[3][3] 定義歸屬函數 long int membership2[3][3] = -10-50-5050510 long int error[2] int Rule[15][3] = 113213313 定義判斷規則庫 212223323 311232333 411241342 511251351

54

main() 主程式 j = PWM = 110 設定 PWM 初始值 IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x00 設定計時器 0 工作於模式 0 temp=8192-j4 設定計時器 0 初值 TH0 = temp 32 TL0 = temp 32 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 P3_4 = 1 P3_5 = 0 P3_6 = 0 ADCWR = 0 令 ADC0804 的 WR = 0 ADCWR = 1 令 ADC0804 的 WR = 1 while (1) KeyStatus() 檢查鍵值 void KeyStatus(void) 檢查鍵值並給對應的 PWM 值 char KeyScan(void) 按鍵掃描函數宣告 unsigned char KeyStatus unsigned char Key = 0 KeyStatus=KeyScan() 呼叫按鍵掃描函數 if (KeyStatus = 0) 已有按鍵輸入 Key = KeyStatus Key = 鍵值 if (Key == 0x01) 假如輸入為按鍵 1 i = 110 PWM 為 110us j = i P3_4 = 1 LED 亮第一顆〈表馬達停止〉 P3_5 = 0 P3_6 = 0

55

else if (Key == 0x02 ) 假如輸入為按鍵 2 i = 140 PWM 為 140us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x04 ) 假如輸入為按鍵 3 i = 180 PWM 為 180us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x08 ) 假如輸入為按鍵 4 i = 80 PWM 為 80us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 else if (Key == 0x10 ) 假如輸入為按鍵 5 i = 40 PWM 為 40us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 PWM = j delay1ms(10) 呼叫延遲函數 feedback() 模糊控制判斷

56

void To_int(void) interrupt 1 Timer0 中斷函數 if (P3_0 == 0) 假如 PWM 輸出為 Low P3_0 = 1 變更 PWM 輸出為 High temp=8192-j4 設定 High 的時間 else 若 PWM 輸出為 High P3_0 = 0 變更 PWM 輸出為 Low temp=8192-880+j4 設定 Low 的時間 TH0 = temp 32 Timer0 的計時時間 TL0 = temp 32 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 char KeyScan(void) 檢查鍵值 char KeyStatus 按鍵狀態 P0=0xff 設定 P0 為輸入模式 KeyStatus=~P0 讀取按鍵狀態 return(KeyStatus) 將鍵值送回程式 void feedback(void) 模糊判斷 void Fuzzycontroller() 函數原型宣告 void condition1() 函數原型宣告

57

void condition2() 函數原型宣告 error1 = ((value)40-160)03 輸入變數 1 delay10ms(10) 延遲 10ms error2 = ((value)40-160)03 輸入變數 2 if (key == 0x01 ) 當按鍵 1找出對應的歸屬函數 並做出模糊控制判斷

int membership[5][3]= -100-60-30-60-300-30030030603060100

int membership1[3][3]=-100-500-50050050100 Fuzzycontroller() condition() if (key == 0x02 ) 當按鍵 2找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

05010050100150100150200150200250200250300 int membership1[3][3]=07515075150225150225300 Fuzzycontroller() condition() else if (key == 0x04) 當按鍵 3找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

200320400300400500400500600500600700600700800 int membership1[3][3]=220370520370520670520670820 Fuzzycontroller() condition() else if (key == 0x08) 當按鍵 4找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

02550255010050100200100200300200300400 int membership1[3][3]=05010050100250100250400 Fuzzycontroller() condition()

58

else if (key == 0x10) 當按鍵 5找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

150250350250350450350450550450550650550650750 int membership1[3][3]=150300450300450600450600750 Fuzzycontroller() condition2() void Fuzzycontroller() 模糊控制判斷 void compute_grade() 函數原型宣告 void compute_grade1() 函數原型宣告 a1 = 0 b1 = 001 I = 0 for (n=0 nlt=14 n++) r = error1 set = Rule[n][0]-1 compute_grade() 計算輸入變數 1 與

模糊程度的歸屬函數 condition = 1 r = error2 set = Rule[n][1]-1 compute_grade1() 計算輸入變數 2 與 模糊程度的歸屬函數 grade[n] = MIN(grade_reg[0] grade_reg[1]) a1 = a1 + (grade[n]membership2[Rule[n][2]-1][1]) b1 = b1 + grade[n] I = a1 b1 得到模糊控制判斷的結果 void compute_grade() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership[set][0]) || (r gt membership[set][2])) 當輸入變數不在 歸屬函數內

59

grade_reg[condition] = 0 else if ((r gt membership[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership[set][2]-r) (membership[set][2] - membership[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership[set][0]) (membership[set][1] - membership[set][0]) void compute_grade1() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership1[set][0]) || (r gt membership1[set][2])) 當輸入變數不在 歸屬函數內 grade_reg[condition] = 0 else if ((r gt membership1[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership1[set][2]-r) (membership1[set][2]-membership1[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership1[set][0]) (membership1[set][1]-membership1[set][0])

60

void condition() P2_0 = 1 設定 P20 為輸入模式 P2_1 = 1 設定 P21 為輸入模式 if ( (P2_0 == 1) ampamp (P2_1 == 0)) 當馬達為正轉時 if ( I gt 0 ) 若模糊判斷結果為正 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 若模糊判斷結果為零 PWM = PWM + 0 PWM 寬度不變 if ( I lt 0 ) 若模糊控制結果小於零 PWM = PWM + 1 PWM 寬度加 1 else if ( (P2_0 == 0) ampamp (P2_1 == 1) ) 若馬達為反轉 if ( I lt 0 ) 模糊控制小於零 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 模糊控制等於零 PWM = PWM + 0 PWM 寬度不變 if ( I gt 0 ) 模糊控制大於零 PWM = PWM + 1 PWM 寬度加 1 CW() 判斷 PWM 寬度上下限

61

void CW() 判斷 PWM 寬度上下限 if ( PWM gt= 215 ) 若 PWM 寬度 gt= 最大寬度 j = 215 PWM 寬度維持於 215us if ( PWM lt= 5 ) 若 PWM 寬度 lt= 最小寬度 j = 5 PWM 寬度維持在 5us if ( PWM gt 5 ampamp PWM lt 215 ) PWM 寬度介於最大與最小間 j = PWM PWM 依模糊控制判斷結果增減 void delay1ms(int count) 延遲 1ms int x y for ( x = 0 x lt count x++ ) for ( y = 0 y lt 122 y++ ) void convert() 數位資料換算成馬達轉速 r1 = ((value)40)-160

62

附錄 C LCD 顯示之程式

includereg51h 含 8051 所有暫存器宣告 include mathh define RS P3_5 LCD 指令資料選擇控制 define RW P3_4 LCD 讀寫控制腳 define Enable P3_3 LCD 致能接腳 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P0_0 = 0x80 接腳定義 sbit P0_1 = 0x81 接腳定義 sbit P0_2 = 0x82 接腳定義 sbit P0_3 = 0x83 接腳定義 sbit P0_4 = 0x84 接腳定義 sbit P0_5 = 0x85 接腳定義 sbit P0_6 = 0x86 接腳定義 sbit ADCRD = P3^7 設定 RD 控制線接腳為 P37 sbit ADCWR = P3^6 設定 WR 控制線接腳為 P36 void delay(void) 函數原型宣告 void delay10ms(int count) 函數原型宣告 void display(void) 函數原型宣告 void InitialLCD(void) 函數原型宣告 void WriteIns(char) 函數原型宣告 void WriteData(char) 函數原型宣告 void WriteString(charchar) 函數原型宣告 void CheckBusy(void) 函數原型宣告 void convert(void) 函數原型宣告 char MSG0[] = Motor Speed = 定義字串 MSG0 char MSG2[] = rpm 定義字串 MSG2 unsigned char MSG1[8]=0000000 定義字串 MSG1 unsigned long int value 讀取 ADC0804 數位資料 int sample = 1000 取樣率設定消除顯示值跳動 long int rpm

63

main() 主程式 InitialLCD() 初始化 LCD IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x01 設定計時器 0 工作於模式 1 TH0 = (65536-5000)256 設定計時器 0 初值 TL0 = (65536-5000)256 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 while(1) 等待中斷 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 while (--sample == 0) 取樣率減 1 sample = 1000 重設取樣率 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 void T0_int(void) interrupt 1 LCD 顯示動態掃描 display() 動態掃描顯示 TH0 = (65536-65535)256 重設計時初值 TL0 = (65536-65535)256

64

void InitialLCD(void) 設定 LCD 模組初始狀態 delay() 延遲函數 WriteIns(0x38) 設定 LCD 模組為 WriteIns(0x38) 2 行顯示 WriteIns(0x38) 8 位元介面 WriteIns(0x38) 5x7 點字型 WriteIns(0x08) 關閉顯示器 WriteIns(0x01) 清除 LCD 螢幕 WriteIns(0x0c) 令顯示器 ON但游標不顯示 WriteIns(0x06) 令 LCD 模組每接收到 1Byte 資料 AC 值自動加 1 void display() 掃描顯示 WriteIns(0x80) 設定 LCD 座標 WriteString(13MSG0) 將字串 MSG0 寫入 LCD 中 WriteIns(0xc0) 設定 LCD 座標 WriteString(8MSG1) 將字串 MSG1 寫入 LCD 中 WriteIns(0xc8) 設定 LCD 座標 WriteString(4MSG2) 將字串 MSG2 寫入 LCD 中 void convert(void) 換算轉速 long int freq freq = ((value)4000) - 16000 數位資料換成頻率公式 rpm = freq3 頻率換算轉速公式 MSG1[0] = (rpm1000000)+0x30 將結果存入字串 MSG1 中 MSG1[1] = ((rpm1000000)100000)+0x30 MSG1[2] = ((rpm100000)10000)+0x30 MSG1[3] = ((rpm10000)1000)+0x30 MSG1[4] = 0x2e MSG1[5] = ((rpm1000)100)+0x30 MSG1[6] = ((rpm100)10)+0x30 MSG1[7] = rpm10+0x30

65

void WriteIns(char instruction) 寫命令至 LCD 中 RS = 0 選擇指令暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = instruction 輸出命令至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteData(char i) 寫資料至 LCD 中 RS = 1 選擇資料暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = i 輸出資料至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteString(countMSG) 寫字串至 LCD 中 char count 字串長度 char MSG[] 字串資料 char i 定義位元組變數 for(i=0 iltcount i++) count 個位元組 WriteData(MSG[i]) 寫入一位元組的資料至 LCD 中 void CheckBusy(void) char i=0x80 檢查忙碌旗標 while(iamp0x80) 忙錄旗標 BF = 1 RS = 0 選擇指令暫存器 RW = 1 讀取 Enable = 1 致能 LCD i = P2 讀取 LCD 指令暫存器內的資料

66

Enable = 0 除能 LCD delay() 延遲函數 void delay() 延遲 5ms int i for(i=0 ilt250 i++)

  • 畢業專題封面pdf
  • File0004pdf
  • 最終版pdfpdf
Page 32: Based on Fuzzy Control Theorem and TPWM Method for DC ... · 使吾人想設計一模糊控制器來做為馬達轉速的閉迴路控制,以解決非線性系統的 問題。除此之外,flcs

23

PWM的優點在於馬達驅動電路的電晶體之控制信號改以脈波列來控

制使電晶體操作成類似開關的動作不是完全導通就是完全截止故電晶

體不是一直操作於作用區所以其功率消耗不大整體效率較高

《實驗結果》

圖 37 PWM 輸出波形

322 橋型驅動功率放大電路

如圖38所示主要由四個功率電晶體組成利用不同的電晶體對使直流

馬達做正逆轉控制當Q5Q8導通使馬達正轉當Q6Q7導通馬達則逆

轉電路中的電晶體扮演開關的作用

此種電路簡單只要一組直流電源供應且電晶體分擔了部份的電壓保護

電晶體迅速工作於截止與飽和狀態之間故沒有功率散逸損失之虞

但是在設計時切勿使Q5Q6同時導通以免燒毀電路上之元件因為在

AB兩脈波短暫的交變時間內由於電晶體本身之最小延遲時間有可能使Q5

Q6同時ON與Q7Q8在很短時間同時ON因此在15kHz交變下容易燒毀功

率電晶體

因此設計一間距脈波電路主要之功用使Q5Q6和Q7Q8均不同時導通

24

以拉長AB兩者交換時間

M

20k

10k

20k

10k

+24V

A 信號 B 信號

2N3055 2N3055

2N2955 2N2955

1N40021N4002

C1815 C1815

C1815 C1815

Q5

Q8Q6

Q7

圖 38 橋型驅動功率放大電路

圖 39 橋型驅動功率放大電路實體圖

25

此外若考慮電晶體BE間的電壓則電路會出現約 plusmn 06V的不感帶〈ded

band〉即電晶體的 oV 對 inV 間的關係如圖3101假使 inV 電壓為正弦波則 oV 變

成如圖3102為了改善這種缺失吾人利用兩個二極體接在電路上如圖38

用來補償電晶體BE間的壓降﹝10﹞

約06V

Dead band

Vo

Vin

圖 3101 呈現不感帶的轉移函數

圖 3102 輸出電壓波形

26

323 間距脈波產生電路

RCext15

Cext14 74123

A3

B2

Q13

CLR1

Q4

7486100k

2200pF

10k

10000pF

+5V

間距脈波輸出

圖 311 間距脈波產生電路

間距脈波的產生方式是根據脈寬調變〈PWM〉後的訊號再經由積分電路的

電阻兩端取出且經由兩倍頻器〈74LS86〉檢示出PWM的正負緣脈波最後

再利用單穩態IC〈74LS123〉將檢出信號之脈寬拉長至01ms此即為間距脈波

74LS123有兩個輸入端子A及B分別為下降波緣輸入端子及上升波緣輸入端

子當輸入A之脈波由ldquoH變成ldquoL之瞬間Q輸出變為ldquoH其持續時間長

短由RC時間常數決定反之當輸入B之脈波由ldquoL變成ldquoH之瞬間Q輸出

變成ldquoH維持一定時間

74LS123的輸出脈波之寬度是由電阻及電容之時間常數所決定概略計算公

式如下

CR045T timestimes=

電容 C 必須大於 1000pF

27

《實驗結果》

R=24kΩ C=10000pF

所以得到間距脈波為

( )msec0110810000p24k045T cong=timestimes= μ

圖 312 間距脈波

研究經分析後發現

1 間距 T 愈大愈能確保電路之安全性愈有保護作用

2 間距 T 愈大相對的使驅動信號脈波減少愈多造成馬達旋轉扭力大

大減弱

3 適當的間距 T不但不會影響馬達的輸出轉矩而且兼具保護電路的

效果

33 編碼器

轉動編碼器不只可以作為轉速的感測也能做位置的感測又適合於數位處

理故被廣泛使用若就信號來看轉動編碼器可分為增量型與絕對型若以檢

測的方式來分可分為光學式和磁式兩種在本專題中所使用的編碼器為光學式

增量型編碼器﹝11﹞

光學式轉動編碼器的原理如圖 313在附有細縫轉盤的兩側分別裝置發光元

28

件與受光元件如果只有一組光電檢測元件則輸出信號就只有一相的脈波信

號此種裝置稱為脈波產生器圖 314 為增量型轉碼器的輸出信號它是利用

兩組光電元件所產生的脈波信號A 相和 B 相間有相位差正轉時 A 相領前 B

相逆轉時 B 相領前 A 相因此利用此兩相做檢測馬達為正轉或逆轉的工作

並利用 A 相或 B 相的頻率檢測出目前的轉速

吾人計算出編碼器每一轉可以產生約 200 個脈波故檢測 A 相或 B 相其頻

率為 N則轉速應為 60200

timesN

〈rpm〉

圖 313 光學式轉動編碼器的原理圖

圖 314 編碼器的輸出信號波形

29

34 LM2917 FV 電路設計

對 LM2907 而言磁滯比較器和電流汞是構成頻率對電壓轉換的基本架構

並且預留一個運算放大器及一個電晶體供各種不同的使用圖 315 為吾人所設

計的 FV 電路圖中 C1 用以抑制電流汞動作時所產生的漣波變化正常使用時

此電容應大於 10C若 C1 太大也將造成轉換速度下降

因為單晶片 8051 之輸入電壓最高為 5V故必須設計其馬達最高轉速頻率所

轉成的電壓必須在 5V 以內由於馬達轉速頻率範圍極大故吾人給予 LM2917

+12V 的電壓以擴大它可以轉換的電壓範圍並將所需維持在 5V 內

a1

14

b1

1

a1

13

b1

2

a1

12

b1

3

a1

11

b1

4

1

a1

10

b1

5

a1

8

b1

7

a1

9

b1

6

L2917

Encoder輸 入

1uF

+12V

FV輸出1000pF

45k 10kC1

C2

圖 315 FV 電路

30

《實驗結果》

根據統計結果每 50mV 相對於 100Hz如此一來吾人想得知馬達目前

的轉速只要將單晶片所接收到的電壓值經過換算即可得知目前 encoder 所量測

的頻率吾人知道 encoder 一圈可產生 200 個脈波故馬達的轉速便可經過下列

公式換算得知

轉速〈rpm〉 60200

times=f

其中 =f encoder 所量測到的頻率

表 31 頻率與轉換電壓之關係

頻率

(Hz) 1 2 3 4 5 6 7 8 9

電壓(V) 0006 0006 0007 0008 0009 0009 0009 0009 001

頻率

(Hz) 10 20 30 40 50 60 70 80 90

電壓(V) 008 009 010 010 011 011 012 012 013

頻率

(Hz) 100 200 300 400 500 600 700 800 900

電壓(V) 013 018 023 028 033 038 043 049 054

頻率

(Hz) 1000 2000 3000 4000 5000 6000 7000 8000 9000

電壓(V) 059 109 16 209 257 304 3508 4006 45

31

圖 316 頻率對電壓曲線

35 單晶片介面電路

單晶片介面包括了二大部分分別為單晶片 8051AD converter

〈1〉8051 單晶片

為本控制系統的核心一切動作皆經由它控制

〈2〉AD converter

將類比開關所送出來的類比訊號經由 ADC 0804 轉換成數位訊號傳送

到單晶片的輸入埠

351 AD 轉換

以單晶片 8051 控制 ADC0804則單晶片 8051 必須下達ldquo開始轉換rdquo的命令

給 ADC0804然後 ADC0804 就開始讀入類比輸入端的電壓在內部開始轉換

經過一段轉換時間後〈約 100μ s〉ADC0804 就將轉換完成的值放在其內部的三

態輸出栓鎖緩衝器裡然後將轉換完成輸出腳〈INTR〉降為 low以通知單晶片

可以去讀轉換完成資料

當WR和CS 同時為ldquo0rdquo時表示對 ADC0804 下達ldquo開始轉換rdquo命令再經過

32

一段轉換時間〈100μ s〉後轉換完成ADC0804 會將其轉換完成的數位資料放

在其內部 8 位元緩衝區裡且將 INTR 降為ldquo0rdquo因此單晶片只要下達ldquo開始轉換rdquo

命令後去檢查 INTR 的狀態就可以知道是否轉換完畢其方法有兩種

1 輪詢法〈polling〉

2 中斷法〈interrupt〉

所謂輪詢法就是將 ADC0804 的 INTR接到 CPU 的一條 IO 線上然後以軟體指

令主動偵測其狀態當偵測到為ldquo0rdquo時就可以去讀出 ADC0804 裡的緩衝區的轉

換值

中斷法是一個很理想的 IO 方式因為不像輪詢法必須讓 CPU 等 ADC0804

轉換當 CPU 下達ldquo開始轉換rdquo命令後就可以做其他工作當 ADC0804 轉換完

畢後 INTR會降為ldquo0rdquo可以利用此信號去中斷 CPU再由中斷副程式去讀入

轉換值即可因此大大提高了程式的效率

當 CPU 接收到 ADC0804 發出ldquo轉換完畢rdquo的信號〈 INTR =0〉後就可以去

讀出轉換值其讀出的方法是將CS 與RD設為ldquo0rdquo即可讀到轉換值這個讀值的

動作又會使得 INTR恢復成ldquo1rdquo

1 CPU 下達ldquo開始轉換rdquo命令〈CS =0WR =0〉

2 ADC0804ldquo轉換完畢rdquo 〈 INTR =0〉

3 CPU 讀取轉換值〈 RD =0CS =0〉

4 讀完後 INTR =1

ADC0804 主要規格摘要如下

1 +5V 單電源工作電壓

2 類比電壓輸入範圍 0~+5V

33

3 參考電壓為 25V

4 轉換時間為 100μ s〈 CLKf =640kHz〉

5 解析度為 8 位元

6 誤差plusmn 1LSB

7 讀取時間 135ns

36 電源供應系統

本專題中所有電路及硬體設備所需的電源採用交流電源 110V 經由 PT-31

變壓器後再經過橋式整流後提供了直流電源而因為各個電路所需電源不同

因此製作了多組的變壓電路如下

1電壓源 DC5V選擇了 7805 的穩壓 IC 搭配電容得到了+5V 的電壓源

供〈1〉8051 微處理器 〈2〉ADC 0804 〈3〉74LS8674LS12374LS04

74LS02CD4013 〈4〉馬達 Encoder

2電壓源 DC12V使用 7812 穩壓 IC 搭配電容得到+12V 的電壓源供

LM2917 使用

3電壓源 DC24V利用 7824 的穩壓 IC 搭配電容獲得+24V 的直流電壓

源供電路之橋型驅動功率放大之電晶體使用

Vin1

+12V2

GND3

LM7812

2200uF 10000pF 2200uF 10000pF

+12V outputAC

圖 317 直流電源電路

34

圖 318 直流電源電路實體圖

37 馬達轉速的量測

表 33 PWM 輸出對應 encoder 週期

PWM dutycycle encoder 週期 PWM dutycycle encoder 週期

40 sμ 172 sμ 440 sμ 0 sμ

80 sμ 188 sμ 480 sμ 0 sμ

120 sμ 204 sμ 520 sμ 0 sμ

160 sμ 230 sμ 560 sμ 0 sμ

200 sμ 272 sμ 600 sμ 0 sμ

240 sμ 328 sμ 640 sμ 0 sμ

280 sμ 416 sμ 680 sμ 1320 sμ

320 sμ 540 sμ 720 sμ 750 sμ

360 sμ 800 sμ 760 sμ 510 sμ

400 sμ 1320 sμ 800 sμ 400 sμ

35

圖 319 PWM 輸出對應 encoder 週期

由統計可知道此馬達並不是一顆線性馬達故相信若使用模糊控制理論來

作為其回授控制系統的控制器一定能達到比傳統控制器的性能還要好而且若能

在模糊控制裡加上 PID 控制器的觀念一定能在系統的響應時間上升時間

安定時間和超越量達到最佳的控制另一方面馬達在其反方向的內阻較大需

要更大的力量才能使馬達驅動

36

第四章 軟體規劃與製作

41 PWM 之軟體設計

因為之前所介紹的硬體方式是以調整可變電阻來達到轉速的調整因此無法

得知所給予的脈寬長度和轉速大小尤其在回授時也不易給予適當的訊號來調整

轉速因此改良之方法就是以8051之軟體撰寫方式來產生固定的脈寬也就等

於給予轉速的命令而在其回授控制時也只要在內部程式给予適當的指令便可

達到脈寬長度的調整以達到閉迴路之受控系統

411 PWM 軟體流程

設定Timer0模式為0

TH0 = temp 32 TL0 = temp 32

temp = 8192 ndash j4 Key = 0

檢查是否有鍵值

將鍵值存入Key

Yes

No

設定Key值所對應的 j值

If P30 == 1Then P30 = 0 temp = 8192 ndash j4Else P30 = 1 temp=8192ndash880+j4

TH0 = temp 32 TL0 = temp 32

Start Timer0中斷副程式

啟動Timer0

等待Timer0中斷

返回主程式

圖 41 PWM 軟體設計流程圖

37

在此總共設計了五個按鈕分別代表不同的轉速停止正轉〈慢〉正轉

〈快〉逆轉〈慢〉和逆轉〈快〉使用Timer0是因為8051之計時中斷比延遲程

式來的準確故可以達到準確的計時程式設計理念中並沒有將中斷致能清除

因此Timer0會一直處於計時的狀態程式執行時將一邊檢查鍵值〈KeyStatus〉一

邊進行計時當計時完畢便呼叫中斷副程式然後執行改變Port 30的輸出狀

態若是為high則變為low反之若是為low即變為high同時並重設計時時間

Timer0繼續計時

當鍵值改變時計時的時間也會跟著改變如此一來Timer0將ㄧ直重覆上

述動作直到電源切掉Timer0才會停止計時

42 模糊控制之程式規劃與撰寫

本專題目標在完成了先前所規劃的硬體電路之後接著就是要達成利用模糊

控制理論來設計控制器在此採用了單晶片8051目的是為了以硬體實現方式來

代替電腦模擬期望能夠按照原訂計畫完成本專題「具模糊控制理論與雙脈寬調

變法之直流馬達驅動電路設計」

單晶片 8051 模糊控制的程式撰寫採下列幾個步驟依序完成

1 設定變數轉速誤差〈dspeed〉目前轉速〈sspeed〉

2 模糊化採用三角形歸屬函數採用三角形歸屬函數的原因

〈1〉 三角形函數為一連續函數

〈2〉 三角形函數為線性的函數所以計算速度較快

〈3〉 是具有發散也有收斂的函數和指數函數一樣接近

事實

3 模糊推論模糊規則將其所有可能發生情況以 IFhellipTHENhellip表示

並建立控制規則表

4 解模糊化採用重心法

38

421 歸屬函數

設定變數為目前轉速〈sspeed〉與轉速誤差〈dspeed〉因此此模糊控制器共

有兩個輸入訊號與一輸出訊號輸出訊號為脈寬長度該加或是減多少又因為有

五種不同的轉速因此各分別設計了不同的歸屬函數如下

1 當轉速 = 0

ml h

s s p e e d

d s p e e d

r p m0 5 0 1 0 0- 5 0- 1 0 0

mv l l h v h

r p m0- 3 0- 6 0- 1 0 0 3 0 6 0 1 0 0 圖 42 停止時之歸屬函數

2 正轉〈慢〉

ml hsspeed

dspeed

rpm150 225 300750

mvl l h vh

rpm150100500 200 250 300

圖 43 正轉〈慢〉之歸屬函數

39

3 正轉〈快〉

ml hsspeed

dspeed

rpm520 670 820370220

mvl l h vh

rpm500400300200 600 700 800

圖 44 正轉〈快〉之歸屬函數

4 逆轉〈慢〉

ml hsspeed

dspeed

rpm100 250 400500

mvl l h vh

rpm10050250 200 300 400 圖 45 逆轉〈慢〉之歸屬函數

40

5 逆轉〈快〉

ml hsspeed

dspeed

rpm300 450 600150

mvl l h vh

rpm450350250150 550 650 750

750

圖 46 逆轉〈快〉之歸屬函數

6 輸出

OutputMVL L H VH

rpm0-50-150-250 50 150 250

圖 47 輸出之歸屬函數

41

422 模糊規則庫

表 41 為吾人所設計的模糊控制規則庫並利用 Matlab 之 Fuzzy ToolBox 來

建立此規則庫以進行模擬推論圖 48 為當馬達輸入指令為正轉慢時推論後所得

到的三維空間圖

表 41 模糊控制規則表

Dspeed

vl l m h vh

l H M L VL VL

m VH H M L VL sspeed

h VH VH H M L

圖 48 推論後的三維空間圖

42

423 模糊控制器之軟體設計流程

Start 外部中斷副程式

ADCWR = 0 ADCWR = 1

〈令AD開始轉換〉

檢查鍵值以得到對應的歸屬函數

取得目前轉速與

轉速誤差

Fuzzy Rules決策

得到輸出訊號

Delay 10ms

ADC = 0 讀取AD值 ADCRD = 0

將AD值換算成轉速

ADCWR = 0 ADCWR = 1

〈AD開始轉換〉

返回主程式

致能外部中斷

圖 49 Fuzzy Controller 程式流程圖

當控制器一開始動作時便先執行AD轉換的工作當AD轉換完成時其

INTR的接腳便會觸發8051的外部中斷INTR0於是程式便發生外部中斷執行

外部中斷副程式的指令

43

在外部中斷副程式中AD將ㄧ直進行轉換與讀取的工作同時並將轉換後

的值直接換算成目前轉速與轉速誤差以供模糊控制器使用換算目前encoder

的頻率其公式為

160-V2000 times=頻率 〈4-1〉

式4-1之公式是根據表31所導出來的其中V為encoder之頻率轉成電壓之值

又假設所讀取的AD轉換值為value因為

AD的解析度 = bit256

5V+ = 511 ( Vbit ) 〈4-2〉

故value值與電壓V之關係為

511 value V times= 〈4-3〉

所以encoder之頻率與value值的關係為

頻率= 2000times ⎟⎠⎞

⎜⎝⎛ times

511 value - 160 〈4-4〉

故目前轉速為

sspeed = ( )rpm 60 200

times頻率 〈4-5〉

另ㄧ方面在主程式中程式會先去檢查鍵值也就等於檢查輸入指令以

找出符合使用的歸屬函數並將AD所獲得的轉速對應到歸屬函數中然後執行

決策判斷即進入規則庫中尋找出適當的決策判斷最後將此決策送入PWM程

式裡進行脈寬長度的調整使馬達在合理的要求下達到理想的轉速控制不會

因為外在環境的影響而使馬達轉速受到干擾

43 LCD 顯示轉速

此專題最後再增加一LCD顯示幕以顯示目前的轉速否則在程式設計完成

後人卻因無法以肉眼得知目前轉速而不能肯定馬達轉速是否有達到控制的目

標因此增加一顯示幕LCD是有必要的不僅隨時得知目前的轉速還能知道

44

設計出來的軟體其控制性是否夠好夠穩定

431 LCD 顯示幕之軟體流程

Start

設定LCD模組的初始狀態

設定外部中斷INTR0

與Timer0

設定TH0 = (65536 ndash 5000) 256 TL0 = (65536 ndash 5000)256

令ADCWR = 0 ADCWR = 1 AD開始轉換

等待中斷

外部中斷副程式

ADCRD = 0 讀取AD值 ADCRD = 1

將AD值換算成速度

ADCWR = 0 ADCWR = 1 AD開始轉換

Timer0中斷副程式

顯示LCD第一行

ldquoMotor Speed =

顯示LCD第二行ldquoxxxxxxx rpm其中 xxxxxx為外部中斷副程式所換算出的轉速

重設TH0與TL0

返回主程式返回主程式

圖 410 LCD 顯示幕之程式流程圖

此程式主要由兩個部分完成一為外部中斷副程式另ㄧ為 Timer0 中斷副

程式當主程式完成外部與 Timer0 兩個中斷的設定後隨即命令 AD 開始轉換

之後便一直停在 while〈1〉的迴圈裡不做任何動作而由兩個中斷副程式來完

成整個轉換與顯示的工作

45

外部中斷副程式主要負責 AD 的轉換讀取與轉速換算的工作AD 第一

次的轉換由主程式來下達命令當轉換完成後AD 的 INTR 接腳將觸發外部中

斷〈INTR0〉副程式此時程式便進入外部中斷副程式執行讀取 AD 值與轉速

換算的工作當這些工作完成時外部中斷副程式再次下達 AD 開始轉換的命

令而離開中斷副程式當 AD 再次轉換完成時又將再次執行中斷副程式

如此週而復始中斷副程式將ㄧ直進行讀取換算與轉換的工作

而 Timer0 中斷副程式主要負責 LCD 顯示之工作當主程式所設定的計時時

間計數完時程式便進入 Timer0 中斷副程式一旦進入 Timer0 中斷副程式程

式將執行 LCD 的顯示然後再重設 Timer0 的計數時間Timer0 將重新計數當

計數完時程式又將再度進入 Timer0 中斷副程式執行因為程式中並無清除

Timer0 的中斷致能故 Timer0 中斷副程式和外部中斷副程式ㄧ樣週而復始的

執行其副程式的工作

46

第五章 結論

本計劃主旨為具模糊控制理論與雙脈寬調變法之直流馬達驅動電路設計主

要是針對傳統電路設計之缺點提出改良之方法以TPWM取代PWM電路以模

糊理論基礎設計之控制器替代傳統PID控制器

TPWM轉速控制優於PWM之處在於

1 TPWM只需使用單電源即可達到正轉和逆轉的轉速控制而PWM必須

加上逆向開關或是雙電源才能使馬達產生正轉和逆轉

2 TPWM可控制馬達處於停止狀態無論在正向或逆向加上負載皆無法使

馬達產生轉動

3 馬達消耗定額功率輸出轉矩為額定值

4 馬達由停止到某定轉速時反應時間較快

模糊控制器優於PID控制器

1 不須導出繁雜的數學模型

2 適用於非線性系統

3 強健性與容錯性較高

本專題至此雖說大致的目標都已達到但是此系統仍然有許多不完美而需要

改進的地方例如在實驗過程中發現整個轉速的控制在回授上其反應時間

有點慢探討其原因有可能是控制器之程式上的問題

1 因為使用C語言撰寫程式故其執行速度較慢

2 程式可能寫的太累贅

3 模糊控制規則庫建立不良

若想改善這些問題可以嘗試著將C語言改為組合語言來撰寫並盡量減少

47

不必要的指令相信此動作一定能大大提昇程式的執行速度其次就是多做測

試利用測試中所學到的經驗來幫助模糊控制規則庫的改寫同時也能從測試中

發現更多的問題若是都能對問題加以一一解決的話相信必定能將此控制系統

做的更盡善盡美

48

參考文獻

﹝1﹞ 李適中直流馬達速度控制伺服控制〈基礎篇〉全華科技圖書股份有

限公司民 74

﹝2﹞ 廖錦文ldquo直流電動機之雙脈寬調變是〈TPWM〉驅動電路研究電

子技術月刊第 69 期pp94-1021992

﹝3﹞ 楊英魁孫宗瀛鄭魁香林建德蔣旭堂模糊控制理論與技術全華

科技圖書股份有限公司民 85

﹝4﹞ 林敦煌陳憬德直流馬達定位及轉速的模糊控制逢甲大學自動控制工

程學系學士論文民 87

﹝5﹞ LAZadehldquo Fuzzy Sets Information and Control Vol8 pp338-353

1965

﹝6﹞ EHMamdani and SAsslianldquo A fuzzy logic controller for a dynamic

plant Internation Journal of Man-Machine Studies Vol7 pp1-13 1975

﹝7﹞ 孫宗瀛楊英魁Fuzzy 控制理論實作與應用全華科技圖書股份有

限公司民 83 年

﹝8﹞ 許中平黃煌嘉直流電動機控制電路設計全華科技圖書股份有限公司

民 75

﹝9﹞ 盧明智黃敏祥OP Amp 應用+實驗模擬全華科技圖書股份有限公司

民 83

﹝10﹞陳文耀電動機控制工程復文書局2003

﹝11﹞許中平林全福電動機運轉控制技術全華科技圖書股份有限公司民

77

﹝12﹞楊明豐8051 單晶片 C 語言設計實務碁峯資訊2003 年

﹝13﹞蔡朝洋單晶片微電腦 80518951 原理與應用全華科技圖書股份有限公

司民 91

49

﹝14﹞王文俊認識 Fuzzy全華科技圖書股份有限公司民 90

50

附錄 A 專題硬體展示圖

圖 A-1 硬體整體圖

圖 A-2 硬體整體鳥瞰圖

51

圖 A-3 硬體側視圖

圖 A-4 操作與顯示面板

圖 A-5 間距脈波電路與 FV 電路

52

圖 A-6 橋型驅動功率放大電路

圖 A-7 操作與控制面板

53

附錄 B PWM 與模糊控制之程式

include reg51h include stdioh sbit ADCRD = P3^1 設定 RD 控制線接腳為 P31 sbit ADCWR = P3^3 設定 WR 控制線接腳為 P33 sbit P2_0 = 0xA0 接腳定義 sbit P2_1 = 0xA1 接腳定義 sbit P3_0 = 0xB0 接腳定義 sbit P3_1 = 0xB1 接腳定義 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P3_6 = 0xB6 接腳定義 void KeyStatus(void) 函數原型宣告 void feedback(void) 函數原型宣告 void compute_grade(void) 函數原型宣告 void delay1ms(int count) 函數原型宣告 void convert() 函數原型宣告 void condition() 函數原型宣告 void CW(void) 函數原型宣告 int j i 對應 PWM 的寬度 unsigned int temp 所設計的計時器時間 int sample = 1000 取樣率設定消除顯示值跳動 long int value r1 讀取 ADC0804 數位資料 long int set n condition select long int r grade_reg[2] grade[15] error1 error2 long int a1 b1 I long int membership[5][3]membership1[3][3] 定義歸屬函數 long int membership2[3][3] = -10-50-5050510 long int error[2] int Rule[15][3] = 113213313 定義判斷規則庫 212223323 311232333 411241342 511251351

54

main() 主程式 j = PWM = 110 設定 PWM 初始值 IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x00 設定計時器 0 工作於模式 0 temp=8192-j4 設定計時器 0 初值 TH0 = temp 32 TL0 = temp 32 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 P3_4 = 1 P3_5 = 0 P3_6 = 0 ADCWR = 0 令 ADC0804 的 WR = 0 ADCWR = 1 令 ADC0804 的 WR = 1 while (1) KeyStatus() 檢查鍵值 void KeyStatus(void) 檢查鍵值並給對應的 PWM 值 char KeyScan(void) 按鍵掃描函數宣告 unsigned char KeyStatus unsigned char Key = 0 KeyStatus=KeyScan() 呼叫按鍵掃描函數 if (KeyStatus = 0) 已有按鍵輸入 Key = KeyStatus Key = 鍵值 if (Key == 0x01) 假如輸入為按鍵 1 i = 110 PWM 為 110us j = i P3_4 = 1 LED 亮第一顆〈表馬達停止〉 P3_5 = 0 P3_6 = 0

55

else if (Key == 0x02 ) 假如輸入為按鍵 2 i = 140 PWM 為 140us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x04 ) 假如輸入為按鍵 3 i = 180 PWM 為 180us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x08 ) 假如輸入為按鍵 4 i = 80 PWM 為 80us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 else if (Key == 0x10 ) 假如輸入為按鍵 5 i = 40 PWM 為 40us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 PWM = j delay1ms(10) 呼叫延遲函數 feedback() 模糊控制判斷

56

void To_int(void) interrupt 1 Timer0 中斷函數 if (P3_0 == 0) 假如 PWM 輸出為 Low P3_0 = 1 變更 PWM 輸出為 High temp=8192-j4 設定 High 的時間 else 若 PWM 輸出為 High P3_0 = 0 變更 PWM 輸出為 Low temp=8192-880+j4 設定 Low 的時間 TH0 = temp 32 Timer0 的計時時間 TL0 = temp 32 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 char KeyScan(void) 檢查鍵值 char KeyStatus 按鍵狀態 P0=0xff 設定 P0 為輸入模式 KeyStatus=~P0 讀取按鍵狀態 return(KeyStatus) 將鍵值送回程式 void feedback(void) 模糊判斷 void Fuzzycontroller() 函數原型宣告 void condition1() 函數原型宣告

57

void condition2() 函數原型宣告 error1 = ((value)40-160)03 輸入變數 1 delay10ms(10) 延遲 10ms error2 = ((value)40-160)03 輸入變數 2 if (key == 0x01 ) 當按鍵 1找出對應的歸屬函數 並做出模糊控制判斷

int membership[5][3]= -100-60-30-60-300-30030030603060100

int membership1[3][3]=-100-500-50050050100 Fuzzycontroller() condition() if (key == 0x02 ) 當按鍵 2找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

05010050100150100150200150200250200250300 int membership1[3][3]=07515075150225150225300 Fuzzycontroller() condition() else if (key == 0x04) 當按鍵 3找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

200320400300400500400500600500600700600700800 int membership1[3][3]=220370520370520670520670820 Fuzzycontroller() condition() else if (key == 0x08) 當按鍵 4找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

02550255010050100200100200300200300400 int membership1[3][3]=05010050100250100250400 Fuzzycontroller() condition()

58

else if (key == 0x10) 當按鍵 5找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

150250350250350450350450550450550650550650750 int membership1[3][3]=150300450300450600450600750 Fuzzycontroller() condition2() void Fuzzycontroller() 模糊控制判斷 void compute_grade() 函數原型宣告 void compute_grade1() 函數原型宣告 a1 = 0 b1 = 001 I = 0 for (n=0 nlt=14 n++) r = error1 set = Rule[n][0]-1 compute_grade() 計算輸入變數 1 與

模糊程度的歸屬函數 condition = 1 r = error2 set = Rule[n][1]-1 compute_grade1() 計算輸入變數 2 與 模糊程度的歸屬函數 grade[n] = MIN(grade_reg[0] grade_reg[1]) a1 = a1 + (grade[n]membership2[Rule[n][2]-1][1]) b1 = b1 + grade[n] I = a1 b1 得到模糊控制判斷的結果 void compute_grade() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership[set][0]) || (r gt membership[set][2])) 當輸入變數不在 歸屬函數內

59

grade_reg[condition] = 0 else if ((r gt membership[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership[set][2]-r) (membership[set][2] - membership[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership[set][0]) (membership[set][1] - membership[set][0]) void compute_grade1() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership1[set][0]) || (r gt membership1[set][2])) 當輸入變數不在 歸屬函數內 grade_reg[condition] = 0 else if ((r gt membership1[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership1[set][2]-r) (membership1[set][2]-membership1[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership1[set][0]) (membership1[set][1]-membership1[set][0])

60

void condition() P2_0 = 1 設定 P20 為輸入模式 P2_1 = 1 設定 P21 為輸入模式 if ( (P2_0 == 1) ampamp (P2_1 == 0)) 當馬達為正轉時 if ( I gt 0 ) 若模糊判斷結果為正 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 若模糊判斷結果為零 PWM = PWM + 0 PWM 寬度不變 if ( I lt 0 ) 若模糊控制結果小於零 PWM = PWM + 1 PWM 寬度加 1 else if ( (P2_0 == 0) ampamp (P2_1 == 1) ) 若馬達為反轉 if ( I lt 0 ) 模糊控制小於零 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 模糊控制等於零 PWM = PWM + 0 PWM 寬度不變 if ( I gt 0 ) 模糊控制大於零 PWM = PWM + 1 PWM 寬度加 1 CW() 判斷 PWM 寬度上下限

61

void CW() 判斷 PWM 寬度上下限 if ( PWM gt= 215 ) 若 PWM 寬度 gt= 最大寬度 j = 215 PWM 寬度維持於 215us if ( PWM lt= 5 ) 若 PWM 寬度 lt= 最小寬度 j = 5 PWM 寬度維持在 5us if ( PWM gt 5 ampamp PWM lt 215 ) PWM 寬度介於最大與最小間 j = PWM PWM 依模糊控制判斷結果增減 void delay1ms(int count) 延遲 1ms int x y for ( x = 0 x lt count x++ ) for ( y = 0 y lt 122 y++ ) void convert() 數位資料換算成馬達轉速 r1 = ((value)40)-160

62

附錄 C LCD 顯示之程式

includereg51h 含 8051 所有暫存器宣告 include mathh define RS P3_5 LCD 指令資料選擇控制 define RW P3_4 LCD 讀寫控制腳 define Enable P3_3 LCD 致能接腳 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P0_0 = 0x80 接腳定義 sbit P0_1 = 0x81 接腳定義 sbit P0_2 = 0x82 接腳定義 sbit P0_3 = 0x83 接腳定義 sbit P0_4 = 0x84 接腳定義 sbit P0_5 = 0x85 接腳定義 sbit P0_6 = 0x86 接腳定義 sbit ADCRD = P3^7 設定 RD 控制線接腳為 P37 sbit ADCWR = P3^6 設定 WR 控制線接腳為 P36 void delay(void) 函數原型宣告 void delay10ms(int count) 函數原型宣告 void display(void) 函數原型宣告 void InitialLCD(void) 函數原型宣告 void WriteIns(char) 函數原型宣告 void WriteData(char) 函數原型宣告 void WriteString(charchar) 函數原型宣告 void CheckBusy(void) 函數原型宣告 void convert(void) 函數原型宣告 char MSG0[] = Motor Speed = 定義字串 MSG0 char MSG2[] = rpm 定義字串 MSG2 unsigned char MSG1[8]=0000000 定義字串 MSG1 unsigned long int value 讀取 ADC0804 數位資料 int sample = 1000 取樣率設定消除顯示值跳動 long int rpm

63

main() 主程式 InitialLCD() 初始化 LCD IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x01 設定計時器 0 工作於模式 1 TH0 = (65536-5000)256 設定計時器 0 初值 TL0 = (65536-5000)256 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 while(1) 等待中斷 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 while (--sample == 0) 取樣率減 1 sample = 1000 重設取樣率 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 void T0_int(void) interrupt 1 LCD 顯示動態掃描 display() 動態掃描顯示 TH0 = (65536-65535)256 重設計時初值 TL0 = (65536-65535)256

64

void InitialLCD(void) 設定 LCD 模組初始狀態 delay() 延遲函數 WriteIns(0x38) 設定 LCD 模組為 WriteIns(0x38) 2 行顯示 WriteIns(0x38) 8 位元介面 WriteIns(0x38) 5x7 點字型 WriteIns(0x08) 關閉顯示器 WriteIns(0x01) 清除 LCD 螢幕 WriteIns(0x0c) 令顯示器 ON但游標不顯示 WriteIns(0x06) 令 LCD 模組每接收到 1Byte 資料 AC 值自動加 1 void display() 掃描顯示 WriteIns(0x80) 設定 LCD 座標 WriteString(13MSG0) 將字串 MSG0 寫入 LCD 中 WriteIns(0xc0) 設定 LCD 座標 WriteString(8MSG1) 將字串 MSG1 寫入 LCD 中 WriteIns(0xc8) 設定 LCD 座標 WriteString(4MSG2) 將字串 MSG2 寫入 LCD 中 void convert(void) 換算轉速 long int freq freq = ((value)4000) - 16000 數位資料換成頻率公式 rpm = freq3 頻率換算轉速公式 MSG1[0] = (rpm1000000)+0x30 將結果存入字串 MSG1 中 MSG1[1] = ((rpm1000000)100000)+0x30 MSG1[2] = ((rpm100000)10000)+0x30 MSG1[3] = ((rpm10000)1000)+0x30 MSG1[4] = 0x2e MSG1[5] = ((rpm1000)100)+0x30 MSG1[6] = ((rpm100)10)+0x30 MSG1[7] = rpm10+0x30

65

void WriteIns(char instruction) 寫命令至 LCD 中 RS = 0 選擇指令暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = instruction 輸出命令至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteData(char i) 寫資料至 LCD 中 RS = 1 選擇資料暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = i 輸出資料至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteString(countMSG) 寫字串至 LCD 中 char count 字串長度 char MSG[] 字串資料 char i 定義位元組變數 for(i=0 iltcount i++) count 個位元組 WriteData(MSG[i]) 寫入一位元組的資料至 LCD 中 void CheckBusy(void) char i=0x80 檢查忙碌旗標 while(iamp0x80) 忙錄旗標 BF = 1 RS = 0 選擇指令暫存器 RW = 1 讀取 Enable = 1 致能 LCD i = P2 讀取 LCD 指令暫存器內的資料

66

Enable = 0 除能 LCD delay() 延遲函數 void delay() 延遲 5ms int i for(i=0 ilt250 i++)

  • 畢業專題封面pdf
  • File0004pdf
  • 最終版pdfpdf
Page 33: Based on Fuzzy Control Theorem and TPWM Method for DC ... · 使吾人想設計一模糊控制器來做為馬達轉速的閉迴路控制,以解決非線性系統的 問題。除此之外,flcs

24

以拉長AB兩者交換時間

M

20k

10k

20k

10k

+24V

A 信號 B 信號

2N3055 2N3055

2N2955 2N2955

1N40021N4002

C1815 C1815

C1815 C1815

Q5

Q8Q6

Q7

圖 38 橋型驅動功率放大電路

圖 39 橋型驅動功率放大電路實體圖

25

此外若考慮電晶體BE間的電壓則電路會出現約 plusmn 06V的不感帶〈ded

band〉即電晶體的 oV 對 inV 間的關係如圖3101假使 inV 電壓為正弦波則 oV 變

成如圖3102為了改善這種缺失吾人利用兩個二極體接在電路上如圖38

用來補償電晶體BE間的壓降﹝10﹞

約06V

Dead band

Vo

Vin

圖 3101 呈現不感帶的轉移函數

圖 3102 輸出電壓波形

26

323 間距脈波產生電路

RCext15

Cext14 74123

A3

B2

Q13

CLR1

Q4

7486100k

2200pF

10k

10000pF

+5V

間距脈波輸出

圖 311 間距脈波產生電路

間距脈波的產生方式是根據脈寬調變〈PWM〉後的訊號再經由積分電路的

電阻兩端取出且經由兩倍頻器〈74LS86〉檢示出PWM的正負緣脈波最後

再利用單穩態IC〈74LS123〉將檢出信號之脈寬拉長至01ms此即為間距脈波

74LS123有兩個輸入端子A及B分別為下降波緣輸入端子及上升波緣輸入端

子當輸入A之脈波由ldquoH變成ldquoL之瞬間Q輸出變為ldquoH其持續時間長

短由RC時間常數決定反之當輸入B之脈波由ldquoL變成ldquoH之瞬間Q輸出

變成ldquoH維持一定時間

74LS123的輸出脈波之寬度是由電阻及電容之時間常數所決定概略計算公

式如下

CR045T timestimes=

電容 C 必須大於 1000pF

27

《實驗結果》

R=24kΩ C=10000pF

所以得到間距脈波為

( )msec0110810000p24k045T cong=timestimes= μ

圖 312 間距脈波

研究經分析後發現

1 間距 T 愈大愈能確保電路之安全性愈有保護作用

2 間距 T 愈大相對的使驅動信號脈波減少愈多造成馬達旋轉扭力大

大減弱

3 適當的間距 T不但不會影響馬達的輸出轉矩而且兼具保護電路的

效果

33 編碼器

轉動編碼器不只可以作為轉速的感測也能做位置的感測又適合於數位處

理故被廣泛使用若就信號來看轉動編碼器可分為增量型與絕對型若以檢

測的方式來分可分為光學式和磁式兩種在本專題中所使用的編碼器為光學式

增量型編碼器﹝11﹞

光學式轉動編碼器的原理如圖 313在附有細縫轉盤的兩側分別裝置發光元

28

件與受光元件如果只有一組光電檢測元件則輸出信號就只有一相的脈波信

號此種裝置稱為脈波產生器圖 314 為增量型轉碼器的輸出信號它是利用

兩組光電元件所產生的脈波信號A 相和 B 相間有相位差正轉時 A 相領前 B

相逆轉時 B 相領前 A 相因此利用此兩相做檢測馬達為正轉或逆轉的工作

並利用 A 相或 B 相的頻率檢測出目前的轉速

吾人計算出編碼器每一轉可以產生約 200 個脈波故檢測 A 相或 B 相其頻

率為 N則轉速應為 60200

timesN

〈rpm〉

圖 313 光學式轉動編碼器的原理圖

圖 314 編碼器的輸出信號波形

29

34 LM2917 FV 電路設計

對 LM2907 而言磁滯比較器和電流汞是構成頻率對電壓轉換的基本架構

並且預留一個運算放大器及一個電晶體供各種不同的使用圖 315 為吾人所設

計的 FV 電路圖中 C1 用以抑制電流汞動作時所產生的漣波變化正常使用時

此電容應大於 10C若 C1 太大也將造成轉換速度下降

因為單晶片 8051 之輸入電壓最高為 5V故必須設計其馬達最高轉速頻率所

轉成的電壓必須在 5V 以內由於馬達轉速頻率範圍極大故吾人給予 LM2917

+12V 的電壓以擴大它可以轉換的電壓範圍並將所需維持在 5V 內

a1

14

b1

1

a1

13

b1

2

a1

12

b1

3

a1

11

b1

4

1

a1

10

b1

5

a1

8

b1

7

a1

9

b1

6

L2917

Encoder輸 入

1uF

+12V

FV輸出1000pF

45k 10kC1

C2

圖 315 FV 電路

30

《實驗結果》

根據統計結果每 50mV 相對於 100Hz如此一來吾人想得知馬達目前

的轉速只要將單晶片所接收到的電壓值經過換算即可得知目前 encoder 所量測

的頻率吾人知道 encoder 一圈可產生 200 個脈波故馬達的轉速便可經過下列

公式換算得知

轉速〈rpm〉 60200

times=f

其中 =f encoder 所量測到的頻率

表 31 頻率與轉換電壓之關係

頻率

(Hz) 1 2 3 4 5 6 7 8 9

電壓(V) 0006 0006 0007 0008 0009 0009 0009 0009 001

頻率

(Hz) 10 20 30 40 50 60 70 80 90

電壓(V) 008 009 010 010 011 011 012 012 013

頻率

(Hz) 100 200 300 400 500 600 700 800 900

電壓(V) 013 018 023 028 033 038 043 049 054

頻率

(Hz) 1000 2000 3000 4000 5000 6000 7000 8000 9000

電壓(V) 059 109 16 209 257 304 3508 4006 45

31

圖 316 頻率對電壓曲線

35 單晶片介面電路

單晶片介面包括了二大部分分別為單晶片 8051AD converter

〈1〉8051 單晶片

為本控制系統的核心一切動作皆經由它控制

〈2〉AD converter

將類比開關所送出來的類比訊號經由 ADC 0804 轉換成數位訊號傳送

到單晶片的輸入埠

351 AD 轉換

以單晶片 8051 控制 ADC0804則單晶片 8051 必須下達ldquo開始轉換rdquo的命令

給 ADC0804然後 ADC0804 就開始讀入類比輸入端的電壓在內部開始轉換

經過一段轉換時間後〈約 100μ s〉ADC0804 就將轉換完成的值放在其內部的三

態輸出栓鎖緩衝器裡然後將轉換完成輸出腳〈INTR〉降為 low以通知單晶片

可以去讀轉換完成資料

當WR和CS 同時為ldquo0rdquo時表示對 ADC0804 下達ldquo開始轉換rdquo命令再經過

32

一段轉換時間〈100μ s〉後轉換完成ADC0804 會將其轉換完成的數位資料放

在其內部 8 位元緩衝區裡且將 INTR 降為ldquo0rdquo因此單晶片只要下達ldquo開始轉換rdquo

命令後去檢查 INTR 的狀態就可以知道是否轉換完畢其方法有兩種

1 輪詢法〈polling〉

2 中斷法〈interrupt〉

所謂輪詢法就是將 ADC0804 的 INTR接到 CPU 的一條 IO 線上然後以軟體指

令主動偵測其狀態當偵測到為ldquo0rdquo時就可以去讀出 ADC0804 裡的緩衝區的轉

換值

中斷法是一個很理想的 IO 方式因為不像輪詢法必須讓 CPU 等 ADC0804

轉換當 CPU 下達ldquo開始轉換rdquo命令後就可以做其他工作當 ADC0804 轉換完

畢後 INTR會降為ldquo0rdquo可以利用此信號去中斷 CPU再由中斷副程式去讀入

轉換值即可因此大大提高了程式的效率

當 CPU 接收到 ADC0804 發出ldquo轉換完畢rdquo的信號〈 INTR =0〉後就可以去

讀出轉換值其讀出的方法是將CS 與RD設為ldquo0rdquo即可讀到轉換值這個讀值的

動作又會使得 INTR恢復成ldquo1rdquo

1 CPU 下達ldquo開始轉換rdquo命令〈CS =0WR =0〉

2 ADC0804ldquo轉換完畢rdquo 〈 INTR =0〉

3 CPU 讀取轉換值〈 RD =0CS =0〉

4 讀完後 INTR =1

ADC0804 主要規格摘要如下

1 +5V 單電源工作電壓

2 類比電壓輸入範圍 0~+5V

33

3 參考電壓為 25V

4 轉換時間為 100μ s〈 CLKf =640kHz〉

5 解析度為 8 位元

6 誤差plusmn 1LSB

7 讀取時間 135ns

36 電源供應系統

本專題中所有電路及硬體設備所需的電源採用交流電源 110V 經由 PT-31

變壓器後再經過橋式整流後提供了直流電源而因為各個電路所需電源不同

因此製作了多組的變壓電路如下

1電壓源 DC5V選擇了 7805 的穩壓 IC 搭配電容得到了+5V 的電壓源

供〈1〉8051 微處理器 〈2〉ADC 0804 〈3〉74LS8674LS12374LS04

74LS02CD4013 〈4〉馬達 Encoder

2電壓源 DC12V使用 7812 穩壓 IC 搭配電容得到+12V 的電壓源供

LM2917 使用

3電壓源 DC24V利用 7824 的穩壓 IC 搭配電容獲得+24V 的直流電壓

源供電路之橋型驅動功率放大之電晶體使用

Vin1

+12V2

GND3

LM7812

2200uF 10000pF 2200uF 10000pF

+12V outputAC

圖 317 直流電源電路

34

圖 318 直流電源電路實體圖

37 馬達轉速的量測

表 33 PWM 輸出對應 encoder 週期

PWM dutycycle encoder 週期 PWM dutycycle encoder 週期

40 sμ 172 sμ 440 sμ 0 sμ

80 sμ 188 sμ 480 sμ 0 sμ

120 sμ 204 sμ 520 sμ 0 sμ

160 sμ 230 sμ 560 sμ 0 sμ

200 sμ 272 sμ 600 sμ 0 sμ

240 sμ 328 sμ 640 sμ 0 sμ

280 sμ 416 sμ 680 sμ 1320 sμ

320 sμ 540 sμ 720 sμ 750 sμ

360 sμ 800 sμ 760 sμ 510 sμ

400 sμ 1320 sμ 800 sμ 400 sμ

35

圖 319 PWM 輸出對應 encoder 週期

由統計可知道此馬達並不是一顆線性馬達故相信若使用模糊控制理論來

作為其回授控制系統的控制器一定能達到比傳統控制器的性能還要好而且若能

在模糊控制裡加上 PID 控制器的觀念一定能在系統的響應時間上升時間

安定時間和超越量達到最佳的控制另一方面馬達在其反方向的內阻較大需

要更大的力量才能使馬達驅動

36

第四章 軟體規劃與製作

41 PWM 之軟體設計

因為之前所介紹的硬體方式是以調整可變電阻來達到轉速的調整因此無法

得知所給予的脈寬長度和轉速大小尤其在回授時也不易給予適當的訊號來調整

轉速因此改良之方法就是以8051之軟體撰寫方式來產生固定的脈寬也就等

於給予轉速的命令而在其回授控制時也只要在內部程式给予適當的指令便可

達到脈寬長度的調整以達到閉迴路之受控系統

411 PWM 軟體流程

設定Timer0模式為0

TH0 = temp 32 TL0 = temp 32

temp = 8192 ndash j4 Key = 0

檢查是否有鍵值

將鍵值存入Key

Yes

No

設定Key值所對應的 j值

If P30 == 1Then P30 = 0 temp = 8192 ndash j4Else P30 = 1 temp=8192ndash880+j4

TH0 = temp 32 TL0 = temp 32

Start Timer0中斷副程式

啟動Timer0

等待Timer0中斷

返回主程式

圖 41 PWM 軟體設計流程圖

37

在此總共設計了五個按鈕分別代表不同的轉速停止正轉〈慢〉正轉

〈快〉逆轉〈慢〉和逆轉〈快〉使用Timer0是因為8051之計時中斷比延遲程

式來的準確故可以達到準確的計時程式設計理念中並沒有將中斷致能清除

因此Timer0會一直處於計時的狀態程式執行時將一邊檢查鍵值〈KeyStatus〉一

邊進行計時當計時完畢便呼叫中斷副程式然後執行改變Port 30的輸出狀

態若是為high則變為low反之若是為low即變為high同時並重設計時時間

Timer0繼續計時

當鍵值改變時計時的時間也會跟著改變如此一來Timer0將ㄧ直重覆上

述動作直到電源切掉Timer0才會停止計時

42 模糊控制之程式規劃與撰寫

本專題目標在完成了先前所規劃的硬體電路之後接著就是要達成利用模糊

控制理論來設計控制器在此採用了單晶片8051目的是為了以硬體實現方式來

代替電腦模擬期望能夠按照原訂計畫完成本專題「具模糊控制理論與雙脈寬調

變法之直流馬達驅動電路設計」

單晶片 8051 模糊控制的程式撰寫採下列幾個步驟依序完成

1 設定變數轉速誤差〈dspeed〉目前轉速〈sspeed〉

2 模糊化採用三角形歸屬函數採用三角形歸屬函數的原因

〈1〉 三角形函數為一連續函數

〈2〉 三角形函數為線性的函數所以計算速度較快

〈3〉 是具有發散也有收斂的函數和指數函數一樣接近

事實

3 模糊推論模糊規則將其所有可能發生情況以 IFhellipTHENhellip表示

並建立控制規則表

4 解模糊化採用重心法

38

421 歸屬函數

設定變數為目前轉速〈sspeed〉與轉速誤差〈dspeed〉因此此模糊控制器共

有兩個輸入訊號與一輸出訊號輸出訊號為脈寬長度該加或是減多少又因為有

五種不同的轉速因此各分別設計了不同的歸屬函數如下

1 當轉速 = 0

ml h

s s p e e d

d s p e e d

r p m0 5 0 1 0 0- 5 0- 1 0 0

mv l l h v h

r p m0- 3 0- 6 0- 1 0 0 3 0 6 0 1 0 0 圖 42 停止時之歸屬函數

2 正轉〈慢〉

ml hsspeed

dspeed

rpm150 225 300750

mvl l h vh

rpm150100500 200 250 300

圖 43 正轉〈慢〉之歸屬函數

39

3 正轉〈快〉

ml hsspeed

dspeed

rpm520 670 820370220

mvl l h vh

rpm500400300200 600 700 800

圖 44 正轉〈快〉之歸屬函數

4 逆轉〈慢〉

ml hsspeed

dspeed

rpm100 250 400500

mvl l h vh

rpm10050250 200 300 400 圖 45 逆轉〈慢〉之歸屬函數

40

5 逆轉〈快〉

ml hsspeed

dspeed

rpm300 450 600150

mvl l h vh

rpm450350250150 550 650 750

750

圖 46 逆轉〈快〉之歸屬函數

6 輸出

OutputMVL L H VH

rpm0-50-150-250 50 150 250

圖 47 輸出之歸屬函數

41

422 模糊規則庫

表 41 為吾人所設計的模糊控制規則庫並利用 Matlab 之 Fuzzy ToolBox 來

建立此規則庫以進行模擬推論圖 48 為當馬達輸入指令為正轉慢時推論後所得

到的三維空間圖

表 41 模糊控制規則表

Dspeed

vl l m h vh

l H M L VL VL

m VH H M L VL sspeed

h VH VH H M L

圖 48 推論後的三維空間圖

42

423 模糊控制器之軟體設計流程

Start 外部中斷副程式

ADCWR = 0 ADCWR = 1

〈令AD開始轉換〉

檢查鍵值以得到對應的歸屬函數

取得目前轉速與

轉速誤差

Fuzzy Rules決策

得到輸出訊號

Delay 10ms

ADC = 0 讀取AD值 ADCRD = 0

將AD值換算成轉速

ADCWR = 0 ADCWR = 1

〈AD開始轉換〉

返回主程式

致能外部中斷

圖 49 Fuzzy Controller 程式流程圖

當控制器一開始動作時便先執行AD轉換的工作當AD轉換完成時其

INTR的接腳便會觸發8051的外部中斷INTR0於是程式便發生外部中斷執行

外部中斷副程式的指令

43

在外部中斷副程式中AD將ㄧ直進行轉換與讀取的工作同時並將轉換後

的值直接換算成目前轉速與轉速誤差以供模糊控制器使用換算目前encoder

的頻率其公式為

160-V2000 times=頻率 〈4-1〉

式4-1之公式是根據表31所導出來的其中V為encoder之頻率轉成電壓之值

又假設所讀取的AD轉換值為value因為

AD的解析度 = bit256

5V+ = 511 ( Vbit ) 〈4-2〉

故value值與電壓V之關係為

511 value V times= 〈4-3〉

所以encoder之頻率與value值的關係為

頻率= 2000times ⎟⎠⎞

⎜⎝⎛ times

511 value - 160 〈4-4〉

故目前轉速為

sspeed = ( )rpm 60 200

times頻率 〈4-5〉

另ㄧ方面在主程式中程式會先去檢查鍵值也就等於檢查輸入指令以

找出符合使用的歸屬函數並將AD所獲得的轉速對應到歸屬函數中然後執行

決策判斷即進入規則庫中尋找出適當的決策判斷最後將此決策送入PWM程

式裡進行脈寬長度的調整使馬達在合理的要求下達到理想的轉速控制不會

因為外在環境的影響而使馬達轉速受到干擾

43 LCD 顯示轉速

此專題最後再增加一LCD顯示幕以顯示目前的轉速否則在程式設計完成

後人卻因無法以肉眼得知目前轉速而不能肯定馬達轉速是否有達到控制的目

標因此增加一顯示幕LCD是有必要的不僅隨時得知目前的轉速還能知道

44

設計出來的軟體其控制性是否夠好夠穩定

431 LCD 顯示幕之軟體流程

Start

設定LCD模組的初始狀態

設定外部中斷INTR0

與Timer0

設定TH0 = (65536 ndash 5000) 256 TL0 = (65536 ndash 5000)256

令ADCWR = 0 ADCWR = 1 AD開始轉換

等待中斷

外部中斷副程式

ADCRD = 0 讀取AD值 ADCRD = 1

將AD值換算成速度

ADCWR = 0 ADCWR = 1 AD開始轉換

Timer0中斷副程式

顯示LCD第一行

ldquoMotor Speed =

顯示LCD第二行ldquoxxxxxxx rpm其中 xxxxxx為外部中斷副程式所換算出的轉速

重設TH0與TL0

返回主程式返回主程式

圖 410 LCD 顯示幕之程式流程圖

此程式主要由兩個部分完成一為外部中斷副程式另ㄧ為 Timer0 中斷副

程式當主程式完成外部與 Timer0 兩個中斷的設定後隨即命令 AD 開始轉換

之後便一直停在 while〈1〉的迴圈裡不做任何動作而由兩個中斷副程式來完

成整個轉換與顯示的工作

45

外部中斷副程式主要負責 AD 的轉換讀取與轉速換算的工作AD 第一

次的轉換由主程式來下達命令當轉換完成後AD 的 INTR 接腳將觸發外部中

斷〈INTR0〉副程式此時程式便進入外部中斷副程式執行讀取 AD 值與轉速

換算的工作當這些工作完成時外部中斷副程式再次下達 AD 開始轉換的命

令而離開中斷副程式當 AD 再次轉換完成時又將再次執行中斷副程式

如此週而復始中斷副程式將ㄧ直進行讀取換算與轉換的工作

而 Timer0 中斷副程式主要負責 LCD 顯示之工作當主程式所設定的計時時

間計數完時程式便進入 Timer0 中斷副程式一旦進入 Timer0 中斷副程式程

式將執行 LCD 的顯示然後再重設 Timer0 的計數時間Timer0 將重新計數當

計數完時程式又將再度進入 Timer0 中斷副程式執行因為程式中並無清除

Timer0 的中斷致能故 Timer0 中斷副程式和外部中斷副程式ㄧ樣週而復始的

執行其副程式的工作

46

第五章 結論

本計劃主旨為具模糊控制理論與雙脈寬調變法之直流馬達驅動電路設計主

要是針對傳統電路設計之缺點提出改良之方法以TPWM取代PWM電路以模

糊理論基礎設計之控制器替代傳統PID控制器

TPWM轉速控制優於PWM之處在於

1 TPWM只需使用單電源即可達到正轉和逆轉的轉速控制而PWM必須

加上逆向開關或是雙電源才能使馬達產生正轉和逆轉

2 TPWM可控制馬達處於停止狀態無論在正向或逆向加上負載皆無法使

馬達產生轉動

3 馬達消耗定額功率輸出轉矩為額定值

4 馬達由停止到某定轉速時反應時間較快

模糊控制器優於PID控制器

1 不須導出繁雜的數學模型

2 適用於非線性系統

3 強健性與容錯性較高

本專題至此雖說大致的目標都已達到但是此系統仍然有許多不完美而需要

改進的地方例如在實驗過程中發現整個轉速的控制在回授上其反應時間

有點慢探討其原因有可能是控制器之程式上的問題

1 因為使用C語言撰寫程式故其執行速度較慢

2 程式可能寫的太累贅

3 模糊控制規則庫建立不良

若想改善這些問題可以嘗試著將C語言改為組合語言來撰寫並盡量減少

47

不必要的指令相信此動作一定能大大提昇程式的執行速度其次就是多做測

試利用測試中所學到的經驗來幫助模糊控制規則庫的改寫同時也能從測試中

發現更多的問題若是都能對問題加以一一解決的話相信必定能將此控制系統

做的更盡善盡美

48

參考文獻

﹝1﹞ 李適中直流馬達速度控制伺服控制〈基礎篇〉全華科技圖書股份有

限公司民 74

﹝2﹞ 廖錦文ldquo直流電動機之雙脈寬調變是〈TPWM〉驅動電路研究電

子技術月刊第 69 期pp94-1021992

﹝3﹞ 楊英魁孫宗瀛鄭魁香林建德蔣旭堂模糊控制理論與技術全華

科技圖書股份有限公司民 85

﹝4﹞ 林敦煌陳憬德直流馬達定位及轉速的模糊控制逢甲大學自動控制工

程學系學士論文民 87

﹝5﹞ LAZadehldquo Fuzzy Sets Information and Control Vol8 pp338-353

1965

﹝6﹞ EHMamdani and SAsslianldquo A fuzzy logic controller for a dynamic

plant Internation Journal of Man-Machine Studies Vol7 pp1-13 1975

﹝7﹞ 孫宗瀛楊英魁Fuzzy 控制理論實作與應用全華科技圖書股份有

限公司民 83 年

﹝8﹞ 許中平黃煌嘉直流電動機控制電路設計全華科技圖書股份有限公司

民 75

﹝9﹞ 盧明智黃敏祥OP Amp 應用+實驗模擬全華科技圖書股份有限公司

民 83

﹝10﹞陳文耀電動機控制工程復文書局2003

﹝11﹞許中平林全福電動機運轉控制技術全華科技圖書股份有限公司民

77

﹝12﹞楊明豐8051 單晶片 C 語言設計實務碁峯資訊2003 年

﹝13﹞蔡朝洋單晶片微電腦 80518951 原理與應用全華科技圖書股份有限公

司民 91

49

﹝14﹞王文俊認識 Fuzzy全華科技圖書股份有限公司民 90

50

附錄 A 專題硬體展示圖

圖 A-1 硬體整體圖

圖 A-2 硬體整體鳥瞰圖

51

圖 A-3 硬體側視圖

圖 A-4 操作與顯示面板

圖 A-5 間距脈波電路與 FV 電路

52

圖 A-6 橋型驅動功率放大電路

圖 A-7 操作與控制面板

53

附錄 B PWM 與模糊控制之程式

include reg51h include stdioh sbit ADCRD = P3^1 設定 RD 控制線接腳為 P31 sbit ADCWR = P3^3 設定 WR 控制線接腳為 P33 sbit P2_0 = 0xA0 接腳定義 sbit P2_1 = 0xA1 接腳定義 sbit P3_0 = 0xB0 接腳定義 sbit P3_1 = 0xB1 接腳定義 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P3_6 = 0xB6 接腳定義 void KeyStatus(void) 函數原型宣告 void feedback(void) 函數原型宣告 void compute_grade(void) 函數原型宣告 void delay1ms(int count) 函數原型宣告 void convert() 函數原型宣告 void condition() 函數原型宣告 void CW(void) 函數原型宣告 int j i 對應 PWM 的寬度 unsigned int temp 所設計的計時器時間 int sample = 1000 取樣率設定消除顯示值跳動 long int value r1 讀取 ADC0804 數位資料 long int set n condition select long int r grade_reg[2] grade[15] error1 error2 long int a1 b1 I long int membership[5][3]membership1[3][3] 定義歸屬函數 long int membership2[3][3] = -10-50-5050510 long int error[2] int Rule[15][3] = 113213313 定義判斷規則庫 212223323 311232333 411241342 511251351

54

main() 主程式 j = PWM = 110 設定 PWM 初始值 IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x00 設定計時器 0 工作於模式 0 temp=8192-j4 設定計時器 0 初值 TH0 = temp 32 TL0 = temp 32 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 P3_4 = 1 P3_5 = 0 P3_6 = 0 ADCWR = 0 令 ADC0804 的 WR = 0 ADCWR = 1 令 ADC0804 的 WR = 1 while (1) KeyStatus() 檢查鍵值 void KeyStatus(void) 檢查鍵值並給對應的 PWM 值 char KeyScan(void) 按鍵掃描函數宣告 unsigned char KeyStatus unsigned char Key = 0 KeyStatus=KeyScan() 呼叫按鍵掃描函數 if (KeyStatus = 0) 已有按鍵輸入 Key = KeyStatus Key = 鍵值 if (Key == 0x01) 假如輸入為按鍵 1 i = 110 PWM 為 110us j = i P3_4 = 1 LED 亮第一顆〈表馬達停止〉 P3_5 = 0 P3_6 = 0

55

else if (Key == 0x02 ) 假如輸入為按鍵 2 i = 140 PWM 為 140us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x04 ) 假如輸入為按鍵 3 i = 180 PWM 為 180us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x08 ) 假如輸入為按鍵 4 i = 80 PWM 為 80us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 else if (Key == 0x10 ) 假如輸入為按鍵 5 i = 40 PWM 為 40us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 PWM = j delay1ms(10) 呼叫延遲函數 feedback() 模糊控制判斷

56

void To_int(void) interrupt 1 Timer0 中斷函數 if (P3_0 == 0) 假如 PWM 輸出為 Low P3_0 = 1 變更 PWM 輸出為 High temp=8192-j4 設定 High 的時間 else 若 PWM 輸出為 High P3_0 = 0 變更 PWM 輸出為 Low temp=8192-880+j4 設定 Low 的時間 TH0 = temp 32 Timer0 的計時時間 TL0 = temp 32 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 char KeyScan(void) 檢查鍵值 char KeyStatus 按鍵狀態 P0=0xff 設定 P0 為輸入模式 KeyStatus=~P0 讀取按鍵狀態 return(KeyStatus) 將鍵值送回程式 void feedback(void) 模糊判斷 void Fuzzycontroller() 函數原型宣告 void condition1() 函數原型宣告

57

void condition2() 函數原型宣告 error1 = ((value)40-160)03 輸入變數 1 delay10ms(10) 延遲 10ms error2 = ((value)40-160)03 輸入變數 2 if (key == 0x01 ) 當按鍵 1找出對應的歸屬函數 並做出模糊控制判斷

int membership[5][3]= -100-60-30-60-300-30030030603060100

int membership1[3][3]=-100-500-50050050100 Fuzzycontroller() condition() if (key == 0x02 ) 當按鍵 2找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

05010050100150100150200150200250200250300 int membership1[3][3]=07515075150225150225300 Fuzzycontroller() condition() else if (key == 0x04) 當按鍵 3找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

200320400300400500400500600500600700600700800 int membership1[3][3]=220370520370520670520670820 Fuzzycontroller() condition() else if (key == 0x08) 當按鍵 4找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

02550255010050100200100200300200300400 int membership1[3][3]=05010050100250100250400 Fuzzycontroller() condition()

58

else if (key == 0x10) 當按鍵 5找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

150250350250350450350450550450550650550650750 int membership1[3][3]=150300450300450600450600750 Fuzzycontroller() condition2() void Fuzzycontroller() 模糊控制判斷 void compute_grade() 函數原型宣告 void compute_grade1() 函數原型宣告 a1 = 0 b1 = 001 I = 0 for (n=0 nlt=14 n++) r = error1 set = Rule[n][0]-1 compute_grade() 計算輸入變數 1 與

模糊程度的歸屬函數 condition = 1 r = error2 set = Rule[n][1]-1 compute_grade1() 計算輸入變數 2 與 模糊程度的歸屬函數 grade[n] = MIN(grade_reg[0] grade_reg[1]) a1 = a1 + (grade[n]membership2[Rule[n][2]-1][1]) b1 = b1 + grade[n] I = a1 b1 得到模糊控制判斷的結果 void compute_grade() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership[set][0]) || (r gt membership[set][2])) 當輸入變數不在 歸屬函數內

59

grade_reg[condition] = 0 else if ((r gt membership[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership[set][2]-r) (membership[set][2] - membership[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership[set][0]) (membership[set][1] - membership[set][0]) void compute_grade1() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership1[set][0]) || (r gt membership1[set][2])) 當輸入變數不在 歸屬函數內 grade_reg[condition] = 0 else if ((r gt membership1[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership1[set][2]-r) (membership1[set][2]-membership1[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership1[set][0]) (membership1[set][1]-membership1[set][0])

60

void condition() P2_0 = 1 設定 P20 為輸入模式 P2_1 = 1 設定 P21 為輸入模式 if ( (P2_0 == 1) ampamp (P2_1 == 0)) 當馬達為正轉時 if ( I gt 0 ) 若模糊判斷結果為正 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 若模糊判斷結果為零 PWM = PWM + 0 PWM 寬度不變 if ( I lt 0 ) 若模糊控制結果小於零 PWM = PWM + 1 PWM 寬度加 1 else if ( (P2_0 == 0) ampamp (P2_1 == 1) ) 若馬達為反轉 if ( I lt 0 ) 模糊控制小於零 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 模糊控制等於零 PWM = PWM + 0 PWM 寬度不變 if ( I gt 0 ) 模糊控制大於零 PWM = PWM + 1 PWM 寬度加 1 CW() 判斷 PWM 寬度上下限

61

void CW() 判斷 PWM 寬度上下限 if ( PWM gt= 215 ) 若 PWM 寬度 gt= 最大寬度 j = 215 PWM 寬度維持於 215us if ( PWM lt= 5 ) 若 PWM 寬度 lt= 最小寬度 j = 5 PWM 寬度維持在 5us if ( PWM gt 5 ampamp PWM lt 215 ) PWM 寬度介於最大與最小間 j = PWM PWM 依模糊控制判斷結果增減 void delay1ms(int count) 延遲 1ms int x y for ( x = 0 x lt count x++ ) for ( y = 0 y lt 122 y++ ) void convert() 數位資料換算成馬達轉速 r1 = ((value)40)-160

62

附錄 C LCD 顯示之程式

includereg51h 含 8051 所有暫存器宣告 include mathh define RS P3_5 LCD 指令資料選擇控制 define RW P3_4 LCD 讀寫控制腳 define Enable P3_3 LCD 致能接腳 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P0_0 = 0x80 接腳定義 sbit P0_1 = 0x81 接腳定義 sbit P0_2 = 0x82 接腳定義 sbit P0_3 = 0x83 接腳定義 sbit P0_4 = 0x84 接腳定義 sbit P0_5 = 0x85 接腳定義 sbit P0_6 = 0x86 接腳定義 sbit ADCRD = P3^7 設定 RD 控制線接腳為 P37 sbit ADCWR = P3^6 設定 WR 控制線接腳為 P36 void delay(void) 函數原型宣告 void delay10ms(int count) 函數原型宣告 void display(void) 函數原型宣告 void InitialLCD(void) 函數原型宣告 void WriteIns(char) 函數原型宣告 void WriteData(char) 函數原型宣告 void WriteString(charchar) 函數原型宣告 void CheckBusy(void) 函數原型宣告 void convert(void) 函數原型宣告 char MSG0[] = Motor Speed = 定義字串 MSG0 char MSG2[] = rpm 定義字串 MSG2 unsigned char MSG1[8]=0000000 定義字串 MSG1 unsigned long int value 讀取 ADC0804 數位資料 int sample = 1000 取樣率設定消除顯示值跳動 long int rpm

63

main() 主程式 InitialLCD() 初始化 LCD IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x01 設定計時器 0 工作於模式 1 TH0 = (65536-5000)256 設定計時器 0 初值 TL0 = (65536-5000)256 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 while(1) 等待中斷 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 while (--sample == 0) 取樣率減 1 sample = 1000 重設取樣率 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 void T0_int(void) interrupt 1 LCD 顯示動態掃描 display() 動態掃描顯示 TH0 = (65536-65535)256 重設計時初值 TL0 = (65536-65535)256

64

void InitialLCD(void) 設定 LCD 模組初始狀態 delay() 延遲函數 WriteIns(0x38) 設定 LCD 模組為 WriteIns(0x38) 2 行顯示 WriteIns(0x38) 8 位元介面 WriteIns(0x38) 5x7 點字型 WriteIns(0x08) 關閉顯示器 WriteIns(0x01) 清除 LCD 螢幕 WriteIns(0x0c) 令顯示器 ON但游標不顯示 WriteIns(0x06) 令 LCD 模組每接收到 1Byte 資料 AC 值自動加 1 void display() 掃描顯示 WriteIns(0x80) 設定 LCD 座標 WriteString(13MSG0) 將字串 MSG0 寫入 LCD 中 WriteIns(0xc0) 設定 LCD 座標 WriteString(8MSG1) 將字串 MSG1 寫入 LCD 中 WriteIns(0xc8) 設定 LCD 座標 WriteString(4MSG2) 將字串 MSG2 寫入 LCD 中 void convert(void) 換算轉速 long int freq freq = ((value)4000) - 16000 數位資料換成頻率公式 rpm = freq3 頻率換算轉速公式 MSG1[0] = (rpm1000000)+0x30 將結果存入字串 MSG1 中 MSG1[1] = ((rpm1000000)100000)+0x30 MSG1[2] = ((rpm100000)10000)+0x30 MSG1[3] = ((rpm10000)1000)+0x30 MSG1[4] = 0x2e MSG1[5] = ((rpm1000)100)+0x30 MSG1[6] = ((rpm100)10)+0x30 MSG1[7] = rpm10+0x30

65

void WriteIns(char instruction) 寫命令至 LCD 中 RS = 0 選擇指令暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = instruction 輸出命令至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteData(char i) 寫資料至 LCD 中 RS = 1 選擇資料暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = i 輸出資料至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteString(countMSG) 寫字串至 LCD 中 char count 字串長度 char MSG[] 字串資料 char i 定義位元組變數 for(i=0 iltcount i++) count 個位元組 WriteData(MSG[i]) 寫入一位元組的資料至 LCD 中 void CheckBusy(void) char i=0x80 檢查忙碌旗標 while(iamp0x80) 忙錄旗標 BF = 1 RS = 0 選擇指令暫存器 RW = 1 讀取 Enable = 1 致能 LCD i = P2 讀取 LCD 指令暫存器內的資料

66

Enable = 0 除能 LCD delay() 延遲函數 void delay() 延遲 5ms int i for(i=0 ilt250 i++)

  • 畢業專題封面pdf
  • File0004pdf
  • 最終版pdfpdf
Page 34: Based on Fuzzy Control Theorem and TPWM Method for DC ... · 使吾人想設計一模糊控制器來做為馬達轉速的閉迴路控制,以解決非線性系統的 問題。除此之外,flcs

25

此外若考慮電晶體BE間的電壓則電路會出現約 plusmn 06V的不感帶〈ded

band〉即電晶體的 oV 對 inV 間的關係如圖3101假使 inV 電壓為正弦波則 oV 變

成如圖3102為了改善這種缺失吾人利用兩個二極體接在電路上如圖38

用來補償電晶體BE間的壓降﹝10﹞

約06V

Dead band

Vo

Vin

圖 3101 呈現不感帶的轉移函數

圖 3102 輸出電壓波形

26

323 間距脈波產生電路

RCext15

Cext14 74123

A3

B2

Q13

CLR1

Q4

7486100k

2200pF

10k

10000pF

+5V

間距脈波輸出

圖 311 間距脈波產生電路

間距脈波的產生方式是根據脈寬調變〈PWM〉後的訊號再經由積分電路的

電阻兩端取出且經由兩倍頻器〈74LS86〉檢示出PWM的正負緣脈波最後

再利用單穩態IC〈74LS123〉將檢出信號之脈寬拉長至01ms此即為間距脈波

74LS123有兩個輸入端子A及B分別為下降波緣輸入端子及上升波緣輸入端

子當輸入A之脈波由ldquoH變成ldquoL之瞬間Q輸出變為ldquoH其持續時間長

短由RC時間常數決定反之當輸入B之脈波由ldquoL變成ldquoH之瞬間Q輸出

變成ldquoH維持一定時間

74LS123的輸出脈波之寬度是由電阻及電容之時間常數所決定概略計算公

式如下

CR045T timestimes=

電容 C 必須大於 1000pF

27

《實驗結果》

R=24kΩ C=10000pF

所以得到間距脈波為

( )msec0110810000p24k045T cong=timestimes= μ

圖 312 間距脈波

研究經分析後發現

1 間距 T 愈大愈能確保電路之安全性愈有保護作用

2 間距 T 愈大相對的使驅動信號脈波減少愈多造成馬達旋轉扭力大

大減弱

3 適當的間距 T不但不會影響馬達的輸出轉矩而且兼具保護電路的

效果

33 編碼器

轉動編碼器不只可以作為轉速的感測也能做位置的感測又適合於數位處

理故被廣泛使用若就信號來看轉動編碼器可分為增量型與絕對型若以檢

測的方式來分可分為光學式和磁式兩種在本專題中所使用的編碼器為光學式

增量型編碼器﹝11﹞

光學式轉動編碼器的原理如圖 313在附有細縫轉盤的兩側分別裝置發光元

28

件與受光元件如果只有一組光電檢測元件則輸出信號就只有一相的脈波信

號此種裝置稱為脈波產生器圖 314 為增量型轉碼器的輸出信號它是利用

兩組光電元件所產生的脈波信號A 相和 B 相間有相位差正轉時 A 相領前 B

相逆轉時 B 相領前 A 相因此利用此兩相做檢測馬達為正轉或逆轉的工作

並利用 A 相或 B 相的頻率檢測出目前的轉速

吾人計算出編碼器每一轉可以產生約 200 個脈波故檢測 A 相或 B 相其頻

率為 N則轉速應為 60200

timesN

〈rpm〉

圖 313 光學式轉動編碼器的原理圖

圖 314 編碼器的輸出信號波形

29

34 LM2917 FV 電路設計

對 LM2907 而言磁滯比較器和電流汞是構成頻率對電壓轉換的基本架構

並且預留一個運算放大器及一個電晶體供各種不同的使用圖 315 為吾人所設

計的 FV 電路圖中 C1 用以抑制電流汞動作時所產生的漣波變化正常使用時

此電容應大於 10C若 C1 太大也將造成轉換速度下降

因為單晶片 8051 之輸入電壓最高為 5V故必須設計其馬達最高轉速頻率所

轉成的電壓必須在 5V 以內由於馬達轉速頻率範圍極大故吾人給予 LM2917

+12V 的電壓以擴大它可以轉換的電壓範圍並將所需維持在 5V 內

a1

14

b1

1

a1

13

b1

2

a1

12

b1

3

a1

11

b1

4

1

a1

10

b1

5

a1

8

b1

7

a1

9

b1

6

L2917

Encoder輸 入

1uF

+12V

FV輸出1000pF

45k 10kC1

C2

圖 315 FV 電路

30

《實驗結果》

根據統計結果每 50mV 相對於 100Hz如此一來吾人想得知馬達目前

的轉速只要將單晶片所接收到的電壓值經過換算即可得知目前 encoder 所量測

的頻率吾人知道 encoder 一圈可產生 200 個脈波故馬達的轉速便可經過下列

公式換算得知

轉速〈rpm〉 60200

times=f

其中 =f encoder 所量測到的頻率

表 31 頻率與轉換電壓之關係

頻率

(Hz) 1 2 3 4 5 6 7 8 9

電壓(V) 0006 0006 0007 0008 0009 0009 0009 0009 001

頻率

(Hz) 10 20 30 40 50 60 70 80 90

電壓(V) 008 009 010 010 011 011 012 012 013

頻率

(Hz) 100 200 300 400 500 600 700 800 900

電壓(V) 013 018 023 028 033 038 043 049 054

頻率

(Hz) 1000 2000 3000 4000 5000 6000 7000 8000 9000

電壓(V) 059 109 16 209 257 304 3508 4006 45

31

圖 316 頻率對電壓曲線

35 單晶片介面電路

單晶片介面包括了二大部分分別為單晶片 8051AD converter

〈1〉8051 單晶片

為本控制系統的核心一切動作皆經由它控制

〈2〉AD converter

將類比開關所送出來的類比訊號經由 ADC 0804 轉換成數位訊號傳送

到單晶片的輸入埠

351 AD 轉換

以單晶片 8051 控制 ADC0804則單晶片 8051 必須下達ldquo開始轉換rdquo的命令

給 ADC0804然後 ADC0804 就開始讀入類比輸入端的電壓在內部開始轉換

經過一段轉換時間後〈約 100μ s〉ADC0804 就將轉換完成的值放在其內部的三

態輸出栓鎖緩衝器裡然後將轉換完成輸出腳〈INTR〉降為 low以通知單晶片

可以去讀轉換完成資料

當WR和CS 同時為ldquo0rdquo時表示對 ADC0804 下達ldquo開始轉換rdquo命令再經過

32

一段轉換時間〈100μ s〉後轉換完成ADC0804 會將其轉換完成的數位資料放

在其內部 8 位元緩衝區裡且將 INTR 降為ldquo0rdquo因此單晶片只要下達ldquo開始轉換rdquo

命令後去檢查 INTR 的狀態就可以知道是否轉換完畢其方法有兩種

1 輪詢法〈polling〉

2 中斷法〈interrupt〉

所謂輪詢法就是將 ADC0804 的 INTR接到 CPU 的一條 IO 線上然後以軟體指

令主動偵測其狀態當偵測到為ldquo0rdquo時就可以去讀出 ADC0804 裡的緩衝區的轉

換值

中斷法是一個很理想的 IO 方式因為不像輪詢法必須讓 CPU 等 ADC0804

轉換當 CPU 下達ldquo開始轉換rdquo命令後就可以做其他工作當 ADC0804 轉換完

畢後 INTR會降為ldquo0rdquo可以利用此信號去中斷 CPU再由中斷副程式去讀入

轉換值即可因此大大提高了程式的效率

當 CPU 接收到 ADC0804 發出ldquo轉換完畢rdquo的信號〈 INTR =0〉後就可以去

讀出轉換值其讀出的方法是將CS 與RD設為ldquo0rdquo即可讀到轉換值這個讀值的

動作又會使得 INTR恢復成ldquo1rdquo

1 CPU 下達ldquo開始轉換rdquo命令〈CS =0WR =0〉

2 ADC0804ldquo轉換完畢rdquo 〈 INTR =0〉

3 CPU 讀取轉換值〈 RD =0CS =0〉

4 讀完後 INTR =1

ADC0804 主要規格摘要如下

1 +5V 單電源工作電壓

2 類比電壓輸入範圍 0~+5V

33

3 參考電壓為 25V

4 轉換時間為 100μ s〈 CLKf =640kHz〉

5 解析度為 8 位元

6 誤差plusmn 1LSB

7 讀取時間 135ns

36 電源供應系統

本專題中所有電路及硬體設備所需的電源採用交流電源 110V 經由 PT-31

變壓器後再經過橋式整流後提供了直流電源而因為各個電路所需電源不同

因此製作了多組的變壓電路如下

1電壓源 DC5V選擇了 7805 的穩壓 IC 搭配電容得到了+5V 的電壓源

供〈1〉8051 微處理器 〈2〉ADC 0804 〈3〉74LS8674LS12374LS04

74LS02CD4013 〈4〉馬達 Encoder

2電壓源 DC12V使用 7812 穩壓 IC 搭配電容得到+12V 的電壓源供

LM2917 使用

3電壓源 DC24V利用 7824 的穩壓 IC 搭配電容獲得+24V 的直流電壓

源供電路之橋型驅動功率放大之電晶體使用

Vin1

+12V2

GND3

LM7812

2200uF 10000pF 2200uF 10000pF

+12V outputAC

圖 317 直流電源電路

34

圖 318 直流電源電路實體圖

37 馬達轉速的量測

表 33 PWM 輸出對應 encoder 週期

PWM dutycycle encoder 週期 PWM dutycycle encoder 週期

40 sμ 172 sμ 440 sμ 0 sμ

80 sμ 188 sμ 480 sμ 0 sμ

120 sμ 204 sμ 520 sμ 0 sμ

160 sμ 230 sμ 560 sμ 0 sμ

200 sμ 272 sμ 600 sμ 0 sμ

240 sμ 328 sμ 640 sμ 0 sμ

280 sμ 416 sμ 680 sμ 1320 sμ

320 sμ 540 sμ 720 sμ 750 sμ

360 sμ 800 sμ 760 sμ 510 sμ

400 sμ 1320 sμ 800 sμ 400 sμ

35

圖 319 PWM 輸出對應 encoder 週期

由統計可知道此馬達並不是一顆線性馬達故相信若使用模糊控制理論來

作為其回授控制系統的控制器一定能達到比傳統控制器的性能還要好而且若能

在模糊控制裡加上 PID 控制器的觀念一定能在系統的響應時間上升時間

安定時間和超越量達到最佳的控制另一方面馬達在其反方向的內阻較大需

要更大的力量才能使馬達驅動

36

第四章 軟體規劃與製作

41 PWM 之軟體設計

因為之前所介紹的硬體方式是以調整可變電阻來達到轉速的調整因此無法

得知所給予的脈寬長度和轉速大小尤其在回授時也不易給予適當的訊號來調整

轉速因此改良之方法就是以8051之軟體撰寫方式來產生固定的脈寬也就等

於給予轉速的命令而在其回授控制時也只要在內部程式给予適當的指令便可

達到脈寬長度的調整以達到閉迴路之受控系統

411 PWM 軟體流程

設定Timer0模式為0

TH0 = temp 32 TL0 = temp 32

temp = 8192 ndash j4 Key = 0

檢查是否有鍵值

將鍵值存入Key

Yes

No

設定Key值所對應的 j值

If P30 == 1Then P30 = 0 temp = 8192 ndash j4Else P30 = 1 temp=8192ndash880+j4

TH0 = temp 32 TL0 = temp 32

Start Timer0中斷副程式

啟動Timer0

等待Timer0中斷

返回主程式

圖 41 PWM 軟體設計流程圖

37

在此總共設計了五個按鈕分別代表不同的轉速停止正轉〈慢〉正轉

〈快〉逆轉〈慢〉和逆轉〈快〉使用Timer0是因為8051之計時中斷比延遲程

式來的準確故可以達到準確的計時程式設計理念中並沒有將中斷致能清除

因此Timer0會一直處於計時的狀態程式執行時將一邊檢查鍵值〈KeyStatus〉一

邊進行計時當計時完畢便呼叫中斷副程式然後執行改變Port 30的輸出狀

態若是為high則變為low反之若是為low即變為high同時並重設計時時間

Timer0繼續計時

當鍵值改變時計時的時間也會跟著改變如此一來Timer0將ㄧ直重覆上

述動作直到電源切掉Timer0才會停止計時

42 模糊控制之程式規劃與撰寫

本專題目標在完成了先前所規劃的硬體電路之後接著就是要達成利用模糊

控制理論來設計控制器在此採用了單晶片8051目的是為了以硬體實現方式來

代替電腦模擬期望能夠按照原訂計畫完成本專題「具模糊控制理論與雙脈寬調

變法之直流馬達驅動電路設計」

單晶片 8051 模糊控制的程式撰寫採下列幾個步驟依序完成

1 設定變數轉速誤差〈dspeed〉目前轉速〈sspeed〉

2 模糊化採用三角形歸屬函數採用三角形歸屬函數的原因

〈1〉 三角形函數為一連續函數

〈2〉 三角形函數為線性的函數所以計算速度較快

〈3〉 是具有發散也有收斂的函數和指數函數一樣接近

事實

3 模糊推論模糊規則將其所有可能發生情況以 IFhellipTHENhellip表示

並建立控制規則表

4 解模糊化採用重心法

38

421 歸屬函數

設定變數為目前轉速〈sspeed〉與轉速誤差〈dspeed〉因此此模糊控制器共

有兩個輸入訊號與一輸出訊號輸出訊號為脈寬長度該加或是減多少又因為有

五種不同的轉速因此各分別設計了不同的歸屬函數如下

1 當轉速 = 0

ml h

s s p e e d

d s p e e d

r p m0 5 0 1 0 0- 5 0- 1 0 0

mv l l h v h

r p m0- 3 0- 6 0- 1 0 0 3 0 6 0 1 0 0 圖 42 停止時之歸屬函數

2 正轉〈慢〉

ml hsspeed

dspeed

rpm150 225 300750

mvl l h vh

rpm150100500 200 250 300

圖 43 正轉〈慢〉之歸屬函數

39

3 正轉〈快〉

ml hsspeed

dspeed

rpm520 670 820370220

mvl l h vh

rpm500400300200 600 700 800

圖 44 正轉〈快〉之歸屬函數

4 逆轉〈慢〉

ml hsspeed

dspeed

rpm100 250 400500

mvl l h vh

rpm10050250 200 300 400 圖 45 逆轉〈慢〉之歸屬函數

40

5 逆轉〈快〉

ml hsspeed

dspeed

rpm300 450 600150

mvl l h vh

rpm450350250150 550 650 750

750

圖 46 逆轉〈快〉之歸屬函數

6 輸出

OutputMVL L H VH

rpm0-50-150-250 50 150 250

圖 47 輸出之歸屬函數

41

422 模糊規則庫

表 41 為吾人所設計的模糊控制規則庫並利用 Matlab 之 Fuzzy ToolBox 來

建立此規則庫以進行模擬推論圖 48 為當馬達輸入指令為正轉慢時推論後所得

到的三維空間圖

表 41 模糊控制規則表

Dspeed

vl l m h vh

l H M L VL VL

m VH H M L VL sspeed

h VH VH H M L

圖 48 推論後的三維空間圖

42

423 模糊控制器之軟體設計流程

Start 外部中斷副程式

ADCWR = 0 ADCWR = 1

〈令AD開始轉換〉

檢查鍵值以得到對應的歸屬函數

取得目前轉速與

轉速誤差

Fuzzy Rules決策

得到輸出訊號

Delay 10ms

ADC = 0 讀取AD值 ADCRD = 0

將AD值換算成轉速

ADCWR = 0 ADCWR = 1

〈AD開始轉換〉

返回主程式

致能外部中斷

圖 49 Fuzzy Controller 程式流程圖

當控制器一開始動作時便先執行AD轉換的工作當AD轉換完成時其

INTR的接腳便會觸發8051的外部中斷INTR0於是程式便發生外部中斷執行

外部中斷副程式的指令

43

在外部中斷副程式中AD將ㄧ直進行轉換與讀取的工作同時並將轉換後

的值直接換算成目前轉速與轉速誤差以供模糊控制器使用換算目前encoder

的頻率其公式為

160-V2000 times=頻率 〈4-1〉

式4-1之公式是根據表31所導出來的其中V為encoder之頻率轉成電壓之值

又假設所讀取的AD轉換值為value因為

AD的解析度 = bit256

5V+ = 511 ( Vbit ) 〈4-2〉

故value值與電壓V之關係為

511 value V times= 〈4-3〉

所以encoder之頻率與value值的關係為

頻率= 2000times ⎟⎠⎞

⎜⎝⎛ times

511 value - 160 〈4-4〉

故目前轉速為

sspeed = ( )rpm 60 200

times頻率 〈4-5〉

另ㄧ方面在主程式中程式會先去檢查鍵值也就等於檢查輸入指令以

找出符合使用的歸屬函數並將AD所獲得的轉速對應到歸屬函數中然後執行

決策判斷即進入規則庫中尋找出適當的決策判斷最後將此決策送入PWM程

式裡進行脈寬長度的調整使馬達在合理的要求下達到理想的轉速控制不會

因為外在環境的影響而使馬達轉速受到干擾

43 LCD 顯示轉速

此專題最後再增加一LCD顯示幕以顯示目前的轉速否則在程式設計完成

後人卻因無法以肉眼得知目前轉速而不能肯定馬達轉速是否有達到控制的目

標因此增加一顯示幕LCD是有必要的不僅隨時得知目前的轉速還能知道

44

設計出來的軟體其控制性是否夠好夠穩定

431 LCD 顯示幕之軟體流程

Start

設定LCD模組的初始狀態

設定外部中斷INTR0

與Timer0

設定TH0 = (65536 ndash 5000) 256 TL0 = (65536 ndash 5000)256

令ADCWR = 0 ADCWR = 1 AD開始轉換

等待中斷

外部中斷副程式

ADCRD = 0 讀取AD值 ADCRD = 1

將AD值換算成速度

ADCWR = 0 ADCWR = 1 AD開始轉換

Timer0中斷副程式

顯示LCD第一行

ldquoMotor Speed =

顯示LCD第二行ldquoxxxxxxx rpm其中 xxxxxx為外部中斷副程式所換算出的轉速

重設TH0與TL0

返回主程式返回主程式

圖 410 LCD 顯示幕之程式流程圖

此程式主要由兩個部分完成一為外部中斷副程式另ㄧ為 Timer0 中斷副

程式當主程式完成外部與 Timer0 兩個中斷的設定後隨即命令 AD 開始轉換

之後便一直停在 while〈1〉的迴圈裡不做任何動作而由兩個中斷副程式來完

成整個轉換與顯示的工作

45

外部中斷副程式主要負責 AD 的轉換讀取與轉速換算的工作AD 第一

次的轉換由主程式來下達命令當轉換完成後AD 的 INTR 接腳將觸發外部中

斷〈INTR0〉副程式此時程式便進入外部中斷副程式執行讀取 AD 值與轉速

換算的工作當這些工作完成時外部中斷副程式再次下達 AD 開始轉換的命

令而離開中斷副程式當 AD 再次轉換完成時又將再次執行中斷副程式

如此週而復始中斷副程式將ㄧ直進行讀取換算與轉換的工作

而 Timer0 中斷副程式主要負責 LCD 顯示之工作當主程式所設定的計時時

間計數完時程式便進入 Timer0 中斷副程式一旦進入 Timer0 中斷副程式程

式將執行 LCD 的顯示然後再重設 Timer0 的計數時間Timer0 將重新計數當

計數完時程式又將再度進入 Timer0 中斷副程式執行因為程式中並無清除

Timer0 的中斷致能故 Timer0 中斷副程式和外部中斷副程式ㄧ樣週而復始的

執行其副程式的工作

46

第五章 結論

本計劃主旨為具模糊控制理論與雙脈寬調變法之直流馬達驅動電路設計主

要是針對傳統電路設計之缺點提出改良之方法以TPWM取代PWM電路以模

糊理論基礎設計之控制器替代傳統PID控制器

TPWM轉速控制優於PWM之處在於

1 TPWM只需使用單電源即可達到正轉和逆轉的轉速控制而PWM必須

加上逆向開關或是雙電源才能使馬達產生正轉和逆轉

2 TPWM可控制馬達處於停止狀態無論在正向或逆向加上負載皆無法使

馬達產生轉動

3 馬達消耗定額功率輸出轉矩為額定值

4 馬達由停止到某定轉速時反應時間較快

模糊控制器優於PID控制器

1 不須導出繁雜的數學模型

2 適用於非線性系統

3 強健性與容錯性較高

本專題至此雖說大致的目標都已達到但是此系統仍然有許多不完美而需要

改進的地方例如在實驗過程中發現整個轉速的控制在回授上其反應時間

有點慢探討其原因有可能是控制器之程式上的問題

1 因為使用C語言撰寫程式故其執行速度較慢

2 程式可能寫的太累贅

3 模糊控制規則庫建立不良

若想改善這些問題可以嘗試著將C語言改為組合語言來撰寫並盡量減少

47

不必要的指令相信此動作一定能大大提昇程式的執行速度其次就是多做測

試利用測試中所學到的經驗來幫助模糊控制規則庫的改寫同時也能從測試中

發現更多的問題若是都能對問題加以一一解決的話相信必定能將此控制系統

做的更盡善盡美

48

參考文獻

﹝1﹞ 李適中直流馬達速度控制伺服控制〈基礎篇〉全華科技圖書股份有

限公司民 74

﹝2﹞ 廖錦文ldquo直流電動機之雙脈寬調變是〈TPWM〉驅動電路研究電

子技術月刊第 69 期pp94-1021992

﹝3﹞ 楊英魁孫宗瀛鄭魁香林建德蔣旭堂模糊控制理論與技術全華

科技圖書股份有限公司民 85

﹝4﹞ 林敦煌陳憬德直流馬達定位及轉速的模糊控制逢甲大學自動控制工

程學系學士論文民 87

﹝5﹞ LAZadehldquo Fuzzy Sets Information and Control Vol8 pp338-353

1965

﹝6﹞ EHMamdani and SAsslianldquo A fuzzy logic controller for a dynamic

plant Internation Journal of Man-Machine Studies Vol7 pp1-13 1975

﹝7﹞ 孫宗瀛楊英魁Fuzzy 控制理論實作與應用全華科技圖書股份有

限公司民 83 年

﹝8﹞ 許中平黃煌嘉直流電動機控制電路設計全華科技圖書股份有限公司

民 75

﹝9﹞ 盧明智黃敏祥OP Amp 應用+實驗模擬全華科技圖書股份有限公司

民 83

﹝10﹞陳文耀電動機控制工程復文書局2003

﹝11﹞許中平林全福電動機運轉控制技術全華科技圖書股份有限公司民

77

﹝12﹞楊明豐8051 單晶片 C 語言設計實務碁峯資訊2003 年

﹝13﹞蔡朝洋單晶片微電腦 80518951 原理與應用全華科技圖書股份有限公

司民 91

49

﹝14﹞王文俊認識 Fuzzy全華科技圖書股份有限公司民 90

50

附錄 A 專題硬體展示圖

圖 A-1 硬體整體圖

圖 A-2 硬體整體鳥瞰圖

51

圖 A-3 硬體側視圖

圖 A-4 操作與顯示面板

圖 A-5 間距脈波電路與 FV 電路

52

圖 A-6 橋型驅動功率放大電路

圖 A-7 操作與控制面板

53

附錄 B PWM 與模糊控制之程式

include reg51h include stdioh sbit ADCRD = P3^1 設定 RD 控制線接腳為 P31 sbit ADCWR = P3^3 設定 WR 控制線接腳為 P33 sbit P2_0 = 0xA0 接腳定義 sbit P2_1 = 0xA1 接腳定義 sbit P3_0 = 0xB0 接腳定義 sbit P3_1 = 0xB1 接腳定義 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P3_6 = 0xB6 接腳定義 void KeyStatus(void) 函數原型宣告 void feedback(void) 函數原型宣告 void compute_grade(void) 函數原型宣告 void delay1ms(int count) 函數原型宣告 void convert() 函數原型宣告 void condition() 函數原型宣告 void CW(void) 函數原型宣告 int j i 對應 PWM 的寬度 unsigned int temp 所設計的計時器時間 int sample = 1000 取樣率設定消除顯示值跳動 long int value r1 讀取 ADC0804 數位資料 long int set n condition select long int r grade_reg[2] grade[15] error1 error2 long int a1 b1 I long int membership[5][3]membership1[3][3] 定義歸屬函數 long int membership2[3][3] = -10-50-5050510 long int error[2] int Rule[15][3] = 113213313 定義判斷規則庫 212223323 311232333 411241342 511251351

54

main() 主程式 j = PWM = 110 設定 PWM 初始值 IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x00 設定計時器 0 工作於模式 0 temp=8192-j4 設定計時器 0 初值 TH0 = temp 32 TL0 = temp 32 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 P3_4 = 1 P3_5 = 0 P3_6 = 0 ADCWR = 0 令 ADC0804 的 WR = 0 ADCWR = 1 令 ADC0804 的 WR = 1 while (1) KeyStatus() 檢查鍵值 void KeyStatus(void) 檢查鍵值並給對應的 PWM 值 char KeyScan(void) 按鍵掃描函數宣告 unsigned char KeyStatus unsigned char Key = 0 KeyStatus=KeyScan() 呼叫按鍵掃描函數 if (KeyStatus = 0) 已有按鍵輸入 Key = KeyStatus Key = 鍵值 if (Key == 0x01) 假如輸入為按鍵 1 i = 110 PWM 為 110us j = i P3_4 = 1 LED 亮第一顆〈表馬達停止〉 P3_5 = 0 P3_6 = 0

55

else if (Key == 0x02 ) 假如輸入為按鍵 2 i = 140 PWM 為 140us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x04 ) 假如輸入為按鍵 3 i = 180 PWM 為 180us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x08 ) 假如輸入為按鍵 4 i = 80 PWM 為 80us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 else if (Key == 0x10 ) 假如輸入為按鍵 5 i = 40 PWM 為 40us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 PWM = j delay1ms(10) 呼叫延遲函數 feedback() 模糊控制判斷

56

void To_int(void) interrupt 1 Timer0 中斷函數 if (P3_0 == 0) 假如 PWM 輸出為 Low P3_0 = 1 變更 PWM 輸出為 High temp=8192-j4 設定 High 的時間 else 若 PWM 輸出為 High P3_0 = 0 變更 PWM 輸出為 Low temp=8192-880+j4 設定 Low 的時間 TH0 = temp 32 Timer0 的計時時間 TL0 = temp 32 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 char KeyScan(void) 檢查鍵值 char KeyStatus 按鍵狀態 P0=0xff 設定 P0 為輸入模式 KeyStatus=~P0 讀取按鍵狀態 return(KeyStatus) 將鍵值送回程式 void feedback(void) 模糊判斷 void Fuzzycontroller() 函數原型宣告 void condition1() 函數原型宣告

57

void condition2() 函數原型宣告 error1 = ((value)40-160)03 輸入變數 1 delay10ms(10) 延遲 10ms error2 = ((value)40-160)03 輸入變數 2 if (key == 0x01 ) 當按鍵 1找出對應的歸屬函數 並做出模糊控制判斷

int membership[5][3]= -100-60-30-60-300-30030030603060100

int membership1[3][3]=-100-500-50050050100 Fuzzycontroller() condition() if (key == 0x02 ) 當按鍵 2找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

05010050100150100150200150200250200250300 int membership1[3][3]=07515075150225150225300 Fuzzycontroller() condition() else if (key == 0x04) 當按鍵 3找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

200320400300400500400500600500600700600700800 int membership1[3][3]=220370520370520670520670820 Fuzzycontroller() condition() else if (key == 0x08) 當按鍵 4找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

02550255010050100200100200300200300400 int membership1[3][3]=05010050100250100250400 Fuzzycontroller() condition()

58

else if (key == 0x10) 當按鍵 5找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

150250350250350450350450550450550650550650750 int membership1[3][3]=150300450300450600450600750 Fuzzycontroller() condition2() void Fuzzycontroller() 模糊控制判斷 void compute_grade() 函數原型宣告 void compute_grade1() 函數原型宣告 a1 = 0 b1 = 001 I = 0 for (n=0 nlt=14 n++) r = error1 set = Rule[n][0]-1 compute_grade() 計算輸入變數 1 與

模糊程度的歸屬函數 condition = 1 r = error2 set = Rule[n][1]-1 compute_grade1() 計算輸入變數 2 與 模糊程度的歸屬函數 grade[n] = MIN(grade_reg[0] grade_reg[1]) a1 = a1 + (grade[n]membership2[Rule[n][2]-1][1]) b1 = b1 + grade[n] I = a1 b1 得到模糊控制判斷的結果 void compute_grade() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership[set][0]) || (r gt membership[set][2])) 當輸入變數不在 歸屬函數內

59

grade_reg[condition] = 0 else if ((r gt membership[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership[set][2]-r) (membership[set][2] - membership[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership[set][0]) (membership[set][1] - membership[set][0]) void compute_grade1() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership1[set][0]) || (r gt membership1[set][2])) 當輸入變數不在 歸屬函數內 grade_reg[condition] = 0 else if ((r gt membership1[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership1[set][2]-r) (membership1[set][2]-membership1[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership1[set][0]) (membership1[set][1]-membership1[set][0])

60

void condition() P2_0 = 1 設定 P20 為輸入模式 P2_1 = 1 設定 P21 為輸入模式 if ( (P2_0 == 1) ampamp (P2_1 == 0)) 當馬達為正轉時 if ( I gt 0 ) 若模糊判斷結果為正 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 若模糊判斷結果為零 PWM = PWM + 0 PWM 寬度不變 if ( I lt 0 ) 若模糊控制結果小於零 PWM = PWM + 1 PWM 寬度加 1 else if ( (P2_0 == 0) ampamp (P2_1 == 1) ) 若馬達為反轉 if ( I lt 0 ) 模糊控制小於零 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 模糊控制等於零 PWM = PWM + 0 PWM 寬度不變 if ( I gt 0 ) 模糊控制大於零 PWM = PWM + 1 PWM 寬度加 1 CW() 判斷 PWM 寬度上下限

61

void CW() 判斷 PWM 寬度上下限 if ( PWM gt= 215 ) 若 PWM 寬度 gt= 最大寬度 j = 215 PWM 寬度維持於 215us if ( PWM lt= 5 ) 若 PWM 寬度 lt= 最小寬度 j = 5 PWM 寬度維持在 5us if ( PWM gt 5 ampamp PWM lt 215 ) PWM 寬度介於最大與最小間 j = PWM PWM 依模糊控制判斷結果增減 void delay1ms(int count) 延遲 1ms int x y for ( x = 0 x lt count x++ ) for ( y = 0 y lt 122 y++ ) void convert() 數位資料換算成馬達轉速 r1 = ((value)40)-160

62

附錄 C LCD 顯示之程式

includereg51h 含 8051 所有暫存器宣告 include mathh define RS P3_5 LCD 指令資料選擇控制 define RW P3_4 LCD 讀寫控制腳 define Enable P3_3 LCD 致能接腳 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P0_0 = 0x80 接腳定義 sbit P0_1 = 0x81 接腳定義 sbit P0_2 = 0x82 接腳定義 sbit P0_3 = 0x83 接腳定義 sbit P0_4 = 0x84 接腳定義 sbit P0_5 = 0x85 接腳定義 sbit P0_6 = 0x86 接腳定義 sbit ADCRD = P3^7 設定 RD 控制線接腳為 P37 sbit ADCWR = P3^6 設定 WR 控制線接腳為 P36 void delay(void) 函數原型宣告 void delay10ms(int count) 函數原型宣告 void display(void) 函數原型宣告 void InitialLCD(void) 函數原型宣告 void WriteIns(char) 函數原型宣告 void WriteData(char) 函數原型宣告 void WriteString(charchar) 函數原型宣告 void CheckBusy(void) 函數原型宣告 void convert(void) 函數原型宣告 char MSG0[] = Motor Speed = 定義字串 MSG0 char MSG2[] = rpm 定義字串 MSG2 unsigned char MSG1[8]=0000000 定義字串 MSG1 unsigned long int value 讀取 ADC0804 數位資料 int sample = 1000 取樣率設定消除顯示值跳動 long int rpm

63

main() 主程式 InitialLCD() 初始化 LCD IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x01 設定計時器 0 工作於模式 1 TH0 = (65536-5000)256 設定計時器 0 初值 TL0 = (65536-5000)256 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 while(1) 等待中斷 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 while (--sample == 0) 取樣率減 1 sample = 1000 重設取樣率 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 void T0_int(void) interrupt 1 LCD 顯示動態掃描 display() 動態掃描顯示 TH0 = (65536-65535)256 重設計時初值 TL0 = (65536-65535)256

64

void InitialLCD(void) 設定 LCD 模組初始狀態 delay() 延遲函數 WriteIns(0x38) 設定 LCD 模組為 WriteIns(0x38) 2 行顯示 WriteIns(0x38) 8 位元介面 WriteIns(0x38) 5x7 點字型 WriteIns(0x08) 關閉顯示器 WriteIns(0x01) 清除 LCD 螢幕 WriteIns(0x0c) 令顯示器 ON但游標不顯示 WriteIns(0x06) 令 LCD 模組每接收到 1Byte 資料 AC 值自動加 1 void display() 掃描顯示 WriteIns(0x80) 設定 LCD 座標 WriteString(13MSG0) 將字串 MSG0 寫入 LCD 中 WriteIns(0xc0) 設定 LCD 座標 WriteString(8MSG1) 將字串 MSG1 寫入 LCD 中 WriteIns(0xc8) 設定 LCD 座標 WriteString(4MSG2) 將字串 MSG2 寫入 LCD 中 void convert(void) 換算轉速 long int freq freq = ((value)4000) - 16000 數位資料換成頻率公式 rpm = freq3 頻率換算轉速公式 MSG1[0] = (rpm1000000)+0x30 將結果存入字串 MSG1 中 MSG1[1] = ((rpm1000000)100000)+0x30 MSG1[2] = ((rpm100000)10000)+0x30 MSG1[3] = ((rpm10000)1000)+0x30 MSG1[4] = 0x2e MSG1[5] = ((rpm1000)100)+0x30 MSG1[6] = ((rpm100)10)+0x30 MSG1[7] = rpm10+0x30

65

void WriteIns(char instruction) 寫命令至 LCD 中 RS = 0 選擇指令暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = instruction 輸出命令至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteData(char i) 寫資料至 LCD 中 RS = 1 選擇資料暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = i 輸出資料至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteString(countMSG) 寫字串至 LCD 中 char count 字串長度 char MSG[] 字串資料 char i 定義位元組變數 for(i=0 iltcount i++) count 個位元組 WriteData(MSG[i]) 寫入一位元組的資料至 LCD 中 void CheckBusy(void) char i=0x80 檢查忙碌旗標 while(iamp0x80) 忙錄旗標 BF = 1 RS = 0 選擇指令暫存器 RW = 1 讀取 Enable = 1 致能 LCD i = P2 讀取 LCD 指令暫存器內的資料

66

Enable = 0 除能 LCD delay() 延遲函數 void delay() 延遲 5ms int i for(i=0 ilt250 i++)

  • 畢業專題封面pdf
  • File0004pdf
  • 最終版pdfpdf
Page 35: Based on Fuzzy Control Theorem and TPWM Method for DC ... · 使吾人想設計一模糊控制器來做為馬達轉速的閉迴路控制,以解決非線性系統的 問題。除此之外,flcs

26

323 間距脈波產生電路

RCext15

Cext14 74123

A3

B2

Q13

CLR1

Q4

7486100k

2200pF

10k

10000pF

+5V

間距脈波輸出

圖 311 間距脈波產生電路

間距脈波的產生方式是根據脈寬調變〈PWM〉後的訊號再經由積分電路的

電阻兩端取出且經由兩倍頻器〈74LS86〉檢示出PWM的正負緣脈波最後

再利用單穩態IC〈74LS123〉將檢出信號之脈寬拉長至01ms此即為間距脈波

74LS123有兩個輸入端子A及B分別為下降波緣輸入端子及上升波緣輸入端

子當輸入A之脈波由ldquoH變成ldquoL之瞬間Q輸出變為ldquoH其持續時間長

短由RC時間常數決定反之當輸入B之脈波由ldquoL變成ldquoH之瞬間Q輸出

變成ldquoH維持一定時間

74LS123的輸出脈波之寬度是由電阻及電容之時間常數所決定概略計算公

式如下

CR045T timestimes=

電容 C 必須大於 1000pF

27

《實驗結果》

R=24kΩ C=10000pF

所以得到間距脈波為

( )msec0110810000p24k045T cong=timestimes= μ

圖 312 間距脈波

研究經分析後發現

1 間距 T 愈大愈能確保電路之安全性愈有保護作用

2 間距 T 愈大相對的使驅動信號脈波減少愈多造成馬達旋轉扭力大

大減弱

3 適當的間距 T不但不會影響馬達的輸出轉矩而且兼具保護電路的

效果

33 編碼器

轉動編碼器不只可以作為轉速的感測也能做位置的感測又適合於數位處

理故被廣泛使用若就信號來看轉動編碼器可分為增量型與絕對型若以檢

測的方式來分可分為光學式和磁式兩種在本專題中所使用的編碼器為光學式

增量型編碼器﹝11﹞

光學式轉動編碼器的原理如圖 313在附有細縫轉盤的兩側分別裝置發光元

28

件與受光元件如果只有一組光電檢測元件則輸出信號就只有一相的脈波信

號此種裝置稱為脈波產生器圖 314 為增量型轉碼器的輸出信號它是利用

兩組光電元件所產生的脈波信號A 相和 B 相間有相位差正轉時 A 相領前 B

相逆轉時 B 相領前 A 相因此利用此兩相做檢測馬達為正轉或逆轉的工作

並利用 A 相或 B 相的頻率檢測出目前的轉速

吾人計算出編碼器每一轉可以產生約 200 個脈波故檢測 A 相或 B 相其頻

率為 N則轉速應為 60200

timesN

〈rpm〉

圖 313 光學式轉動編碼器的原理圖

圖 314 編碼器的輸出信號波形

29

34 LM2917 FV 電路設計

對 LM2907 而言磁滯比較器和電流汞是構成頻率對電壓轉換的基本架構

並且預留一個運算放大器及一個電晶體供各種不同的使用圖 315 為吾人所設

計的 FV 電路圖中 C1 用以抑制電流汞動作時所產生的漣波變化正常使用時

此電容應大於 10C若 C1 太大也將造成轉換速度下降

因為單晶片 8051 之輸入電壓最高為 5V故必須設計其馬達最高轉速頻率所

轉成的電壓必須在 5V 以內由於馬達轉速頻率範圍極大故吾人給予 LM2917

+12V 的電壓以擴大它可以轉換的電壓範圍並將所需維持在 5V 內

a1

14

b1

1

a1

13

b1

2

a1

12

b1

3

a1

11

b1

4

1

a1

10

b1

5

a1

8

b1

7

a1

9

b1

6

L2917

Encoder輸 入

1uF

+12V

FV輸出1000pF

45k 10kC1

C2

圖 315 FV 電路

30

《實驗結果》

根據統計結果每 50mV 相對於 100Hz如此一來吾人想得知馬達目前

的轉速只要將單晶片所接收到的電壓值經過換算即可得知目前 encoder 所量測

的頻率吾人知道 encoder 一圈可產生 200 個脈波故馬達的轉速便可經過下列

公式換算得知

轉速〈rpm〉 60200

times=f

其中 =f encoder 所量測到的頻率

表 31 頻率與轉換電壓之關係

頻率

(Hz) 1 2 3 4 5 6 7 8 9

電壓(V) 0006 0006 0007 0008 0009 0009 0009 0009 001

頻率

(Hz) 10 20 30 40 50 60 70 80 90

電壓(V) 008 009 010 010 011 011 012 012 013

頻率

(Hz) 100 200 300 400 500 600 700 800 900

電壓(V) 013 018 023 028 033 038 043 049 054

頻率

(Hz) 1000 2000 3000 4000 5000 6000 7000 8000 9000

電壓(V) 059 109 16 209 257 304 3508 4006 45

31

圖 316 頻率對電壓曲線

35 單晶片介面電路

單晶片介面包括了二大部分分別為單晶片 8051AD converter

〈1〉8051 單晶片

為本控制系統的核心一切動作皆經由它控制

〈2〉AD converter

將類比開關所送出來的類比訊號經由 ADC 0804 轉換成數位訊號傳送

到單晶片的輸入埠

351 AD 轉換

以單晶片 8051 控制 ADC0804則單晶片 8051 必須下達ldquo開始轉換rdquo的命令

給 ADC0804然後 ADC0804 就開始讀入類比輸入端的電壓在內部開始轉換

經過一段轉換時間後〈約 100μ s〉ADC0804 就將轉換完成的值放在其內部的三

態輸出栓鎖緩衝器裡然後將轉換完成輸出腳〈INTR〉降為 low以通知單晶片

可以去讀轉換完成資料

當WR和CS 同時為ldquo0rdquo時表示對 ADC0804 下達ldquo開始轉換rdquo命令再經過

32

一段轉換時間〈100μ s〉後轉換完成ADC0804 會將其轉換完成的數位資料放

在其內部 8 位元緩衝區裡且將 INTR 降為ldquo0rdquo因此單晶片只要下達ldquo開始轉換rdquo

命令後去檢查 INTR 的狀態就可以知道是否轉換完畢其方法有兩種

1 輪詢法〈polling〉

2 中斷法〈interrupt〉

所謂輪詢法就是將 ADC0804 的 INTR接到 CPU 的一條 IO 線上然後以軟體指

令主動偵測其狀態當偵測到為ldquo0rdquo時就可以去讀出 ADC0804 裡的緩衝區的轉

換值

中斷法是一個很理想的 IO 方式因為不像輪詢法必須讓 CPU 等 ADC0804

轉換當 CPU 下達ldquo開始轉換rdquo命令後就可以做其他工作當 ADC0804 轉換完

畢後 INTR會降為ldquo0rdquo可以利用此信號去中斷 CPU再由中斷副程式去讀入

轉換值即可因此大大提高了程式的效率

當 CPU 接收到 ADC0804 發出ldquo轉換完畢rdquo的信號〈 INTR =0〉後就可以去

讀出轉換值其讀出的方法是將CS 與RD設為ldquo0rdquo即可讀到轉換值這個讀值的

動作又會使得 INTR恢復成ldquo1rdquo

1 CPU 下達ldquo開始轉換rdquo命令〈CS =0WR =0〉

2 ADC0804ldquo轉換完畢rdquo 〈 INTR =0〉

3 CPU 讀取轉換值〈 RD =0CS =0〉

4 讀完後 INTR =1

ADC0804 主要規格摘要如下

1 +5V 單電源工作電壓

2 類比電壓輸入範圍 0~+5V

33

3 參考電壓為 25V

4 轉換時間為 100μ s〈 CLKf =640kHz〉

5 解析度為 8 位元

6 誤差plusmn 1LSB

7 讀取時間 135ns

36 電源供應系統

本專題中所有電路及硬體設備所需的電源採用交流電源 110V 經由 PT-31

變壓器後再經過橋式整流後提供了直流電源而因為各個電路所需電源不同

因此製作了多組的變壓電路如下

1電壓源 DC5V選擇了 7805 的穩壓 IC 搭配電容得到了+5V 的電壓源

供〈1〉8051 微處理器 〈2〉ADC 0804 〈3〉74LS8674LS12374LS04

74LS02CD4013 〈4〉馬達 Encoder

2電壓源 DC12V使用 7812 穩壓 IC 搭配電容得到+12V 的電壓源供

LM2917 使用

3電壓源 DC24V利用 7824 的穩壓 IC 搭配電容獲得+24V 的直流電壓

源供電路之橋型驅動功率放大之電晶體使用

Vin1

+12V2

GND3

LM7812

2200uF 10000pF 2200uF 10000pF

+12V outputAC

圖 317 直流電源電路

34

圖 318 直流電源電路實體圖

37 馬達轉速的量測

表 33 PWM 輸出對應 encoder 週期

PWM dutycycle encoder 週期 PWM dutycycle encoder 週期

40 sμ 172 sμ 440 sμ 0 sμ

80 sμ 188 sμ 480 sμ 0 sμ

120 sμ 204 sμ 520 sμ 0 sμ

160 sμ 230 sμ 560 sμ 0 sμ

200 sμ 272 sμ 600 sμ 0 sμ

240 sμ 328 sμ 640 sμ 0 sμ

280 sμ 416 sμ 680 sμ 1320 sμ

320 sμ 540 sμ 720 sμ 750 sμ

360 sμ 800 sμ 760 sμ 510 sμ

400 sμ 1320 sμ 800 sμ 400 sμ

35

圖 319 PWM 輸出對應 encoder 週期

由統計可知道此馬達並不是一顆線性馬達故相信若使用模糊控制理論來

作為其回授控制系統的控制器一定能達到比傳統控制器的性能還要好而且若能

在模糊控制裡加上 PID 控制器的觀念一定能在系統的響應時間上升時間

安定時間和超越量達到最佳的控制另一方面馬達在其反方向的內阻較大需

要更大的力量才能使馬達驅動

36

第四章 軟體規劃與製作

41 PWM 之軟體設計

因為之前所介紹的硬體方式是以調整可變電阻來達到轉速的調整因此無法

得知所給予的脈寬長度和轉速大小尤其在回授時也不易給予適當的訊號來調整

轉速因此改良之方法就是以8051之軟體撰寫方式來產生固定的脈寬也就等

於給予轉速的命令而在其回授控制時也只要在內部程式给予適當的指令便可

達到脈寬長度的調整以達到閉迴路之受控系統

411 PWM 軟體流程

設定Timer0模式為0

TH0 = temp 32 TL0 = temp 32

temp = 8192 ndash j4 Key = 0

檢查是否有鍵值

將鍵值存入Key

Yes

No

設定Key值所對應的 j值

If P30 == 1Then P30 = 0 temp = 8192 ndash j4Else P30 = 1 temp=8192ndash880+j4

TH0 = temp 32 TL0 = temp 32

Start Timer0中斷副程式

啟動Timer0

等待Timer0中斷

返回主程式

圖 41 PWM 軟體設計流程圖

37

在此總共設計了五個按鈕分別代表不同的轉速停止正轉〈慢〉正轉

〈快〉逆轉〈慢〉和逆轉〈快〉使用Timer0是因為8051之計時中斷比延遲程

式來的準確故可以達到準確的計時程式設計理念中並沒有將中斷致能清除

因此Timer0會一直處於計時的狀態程式執行時將一邊檢查鍵值〈KeyStatus〉一

邊進行計時當計時完畢便呼叫中斷副程式然後執行改變Port 30的輸出狀

態若是為high則變為low反之若是為low即變為high同時並重設計時時間

Timer0繼續計時

當鍵值改變時計時的時間也會跟著改變如此一來Timer0將ㄧ直重覆上

述動作直到電源切掉Timer0才會停止計時

42 模糊控制之程式規劃與撰寫

本專題目標在完成了先前所規劃的硬體電路之後接著就是要達成利用模糊

控制理論來設計控制器在此採用了單晶片8051目的是為了以硬體實現方式來

代替電腦模擬期望能夠按照原訂計畫完成本專題「具模糊控制理論與雙脈寬調

變法之直流馬達驅動電路設計」

單晶片 8051 模糊控制的程式撰寫採下列幾個步驟依序完成

1 設定變數轉速誤差〈dspeed〉目前轉速〈sspeed〉

2 模糊化採用三角形歸屬函數採用三角形歸屬函數的原因

〈1〉 三角形函數為一連續函數

〈2〉 三角形函數為線性的函數所以計算速度較快

〈3〉 是具有發散也有收斂的函數和指數函數一樣接近

事實

3 模糊推論模糊規則將其所有可能發生情況以 IFhellipTHENhellip表示

並建立控制規則表

4 解模糊化採用重心法

38

421 歸屬函數

設定變數為目前轉速〈sspeed〉與轉速誤差〈dspeed〉因此此模糊控制器共

有兩個輸入訊號與一輸出訊號輸出訊號為脈寬長度該加或是減多少又因為有

五種不同的轉速因此各分別設計了不同的歸屬函數如下

1 當轉速 = 0

ml h

s s p e e d

d s p e e d

r p m0 5 0 1 0 0- 5 0- 1 0 0

mv l l h v h

r p m0- 3 0- 6 0- 1 0 0 3 0 6 0 1 0 0 圖 42 停止時之歸屬函數

2 正轉〈慢〉

ml hsspeed

dspeed

rpm150 225 300750

mvl l h vh

rpm150100500 200 250 300

圖 43 正轉〈慢〉之歸屬函數

39

3 正轉〈快〉

ml hsspeed

dspeed

rpm520 670 820370220

mvl l h vh

rpm500400300200 600 700 800

圖 44 正轉〈快〉之歸屬函數

4 逆轉〈慢〉

ml hsspeed

dspeed

rpm100 250 400500

mvl l h vh

rpm10050250 200 300 400 圖 45 逆轉〈慢〉之歸屬函數

40

5 逆轉〈快〉

ml hsspeed

dspeed

rpm300 450 600150

mvl l h vh

rpm450350250150 550 650 750

750

圖 46 逆轉〈快〉之歸屬函數

6 輸出

OutputMVL L H VH

rpm0-50-150-250 50 150 250

圖 47 輸出之歸屬函數

41

422 模糊規則庫

表 41 為吾人所設計的模糊控制規則庫並利用 Matlab 之 Fuzzy ToolBox 來

建立此規則庫以進行模擬推論圖 48 為當馬達輸入指令為正轉慢時推論後所得

到的三維空間圖

表 41 模糊控制規則表

Dspeed

vl l m h vh

l H M L VL VL

m VH H M L VL sspeed

h VH VH H M L

圖 48 推論後的三維空間圖

42

423 模糊控制器之軟體設計流程

Start 外部中斷副程式

ADCWR = 0 ADCWR = 1

〈令AD開始轉換〉

檢查鍵值以得到對應的歸屬函數

取得目前轉速與

轉速誤差

Fuzzy Rules決策

得到輸出訊號

Delay 10ms

ADC = 0 讀取AD值 ADCRD = 0

將AD值換算成轉速

ADCWR = 0 ADCWR = 1

〈AD開始轉換〉

返回主程式

致能外部中斷

圖 49 Fuzzy Controller 程式流程圖

當控制器一開始動作時便先執行AD轉換的工作當AD轉換完成時其

INTR的接腳便會觸發8051的外部中斷INTR0於是程式便發生外部中斷執行

外部中斷副程式的指令

43

在外部中斷副程式中AD將ㄧ直進行轉換與讀取的工作同時並將轉換後

的值直接換算成目前轉速與轉速誤差以供模糊控制器使用換算目前encoder

的頻率其公式為

160-V2000 times=頻率 〈4-1〉

式4-1之公式是根據表31所導出來的其中V為encoder之頻率轉成電壓之值

又假設所讀取的AD轉換值為value因為

AD的解析度 = bit256

5V+ = 511 ( Vbit ) 〈4-2〉

故value值與電壓V之關係為

511 value V times= 〈4-3〉

所以encoder之頻率與value值的關係為

頻率= 2000times ⎟⎠⎞

⎜⎝⎛ times

511 value - 160 〈4-4〉

故目前轉速為

sspeed = ( )rpm 60 200

times頻率 〈4-5〉

另ㄧ方面在主程式中程式會先去檢查鍵值也就等於檢查輸入指令以

找出符合使用的歸屬函數並將AD所獲得的轉速對應到歸屬函數中然後執行

決策判斷即進入規則庫中尋找出適當的決策判斷最後將此決策送入PWM程

式裡進行脈寬長度的調整使馬達在合理的要求下達到理想的轉速控制不會

因為外在環境的影響而使馬達轉速受到干擾

43 LCD 顯示轉速

此專題最後再增加一LCD顯示幕以顯示目前的轉速否則在程式設計完成

後人卻因無法以肉眼得知目前轉速而不能肯定馬達轉速是否有達到控制的目

標因此增加一顯示幕LCD是有必要的不僅隨時得知目前的轉速還能知道

44

設計出來的軟體其控制性是否夠好夠穩定

431 LCD 顯示幕之軟體流程

Start

設定LCD模組的初始狀態

設定外部中斷INTR0

與Timer0

設定TH0 = (65536 ndash 5000) 256 TL0 = (65536 ndash 5000)256

令ADCWR = 0 ADCWR = 1 AD開始轉換

等待中斷

外部中斷副程式

ADCRD = 0 讀取AD值 ADCRD = 1

將AD值換算成速度

ADCWR = 0 ADCWR = 1 AD開始轉換

Timer0中斷副程式

顯示LCD第一行

ldquoMotor Speed =

顯示LCD第二行ldquoxxxxxxx rpm其中 xxxxxx為外部中斷副程式所換算出的轉速

重設TH0與TL0

返回主程式返回主程式

圖 410 LCD 顯示幕之程式流程圖

此程式主要由兩個部分完成一為外部中斷副程式另ㄧ為 Timer0 中斷副

程式當主程式完成外部與 Timer0 兩個中斷的設定後隨即命令 AD 開始轉換

之後便一直停在 while〈1〉的迴圈裡不做任何動作而由兩個中斷副程式來完

成整個轉換與顯示的工作

45

外部中斷副程式主要負責 AD 的轉換讀取與轉速換算的工作AD 第一

次的轉換由主程式來下達命令當轉換完成後AD 的 INTR 接腳將觸發外部中

斷〈INTR0〉副程式此時程式便進入外部中斷副程式執行讀取 AD 值與轉速

換算的工作當這些工作完成時外部中斷副程式再次下達 AD 開始轉換的命

令而離開中斷副程式當 AD 再次轉換完成時又將再次執行中斷副程式

如此週而復始中斷副程式將ㄧ直進行讀取換算與轉換的工作

而 Timer0 中斷副程式主要負責 LCD 顯示之工作當主程式所設定的計時時

間計數完時程式便進入 Timer0 中斷副程式一旦進入 Timer0 中斷副程式程

式將執行 LCD 的顯示然後再重設 Timer0 的計數時間Timer0 將重新計數當

計數完時程式又將再度進入 Timer0 中斷副程式執行因為程式中並無清除

Timer0 的中斷致能故 Timer0 中斷副程式和外部中斷副程式ㄧ樣週而復始的

執行其副程式的工作

46

第五章 結論

本計劃主旨為具模糊控制理論與雙脈寬調變法之直流馬達驅動電路設計主

要是針對傳統電路設計之缺點提出改良之方法以TPWM取代PWM電路以模

糊理論基礎設計之控制器替代傳統PID控制器

TPWM轉速控制優於PWM之處在於

1 TPWM只需使用單電源即可達到正轉和逆轉的轉速控制而PWM必須

加上逆向開關或是雙電源才能使馬達產生正轉和逆轉

2 TPWM可控制馬達處於停止狀態無論在正向或逆向加上負載皆無法使

馬達產生轉動

3 馬達消耗定額功率輸出轉矩為額定值

4 馬達由停止到某定轉速時反應時間較快

模糊控制器優於PID控制器

1 不須導出繁雜的數學模型

2 適用於非線性系統

3 強健性與容錯性較高

本專題至此雖說大致的目標都已達到但是此系統仍然有許多不完美而需要

改進的地方例如在實驗過程中發現整個轉速的控制在回授上其反應時間

有點慢探討其原因有可能是控制器之程式上的問題

1 因為使用C語言撰寫程式故其執行速度較慢

2 程式可能寫的太累贅

3 模糊控制規則庫建立不良

若想改善這些問題可以嘗試著將C語言改為組合語言來撰寫並盡量減少

47

不必要的指令相信此動作一定能大大提昇程式的執行速度其次就是多做測

試利用測試中所學到的經驗來幫助模糊控制規則庫的改寫同時也能從測試中

發現更多的問題若是都能對問題加以一一解決的話相信必定能將此控制系統

做的更盡善盡美

48

參考文獻

﹝1﹞ 李適中直流馬達速度控制伺服控制〈基礎篇〉全華科技圖書股份有

限公司民 74

﹝2﹞ 廖錦文ldquo直流電動機之雙脈寬調變是〈TPWM〉驅動電路研究電

子技術月刊第 69 期pp94-1021992

﹝3﹞ 楊英魁孫宗瀛鄭魁香林建德蔣旭堂模糊控制理論與技術全華

科技圖書股份有限公司民 85

﹝4﹞ 林敦煌陳憬德直流馬達定位及轉速的模糊控制逢甲大學自動控制工

程學系學士論文民 87

﹝5﹞ LAZadehldquo Fuzzy Sets Information and Control Vol8 pp338-353

1965

﹝6﹞ EHMamdani and SAsslianldquo A fuzzy logic controller for a dynamic

plant Internation Journal of Man-Machine Studies Vol7 pp1-13 1975

﹝7﹞ 孫宗瀛楊英魁Fuzzy 控制理論實作與應用全華科技圖書股份有

限公司民 83 年

﹝8﹞ 許中平黃煌嘉直流電動機控制電路設計全華科技圖書股份有限公司

民 75

﹝9﹞ 盧明智黃敏祥OP Amp 應用+實驗模擬全華科技圖書股份有限公司

民 83

﹝10﹞陳文耀電動機控制工程復文書局2003

﹝11﹞許中平林全福電動機運轉控制技術全華科技圖書股份有限公司民

77

﹝12﹞楊明豐8051 單晶片 C 語言設計實務碁峯資訊2003 年

﹝13﹞蔡朝洋單晶片微電腦 80518951 原理與應用全華科技圖書股份有限公

司民 91

49

﹝14﹞王文俊認識 Fuzzy全華科技圖書股份有限公司民 90

50

附錄 A 專題硬體展示圖

圖 A-1 硬體整體圖

圖 A-2 硬體整體鳥瞰圖

51

圖 A-3 硬體側視圖

圖 A-4 操作與顯示面板

圖 A-5 間距脈波電路與 FV 電路

52

圖 A-6 橋型驅動功率放大電路

圖 A-7 操作與控制面板

53

附錄 B PWM 與模糊控制之程式

include reg51h include stdioh sbit ADCRD = P3^1 設定 RD 控制線接腳為 P31 sbit ADCWR = P3^3 設定 WR 控制線接腳為 P33 sbit P2_0 = 0xA0 接腳定義 sbit P2_1 = 0xA1 接腳定義 sbit P3_0 = 0xB0 接腳定義 sbit P3_1 = 0xB1 接腳定義 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P3_6 = 0xB6 接腳定義 void KeyStatus(void) 函數原型宣告 void feedback(void) 函數原型宣告 void compute_grade(void) 函數原型宣告 void delay1ms(int count) 函數原型宣告 void convert() 函數原型宣告 void condition() 函數原型宣告 void CW(void) 函數原型宣告 int j i 對應 PWM 的寬度 unsigned int temp 所設計的計時器時間 int sample = 1000 取樣率設定消除顯示值跳動 long int value r1 讀取 ADC0804 數位資料 long int set n condition select long int r grade_reg[2] grade[15] error1 error2 long int a1 b1 I long int membership[5][3]membership1[3][3] 定義歸屬函數 long int membership2[3][3] = -10-50-5050510 long int error[2] int Rule[15][3] = 113213313 定義判斷規則庫 212223323 311232333 411241342 511251351

54

main() 主程式 j = PWM = 110 設定 PWM 初始值 IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x00 設定計時器 0 工作於模式 0 temp=8192-j4 設定計時器 0 初值 TH0 = temp 32 TL0 = temp 32 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 P3_4 = 1 P3_5 = 0 P3_6 = 0 ADCWR = 0 令 ADC0804 的 WR = 0 ADCWR = 1 令 ADC0804 的 WR = 1 while (1) KeyStatus() 檢查鍵值 void KeyStatus(void) 檢查鍵值並給對應的 PWM 值 char KeyScan(void) 按鍵掃描函數宣告 unsigned char KeyStatus unsigned char Key = 0 KeyStatus=KeyScan() 呼叫按鍵掃描函數 if (KeyStatus = 0) 已有按鍵輸入 Key = KeyStatus Key = 鍵值 if (Key == 0x01) 假如輸入為按鍵 1 i = 110 PWM 為 110us j = i P3_4 = 1 LED 亮第一顆〈表馬達停止〉 P3_5 = 0 P3_6 = 0

55

else if (Key == 0x02 ) 假如輸入為按鍵 2 i = 140 PWM 為 140us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x04 ) 假如輸入為按鍵 3 i = 180 PWM 為 180us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x08 ) 假如輸入為按鍵 4 i = 80 PWM 為 80us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 else if (Key == 0x10 ) 假如輸入為按鍵 5 i = 40 PWM 為 40us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 PWM = j delay1ms(10) 呼叫延遲函數 feedback() 模糊控制判斷

56

void To_int(void) interrupt 1 Timer0 中斷函數 if (P3_0 == 0) 假如 PWM 輸出為 Low P3_0 = 1 變更 PWM 輸出為 High temp=8192-j4 設定 High 的時間 else 若 PWM 輸出為 High P3_0 = 0 變更 PWM 輸出為 Low temp=8192-880+j4 設定 Low 的時間 TH0 = temp 32 Timer0 的計時時間 TL0 = temp 32 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 char KeyScan(void) 檢查鍵值 char KeyStatus 按鍵狀態 P0=0xff 設定 P0 為輸入模式 KeyStatus=~P0 讀取按鍵狀態 return(KeyStatus) 將鍵值送回程式 void feedback(void) 模糊判斷 void Fuzzycontroller() 函數原型宣告 void condition1() 函數原型宣告

57

void condition2() 函數原型宣告 error1 = ((value)40-160)03 輸入變數 1 delay10ms(10) 延遲 10ms error2 = ((value)40-160)03 輸入變數 2 if (key == 0x01 ) 當按鍵 1找出對應的歸屬函數 並做出模糊控制判斷

int membership[5][3]= -100-60-30-60-300-30030030603060100

int membership1[3][3]=-100-500-50050050100 Fuzzycontroller() condition() if (key == 0x02 ) 當按鍵 2找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

05010050100150100150200150200250200250300 int membership1[3][3]=07515075150225150225300 Fuzzycontroller() condition() else if (key == 0x04) 當按鍵 3找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

200320400300400500400500600500600700600700800 int membership1[3][3]=220370520370520670520670820 Fuzzycontroller() condition() else if (key == 0x08) 當按鍵 4找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

02550255010050100200100200300200300400 int membership1[3][3]=05010050100250100250400 Fuzzycontroller() condition()

58

else if (key == 0x10) 當按鍵 5找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

150250350250350450350450550450550650550650750 int membership1[3][3]=150300450300450600450600750 Fuzzycontroller() condition2() void Fuzzycontroller() 模糊控制判斷 void compute_grade() 函數原型宣告 void compute_grade1() 函數原型宣告 a1 = 0 b1 = 001 I = 0 for (n=0 nlt=14 n++) r = error1 set = Rule[n][0]-1 compute_grade() 計算輸入變數 1 與

模糊程度的歸屬函數 condition = 1 r = error2 set = Rule[n][1]-1 compute_grade1() 計算輸入變數 2 與 模糊程度的歸屬函數 grade[n] = MIN(grade_reg[0] grade_reg[1]) a1 = a1 + (grade[n]membership2[Rule[n][2]-1][1]) b1 = b1 + grade[n] I = a1 b1 得到模糊控制判斷的結果 void compute_grade() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership[set][0]) || (r gt membership[set][2])) 當輸入變數不在 歸屬函數內

59

grade_reg[condition] = 0 else if ((r gt membership[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership[set][2]-r) (membership[set][2] - membership[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership[set][0]) (membership[set][1] - membership[set][0]) void compute_grade1() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership1[set][0]) || (r gt membership1[set][2])) 當輸入變數不在 歸屬函數內 grade_reg[condition] = 0 else if ((r gt membership1[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership1[set][2]-r) (membership1[set][2]-membership1[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership1[set][0]) (membership1[set][1]-membership1[set][0])

60

void condition() P2_0 = 1 設定 P20 為輸入模式 P2_1 = 1 設定 P21 為輸入模式 if ( (P2_0 == 1) ampamp (P2_1 == 0)) 當馬達為正轉時 if ( I gt 0 ) 若模糊判斷結果為正 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 若模糊判斷結果為零 PWM = PWM + 0 PWM 寬度不變 if ( I lt 0 ) 若模糊控制結果小於零 PWM = PWM + 1 PWM 寬度加 1 else if ( (P2_0 == 0) ampamp (P2_1 == 1) ) 若馬達為反轉 if ( I lt 0 ) 模糊控制小於零 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 模糊控制等於零 PWM = PWM + 0 PWM 寬度不變 if ( I gt 0 ) 模糊控制大於零 PWM = PWM + 1 PWM 寬度加 1 CW() 判斷 PWM 寬度上下限

61

void CW() 判斷 PWM 寬度上下限 if ( PWM gt= 215 ) 若 PWM 寬度 gt= 最大寬度 j = 215 PWM 寬度維持於 215us if ( PWM lt= 5 ) 若 PWM 寬度 lt= 最小寬度 j = 5 PWM 寬度維持在 5us if ( PWM gt 5 ampamp PWM lt 215 ) PWM 寬度介於最大與最小間 j = PWM PWM 依模糊控制判斷結果增減 void delay1ms(int count) 延遲 1ms int x y for ( x = 0 x lt count x++ ) for ( y = 0 y lt 122 y++ ) void convert() 數位資料換算成馬達轉速 r1 = ((value)40)-160

62

附錄 C LCD 顯示之程式

includereg51h 含 8051 所有暫存器宣告 include mathh define RS P3_5 LCD 指令資料選擇控制 define RW P3_4 LCD 讀寫控制腳 define Enable P3_3 LCD 致能接腳 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P0_0 = 0x80 接腳定義 sbit P0_1 = 0x81 接腳定義 sbit P0_2 = 0x82 接腳定義 sbit P0_3 = 0x83 接腳定義 sbit P0_4 = 0x84 接腳定義 sbit P0_5 = 0x85 接腳定義 sbit P0_6 = 0x86 接腳定義 sbit ADCRD = P3^7 設定 RD 控制線接腳為 P37 sbit ADCWR = P3^6 設定 WR 控制線接腳為 P36 void delay(void) 函數原型宣告 void delay10ms(int count) 函數原型宣告 void display(void) 函數原型宣告 void InitialLCD(void) 函數原型宣告 void WriteIns(char) 函數原型宣告 void WriteData(char) 函數原型宣告 void WriteString(charchar) 函數原型宣告 void CheckBusy(void) 函數原型宣告 void convert(void) 函數原型宣告 char MSG0[] = Motor Speed = 定義字串 MSG0 char MSG2[] = rpm 定義字串 MSG2 unsigned char MSG1[8]=0000000 定義字串 MSG1 unsigned long int value 讀取 ADC0804 數位資料 int sample = 1000 取樣率設定消除顯示值跳動 long int rpm

63

main() 主程式 InitialLCD() 初始化 LCD IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x01 設定計時器 0 工作於模式 1 TH0 = (65536-5000)256 設定計時器 0 初值 TL0 = (65536-5000)256 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 while(1) 等待中斷 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 while (--sample == 0) 取樣率減 1 sample = 1000 重設取樣率 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 void T0_int(void) interrupt 1 LCD 顯示動態掃描 display() 動態掃描顯示 TH0 = (65536-65535)256 重設計時初值 TL0 = (65536-65535)256

64

void InitialLCD(void) 設定 LCD 模組初始狀態 delay() 延遲函數 WriteIns(0x38) 設定 LCD 模組為 WriteIns(0x38) 2 行顯示 WriteIns(0x38) 8 位元介面 WriteIns(0x38) 5x7 點字型 WriteIns(0x08) 關閉顯示器 WriteIns(0x01) 清除 LCD 螢幕 WriteIns(0x0c) 令顯示器 ON但游標不顯示 WriteIns(0x06) 令 LCD 模組每接收到 1Byte 資料 AC 值自動加 1 void display() 掃描顯示 WriteIns(0x80) 設定 LCD 座標 WriteString(13MSG0) 將字串 MSG0 寫入 LCD 中 WriteIns(0xc0) 設定 LCD 座標 WriteString(8MSG1) 將字串 MSG1 寫入 LCD 中 WriteIns(0xc8) 設定 LCD 座標 WriteString(4MSG2) 將字串 MSG2 寫入 LCD 中 void convert(void) 換算轉速 long int freq freq = ((value)4000) - 16000 數位資料換成頻率公式 rpm = freq3 頻率換算轉速公式 MSG1[0] = (rpm1000000)+0x30 將結果存入字串 MSG1 中 MSG1[1] = ((rpm1000000)100000)+0x30 MSG1[2] = ((rpm100000)10000)+0x30 MSG1[3] = ((rpm10000)1000)+0x30 MSG1[4] = 0x2e MSG1[5] = ((rpm1000)100)+0x30 MSG1[6] = ((rpm100)10)+0x30 MSG1[7] = rpm10+0x30

65

void WriteIns(char instruction) 寫命令至 LCD 中 RS = 0 選擇指令暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = instruction 輸出命令至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteData(char i) 寫資料至 LCD 中 RS = 1 選擇資料暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = i 輸出資料至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteString(countMSG) 寫字串至 LCD 中 char count 字串長度 char MSG[] 字串資料 char i 定義位元組變數 for(i=0 iltcount i++) count 個位元組 WriteData(MSG[i]) 寫入一位元組的資料至 LCD 中 void CheckBusy(void) char i=0x80 檢查忙碌旗標 while(iamp0x80) 忙錄旗標 BF = 1 RS = 0 選擇指令暫存器 RW = 1 讀取 Enable = 1 致能 LCD i = P2 讀取 LCD 指令暫存器內的資料

66

Enable = 0 除能 LCD delay() 延遲函數 void delay() 延遲 5ms int i for(i=0 ilt250 i++)

  • 畢業專題封面pdf
  • File0004pdf
  • 最終版pdfpdf
Page 36: Based on Fuzzy Control Theorem and TPWM Method for DC ... · 使吾人想設計一模糊控制器來做為馬達轉速的閉迴路控制,以解決非線性系統的 問題。除此之外,flcs

27

《實驗結果》

R=24kΩ C=10000pF

所以得到間距脈波為

( )msec0110810000p24k045T cong=timestimes= μ

圖 312 間距脈波

研究經分析後發現

1 間距 T 愈大愈能確保電路之安全性愈有保護作用

2 間距 T 愈大相對的使驅動信號脈波減少愈多造成馬達旋轉扭力大

大減弱

3 適當的間距 T不但不會影響馬達的輸出轉矩而且兼具保護電路的

效果

33 編碼器

轉動編碼器不只可以作為轉速的感測也能做位置的感測又適合於數位處

理故被廣泛使用若就信號來看轉動編碼器可分為增量型與絕對型若以檢

測的方式來分可分為光學式和磁式兩種在本專題中所使用的編碼器為光學式

增量型編碼器﹝11﹞

光學式轉動編碼器的原理如圖 313在附有細縫轉盤的兩側分別裝置發光元

28

件與受光元件如果只有一組光電檢測元件則輸出信號就只有一相的脈波信

號此種裝置稱為脈波產生器圖 314 為增量型轉碼器的輸出信號它是利用

兩組光電元件所產生的脈波信號A 相和 B 相間有相位差正轉時 A 相領前 B

相逆轉時 B 相領前 A 相因此利用此兩相做檢測馬達為正轉或逆轉的工作

並利用 A 相或 B 相的頻率檢測出目前的轉速

吾人計算出編碼器每一轉可以產生約 200 個脈波故檢測 A 相或 B 相其頻

率為 N則轉速應為 60200

timesN

〈rpm〉

圖 313 光學式轉動編碼器的原理圖

圖 314 編碼器的輸出信號波形

29

34 LM2917 FV 電路設計

對 LM2907 而言磁滯比較器和電流汞是構成頻率對電壓轉換的基本架構

並且預留一個運算放大器及一個電晶體供各種不同的使用圖 315 為吾人所設

計的 FV 電路圖中 C1 用以抑制電流汞動作時所產生的漣波變化正常使用時

此電容應大於 10C若 C1 太大也將造成轉換速度下降

因為單晶片 8051 之輸入電壓最高為 5V故必須設計其馬達最高轉速頻率所

轉成的電壓必須在 5V 以內由於馬達轉速頻率範圍極大故吾人給予 LM2917

+12V 的電壓以擴大它可以轉換的電壓範圍並將所需維持在 5V 內

a1

14

b1

1

a1

13

b1

2

a1

12

b1

3

a1

11

b1

4

1

a1

10

b1

5

a1

8

b1

7

a1

9

b1

6

L2917

Encoder輸 入

1uF

+12V

FV輸出1000pF

45k 10kC1

C2

圖 315 FV 電路

30

《實驗結果》

根據統計結果每 50mV 相對於 100Hz如此一來吾人想得知馬達目前

的轉速只要將單晶片所接收到的電壓值經過換算即可得知目前 encoder 所量測

的頻率吾人知道 encoder 一圈可產生 200 個脈波故馬達的轉速便可經過下列

公式換算得知

轉速〈rpm〉 60200

times=f

其中 =f encoder 所量測到的頻率

表 31 頻率與轉換電壓之關係

頻率

(Hz) 1 2 3 4 5 6 7 8 9

電壓(V) 0006 0006 0007 0008 0009 0009 0009 0009 001

頻率

(Hz) 10 20 30 40 50 60 70 80 90

電壓(V) 008 009 010 010 011 011 012 012 013

頻率

(Hz) 100 200 300 400 500 600 700 800 900

電壓(V) 013 018 023 028 033 038 043 049 054

頻率

(Hz) 1000 2000 3000 4000 5000 6000 7000 8000 9000

電壓(V) 059 109 16 209 257 304 3508 4006 45

31

圖 316 頻率對電壓曲線

35 單晶片介面電路

單晶片介面包括了二大部分分別為單晶片 8051AD converter

〈1〉8051 單晶片

為本控制系統的核心一切動作皆經由它控制

〈2〉AD converter

將類比開關所送出來的類比訊號經由 ADC 0804 轉換成數位訊號傳送

到單晶片的輸入埠

351 AD 轉換

以單晶片 8051 控制 ADC0804則單晶片 8051 必須下達ldquo開始轉換rdquo的命令

給 ADC0804然後 ADC0804 就開始讀入類比輸入端的電壓在內部開始轉換

經過一段轉換時間後〈約 100μ s〉ADC0804 就將轉換完成的值放在其內部的三

態輸出栓鎖緩衝器裡然後將轉換完成輸出腳〈INTR〉降為 low以通知單晶片

可以去讀轉換完成資料

當WR和CS 同時為ldquo0rdquo時表示對 ADC0804 下達ldquo開始轉換rdquo命令再經過

32

一段轉換時間〈100μ s〉後轉換完成ADC0804 會將其轉換完成的數位資料放

在其內部 8 位元緩衝區裡且將 INTR 降為ldquo0rdquo因此單晶片只要下達ldquo開始轉換rdquo

命令後去檢查 INTR 的狀態就可以知道是否轉換完畢其方法有兩種

1 輪詢法〈polling〉

2 中斷法〈interrupt〉

所謂輪詢法就是將 ADC0804 的 INTR接到 CPU 的一條 IO 線上然後以軟體指

令主動偵測其狀態當偵測到為ldquo0rdquo時就可以去讀出 ADC0804 裡的緩衝區的轉

換值

中斷法是一個很理想的 IO 方式因為不像輪詢法必須讓 CPU 等 ADC0804

轉換當 CPU 下達ldquo開始轉換rdquo命令後就可以做其他工作當 ADC0804 轉換完

畢後 INTR會降為ldquo0rdquo可以利用此信號去中斷 CPU再由中斷副程式去讀入

轉換值即可因此大大提高了程式的效率

當 CPU 接收到 ADC0804 發出ldquo轉換完畢rdquo的信號〈 INTR =0〉後就可以去

讀出轉換值其讀出的方法是將CS 與RD設為ldquo0rdquo即可讀到轉換值這個讀值的

動作又會使得 INTR恢復成ldquo1rdquo

1 CPU 下達ldquo開始轉換rdquo命令〈CS =0WR =0〉

2 ADC0804ldquo轉換完畢rdquo 〈 INTR =0〉

3 CPU 讀取轉換值〈 RD =0CS =0〉

4 讀完後 INTR =1

ADC0804 主要規格摘要如下

1 +5V 單電源工作電壓

2 類比電壓輸入範圍 0~+5V

33

3 參考電壓為 25V

4 轉換時間為 100μ s〈 CLKf =640kHz〉

5 解析度為 8 位元

6 誤差plusmn 1LSB

7 讀取時間 135ns

36 電源供應系統

本專題中所有電路及硬體設備所需的電源採用交流電源 110V 經由 PT-31

變壓器後再經過橋式整流後提供了直流電源而因為各個電路所需電源不同

因此製作了多組的變壓電路如下

1電壓源 DC5V選擇了 7805 的穩壓 IC 搭配電容得到了+5V 的電壓源

供〈1〉8051 微處理器 〈2〉ADC 0804 〈3〉74LS8674LS12374LS04

74LS02CD4013 〈4〉馬達 Encoder

2電壓源 DC12V使用 7812 穩壓 IC 搭配電容得到+12V 的電壓源供

LM2917 使用

3電壓源 DC24V利用 7824 的穩壓 IC 搭配電容獲得+24V 的直流電壓

源供電路之橋型驅動功率放大之電晶體使用

Vin1

+12V2

GND3

LM7812

2200uF 10000pF 2200uF 10000pF

+12V outputAC

圖 317 直流電源電路

34

圖 318 直流電源電路實體圖

37 馬達轉速的量測

表 33 PWM 輸出對應 encoder 週期

PWM dutycycle encoder 週期 PWM dutycycle encoder 週期

40 sμ 172 sμ 440 sμ 0 sμ

80 sμ 188 sμ 480 sμ 0 sμ

120 sμ 204 sμ 520 sμ 0 sμ

160 sμ 230 sμ 560 sμ 0 sμ

200 sμ 272 sμ 600 sμ 0 sμ

240 sμ 328 sμ 640 sμ 0 sμ

280 sμ 416 sμ 680 sμ 1320 sμ

320 sμ 540 sμ 720 sμ 750 sμ

360 sμ 800 sμ 760 sμ 510 sμ

400 sμ 1320 sμ 800 sμ 400 sμ

35

圖 319 PWM 輸出對應 encoder 週期

由統計可知道此馬達並不是一顆線性馬達故相信若使用模糊控制理論來

作為其回授控制系統的控制器一定能達到比傳統控制器的性能還要好而且若能

在模糊控制裡加上 PID 控制器的觀念一定能在系統的響應時間上升時間

安定時間和超越量達到最佳的控制另一方面馬達在其反方向的內阻較大需

要更大的力量才能使馬達驅動

36

第四章 軟體規劃與製作

41 PWM 之軟體設計

因為之前所介紹的硬體方式是以調整可變電阻來達到轉速的調整因此無法

得知所給予的脈寬長度和轉速大小尤其在回授時也不易給予適當的訊號來調整

轉速因此改良之方法就是以8051之軟體撰寫方式來產生固定的脈寬也就等

於給予轉速的命令而在其回授控制時也只要在內部程式给予適當的指令便可

達到脈寬長度的調整以達到閉迴路之受控系統

411 PWM 軟體流程

設定Timer0模式為0

TH0 = temp 32 TL0 = temp 32

temp = 8192 ndash j4 Key = 0

檢查是否有鍵值

將鍵值存入Key

Yes

No

設定Key值所對應的 j值

If P30 == 1Then P30 = 0 temp = 8192 ndash j4Else P30 = 1 temp=8192ndash880+j4

TH0 = temp 32 TL0 = temp 32

Start Timer0中斷副程式

啟動Timer0

等待Timer0中斷

返回主程式

圖 41 PWM 軟體設計流程圖

37

在此總共設計了五個按鈕分別代表不同的轉速停止正轉〈慢〉正轉

〈快〉逆轉〈慢〉和逆轉〈快〉使用Timer0是因為8051之計時中斷比延遲程

式來的準確故可以達到準確的計時程式設計理念中並沒有將中斷致能清除

因此Timer0會一直處於計時的狀態程式執行時將一邊檢查鍵值〈KeyStatus〉一

邊進行計時當計時完畢便呼叫中斷副程式然後執行改變Port 30的輸出狀

態若是為high則變為low反之若是為low即變為high同時並重設計時時間

Timer0繼續計時

當鍵值改變時計時的時間也會跟著改變如此一來Timer0將ㄧ直重覆上

述動作直到電源切掉Timer0才會停止計時

42 模糊控制之程式規劃與撰寫

本專題目標在完成了先前所規劃的硬體電路之後接著就是要達成利用模糊

控制理論來設計控制器在此採用了單晶片8051目的是為了以硬體實現方式來

代替電腦模擬期望能夠按照原訂計畫完成本專題「具模糊控制理論與雙脈寬調

變法之直流馬達驅動電路設計」

單晶片 8051 模糊控制的程式撰寫採下列幾個步驟依序完成

1 設定變數轉速誤差〈dspeed〉目前轉速〈sspeed〉

2 模糊化採用三角形歸屬函數採用三角形歸屬函數的原因

〈1〉 三角形函數為一連續函數

〈2〉 三角形函數為線性的函數所以計算速度較快

〈3〉 是具有發散也有收斂的函數和指數函數一樣接近

事實

3 模糊推論模糊規則將其所有可能發生情況以 IFhellipTHENhellip表示

並建立控制規則表

4 解模糊化採用重心法

38

421 歸屬函數

設定變數為目前轉速〈sspeed〉與轉速誤差〈dspeed〉因此此模糊控制器共

有兩個輸入訊號與一輸出訊號輸出訊號為脈寬長度該加或是減多少又因為有

五種不同的轉速因此各分別設計了不同的歸屬函數如下

1 當轉速 = 0

ml h

s s p e e d

d s p e e d

r p m0 5 0 1 0 0- 5 0- 1 0 0

mv l l h v h

r p m0- 3 0- 6 0- 1 0 0 3 0 6 0 1 0 0 圖 42 停止時之歸屬函數

2 正轉〈慢〉

ml hsspeed

dspeed

rpm150 225 300750

mvl l h vh

rpm150100500 200 250 300

圖 43 正轉〈慢〉之歸屬函數

39

3 正轉〈快〉

ml hsspeed

dspeed

rpm520 670 820370220

mvl l h vh

rpm500400300200 600 700 800

圖 44 正轉〈快〉之歸屬函數

4 逆轉〈慢〉

ml hsspeed

dspeed

rpm100 250 400500

mvl l h vh

rpm10050250 200 300 400 圖 45 逆轉〈慢〉之歸屬函數

40

5 逆轉〈快〉

ml hsspeed

dspeed

rpm300 450 600150

mvl l h vh

rpm450350250150 550 650 750

750

圖 46 逆轉〈快〉之歸屬函數

6 輸出

OutputMVL L H VH

rpm0-50-150-250 50 150 250

圖 47 輸出之歸屬函數

41

422 模糊規則庫

表 41 為吾人所設計的模糊控制規則庫並利用 Matlab 之 Fuzzy ToolBox 來

建立此規則庫以進行模擬推論圖 48 為當馬達輸入指令為正轉慢時推論後所得

到的三維空間圖

表 41 模糊控制規則表

Dspeed

vl l m h vh

l H M L VL VL

m VH H M L VL sspeed

h VH VH H M L

圖 48 推論後的三維空間圖

42

423 模糊控制器之軟體設計流程

Start 外部中斷副程式

ADCWR = 0 ADCWR = 1

〈令AD開始轉換〉

檢查鍵值以得到對應的歸屬函數

取得目前轉速與

轉速誤差

Fuzzy Rules決策

得到輸出訊號

Delay 10ms

ADC = 0 讀取AD值 ADCRD = 0

將AD值換算成轉速

ADCWR = 0 ADCWR = 1

〈AD開始轉換〉

返回主程式

致能外部中斷

圖 49 Fuzzy Controller 程式流程圖

當控制器一開始動作時便先執行AD轉換的工作當AD轉換完成時其

INTR的接腳便會觸發8051的外部中斷INTR0於是程式便發生外部中斷執行

外部中斷副程式的指令

43

在外部中斷副程式中AD將ㄧ直進行轉換與讀取的工作同時並將轉換後

的值直接換算成目前轉速與轉速誤差以供模糊控制器使用換算目前encoder

的頻率其公式為

160-V2000 times=頻率 〈4-1〉

式4-1之公式是根據表31所導出來的其中V為encoder之頻率轉成電壓之值

又假設所讀取的AD轉換值為value因為

AD的解析度 = bit256

5V+ = 511 ( Vbit ) 〈4-2〉

故value值與電壓V之關係為

511 value V times= 〈4-3〉

所以encoder之頻率與value值的關係為

頻率= 2000times ⎟⎠⎞

⎜⎝⎛ times

511 value - 160 〈4-4〉

故目前轉速為

sspeed = ( )rpm 60 200

times頻率 〈4-5〉

另ㄧ方面在主程式中程式會先去檢查鍵值也就等於檢查輸入指令以

找出符合使用的歸屬函數並將AD所獲得的轉速對應到歸屬函數中然後執行

決策判斷即進入規則庫中尋找出適當的決策判斷最後將此決策送入PWM程

式裡進行脈寬長度的調整使馬達在合理的要求下達到理想的轉速控制不會

因為外在環境的影響而使馬達轉速受到干擾

43 LCD 顯示轉速

此專題最後再增加一LCD顯示幕以顯示目前的轉速否則在程式設計完成

後人卻因無法以肉眼得知目前轉速而不能肯定馬達轉速是否有達到控制的目

標因此增加一顯示幕LCD是有必要的不僅隨時得知目前的轉速還能知道

44

設計出來的軟體其控制性是否夠好夠穩定

431 LCD 顯示幕之軟體流程

Start

設定LCD模組的初始狀態

設定外部中斷INTR0

與Timer0

設定TH0 = (65536 ndash 5000) 256 TL0 = (65536 ndash 5000)256

令ADCWR = 0 ADCWR = 1 AD開始轉換

等待中斷

外部中斷副程式

ADCRD = 0 讀取AD值 ADCRD = 1

將AD值換算成速度

ADCWR = 0 ADCWR = 1 AD開始轉換

Timer0中斷副程式

顯示LCD第一行

ldquoMotor Speed =

顯示LCD第二行ldquoxxxxxxx rpm其中 xxxxxx為外部中斷副程式所換算出的轉速

重設TH0與TL0

返回主程式返回主程式

圖 410 LCD 顯示幕之程式流程圖

此程式主要由兩個部分完成一為外部中斷副程式另ㄧ為 Timer0 中斷副

程式當主程式完成外部與 Timer0 兩個中斷的設定後隨即命令 AD 開始轉換

之後便一直停在 while〈1〉的迴圈裡不做任何動作而由兩個中斷副程式來完

成整個轉換與顯示的工作

45

外部中斷副程式主要負責 AD 的轉換讀取與轉速換算的工作AD 第一

次的轉換由主程式來下達命令當轉換完成後AD 的 INTR 接腳將觸發外部中

斷〈INTR0〉副程式此時程式便進入外部中斷副程式執行讀取 AD 值與轉速

換算的工作當這些工作完成時外部中斷副程式再次下達 AD 開始轉換的命

令而離開中斷副程式當 AD 再次轉換完成時又將再次執行中斷副程式

如此週而復始中斷副程式將ㄧ直進行讀取換算與轉換的工作

而 Timer0 中斷副程式主要負責 LCD 顯示之工作當主程式所設定的計時時

間計數完時程式便進入 Timer0 中斷副程式一旦進入 Timer0 中斷副程式程

式將執行 LCD 的顯示然後再重設 Timer0 的計數時間Timer0 將重新計數當

計數完時程式又將再度進入 Timer0 中斷副程式執行因為程式中並無清除

Timer0 的中斷致能故 Timer0 中斷副程式和外部中斷副程式ㄧ樣週而復始的

執行其副程式的工作

46

第五章 結論

本計劃主旨為具模糊控制理論與雙脈寬調變法之直流馬達驅動電路設計主

要是針對傳統電路設計之缺點提出改良之方法以TPWM取代PWM電路以模

糊理論基礎設計之控制器替代傳統PID控制器

TPWM轉速控制優於PWM之處在於

1 TPWM只需使用單電源即可達到正轉和逆轉的轉速控制而PWM必須

加上逆向開關或是雙電源才能使馬達產生正轉和逆轉

2 TPWM可控制馬達處於停止狀態無論在正向或逆向加上負載皆無法使

馬達產生轉動

3 馬達消耗定額功率輸出轉矩為額定值

4 馬達由停止到某定轉速時反應時間較快

模糊控制器優於PID控制器

1 不須導出繁雜的數學模型

2 適用於非線性系統

3 強健性與容錯性較高

本專題至此雖說大致的目標都已達到但是此系統仍然有許多不完美而需要

改進的地方例如在實驗過程中發現整個轉速的控制在回授上其反應時間

有點慢探討其原因有可能是控制器之程式上的問題

1 因為使用C語言撰寫程式故其執行速度較慢

2 程式可能寫的太累贅

3 模糊控制規則庫建立不良

若想改善這些問題可以嘗試著將C語言改為組合語言來撰寫並盡量減少

47

不必要的指令相信此動作一定能大大提昇程式的執行速度其次就是多做測

試利用測試中所學到的經驗來幫助模糊控制規則庫的改寫同時也能從測試中

發現更多的問題若是都能對問題加以一一解決的話相信必定能將此控制系統

做的更盡善盡美

48

參考文獻

﹝1﹞ 李適中直流馬達速度控制伺服控制〈基礎篇〉全華科技圖書股份有

限公司民 74

﹝2﹞ 廖錦文ldquo直流電動機之雙脈寬調變是〈TPWM〉驅動電路研究電

子技術月刊第 69 期pp94-1021992

﹝3﹞ 楊英魁孫宗瀛鄭魁香林建德蔣旭堂模糊控制理論與技術全華

科技圖書股份有限公司民 85

﹝4﹞ 林敦煌陳憬德直流馬達定位及轉速的模糊控制逢甲大學自動控制工

程學系學士論文民 87

﹝5﹞ LAZadehldquo Fuzzy Sets Information and Control Vol8 pp338-353

1965

﹝6﹞ EHMamdani and SAsslianldquo A fuzzy logic controller for a dynamic

plant Internation Journal of Man-Machine Studies Vol7 pp1-13 1975

﹝7﹞ 孫宗瀛楊英魁Fuzzy 控制理論實作與應用全華科技圖書股份有

限公司民 83 年

﹝8﹞ 許中平黃煌嘉直流電動機控制電路設計全華科技圖書股份有限公司

民 75

﹝9﹞ 盧明智黃敏祥OP Amp 應用+實驗模擬全華科技圖書股份有限公司

民 83

﹝10﹞陳文耀電動機控制工程復文書局2003

﹝11﹞許中平林全福電動機運轉控制技術全華科技圖書股份有限公司民

77

﹝12﹞楊明豐8051 單晶片 C 語言設計實務碁峯資訊2003 年

﹝13﹞蔡朝洋單晶片微電腦 80518951 原理與應用全華科技圖書股份有限公

司民 91

49

﹝14﹞王文俊認識 Fuzzy全華科技圖書股份有限公司民 90

50

附錄 A 專題硬體展示圖

圖 A-1 硬體整體圖

圖 A-2 硬體整體鳥瞰圖

51

圖 A-3 硬體側視圖

圖 A-4 操作與顯示面板

圖 A-5 間距脈波電路與 FV 電路

52

圖 A-6 橋型驅動功率放大電路

圖 A-7 操作與控制面板

53

附錄 B PWM 與模糊控制之程式

include reg51h include stdioh sbit ADCRD = P3^1 設定 RD 控制線接腳為 P31 sbit ADCWR = P3^3 設定 WR 控制線接腳為 P33 sbit P2_0 = 0xA0 接腳定義 sbit P2_1 = 0xA1 接腳定義 sbit P3_0 = 0xB0 接腳定義 sbit P3_1 = 0xB1 接腳定義 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P3_6 = 0xB6 接腳定義 void KeyStatus(void) 函數原型宣告 void feedback(void) 函數原型宣告 void compute_grade(void) 函數原型宣告 void delay1ms(int count) 函數原型宣告 void convert() 函數原型宣告 void condition() 函數原型宣告 void CW(void) 函數原型宣告 int j i 對應 PWM 的寬度 unsigned int temp 所設計的計時器時間 int sample = 1000 取樣率設定消除顯示值跳動 long int value r1 讀取 ADC0804 數位資料 long int set n condition select long int r grade_reg[2] grade[15] error1 error2 long int a1 b1 I long int membership[5][3]membership1[3][3] 定義歸屬函數 long int membership2[3][3] = -10-50-5050510 long int error[2] int Rule[15][3] = 113213313 定義判斷規則庫 212223323 311232333 411241342 511251351

54

main() 主程式 j = PWM = 110 設定 PWM 初始值 IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x00 設定計時器 0 工作於模式 0 temp=8192-j4 設定計時器 0 初值 TH0 = temp 32 TL0 = temp 32 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 P3_4 = 1 P3_5 = 0 P3_6 = 0 ADCWR = 0 令 ADC0804 的 WR = 0 ADCWR = 1 令 ADC0804 的 WR = 1 while (1) KeyStatus() 檢查鍵值 void KeyStatus(void) 檢查鍵值並給對應的 PWM 值 char KeyScan(void) 按鍵掃描函數宣告 unsigned char KeyStatus unsigned char Key = 0 KeyStatus=KeyScan() 呼叫按鍵掃描函數 if (KeyStatus = 0) 已有按鍵輸入 Key = KeyStatus Key = 鍵值 if (Key == 0x01) 假如輸入為按鍵 1 i = 110 PWM 為 110us j = i P3_4 = 1 LED 亮第一顆〈表馬達停止〉 P3_5 = 0 P3_6 = 0

55

else if (Key == 0x02 ) 假如輸入為按鍵 2 i = 140 PWM 為 140us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x04 ) 假如輸入為按鍵 3 i = 180 PWM 為 180us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x08 ) 假如輸入為按鍵 4 i = 80 PWM 為 80us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 else if (Key == 0x10 ) 假如輸入為按鍵 5 i = 40 PWM 為 40us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 PWM = j delay1ms(10) 呼叫延遲函數 feedback() 模糊控制判斷

56

void To_int(void) interrupt 1 Timer0 中斷函數 if (P3_0 == 0) 假如 PWM 輸出為 Low P3_0 = 1 變更 PWM 輸出為 High temp=8192-j4 設定 High 的時間 else 若 PWM 輸出為 High P3_0 = 0 變更 PWM 輸出為 Low temp=8192-880+j4 設定 Low 的時間 TH0 = temp 32 Timer0 的計時時間 TL0 = temp 32 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 char KeyScan(void) 檢查鍵值 char KeyStatus 按鍵狀態 P0=0xff 設定 P0 為輸入模式 KeyStatus=~P0 讀取按鍵狀態 return(KeyStatus) 將鍵值送回程式 void feedback(void) 模糊判斷 void Fuzzycontroller() 函數原型宣告 void condition1() 函數原型宣告

57

void condition2() 函數原型宣告 error1 = ((value)40-160)03 輸入變數 1 delay10ms(10) 延遲 10ms error2 = ((value)40-160)03 輸入變數 2 if (key == 0x01 ) 當按鍵 1找出對應的歸屬函數 並做出模糊控制判斷

int membership[5][3]= -100-60-30-60-300-30030030603060100

int membership1[3][3]=-100-500-50050050100 Fuzzycontroller() condition() if (key == 0x02 ) 當按鍵 2找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

05010050100150100150200150200250200250300 int membership1[3][3]=07515075150225150225300 Fuzzycontroller() condition() else if (key == 0x04) 當按鍵 3找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

200320400300400500400500600500600700600700800 int membership1[3][3]=220370520370520670520670820 Fuzzycontroller() condition() else if (key == 0x08) 當按鍵 4找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

02550255010050100200100200300200300400 int membership1[3][3]=05010050100250100250400 Fuzzycontroller() condition()

58

else if (key == 0x10) 當按鍵 5找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

150250350250350450350450550450550650550650750 int membership1[3][3]=150300450300450600450600750 Fuzzycontroller() condition2() void Fuzzycontroller() 模糊控制判斷 void compute_grade() 函數原型宣告 void compute_grade1() 函數原型宣告 a1 = 0 b1 = 001 I = 0 for (n=0 nlt=14 n++) r = error1 set = Rule[n][0]-1 compute_grade() 計算輸入變數 1 與

模糊程度的歸屬函數 condition = 1 r = error2 set = Rule[n][1]-1 compute_grade1() 計算輸入變數 2 與 模糊程度的歸屬函數 grade[n] = MIN(grade_reg[0] grade_reg[1]) a1 = a1 + (grade[n]membership2[Rule[n][2]-1][1]) b1 = b1 + grade[n] I = a1 b1 得到模糊控制判斷的結果 void compute_grade() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership[set][0]) || (r gt membership[set][2])) 當輸入變數不在 歸屬函數內

59

grade_reg[condition] = 0 else if ((r gt membership[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership[set][2]-r) (membership[set][2] - membership[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership[set][0]) (membership[set][1] - membership[set][0]) void compute_grade1() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership1[set][0]) || (r gt membership1[set][2])) 當輸入變數不在 歸屬函數內 grade_reg[condition] = 0 else if ((r gt membership1[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership1[set][2]-r) (membership1[set][2]-membership1[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership1[set][0]) (membership1[set][1]-membership1[set][0])

60

void condition() P2_0 = 1 設定 P20 為輸入模式 P2_1 = 1 設定 P21 為輸入模式 if ( (P2_0 == 1) ampamp (P2_1 == 0)) 當馬達為正轉時 if ( I gt 0 ) 若模糊判斷結果為正 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 若模糊判斷結果為零 PWM = PWM + 0 PWM 寬度不變 if ( I lt 0 ) 若模糊控制結果小於零 PWM = PWM + 1 PWM 寬度加 1 else if ( (P2_0 == 0) ampamp (P2_1 == 1) ) 若馬達為反轉 if ( I lt 0 ) 模糊控制小於零 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 模糊控制等於零 PWM = PWM + 0 PWM 寬度不變 if ( I gt 0 ) 模糊控制大於零 PWM = PWM + 1 PWM 寬度加 1 CW() 判斷 PWM 寬度上下限

61

void CW() 判斷 PWM 寬度上下限 if ( PWM gt= 215 ) 若 PWM 寬度 gt= 最大寬度 j = 215 PWM 寬度維持於 215us if ( PWM lt= 5 ) 若 PWM 寬度 lt= 最小寬度 j = 5 PWM 寬度維持在 5us if ( PWM gt 5 ampamp PWM lt 215 ) PWM 寬度介於最大與最小間 j = PWM PWM 依模糊控制判斷結果增減 void delay1ms(int count) 延遲 1ms int x y for ( x = 0 x lt count x++ ) for ( y = 0 y lt 122 y++ ) void convert() 數位資料換算成馬達轉速 r1 = ((value)40)-160

62

附錄 C LCD 顯示之程式

includereg51h 含 8051 所有暫存器宣告 include mathh define RS P3_5 LCD 指令資料選擇控制 define RW P3_4 LCD 讀寫控制腳 define Enable P3_3 LCD 致能接腳 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P0_0 = 0x80 接腳定義 sbit P0_1 = 0x81 接腳定義 sbit P0_2 = 0x82 接腳定義 sbit P0_3 = 0x83 接腳定義 sbit P0_4 = 0x84 接腳定義 sbit P0_5 = 0x85 接腳定義 sbit P0_6 = 0x86 接腳定義 sbit ADCRD = P3^7 設定 RD 控制線接腳為 P37 sbit ADCWR = P3^6 設定 WR 控制線接腳為 P36 void delay(void) 函數原型宣告 void delay10ms(int count) 函數原型宣告 void display(void) 函數原型宣告 void InitialLCD(void) 函數原型宣告 void WriteIns(char) 函數原型宣告 void WriteData(char) 函數原型宣告 void WriteString(charchar) 函數原型宣告 void CheckBusy(void) 函數原型宣告 void convert(void) 函數原型宣告 char MSG0[] = Motor Speed = 定義字串 MSG0 char MSG2[] = rpm 定義字串 MSG2 unsigned char MSG1[8]=0000000 定義字串 MSG1 unsigned long int value 讀取 ADC0804 數位資料 int sample = 1000 取樣率設定消除顯示值跳動 long int rpm

63

main() 主程式 InitialLCD() 初始化 LCD IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x01 設定計時器 0 工作於模式 1 TH0 = (65536-5000)256 設定計時器 0 初值 TL0 = (65536-5000)256 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 while(1) 等待中斷 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 while (--sample == 0) 取樣率減 1 sample = 1000 重設取樣率 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 void T0_int(void) interrupt 1 LCD 顯示動態掃描 display() 動態掃描顯示 TH0 = (65536-65535)256 重設計時初值 TL0 = (65536-65535)256

64

void InitialLCD(void) 設定 LCD 模組初始狀態 delay() 延遲函數 WriteIns(0x38) 設定 LCD 模組為 WriteIns(0x38) 2 行顯示 WriteIns(0x38) 8 位元介面 WriteIns(0x38) 5x7 點字型 WriteIns(0x08) 關閉顯示器 WriteIns(0x01) 清除 LCD 螢幕 WriteIns(0x0c) 令顯示器 ON但游標不顯示 WriteIns(0x06) 令 LCD 模組每接收到 1Byte 資料 AC 值自動加 1 void display() 掃描顯示 WriteIns(0x80) 設定 LCD 座標 WriteString(13MSG0) 將字串 MSG0 寫入 LCD 中 WriteIns(0xc0) 設定 LCD 座標 WriteString(8MSG1) 將字串 MSG1 寫入 LCD 中 WriteIns(0xc8) 設定 LCD 座標 WriteString(4MSG2) 將字串 MSG2 寫入 LCD 中 void convert(void) 換算轉速 long int freq freq = ((value)4000) - 16000 數位資料換成頻率公式 rpm = freq3 頻率換算轉速公式 MSG1[0] = (rpm1000000)+0x30 將結果存入字串 MSG1 中 MSG1[1] = ((rpm1000000)100000)+0x30 MSG1[2] = ((rpm100000)10000)+0x30 MSG1[3] = ((rpm10000)1000)+0x30 MSG1[4] = 0x2e MSG1[5] = ((rpm1000)100)+0x30 MSG1[6] = ((rpm100)10)+0x30 MSG1[7] = rpm10+0x30

65

void WriteIns(char instruction) 寫命令至 LCD 中 RS = 0 選擇指令暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = instruction 輸出命令至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteData(char i) 寫資料至 LCD 中 RS = 1 選擇資料暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = i 輸出資料至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteString(countMSG) 寫字串至 LCD 中 char count 字串長度 char MSG[] 字串資料 char i 定義位元組變數 for(i=0 iltcount i++) count 個位元組 WriteData(MSG[i]) 寫入一位元組的資料至 LCD 中 void CheckBusy(void) char i=0x80 檢查忙碌旗標 while(iamp0x80) 忙錄旗標 BF = 1 RS = 0 選擇指令暫存器 RW = 1 讀取 Enable = 1 致能 LCD i = P2 讀取 LCD 指令暫存器內的資料

66

Enable = 0 除能 LCD delay() 延遲函數 void delay() 延遲 5ms int i for(i=0 ilt250 i++)

  • 畢業專題封面pdf
  • File0004pdf
  • 最終版pdfpdf
Page 37: Based on Fuzzy Control Theorem and TPWM Method for DC ... · 使吾人想設計一模糊控制器來做為馬達轉速的閉迴路控制,以解決非線性系統的 問題。除此之外,flcs

28

件與受光元件如果只有一組光電檢測元件則輸出信號就只有一相的脈波信

號此種裝置稱為脈波產生器圖 314 為增量型轉碼器的輸出信號它是利用

兩組光電元件所產生的脈波信號A 相和 B 相間有相位差正轉時 A 相領前 B

相逆轉時 B 相領前 A 相因此利用此兩相做檢測馬達為正轉或逆轉的工作

並利用 A 相或 B 相的頻率檢測出目前的轉速

吾人計算出編碼器每一轉可以產生約 200 個脈波故檢測 A 相或 B 相其頻

率為 N則轉速應為 60200

timesN

〈rpm〉

圖 313 光學式轉動編碼器的原理圖

圖 314 編碼器的輸出信號波形

29

34 LM2917 FV 電路設計

對 LM2907 而言磁滯比較器和電流汞是構成頻率對電壓轉換的基本架構

並且預留一個運算放大器及一個電晶體供各種不同的使用圖 315 為吾人所設

計的 FV 電路圖中 C1 用以抑制電流汞動作時所產生的漣波變化正常使用時

此電容應大於 10C若 C1 太大也將造成轉換速度下降

因為單晶片 8051 之輸入電壓最高為 5V故必須設計其馬達最高轉速頻率所

轉成的電壓必須在 5V 以內由於馬達轉速頻率範圍極大故吾人給予 LM2917

+12V 的電壓以擴大它可以轉換的電壓範圍並將所需維持在 5V 內

a1

14

b1

1

a1

13

b1

2

a1

12

b1

3

a1

11

b1

4

1

a1

10

b1

5

a1

8

b1

7

a1

9

b1

6

L2917

Encoder輸 入

1uF

+12V

FV輸出1000pF

45k 10kC1

C2

圖 315 FV 電路

30

《實驗結果》

根據統計結果每 50mV 相對於 100Hz如此一來吾人想得知馬達目前

的轉速只要將單晶片所接收到的電壓值經過換算即可得知目前 encoder 所量測

的頻率吾人知道 encoder 一圈可產生 200 個脈波故馬達的轉速便可經過下列

公式換算得知

轉速〈rpm〉 60200

times=f

其中 =f encoder 所量測到的頻率

表 31 頻率與轉換電壓之關係

頻率

(Hz) 1 2 3 4 5 6 7 8 9

電壓(V) 0006 0006 0007 0008 0009 0009 0009 0009 001

頻率

(Hz) 10 20 30 40 50 60 70 80 90

電壓(V) 008 009 010 010 011 011 012 012 013

頻率

(Hz) 100 200 300 400 500 600 700 800 900

電壓(V) 013 018 023 028 033 038 043 049 054

頻率

(Hz) 1000 2000 3000 4000 5000 6000 7000 8000 9000

電壓(V) 059 109 16 209 257 304 3508 4006 45

31

圖 316 頻率對電壓曲線

35 單晶片介面電路

單晶片介面包括了二大部分分別為單晶片 8051AD converter

〈1〉8051 單晶片

為本控制系統的核心一切動作皆經由它控制

〈2〉AD converter

將類比開關所送出來的類比訊號經由 ADC 0804 轉換成數位訊號傳送

到單晶片的輸入埠

351 AD 轉換

以單晶片 8051 控制 ADC0804則單晶片 8051 必須下達ldquo開始轉換rdquo的命令

給 ADC0804然後 ADC0804 就開始讀入類比輸入端的電壓在內部開始轉換

經過一段轉換時間後〈約 100μ s〉ADC0804 就將轉換完成的值放在其內部的三

態輸出栓鎖緩衝器裡然後將轉換完成輸出腳〈INTR〉降為 low以通知單晶片

可以去讀轉換完成資料

當WR和CS 同時為ldquo0rdquo時表示對 ADC0804 下達ldquo開始轉換rdquo命令再經過

32

一段轉換時間〈100μ s〉後轉換完成ADC0804 會將其轉換完成的數位資料放

在其內部 8 位元緩衝區裡且將 INTR 降為ldquo0rdquo因此單晶片只要下達ldquo開始轉換rdquo

命令後去檢查 INTR 的狀態就可以知道是否轉換完畢其方法有兩種

1 輪詢法〈polling〉

2 中斷法〈interrupt〉

所謂輪詢法就是將 ADC0804 的 INTR接到 CPU 的一條 IO 線上然後以軟體指

令主動偵測其狀態當偵測到為ldquo0rdquo時就可以去讀出 ADC0804 裡的緩衝區的轉

換值

中斷法是一個很理想的 IO 方式因為不像輪詢法必須讓 CPU 等 ADC0804

轉換當 CPU 下達ldquo開始轉換rdquo命令後就可以做其他工作當 ADC0804 轉換完

畢後 INTR會降為ldquo0rdquo可以利用此信號去中斷 CPU再由中斷副程式去讀入

轉換值即可因此大大提高了程式的效率

當 CPU 接收到 ADC0804 發出ldquo轉換完畢rdquo的信號〈 INTR =0〉後就可以去

讀出轉換值其讀出的方法是將CS 與RD設為ldquo0rdquo即可讀到轉換值這個讀值的

動作又會使得 INTR恢復成ldquo1rdquo

1 CPU 下達ldquo開始轉換rdquo命令〈CS =0WR =0〉

2 ADC0804ldquo轉換完畢rdquo 〈 INTR =0〉

3 CPU 讀取轉換值〈 RD =0CS =0〉

4 讀完後 INTR =1

ADC0804 主要規格摘要如下

1 +5V 單電源工作電壓

2 類比電壓輸入範圍 0~+5V

33

3 參考電壓為 25V

4 轉換時間為 100μ s〈 CLKf =640kHz〉

5 解析度為 8 位元

6 誤差plusmn 1LSB

7 讀取時間 135ns

36 電源供應系統

本專題中所有電路及硬體設備所需的電源採用交流電源 110V 經由 PT-31

變壓器後再經過橋式整流後提供了直流電源而因為各個電路所需電源不同

因此製作了多組的變壓電路如下

1電壓源 DC5V選擇了 7805 的穩壓 IC 搭配電容得到了+5V 的電壓源

供〈1〉8051 微處理器 〈2〉ADC 0804 〈3〉74LS8674LS12374LS04

74LS02CD4013 〈4〉馬達 Encoder

2電壓源 DC12V使用 7812 穩壓 IC 搭配電容得到+12V 的電壓源供

LM2917 使用

3電壓源 DC24V利用 7824 的穩壓 IC 搭配電容獲得+24V 的直流電壓

源供電路之橋型驅動功率放大之電晶體使用

Vin1

+12V2

GND3

LM7812

2200uF 10000pF 2200uF 10000pF

+12V outputAC

圖 317 直流電源電路

34

圖 318 直流電源電路實體圖

37 馬達轉速的量測

表 33 PWM 輸出對應 encoder 週期

PWM dutycycle encoder 週期 PWM dutycycle encoder 週期

40 sμ 172 sμ 440 sμ 0 sμ

80 sμ 188 sμ 480 sμ 0 sμ

120 sμ 204 sμ 520 sμ 0 sμ

160 sμ 230 sμ 560 sμ 0 sμ

200 sμ 272 sμ 600 sμ 0 sμ

240 sμ 328 sμ 640 sμ 0 sμ

280 sμ 416 sμ 680 sμ 1320 sμ

320 sμ 540 sμ 720 sμ 750 sμ

360 sμ 800 sμ 760 sμ 510 sμ

400 sμ 1320 sμ 800 sμ 400 sμ

35

圖 319 PWM 輸出對應 encoder 週期

由統計可知道此馬達並不是一顆線性馬達故相信若使用模糊控制理論來

作為其回授控制系統的控制器一定能達到比傳統控制器的性能還要好而且若能

在模糊控制裡加上 PID 控制器的觀念一定能在系統的響應時間上升時間

安定時間和超越量達到最佳的控制另一方面馬達在其反方向的內阻較大需

要更大的力量才能使馬達驅動

36

第四章 軟體規劃與製作

41 PWM 之軟體設計

因為之前所介紹的硬體方式是以調整可變電阻來達到轉速的調整因此無法

得知所給予的脈寬長度和轉速大小尤其在回授時也不易給予適當的訊號來調整

轉速因此改良之方法就是以8051之軟體撰寫方式來產生固定的脈寬也就等

於給予轉速的命令而在其回授控制時也只要在內部程式给予適當的指令便可

達到脈寬長度的調整以達到閉迴路之受控系統

411 PWM 軟體流程

設定Timer0模式為0

TH0 = temp 32 TL0 = temp 32

temp = 8192 ndash j4 Key = 0

檢查是否有鍵值

將鍵值存入Key

Yes

No

設定Key值所對應的 j值

If P30 == 1Then P30 = 0 temp = 8192 ndash j4Else P30 = 1 temp=8192ndash880+j4

TH0 = temp 32 TL0 = temp 32

Start Timer0中斷副程式

啟動Timer0

等待Timer0中斷

返回主程式

圖 41 PWM 軟體設計流程圖

37

在此總共設計了五個按鈕分別代表不同的轉速停止正轉〈慢〉正轉

〈快〉逆轉〈慢〉和逆轉〈快〉使用Timer0是因為8051之計時中斷比延遲程

式來的準確故可以達到準確的計時程式設計理念中並沒有將中斷致能清除

因此Timer0會一直處於計時的狀態程式執行時將一邊檢查鍵值〈KeyStatus〉一

邊進行計時當計時完畢便呼叫中斷副程式然後執行改變Port 30的輸出狀

態若是為high則變為low反之若是為low即變為high同時並重設計時時間

Timer0繼續計時

當鍵值改變時計時的時間也會跟著改變如此一來Timer0將ㄧ直重覆上

述動作直到電源切掉Timer0才會停止計時

42 模糊控制之程式規劃與撰寫

本專題目標在完成了先前所規劃的硬體電路之後接著就是要達成利用模糊

控制理論來設計控制器在此採用了單晶片8051目的是為了以硬體實現方式來

代替電腦模擬期望能夠按照原訂計畫完成本專題「具模糊控制理論與雙脈寬調

變法之直流馬達驅動電路設計」

單晶片 8051 模糊控制的程式撰寫採下列幾個步驟依序完成

1 設定變數轉速誤差〈dspeed〉目前轉速〈sspeed〉

2 模糊化採用三角形歸屬函數採用三角形歸屬函數的原因

〈1〉 三角形函數為一連續函數

〈2〉 三角形函數為線性的函數所以計算速度較快

〈3〉 是具有發散也有收斂的函數和指數函數一樣接近

事實

3 模糊推論模糊規則將其所有可能發生情況以 IFhellipTHENhellip表示

並建立控制規則表

4 解模糊化採用重心法

38

421 歸屬函數

設定變數為目前轉速〈sspeed〉與轉速誤差〈dspeed〉因此此模糊控制器共

有兩個輸入訊號與一輸出訊號輸出訊號為脈寬長度該加或是減多少又因為有

五種不同的轉速因此各分別設計了不同的歸屬函數如下

1 當轉速 = 0

ml h

s s p e e d

d s p e e d

r p m0 5 0 1 0 0- 5 0- 1 0 0

mv l l h v h

r p m0- 3 0- 6 0- 1 0 0 3 0 6 0 1 0 0 圖 42 停止時之歸屬函數

2 正轉〈慢〉

ml hsspeed

dspeed

rpm150 225 300750

mvl l h vh

rpm150100500 200 250 300

圖 43 正轉〈慢〉之歸屬函數

39

3 正轉〈快〉

ml hsspeed

dspeed

rpm520 670 820370220

mvl l h vh

rpm500400300200 600 700 800

圖 44 正轉〈快〉之歸屬函數

4 逆轉〈慢〉

ml hsspeed

dspeed

rpm100 250 400500

mvl l h vh

rpm10050250 200 300 400 圖 45 逆轉〈慢〉之歸屬函數

40

5 逆轉〈快〉

ml hsspeed

dspeed

rpm300 450 600150

mvl l h vh

rpm450350250150 550 650 750

750

圖 46 逆轉〈快〉之歸屬函數

6 輸出

OutputMVL L H VH

rpm0-50-150-250 50 150 250

圖 47 輸出之歸屬函數

41

422 模糊規則庫

表 41 為吾人所設計的模糊控制規則庫並利用 Matlab 之 Fuzzy ToolBox 來

建立此規則庫以進行模擬推論圖 48 為當馬達輸入指令為正轉慢時推論後所得

到的三維空間圖

表 41 模糊控制規則表

Dspeed

vl l m h vh

l H M L VL VL

m VH H M L VL sspeed

h VH VH H M L

圖 48 推論後的三維空間圖

42

423 模糊控制器之軟體設計流程

Start 外部中斷副程式

ADCWR = 0 ADCWR = 1

〈令AD開始轉換〉

檢查鍵值以得到對應的歸屬函數

取得目前轉速與

轉速誤差

Fuzzy Rules決策

得到輸出訊號

Delay 10ms

ADC = 0 讀取AD值 ADCRD = 0

將AD值換算成轉速

ADCWR = 0 ADCWR = 1

〈AD開始轉換〉

返回主程式

致能外部中斷

圖 49 Fuzzy Controller 程式流程圖

當控制器一開始動作時便先執行AD轉換的工作當AD轉換完成時其

INTR的接腳便會觸發8051的外部中斷INTR0於是程式便發生外部中斷執行

外部中斷副程式的指令

43

在外部中斷副程式中AD將ㄧ直進行轉換與讀取的工作同時並將轉換後

的值直接換算成目前轉速與轉速誤差以供模糊控制器使用換算目前encoder

的頻率其公式為

160-V2000 times=頻率 〈4-1〉

式4-1之公式是根據表31所導出來的其中V為encoder之頻率轉成電壓之值

又假設所讀取的AD轉換值為value因為

AD的解析度 = bit256

5V+ = 511 ( Vbit ) 〈4-2〉

故value值與電壓V之關係為

511 value V times= 〈4-3〉

所以encoder之頻率與value值的關係為

頻率= 2000times ⎟⎠⎞

⎜⎝⎛ times

511 value - 160 〈4-4〉

故目前轉速為

sspeed = ( )rpm 60 200

times頻率 〈4-5〉

另ㄧ方面在主程式中程式會先去檢查鍵值也就等於檢查輸入指令以

找出符合使用的歸屬函數並將AD所獲得的轉速對應到歸屬函數中然後執行

決策判斷即進入規則庫中尋找出適當的決策判斷最後將此決策送入PWM程

式裡進行脈寬長度的調整使馬達在合理的要求下達到理想的轉速控制不會

因為外在環境的影響而使馬達轉速受到干擾

43 LCD 顯示轉速

此專題最後再增加一LCD顯示幕以顯示目前的轉速否則在程式設計完成

後人卻因無法以肉眼得知目前轉速而不能肯定馬達轉速是否有達到控制的目

標因此增加一顯示幕LCD是有必要的不僅隨時得知目前的轉速還能知道

44

設計出來的軟體其控制性是否夠好夠穩定

431 LCD 顯示幕之軟體流程

Start

設定LCD模組的初始狀態

設定外部中斷INTR0

與Timer0

設定TH0 = (65536 ndash 5000) 256 TL0 = (65536 ndash 5000)256

令ADCWR = 0 ADCWR = 1 AD開始轉換

等待中斷

外部中斷副程式

ADCRD = 0 讀取AD值 ADCRD = 1

將AD值換算成速度

ADCWR = 0 ADCWR = 1 AD開始轉換

Timer0中斷副程式

顯示LCD第一行

ldquoMotor Speed =

顯示LCD第二行ldquoxxxxxxx rpm其中 xxxxxx為外部中斷副程式所換算出的轉速

重設TH0與TL0

返回主程式返回主程式

圖 410 LCD 顯示幕之程式流程圖

此程式主要由兩個部分完成一為外部中斷副程式另ㄧ為 Timer0 中斷副

程式當主程式完成外部與 Timer0 兩個中斷的設定後隨即命令 AD 開始轉換

之後便一直停在 while〈1〉的迴圈裡不做任何動作而由兩個中斷副程式來完

成整個轉換與顯示的工作

45

外部中斷副程式主要負責 AD 的轉換讀取與轉速換算的工作AD 第一

次的轉換由主程式來下達命令當轉換完成後AD 的 INTR 接腳將觸發外部中

斷〈INTR0〉副程式此時程式便進入外部中斷副程式執行讀取 AD 值與轉速

換算的工作當這些工作完成時外部中斷副程式再次下達 AD 開始轉換的命

令而離開中斷副程式當 AD 再次轉換完成時又將再次執行中斷副程式

如此週而復始中斷副程式將ㄧ直進行讀取換算與轉換的工作

而 Timer0 中斷副程式主要負責 LCD 顯示之工作當主程式所設定的計時時

間計數完時程式便進入 Timer0 中斷副程式一旦進入 Timer0 中斷副程式程

式將執行 LCD 的顯示然後再重設 Timer0 的計數時間Timer0 將重新計數當

計數完時程式又將再度進入 Timer0 中斷副程式執行因為程式中並無清除

Timer0 的中斷致能故 Timer0 中斷副程式和外部中斷副程式ㄧ樣週而復始的

執行其副程式的工作

46

第五章 結論

本計劃主旨為具模糊控制理論與雙脈寬調變法之直流馬達驅動電路設計主

要是針對傳統電路設計之缺點提出改良之方法以TPWM取代PWM電路以模

糊理論基礎設計之控制器替代傳統PID控制器

TPWM轉速控制優於PWM之處在於

1 TPWM只需使用單電源即可達到正轉和逆轉的轉速控制而PWM必須

加上逆向開關或是雙電源才能使馬達產生正轉和逆轉

2 TPWM可控制馬達處於停止狀態無論在正向或逆向加上負載皆無法使

馬達產生轉動

3 馬達消耗定額功率輸出轉矩為額定值

4 馬達由停止到某定轉速時反應時間較快

模糊控制器優於PID控制器

1 不須導出繁雜的數學模型

2 適用於非線性系統

3 強健性與容錯性較高

本專題至此雖說大致的目標都已達到但是此系統仍然有許多不完美而需要

改進的地方例如在實驗過程中發現整個轉速的控制在回授上其反應時間

有點慢探討其原因有可能是控制器之程式上的問題

1 因為使用C語言撰寫程式故其執行速度較慢

2 程式可能寫的太累贅

3 模糊控制規則庫建立不良

若想改善這些問題可以嘗試著將C語言改為組合語言來撰寫並盡量減少

47

不必要的指令相信此動作一定能大大提昇程式的執行速度其次就是多做測

試利用測試中所學到的經驗來幫助模糊控制規則庫的改寫同時也能從測試中

發現更多的問題若是都能對問題加以一一解決的話相信必定能將此控制系統

做的更盡善盡美

48

參考文獻

﹝1﹞ 李適中直流馬達速度控制伺服控制〈基礎篇〉全華科技圖書股份有

限公司民 74

﹝2﹞ 廖錦文ldquo直流電動機之雙脈寬調變是〈TPWM〉驅動電路研究電

子技術月刊第 69 期pp94-1021992

﹝3﹞ 楊英魁孫宗瀛鄭魁香林建德蔣旭堂模糊控制理論與技術全華

科技圖書股份有限公司民 85

﹝4﹞ 林敦煌陳憬德直流馬達定位及轉速的模糊控制逢甲大學自動控制工

程學系學士論文民 87

﹝5﹞ LAZadehldquo Fuzzy Sets Information and Control Vol8 pp338-353

1965

﹝6﹞ EHMamdani and SAsslianldquo A fuzzy logic controller for a dynamic

plant Internation Journal of Man-Machine Studies Vol7 pp1-13 1975

﹝7﹞ 孫宗瀛楊英魁Fuzzy 控制理論實作與應用全華科技圖書股份有

限公司民 83 年

﹝8﹞ 許中平黃煌嘉直流電動機控制電路設計全華科技圖書股份有限公司

民 75

﹝9﹞ 盧明智黃敏祥OP Amp 應用+實驗模擬全華科技圖書股份有限公司

民 83

﹝10﹞陳文耀電動機控制工程復文書局2003

﹝11﹞許中平林全福電動機運轉控制技術全華科技圖書股份有限公司民

77

﹝12﹞楊明豐8051 單晶片 C 語言設計實務碁峯資訊2003 年

﹝13﹞蔡朝洋單晶片微電腦 80518951 原理與應用全華科技圖書股份有限公

司民 91

49

﹝14﹞王文俊認識 Fuzzy全華科技圖書股份有限公司民 90

50

附錄 A 專題硬體展示圖

圖 A-1 硬體整體圖

圖 A-2 硬體整體鳥瞰圖

51

圖 A-3 硬體側視圖

圖 A-4 操作與顯示面板

圖 A-5 間距脈波電路與 FV 電路

52

圖 A-6 橋型驅動功率放大電路

圖 A-7 操作與控制面板

53

附錄 B PWM 與模糊控制之程式

include reg51h include stdioh sbit ADCRD = P3^1 設定 RD 控制線接腳為 P31 sbit ADCWR = P3^3 設定 WR 控制線接腳為 P33 sbit P2_0 = 0xA0 接腳定義 sbit P2_1 = 0xA1 接腳定義 sbit P3_0 = 0xB0 接腳定義 sbit P3_1 = 0xB1 接腳定義 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P3_6 = 0xB6 接腳定義 void KeyStatus(void) 函數原型宣告 void feedback(void) 函數原型宣告 void compute_grade(void) 函數原型宣告 void delay1ms(int count) 函數原型宣告 void convert() 函數原型宣告 void condition() 函數原型宣告 void CW(void) 函數原型宣告 int j i 對應 PWM 的寬度 unsigned int temp 所設計的計時器時間 int sample = 1000 取樣率設定消除顯示值跳動 long int value r1 讀取 ADC0804 數位資料 long int set n condition select long int r grade_reg[2] grade[15] error1 error2 long int a1 b1 I long int membership[5][3]membership1[3][3] 定義歸屬函數 long int membership2[3][3] = -10-50-5050510 long int error[2] int Rule[15][3] = 113213313 定義判斷規則庫 212223323 311232333 411241342 511251351

54

main() 主程式 j = PWM = 110 設定 PWM 初始值 IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x00 設定計時器 0 工作於模式 0 temp=8192-j4 設定計時器 0 初值 TH0 = temp 32 TL0 = temp 32 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 P3_4 = 1 P3_5 = 0 P3_6 = 0 ADCWR = 0 令 ADC0804 的 WR = 0 ADCWR = 1 令 ADC0804 的 WR = 1 while (1) KeyStatus() 檢查鍵值 void KeyStatus(void) 檢查鍵值並給對應的 PWM 值 char KeyScan(void) 按鍵掃描函數宣告 unsigned char KeyStatus unsigned char Key = 0 KeyStatus=KeyScan() 呼叫按鍵掃描函數 if (KeyStatus = 0) 已有按鍵輸入 Key = KeyStatus Key = 鍵值 if (Key == 0x01) 假如輸入為按鍵 1 i = 110 PWM 為 110us j = i P3_4 = 1 LED 亮第一顆〈表馬達停止〉 P3_5 = 0 P3_6 = 0

55

else if (Key == 0x02 ) 假如輸入為按鍵 2 i = 140 PWM 為 140us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x04 ) 假如輸入為按鍵 3 i = 180 PWM 為 180us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x08 ) 假如輸入為按鍵 4 i = 80 PWM 為 80us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 else if (Key == 0x10 ) 假如輸入為按鍵 5 i = 40 PWM 為 40us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 PWM = j delay1ms(10) 呼叫延遲函數 feedback() 模糊控制判斷

56

void To_int(void) interrupt 1 Timer0 中斷函數 if (P3_0 == 0) 假如 PWM 輸出為 Low P3_0 = 1 變更 PWM 輸出為 High temp=8192-j4 設定 High 的時間 else 若 PWM 輸出為 High P3_0 = 0 變更 PWM 輸出為 Low temp=8192-880+j4 設定 Low 的時間 TH0 = temp 32 Timer0 的計時時間 TL0 = temp 32 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 char KeyScan(void) 檢查鍵值 char KeyStatus 按鍵狀態 P0=0xff 設定 P0 為輸入模式 KeyStatus=~P0 讀取按鍵狀態 return(KeyStatus) 將鍵值送回程式 void feedback(void) 模糊判斷 void Fuzzycontroller() 函數原型宣告 void condition1() 函數原型宣告

57

void condition2() 函數原型宣告 error1 = ((value)40-160)03 輸入變數 1 delay10ms(10) 延遲 10ms error2 = ((value)40-160)03 輸入變數 2 if (key == 0x01 ) 當按鍵 1找出對應的歸屬函數 並做出模糊控制判斷

int membership[5][3]= -100-60-30-60-300-30030030603060100

int membership1[3][3]=-100-500-50050050100 Fuzzycontroller() condition() if (key == 0x02 ) 當按鍵 2找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

05010050100150100150200150200250200250300 int membership1[3][3]=07515075150225150225300 Fuzzycontroller() condition() else if (key == 0x04) 當按鍵 3找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

200320400300400500400500600500600700600700800 int membership1[3][3]=220370520370520670520670820 Fuzzycontroller() condition() else if (key == 0x08) 當按鍵 4找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

02550255010050100200100200300200300400 int membership1[3][3]=05010050100250100250400 Fuzzycontroller() condition()

58

else if (key == 0x10) 當按鍵 5找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

150250350250350450350450550450550650550650750 int membership1[3][3]=150300450300450600450600750 Fuzzycontroller() condition2() void Fuzzycontroller() 模糊控制判斷 void compute_grade() 函數原型宣告 void compute_grade1() 函數原型宣告 a1 = 0 b1 = 001 I = 0 for (n=0 nlt=14 n++) r = error1 set = Rule[n][0]-1 compute_grade() 計算輸入變數 1 與

模糊程度的歸屬函數 condition = 1 r = error2 set = Rule[n][1]-1 compute_grade1() 計算輸入變數 2 與 模糊程度的歸屬函數 grade[n] = MIN(grade_reg[0] grade_reg[1]) a1 = a1 + (grade[n]membership2[Rule[n][2]-1][1]) b1 = b1 + grade[n] I = a1 b1 得到模糊控制判斷的結果 void compute_grade() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership[set][0]) || (r gt membership[set][2])) 當輸入變數不在 歸屬函數內

59

grade_reg[condition] = 0 else if ((r gt membership[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership[set][2]-r) (membership[set][2] - membership[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership[set][0]) (membership[set][1] - membership[set][0]) void compute_grade1() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership1[set][0]) || (r gt membership1[set][2])) 當輸入變數不在 歸屬函數內 grade_reg[condition] = 0 else if ((r gt membership1[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership1[set][2]-r) (membership1[set][2]-membership1[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership1[set][0]) (membership1[set][1]-membership1[set][0])

60

void condition() P2_0 = 1 設定 P20 為輸入模式 P2_1 = 1 設定 P21 為輸入模式 if ( (P2_0 == 1) ampamp (P2_1 == 0)) 當馬達為正轉時 if ( I gt 0 ) 若模糊判斷結果為正 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 若模糊判斷結果為零 PWM = PWM + 0 PWM 寬度不變 if ( I lt 0 ) 若模糊控制結果小於零 PWM = PWM + 1 PWM 寬度加 1 else if ( (P2_0 == 0) ampamp (P2_1 == 1) ) 若馬達為反轉 if ( I lt 0 ) 模糊控制小於零 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 模糊控制等於零 PWM = PWM + 0 PWM 寬度不變 if ( I gt 0 ) 模糊控制大於零 PWM = PWM + 1 PWM 寬度加 1 CW() 判斷 PWM 寬度上下限

61

void CW() 判斷 PWM 寬度上下限 if ( PWM gt= 215 ) 若 PWM 寬度 gt= 最大寬度 j = 215 PWM 寬度維持於 215us if ( PWM lt= 5 ) 若 PWM 寬度 lt= 最小寬度 j = 5 PWM 寬度維持在 5us if ( PWM gt 5 ampamp PWM lt 215 ) PWM 寬度介於最大與最小間 j = PWM PWM 依模糊控制判斷結果增減 void delay1ms(int count) 延遲 1ms int x y for ( x = 0 x lt count x++ ) for ( y = 0 y lt 122 y++ ) void convert() 數位資料換算成馬達轉速 r1 = ((value)40)-160

62

附錄 C LCD 顯示之程式

includereg51h 含 8051 所有暫存器宣告 include mathh define RS P3_5 LCD 指令資料選擇控制 define RW P3_4 LCD 讀寫控制腳 define Enable P3_3 LCD 致能接腳 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P0_0 = 0x80 接腳定義 sbit P0_1 = 0x81 接腳定義 sbit P0_2 = 0x82 接腳定義 sbit P0_3 = 0x83 接腳定義 sbit P0_4 = 0x84 接腳定義 sbit P0_5 = 0x85 接腳定義 sbit P0_6 = 0x86 接腳定義 sbit ADCRD = P3^7 設定 RD 控制線接腳為 P37 sbit ADCWR = P3^6 設定 WR 控制線接腳為 P36 void delay(void) 函數原型宣告 void delay10ms(int count) 函數原型宣告 void display(void) 函數原型宣告 void InitialLCD(void) 函數原型宣告 void WriteIns(char) 函數原型宣告 void WriteData(char) 函數原型宣告 void WriteString(charchar) 函數原型宣告 void CheckBusy(void) 函數原型宣告 void convert(void) 函數原型宣告 char MSG0[] = Motor Speed = 定義字串 MSG0 char MSG2[] = rpm 定義字串 MSG2 unsigned char MSG1[8]=0000000 定義字串 MSG1 unsigned long int value 讀取 ADC0804 數位資料 int sample = 1000 取樣率設定消除顯示值跳動 long int rpm

63

main() 主程式 InitialLCD() 初始化 LCD IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x01 設定計時器 0 工作於模式 1 TH0 = (65536-5000)256 設定計時器 0 初值 TL0 = (65536-5000)256 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 while(1) 等待中斷 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 while (--sample == 0) 取樣率減 1 sample = 1000 重設取樣率 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 void T0_int(void) interrupt 1 LCD 顯示動態掃描 display() 動態掃描顯示 TH0 = (65536-65535)256 重設計時初值 TL0 = (65536-65535)256

64

void InitialLCD(void) 設定 LCD 模組初始狀態 delay() 延遲函數 WriteIns(0x38) 設定 LCD 模組為 WriteIns(0x38) 2 行顯示 WriteIns(0x38) 8 位元介面 WriteIns(0x38) 5x7 點字型 WriteIns(0x08) 關閉顯示器 WriteIns(0x01) 清除 LCD 螢幕 WriteIns(0x0c) 令顯示器 ON但游標不顯示 WriteIns(0x06) 令 LCD 模組每接收到 1Byte 資料 AC 值自動加 1 void display() 掃描顯示 WriteIns(0x80) 設定 LCD 座標 WriteString(13MSG0) 將字串 MSG0 寫入 LCD 中 WriteIns(0xc0) 設定 LCD 座標 WriteString(8MSG1) 將字串 MSG1 寫入 LCD 中 WriteIns(0xc8) 設定 LCD 座標 WriteString(4MSG2) 將字串 MSG2 寫入 LCD 中 void convert(void) 換算轉速 long int freq freq = ((value)4000) - 16000 數位資料換成頻率公式 rpm = freq3 頻率換算轉速公式 MSG1[0] = (rpm1000000)+0x30 將結果存入字串 MSG1 中 MSG1[1] = ((rpm1000000)100000)+0x30 MSG1[2] = ((rpm100000)10000)+0x30 MSG1[3] = ((rpm10000)1000)+0x30 MSG1[4] = 0x2e MSG1[5] = ((rpm1000)100)+0x30 MSG1[6] = ((rpm100)10)+0x30 MSG1[7] = rpm10+0x30

65

void WriteIns(char instruction) 寫命令至 LCD 中 RS = 0 選擇指令暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = instruction 輸出命令至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteData(char i) 寫資料至 LCD 中 RS = 1 選擇資料暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = i 輸出資料至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteString(countMSG) 寫字串至 LCD 中 char count 字串長度 char MSG[] 字串資料 char i 定義位元組變數 for(i=0 iltcount i++) count 個位元組 WriteData(MSG[i]) 寫入一位元組的資料至 LCD 中 void CheckBusy(void) char i=0x80 檢查忙碌旗標 while(iamp0x80) 忙錄旗標 BF = 1 RS = 0 選擇指令暫存器 RW = 1 讀取 Enable = 1 致能 LCD i = P2 讀取 LCD 指令暫存器內的資料

66

Enable = 0 除能 LCD delay() 延遲函數 void delay() 延遲 5ms int i for(i=0 ilt250 i++)

  • 畢業專題封面pdf
  • File0004pdf
  • 最終版pdfpdf
Page 38: Based on Fuzzy Control Theorem and TPWM Method for DC ... · 使吾人想設計一模糊控制器來做為馬達轉速的閉迴路控制,以解決非線性系統的 問題。除此之外,flcs

29

34 LM2917 FV 電路設計

對 LM2907 而言磁滯比較器和電流汞是構成頻率對電壓轉換的基本架構

並且預留一個運算放大器及一個電晶體供各種不同的使用圖 315 為吾人所設

計的 FV 電路圖中 C1 用以抑制電流汞動作時所產生的漣波變化正常使用時

此電容應大於 10C若 C1 太大也將造成轉換速度下降

因為單晶片 8051 之輸入電壓最高為 5V故必須設計其馬達最高轉速頻率所

轉成的電壓必須在 5V 以內由於馬達轉速頻率範圍極大故吾人給予 LM2917

+12V 的電壓以擴大它可以轉換的電壓範圍並將所需維持在 5V 內

a1

14

b1

1

a1

13

b1

2

a1

12

b1

3

a1

11

b1

4

1

a1

10

b1

5

a1

8

b1

7

a1

9

b1

6

L2917

Encoder輸 入

1uF

+12V

FV輸出1000pF

45k 10kC1

C2

圖 315 FV 電路

30

《實驗結果》

根據統計結果每 50mV 相對於 100Hz如此一來吾人想得知馬達目前

的轉速只要將單晶片所接收到的電壓值經過換算即可得知目前 encoder 所量測

的頻率吾人知道 encoder 一圈可產生 200 個脈波故馬達的轉速便可經過下列

公式換算得知

轉速〈rpm〉 60200

times=f

其中 =f encoder 所量測到的頻率

表 31 頻率與轉換電壓之關係

頻率

(Hz) 1 2 3 4 5 6 7 8 9

電壓(V) 0006 0006 0007 0008 0009 0009 0009 0009 001

頻率

(Hz) 10 20 30 40 50 60 70 80 90

電壓(V) 008 009 010 010 011 011 012 012 013

頻率

(Hz) 100 200 300 400 500 600 700 800 900

電壓(V) 013 018 023 028 033 038 043 049 054

頻率

(Hz) 1000 2000 3000 4000 5000 6000 7000 8000 9000

電壓(V) 059 109 16 209 257 304 3508 4006 45

31

圖 316 頻率對電壓曲線

35 單晶片介面電路

單晶片介面包括了二大部分分別為單晶片 8051AD converter

〈1〉8051 單晶片

為本控制系統的核心一切動作皆經由它控制

〈2〉AD converter

將類比開關所送出來的類比訊號經由 ADC 0804 轉換成數位訊號傳送

到單晶片的輸入埠

351 AD 轉換

以單晶片 8051 控制 ADC0804則單晶片 8051 必須下達ldquo開始轉換rdquo的命令

給 ADC0804然後 ADC0804 就開始讀入類比輸入端的電壓在內部開始轉換

經過一段轉換時間後〈約 100μ s〉ADC0804 就將轉換完成的值放在其內部的三

態輸出栓鎖緩衝器裡然後將轉換完成輸出腳〈INTR〉降為 low以通知單晶片

可以去讀轉換完成資料

當WR和CS 同時為ldquo0rdquo時表示對 ADC0804 下達ldquo開始轉換rdquo命令再經過

32

一段轉換時間〈100μ s〉後轉換完成ADC0804 會將其轉換完成的數位資料放

在其內部 8 位元緩衝區裡且將 INTR 降為ldquo0rdquo因此單晶片只要下達ldquo開始轉換rdquo

命令後去檢查 INTR 的狀態就可以知道是否轉換完畢其方法有兩種

1 輪詢法〈polling〉

2 中斷法〈interrupt〉

所謂輪詢法就是將 ADC0804 的 INTR接到 CPU 的一條 IO 線上然後以軟體指

令主動偵測其狀態當偵測到為ldquo0rdquo時就可以去讀出 ADC0804 裡的緩衝區的轉

換值

中斷法是一個很理想的 IO 方式因為不像輪詢法必須讓 CPU 等 ADC0804

轉換當 CPU 下達ldquo開始轉換rdquo命令後就可以做其他工作當 ADC0804 轉換完

畢後 INTR會降為ldquo0rdquo可以利用此信號去中斷 CPU再由中斷副程式去讀入

轉換值即可因此大大提高了程式的效率

當 CPU 接收到 ADC0804 發出ldquo轉換完畢rdquo的信號〈 INTR =0〉後就可以去

讀出轉換值其讀出的方法是將CS 與RD設為ldquo0rdquo即可讀到轉換值這個讀值的

動作又會使得 INTR恢復成ldquo1rdquo

1 CPU 下達ldquo開始轉換rdquo命令〈CS =0WR =0〉

2 ADC0804ldquo轉換完畢rdquo 〈 INTR =0〉

3 CPU 讀取轉換值〈 RD =0CS =0〉

4 讀完後 INTR =1

ADC0804 主要規格摘要如下

1 +5V 單電源工作電壓

2 類比電壓輸入範圍 0~+5V

33

3 參考電壓為 25V

4 轉換時間為 100μ s〈 CLKf =640kHz〉

5 解析度為 8 位元

6 誤差plusmn 1LSB

7 讀取時間 135ns

36 電源供應系統

本專題中所有電路及硬體設備所需的電源採用交流電源 110V 經由 PT-31

變壓器後再經過橋式整流後提供了直流電源而因為各個電路所需電源不同

因此製作了多組的變壓電路如下

1電壓源 DC5V選擇了 7805 的穩壓 IC 搭配電容得到了+5V 的電壓源

供〈1〉8051 微處理器 〈2〉ADC 0804 〈3〉74LS8674LS12374LS04

74LS02CD4013 〈4〉馬達 Encoder

2電壓源 DC12V使用 7812 穩壓 IC 搭配電容得到+12V 的電壓源供

LM2917 使用

3電壓源 DC24V利用 7824 的穩壓 IC 搭配電容獲得+24V 的直流電壓

源供電路之橋型驅動功率放大之電晶體使用

Vin1

+12V2

GND3

LM7812

2200uF 10000pF 2200uF 10000pF

+12V outputAC

圖 317 直流電源電路

34

圖 318 直流電源電路實體圖

37 馬達轉速的量測

表 33 PWM 輸出對應 encoder 週期

PWM dutycycle encoder 週期 PWM dutycycle encoder 週期

40 sμ 172 sμ 440 sμ 0 sμ

80 sμ 188 sμ 480 sμ 0 sμ

120 sμ 204 sμ 520 sμ 0 sμ

160 sμ 230 sμ 560 sμ 0 sμ

200 sμ 272 sμ 600 sμ 0 sμ

240 sμ 328 sμ 640 sμ 0 sμ

280 sμ 416 sμ 680 sμ 1320 sμ

320 sμ 540 sμ 720 sμ 750 sμ

360 sμ 800 sμ 760 sμ 510 sμ

400 sμ 1320 sμ 800 sμ 400 sμ

35

圖 319 PWM 輸出對應 encoder 週期

由統計可知道此馬達並不是一顆線性馬達故相信若使用模糊控制理論來

作為其回授控制系統的控制器一定能達到比傳統控制器的性能還要好而且若能

在模糊控制裡加上 PID 控制器的觀念一定能在系統的響應時間上升時間

安定時間和超越量達到最佳的控制另一方面馬達在其反方向的內阻較大需

要更大的力量才能使馬達驅動

36

第四章 軟體規劃與製作

41 PWM 之軟體設計

因為之前所介紹的硬體方式是以調整可變電阻來達到轉速的調整因此無法

得知所給予的脈寬長度和轉速大小尤其在回授時也不易給予適當的訊號來調整

轉速因此改良之方法就是以8051之軟體撰寫方式來產生固定的脈寬也就等

於給予轉速的命令而在其回授控制時也只要在內部程式给予適當的指令便可

達到脈寬長度的調整以達到閉迴路之受控系統

411 PWM 軟體流程

設定Timer0模式為0

TH0 = temp 32 TL0 = temp 32

temp = 8192 ndash j4 Key = 0

檢查是否有鍵值

將鍵值存入Key

Yes

No

設定Key值所對應的 j值

If P30 == 1Then P30 = 0 temp = 8192 ndash j4Else P30 = 1 temp=8192ndash880+j4

TH0 = temp 32 TL0 = temp 32

Start Timer0中斷副程式

啟動Timer0

等待Timer0中斷

返回主程式

圖 41 PWM 軟體設計流程圖

37

在此總共設計了五個按鈕分別代表不同的轉速停止正轉〈慢〉正轉

〈快〉逆轉〈慢〉和逆轉〈快〉使用Timer0是因為8051之計時中斷比延遲程

式來的準確故可以達到準確的計時程式設計理念中並沒有將中斷致能清除

因此Timer0會一直處於計時的狀態程式執行時將一邊檢查鍵值〈KeyStatus〉一

邊進行計時當計時完畢便呼叫中斷副程式然後執行改變Port 30的輸出狀

態若是為high則變為low反之若是為low即變為high同時並重設計時時間

Timer0繼續計時

當鍵值改變時計時的時間也會跟著改變如此一來Timer0將ㄧ直重覆上

述動作直到電源切掉Timer0才會停止計時

42 模糊控制之程式規劃與撰寫

本專題目標在完成了先前所規劃的硬體電路之後接著就是要達成利用模糊

控制理論來設計控制器在此採用了單晶片8051目的是為了以硬體實現方式來

代替電腦模擬期望能夠按照原訂計畫完成本專題「具模糊控制理論與雙脈寬調

變法之直流馬達驅動電路設計」

單晶片 8051 模糊控制的程式撰寫採下列幾個步驟依序完成

1 設定變數轉速誤差〈dspeed〉目前轉速〈sspeed〉

2 模糊化採用三角形歸屬函數採用三角形歸屬函數的原因

〈1〉 三角形函數為一連續函數

〈2〉 三角形函數為線性的函數所以計算速度較快

〈3〉 是具有發散也有收斂的函數和指數函數一樣接近

事實

3 模糊推論模糊規則將其所有可能發生情況以 IFhellipTHENhellip表示

並建立控制規則表

4 解模糊化採用重心法

38

421 歸屬函數

設定變數為目前轉速〈sspeed〉與轉速誤差〈dspeed〉因此此模糊控制器共

有兩個輸入訊號與一輸出訊號輸出訊號為脈寬長度該加或是減多少又因為有

五種不同的轉速因此各分別設計了不同的歸屬函數如下

1 當轉速 = 0

ml h

s s p e e d

d s p e e d

r p m0 5 0 1 0 0- 5 0- 1 0 0

mv l l h v h

r p m0- 3 0- 6 0- 1 0 0 3 0 6 0 1 0 0 圖 42 停止時之歸屬函數

2 正轉〈慢〉

ml hsspeed

dspeed

rpm150 225 300750

mvl l h vh

rpm150100500 200 250 300

圖 43 正轉〈慢〉之歸屬函數

39

3 正轉〈快〉

ml hsspeed

dspeed

rpm520 670 820370220

mvl l h vh

rpm500400300200 600 700 800

圖 44 正轉〈快〉之歸屬函數

4 逆轉〈慢〉

ml hsspeed

dspeed

rpm100 250 400500

mvl l h vh

rpm10050250 200 300 400 圖 45 逆轉〈慢〉之歸屬函數

40

5 逆轉〈快〉

ml hsspeed

dspeed

rpm300 450 600150

mvl l h vh

rpm450350250150 550 650 750

750

圖 46 逆轉〈快〉之歸屬函數

6 輸出

OutputMVL L H VH

rpm0-50-150-250 50 150 250

圖 47 輸出之歸屬函數

41

422 模糊規則庫

表 41 為吾人所設計的模糊控制規則庫並利用 Matlab 之 Fuzzy ToolBox 來

建立此規則庫以進行模擬推論圖 48 為當馬達輸入指令為正轉慢時推論後所得

到的三維空間圖

表 41 模糊控制規則表

Dspeed

vl l m h vh

l H M L VL VL

m VH H M L VL sspeed

h VH VH H M L

圖 48 推論後的三維空間圖

42

423 模糊控制器之軟體設計流程

Start 外部中斷副程式

ADCWR = 0 ADCWR = 1

〈令AD開始轉換〉

檢查鍵值以得到對應的歸屬函數

取得目前轉速與

轉速誤差

Fuzzy Rules決策

得到輸出訊號

Delay 10ms

ADC = 0 讀取AD值 ADCRD = 0

將AD值換算成轉速

ADCWR = 0 ADCWR = 1

〈AD開始轉換〉

返回主程式

致能外部中斷

圖 49 Fuzzy Controller 程式流程圖

當控制器一開始動作時便先執行AD轉換的工作當AD轉換完成時其

INTR的接腳便會觸發8051的外部中斷INTR0於是程式便發生外部中斷執行

外部中斷副程式的指令

43

在外部中斷副程式中AD將ㄧ直進行轉換與讀取的工作同時並將轉換後

的值直接換算成目前轉速與轉速誤差以供模糊控制器使用換算目前encoder

的頻率其公式為

160-V2000 times=頻率 〈4-1〉

式4-1之公式是根據表31所導出來的其中V為encoder之頻率轉成電壓之值

又假設所讀取的AD轉換值為value因為

AD的解析度 = bit256

5V+ = 511 ( Vbit ) 〈4-2〉

故value值與電壓V之關係為

511 value V times= 〈4-3〉

所以encoder之頻率與value值的關係為

頻率= 2000times ⎟⎠⎞

⎜⎝⎛ times

511 value - 160 〈4-4〉

故目前轉速為

sspeed = ( )rpm 60 200

times頻率 〈4-5〉

另ㄧ方面在主程式中程式會先去檢查鍵值也就等於檢查輸入指令以

找出符合使用的歸屬函數並將AD所獲得的轉速對應到歸屬函數中然後執行

決策判斷即進入規則庫中尋找出適當的決策判斷最後將此決策送入PWM程

式裡進行脈寬長度的調整使馬達在合理的要求下達到理想的轉速控制不會

因為外在環境的影響而使馬達轉速受到干擾

43 LCD 顯示轉速

此專題最後再增加一LCD顯示幕以顯示目前的轉速否則在程式設計完成

後人卻因無法以肉眼得知目前轉速而不能肯定馬達轉速是否有達到控制的目

標因此增加一顯示幕LCD是有必要的不僅隨時得知目前的轉速還能知道

44

設計出來的軟體其控制性是否夠好夠穩定

431 LCD 顯示幕之軟體流程

Start

設定LCD模組的初始狀態

設定外部中斷INTR0

與Timer0

設定TH0 = (65536 ndash 5000) 256 TL0 = (65536 ndash 5000)256

令ADCWR = 0 ADCWR = 1 AD開始轉換

等待中斷

外部中斷副程式

ADCRD = 0 讀取AD值 ADCRD = 1

將AD值換算成速度

ADCWR = 0 ADCWR = 1 AD開始轉換

Timer0中斷副程式

顯示LCD第一行

ldquoMotor Speed =

顯示LCD第二行ldquoxxxxxxx rpm其中 xxxxxx為外部中斷副程式所換算出的轉速

重設TH0與TL0

返回主程式返回主程式

圖 410 LCD 顯示幕之程式流程圖

此程式主要由兩個部分完成一為外部中斷副程式另ㄧ為 Timer0 中斷副

程式當主程式完成外部與 Timer0 兩個中斷的設定後隨即命令 AD 開始轉換

之後便一直停在 while〈1〉的迴圈裡不做任何動作而由兩個中斷副程式來完

成整個轉換與顯示的工作

45

外部中斷副程式主要負責 AD 的轉換讀取與轉速換算的工作AD 第一

次的轉換由主程式來下達命令當轉換完成後AD 的 INTR 接腳將觸發外部中

斷〈INTR0〉副程式此時程式便進入外部中斷副程式執行讀取 AD 值與轉速

換算的工作當這些工作完成時外部中斷副程式再次下達 AD 開始轉換的命

令而離開中斷副程式當 AD 再次轉換完成時又將再次執行中斷副程式

如此週而復始中斷副程式將ㄧ直進行讀取換算與轉換的工作

而 Timer0 中斷副程式主要負責 LCD 顯示之工作當主程式所設定的計時時

間計數完時程式便進入 Timer0 中斷副程式一旦進入 Timer0 中斷副程式程

式將執行 LCD 的顯示然後再重設 Timer0 的計數時間Timer0 將重新計數當

計數完時程式又將再度進入 Timer0 中斷副程式執行因為程式中並無清除

Timer0 的中斷致能故 Timer0 中斷副程式和外部中斷副程式ㄧ樣週而復始的

執行其副程式的工作

46

第五章 結論

本計劃主旨為具模糊控制理論與雙脈寬調變法之直流馬達驅動電路設計主

要是針對傳統電路設計之缺點提出改良之方法以TPWM取代PWM電路以模

糊理論基礎設計之控制器替代傳統PID控制器

TPWM轉速控制優於PWM之處在於

1 TPWM只需使用單電源即可達到正轉和逆轉的轉速控制而PWM必須

加上逆向開關或是雙電源才能使馬達產生正轉和逆轉

2 TPWM可控制馬達處於停止狀態無論在正向或逆向加上負載皆無法使

馬達產生轉動

3 馬達消耗定額功率輸出轉矩為額定值

4 馬達由停止到某定轉速時反應時間較快

模糊控制器優於PID控制器

1 不須導出繁雜的數學模型

2 適用於非線性系統

3 強健性與容錯性較高

本專題至此雖說大致的目標都已達到但是此系統仍然有許多不完美而需要

改進的地方例如在實驗過程中發現整個轉速的控制在回授上其反應時間

有點慢探討其原因有可能是控制器之程式上的問題

1 因為使用C語言撰寫程式故其執行速度較慢

2 程式可能寫的太累贅

3 模糊控制規則庫建立不良

若想改善這些問題可以嘗試著將C語言改為組合語言來撰寫並盡量減少

47

不必要的指令相信此動作一定能大大提昇程式的執行速度其次就是多做測

試利用測試中所學到的經驗來幫助模糊控制規則庫的改寫同時也能從測試中

發現更多的問題若是都能對問題加以一一解決的話相信必定能將此控制系統

做的更盡善盡美

48

參考文獻

﹝1﹞ 李適中直流馬達速度控制伺服控制〈基礎篇〉全華科技圖書股份有

限公司民 74

﹝2﹞ 廖錦文ldquo直流電動機之雙脈寬調變是〈TPWM〉驅動電路研究電

子技術月刊第 69 期pp94-1021992

﹝3﹞ 楊英魁孫宗瀛鄭魁香林建德蔣旭堂模糊控制理論與技術全華

科技圖書股份有限公司民 85

﹝4﹞ 林敦煌陳憬德直流馬達定位及轉速的模糊控制逢甲大學自動控制工

程學系學士論文民 87

﹝5﹞ LAZadehldquo Fuzzy Sets Information and Control Vol8 pp338-353

1965

﹝6﹞ EHMamdani and SAsslianldquo A fuzzy logic controller for a dynamic

plant Internation Journal of Man-Machine Studies Vol7 pp1-13 1975

﹝7﹞ 孫宗瀛楊英魁Fuzzy 控制理論實作與應用全華科技圖書股份有

限公司民 83 年

﹝8﹞ 許中平黃煌嘉直流電動機控制電路設計全華科技圖書股份有限公司

民 75

﹝9﹞ 盧明智黃敏祥OP Amp 應用+實驗模擬全華科技圖書股份有限公司

民 83

﹝10﹞陳文耀電動機控制工程復文書局2003

﹝11﹞許中平林全福電動機運轉控制技術全華科技圖書股份有限公司民

77

﹝12﹞楊明豐8051 單晶片 C 語言設計實務碁峯資訊2003 年

﹝13﹞蔡朝洋單晶片微電腦 80518951 原理與應用全華科技圖書股份有限公

司民 91

49

﹝14﹞王文俊認識 Fuzzy全華科技圖書股份有限公司民 90

50

附錄 A 專題硬體展示圖

圖 A-1 硬體整體圖

圖 A-2 硬體整體鳥瞰圖

51

圖 A-3 硬體側視圖

圖 A-4 操作與顯示面板

圖 A-5 間距脈波電路與 FV 電路

52

圖 A-6 橋型驅動功率放大電路

圖 A-7 操作與控制面板

53

附錄 B PWM 與模糊控制之程式

include reg51h include stdioh sbit ADCRD = P3^1 設定 RD 控制線接腳為 P31 sbit ADCWR = P3^3 設定 WR 控制線接腳為 P33 sbit P2_0 = 0xA0 接腳定義 sbit P2_1 = 0xA1 接腳定義 sbit P3_0 = 0xB0 接腳定義 sbit P3_1 = 0xB1 接腳定義 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P3_6 = 0xB6 接腳定義 void KeyStatus(void) 函數原型宣告 void feedback(void) 函數原型宣告 void compute_grade(void) 函數原型宣告 void delay1ms(int count) 函數原型宣告 void convert() 函數原型宣告 void condition() 函數原型宣告 void CW(void) 函數原型宣告 int j i 對應 PWM 的寬度 unsigned int temp 所設計的計時器時間 int sample = 1000 取樣率設定消除顯示值跳動 long int value r1 讀取 ADC0804 數位資料 long int set n condition select long int r grade_reg[2] grade[15] error1 error2 long int a1 b1 I long int membership[5][3]membership1[3][3] 定義歸屬函數 long int membership2[3][3] = -10-50-5050510 long int error[2] int Rule[15][3] = 113213313 定義判斷規則庫 212223323 311232333 411241342 511251351

54

main() 主程式 j = PWM = 110 設定 PWM 初始值 IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x00 設定計時器 0 工作於模式 0 temp=8192-j4 設定計時器 0 初值 TH0 = temp 32 TL0 = temp 32 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 P3_4 = 1 P3_5 = 0 P3_6 = 0 ADCWR = 0 令 ADC0804 的 WR = 0 ADCWR = 1 令 ADC0804 的 WR = 1 while (1) KeyStatus() 檢查鍵值 void KeyStatus(void) 檢查鍵值並給對應的 PWM 值 char KeyScan(void) 按鍵掃描函數宣告 unsigned char KeyStatus unsigned char Key = 0 KeyStatus=KeyScan() 呼叫按鍵掃描函數 if (KeyStatus = 0) 已有按鍵輸入 Key = KeyStatus Key = 鍵值 if (Key == 0x01) 假如輸入為按鍵 1 i = 110 PWM 為 110us j = i P3_4 = 1 LED 亮第一顆〈表馬達停止〉 P3_5 = 0 P3_6 = 0

55

else if (Key == 0x02 ) 假如輸入為按鍵 2 i = 140 PWM 為 140us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x04 ) 假如輸入為按鍵 3 i = 180 PWM 為 180us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x08 ) 假如輸入為按鍵 4 i = 80 PWM 為 80us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 else if (Key == 0x10 ) 假如輸入為按鍵 5 i = 40 PWM 為 40us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 PWM = j delay1ms(10) 呼叫延遲函數 feedback() 模糊控制判斷

56

void To_int(void) interrupt 1 Timer0 中斷函數 if (P3_0 == 0) 假如 PWM 輸出為 Low P3_0 = 1 變更 PWM 輸出為 High temp=8192-j4 設定 High 的時間 else 若 PWM 輸出為 High P3_0 = 0 變更 PWM 輸出為 Low temp=8192-880+j4 設定 Low 的時間 TH0 = temp 32 Timer0 的計時時間 TL0 = temp 32 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 char KeyScan(void) 檢查鍵值 char KeyStatus 按鍵狀態 P0=0xff 設定 P0 為輸入模式 KeyStatus=~P0 讀取按鍵狀態 return(KeyStatus) 將鍵值送回程式 void feedback(void) 模糊判斷 void Fuzzycontroller() 函數原型宣告 void condition1() 函數原型宣告

57

void condition2() 函數原型宣告 error1 = ((value)40-160)03 輸入變數 1 delay10ms(10) 延遲 10ms error2 = ((value)40-160)03 輸入變數 2 if (key == 0x01 ) 當按鍵 1找出對應的歸屬函數 並做出模糊控制判斷

int membership[5][3]= -100-60-30-60-300-30030030603060100

int membership1[3][3]=-100-500-50050050100 Fuzzycontroller() condition() if (key == 0x02 ) 當按鍵 2找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

05010050100150100150200150200250200250300 int membership1[3][3]=07515075150225150225300 Fuzzycontroller() condition() else if (key == 0x04) 當按鍵 3找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

200320400300400500400500600500600700600700800 int membership1[3][3]=220370520370520670520670820 Fuzzycontroller() condition() else if (key == 0x08) 當按鍵 4找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

02550255010050100200100200300200300400 int membership1[3][3]=05010050100250100250400 Fuzzycontroller() condition()

58

else if (key == 0x10) 當按鍵 5找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

150250350250350450350450550450550650550650750 int membership1[3][3]=150300450300450600450600750 Fuzzycontroller() condition2() void Fuzzycontroller() 模糊控制判斷 void compute_grade() 函數原型宣告 void compute_grade1() 函數原型宣告 a1 = 0 b1 = 001 I = 0 for (n=0 nlt=14 n++) r = error1 set = Rule[n][0]-1 compute_grade() 計算輸入變數 1 與

模糊程度的歸屬函數 condition = 1 r = error2 set = Rule[n][1]-1 compute_grade1() 計算輸入變數 2 與 模糊程度的歸屬函數 grade[n] = MIN(grade_reg[0] grade_reg[1]) a1 = a1 + (grade[n]membership2[Rule[n][2]-1][1]) b1 = b1 + grade[n] I = a1 b1 得到模糊控制判斷的結果 void compute_grade() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership[set][0]) || (r gt membership[set][2])) 當輸入變數不在 歸屬函數內

59

grade_reg[condition] = 0 else if ((r gt membership[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership[set][2]-r) (membership[set][2] - membership[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership[set][0]) (membership[set][1] - membership[set][0]) void compute_grade1() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership1[set][0]) || (r gt membership1[set][2])) 當輸入變數不在 歸屬函數內 grade_reg[condition] = 0 else if ((r gt membership1[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership1[set][2]-r) (membership1[set][2]-membership1[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership1[set][0]) (membership1[set][1]-membership1[set][0])

60

void condition() P2_0 = 1 設定 P20 為輸入模式 P2_1 = 1 設定 P21 為輸入模式 if ( (P2_0 == 1) ampamp (P2_1 == 0)) 當馬達為正轉時 if ( I gt 0 ) 若模糊判斷結果為正 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 若模糊判斷結果為零 PWM = PWM + 0 PWM 寬度不變 if ( I lt 0 ) 若模糊控制結果小於零 PWM = PWM + 1 PWM 寬度加 1 else if ( (P2_0 == 0) ampamp (P2_1 == 1) ) 若馬達為反轉 if ( I lt 0 ) 模糊控制小於零 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 模糊控制等於零 PWM = PWM + 0 PWM 寬度不變 if ( I gt 0 ) 模糊控制大於零 PWM = PWM + 1 PWM 寬度加 1 CW() 判斷 PWM 寬度上下限

61

void CW() 判斷 PWM 寬度上下限 if ( PWM gt= 215 ) 若 PWM 寬度 gt= 最大寬度 j = 215 PWM 寬度維持於 215us if ( PWM lt= 5 ) 若 PWM 寬度 lt= 最小寬度 j = 5 PWM 寬度維持在 5us if ( PWM gt 5 ampamp PWM lt 215 ) PWM 寬度介於最大與最小間 j = PWM PWM 依模糊控制判斷結果增減 void delay1ms(int count) 延遲 1ms int x y for ( x = 0 x lt count x++ ) for ( y = 0 y lt 122 y++ ) void convert() 數位資料換算成馬達轉速 r1 = ((value)40)-160

62

附錄 C LCD 顯示之程式

includereg51h 含 8051 所有暫存器宣告 include mathh define RS P3_5 LCD 指令資料選擇控制 define RW P3_4 LCD 讀寫控制腳 define Enable P3_3 LCD 致能接腳 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P0_0 = 0x80 接腳定義 sbit P0_1 = 0x81 接腳定義 sbit P0_2 = 0x82 接腳定義 sbit P0_3 = 0x83 接腳定義 sbit P0_4 = 0x84 接腳定義 sbit P0_5 = 0x85 接腳定義 sbit P0_6 = 0x86 接腳定義 sbit ADCRD = P3^7 設定 RD 控制線接腳為 P37 sbit ADCWR = P3^6 設定 WR 控制線接腳為 P36 void delay(void) 函數原型宣告 void delay10ms(int count) 函數原型宣告 void display(void) 函數原型宣告 void InitialLCD(void) 函數原型宣告 void WriteIns(char) 函數原型宣告 void WriteData(char) 函數原型宣告 void WriteString(charchar) 函數原型宣告 void CheckBusy(void) 函數原型宣告 void convert(void) 函數原型宣告 char MSG0[] = Motor Speed = 定義字串 MSG0 char MSG2[] = rpm 定義字串 MSG2 unsigned char MSG1[8]=0000000 定義字串 MSG1 unsigned long int value 讀取 ADC0804 數位資料 int sample = 1000 取樣率設定消除顯示值跳動 long int rpm

63

main() 主程式 InitialLCD() 初始化 LCD IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x01 設定計時器 0 工作於模式 1 TH0 = (65536-5000)256 設定計時器 0 初值 TL0 = (65536-5000)256 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 while(1) 等待中斷 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 while (--sample == 0) 取樣率減 1 sample = 1000 重設取樣率 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 void T0_int(void) interrupt 1 LCD 顯示動態掃描 display() 動態掃描顯示 TH0 = (65536-65535)256 重設計時初值 TL0 = (65536-65535)256

64

void InitialLCD(void) 設定 LCD 模組初始狀態 delay() 延遲函數 WriteIns(0x38) 設定 LCD 模組為 WriteIns(0x38) 2 行顯示 WriteIns(0x38) 8 位元介面 WriteIns(0x38) 5x7 點字型 WriteIns(0x08) 關閉顯示器 WriteIns(0x01) 清除 LCD 螢幕 WriteIns(0x0c) 令顯示器 ON但游標不顯示 WriteIns(0x06) 令 LCD 模組每接收到 1Byte 資料 AC 值自動加 1 void display() 掃描顯示 WriteIns(0x80) 設定 LCD 座標 WriteString(13MSG0) 將字串 MSG0 寫入 LCD 中 WriteIns(0xc0) 設定 LCD 座標 WriteString(8MSG1) 將字串 MSG1 寫入 LCD 中 WriteIns(0xc8) 設定 LCD 座標 WriteString(4MSG2) 將字串 MSG2 寫入 LCD 中 void convert(void) 換算轉速 long int freq freq = ((value)4000) - 16000 數位資料換成頻率公式 rpm = freq3 頻率換算轉速公式 MSG1[0] = (rpm1000000)+0x30 將結果存入字串 MSG1 中 MSG1[1] = ((rpm1000000)100000)+0x30 MSG1[2] = ((rpm100000)10000)+0x30 MSG1[3] = ((rpm10000)1000)+0x30 MSG1[4] = 0x2e MSG1[5] = ((rpm1000)100)+0x30 MSG1[6] = ((rpm100)10)+0x30 MSG1[7] = rpm10+0x30

65

void WriteIns(char instruction) 寫命令至 LCD 中 RS = 0 選擇指令暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = instruction 輸出命令至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteData(char i) 寫資料至 LCD 中 RS = 1 選擇資料暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = i 輸出資料至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteString(countMSG) 寫字串至 LCD 中 char count 字串長度 char MSG[] 字串資料 char i 定義位元組變數 for(i=0 iltcount i++) count 個位元組 WriteData(MSG[i]) 寫入一位元組的資料至 LCD 中 void CheckBusy(void) char i=0x80 檢查忙碌旗標 while(iamp0x80) 忙錄旗標 BF = 1 RS = 0 選擇指令暫存器 RW = 1 讀取 Enable = 1 致能 LCD i = P2 讀取 LCD 指令暫存器內的資料

66

Enable = 0 除能 LCD delay() 延遲函數 void delay() 延遲 5ms int i for(i=0 ilt250 i++)

  • 畢業專題封面pdf
  • File0004pdf
  • 最終版pdfpdf
Page 39: Based on Fuzzy Control Theorem and TPWM Method for DC ... · 使吾人想設計一模糊控制器來做為馬達轉速的閉迴路控制,以解決非線性系統的 問題。除此之外,flcs

30

《實驗結果》

根據統計結果每 50mV 相對於 100Hz如此一來吾人想得知馬達目前

的轉速只要將單晶片所接收到的電壓值經過換算即可得知目前 encoder 所量測

的頻率吾人知道 encoder 一圈可產生 200 個脈波故馬達的轉速便可經過下列

公式換算得知

轉速〈rpm〉 60200

times=f

其中 =f encoder 所量測到的頻率

表 31 頻率與轉換電壓之關係

頻率

(Hz) 1 2 3 4 5 6 7 8 9

電壓(V) 0006 0006 0007 0008 0009 0009 0009 0009 001

頻率

(Hz) 10 20 30 40 50 60 70 80 90

電壓(V) 008 009 010 010 011 011 012 012 013

頻率

(Hz) 100 200 300 400 500 600 700 800 900

電壓(V) 013 018 023 028 033 038 043 049 054

頻率

(Hz) 1000 2000 3000 4000 5000 6000 7000 8000 9000

電壓(V) 059 109 16 209 257 304 3508 4006 45

31

圖 316 頻率對電壓曲線

35 單晶片介面電路

單晶片介面包括了二大部分分別為單晶片 8051AD converter

〈1〉8051 單晶片

為本控制系統的核心一切動作皆經由它控制

〈2〉AD converter

將類比開關所送出來的類比訊號經由 ADC 0804 轉換成數位訊號傳送

到單晶片的輸入埠

351 AD 轉換

以單晶片 8051 控制 ADC0804則單晶片 8051 必須下達ldquo開始轉換rdquo的命令

給 ADC0804然後 ADC0804 就開始讀入類比輸入端的電壓在內部開始轉換

經過一段轉換時間後〈約 100μ s〉ADC0804 就將轉換完成的值放在其內部的三

態輸出栓鎖緩衝器裡然後將轉換完成輸出腳〈INTR〉降為 low以通知單晶片

可以去讀轉換完成資料

當WR和CS 同時為ldquo0rdquo時表示對 ADC0804 下達ldquo開始轉換rdquo命令再經過

32

一段轉換時間〈100μ s〉後轉換完成ADC0804 會將其轉換完成的數位資料放

在其內部 8 位元緩衝區裡且將 INTR 降為ldquo0rdquo因此單晶片只要下達ldquo開始轉換rdquo

命令後去檢查 INTR 的狀態就可以知道是否轉換完畢其方法有兩種

1 輪詢法〈polling〉

2 中斷法〈interrupt〉

所謂輪詢法就是將 ADC0804 的 INTR接到 CPU 的一條 IO 線上然後以軟體指

令主動偵測其狀態當偵測到為ldquo0rdquo時就可以去讀出 ADC0804 裡的緩衝區的轉

換值

中斷法是一個很理想的 IO 方式因為不像輪詢法必須讓 CPU 等 ADC0804

轉換當 CPU 下達ldquo開始轉換rdquo命令後就可以做其他工作當 ADC0804 轉換完

畢後 INTR會降為ldquo0rdquo可以利用此信號去中斷 CPU再由中斷副程式去讀入

轉換值即可因此大大提高了程式的效率

當 CPU 接收到 ADC0804 發出ldquo轉換完畢rdquo的信號〈 INTR =0〉後就可以去

讀出轉換值其讀出的方法是將CS 與RD設為ldquo0rdquo即可讀到轉換值這個讀值的

動作又會使得 INTR恢復成ldquo1rdquo

1 CPU 下達ldquo開始轉換rdquo命令〈CS =0WR =0〉

2 ADC0804ldquo轉換完畢rdquo 〈 INTR =0〉

3 CPU 讀取轉換值〈 RD =0CS =0〉

4 讀完後 INTR =1

ADC0804 主要規格摘要如下

1 +5V 單電源工作電壓

2 類比電壓輸入範圍 0~+5V

33

3 參考電壓為 25V

4 轉換時間為 100μ s〈 CLKf =640kHz〉

5 解析度為 8 位元

6 誤差plusmn 1LSB

7 讀取時間 135ns

36 電源供應系統

本專題中所有電路及硬體設備所需的電源採用交流電源 110V 經由 PT-31

變壓器後再經過橋式整流後提供了直流電源而因為各個電路所需電源不同

因此製作了多組的變壓電路如下

1電壓源 DC5V選擇了 7805 的穩壓 IC 搭配電容得到了+5V 的電壓源

供〈1〉8051 微處理器 〈2〉ADC 0804 〈3〉74LS8674LS12374LS04

74LS02CD4013 〈4〉馬達 Encoder

2電壓源 DC12V使用 7812 穩壓 IC 搭配電容得到+12V 的電壓源供

LM2917 使用

3電壓源 DC24V利用 7824 的穩壓 IC 搭配電容獲得+24V 的直流電壓

源供電路之橋型驅動功率放大之電晶體使用

Vin1

+12V2

GND3

LM7812

2200uF 10000pF 2200uF 10000pF

+12V outputAC

圖 317 直流電源電路

34

圖 318 直流電源電路實體圖

37 馬達轉速的量測

表 33 PWM 輸出對應 encoder 週期

PWM dutycycle encoder 週期 PWM dutycycle encoder 週期

40 sμ 172 sμ 440 sμ 0 sμ

80 sμ 188 sμ 480 sμ 0 sμ

120 sμ 204 sμ 520 sμ 0 sμ

160 sμ 230 sμ 560 sμ 0 sμ

200 sμ 272 sμ 600 sμ 0 sμ

240 sμ 328 sμ 640 sμ 0 sμ

280 sμ 416 sμ 680 sμ 1320 sμ

320 sμ 540 sμ 720 sμ 750 sμ

360 sμ 800 sμ 760 sμ 510 sμ

400 sμ 1320 sμ 800 sμ 400 sμ

35

圖 319 PWM 輸出對應 encoder 週期

由統計可知道此馬達並不是一顆線性馬達故相信若使用模糊控制理論來

作為其回授控制系統的控制器一定能達到比傳統控制器的性能還要好而且若能

在模糊控制裡加上 PID 控制器的觀念一定能在系統的響應時間上升時間

安定時間和超越量達到最佳的控制另一方面馬達在其反方向的內阻較大需

要更大的力量才能使馬達驅動

36

第四章 軟體規劃與製作

41 PWM 之軟體設計

因為之前所介紹的硬體方式是以調整可變電阻來達到轉速的調整因此無法

得知所給予的脈寬長度和轉速大小尤其在回授時也不易給予適當的訊號來調整

轉速因此改良之方法就是以8051之軟體撰寫方式來產生固定的脈寬也就等

於給予轉速的命令而在其回授控制時也只要在內部程式给予適當的指令便可

達到脈寬長度的調整以達到閉迴路之受控系統

411 PWM 軟體流程

設定Timer0模式為0

TH0 = temp 32 TL0 = temp 32

temp = 8192 ndash j4 Key = 0

檢查是否有鍵值

將鍵值存入Key

Yes

No

設定Key值所對應的 j值

If P30 == 1Then P30 = 0 temp = 8192 ndash j4Else P30 = 1 temp=8192ndash880+j4

TH0 = temp 32 TL0 = temp 32

Start Timer0中斷副程式

啟動Timer0

等待Timer0中斷

返回主程式

圖 41 PWM 軟體設計流程圖

37

在此總共設計了五個按鈕分別代表不同的轉速停止正轉〈慢〉正轉

〈快〉逆轉〈慢〉和逆轉〈快〉使用Timer0是因為8051之計時中斷比延遲程

式來的準確故可以達到準確的計時程式設計理念中並沒有將中斷致能清除

因此Timer0會一直處於計時的狀態程式執行時將一邊檢查鍵值〈KeyStatus〉一

邊進行計時當計時完畢便呼叫中斷副程式然後執行改變Port 30的輸出狀

態若是為high則變為low反之若是為low即變為high同時並重設計時時間

Timer0繼續計時

當鍵值改變時計時的時間也會跟著改變如此一來Timer0將ㄧ直重覆上

述動作直到電源切掉Timer0才會停止計時

42 模糊控制之程式規劃與撰寫

本專題目標在完成了先前所規劃的硬體電路之後接著就是要達成利用模糊

控制理論來設計控制器在此採用了單晶片8051目的是為了以硬體實現方式來

代替電腦模擬期望能夠按照原訂計畫完成本專題「具模糊控制理論與雙脈寬調

變法之直流馬達驅動電路設計」

單晶片 8051 模糊控制的程式撰寫採下列幾個步驟依序完成

1 設定變數轉速誤差〈dspeed〉目前轉速〈sspeed〉

2 模糊化採用三角形歸屬函數採用三角形歸屬函數的原因

〈1〉 三角形函數為一連續函數

〈2〉 三角形函數為線性的函數所以計算速度較快

〈3〉 是具有發散也有收斂的函數和指數函數一樣接近

事實

3 模糊推論模糊規則將其所有可能發生情況以 IFhellipTHENhellip表示

並建立控制規則表

4 解模糊化採用重心法

38

421 歸屬函數

設定變數為目前轉速〈sspeed〉與轉速誤差〈dspeed〉因此此模糊控制器共

有兩個輸入訊號與一輸出訊號輸出訊號為脈寬長度該加或是減多少又因為有

五種不同的轉速因此各分別設計了不同的歸屬函數如下

1 當轉速 = 0

ml h

s s p e e d

d s p e e d

r p m0 5 0 1 0 0- 5 0- 1 0 0

mv l l h v h

r p m0- 3 0- 6 0- 1 0 0 3 0 6 0 1 0 0 圖 42 停止時之歸屬函數

2 正轉〈慢〉

ml hsspeed

dspeed

rpm150 225 300750

mvl l h vh

rpm150100500 200 250 300

圖 43 正轉〈慢〉之歸屬函數

39

3 正轉〈快〉

ml hsspeed

dspeed

rpm520 670 820370220

mvl l h vh

rpm500400300200 600 700 800

圖 44 正轉〈快〉之歸屬函數

4 逆轉〈慢〉

ml hsspeed

dspeed

rpm100 250 400500

mvl l h vh

rpm10050250 200 300 400 圖 45 逆轉〈慢〉之歸屬函數

40

5 逆轉〈快〉

ml hsspeed

dspeed

rpm300 450 600150

mvl l h vh

rpm450350250150 550 650 750

750

圖 46 逆轉〈快〉之歸屬函數

6 輸出

OutputMVL L H VH

rpm0-50-150-250 50 150 250

圖 47 輸出之歸屬函數

41

422 模糊規則庫

表 41 為吾人所設計的模糊控制規則庫並利用 Matlab 之 Fuzzy ToolBox 來

建立此規則庫以進行模擬推論圖 48 為當馬達輸入指令為正轉慢時推論後所得

到的三維空間圖

表 41 模糊控制規則表

Dspeed

vl l m h vh

l H M L VL VL

m VH H M L VL sspeed

h VH VH H M L

圖 48 推論後的三維空間圖

42

423 模糊控制器之軟體設計流程

Start 外部中斷副程式

ADCWR = 0 ADCWR = 1

〈令AD開始轉換〉

檢查鍵值以得到對應的歸屬函數

取得目前轉速與

轉速誤差

Fuzzy Rules決策

得到輸出訊號

Delay 10ms

ADC = 0 讀取AD值 ADCRD = 0

將AD值換算成轉速

ADCWR = 0 ADCWR = 1

〈AD開始轉換〉

返回主程式

致能外部中斷

圖 49 Fuzzy Controller 程式流程圖

當控制器一開始動作時便先執行AD轉換的工作當AD轉換完成時其

INTR的接腳便會觸發8051的外部中斷INTR0於是程式便發生外部中斷執行

外部中斷副程式的指令

43

在外部中斷副程式中AD將ㄧ直進行轉換與讀取的工作同時並將轉換後

的值直接換算成目前轉速與轉速誤差以供模糊控制器使用換算目前encoder

的頻率其公式為

160-V2000 times=頻率 〈4-1〉

式4-1之公式是根據表31所導出來的其中V為encoder之頻率轉成電壓之值

又假設所讀取的AD轉換值為value因為

AD的解析度 = bit256

5V+ = 511 ( Vbit ) 〈4-2〉

故value值與電壓V之關係為

511 value V times= 〈4-3〉

所以encoder之頻率與value值的關係為

頻率= 2000times ⎟⎠⎞

⎜⎝⎛ times

511 value - 160 〈4-4〉

故目前轉速為

sspeed = ( )rpm 60 200

times頻率 〈4-5〉

另ㄧ方面在主程式中程式會先去檢查鍵值也就等於檢查輸入指令以

找出符合使用的歸屬函數並將AD所獲得的轉速對應到歸屬函數中然後執行

決策判斷即進入規則庫中尋找出適當的決策判斷最後將此決策送入PWM程

式裡進行脈寬長度的調整使馬達在合理的要求下達到理想的轉速控制不會

因為外在環境的影響而使馬達轉速受到干擾

43 LCD 顯示轉速

此專題最後再增加一LCD顯示幕以顯示目前的轉速否則在程式設計完成

後人卻因無法以肉眼得知目前轉速而不能肯定馬達轉速是否有達到控制的目

標因此增加一顯示幕LCD是有必要的不僅隨時得知目前的轉速還能知道

44

設計出來的軟體其控制性是否夠好夠穩定

431 LCD 顯示幕之軟體流程

Start

設定LCD模組的初始狀態

設定外部中斷INTR0

與Timer0

設定TH0 = (65536 ndash 5000) 256 TL0 = (65536 ndash 5000)256

令ADCWR = 0 ADCWR = 1 AD開始轉換

等待中斷

外部中斷副程式

ADCRD = 0 讀取AD值 ADCRD = 1

將AD值換算成速度

ADCWR = 0 ADCWR = 1 AD開始轉換

Timer0中斷副程式

顯示LCD第一行

ldquoMotor Speed =

顯示LCD第二行ldquoxxxxxxx rpm其中 xxxxxx為外部中斷副程式所換算出的轉速

重設TH0與TL0

返回主程式返回主程式

圖 410 LCD 顯示幕之程式流程圖

此程式主要由兩個部分完成一為外部中斷副程式另ㄧ為 Timer0 中斷副

程式當主程式完成外部與 Timer0 兩個中斷的設定後隨即命令 AD 開始轉換

之後便一直停在 while〈1〉的迴圈裡不做任何動作而由兩個中斷副程式來完

成整個轉換與顯示的工作

45

外部中斷副程式主要負責 AD 的轉換讀取與轉速換算的工作AD 第一

次的轉換由主程式來下達命令當轉換完成後AD 的 INTR 接腳將觸發外部中

斷〈INTR0〉副程式此時程式便進入外部中斷副程式執行讀取 AD 值與轉速

換算的工作當這些工作完成時外部中斷副程式再次下達 AD 開始轉換的命

令而離開中斷副程式當 AD 再次轉換完成時又將再次執行中斷副程式

如此週而復始中斷副程式將ㄧ直進行讀取換算與轉換的工作

而 Timer0 中斷副程式主要負責 LCD 顯示之工作當主程式所設定的計時時

間計數完時程式便進入 Timer0 中斷副程式一旦進入 Timer0 中斷副程式程

式將執行 LCD 的顯示然後再重設 Timer0 的計數時間Timer0 將重新計數當

計數完時程式又將再度進入 Timer0 中斷副程式執行因為程式中並無清除

Timer0 的中斷致能故 Timer0 中斷副程式和外部中斷副程式ㄧ樣週而復始的

執行其副程式的工作

46

第五章 結論

本計劃主旨為具模糊控制理論與雙脈寬調變法之直流馬達驅動電路設計主

要是針對傳統電路設計之缺點提出改良之方法以TPWM取代PWM電路以模

糊理論基礎設計之控制器替代傳統PID控制器

TPWM轉速控制優於PWM之處在於

1 TPWM只需使用單電源即可達到正轉和逆轉的轉速控制而PWM必須

加上逆向開關或是雙電源才能使馬達產生正轉和逆轉

2 TPWM可控制馬達處於停止狀態無論在正向或逆向加上負載皆無法使

馬達產生轉動

3 馬達消耗定額功率輸出轉矩為額定值

4 馬達由停止到某定轉速時反應時間較快

模糊控制器優於PID控制器

1 不須導出繁雜的數學模型

2 適用於非線性系統

3 強健性與容錯性較高

本專題至此雖說大致的目標都已達到但是此系統仍然有許多不完美而需要

改進的地方例如在實驗過程中發現整個轉速的控制在回授上其反應時間

有點慢探討其原因有可能是控制器之程式上的問題

1 因為使用C語言撰寫程式故其執行速度較慢

2 程式可能寫的太累贅

3 模糊控制規則庫建立不良

若想改善這些問題可以嘗試著將C語言改為組合語言來撰寫並盡量減少

47

不必要的指令相信此動作一定能大大提昇程式的執行速度其次就是多做測

試利用測試中所學到的經驗來幫助模糊控制規則庫的改寫同時也能從測試中

發現更多的問題若是都能對問題加以一一解決的話相信必定能將此控制系統

做的更盡善盡美

48

參考文獻

﹝1﹞ 李適中直流馬達速度控制伺服控制〈基礎篇〉全華科技圖書股份有

限公司民 74

﹝2﹞ 廖錦文ldquo直流電動機之雙脈寬調變是〈TPWM〉驅動電路研究電

子技術月刊第 69 期pp94-1021992

﹝3﹞ 楊英魁孫宗瀛鄭魁香林建德蔣旭堂模糊控制理論與技術全華

科技圖書股份有限公司民 85

﹝4﹞ 林敦煌陳憬德直流馬達定位及轉速的模糊控制逢甲大學自動控制工

程學系學士論文民 87

﹝5﹞ LAZadehldquo Fuzzy Sets Information and Control Vol8 pp338-353

1965

﹝6﹞ EHMamdani and SAsslianldquo A fuzzy logic controller for a dynamic

plant Internation Journal of Man-Machine Studies Vol7 pp1-13 1975

﹝7﹞ 孫宗瀛楊英魁Fuzzy 控制理論實作與應用全華科技圖書股份有

限公司民 83 年

﹝8﹞ 許中平黃煌嘉直流電動機控制電路設計全華科技圖書股份有限公司

民 75

﹝9﹞ 盧明智黃敏祥OP Amp 應用+實驗模擬全華科技圖書股份有限公司

民 83

﹝10﹞陳文耀電動機控制工程復文書局2003

﹝11﹞許中平林全福電動機運轉控制技術全華科技圖書股份有限公司民

77

﹝12﹞楊明豐8051 單晶片 C 語言設計實務碁峯資訊2003 年

﹝13﹞蔡朝洋單晶片微電腦 80518951 原理與應用全華科技圖書股份有限公

司民 91

49

﹝14﹞王文俊認識 Fuzzy全華科技圖書股份有限公司民 90

50

附錄 A 專題硬體展示圖

圖 A-1 硬體整體圖

圖 A-2 硬體整體鳥瞰圖

51

圖 A-3 硬體側視圖

圖 A-4 操作與顯示面板

圖 A-5 間距脈波電路與 FV 電路

52

圖 A-6 橋型驅動功率放大電路

圖 A-7 操作與控制面板

53

附錄 B PWM 與模糊控制之程式

include reg51h include stdioh sbit ADCRD = P3^1 設定 RD 控制線接腳為 P31 sbit ADCWR = P3^3 設定 WR 控制線接腳為 P33 sbit P2_0 = 0xA0 接腳定義 sbit P2_1 = 0xA1 接腳定義 sbit P3_0 = 0xB0 接腳定義 sbit P3_1 = 0xB1 接腳定義 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P3_6 = 0xB6 接腳定義 void KeyStatus(void) 函數原型宣告 void feedback(void) 函數原型宣告 void compute_grade(void) 函數原型宣告 void delay1ms(int count) 函數原型宣告 void convert() 函數原型宣告 void condition() 函數原型宣告 void CW(void) 函數原型宣告 int j i 對應 PWM 的寬度 unsigned int temp 所設計的計時器時間 int sample = 1000 取樣率設定消除顯示值跳動 long int value r1 讀取 ADC0804 數位資料 long int set n condition select long int r grade_reg[2] grade[15] error1 error2 long int a1 b1 I long int membership[5][3]membership1[3][3] 定義歸屬函數 long int membership2[3][3] = -10-50-5050510 long int error[2] int Rule[15][3] = 113213313 定義判斷規則庫 212223323 311232333 411241342 511251351

54

main() 主程式 j = PWM = 110 設定 PWM 初始值 IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x00 設定計時器 0 工作於模式 0 temp=8192-j4 設定計時器 0 初值 TH0 = temp 32 TL0 = temp 32 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 P3_4 = 1 P3_5 = 0 P3_6 = 0 ADCWR = 0 令 ADC0804 的 WR = 0 ADCWR = 1 令 ADC0804 的 WR = 1 while (1) KeyStatus() 檢查鍵值 void KeyStatus(void) 檢查鍵值並給對應的 PWM 值 char KeyScan(void) 按鍵掃描函數宣告 unsigned char KeyStatus unsigned char Key = 0 KeyStatus=KeyScan() 呼叫按鍵掃描函數 if (KeyStatus = 0) 已有按鍵輸入 Key = KeyStatus Key = 鍵值 if (Key == 0x01) 假如輸入為按鍵 1 i = 110 PWM 為 110us j = i P3_4 = 1 LED 亮第一顆〈表馬達停止〉 P3_5 = 0 P3_6 = 0

55

else if (Key == 0x02 ) 假如輸入為按鍵 2 i = 140 PWM 為 140us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x04 ) 假如輸入為按鍵 3 i = 180 PWM 為 180us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x08 ) 假如輸入為按鍵 4 i = 80 PWM 為 80us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 else if (Key == 0x10 ) 假如輸入為按鍵 5 i = 40 PWM 為 40us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 PWM = j delay1ms(10) 呼叫延遲函數 feedback() 模糊控制判斷

56

void To_int(void) interrupt 1 Timer0 中斷函數 if (P3_0 == 0) 假如 PWM 輸出為 Low P3_0 = 1 變更 PWM 輸出為 High temp=8192-j4 設定 High 的時間 else 若 PWM 輸出為 High P3_0 = 0 變更 PWM 輸出為 Low temp=8192-880+j4 設定 Low 的時間 TH0 = temp 32 Timer0 的計時時間 TL0 = temp 32 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 char KeyScan(void) 檢查鍵值 char KeyStatus 按鍵狀態 P0=0xff 設定 P0 為輸入模式 KeyStatus=~P0 讀取按鍵狀態 return(KeyStatus) 將鍵值送回程式 void feedback(void) 模糊判斷 void Fuzzycontroller() 函數原型宣告 void condition1() 函數原型宣告

57

void condition2() 函數原型宣告 error1 = ((value)40-160)03 輸入變數 1 delay10ms(10) 延遲 10ms error2 = ((value)40-160)03 輸入變數 2 if (key == 0x01 ) 當按鍵 1找出對應的歸屬函數 並做出模糊控制判斷

int membership[5][3]= -100-60-30-60-300-30030030603060100

int membership1[3][3]=-100-500-50050050100 Fuzzycontroller() condition() if (key == 0x02 ) 當按鍵 2找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

05010050100150100150200150200250200250300 int membership1[3][3]=07515075150225150225300 Fuzzycontroller() condition() else if (key == 0x04) 當按鍵 3找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

200320400300400500400500600500600700600700800 int membership1[3][3]=220370520370520670520670820 Fuzzycontroller() condition() else if (key == 0x08) 當按鍵 4找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

02550255010050100200100200300200300400 int membership1[3][3]=05010050100250100250400 Fuzzycontroller() condition()

58

else if (key == 0x10) 當按鍵 5找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

150250350250350450350450550450550650550650750 int membership1[3][3]=150300450300450600450600750 Fuzzycontroller() condition2() void Fuzzycontroller() 模糊控制判斷 void compute_grade() 函數原型宣告 void compute_grade1() 函數原型宣告 a1 = 0 b1 = 001 I = 0 for (n=0 nlt=14 n++) r = error1 set = Rule[n][0]-1 compute_grade() 計算輸入變數 1 與

模糊程度的歸屬函數 condition = 1 r = error2 set = Rule[n][1]-1 compute_grade1() 計算輸入變數 2 與 模糊程度的歸屬函數 grade[n] = MIN(grade_reg[0] grade_reg[1]) a1 = a1 + (grade[n]membership2[Rule[n][2]-1][1]) b1 = b1 + grade[n] I = a1 b1 得到模糊控制判斷的結果 void compute_grade() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership[set][0]) || (r gt membership[set][2])) 當輸入變數不在 歸屬函數內

59

grade_reg[condition] = 0 else if ((r gt membership[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership[set][2]-r) (membership[set][2] - membership[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership[set][0]) (membership[set][1] - membership[set][0]) void compute_grade1() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership1[set][0]) || (r gt membership1[set][2])) 當輸入變數不在 歸屬函數內 grade_reg[condition] = 0 else if ((r gt membership1[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership1[set][2]-r) (membership1[set][2]-membership1[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership1[set][0]) (membership1[set][1]-membership1[set][0])

60

void condition() P2_0 = 1 設定 P20 為輸入模式 P2_1 = 1 設定 P21 為輸入模式 if ( (P2_0 == 1) ampamp (P2_1 == 0)) 當馬達為正轉時 if ( I gt 0 ) 若模糊判斷結果為正 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 若模糊判斷結果為零 PWM = PWM + 0 PWM 寬度不變 if ( I lt 0 ) 若模糊控制結果小於零 PWM = PWM + 1 PWM 寬度加 1 else if ( (P2_0 == 0) ampamp (P2_1 == 1) ) 若馬達為反轉 if ( I lt 0 ) 模糊控制小於零 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 模糊控制等於零 PWM = PWM + 0 PWM 寬度不變 if ( I gt 0 ) 模糊控制大於零 PWM = PWM + 1 PWM 寬度加 1 CW() 判斷 PWM 寬度上下限

61

void CW() 判斷 PWM 寬度上下限 if ( PWM gt= 215 ) 若 PWM 寬度 gt= 最大寬度 j = 215 PWM 寬度維持於 215us if ( PWM lt= 5 ) 若 PWM 寬度 lt= 最小寬度 j = 5 PWM 寬度維持在 5us if ( PWM gt 5 ampamp PWM lt 215 ) PWM 寬度介於最大與最小間 j = PWM PWM 依模糊控制判斷結果增減 void delay1ms(int count) 延遲 1ms int x y for ( x = 0 x lt count x++ ) for ( y = 0 y lt 122 y++ ) void convert() 數位資料換算成馬達轉速 r1 = ((value)40)-160

62

附錄 C LCD 顯示之程式

includereg51h 含 8051 所有暫存器宣告 include mathh define RS P3_5 LCD 指令資料選擇控制 define RW P3_4 LCD 讀寫控制腳 define Enable P3_3 LCD 致能接腳 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P0_0 = 0x80 接腳定義 sbit P0_1 = 0x81 接腳定義 sbit P0_2 = 0x82 接腳定義 sbit P0_3 = 0x83 接腳定義 sbit P0_4 = 0x84 接腳定義 sbit P0_5 = 0x85 接腳定義 sbit P0_6 = 0x86 接腳定義 sbit ADCRD = P3^7 設定 RD 控制線接腳為 P37 sbit ADCWR = P3^6 設定 WR 控制線接腳為 P36 void delay(void) 函數原型宣告 void delay10ms(int count) 函數原型宣告 void display(void) 函數原型宣告 void InitialLCD(void) 函數原型宣告 void WriteIns(char) 函數原型宣告 void WriteData(char) 函數原型宣告 void WriteString(charchar) 函數原型宣告 void CheckBusy(void) 函數原型宣告 void convert(void) 函數原型宣告 char MSG0[] = Motor Speed = 定義字串 MSG0 char MSG2[] = rpm 定義字串 MSG2 unsigned char MSG1[8]=0000000 定義字串 MSG1 unsigned long int value 讀取 ADC0804 數位資料 int sample = 1000 取樣率設定消除顯示值跳動 long int rpm

63

main() 主程式 InitialLCD() 初始化 LCD IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x01 設定計時器 0 工作於模式 1 TH0 = (65536-5000)256 設定計時器 0 初值 TL0 = (65536-5000)256 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 while(1) 等待中斷 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 while (--sample == 0) 取樣率減 1 sample = 1000 重設取樣率 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 void T0_int(void) interrupt 1 LCD 顯示動態掃描 display() 動態掃描顯示 TH0 = (65536-65535)256 重設計時初值 TL0 = (65536-65535)256

64

void InitialLCD(void) 設定 LCD 模組初始狀態 delay() 延遲函數 WriteIns(0x38) 設定 LCD 模組為 WriteIns(0x38) 2 行顯示 WriteIns(0x38) 8 位元介面 WriteIns(0x38) 5x7 點字型 WriteIns(0x08) 關閉顯示器 WriteIns(0x01) 清除 LCD 螢幕 WriteIns(0x0c) 令顯示器 ON但游標不顯示 WriteIns(0x06) 令 LCD 模組每接收到 1Byte 資料 AC 值自動加 1 void display() 掃描顯示 WriteIns(0x80) 設定 LCD 座標 WriteString(13MSG0) 將字串 MSG0 寫入 LCD 中 WriteIns(0xc0) 設定 LCD 座標 WriteString(8MSG1) 將字串 MSG1 寫入 LCD 中 WriteIns(0xc8) 設定 LCD 座標 WriteString(4MSG2) 將字串 MSG2 寫入 LCD 中 void convert(void) 換算轉速 long int freq freq = ((value)4000) - 16000 數位資料換成頻率公式 rpm = freq3 頻率換算轉速公式 MSG1[0] = (rpm1000000)+0x30 將結果存入字串 MSG1 中 MSG1[1] = ((rpm1000000)100000)+0x30 MSG1[2] = ((rpm100000)10000)+0x30 MSG1[3] = ((rpm10000)1000)+0x30 MSG1[4] = 0x2e MSG1[5] = ((rpm1000)100)+0x30 MSG1[6] = ((rpm100)10)+0x30 MSG1[7] = rpm10+0x30

65

void WriteIns(char instruction) 寫命令至 LCD 中 RS = 0 選擇指令暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = instruction 輸出命令至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteData(char i) 寫資料至 LCD 中 RS = 1 選擇資料暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = i 輸出資料至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteString(countMSG) 寫字串至 LCD 中 char count 字串長度 char MSG[] 字串資料 char i 定義位元組變數 for(i=0 iltcount i++) count 個位元組 WriteData(MSG[i]) 寫入一位元組的資料至 LCD 中 void CheckBusy(void) char i=0x80 檢查忙碌旗標 while(iamp0x80) 忙錄旗標 BF = 1 RS = 0 選擇指令暫存器 RW = 1 讀取 Enable = 1 致能 LCD i = P2 讀取 LCD 指令暫存器內的資料

66

Enable = 0 除能 LCD delay() 延遲函數 void delay() 延遲 5ms int i for(i=0 ilt250 i++)

  • 畢業專題封面pdf
  • File0004pdf
  • 最終版pdfpdf
Page 40: Based on Fuzzy Control Theorem and TPWM Method for DC ... · 使吾人想設計一模糊控制器來做為馬達轉速的閉迴路控制,以解決非線性系統的 問題。除此之外,flcs

31

圖 316 頻率對電壓曲線

35 單晶片介面電路

單晶片介面包括了二大部分分別為單晶片 8051AD converter

〈1〉8051 單晶片

為本控制系統的核心一切動作皆經由它控制

〈2〉AD converter

將類比開關所送出來的類比訊號經由 ADC 0804 轉換成數位訊號傳送

到單晶片的輸入埠

351 AD 轉換

以單晶片 8051 控制 ADC0804則單晶片 8051 必須下達ldquo開始轉換rdquo的命令

給 ADC0804然後 ADC0804 就開始讀入類比輸入端的電壓在內部開始轉換

經過一段轉換時間後〈約 100μ s〉ADC0804 就將轉換完成的值放在其內部的三

態輸出栓鎖緩衝器裡然後將轉換完成輸出腳〈INTR〉降為 low以通知單晶片

可以去讀轉換完成資料

當WR和CS 同時為ldquo0rdquo時表示對 ADC0804 下達ldquo開始轉換rdquo命令再經過

32

一段轉換時間〈100μ s〉後轉換完成ADC0804 會將其轉換完成的數位資料放

在其內部 8 位元緩衝區裡且將 INTR 降為ldquo0rdquo因此單晶片只要下達ldquo開始轉換rdquo

命令後去檢查 INTR 的狀態就可以知道是否轉換完畢其方法有兩種

1 輪詢法〈polling〉

2 中斷法〈interrupt〉

所謂輪詢法就是將 ADC0804 的 INTR接到 CPU 的一條 IO 線上然後以軟體指

令主動偵測其狀態當偵測到為ldquo0rdquo時就可以去讀出 ADC0804 裡的緩衝區的轉

換值

中斷法是一個很理想的 IO 方式因為不像輪詢法必須讓 CPU 等 ADC0804

轉換當 CPU 下達ldquo開始轉換rdquo命令後就可以做其他工作當 ADC0804 轉換完

畢後 INTR會降為ldquo0rdquo可以利用此信號去中斷 CPU再由中斷副程式去讀入

轉換值即可因此大大提高了程式的效率

當 CPU 接收到 ADC0804 發出ldquo轉換完畢rdquo的信號〈 INTR =0〉後就可以去

讀出轉換值其讀出的方法是將CS 與RD設為ldquo0rdquo即可讀到轉換值這個讀值的

動作又會使得 INTR恢復成ldquo1rdquo

1 CPU 下達ldquo開始轉換rdquo命令〈CS =0WR =0〉

2 ADC0804ldquo轉換完畢rdquo 〈 INTR =0〉

3 CPU 讀取轉換值〈 RD =0CS =0〉

4 讀完後 INTR =1

ADC0804 主要規格摘要如下

1 +5V 單電源工作電壓

2 類比電壓輸入範圍 0~+5V

33

3 參考電壓為 25V

4 轉換時間為 100μ s〈 CLKf =640kHz〉

5 解析度為 8 位元

6 誤差plusmn 1LSB

7 讀取時間 135ns

36 電源供應系統

本專題中所有電路及硬體設備所需的電源採用交流電源 110V 經由 PT-31

變壓器後再經過橋式整流後提供了直流電源而因為各個電路所需電源不同

因此製作了多組的變壓電路如下

1電壓源 DC5V選擇了 7805 的穩壓 IC 搭配電容得到了+5V 的電壓源

供〈1〉8051 微處理器 〈2〉ADC 0804 〈3〉74LS8674LS12374LS04

74LS02CD4013 〈4〉馬達 Encoder

2電壓源 DC12V使用 7812 穩壓 IC 搭配電容得到+12V 的電壓源供

LM2917 使用

3電壓源 DC24V利用 7824 的穩壓 IC 搭配電容獲得+24V 的直流電壓

源供電路之橋型驅動功率放大之電晶體使用

Vin1

+12V2

GND3

LM7812

2200uF 10000pF 2200uF 10000pF

+12V outputAC

圖 317 直流電源電路

34

圖 318 直流電源電路實體圖

37 馬達轉速的量測

表 33 PWM 輸出對應 encoder 週期

PWM dutycycle encoder 週期 PWM dutycycle encoder 週期

40 sμ 172 sμ 440 sμ 0 sμ

80 sμ 188 sμ 480 sμ 0 sμ

120 sμ 204 sμ 520 sμ 0 sμ

160 sμ 230 sμ 560 sμ 0 sμ

200 sμ 272 sμ 600 sμ 0 sμ

240 sμ 328 sμ 640 sμ 0 sμ

280 sμ 416 sμ 680 sμ 1320 sμ

320 sμ 540 sμ 720 sμ 750 sμ

360 sμ 800 sμ 760 sμ 510 sμ

400 sμ 1320 sμ 800 sμ 400 sμ

35

圖 319 PWM 輸出對應 encoder 週期

由統計可知道此馬達並不是一顆線性馬達故相信若使用模糊控制理論來

作為其回授控制系統的控制器一定能達到比傳統控制器的性能還要好而且若能

在模糊控制裡加上 PID 控制器的觀念一定能在系統的響應時間上升時間

安定時間和超越量達到最佳的控制另一方面馬達在其反方向的內阻較大需

要更大的力量才能使馬達驅動

36

第四章 軟體規劃與製作

41 PWM 之軟體設計

因為之前所介紹的硬體方式是以調整可變電阻來達到轉速的調整因此無法

得知所給予的脈寬長度和轉速大小尤其在回授時也不易給予適當的訊號來調整

轉速因此改良之方法就是以8051之軟體撰寫方式來產生固定的脈寬也就等

於給予轉速的命令而在其回授控制時也只要在內部程式给予適當的指令便可

達到脈寬長度的調整以達到閉迴路之受控系統

411 PWM 軟體流程

設定Timer0模式為0

TH0 = temp 32 TL0 = temp 32

temp = 8192 ndash j4 Key = 0

檢查是否有鍵值

將鍵值存入Key

Yes

No

設定Key值所對應的 j值

If P30 == 1Then P30 = 0 temp = 8192 ndash j4Else P30 = 1 temp=8192ndash880+j4

TH0 = temp 32 TL0 = temp 32

Start Timer0中斷副程式

啟動Timer0

等待Timer0中斷

返回主程式

圖 41 PWM 軟體設計流程圖

37

在此總共設計了五個按鈕分別代表不同的轉速停止正轉〈慢〉正轉

〈快〉逆轉〈慢〉和逆轉〈快〉使用Timer0是因為8051之計時中斷比延遲程

式來的準確故可以達到準確的計時程式設計理念中並沒有將中斷致能清除

因此Timer0會一直處於計時的狀態程式執行時將一邊檢查鍵值〈KeyStatus〉一

邊進行計時當計時完畢便呼叫中斷副程式然後執行改變Port 30的輸出狀

態若是為high則變為low反之若是為low即變為high同時並重設計時時間

Timer0繼續計時

當鍵值改變時計時的時間也會跟著改變如此一來Timer0將ㄧ直重覆上

述動作直到電源切掉Timer0才會停止計時

42 模糊控制之程式規劃與撰寫

本專題目標在完成了先前所規劃的硬體電路之後接著就是要達成利用模糊

控制理論來設計控制器在此採用了單晶片8051目的是為了以硬體實現方式來

代替電腦模擬期望能夠按照原訂計畫完成本專題「具模糊控制理論與雙脈寬調

變法之直流馬達驅動電路設計」

單晶片 8051 模糊控制的程式撰寫採下列幾個步驟依序完成

1 設定變數轉速誤差〈dspeed〉目前轉速〈sspeed〉

2 模糊化採用三角形歸屬函數採用三角形歸屬函數的原因

〈1〉 三角形函數為一連續函數

〈2〉 三角形函數為線性的函數所以計算速度較快

〈3〉 是具有發散也有收斂的函數和指數函數一樣接近

事實

3 模糊推論模糊規則將其所有可能發生情況以 IFhellipTHENhellip表示

並建立控制規則表

4 解模糊化採用重心法

38

421 歸屬函數

設定變數為目前轉速〈sspeed〉與轉速誤差〈dspeed〉因此此模糊控制器共

有兩個輸入訊號與一輸出訊號輸出訊號為脈寬長度該加或是減多少又因為有

五種不同的轉速因此各分別設計了不同的歸屬函數如下

1 當轉速 = 0

ml h

s s p e e d

d s p e e d

r p m0 5 0 1 0 0- 5 0- 1 0 0

mv l l h v h

r p m0- 3 0- 6 0- 1 0 0 3 0 6 0 1 0 0 圖 42 停止時之歸屬函數

2 正轉〈慢〉

ml hsspeed

dspeed

rpm150 225 300750

mvl l h vh

rpm150100500 200 250 300

圖 43 正轉〈慢〉之歸屬函數

39

3 正轉〈快〉

ml hsspeed

dspeed

rpm520 670 820370220

mvl l h vh

rpm500400300200 600 700 800

圖 44 正轉〈快〉之歸屬函數

4 逆轉〈慢〉

ml hsspeed

dspeed

rpm100 250 400500

mvl l h vh

rpm10050250 200 300 400 圖 45 逆轉〈慢〉之歸屬函數

40

5 逆轉〈快〉

ml hsspeed

dspeed

rpm300 450 600150

mvl l h vh

rpm450350250150 550 650 750

750

圖 46 逆轉〈快〉之歸屬函數

6 輸出

OutputMVL L H VH

rpm0-50-150-250 50 150 250

圖 47 輸出之歸屬函數

41

422 模糊規則庫

表 41 為吾人所設計的模糊控制規則庫並利用 Matlab 之 Fuzzy ToolBox 來

建立此規則庫以進行模擬推論圖 48 為當馬達輸入指令為正轉慢時推論後所得

到的三維空間圖

表 41 模糊控制規則表

Dspeed

vl l m h vh

l H M L VL VL

m VH H M L VL sspeed

h VH VH H M L

圖 48 推論後的三維空間圖

42

423 模糊控制器之軟體設計流程

Start 外部中斷副程式

ADCWR = 0 ADCWR = 1

〈令AD開始轉換〉

檢查鍵值以得到對應的歸屬函數

取得目前轉速與

轉速誤差

Fuzzy Rules決策

得到輸出訊號

Delay 10ms

ADC = 0 讀取AD值 ADCRD = 0

將AD值換算成轉速

ADCWR = 0 ADCWR = 1

〈AD開始轉換〉

返回主程式

致能外部中斷

圖 49 Fuzzy Controller 程式流程圖

當控制器一開始動作時便先執行AD轉換的工作當AD轉換完成時其

INTR的接腳便會觸發8051的外部中斷INTR0於是程式便發生外部中斷執行

外部中斷副程式的指令

43

在外部中斷副程式中AD將ㄧ直進行轉換與讀取的工作同時並將轉換後

的值直接換算成目前轉速與轉速誤差以供模糊控制器使用換算目前encoder

的頻率其公式為

160-V2000 times=頻率 〈4-1〉

式4-1之公式是根據表31所導出來的其中V為encoder之頻率轉成電壓之值

又假設所讀取的AD轉換值為value因為

AD的解析度 = bit256

5V+ = 511 ( Vbit ) 〈4-2〉

故value值與電壓V之關係為

511 value V times= 〈4-3〉

所以encoder之頻率與value值的關係為

頻率= 2000times ⎟⎠⎞

⎜⎝⎛ times

511 value - 160 〈4-4〉

故目前轉速為

sspeed = ( )rpm 60 200

times頻率 〈4-5〉

另ㄧ方面在主程式中程式會先去檢查鍵值也就等於檢查輸入指令以

找出符合使用的歸屬函數並將AD所獲得的轉速對應到歸屬函數中然後執行

決策判斷即進入規則庫中尋找出適當的決策判斷最後將此決策送入PWM程

式裡進行脈寬長度的調整使馬達在合理的要求下達到理想的轉速控制不會

因為外在環境的影響而使馬達轉速受到干擾

43 LCD 顯示轉速

此專題最後再增加一LCD顯示幕以顯示目前的轉速否則在程式設計完成

後人卻因無法以肉眼得知目前轉速而不能肯定馬達轉速是否有達到控制的目

標因此增加一顯示幕LCD是有必要的不僅隨時得知目前的轉速還能知道

44

設計出來的軟體其控制性是否夠好夠穩定

431 LCD 顯示幕之軟體流程

Start

設定LCD模組的初始狀態

設定外部中斷INTR0

與Timer0

設定TH0 = (65536 ndash 5000) 256 TL0 = (65536 ndash 5000)256

令ADCWR = 0 ADCWR = 1 AD開始轉換

等待中斷

外部中斷副程式

ADCRD = 0 讀取AD值 ADCRD = 1

將AD值換算成速度

ADCWR = 0 ADCWR = 1 AD開始轉換

Timer0中斷副程式

顯示LCD第一行

ldquoMotor Speed =

顯示LCD第二行ldquoxxxxxxx rpm其中 xxxxxx為外部中斷副程式所換算出的轉速

重設TH0與TL0

返回主程式返回主程式

圖 410 LCD 顯示幕之程式流程圖

此程式主要由兩個部分完成一為外部中斷副程式另ㄧ為 Timer0 中斷副

程式當主程式完成外部與 Timer0 兩個中斷的設定後隨即命令 AD 開始轉換

之後便一直停在 while〈1〉的迴圈裡不做任何動作而由兩個中斷副程式來完

成整個轉換與顯示的工作

45

外部中斷副程式主要負責 AD 的轉換讀取與轉速換算的工作AD 第一

次的轉換由主程式來下達命令當轉換完成後AD 的 INTR 接腳將觸發外部中

斷〈INTR0〉副程式此時程式便進入外部中斷副程式執行讀取 AD 值與轉速

換算的工作當這些工作完成時外部中斷副程式再次下達 AD 開始轉換的命

令而離開中斷副程式當 AD 再次轉換完成時又將再次執行中斷副程式

如此週而復始中斷副程式將ㄧ直進行讀取換算與轉換的工作

而 Timer0 中斷副程式主要負責 LCD 顯示之工作當主程式所設定的計時時

間計數完時程式便進入 Timer0 中斷副程式一旦進入 Timer0 中斷副程式程

式將執行 LCD 的顯示然後再重設 Timer0 的計數時間Timer0 將重新計數當

計數完時程式又將再度進入 Timer0 中斷副程式執行因為程式中並無清除

Timer0 的中斷致能故 Timer0 中斷副程式和外部中斷副程式ㄧ樣週而復始的

執行其副程式的工作

46

第五章 結論

本計劃主旨為具模糊控制理論與雙脈寬調變法之直流馬達驅動電路設計主

要是針對傳統電路設計之缺點提出改良之方法以TPWM取代PWM電路以模

糊理論基礎設計之控制器替代傳統PID控制器

TPWM轉速控制優於PWM之處在於

1 TPWM只需使用單電源即可達到正轉和逆轉的轉速控制而PWM必須

加上逆向開關或是雙電源才能使馬達產生正轉和逆轉

2 TPWM可控制馬達處於停止狀態無論在正向或逆向加上負載皆無法使

馬達產生轉動

3 馬達消耗定額功率輸出轉矩為額定值

4 馬達由停止到某定轉速時反應時間較快

模糊控制器優於PID控制器

1 不須導出繁雜的數學模型

2 適用於非線性系統

3 強健性與容錯性較高

本專題至此雖說大致的目標都已達到但是此系統仍然有許多不完美而需要

改進的地方例如在實驗過程中發現整個轉速的控制在回授上其反應時間

有點慢探討其原因有可能是控制器之程式上的問題

1 因為使用C語言撰寫程式故其執行速度較慢

2 程式可能寫的太累贅

3 模糊控制規則庫建立不良

若想改善這些問題可以嘗試著將C語言改為組合語言來撰寫並盡量減少

47

不必要的指令相信此動作一定能大大提昇程式的執行速度其次就是多做測

試利用測試中所學到的經驗來幫助模糊控制規則庫的改寫同時也能從測試中

發現更多的問題若是都能對問題加以一一解決的話相信必定能將此控制系統

做的更盡善盡美

48

參考文獻

﹝1﹞ 李適中直流馬達速度控制伺服控制〈基礎篇〉全華科技圖書股份有

限公司民 74

﹝2﹞ 廖錦文ldquo直流電動機之雙脈寬調變是〈TPWM〉驅動電路研究電

子技術月刊第 69 期pp94-1021992

﹝3﹞ 楊英魁孫宗瀛鄭魁香林建德蔣旭堂模糊控制理論與技術全華

科技圖書股份有限公司民 85

﹝4﹞ 林敦煌陳憬德直流馬達定位及轉速的模糊控制逢甲大學自動控制工

程學系學士論文民 87

﹝5﹞ LAZadehldquo Fuzzy Sets Information and Control Vol8 pp338-353

1965

﹝6﹞ EHMamdani and SAsslianldquo A fuzzy logic controller for a dynamic

plant Internation Journal of Man-Machine Studies Vol7 pp1-13 1975

﹝7﹞ 孫宗瀛楊英魁Fuzzy 控制理論實作與應用全華科技圖書股份有

限公司民 83 年

﹝8﹞ 許中平黃煌嘉直流電動機控制電路設計全華科技圖書股份有限公司

民 75

﹝9﹞ 盧明智黃敏祥OP Amp 應用+實驗模擬全華科技圖書股份有限公司

民 83

﹝10﹞陳文耀電動機控制工程復文書局2003

﹝11﹞許中平林全福電動機運轉控制技術全華科技圖書股份有限公司民

77

﹝12﹞楊明豐8051 單晶片 C 語言設計實務碁峯資訊2003 年

﹝13﹞蔡朝洋單晶片微電腦 80518951 原理與應用全華科技圖書股份有限公

司民 91

49

﹝14﹞王文俊認識 Fuzzy全華科技圖書股份有限公司民 90

50

附錄 A 專題硬體展示圖

圖 A-1 硬體整體圖

圖 A-2 硬體整體鳥瞰圖

51

圖 A-3 硬體側視圖

圖 A-4 操作與顯示面板

圖 A-5 間距脈波電路與 FV 電路

52

圖 A-6 橋型驅動功率放大電路

圖 A-7 操作與控制面板

53

附錄 B PWM 與模糊控制之程式

include reg51h include stdioh sbit ADCRD = P3^1 設定 RD 控制線接腳為 P31 sbit ADCWR = P3^3 設定 WR 控制線接腳為 P33 sbit P2_0 = 0xA0 接腳定義 sbit P2_1 = 0xA1 接腳定義 sbit P3_0 = 0xB0 接腳定義 sbit P3_1 = 0xB1 接腳定義 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P3_6 = 0xB6 接腳定義 void KeyStatus(void) 函數原型宣告 void feedback(void) 函數原型宣告 void compute_grade(void) 函數原型宣告 void delay1ms(int count) 函數原型宣告 void convert() 函數原型宣告 void condition() 函數原型宣告 void CW(void) 函數原型宣告 int j i 對應 PWM 的寬度 unsigned int temp 所設計的計時器時間 int sample = 1000 取樣率設定消除顯示值跳動 long int value r1 讀取 ADC0804 數位資料 long int set n condition select long int r grade_reg[2] grade[15] error1 error2 long int a1 b1 I long int membership[5][3]membership1[3][3] 定義歸屬函數 long int membership2[3][3] = -10-50-5050510 long int error[2] int Rule[15][3] = 113213313 定義判斷規則庫 212223323 311232333 411241342 511251351

54

main() 主程式 j = PWM = 110 設定 PWM 初始值 IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x00 設定計時器 0 工作於模式 0 temp=8192-j4 設定計時器 0 初值 TH0 = temp 32 TL0 = temp 32 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 P3_4 = 1 P3_5 = 0 P3_6 = 0 ADCWR = 0 令 ADC0804 的 WR = 0 ADCWR = 1 令 ADC0804 的 WR = 1 while (1) KeyStatus() 檢查鍵值 void KeyStatus(void) 檢查鍵值並給對應的 PWM 值 char KeyScan(void) 按鍵掃描函數宣告 unsigned char KeyStatus unsigned char Key = 0 KeyStatus=KeyScan() 呼叫按鍵掃描函數 if (KeyStatus = 0) 已有按鍵輸入 Key = KeyStatus Key = 鍵值 if (Key == 0x01) 假如輸入為按鍵 1 i = 110 PWM 為 110us j = i P3_4 = 1 LED 亮第一顆〈表馬達停止〉 P3_5 = 0 P3_6 = 0

55

else if (Key == 0x02 ) 假如輸入為按鍵 2 i = 140 PWM 為 140us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x04 ) 假如輸入為按鍵 3 i = 180 PWM 為 180us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x08 ) 假如輸入為按鍵 4 i = 80 PWM 為 80us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 else if (Key == 0x10 ) 假如輸入為按鍵 5 i = 40 PWM 為 40us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 PWM = j delay1ms(10) 呼叫延遲函數 feedback() 模糊控制判斷

56

void To_int(void) interrupt 1 Timer0 中斷函數 if (P3_0 == 0) 假如 PWM 輸出為 Low P3_0 = 1 變更 PWM 輸出為 High temp=8192-j4 設定 High 的時間 else 若 PWM 輸出為 High P3_0 = 0 變更 PWM 輸出為 Low temp=8192-880+j4 設定 Low 的時間 TH0 = temp 32 Timer0 的計時時間 TL0 = temp 32 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 char KeyScan(void) 檢查鍵值 char KeyStatus 按鍵狀態 P0=0xff 設定 P0 為輸入模式 KeyStatus=~P0 讀取按鍵狀態 return(KeyStatus) 將鍵值送回程式 void feedback(void) 模糊判斷 void Fuzzycontroller() 函數原型宣告 void condition1() 函數原型宣告

57

void condition2() 函數原型宣告 error1 = ((value)40-160)03 輸入變數 1 delay10ms(10) 延遲 10ms error2 = ((value)40-160)03 輸入變數 2 if (key == 0x01 ) 當按鍵 1找出對應的歸屬函數 並做出模糊控制判斷

int membership[5][3]= -100-60-30-60-300-30030030603060100

int membership1[3][3]=-100-500-50050050100 Fuzzycontroller() condition() if (key == 0x02 ) 當按鍵 2找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

05010050100150100150200150200250200250300 int membership1[3][3]=07515075150225150225300 Fuzzycontroller() condition() else if (key == 0x04) 當按鍵 3找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

200320400300400500400500600500600700600700800 int membership1[3][3]=220370520370520670520670820 Fuzzycontroller() condition() else if (key == 0x08) 當按鍵 4找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

02550255010050100200100200300200300400 int membership1[3][3]=05010050100250100250400 Fuzzycontroller() condition()

58

else if (key == 0x10) 當按鍵 5找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

150250350250350450350450550450550650550650750 int membership1[3][3]=150300450300450600450600750 Fuzzycontroller() condition2() void Fuzzycontroller() 模糊控制判斷 void compute_grade() 函數原型宣告 void compute_grade1() 函數原型宣告 a1 = 0 b1 = 001 I = 0 for (n=0 nlt=14 n++) r = error1 set = Rule[n][0]-1 compute_grade() 計算輸入變數 1 與

模糊程度的歸屬函數 condition = 1 r = error2 set = Rule[n][1]-1 compute_grade1() 計算輸入變數 2 與 模糊程度的歸屬函數 grade[n] = MIN(grade_reg[0] grade_reg[1]) a1 = a1 + (grade[n]membership2[Rule[n][2]-1][1]) b1 = b1 + grade[n] I = a1 b1 得到模糊控制判斷的結果 void compute_grade() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership[set][0]) || (r gt membership[set][2])) 當輸入變數不在 歸屬函數內

59

grade_reg[condition] = 0 else if ((r gt membership[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership[set][2]-r) (membership[set][2] - membership[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership[set][0]) (membership[set][1] - membership[set][0]) void compute_grade1() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership1[set][0]) || (r gt membership1[set][2])) 當輸入變數不在 歸屬函數內 grade_reg[condition] = 0 else if ((r gt membership1[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership1[set][2]-r) (membership1[set][2]-membership1[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership1[set][0]) (membership1[set][1]-membership1[set][0])

60

void condition() P2_0 = 1 設定 P20 為輸入模式 P2_1 = 1 設定 P21 為輸入模式 if ( (P2_0 == 1) ampamp (P2_1 == 0)) 當馬達為正轉時 if ( I gt 0 ) 若模糊判斷結果為正 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 若模糊判斷結果為零 PWM = PWM + 0 PWM 寬度不變 if ( I lt 0 ) 若模糊控制結果小於零 PWM = PWM + 1 PWM 寬度加 1 else if ( (P2_0 == 0) ampamp (P2_1 == 1) ) 若馬達為反轉 if ( I lt 0 ) 模糊控制小於零 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 模糊控制等於零 PWM = PWM + 0 PWM 寬度不變 if ( I gt 0 ) 模糊控制大於零 PWM = PWM + 1 PWM 寬度加 1 CW() 判斷 PWM 寬度上下限

61

void CW() 判斷 PWM 寬度上下限 if ( PWM gt= 215 ) 若 PWM 寬度 gt= 最大寬度 j = 215 PWM 寬度維持於 215us if ( PWM lt= 5 ) 若 PWM 寬度 lt= 最小寬度 j = 5 PWM 寬度維持在 5us if ( PWM gt 5 ampamp PWM lt 215 ) PWM 寬度介於最大與最小間 j = PWM PWM 依模糊控制判斷結果增減 void delay1ms(int count) 延遲 1ms int x y for ( x = 0 x lt count x++ ) for ( y = 0 y lt 122 y++ ) void convert() 數位資料換算成馬達轉速 r1 = ((value)40)-160

62

附錄 C LCD 顯示之程式

includereg51h 含 8051 所有暫存器宣告 include mathh define RS P3_5 LCD 指令資料選擇控制 define RW P3_4 LCD 讀寫控制腳 define Enable P3_3 LCD 致能接腳 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P0_0 = 0x80 接腳定義 sbit P0_1 = 0x81 接腳定義 sbit P0_2 = 0x82 接腳定義 sbit P0_3 = 0x83 接腳定義 sbit P0_4 = 0x84 接腳定義 sbit P0_5 = 0x85 接腳定義 sbit P0_6 = 0x86 接腳定義 sbit ADCRD = P3^7 設定 RD 控制線接腳為 P37 sbit ADCWR = P3^6 設定 WR 控制線接腳為 P36 void delay(void) 函數原型宣告 void delay10ms(int count) 函數原型宣告 void display(void) 函數原型宣告 void InitialLCD(void) 函數原型宣告 void WriteIns(char) 函數原型宣告 void WriteData(char) 函數原型宣告 void WriteString(charchar) 函數原型宣告 void CheckBusy(void) 函數原型宣告 void convert(void) 函數原型宣告 char MSG0[] = Motor Speed = 定義字串 MSG0 char MSG2[] = rpm 定義字串 MSG2 unsigned char MSG1[8]=0000000 定義字串 MSG1 unsigned long int value 讀取 ADC0804 數位資料 int sample = 1000 取樣率設定消除顯示值跳動 long int rpm

63

main() 主程式 InitialLCD() 初始化 LCD IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x01 設定計時器 0 工作於模式 1 TH0 = (65536-5000)256 設定計時器 0 初值 TL0 = (65536-5000)256 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 while(1) 等待中斷 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 while (--sample == 0) 取樣率減 1 sample = 1000 重設取樣率 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 void T0_int(void) interrupt 1 LCD 顯示動態掃描 display() 動態掃描顯示 TH0 = (65536-65535)256 重設計時初值 TL0 = (65536-65535)256

64

void InitialLCD(void) 設定 LCD 模組初始狀態 delay() 延遲函數 WriteIns(0x38) 設定 LCD 模組為 WriteIns(0x38) 2 行顯示 WriteIns(0x38) 8 位元介面 WriteIns(0x38) 5x7 點字型 WriteIns(0x08) 關閉顯示器 WriteIns(0x01) 清除 LCD 螢幕 WriteIns(0x0c) 令顯示器 ON但游標不顯示 WriteIns(0x06) 令 LCD 模組每接收到 1Byte 資料 AC 值自動加 1 void display() 掃描顯示 WriteIns(0x80) 設定 LCD 座標 WriteString(13MSG0) 將字串 MSG0 寫入 LCD 中 WriteIns(0xc0) 設定 LCD 座標 WriteString(8MSG1) 將字串 MSG1 寫入 LCD 中 WriteIns(0xc8) 設定 LCD 座標 WriteString(4MSG2) 將字串 MSG2 寫入 LCD 中 void convert(void) 換算轉速 long int freq freq = ((value)4000) - 16000 數位資料換成頻率公式 rpm = freq3 頻率換算轉速公式 MSG1[0] = (rpm1000000)+0x30 將結果存入字串 MSG1 中 MSG1[1] = ((rpm1000000)100000)+0x30 MSG1[2] = ((rpm100000)10000)+0x30 MSG1[3] = ((rpm10000)1000)+0x30 MSG1[4] = 0x2e MSG1[5] = ((rpm1000)100)+0x30 MSG1[6] = ((rpm100)10)+0x30 MSG1[7] = rpm10+0x30

65

void WriteIns(char instruction) 寫命令至 LCD 中 RS = 0 選擇指令暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = instruction 輸出命令至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteData(char i) 寫資料至 LCD 中 RS = 1 選擇資料暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = i 輸出資料至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteString(countMSG) 寫字串至 LCD 中 char count 字串長度 char MSG[] 字串資料 char i 定義位元組變數 for(i=0 iltcount i++) count 個位元組 WriteData(MSG[i]) 寫入一位元組的資料至 LCD 中 void CheckBusy(void) char i=0x80 檢查忙碌旗標 while(iamp0x80) 忙錄旗標 BF = 1 RS = 0 選擇指令暫存器 RW = 1 讀取 Enable = 1 致能 LCD i = P2 讀取 LCD 指令暫存器內的資料

66

Enable = 0 除能 LCD delay() 延遲函數 void delay() 延遲 5ms int i for(i=0 ilt250 i++)

  • 畢業專題封面pdf
  • File0004pdf
  • 最終版pdfpdf
Page 41: Based on Fuzzy Control Theorem and TPWM Method for DC ... · 使吾人想設計一模糊控制器來做為馬達轉速的閉迴路控制,以解決非線性系統的 問題。除此之外,flcs

32

一段轉換時間〈100μ s〉後轉換完成ADC0804 會將其轉換完成的數位資料放

在其內部 8 位元緩衝區裡且將 INTR 降為ldquo0rdquo因此單晶片只要下達ldquo開始轉換rdquo

命令後去檢查 INTR 的狀態就可以知道是否轉換完畢其方法有兩種

1 輪詢法〈polling〉

2 中斷法〈interrupt〉

所謂輪詢法就是將 ADC0804 的 INTR接到 CPU 的一條 IO 線上然後以軟體指

令主動偵測其狀態當偵測到為ldquo0rdquo時就可以去讀出 ADC0804 裡的緩衝區的轉

換值

中斷法是一個很理想的 IO 方式因為不像輪詢法必須讓 CPU 等 ADC0804

轉換當 CPU 下達ldquo開始轉換rdquo命令後就可以做其他工作當 ADC0804 轉換完

畢後 INTR會降為ldquo0rdquo可以利用此信號去中斷 CPU再由中斷副程式去讀入

轉換值即可因此大大提高了程式的效率

當 CPU 接收到 ADC0804 發出ldquo轉換完畢rdquo的信號〈 INTR =0〉後就可以去

讀出轉換值其讀出的方法是將CS 與RD設為ldquo0rdquo即可讀到轉換值這個讀值的

動作又會使得 INTR恢復成ldquo1rdquo

1 CPU 下達ldquo開始轉換rdquo命令〈CS =0WR =0〉

2 ADC0804ldquo轉換完畢rdquo 〈 INTR =0〉

3 CPU 讀取轉換值〈 RD =0CS =0〉

4 讀完後 INTR =1

ADC0804 主要規格摘要如下

1 +5V 單電源工作電壓

2 類比電壓輸入範圍 0~+5V

33

3 參考電壓為 25V

4 轉換時間為 100μ s〈 CLKf =640kHz〉

5 解析度為 8 位元

6 誤差plusmn 1LSB

7 讀取時間 135ns

36 電源供應系統

本專題中所有電路及硬體設備所需的電源採用交流電源 110V 經由 PT-31

變壓器後再經過橋式整流後提供了直流電源而因為各個電路所需電源不同

因此製作了多組的變壓電路如下

1電壓源 DC5V選擇了 7805 的穩壓 IC 搭配電容得到了+5V 的電壓源

供〈1〉8051 微處理器 〈2〉ADC 0804 〈3〉74LS8674LS12374LS04

74LS02CD4013 〈4〉馬達 Encoder

2電壓源 DC12V使用 7812 穩壓 IC 搭配電容得到+12V 的電壓源供

LM2917 使用

3電壓源 DC24V利用 7824 的穩壓 IC 搭配電容獲得+24V 的直流電壓

源供電路之橋型驅動功率放大之電晶體使用

Vin1

+12V2

GND3

LM7812

2200uF 10000pF 2200uF 10000pF

+12V outputAC

圖 317 直流電源電路

34

圖 318 直流電源電路實體圖

37 馬達轉速的量測

表 33 PWM 輸出對應 encoder 週期

PWM dutycycle encoder 週期 PWM dutycycle encoder 週期

40 sμ 172 sμ 440 sμ 0 sμ

80 sμ 188 sμ 480 sμ 0 sμ

120 sμ 204 sμ 520 sμ 0 sμ

160 sμ 230 sμ 560 sμ 0 sμ

200 sμ 272 sμ 600 sμ 0 sμ

240 sμ 328 sμ 640 sμ 0 sμ

280 sμ 416 sμ 680 sμ 1320 sμ

320 sμ 540 sμ 720 sμ 750 sμ

360 sμ 800 sμ 760 sμ 510 sμ

400 sμ 1320 sμ 800 sμ 400 sμ

35

圖 319 PWM 輸出對應 encoder 週期

由統計可知道此馬達並不是一顆線性馬達故相信若使用模糊控制理論來

作為其回授控制系統的控制器一定能達到比傳統控制器的性能還要好而且若能

在模糊控制裡加上 PID 控制器的觀念一定能在系統的響應時間上升時間

安定時間和超越量達到最佳的控制另一方面馬達在其反方向的內阻較大需

要更大的力量才能使馬達驅動

36

第四章 軟體規劃與製作

41 PWM 之軟體設計

因為之前所介紹的硬體方式是以調整可變電阻來達到轉速的調整因此無法

得知所給予的脈寬長度和轉速大小尤其在回授時也不易給予適當的訊號來調整

轉速因此改良之方法就是以8051之軟體撰寫方式來產生固定的脈寬也就等

於給予轉速的命令而在其回授控制時也只要在內部程式给予適當的指令便可

達到脈寬長度的調整以達到閉迴路之受控系統

411 PWM 軟體流程

設定Timer0模式為0

TH0 = temp 32 TL0 = temp 32

temp = 8192 ndash j4 Key = 0

檢查是否有鍵值

將鍵值存入Key

Yes

No

設定Key值所對應的 j值

If P30 == 1Then P30 = 0 temp = 8192 ndash j4Else P30 = 1 temp=8192ndash880+j4

TH0 = temp 32 TL0 = temp 32

Start Timer0中斷副程式

啟動Timer0

等待Timer0中斷

返回主程式

圖 41 PWM 軟體設計流程圖

37

在此總共設計了五個按鈕分別代表不同的轉速停止正轉〈慢〉正轉

〈快〉逆轉〈慢〉和逆轉〈快〉使用Timer0是因為8051之計時中斷比延遲程

式來的準確故可以達到準確的計時程式設計理念中並沒有將中斷致能清除

因此Timer0會一直處於計時的狀態程式執行時將一邊檢查鍵值〈KeyStatus〉一

邊進行計時當計時完畢便呼叫中斷副程式然後執行改變Port 30的輸出狀

態若是為high則變為low反之若是為low即變為high同時並重設計時時間

Timer0繼續計時

當鍵值改變時計時的時間也會跟著改變如此一來Timer0將ㄧ直重覆上

述動作直到電源切掉Timer0才會停止計時

42 模糊控制之程式規劃與撰寫

本專題目標在完成了先前所規劃的硬體電路之後接著就是要達成利用模糊

控制理論來設計控制器在此採用了單晶片8051目的是為了以硬體實現方式來

代替電腦模擬期望能夠按照原訂計畫完成本專題「具模糊控制理論與雙脈寬調

變法之直流馬達驅動電路設計」

單晶片 8051 模糊控制的程式撰寫採下列幾個步驟依序完成

1 設定變數轉速誤差〈dspeed〉目前轉速〈sspeed〉

2 模糊化採用三角形歸屬函數採用三角形歸屬函數的原因

〈1〉 三角形函數為一連續函數

〈2〉 三角形函數為線性的函數所以計算速度較快

〈3〉 是具有發散也有收斂的函數和指數函數一樣接近

事實

3 模糊推論模糊規則將其所有可能發生情況以 IFhellipTHENhellip表示

並建立控制規則表

4 解模糊化採用重心法

38

421 歸屬函數

設定變數為目前轉速〈sspeed〉與轉速誤差〈dspeed〉因此此模糊控制器共

有兩個輸入訊號與一輸出訊號輸出訊號為脈寬長度該加或是減多少又因為有

五種不同的轉速因此各分別設計了不同的歸屬函數如下

1 當轉速 = 0

ml h

s s p e e d

d s p e e d

r p m0 5 0 1 0 0- 5 0- 1 0 0

mv l l h v h

r p m0- 3 0- 6 0- 1 0 0 3 0 6 0 1 0 0 圖 42 停止時之歸屬函數

2 正轉〈慢〉

ml hsspeed

dspeed

rpm150 225 300750

mvl l h vh

rpm150100500 200 250 300

圖 43 正轉〈慢〉之歸屬函數

39

3 正轉〈快〉

ml hsspeed

dspeed

rpm520 670 820370220

mvl l h vh

rpm500400300200 600 700 800

圖 44 正轉〈快〉之歸屬函數

4 逆轉〈慢〉

ml hsspeed

dspeed

rpm100 250 400500

mvl l h vh

rpm10050250 200 300 400 圖 45 逆轉〈慢〉之歸屬函數

40

5 逆轉〈快〉

ml hsspeed

dspeed

rpm300 450 600150

mvl l h vh

rpm450350250150 550 650 750

750

圖 46 逆轉〈快〉之歸屬函數

6 輸出

OutputMVL L H VH

rpm0-50-150-250 50 150 250

圖 47 輸出之歸屬函數

41

422 模糊規則庫

表 41 為吾人所設計的模糊控制規則庫並利用 Matlab 之 Fuzzy ToolBox 來

建立此規則庫以進行模擬推論圖 48 為當馬達輸入指令為正轉慢時推論後所得

到的三維空間圖

表 41 模糊控制規則表

Dspeed

vl l m h vh

l H M L VL VL

m VH H M L VL sspeed

h VH VH H M L

圖 48 推論後的三維空間圖

42

423 模糊控制器之軟體設計流程

Start 外部中斷副程式

ADCWR = 0 ADCWR = 1

〈令AD開始轉換〉

檢查鍵值以得到對應的歸屬函數

取得目前轉速與

轉速誤差

Fuzzy Rules決策

得到輸出訊號

Delay 10ms

ADC = 0 讀取AD值 ADCRD = 0

將AD值換算成轉速

ADCWR = 0 ADCWR = 1

〈AD開始轉換〉

返回主程式

致能外部中斷

圖 49 Fuzzy Controller 程式流程圖

當控制器一開始動作時便先執行AD轉換的工作當AD轉換完成時其

INTR的接腳便會觸發8051的外部中斷INTR0於是程式便發生外部中斷執行

外部中斷副程式的指令

43

在外部中斷副程式中AD將ㄧ直進行轉換與讀取的工作同時並將轉換後

的值直接換算成目前轉速與轉速誤差以供模糊控制器使用換算目前encoder

的頻率其公式為

160-V2000 times=頻率 〈4-1〉

式4-1之公式是根據表31所導出來的其中V為encoder之頻率轉成電壓之值

又假設所讀取的AD轉換值為value因為

AD的解析度 = bit256

5V+ = 511 ( Vbit ) 〈4-2〉

故value值與電壓V之關係為

511 value V times= 〈4-3〉

所以encoder之頻率與value值的關係為

頻率= 2000times ⎟⎠⎞

⎜⎝⎛ times

511 value - 160 〈4-4〉

故目前轉速為

sspeed = ( )rpm 60 200

times頻率 〈4-5〉

另ㄧ方面在主程式中程式會先去檢查鍵值也就等於檢查輸入指令以

找出符合使用的歸屬函數並將AD所獲得的轉速對應到歸屬函數中然後執行

決策判斷即進入規則庫中尋找出適當的決策判斷最後將此決策送入PWM程

式裡進行脈寬長度的調整使馬達在合理的要求下達到理想的轉速控制不會

因為外在環境的影響而使馬達轉速受到干擾

43 LCD 顯示轉速

此專題最後再增加一LCD顯示幕以顯示目前的轉速否則在程式設計完成

後人卻因無法以肉眼得知目前轉速而不能肯定馬達轉速是否有達到控制的目

標因此增加一顯示幕LCD是有必要的不僅隨時得知目前的轉速還能知道

44

設計出來的軟體其控制性是否夠好夠穩定

431 LCD 顯示幕之軟體流程

Start

設定LCD模組的初始狀態

設定外部中斷INTR0

與Timer0

設定TH0 = (65536 ndash 5000) 256 TL0 = (65536 ndash 5000)256

令ADCWR = 0 ADCWR = 1 AD開始轉換

等待中斷

外部中斷副程式

ADCRD = 0 讀取AD值 ADCRD = 1

將AD值換算成速度

ADCWR = 0 ADCWR = 1 AD開始轉換

Timer0中斷副程式

顯示LCD第一行

ldquoMotor Speed =

顯示LCD第二行ldquoxxxxxxx rpm其中 xxxxxx為外部中斷副程式所換算出的轉速

重設TH0與TL0

返回主程式返回主程式

圖 410 LCD 顯示幕之程式流程圖

此程式主要由兩個部分完成一為外部中斷副程式另ㄧ為 Timer0 中斷副

程式當主程式完成外部與 Timer0 兩個中斷的設定後隨即命令 AD 開始轉換

之後便一直停在 while〈1〉的迴圈裡不做任何動作而由兩個中斷副程式來完

成整個轉換與顯示的工作

45

外部中斷副程式主要負責 AD 的轉換讀取與轉速換算的工作AD 第一

次的轉換由主程式來下達命令當轉換完成後AD 的 INTR 接腳將觸發外部中

斷〈INTR0〉副程式此時程式便進入外部中斷副程式執行讀取 AD 值與轉速

換算的工作當這些工作完成時外部中斷副程式再次下達 AD 開始轉換的命

令而離開中斷副程式當 AD 再次轉換完成時又將再次執行中斷副程式

如此週而復始中斷副程式將ㄧ直進行讀取換算與轉換的工作

而 Timer0 中斷副程式主要負責 LCD 顯示之工作當主程式所設定的計時時

間計數完時程式便進入 Timer0 中斷副程式一旦進入 Timer0 中斷副程式程

式將執行 LCD 的顯示然後再重設 Timer0 的計數時間Timer0 將重新計數當

計數完時程式又將再度進入 Timer0 中斷副程式執行因為程式中並無清除

Timer0 的中斷致能故 Timer0 中斷副程式和外部中斷副程式ㄧ樣週而復始的

執行其副程式的工作

46

第五章 結論

本計劃主旨為具模糊控制理論與雙脈寬調變法之直流馬達驅動電路設計主

要是針對傳統電路設計之缺點提出改良之方法以TPWM取代PWM電路以模

糊理論基礎設計之控制器替代傳統PID控制器

TPWM轉速控制優於PWM之處在於

1 TPWM只需使用單電源即可達到正轉和逆轉的轉速控制而PWM必須

加上逆向開關或是雙電源才能使馬達產生正轉和逆轉

2 TPWM可控制馬達處於停止狀態無論在正向或逆向加上負載皆無法使

馬達產生轉動

3 馬達消耗定額功率輸出轉矩為額定值

4 馬達由停止到某定轉速時反應時間較快

模糊控制器優於PID控制器

1 不須導出繁雜的數學模型

2 適用於非線性系統

3 強健性與容錯性較高

本專題至此雖說大致的目標都已達到但是此系統仍然有許多不完美而需要

改進的地方例如在實驗過程中發現整個轉速的控制在回授上其反應時間

有點慢探討其原因有可能是控制器之程式上的問題

1 因為使用C語言撰寫程式故其執行速度較慢

2 程式可能寫的太累贅

3 模糊控制規則庫建立不良

若想改善這些問題可以嘗試著將C語言改為組合語言來撰寫並盡量減少

47

不必要的指令相信此動作一定能大大提昇程式的執行速度其次就是多做測

試利用測試中所學到的經驗來幫助模糊控制規則庫的改寫同時也能從測試中

發現更多的問題若是都能對問題加以一一解決的話相信必定能將此控制系統

做的更盡善盡美

48

參考文獻

﹝1﹞ 李適中直流馬達速度控制伺服控制〈基礎篇〉全華科技圖書股份有

限公司民 74

﹝2﹞ 廖錦文ldquo直流電動機之雙脈寬調變是〈TPWM〉驅動電路研究電

子技術月刊第 69 期pp94-1021992

﹝3﹞ 楊英魁孫宗瀛鄭魁香林建德蔣旭堂模糊控制理論與技術全華

科技圖書股份有限公司民 85

﹝4﹞ 林敦煌陳憬德直流馬達定位及轉速的模糊控制逢甲大學自動控制工

程學系學士論文民 87

﹝5﹞ LAZadehldquo Fuzzy Sets Information and Control Vol8 pp338-353

1965

﹝6﹞ EHMamdani and SAsslianldquo A fuzzy logic controller for a dynamic

plant Internation Journal of Man-Machine Studies Vol7 pp1-13 1975

﹝7﹞ 孫宗瀛楊英魁Fuzzy 控制理論實作與應用全華科技圖書股份有

限公司民 83 年

﹝8﹞ 許中平黃煌嘉直流電動機控制電路設計全華科技圖書股份有限公司

民 75

﹝9﹞ 盧明智黃敏祥OP Amp 應用+實驗模擬全華科技圖書股份有限公司

民 83

﹝10﹞陳文耀電動機控制工程復文書局2003

﹝11﹞許中平林全福電動機運轉控制技術全華科技圖書股份有限公司民

77

﹝12﹞楊明豐8051 單晶片 C 語言設計實務碁峯資訊2003 年

﹝13﹞蔡朝洋單晶片微電腦 80518951 原理與應用全華科技圖書股份有限公

司民 91

49

﹝14﹞王文俊認識 Fuzzy全華科技圖書股份有限公司民 90

50

附錄 A 專題硬體展示圖

圖 A-1 硬體整體圖

圖 A-2 硬體整體鳥瞰圖

51

圖 A-3 硬體側視圖

圖 A-4 操作與顯示面板

圖 A-5 間距脈波電路與 FV 電路

52

圖 A-6 橋型驅動功率放大電路

圖 A-7 操作與控制面板

53

附錄 B PWM 與模糊控制之程式

include reg51h include stdioh sbit ADCRD = P3^1 設定 RD 控制線接腳為 P31 sbit ADCWR = P3^3 設定 WR 控制線接腳為 P33 sbit P2_0 = 0xA0 接腳定義 sbit P2_1 = 0xA1 接腳定義 sbit P3_0 = 0xB0 接腳定義 sbit P3_1 = 0xB1 接腳定義 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P3_6 = 0xB6 接腳定義 void KeyStatus(void) 函數原型宣告 void feedback(void) 函數原型宣告 void compute_grade(void) 函數原型宣告 void delay1ms(int count) 函數原型宣告 void convert() 函數原型宣告 void condition() 函數原型宣告 void CW(void) 函數原型宣告 int j i 對應 PWM 的寬度 unsigned int temp 所設計的計時器時間 int sample = 1000 取樣率設定消除顯示值跳動 long int value r1 讀取 ADC0804 數位資料 long int set n condition select long int r grade_reg[2] grade[15] error1 error2 long int a1 b1 I long int membership[5][3]membership1[3][3] 定義歸屬函數 long int membership2[3][3] = -10-50-5050510 long int error[2] int Rule[15][3] = 113213313 定義判斷規則庫 212223323 311232333 411241342 511251351

54

main() 主程式 j = PWM = 110 設定 PWM 初始值 IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x00 設定計時器 0 工作於模式 0 temp=8192-j4 設定計時器 0 初值 TH0 = temp 32 TL0 = temp 32 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 P3_4 = 1 P3_5 = 0 P3_6 = 0 ADCWR = 0 令 ADC0804 的 WR = 0 ADCWR = 1 令 ADC0804 的 WR = 1 while (1) KeyStatus() 檢查鍵值 void KeyStatus(void) 檢查鍵值並給對應的 PWM 值 char KeyScan(void) 按鍵掃描函數宣告 unsigned char KeyStatus unsigned char Key = 0 KeyStatus=KeyScan() 呼叫按鍵掃描函數 if (KeyStatus = 0) 已有按鍵輸入 Key = KeyStatus Key = 鍵值 if (Key == 0x01) 假如輸入為按鍵 1 i = 110 PWM 為 110us j = i P3_4 = 1 LED 亮第一顆〈表馬達停止〉 P3_5 = 0 P3_6 = 0

55

else if (Key == 0x02 ) 假如輸入為按鍵 2 i = 140 PWM 為 140us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x04 ) 假如輸入為按鍵 3 i = 180 PWM 為 180us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x08 ) 假如輸入為按鍵 4 i = 80 PWM 為 80us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 else if (Key == 0x10 ) 假如輸入為按鍵 5 i = 40 PWM 為 40us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 PWM = j delay1ms(10) 呼叫延遲函數 feedback() 模糊控制判斷

56

void To_int(void) interrupt 1 Timer0 中斷函數 if (P3_0 == 0) 假如 PWM 輸出為 Low P3_0 = 1 變更 PWM 輸出為 High temp=8192-j4 設定 High 的時間 else 若 PWM 輸出為 High P3_0 = 0 變更 PWM 輸出為 Low temp=8192-880+j4 設定 Low 的時間 TH0 = temp 32 Timer0 的計時時間 TL0 = temp 32 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 char KeyScan(void) 檢查鍵值 char KeyStatus 按鍵狀態 P0=0xff 設定 P0 為輸入模式 KeyStatus=~P0 讀取按鍵狀態 return(KeyStatus) 將鍵值送回程式 void feedback(void) 模糊判斷 void Fuzzycontroller() 函數原型宣告 void condition1() 函數原型宣告

57

void condition2() 函數原型宣告 error1 = ((value)40-160)03 輸入變數 1 delay10ms(10) 延遲 10ms error2 = ((value)40-160)03 輸入變數 2 if (key == 0x01 ) 當按鍵 1找出對應的歸屬函數 並做出模糊控制判斷

int membership[5][3]= -100-60-30-60-300-30030030603060100

int membership1[3][3]=-100-500-50050050100 Fuzzycontroller() condition() if (key == 0x02 ) 當按鍵 2找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

05010050100150100150200150200250200250300 int membership1[3][3]=07515075150225150225300 Fuzzycontroller() condition() else if (key == 0x04) 當按鍵 3找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

200320400300400500400500600500600700600700800 int membership1[3][3]=220370520370520670520670820 Fuzzycontroller() condition() else if (key == 0x08) 當按鍵 4找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

02550255010050100200100200300200300400 int membership1[3][3]=05010050100250100250400 Fuzzycontroller() condition()

58

else if (key == 0x10) 當按鍵 5找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

150250350250350450350450550450550650550650750 int membership1[3][3]=150300450300450600450600750 Fuzzycontroller() condition2() void Fuzzycontroller() 模糊控制判斷 void compute_grade() 函數原型宣告 void compute_grade1() 函數原型宣告 a1 = 0 b1 = 001 I = 0 for (n=0 nlt=14 n++) r = error1 set = Rule[n][0]-1 compute_grade() 計算輸入變數 1 與

模糊程度的歸屬函數 condition = 1 r = error2 set = Rule[n][1]-1 compute_grade1() 計算輸入變數 2 與 模糊程度的歸屬函數 grade[n] = MIN(grade_reg[0] grade_reg[1]) a1 = a1 + (grade[n]membership2[Rule[n][2]-1][1]) b1 = b1 + grade[n] I = a1 b1 得到模糊控制判斷的結果 void compute_grade() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership[set][0]) || (r gt membership[set][2])) 當輸入變數不在 歸屬函數內

59

grade_reg[condition] = 0 else if ((r gt membership[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership[set][2]-r) (membership[set][2] - membership[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership[set][0]) (membership[set][1] - membership[set][0]) void compute_grade1() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership1[set][0]) || (r gt membership1[set][2])) 當輸入變數不在 歸屬函數內 grade_reg[condition] = 0 else if ((r gt membership1[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership1[set][2]-r) (membership1[set][2]-membership1[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership1[set][0]) (membership1[set][1]-membership1[set][0])

60

void condition() P2_0 = 1 設定 P20 為輸入模式 P2_1 = 1 設定 P21 為輸入模式 if ( (P2_0 == 1) ampamp (P2_1 == 0)) 當馬達為正轉時 if ( I gt 0 ) 若模糊判斷結果為正 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 若模糊判斷結果為零 PWM = PWM + 0 PWM 寬度不變 if ( I lt 0 ) 若模糊控制結果小於零 PWM = PWM + 1 PWM 寬度加 1 else if ( (P2_0 == 0) ampamp (P2_1 == 1) ) 若馬達為反轉 if ( I lt 0 ) 模糊控制小於零 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 模糊控制等於零 PWM = PWM + 0 PWM 寬度不變 if ( I gt 0 ) 模糊控制大於零 PWM = PWM + 1 PWM 寬度加 1 CW() 判斷 PWM 寬度上下限

61

void CW() 判斷 PWM 寬度上下限 if ( PWM gt= 215 ) 若 PWM 寬度 gt= 最大寬度 j = 215 PWM 寬度維持於 215us if ( PWM lt= 5 ) 若 PWM 寬度 lt= 最小寬度 j = 5 PWM 寬度維持在 5us if ( PWM gt 5 ampamp PWM lt 215 ) PWM 寬度介於最大與最小間 j = PWM PWM 依模糊控制判斷結果增減 void delay1ms(int count) 延遲 1ms int x y for ( x = 0 x lt count x++ ) for ( y = 0 y lt 122 y++ ) void convert() 數位資料換算成馬達轉速 r1 = ((value)40)-160

62

附錄 C LCD 顯示之程式

includereg51h 含 8051 所有暫存器宣告 include mathh define RS P3_5 LCD 指令資料選擇控制 define RW P3_4 LCD 讀寫控制腳 define Enable P3_3 LCD 致能接腳 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P0_0 = 0x80 接腳定義 sbit P0_1 = 0x81 接腳定義 sbit P0_2 = 0x82 接腳定義 sbit P0_3 = 0x83 接腳定義 sbit P0_4 = 0x84 接腳定義 sbit P0_5 = 0x85 接腳定義 sbit P0_6 = 0x86 接腳定義 sbit ADCRD = P3^7 設定 RD 控制線接腳為 P37 sbit ADCWR = P3^6 設定 WR 控制線接腳為 P36 void delay(void) 函數原型宣告 void delay10ms(int count) 函數原型宣告 void display(void) 函數原型宣告 void InitialLCD(void) 函數原型宣告 void WriteIns(char) 函數原型宣告 void WriteData(char) 函數原型宣告 void WriteString(charchar) 函數原型宣告 void CheckBusy(void) 函數原型宣告 void convert(void) 函數原型宣告 char MSG0[] = Motor Speed = 定義字串 MSG0 char MSG2[] = rpm 定義字串 MSG2 unsigned char MSG1[8]=0000000 定義字串 MSG1 unsigned long int value 讀取 ADC0804 數位資料 int sample = 1000 取樣率設定消除顯示值跳動 long int rpm

63

main() 主程式 InitialLCD() 初始化 LCD IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x01 設定計時器 0 工作於模式 1 TH0 = (65536-5000)256 設定計時器 0 初值 TL0 = (65536-5000)256 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 while(1) 等待中斷 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 while (--sample == 0) 取樣率減 1 sample = 1000 重設取樣率 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 void T0_int(void) interrupt 1 LCD 顯示動態掃描 display() 動態掃描顯示 TH0 = (65536-65535)256 重設計時初值 TL0 = (65536-65535)256

64

void InitialLCD(void) 設定 LCD 模組初始狀態 delay() 延遲函數 WriteIns(0x38) 設定 LCD 模組為 WriteIns(0x38) 2 行顯示 WriteIns(0x38) 8 位元介面 WriteIns(0x38) 5x7 點字型 WriteIns(0x08) 關閉顯示器 WriteIns(0x01) 清除 LCD 螢幕 WriteIns(0x0c) 令顯示器 ON但游標不顯示 WriteIns(0x06) 令 LCD 模組每接收到 1Byte 資料 AC 值自動加 1 void display() 掃描顯示 WriteIns(0x80) 設定 LCD 座標 WriteString(13MSG0) 將字串 MSG0 寫入 LCD 中 WriteIns(0xc0) 設定 LCD 座標 WriteString(8MSG1) 將字串 MSG1 寫入 LCD 中 WriteIns(0xc8) 設定 LCD 座標 WriteString(4MSG2) 將字串 MSG2 寫入 LCD 中 void convert(void) 換算轉速 long int freq freq = ((value)4000) - 16000 數位資料換成頻率公式 rpm = freq3 頻率換算轉速公式 MSG1[0] = (rpm1000000)+0x30 將結果存入字串 MSG1 中 MSG1[1] = ((rpm1000000)100000)+0x30 MSG1[2] = ((rpm100000)10000)+0x30 MSG1[3] = ((rpm10000)1000)+0x30 MSG1[4] = 0x2e MSG1[5] = ((rpm1000)100)+0x30 MSG1[6] = ((rpm100)10)+0x30 MSG1[7] = rpm10+0x30

65

void WriteIns(char instruction) 寫命令至 LCD 中 RS = 0 選擇指令暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = instruction 輸出命令至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteData(char i) 寫資料至 LCD 中 RS = 1 選擇資料暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = i 輸出資料至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteString(countMSG) 寫字串至 LCD 中 char count 字串長度 char MSG[] 字串資料 char i 定義位元組變數 for(i=0 iltcount i++) count 個位元組 WriteData(MSG[i]) 寫入一位元組的資料至 LCD 中 void CheckBusy(void) char i=0x80 檢查忙碌旗標 while(iamp0x80) 忙錄旗標 BF = 1 RS = 0 選擇指令暫存器 RW = 1 讀取 Enable = 1 致能 LCD i = P2 讀取 LCD 指令暫存器內的資料

66

Enable = 0 除能 LCD delay() 延遲函數 void delay() 延遲 5ms int i for(i=0 ilt250 i++)

  • 畢業專題封面pdf
  • File0004pdf
  • 最終版pdfpdf
Page 42: Based on Fuzzy Control Theorem and TPWM Method for DC ... · 使吾人想設計一模糊控制器來做為馬達轉速的閉迴路控制,以解決非線性系統的 問題。除此之外,flcs

33

3 參考電壓為 25V

4 轉換時間為 100μ s〈 CLKf =640kHz〉

5 解析度為 8 位元

6 誤差plusmn 1LSB

7 讀取時間 135ns

36 電源供應系統

本專題中所有電路及硬體設備所需的電源採用交流電源 110V 經由 PT-31

變壓器後再經過橋式整流後提供了直流電源而因為各個電路所需電源不同

因此製作了多組的變壓電路如下

1電壓源 DC5V選擇了 7805 的穩壓 IC 搭配電容得到了+5V 的電壓源

供〈1〉8051 微處理器 〈2〉ADC 0804 〈3〉74LS8674LS12374LS04

74LS02CD4013 〈4〉馬達 Encoder

2電壓源 DC12V使用 7812 穩壓 IC 搭配電容得到+12V 的電壓源供

LM2917 使用

3電壓源 DC24V利用 7824 的穩壓 IC 搭配電容獲得+24V 的直流電壓

源供電路之橋型驅動功率放大之電晶體使用

Vin1

+12V2

GND3

LM7812

2200uF 10000pF 2200uF 10000pF

+12V outputAC

圖 317 直流電源電路

34

圖 318 直流電源電路實體圖

37 馬達轉速的量測

表 33 PWM 輸出對應 encoder 週期

PWM dutycycle encoder 週期 PWM dutycycle encoder 週期

40 sμ 172 sμ 440 sμ 0 sμ

80 sμ 188 sμ 480 sμ 0 sμ

120 sμ 204 sμ 520 sμ 0 sμ

160 sμ 230 sμ 560 sμ 0 sμ

200 sμ 272 sμ 600 sμ 0 sμ

240 sμ 328 sμ 640 sμ 0 sμ

280 sμ 416 sμ 680 sμ 1320 sμ

320 sμ 540 sμ 720 sμ 750 sμ

360 sμ 800 sμ 760 sμ 510 sμ

400 sμ 1320 sμ 800 sμ 400 sμ

35

圖 319 PWM 輸出對應 encoder 週期

由統計可知道此馬達並不是一顆線性馬達故相信若使用模糊控制理論來

作為其回授控制系統的控制器一定能達到比傳統控制器的性能還要好而且若能

在模糊控制裡加上 PID 控制器的觀念一定能在系統的響應時間上升時間

安定時間和超越量達到最佳的控制另一方面馬達在其反方向的內阻較大需

要更大的力量才能使馬達驅動

36

第四章 軟體規劃與製作

41 PWM 之軟體設計

因為之前所介紹的硬體方式是以調整可變電阻來達到轉速的調整因此無法

得知所給予的脈寬長度和轉速大小尤其在回授時也不易給予適當的訊號來調整

轉速因此改良之方法就是以8051之軟體撰寫方式來產生固定的脈寬也就等

於給予轉速的命令而在其回授控制時也只要在內部程式给予適當的指令便可

達到脈寬長度的調整以達到閉迴路之受控系統

411 PWM 軟體流程

設定Timer0模式為0

TH0 = temp 32 TL0 = temp 32

temp = 8192 ndash j4 Key = 0

檢查是否有鍵值

將鍵值存入Key

Yes

No

設定Key值所對應的 j值

If P30 == 1Then P30 = 0 temp = 8192 ndash j4Else P30 = 1 temp=8192ndash880+j4

TH0 = temp 32 TL0 = temp 32

Start Timer0中斷副程式

啟動Timer0

等待Timer0中斷

返回主程式

圖 41 PWM 軟體設計流程圖

37

在此總共設計了五個按鈕分別代表不同的轉速停止正轉〈慢〉正轉

〈快〉逆轉〈慢〉和逆轉〈快〉使用Timer0是因為8051之計時中斷比延遲程

式來的準確故可以達到準確的計時程式設計理念中並沒有將中斷致能清除

因此Timer0會一直處於計時的狀態程式執行時將一邊檢查鍵值〈KeyStatus〉一

邊進行計時當計時完畢便呼叫中斷副程式然後執行改變Port 30的輸出狀

態若是為high則變為low反之若是為low即變為high同時並重設計時時間

Timer0繼續計時

當鍵值改變時計時的時間也會跟著改變如此一來Timer0將ㄧ直重覆上

述動作直到電源切掉Timer0才會停止計時

42 模糊控制之程式規劃與撰寫

本專題目標在完成了先前所規劃的硬體電路之後接著就是要達成利用模糊

控制理論來設計控制器在此採用了單晶片8051目的是為了以硬體實現方式來

代替電腦模擬期望能夠按照原訂計畫完成本專題「具模糊控制理論與雙脈寬調

變法之直流馬達驅動電路設計」

單晶片 8051 模糊控制的程式撰寫採下列幾個步驟依序完成

1 設定變數轉速誤差〈dspeed〉目前轉速〈sspeed〉

2 模糊化採用三角形歸屬函數採用三角形歸屬函數的原因

〈1〉 三角形函數為一連續函數

〈2〉 三角形函數為線性的函數所以計算速度較快

〈3〉 是具有發散也有收斂的函數和指數函數一樣接近

事實

3 模糊推論模糊規則將其所有可能發生情況以 IFhellipTHENhellip表示

並建立控制規則表

4 解模糊化採用重心法

38

421 歸屬函數

設定變數為目前轉速〈sspeed〉與轉速誤差〈dspeed〉因此此模糊控制器共

有兩個輸入訊號與一輸出訊號輸出訊號為脈寬長度該加或是減多少又因為有

五種不同的轉速因此各分別設計了不同的歸屬函數如下

1 當轉速 = 0

ml h

s s p e e d

d s p e e d

r p m0 5 0 1 0 0- 5 0- 1 0 0

mv l l h v h

r p m0- 3 0- 6 0- 1 0 0 3 0 6 0 1 0 0 圖 42 停止時之歸屬函數

2 正轉〈慢〉

ml hsspeed

dspeed

rpm150 225 300750

mvl l h vh

rpm150100500 200 250 300

圖 43 正轉〈慢〉之歸屬函數

39

3 正轉〈快〉

ml hsspeed

dspeed

rpm520 670 820370220

mvl l h vh

rpm500400300200 600 700 800

圖 44 正轉〈快〉之歸屬函數

4 逆轉〈慢〉

ml hsspeed

dspeed

rpm100 250 400500

mvl l h vh

rpm10050250 200 300 400 圖 45 逆轉〈慢〉之歸屬函數

40

5 逆轉〈快〉

ml hsspeed

dspeed

rpm300 450 600150

mvl l h vh

rpm450350250150 550 650 750

750

圖 46 逆轉〈快〉之歸屬函數

6 輸出

OutputMVL L H VH

rpm0-50-150-250 50 150 250

圖 47 輸出之歸屬函數

41

422 模糊規則庫

表 41 為吾人所設計的模糊控制規則庫並利用 Matlab 之 Fuzzy ToolBox 來

建立此規則庫以進行模擬推論圖 48 為當馬達輸入指令為正轉慢時推論後所得

到的三維空間圖

表 41 模糊控制規則表

Dspeed

vl l m h vh

l H M L VL VL

m VH H M L VL sspeed

h VH VH H M L

圖 48 推論後的三維空間圖

42

423 模糊控制器之軟體設計流程

Start 外部中斷副程式

ADCWR = 0 ADCWR = 1

〈令AD開始轉換〉

檢查鍵值以得到對應的歸屬函數

取得目前轉速與

轉速誤差

Fuzzy Rules決策

得到輸出訊號

Delay 10ms

ADC = 0 讀取AD值 ADCRD = 0

將AD值換算成轉速

ADCWR = 0 ADCWR = 1

〈AD開始轉換〉

返回主程式

致能外部中斷

圖 49 Fuzzy Controller 程式流程圖

當控制器一開始動作時便先執行AD轉換的工作當AD轉換完成時其

INTR的接腳便會觸發8051的外部中斷INTR0於是程式便發生外部中斷執行

外部中斷副程式的指令

43

在外部中斷副程式中AD將ㄧ直進行轉換與讀取的工作同時並將轉換後

的值直接換算成目前轉速與轉速誤差以供模糊控制器使用換算目前encoder

的頻率其公式為

160-V2000 times=頻率 〈4-1〉

式4-1之公式是根據表31所導出來的其中V為encoder之頻率轉成電壓之值

又假設所讀取的AD轉換值為value因為

AD的解析度 = bit256

5V+ = 511 ( Vbit ) 〈4-2〉

故value值與電壓V之關係為

511 value V times= 〈4-3〉

所以encoder之頻率與value值的關係為

頻率= 2000times ⎟⎠⎞

⎜⎝⎛ times

511 value - 160 〈4-4〉

故目前轉速為

sspeed = ( )rpm 60 200

times頻率 〈4-5〉

另ㄧ方面在主程式中程式會先去檢查鍵值也就等於檢查輸入指令以

找出符合使用的歸屬函數並將AD所獲得的轉速對應到歸屬函數中然後執行

決策判斷即進入規則庫中尋找出適當的決策判斷最後將此決策送入PWM程

式裡進行脈寬長度的調整使馬達在合理的要求下達到理想的轉速控制不會

因為外在環境的影響而使馬達轉速受到干擾

43 LCD 顯示轉速

此專題最後再增加一LCD顯示幕以顯示目前的轉速否則在程式設計完成

後人卻因無法以肉眼得知目前轉速而不能肯定馬達轉速是否有達到控制的目

標因此增加一顯示幕LCD是有必要的不僅隨時得知目前的轉速還能知道

44

設計出來的軟體其控制性是否夠好夠穩定

431 LCD 顯示幕之軟體流程

Start

設定LCD模組的初始狀態

設定外部中斷INTR0

與Timer0

設定TH0 = (65536 ndash 5000) 256 TL0 = (65536 ndash 5000)256

令ADCWR = 0 ADCWR = 1 AD開始轉換

等待中斷

外部中斷副程式

ADCRD = 0 讀取AD值 ADCRD = 1

將AD值換算成速度

ADCWR = 0 ADCWR = 1 AD開始轉換

Timer0中斷副程式

顯示LCD第一行

ldquoMotor Speed =

顯示LCD第二行ldquoxxxxxxx rpm其中 xxxxxx為外部中斷副程式所換算出的轉速

重設TH0與TL0

返回主程式返回主程式

圖 410 LCD 顯示幕之程式流程圖

此程式主要由兩個部分完成一為外部中斷副程式另ㄧ為 Timer0 中斷副

程式當主程式完成外部與 Timer0 兩個中斷的設定後隨即命令 AD 開始轉換

之後便一直停在 while〈1〉的迴圈裡不做任何動作而由兩個中斷副程式來完

成整個轉換與顯示的工作

45

外部中斷副程式主要負責 AD 的轉換讀取與轉速換算的工作AD 第一

次的轉換由主程式來下達命令當轉換完成後AD 的 INTR 接腳將觸發外部中

斷〈INTR0〉副程式此時程式便進入外部中斷副程式執行讀取 AD 值與轉速

換算的工作當這些工作完成時外部中斷副程式再次下達 AD 開始轉換的命

令而離開中斷副程式當 AD 再次轉換完成時又將再次執行中斷副程式

如此週而復始中斷副程式將ㄧ直進行讀取換算與轉換的工作

而 Timer0 中斷副程式主要負責 LCD 顯示之工作當主程式所設定的計時時

間計數完時程式便進入 Timer0 中斷副程式一旦進入 Timer0 中斷副程式程

式將執行 LCD 的顯示然後再重設 Timer0 的計數時間Timer0 將重新計數當

計數完時程式又將再度進入 Timer0 中斷副程式執行因為程式中並無清除

Timer0 的中斷致能故 Timer0 中斷副程式和外部中斷副程式ㄧ樣週而復始的

執行其副程式的工作

46

第五章 結論

本計劃主旨為具模糊控制理論與雙脈寬調變法之直流馬達驅動電路設計主

要是針對傳統電路設計之缺點提出改良之方法以TPWM取代PWM電路以模

糊理論基礎設計之控制器替代傳統PID控制器

TPWM轉速控制優於PWM之處在於

1 TPWM只需使用單電源即可達到正轉和逆轉的轉速控制而PWM必須

加上逆向開關或是雙電源才能使馬達產生正轉和逆轉

2 TPWM可控制馬達處於停止狀態無論在正向或逆向加上負載皆無法使

馬達產生轉動

3 馬達消耗定額功率輸出轉矩為額定值

4 馬達由停止到某定轉速時反應時間較快

模糊控制器優於PID控制器

1 不須導出繁雜的數學模型

2 適用於非線性系統

3 強健性與容錯性較高

本專題至此雖說大致的目標都已達到但是此系統仍然有許多不完美而需要

改進的地方例如在實驗過程中發現整個轉速的控制在回授上其反應時間

有點慢探討其原因有可能是控制器之程式上的問題

1 因為使用C語言撰寫程式故其執行速度較慢

2 程式可能寫的太累贅

3 模糊控制規則庫建立不良

若想改善這些問題可以嘗試著將C語言改為組合語言來撰寫並盡量減少

47

不必要的指令相信此動作一定能大大提昇程式的執行速度其次就是多做測

試利用測試中所學到的經驗來幫助模糊控制規則庫的改寫同時也能從測試中

發現更多的問題若是都能對問題加以一一解決的話相信必定能將此控制系統

做的更盡善盡美

48

參考文獻

﹝1﹞ 李適中直流馬達速度控制伺服控制〈基礎篇〉全華科技圖書股份有

限公司民 74

﹝2﹞ 廖錦文ldquo直流電動機之雙脈寬調變是〈TPWM〉驅動電路研究電

子技術月刊第 69 期pp94-1021992

﹝3﹞ 楊英魁孫宗瀛鄭魁香林建德蔣旭堂模糊控制理論與技術全華

科技圖書股份有限公司民 85

﹝4﹞ 林敦煌陳憬德直流馬達定位及轉速的模糊控制逢甲大學自動控制工

程學系學士論文民 87

﹝5﹞ LAZadehldquo Fuzzy Sets Information and Control Vol8 pp338-353

1965

﹝6﹞ EHMamdani and SAsslianldquo A fuzzy logic controller for a dynamic

plant Internation Journal of Man-Machine Studies Vol7 pp1-13 1975

﹝7﹞ 孫宗瀛楊英魁Fuzzy 控制理論實作與應用全華科技圖書股份有

限公司民 83 年

﹝8﹞ 許中平黃煌嘉直流電動機控制電路設計全華科技圖書股份有限公司

民 75

﹝9﹞ 盧明智黃敏祥OP Amp 應用+實驗模擬全華科技圖書股份有限公司

民 83

﹝10﹞陳文耀電動機控制工程復文書局2003

﹝11﹞許中平林全福電動機運轉控制技術全華科技圖書股份有限公司民

77

﹝12﹞楊明豐8051 單晶片 C 語言設計實務碁峯資訊2003 年

﹝13﹞蔡朝洋單晶片微電腦 80518951 原理與應用全華科技圖書股份有限公

司民 91

49

﹝14﹞王文俊認識 Fuzzy全華科技圖書股份有限公司民 90

50

附錄 A 專題硬體展示圖

圖 A-1 硬體整體圖

圖 A-2 硬體整體鳥瞰圖

51

圖 A-3 硬體側視圖

圖 A-4 操作與顯示面板

圖 A-5 間距脈波電路與 FV 電路

52

圖 A-6 橋型驅動功率放大電路

圖 A-7 操作與控制面板

53

附錄 B PWM 與模糊控制之程式

include reg51h include stdioh sbit ADCRD = P3^1 設定 RD 控制線接腳為 P31 sbit ADCWR = P3^3 設定 WR 控制線接腳為 P33 sbit P2_0 = 0xA0 接腳定義 sbit P2_1 = 0xA1 接腳定義 sbit P3_0 = 0xB0 接腳定義 sbit P3_1 = 0xB1 接腳定義 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P3_6 = 0xB6 接腳定義 void KeyStatus(void) 函數原型宣告 void feedback(void) 函數原型宣告 void compute_grade(void) 函數原型宣告 void delay1ms(int count) 函數原型宣告 void convert() 函數原型宣告 void condition() 函數原型宣告 void CW(void) 函數原型宣告 int j i 對應 PWM 的寬度 unsigned int temp 所設計的計時器時間 int sample = 1000 取樣率設定消除顯示值跳動 long int value r1 讀取 ADC0804 數位資料 long int set n condition select long int r grade_reg[2] grade[15] error1 error2 long int a1 b1 I long int membership[5][3]membership1[3][3] 定義歸屬函數 long int membership2[3][3] = -10-50-5050510 long int error[2] int Rule[15][3] = 113213313 定義判斷規則庫 212223323 311232333 411241342 511251351

54

main() 主程式 j = PWM = 110 設定 PWM 初始值 IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x00 設定計時器 0 工作於模式 0 temp=8192-j4 設定計時器 0 初值 TH0 = temp 32 TL0 = temp 32 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 P3_4 = 1 P3_5 = 0 P3_6 = 0 ADCWR = 0 令 ADC0804 的 WR = 0 ADCWR = 1 令 ADC0804 的 WR = 1 while (1) KeyStatus() 檢查鍵值 void KeyStatus(void) 檢查鍵值並給對應的 PWM 值 char KeyScan(void) 按鍵掃描函數宣告 unsigned char KeyStatus unsigned char Key = 0 KeyStatus=KeyScan() 呼叫按鍵掃描函數 if (KeyStatus = 0) 已有按鍵輸入 Key = KeyStatus Key = 鍵值 if (Key == 0x01) 假如輸入為按鍵 1 i = 110 PWM 為 110us j = i P3_4 = 1 LED 亮第一顆〈表馬達停止〉 P3_5 = 0 P3_6 = 0

55

else if (Key == 0x02 ) 假如輸入為按鍵 2 i = 140 PWM 為 140us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x04 ) 假如輸入為按鍵 3 i = 180 PWM 為 180us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x08 ) 假如輸入為按鍵 4 i = 80 PWM 為 80us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 else if (Key == 0x10 ) 假如輸入為按鍵 5 i = 40 PWM 為 40us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 PWM = j delay1ms(10) 呼叫延遲函數 feedback() 模糊控制判斷

56

void To_int(void) interrupt 1 Timer0 中斷函數 if (P3_0 == 0) 假如 PWM 輸出為 Low P3_0 = 1 變更 PWM 輸出為 High temp=8192-j4 設定 High 的時間 else 若 PWM 輸出為 High P3_0 = 0 變更 PWM 輸出為 Low temp=8192-880+j4 設定 Low 的時間 TH0 = temp 32 Timer0 的計時時間 TL0 = temp 32 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 char KeyScan(void) 檢查鍵值 char KeyStatus 按鍵狀態 P0=0xff 設定 P0 為輸入模式 KeyStatus=~P0 讀取按鍵狀態 return(KeyStatus) 將鍵值送回程式 void feedback(void) 模糊判斷 void Fuzzycontroller() 函數原型宣告 void condition1() 函數原型宣告

57

void condition2() 函數原型宣告 error1 = ((value)40-160)03 輸入變數 1 delay10ms(10) 延遲 10ms error2 = ((value)40-160)03 輸入變數 2 if (key == 0x01 ) 當按鍵 1找出對應的歸屬函數 並做出模糊控制判斷

int membership[5][3]= -100-60-30-60-300-30030030603060100

int membership1[3][3]=-100-500-50050050100 Fuzzycontroller() condition() if (key == 0x02 ) 當按鍵 2找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

05010050100150100150200150200250200250300 int membership1[3][3]=07515075150225150225300 Fuzzycontroller() condition() else if (key == 0x04) 當按鍵 3找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

200320400300400500400500600500600700600700800 int membership1[3][3]=220370520370520670520670820 Fuzzycontroller() condition() else if (key == 0x08) 當按鍵 4找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

02550255010050100200100200300200300400 int membership1[3][3]=05010050100250100250400 Fuzzycontroller() condition()

58

else if (key == 0x10) 當按鍵 5找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

150250350250350450350450550450550650550650750 int membership1[3][3]=150300450300450600450600750 Fuzzycontroller() condition2() void Fuzzycontroller() 模糊控制判斷 void compute_grade() 函數原型宣告 void compute_grade1() 函數原型宣告 a1 = 0 b1 = 001 I = 0 for (n=0 nlt=14 n++) r = error1 set = Rule[n][0]-1 compute_grade() 計算輸入變數 1 與

模糊程度的歸屬函數 condition = 1 r = error2 set = Rule[n][1]-1 compute_grade1() 計算輸入變數 2 與 模糊程度的歸屬函數 grade[n] = MIN(grade_reg[0] grade_reg[1]) a1 = a1 + (grade[n]membership2[Rule[n][2]-1][1]) b1 = b1 + grade[n] I = a1 b1 得到模糊控制判斷的結果 void compute_grade() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership[set][0]) || (r gt membership[set][2])) 當輸入變數不在 歸屬函數內

59

grade_reg[condition] = 0 else if ((r gt membership[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership[set][2]-r) (membership[set][2] - membership[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership[set][0]) (membership[set][1] - membership[set][0]) void compute_grade1() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership1[set][0]) || (r gt membership1[set][2])) 當輸入變數不在 歸屬函數內 grade_reg[condition] = 0 else if ((r gt membership1[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership1[set][2]-r) (membership1[set][2]-membership1[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership1[set][0]) (membership1[set][1]-membership1[set][0])

60

void condition() P2_0 = 1 設定 P20 為輸入模式 P2_1 = 1 設定 P21 為輸入模式 if ( (P2_0 == 1) ampamp (P2_1 == 0)) 當馬達為正轉時 if ( I gt 0 ) 若模糊判斷結果為正 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 若模糊判斷結果為零 PWM = PWM + 0 PWM 寬度不變 if ( I lt 0 ) 若模糊控制結果小於零 PWM = PWM + 1 PWM 寬度加 1 else if ( (P2_0 == 0) ampamp (P2_1 == 1) ) 若馬達為反轉 if ( I lt 0 ) 模糊控制小於零 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 模糊控制等於零 PWM = PWM + 0 PWM 寬度不變 if ( I gt 0 ) 模糊控制大於零 PWM = PWM + 1 PWM 寬度加 1 CW() 判斷 PWM 寬度上下限

61

void CW() 判斷 PWM 寬度上下限 if ( PWM gt= 215 ) 若 PWM 寬度 gt= 最大寬度 j = 215 PWM 寬度維持於 215us if ( PWM lt= 5 ) 若 PWM 寬度 lt= 最小寬度 j = 5 PWM 寬度維持在 5us if ( PWM gt 5 ampamp PWM lt 215 ) PWM 寬度介於最大與最小間 j = PWM PWM 依模糊控制判斷結果增減 void delay1ms(int count) 延遲 1ms int x y for ( x = 0 x lt count x++ ) for ( y = 0 y lt 122 y++ ) void convert() 數位資料換算成馬達轉速 r1 = ((value)40)-160

62

附錄 C LCD 顯示之程式

includereg51h 含 8051 所有暫存器宣告 include mathh define RS P3_5 LCD 指令資料選擇控制 define RW P3_4 LCD 讀寫控制腳 define Enable P3_3 LCD 致能接腳 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P0_0 = 0x80 接腳定義 sbit P0_1 = 0x81 接腳定義 sbit P0_2 = 0x82 接腳定義 sbit P0_3 = 0x83 接腳定義 sbit P0_4 = 0x84 接腳定義 sbit P0_5 = 0x85 接腳定義 sbit P0_6 = 0x86 接腳定義 sbit ADCRD = P3^7 設定 RD 控制線接腳為 P37 sbit ADCWR = P3^6 設定 WR 控制線接腳為 P36 void delay(void) 函數原型宣告 void delay10ms(int count) 函數原型宣告 void display(void) 函數原型宣告 void InitialLCD(void) 函數原型宣告 void WriteIns(char) 函數原型宣告 void WriteData(char) 函數原型宣告 void WriteString(charchar) 函數原型宣告 void CheckBusy(void) 函數原型宣告 void convert(void) 函數原型宣告 char MSG0[] = Motor Speed = 定義字串 MSG0 char MSG2[] = rpm 定義字串 MSG2 unsigned char MSG1[8]=0000000 定義字串 MSG1 unsigned long int value 讀取 ADC0804 數位資料 int sample = 1000 取樣率設定消除顯示值跳動 long int rpm

63

main() 主程式 InitialLCD() 初始化 LCD IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x01 設定計時器 0 工作於模式 1 TH0 = (65536-5000)256 設定計時器 0 初值 TL0 = (65536-5000)256 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 while(1) 等待中斷 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 while (--sample == 0) 取樣率減 1 sample = 1000 重設取樣率 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 void T0_int(void) interrupt 1 LCD 顯示動態掃描 display() 動態掃描顯示 TH0 = (65536-65535)256 重設計時初值 TL0 = (65536-65535)256

64

void InitialLCD(void) 設定 LCD 模組初始狀態 delay() 延遲函數 WriteIns(0x38) 設定 LCD 模組為 WriteIns(0x38) 2 行顯示 WriteIns(0x38) 8 位元介面 WriteIns(0x38) 5x7 點字型 WriteIns(0x08) 關閉顯示器 WriteIns(0x01) 清除 LCD 螢幕 WriteIns(0x0c) 令顯示器 ON但游標不顯示 WriteIns(0x06) 令 LCD 模組每接收到 1Byte 資料 AC 值自動加 1 void display() 掃描顯示 WriteIns(0x80) 設定 LCD 座標 WriteString(13MSG0) 將字串 MSG0 寫入 LCD 中 WriteIns(0xc0) 設定 LCD 座標 WriteString(8MSG1) 將字串 MSG1 寫入 LCD 中 WriteIns(0xc8) 設定 LCD 座標 WriteString(4MSG2) 將字串 MSG2 寫入 LCD 中 void convert(void) 換算轉速 long int freq freq = ((value)4000) - 16000 數位資料換成頻率公式 rpm = freq3 頻率換算轉速公式 MSG1[0] = (rpm1000000)+0x30 將結果存入字串 MSG1 中 MSG1[1] = ((rpm1000000)100000)+0x30 MSG1[2] = ((rpm100000)10000)+0x30 MSG1[3] = ((rpm10000)1000)+0x30 MSG1[4] = 0x2e MSG1[5] = ((rpm1000)100)+0x30 MSG1[6] = ((rpm100)10)+0x30 MSG1[7] = rpm10+0x30

65

void WriteIns(char instruction) 寫命令至 LCD 中 RS = 0 選擇指令暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = instruction 輸出命令至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteData(char i) 寫資料至 LCD 中 RS = 1 選擇資料暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = i 輸出資料至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteString(countMSG) 寫字串至 LCD 中 char count 字串長度 char MSG[] 字串資料 char i 定義位元組變數 for(i=0 iltcount i++) count 個位元組 WriteData(MSG[i]) 寫入一位元組的資料至 LCD 中 void CheckBusy(void) char i=0x80 檢查忙碌旗標 while(iamp0x80) 忙錄旗標 BF = 1 RS = 0 選擇指令暫存器 RW = 1 讀取 Enable = 1 致能 LCD i = P2 讀取 LCD 指令暫存器內的資料

66

Enable = 0 除能 LCD delay() 延遲函數 void delay() 延遲 5ms int i for(i=0 ilt250 i++)

  • 畢業專題封面pdf
  • File0004pdf
  • 最終版pdfpdf
Page 43: Based on Fuzzy Control Theorem and TPWM Method for DC ... · 使吾人想設計一模糊控制器來做為馬達轉速的閉迴路控制,以解決非線性系統的 問題。除此之外,flcs

34

圖 318 直流電源電路實體圖

37 馬達轉速的量測

表 33 PWM 輸出對應 encoder 週期

PWM dutycycle encoder 週期 PWM dutycycle encoder 週期

40 sμ 172 sμ 440 sμ 0 sμ

80 sμ 188 sμ 480 sμ 0 sμ

120 sμ 204 sμ 520 sμ 0 sμ

160 sμ 230 sμ 560 sμ 0 sμ

200 sμ 272 sμ 600 sμ 0 sμ

240 sμ 328 sμ 640 sμ 0 sμ

280 sμ 416 sμ 680 sμ 1320 sμ

320 sμ 540 sμ 720 sμ 750 sμ

360 sμ 800 sμ 760 sμ 510 sμ

400 sμ 1320 sμ 800 sμ 400 sμ

35

圖 319 PWM 輸出對應 encoder 週期

由統計可知道此馬達並不是一顆線性馬達故相信若使用模糊控制理論來

作為其回授控制系統的控制器一定能達到比傳統控制器的性能還要好而且若能

在模糊控制裡加上 PID 控制器的觀念一定能在系統的響應時間上升時間

安定時間和超越量達到最佳的控制另一方面馬達在其反方向的內阻較大需

要更大的力量才能使馬達驅動

36

第四章 軟體規劃與製作

41 PWM 之軟體設計

因為之前所介紹的硬體方式是以調整可變電阻來達到轉速的調整因此無法

得知所給予的脈寬長度和轉速大小尤其在回授時也不易給予適當的訊號來調整

轉速因此改良之方法就是以8051之軟體撰寫方式來產生固定的脈寬也就等

於給予轉速的命令而在其回授控制時也只要在內部程式给予適當的指令便可

達到脈寬長度的調整以達到閉迴路之受控系統

411 PWM 軟體流程

設定Timer0模式為0

TH0 = temp 32 TL0 = temp 32

temp = 8192 ndash j4 Key = 0

檢查是否有鍵值

將鍵值存入Key

Yes

No

設定Key值所對應的 j值

If P30 == 1Then P30 = 0 temp = 8192 ndash j4Else P30 = 1 temp=8192ndash880+j4

TH0 = temp 32 TL0 = temp 32

Start Timer0中斷副程式

啟動Timer0

等待Timer0中斷

返回主程式

圖 41 PWM 軟體設計流程圖

37

在此總共設計了五個按鈕分別代表不同的轉速停止正轉〈慢〉正轉

〈快〉逆轉〈慢〉和逆轉〈快〉使用Timer0是因為8051之計時中斷比延遲程

式來的準確故可以達到準確的計時程式設計理念中並沒有將中斷致能清除

因此Timer0會一直處於計時的狀態程式執行時將一邊檢查鍵值〈KeyStatus〉一

邊進行計時當計時完畢便呼叫中斷副程式然後執行改變Port 30的輸出狀

態若是為high則變為low反之若是為low即變為high同時並重設計時時間

Timer0繼續計時

當鍵值改變時計時的時間也會跟著改變如此一來Timer0將ㄧ直重覆上

述動作直到電源切掉Timer0才會停止計時

42 模糊控制之程式規劃與撰寫

本專題目標在完成了先前所規劃的硬體電路之後接著就是要達成利用模糊

控制理論來設計控制器在此採用了單晶片8051目的是為了以硬體實現方式來

代替電腦模擬期望能夠按照原訂計畫完成本專題「具模糊控制理論與雙脈寬調

變法之直流馬達驅動電路設計」

單晶片 8051 模糊控制的程式撰寫採下列幾個步驟依序完成

1 設定變數轉速誤差〈dspeed〉目前轉速〈sspeed〉

2 模糊化採用三角形歸屬函數採用三角形歸屬函數的原因

〈1〉 三角形函數為一連續函數

〈2〉 三角形函數為線性的函數所以計算速度較快

〈3〉 是具有發散也有收斂的函數和指數函數一樣接近

事實

3 模糊推論模糊規則將其所有可能發生情況以 IFhellipTHENhellip表示

並建立控制規則表

4 解模糊化採用重心法

38

421 歸屬函數

設定變數為目前轉速〈sspeed〉與轉速誤差〈dspeed〉因此此模糊控制器共

有兩個輸入訊號與一輸出訊號輸出訊號為脈寬長度該加或是減多少又因為有

五種不同的轉速因此各分別設計了不同的歸屬函數如下

1 當轉速 = 0

ml h

s s p e e d

d s p e e d

r p m0 5 0 1 0 0- 5 0- 1 0 0

mv l l h v h

r p m0- 3 0- 6 0- 1 0 0 3 0 6 0 1 0 0 圖 42 停止時之歸屬函數

2 正轉〈慢〉

ml hsspeed

dspeed

rpm150 225 300750

mvl l h vh

rpm150100500 200 250 300

圖 43 正轉〈慢〉之歸屬函數

39

3 正轉〈快〉

ml hsspeed

dspeed

rpm520 670 820370220

mvl l h vh

rpm500400300200 600 700 800

圖 44 正轉〈快〉之歸屬函數

4 逆轉〈慢〉

ml hsspeed

dspeed

rpm100 250 400500

mvl l h vh

rpm10050250 200 300 400 圖 45 逆轉〈慢〉之歸屬函數

40

5 逆轉〈快〉

ml hsspeed

dspeed

rpm300 450 600150

mvl l h vh

rpm450350250150 550 650 750

750

圖 46 逆轉〈快〉之歸屬函數

6 輸出

OutputMVL L H VH

rpm0-50-150-250 50 150 250

圖 47 輸出之歸屬函數

41

422 模糊規則庫

表 41 為吾人所設計的模糊控制規則庫並利用 Matlab 之 Fuzzy ToolBox 來

建立此規則庫以進行模擬推論圖 48 為當馬達輸入指令為正轉慢時推論後所得

到的三維空間圖

表 41 模糊控制規則表

Dspeed

vl l m h vh

l H M L VL VL

m VH H M L VL sspeed

h VH VH H M L

圖 48 推論後的三維空間圖

42

423 模糊控制器之軟體設計流程

Start 外部中斷副程式

ADCWR = 0 ADCWR = 1

〈令AD開始轉換〉

檢查鍵值以得到對應的歸屬函數

取得目前轉速與

轉速誤差

Fuzzy Rules決策

得到輸出訊號

Delay 10ms

ADC = 0 讀取AD值 ADCRD = 0

將AD值換算成轉速

ADCWR = 0 ADCWR = 1

〈AD開始轉換〉

返回主程式

致能外部中斷

圖 49 Fuzzy Controller 程式流程圖

當控制器一開始動作時便先執行AD轉換的工作當AD轉換完成時其

INTR的接腳便會觸發8051的外部中斷INTR0於是程式便發生外部中斷執行

外部中斷副程式的指令

43

在外部中斷副程式中AD將ㄧ直進行轉換與讀取的工作同時並將轉換後

的值直接換算成目前轉速與轉速誤差以供模糊控制器使用換算目前encoder

的頻率其公式為

160-V2000 times=頻率 〈4-1〉

式4-1之公式是根據表31所導出來的其中V為encoder之頻率轉成電壓之值

又假設所讀取的AD轉換值為value因為

AD的解析度 = bit256

5V+ = 511 ( Vbit ) 〈4-2〉

故value值與電壓V之關係為

511 value V times= 〈4-3〉

所以encoder之頻率與value值的關係為

頻率= 2000times ⎟⎠⎞

⎜⎝⎛ times

511 value - 160 〈4-4〉

故目前轉速為

sspeed = ( )rpm 60 200

times頻率 〈4-5〉

另ㄧ方面在主程式中程式會先去檢查鍵值也就等於檢查輸入指令以

找出符合使用的歸屬函數並將AD所獲得的轉速對應到歸屬函數中然後執行

決策判斷即進入規則庫中尋找出適當的決策判斷最後將此決策送入PWM程

式裡進行脈寬長度的調整使馬達在合理的要求下達到理想的轉速控制不會

因為外在環境的影響而使馬達轉速受到干擾

43 LCD 顯示轉速

此專題最後再增加一LCD顯示幕以顯示目前的轉速否則在程式設計完成

後人卻因無法以肉眼得知目前轉速而不能肯定馬達轉速是否有達到控制的目

標因此增加一顯示幕LCD是有必要的不僅隨時得知目前的轉速還能知道

44

設計出來的軟體其控制性是否夠好夠穩定

431 LCD 顯示幕之軟體流程

Start

設定LCD模組的初始狀態

設定外部中斷INTR0

與Timer0

設定TH0 = (65536 ndash 5000) 256 TL0 = (65536 ndash 5000)256

令ADCWR = 0 ADCWR = 1 AD開始轉換

等待中斷

外部中斷副程式

ADCRD = 0 讀取AD值 ADCRD = 1

將AD值換算成速度

ADCWR = 0 ADCWR = 1 AD開始轉換

Timer0中斷副程式

顯示LCD第一行

ldquoMotor Speed =

顯示LCD第二行ldquoxxxxxxx rpm其中 xxxxxx為外部中斷副程式所換算出的轉速

重設TH0與TL0

返回主程式返回主程式

圖 410 LCD 顯示幕之程式流程圖

此程式主要由兩個部分完成一為外部中斷副程式另ㄧ為 Timer0 中斷副

程式當主程式完成外部與 Timer0 兩個中斷的設定後隨即命令 AD 開始轉換

之後便一直停在 while〈1〉的迴圈裡不做任何動作而由兩個中斷副程式來完

成整個轉換與顯示的工作

45

外部中斷副程式主要負責 AD 的轉換讀取與轉速換算的工作AD 第一

次的轉換由主程式來下達命令當轉換完成後AD 的 INTR 接腳將觸發外部中

斷〈INTR0〉副程式此時程式便進入外部中斷副程式執行讀取 AD 值與轉速

換算的工作當這些工作完成時外部中斷副程式再次下達 AD 開始轉換的命

令而離開中斷副程式當 AD 再次轉換完成時又將再次執行中斷副程式

如此週而復始中斷副程式將ㄧ直進行讀取換算與轉換的工作

而 Timer0 中斷副程式主要負責 LCD 顯示之工作當主程式所設定的計時時

間計數完時程式便進入 Timer0 中斷副程式一旦進入 Timer0 中斷副程式程

式將執行 LCD 的顯示然後再重設 Timer0 的計數時間Timer0 將重新計數當

計數完時程式又將再度進入 Timer0 中斷副程式執行因為程式中並無清除

Timer0 的中斷致能故 Timer0 中斷副程式和外部中斷副程式ㄧ樣週而復始的

執行其副程式的工作

46

第五章 結論

本計劃主旨為具模糊控制理論與雙脈寬調變法之直流馬達驅動電路設計主

要是針對傳統電路設計之缺點提出改良之方法以TPWM取代PWM電路以模

糊理論基礎設計之控制器替代傳統PID控制器

TPWM轉速控制優於PWM之處在於

1 TPWM只需使用單電源即可達到正轉和逆轉的轉速控制而PWM必須

加上逆向開關或是雙電源才能使馬達產生正轉和逆轉

2 TPWM可控制馬達處於停止狀態無論在正向或逆向加上負載皆無法使

馬達產生轉動

3 馬達消耗定額功率輸出轉矩為額定值

4 馬達由停止到某定轉速時反應時間較快

模糊控制器優於PID控制器

1 不須導出繁雜的數學模型

2 適用於非線性系統

3 強健性與容錯性較高

本專題至此雖說大致的目標都已達到但是此系統仍然有許多不完美而需要

改進的地方例如在實驗過程中發現整個轉速的控制在回授上其反應時間

有點慢探討其原因有可能是控制器之程式上的問題

1 因為使用C語言撰寫程式故其執行速度較慢

2 程式可能寫的太累贅

3 模糊控制規則庫建立不良

若想改善這些問題可以嘗試著將C語言改為組合語言來撰寫並盡量減少

47

不必要的指令相信此動作一定能大大提昇程式的執行速度其次就是多做測

試利用測試中所學到的經驗來幫助模糊控制規則庫的改寫同時也能從測試中

發現更多的問題若是都能對問題加以一一解決的話相信必定能將此控制系統

做的更盡善盡美

48

參考文獻

﹝1﹞ 李適中直流馬達速度控制伺服控制〈基礎篇〉全華科技圖書股份有

限公司民 74

﹝2﹞ 廖錦文ldquo直流電動機之雙脈寬調變是〈TPWM〉驅動電路研究電

子技術月刊第 69 期pp94-1021992

﹝3﹞ 楊英魁孫宗瀛鄭魁香林建德蔣旭堂模糊控制理論與技術全華

科技圖書股份有限公司民 85

﹝4﹞ 林敦煌陳憬德直流馬達定位及轉速的模糊控制逢甲大學自動控制工

程學系學士論文民 87

﹝5﹞ LAZadehldquo Fuzzy Sets Information and Control Vol8 pp338-353

1965

﹝6﹞ EHMamdani and SAsslianldquo A fuzzy logic controller for a dynamic

plant Internation Journal of Man-Machine Studies Vol7 pp1-13 1975

﹝7﹞ 孫宗瀛楊英魁Fuzzy 控制理論實作與應用全華科技圖書股份有

限公司民 83 年

﹝8﹞ 許中平黃煌嘉直流電動機控制電路設計全華科技圖書股份有限公司

民 75

﹝9﹞ 盧明智黃敏祥OP Amp 應用+實驗模擬全華科技圖書股份有限公司

民 83

﹝10﹞陳文耀電動機控制工程復文書局2003

﹝11﹞許中平林全福電動機運轉控制技術全華科技圖書股份有限公司民

77

﹝12﹞楊明豐8051 單晶片 C 語言設計實務碁峯資訊2003 年

﹝13﹞蔡朝洋單晶片微電腦 80518951 原理與應用全華科技圖書股份有限公

司民 91

49

﹝14﹞王文俊認識 Fuzzy全華科技圖書股份有限公司民 90

50

附錄 A 專題硬體展示圖

圖 A-1 硬體整體圖

圖 A-2 硬體整體鳥瞰圖

51

圖 A-3 硬體側視圖

圖 A-4 操作與顯示面板

圖 A-5 間距脈波電路與 FV 電路

52

圖 A-6 橋型驅動功率放大電路

圖 A-7 操作與控制面板

53

附錄 B PWM 與模糊控制之程式

include reg51h include stdioh sbit ADCRD = P3^1 設定 RD 控制線接腳為 P31 sbit ADCWR = P3^3 設定 WR 控制線接腳為 P33 sbit P2_0 = 0xA0 接腳定義 sbit P2_1 = 0xA1 接腳定義 sbit P3_0 = 0xB0 接腳定義 sbit P3_1 = 0xB1 接腳定義 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P3_6 = 0xB6 接腳定義 void KeyStatus(void) 函數原型宣告 void feedback(void) 函數原型宣告 void compute_grade(void) 函數原型宣告 void delay1ms(int count) 函數原型宣告 void convert() 函數原型宣告 void condition() 函數原型宣告 void CW(void) 函數原型宣告 int j i 對應 PWM 的寬度 unsigned int temp 所設計的計時器時間 int sample = 1000 取樣率設定消除顯示值跳動 long int value r1 讀取 ADC0804 數位資料 long int set n condition select long int r grade_reg[2] grade[15] error1 error2 long int a1 b1 I long int membership[5][3]membership1[3][3] 定義歸屬函數 long int membership2[3][3] = -10-50-5050510 long int error[2] int Rule[15][3] = 113213313 定義判斷規則庫 212223323 311232333 411241342 511251351

54

main() 主程式 j = PWM = 110 設定 PWM 初始值 IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x00 設定計時器 0 工作於模式 0 temp=8192-j4 設定計時器 0 初值 TH0 = temp 32 TL0 = temp 32 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 P3_4 = 1 P3_5 = 0 P3_6 = 0 ADCWR = 0 令 ADC0804 的 WR = 0 ADCWR = 1 令 ADC0804 的 WR = 1 while (1) KeyStatus() 檢查鍵值 void KeyStatus(void) 檢查鍵值並給對應的 PWM 值 char KeyScan(void) 按鍵掃描函數宣告 unsigned char KeyStatus unsigned char Key = 0 KeyStatus=KeyScan() 呼叫按鍵掃描函數 if (KeyStatus = 0) 已有按鍵輸入 Key = KeyStatus Key = 鍵值 if (Key == 0x01) 假如輸入為按鍵 1 i = 110 PWM 為 110us j = i P3_4 = 1 LED 亮第一顆〈表馬達停止〉 P3_5 = 0 P3_6 = 0

55

else if (Key == 0x02 ) 假如輸入為按鍵 2 i = 140 PWM 為 140us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x04 ) 假如輸入為按鍵 3 i = 180 PWM 為 180us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x08 ) 假如輸入為按鍵 4 i = 80 PWM 為 80us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 else if (Key == 0x10 ) 假如輸入為按鍵 5 i = 40 PWM 為 40us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 PWM = j delay1ms(10) 呼叫延遲函數 feedback() 模糊控制判斷

56

void To_int(void) interrupt 1 Timer0 中斷函數 if (P3_0 == 0) 假如 PWM 輸出為 Low P3_0 = 1 變更 PWM 輸出為 High temp=8192-j4 設定 High 的時間 else 若 PWM 輸出為 High P3_0 = 0 變更 PWM 輸出為 Low temp=8192-880+j4 設定 Low 的時間 TH0 = temp 32 Timer0 的計時時間 TL0 = temp 32 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 char KeyScan(void) 檢查鍵值 char KeyStatus 按鍵狀態 P0=0xff 設定 P0 為輸入模式 KeyStatus=~P0 讀取按鍵狀態 return(KeyStatus) 將鍵值送回程式 void feedback(void) 模糊判斷 void Fuzzycontroller() 函數原型宣告 void condition1() 函數原型宣告

57

void condition2() 函數原型宣告 error1 = ((value)40-160)03 輸入變數 1 delay10ms(10) 延遲 10ms error2 = ((value)40-160)03 輸入變數 2 if (key == 0x01 ) 當按鍵 1找出對應的歸屬函數 並做出模糊控制判斷

int membership[5][3]= -100-60-30-60-300-30030030603060100

int membership1[3][3]=-100-500-50050050100 Fuzzycontroller() condition() if (key == 0x02 ) 當按鍵 2找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

05010050100150100150200150200250200250300 int membership1[3][3]=07515075150225150225300 Fuzzycontroller() condition() else if (key == 0x04) 當按鍵 3找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

200320400300400500400500600500600700600700800 int membership1[3][3]=220370520370520670520670820 Fuzzycontroller() condition() else if (key == 0x08) 當按鍵 4找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

02550255010050100200100200300200300400 int membership1[3][3]=05010050100250100250400 Fuzzycontroller() condition()

58

else if (key == 0x10) 當按鍵 5找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

150250350250350450350450550450550650550650750 int membership1[3][3]=150300450300450600450600750 Fuzzycontroller() condition2() void Fuzzycontroller() 模糊控制判斷 void compute_grade() 函數原型宣告 void compute_grade1() 函數原型宣告 a1 = 0 b1 = 001 I = 0 for (n=0 nlt=14 n++) r = error1 set = Rule[n][0]-1 compute_grade() 計算輸入變數 1 與

模糊程度的歸屬函數 condition = 1 r = error2 set = Rule[n][1]-1 compute_grade1() 計算輸入變數 2 與 模糊程度的歸屬函數 grade[n] = MIN(grade_reg[0] grade_reg[1]) a1 = a1 + (grade[n]membership2[Rule[n][2]-1][1]) b1 = b1 + grade[n] I = a1 b1 得到模糊控制判斷的結果 void compute_grade() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership[set][0]) || (r gt membership[set][2])) 當輸入變數不在 歸屬函數內

59

grade_reg[condition] = 0 else if ((r gt membership[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership[set][2]-r) (membership[set][2] - membership[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership[set][0]) (membership[set][1] - membership[set][0]) void compute_grade1() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership1[set][0]) || (r gt membership1[set][2])) 當輸入變數不在 歸屬函數內 grade_reg[condition] = 0 else if ((r gt membership1[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership1[set][2]-r) (membership1[set][2]-membership1[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership1[set][0]) (membership1[set][1]-membership1[set][0])

60

void condition() P2_0 = 1 設定 P20 為輸入模式 P2_1 = 1 設定 P21 為輸入模式 if ( (P2_0 == 1) ampamp (P2_1 == 0)) 當馬達為正轉時 if ( I gt 0 ) 若模糊判斷結果為正 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 若模糊判斷結果為零 PWM = PWM + 0 PWM 寬度不變 if ( I lt 0 ) 若模糊控制結果小於零 PWM = PWM + 1 PWM 寬度加 1 else if ( (P2_0 == 0) ampamp (P2_1 == 1) ) 若馬達為反轉 if ( I lt 0 ) 模糊控制小於零 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 模糊控制等於零 PWM = PWM + 0 PWM 寬度不變 if ( I gt 0 ) 模糊控制大於零 PWM = PWM + 1 PWM 寬度加 1 CW() 判斷 PWM 寬度上下限

61

void CW() 判斷 PWM 寬度上下限 if ( PWM gt= 215 ) 若 PWM 寬度 gt= 最大寬度 j = 215 PWM 寬度維持於 215us if ( PWM lt= 5 ) 若 PWM 寬度 lt= 最小寬度 j = 5 PWM 寬度維持在 5us if ( PWM gt 5 ampamp PWM lt 215 ) PWM 寬度介於最大與最小間 j = PWM PWM 依模糊控制判斷結果增減 void delay1ms(int count) 延遲 1ms int x y for ( x = 0 x lt count x++ ) for ( y = 0 y lt 122 y++ ) void convert() 數位資料換算成馬達轉速 r1 = ((value)40)-160

62

附錄 C LCD 顯示之程式

includereg51h 含 8051 所有暫存器宣告 include mathh define RS P3_5 LCD 指令資料選擇控制 define RW P3_4 LCD 讀寫控制腳 define Enable P3_3 LCD 致能接腳 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P0_0 = 0x80 接腳定義 sbit P0_1 = 0x81 接腳定義 sbit P0_2 = 0x82 接腳定義 sbit P0_3 = 0x83 接腳定義 sbit P0_4 = 0x84 接腳定義 sbit P0_5 = 0x85 接腳定義 sbit P0_6 = 0x86 接腳定義 sbit ADCRD = P3^7 設定 RD 控制線接腳為 P37 sbit ADCWR = P3^6 設定 WR 控制線接腳為 P36 void delay(void) 函數原型宣告 void delay10ms(int count) 函數原型宣告 void display(void) 函數原型宣告 void InitialLCD(void) 函數原型宣告 void WriteIns(char) 函數原型宣告 void WriteData(char) 函數原型宣告 void WriteString(charchar) 函數原型宣告 void CheckBusy(void) 函數原型宣告 void convert(void) 函數原型宣告 char MSG0[] = Motor Speed = 定義字串 MSG0 char MSG2[] = rpm 定義字串 MSG2 unsigned char MSG1[8]=0000000 定義字串 MSG1 unsigned long int value 讀取 ADC0804 數位資料 int sample = 1000 取樣率設定消除顯示值跳動 long int rpm

63

main() 主程式 InitialLCD() 初始化 LCD IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x01 設定計時器 0 工作於模式 1 TH0 = (65536-5000)256 設定計時器 0 初值 TL0 = (65536-5000)256 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 while(1) 等待中斷 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 while (--sample == 0) 取樣率減 1 sample = 1000 重設取樣率 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 void T0_int(void) interrupt 1 LCD 顯示動態掃描 display() 動態掃描顯示 TH0 = (65536-65535)256 重設計時初值 TL0 = (65536-65535)256

64

void InitialLCD(void) 設定 LCD 模組初始狀態 delay() 延遲函數 WriteIns(0x38) 設定 LCD 模組為 WriteIns(0x38) 2 行顯示 WriteIns(0x38) 8 位元介面 WriteIns(0x38) 5x7 點字型 WriteIns(0x08) 關閉顯示器 WriteIns(0x01) 清除 LCD 螢幕 WriteIns(0x0c) 令顯示器 ON但游標不顯示 WriteIns(0x06) 令 LCD 模組每接收到 1Byte 資料 AC 值自動加 1 void display() 掃描顯示 WriteIns(0x80) 設定 LCD 座標 WriteString(13MSG0) 將字串 MSG0 寫入 LCD 中 WriteIns(0xc0) 設定 LCD 座標 WriteString(8MSG1) 將字串 MSG1 寫入 LCD 中 WriteIns(0xc8) 設定 LCD 座標 WriteString(4MSG2) 將字串 MSG2 寫入 LCD 中 void convert(void) 換算轉速 long int freq freq = ((value)4000) - 16000 數位資料換成頻率公式 rpm = freq3 頻率換算轉速公式 MSG1[0] = (rpm1000000)+0x30 將結果存入字串 MSG1 中 MSG1[1] = ((rpm1000000)100000)+0x30 MSG1[2] = ((rpm100000)10000)+0x30 MSG1[3] = ((rpm10000)1000)+0x30 MSG1[4] = 0x2e MSG1[5] = ((rpm1000)100)+0x30 MSG1[6] = ((rpm100)10)+0x30 MSG1[7] = rpm10+0x30

65

void WriteIns(char instruction) 寫命令至 LCD 中 RS = 0 選擇指令暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = instruction 輸出命令至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteData(char i) 寫資料至 LCD 中 RS = 1 選擇資料暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = i 輸出資料至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteString(countMSG) 寫字串至 LCD 中 char count 字串長度 char MSG[] 字串資料 char i 定義位元組變數 for(i=0 iltcount i++) count 個位元組 WriteData(MSG[i]) 寫入一位元組的資料至 LCD 中 void CheckBusy(void) char i=0x80 檢查忙碌旗標 while(iamp0x80) 忙錄旗標 BF = 1 RS = 0 選擇指令暫存器 RW = 1 讀取 Enable = 1 致能 LCD i = P2 讀取 LCD 指令暫存器內的資料

66

Enable = 0 除能 LCD delay() 延遲函數 void delay() 延遲 5ms int i for(i=0 ilt250 i++)

  • 畢業專題封面pdf
  • File0004pdf
  • 最終版pdfpdf
Page 44: Based on Fuzzy Control Theorem and TPWM Method for DC ... · 使吾人想設計一模糊控制器來做為馬達轉速的閉迴路控制,以解決非線性系統的 問題。除此之外,flcs

35

圖 319 PWM 輸出對應 encoder 週期

由統計可知道此馬達並不是一顆線性馬達故相信若使用模糊控制理論來

作為其回授控制系統的控制器一定能達到比傳統控制器的性能還要好而且若能

在模糊控制裡加上 PID 控制器的觀念一定能在系統的響應時間上升時間

安定時間和超越量達到最佳的控制另一方面馬達在其反方向的內阻較大需

要更大的力量才能使馬達驅動

36

第四章 軟體規劃與製作

41 PWM 之軟體設計

因為之前所介紹的硬體方式是以調整可變電阻來達到轉速的調整因此無法

得知所給予的脈寬長度和轉速大小尤其在回授時也不易給予適當的訊號來調整

轉速因此改良之方法就是以8051之軟體撰寫方式來產生固定的脈寬也就等

於給予轉速的命令而在其回授控制時也只要在內部程式给予適當的指令便可

達到脈寬長度的調整以達到閉迴路之受控系統

411 PWM 軟體流程

設定Timer0模式為0

TH0 = temp 32 TL0 = temp 32

temp = 8192 ndash j4 Key = 0

檢查是否有鍵值

將鍵值存入Key

Yes

No

設定Key值所對應的 j值

If P30 == 1Then P30 = 0 temp = 8192 ndash j4Else P30 = 1 temp=8192ndash880+j4

TH0 = temp 32 TL0 = temp 32

Start Timer0中斷副程式

啟動Timer0

等待Timer0中斷

返回主程式

圖 41 PWM 軟體設計流程圖

37

在此總共設計了五個按鈕分別代表不同的轉速停止正轉〈慢〉正轉

〈快〉逆轉〈慢〉和逆轉〈快〉使用Timer0是因為8051之計時中斷比延遲程

式來的準確故可以達到準確的計時程式設計理念中並沒有將中斷致能清除

因此Timer0會一直處於計時的狀態程式執行時將一邊檢查鍵值〈KeyStatus〉一

邊進行計時當計時完畢便呼叫中斷副程式然後執行改變Port 30的輸出狀

態若是為high則變為low反之若是為low即變為high同時並重設計時時間

Timer0繼續計時

當鍵值改變時計時的時間也會跟著改變如此一來Timer0將ㄧ直重覆上

述動作直到電源切掉Timer0才會停止計時

42 模糊控制之程式規劃與撰寫

本專題目標在完成了先前所規劃的硬體電路之後接著就是要達成利用模糊

控制理論來設計控制器在此採用了單晶片8051目的是為了以硬體實現方式來

代替電腦模擬期望能夠按照原訂計畫完成本專題「具模糊控制理論與雙脈寬調

變法之直流馬達驅動電路設計」

單晶片 8051 模糊控制的程式撰寫採下列幾個步驟依序完成

1 設定變數轉速誤差〈dspeed〉目前轉速〈sspeed〉

2 模糊化採用三角形歸屬函數採用三角形歸屬函數的原因

〈1〉 三角形函數為一連續函數

〈2〉 三角形函數為線性的函數所以計算速度較快

〈3〉 是具有發散也有收斂的函數和指數函數一樣接近

事實

3 模糊推論模糊規則將其所有可能發生情況以 IFhellipTHENhellip表示

並建立控制規則表

4 解模糊化採用重心法

38

421 歸屬函數

設定變數為目前轉速〈sspeed〉與轉速誤差〈dspeed〉因此此模糊控制器共

有兩個輸入訊號與一輸出訊號輸出訊號為脈寬長度該加或是減多少又因為有

五種不同的轉速因此各分別設計了不同的歸屬函數如下

1 當轉速 = 0

ml h

s s p e e d

d s p e e d

r p m0 5 0 1 0 0- 5 0- 1 0 0

mv l l h v h

r p m0- 3 0- 6 0- 1 0 0 3 0 6 0 1 0 0 圖 42 停止時之歸屬函數

2 正轉〈慢〉

ml hsspeed

dspeed

rpm150 225 300750

mvl l h vh

rpm150100500 200 250 300

圖 43 正轉〈慢〉之歸屬函數

39

3 正轉〈快〉

ml hsspeed

dspeed

rpm520 670 820370220

mvl l h vh

rpm500400300200 600 700 800

圖 44 正轉〈快〉之歸屬函數

4 逆轉〈慢〉

ml hsspeed

dspeed

rpm100 250 400500

mvl l h vh

rpm10050250 200 300 400 圖 45 逆轉〈慢〉之歸屬函數

40

5 逆轉〈快〉

ml hsspeed

dspeed

rpm300 450 600150

mvl l h vh

rpm450350250150 550 650 750

750

圖 46 逆轉〈快〉之歸屬函數

6 輸出

OutputMVL L H VH

rpm0-50-150-250 50 150 250

圖 47 輸出之歸屬函數

41

422 模糊規則庫

表 41 為吾人所設計的模糊控制規則庫並利用 Matlab 之 Fuzzy ToolBox 來

建立此規則庫以進行模擬推論圖 48 為當馬達輸入指令為正轉慢時推論後所得

到的三維空間圖

表 41 模糊控制規則表

Dspeed

vl l m h vh

l H M L VL VL

m VH H M L VL sspeed

h VH VH H M L

圖 48 推論後的三維空間圖

42

423 模糊控制器之軟體設計流程

Start 外部中斷副程式

ADCWR = 0 ADCWR = 1

〈令AD開始轉換〉

檢查鍵值以得到對應的歸屬函數

取得目前轉速與

轉速誤差

Fuzzy Rules決策

得到輸出訊號

Delay 10ms

ADC = 0 讀取AD值 ADCRD = 0

將AD值換算成轉速

ADCWR = 0 ADCWR = 1

〈AD開始轉換〉

返回主程式

致能外部中斷

圖 49 Fuzzy Controller 程式流程圖

當控制器一開始動作時便先執行AD轉換的工作當AD轉換完成時其

INTR的接腳便會觸發8051的外部中斷INTR0於是程式便發生外部中斷執行

外部中斷副程式的指令

43

在外部中斷副程式中AD將ㄧ直進行轉換與讀取的工作同時並將轉換後

的值直接換算成目前轉速與轉速誤差以供模糊控制器使用換算目前encoder

的頻率其公式為

160-V2000 times=頻率 〈4-1〉

式4-1之公式是根據表31所導出來的其中V為encoder之頻率轉成電壓之值

又假設所讀取的AD轉換值為value因為

AD的解析度 = bit256

5V+ = 511 ( Vbit ) 〈4-2〉

故value值與電壓V之關係為

511 value V times= 〈4-3〉

所以encoder之頻率與value值的關係為

頻率= 2000times ⎟⎠⎞

⎜⎝⎛ times

511 value - 160 〈4-4〉

故目前轉速為

sspeed = ( )rpm 60 200

times頻率 〈4-5〉

另ㄧ方面在主程式中程式會先去檢查鍵值也就等於檢查輸入指令以

找出符合使用的歸屬函數並將AD所獲得的轉速對應到歸屬函數中然後執行

決策判斷即進入規則庫中尋找出適當的決策判斷最後將此決策送入PWM程

式裡進行脈寬長度的調整使馬達在合理的要求下達到理想的轉速控制不會

因為外在環境的影響而使馬達轉速受到干擾

43 LCD 顯示轉速

此專題最後再增加一LCD顯示幕以顯示目前的轉速否則在程式設計完成

後人卻因無法以肉眼得知目前轉速而不能肯定馬達轉速是否有達到控制的目

標因此增加一顯示幕LCD是有必要的不僅隨時得知目前的轉速還能知道

44

設計出來的軟體其控制性是否夠好夠穩定

431 LCD 顯示幕之軟體流程

Start

設定LCD模組的初始狀態

設定外部中斷INTR0

與Timer0

設定TH0 = (65536 ndash 5000) 256 TL0 = (65536 ndash 5000)256

令ADCWR = 0 ADCWR = 1 AD開始轉換

等待中斷

外部中斷副程式

ADCRD = 0 讀取AD值 ADCRD = 1

將AD值換算成速度

ADCWR = 0 ADCWR = 1 AD開始轉換

Timer0中斷副程式

顯示LCD第一行

ldquoMotor Speed =

顯示LCD第二行ldquoxxxxxxx rpm其中 xxxxxx為外部中斷副程式所換算出的轉速

重設TH0與TL0

返回主程式返回主程式

圖 410 LCD 顯示幕之程式流程圖

此程式主要由兩個部分完成一為外部中斷副程式另ㄧ為 Timer0 中斷副

程式當主程式完成外部與 Timer0 兩個中斷的設定後隨即命令 AD 開始轉換

之後便一直停在 while〈1〉的迴圈裡不做任何動作而由兩個中斷副程式來完

成整個轉換與顯示的工作

45

外部中斷副程式主要負責 AD 的轉換讀取與轉速換算的工作AD 第一

次的轉換由主程式來下達命令當轉換完成後AD 的 INTR 接腳將觸發外部中

斷〈INTR0〉副程式此時程式便進入外部中斷副程式執行讀取 AD 值與轉速

換算的工作當這些工作完成時外部中斷副程式再次下達 AD 開始轉換的命

令而離開中斷副程式當 AD 再次轉換完成時又將再次執行中斷副程式

如此週而復始中斷副程式將ㄧ直進行讀取換算與轉換的工作

而 Timer0 中斷副程式主要負責 LCD 顯示之工作當主程式所設定的計時時

間計數完時程式便進入 Timer0 中斷副程式一旦進入 Timer0 中斷副程式程

式將執行 LCD 的顯示然後再重設 Timer0 的計數時間Timer0 將重新計數當

計數完時程式又將再度進入 Timer0 中斷副程式執行因為程式中並無清除

Timer0 的中斷致能故 Timer0 中斷副程式和外部中斷副程式ㄧ樣週而復始的

執行其副程式的工作

46

第五章 結論

本計劃主旨為具模糊控制理論與雙脈寬調變法之直流馬達驅動電路設計主

要是針對傳統電路設計之缺點提出改良之方法以TPWM取代PWM電路以模

糊理論基礎設計之控制器替代傳統PID控制器

TPWM轉速控制優於PWM之處在於

1 TPWM只需使用單電源即可達到正轉和逆轉的轉速控制而PWM必須

加上逆向開關或是雙電源才能使馬達產生正轉和逆轉

2 TPWM可控制馬達處於停止狀態無論在正向或逆向加上負載皆無法使

馬達產生轉動

3 馬達消耗定額功率輸出轉矩為額定值

4 馬達由停止到某定轉速時反應時間較快

模糊控制器優於PID控制器

1 不須導出繁雜的數學模型

2 適用於非線性系統

3 強健性與容錯性較高

本專題至此雖說大致的目標都已達到但是此系統仍然有許多不完美而需要

改進的地方例如在實驗過程中發現整個轉速的控制在回授上其反應時間

有點慢探討其原因有可能是控制器之程式上的問題

1 因為使用C語言撰寫程式故其執行速度較慢

2 程式可能寫的太累贅

3 模糊控制規則庫建立不良

若想改善這些問題可以嘗試著將C語言改為組合語言來撰寫並盡量減少

47

不必要的指令相信此動作一定能大大提昇程式的執行速度其次就是多做測

試利用測試中所學到的經驗來幫助模糊控制規則庫的改寫同時也能從測試中

發現更多的問題若是都能對問題加以一一解決的話相信必定能將此控制系統

做的更盡善盡美

48

參考文獻

﹝1﹞ 李適中直流馬達速度控制伺服控制〈基礎篇〉全華科技圖書股份有

限公司民 74

﹝2﹞ 廖錦文ldquo直流電動機之雙脈寬調變是〈TPWM〉驅動電路研究電

子技術月刊第 69 期pp94-1021992

﹝3﹞ 楊英魁孫宗瀛鄭魁香林建德蔣旭堂模糊控制理論與技術全華

科技圖書股份有限公司民 85

﹝4﹞ 林敦煌陳憬德直流馬達定位及轉速的模糊控制逢甲大學自動控制工

程學系學士論文民 87

﹝5﹞ LAZadehldquo Fuzzy Sets Information and Control Vol8 pp338-353

1965

﹝6﹞ EHMamdani and SAsslianldquo A fuzzy logic controller for a dynamic

plant Internation Journal of Man-Machine Studies Vol7 pp1-13 1975

﹝7﹞ 孫宗瀛楊英魁Fuzzy 控制理論實作與應用全華科技圖書股份有

限公司民 83 年

﹝8﹞ 許中平黃煌嘉直流電動機控制電路設計全華科技圖書股份有限公司

民 75

﹝9﹞ 盧明智黃敏祥OP Amp 應用+實驗模擬全華科技圖書股份有限公司

民 83

﹝10﹞陳文耀電動機控制工程復文書局2003

﹝11﹞許中平林全福電動機運轉控制技術全華科技圖書股份有限公司民

77

﹝12﹞楊明豐8051 單晶片 C 語言設計實務碁峯資訊2003 年

﹝13﹞蔡朝洋單晶片微電腦 80518951 原理與應用全華科技圖書股份有限公

司民 91

49

﹝14﹞王文俊認識 Fuzzy全華科技圖書股份有限公司民 90

50

附錄 A 專題硬體展示圖

圖 A-1 硬體整體圖

圖 A-2 硬體整體鳥瞰圖

51

圖 A-3 硬體側視圖

圖 A-4 操作與顯示面板

圖 A-5 間距脈波電路與 FV 電路

52

圖 A-6 橋型驅動功率放大電路

圖 A-7 操作與控制面板

53

附錄 B PWM 與模糊控制之程式

include reg51h include stdioh sbit ADCRD = P3^1 設定 RD 控制線接腳為 P31 sbit ADCWR = P3^3 設定 WR 控制線接腳為 P33 sbit P2_0 = 0xA0 接腳定義 sbit P2_1 = 0xA1 接腳定義 sbit P3_0 = 0xB0 接腳定義 sbit P3_1 = 0xB1 接腳定義 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P3_6 = 0xB6 接腳定義 void KeyStatus(void) 函數原型宣告 void feedback(void) 函數原型宣告 void compute_grade(void) 函數原型宣告 void delay1ms(int count) 函數原型宣告 void convert() 函數原型宣告 void condition() 函數原型宣告 void CW(void) 函數原型宣告 int j i 對應 PWM 的寬度 unsigned int temp 所設計的計時器時間 int sample = 1000 取樣率設定消除顯示值跳動 long int value r1 讀取 ADC0804 數位資料 long int set n condition select long int r grade_reg[2] grade[15] error1 error2 long int a1 b1 I long int membership[5][3]membership1[3][3] 定義歸屬函數 long int membership2[3][3] = -10-50-5050510 long int error[2] int Rule[15][3] = 113213313 定義判斷規則庫 212223323 311232333 411241342 511251351

54

main() 主程式 j = PWM = 110 設定 PWM 初始值 IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x00 設定計時器 0 工作於模式 0 temp=8192-j4 設定計時器 0 初值 TH0 = temp 32 TL0 = temp 32 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 P3_4 = 1 P3_5 = 0 P3_6 = 0 ADCWR = 0 令 ADC0804 的 WR = 0 ADCWR = 1 令 ADC0804 的 WR = 1 while (1) KeyStatus() 檢查鍵值 void KeyStatus(void) 檢查鍵值並給對應的 PWM 值 char KeyScan(void) 按鍵掃描函數宣告 unsigned char KeyStatus unsigned char Key = 0 KeyStatus=KeyScan() 呼叫按鍵掃描函數 if (KeyStatus = 0) 已有按鍵輸入 Key = KeyStatus Key = 鍵值 if (Key == 0x01) 假如輸入為按鍵 1 i = 110 PWM 為 110us j = i P3_4 = 1 LED 亮第一顆〈表馬達停止〉 P3_5 = 0 P3_6 = 0

55

else if (Key == 0x02 ) 假如輸入為按鍵 2 i = 140 PWM 為 140us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x04 ) 假如輸入為按鍵 3 i = 180 PWM 為 180us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x08 ) 假如輸入為按鍵 4 i = 80 PWM 為 80us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 else if (Key == 0x10 ) 假如輸入為按鍵 5 i = 40 PWM 為 40us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 PWM = j delay1ms(10) 呼叫延遲函數 feedback() 模糊控制判斷

56

void To_int(void) interrupt 1 Timer0 中斷函數 if (P3_0 == 0) 假如 PWM 輸出為 Low P3_0 = 1 變更 PWM 輸出為 High temp=8192-j4 設定 High 的時間 else 若 PWM 輸出為 High P3_0 = 0 變更 PWM 輸出為 Low temp=8192-880+j4 設定 Low 的時間 TH0 = temp 32 Timer0 的計時時間 TL0 = temp 32 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 char KeyScan(void) 檢查鍵值 char KeyStatus 按鍵狀態 P0=0xff 設定 P0 為輸入模式 KeyStatus=~P0 讀取按鍵狀態 return(KeyStatus) 將鍵值送回程式 void feedback(void) 模糊判斷 void Fuzzycontroller() 函數原型宣告 void condition1() 函數原型宣告

57

void condition2() 函數原型宣告 error1 = ((value)40-160)03 輸入變數 1 delay10ms(10) 延遲 10ms error2 = ((value)40-160)03 輸入變數 2 if (key == 0x01 ) 當按鍵 1找出對應的歸屬函數 並做出模糊控制判斷

int membership[5][3]= -100-60-30-60-300-30030030603060100

int membership1[3][3]=-100-500-50050050100 Fuzzycontroller() condition() if (key == 0x02 ) 當按鍵 2找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

05010050100150100150200150200250200250300 int membership1[3][3]=07515075150225150225300 Fuzzycontroller() condition() else if (key == 0x04) 當按鍵 3找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

200320400300400500400500600500600700600700800 int membership1[3][3]=220370520370520670520670820 Fuzzycontroller() condition() else if (key == 0x08) 當按鍵 4找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

02550255010050100200100200300200300400 int membership1[3][3]=05010050100250100250400 Fuzzycontroller() condition()

58

else if (key == 0x10) 當按鍵 5找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

150250350250350450350450550450550650550650750 int membership1[3][3]=150300450300450600450600750 Fuzzycontroller() condition2() void Fuzzycontroller() 模糊控制判斷 void compute_grade() 函數原型宣告 void compute_grade1() 函數原型宣告 a1 = 0 b1 = 001 I = 0 for (n=0 nlt=14 n++) r = error1 set = Rule[n][0]-1 compute_grade() 計算輸入變數 1 與

模糊程度的歸屬函數 condition = 1 r = error2 set = Rule[n][1]-1 compute_grade1() 計算輸入變數 2 與 模糊程度的歸屬函數 grade[n] = MIN(grade_reg[0] grade_reg[1]) a1 = a1 + (grade[n]membership2[Rule[n][2]-1][1]) b1 = b1 + grade[n] I = a1 b1 得到模糊控制判斷的結果 void compute_grade() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership[set][0]) || (r gt membership[set][2])) 當輸入變數不在 歸屬函數內

59

grade_reg[condition] = 0 else if ((r gt membership[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership[set][2]-r) (membership[set][2] - membership[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership[set][0]) (membership[set][1] - membership[set][0]) void compute_grade1() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership1[set][0]) || (r gt membership1[set][2])) 當輸入變數不在 歸屬函數內 grade_reg[condition] = 0 else if ((r gt membership1[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership1[set][2]-r) (membership1[set][2]-membership1[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership1[set][0]) (membership1[set][1]-membership1[set][0])

60

void condition() P2_0 = 1 設定 P20 為輸入模式 P2_1 = 1 設定 P21 為輸入模式 if ( (P2_0 == 1) ampamp (P2_1 == 0)) 當馬達為正轉時 if ( I gt 0 ) 若模糊判斷結果為正 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 若模糊判斷結果為零 PWM = PWM + 0 PWM 寬度不變 if ( I lt 0 ) 若模糊控制結果小於零 PWM = PWM + 1 PWM 寬度加 1 else if ( (P2_0 == 0) ampamp (P2_1 == 1) ) 若馬達為反轉 if ( I lt 0 ) 模糊控制小於零 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 模糊控制等於零 PWM = PWM + 0 PWM 寬度不變 if ( I gt 0 ) 模糊控制大於零 PWM = PWM + 1 PWM 寬度加 1 CW() 判斷 PWM 寬度上下限

61

void CW() 判斷 PWM 寬度上下限 if ( PWM gt= 215 ) 若 PWM 寬度 gt= 最大寬度 j = 215 PWM 寬度維持於 215us if ( PWM lt= 5 ) 若 PWM 寬度 lt= 最小寬度 j = 5 PWM 寬度維持在 5us if ( PWM gt 5 ampamp PWM lt 215 ) PWM 寬度介於最大與最小間 j = PWM PWM 依模糊控制判斷結果增減 void delay1ms(int count) 延遲 1ms int x y for ( x = 0 x lt count x++ ) for ( y = 0 y lt 122 y++ ) void convert() 數位資料換算成馬達轉速 r1 = ((value)40)-160

62

附錄 C LCD 顯示之程式

includereg51h 含 8051 所有暫存器宣告 include mathh define RS P3_5 LCD 指令資料選擇控制 define RW P3_4 LCD 讀寫控制腳 define Enable P3_3 LCD 致能接腳 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P0_0 = 0x80 接腳定義 sbit P0_1 = 0x81 接腳定義 sbit P0_2 = 0x82 接腳定義 sbit P0_3 = 0x83 接腳定義 sbit P0_4 = 0x84 接腳定義 sbit P0_5 = 0x85 接腳定義 sbit P0_6 = 0x86 接腳定義 sbit ADCRD = P3^7 設定 RD 控制線接腳為 P37 sbit ADCWR = P3^6 設定 WR 控制線接腳為 P36 void delay(void) 函數原型宣告 void delay10ms(int count) 函數原型宣告 void display(void) 函數原型宣告 void InitialLCD(void) 函數原型宣告 void WriteIns(char) 函數原型宣告 void WriteData(char) 函數原型宣告 void WriteString(charchar) 函數原型宣告 void CheckBusy(void) 函數原型宣告 void convert(void) 函數原型宣告 char MSG0[] = Motor Speed = 定義字串 MSG0 char MSG2[] = rpm 定義字串 MSG2 unsigned char MSG1[8]=0000000 定義字串 MSG1 unsigned long int value 讀取 ADC0804 數位資料 int sample = 1000 取樣率設定消除顯示值跳動 long int rpm

63

main() 主程式 InitialLCD() 初始化 LCD IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x01 設定計時器 0 工作於模式 1 TH0 = (65536-5000)256 設定計時器 0 初值 TL0 = (65536-5000)256 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 while(1) 等待中斷 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 while (--sample == 0) 取樣率減 1 sample = 1000 重設取樣率 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 void T0_int(void) interrupt 1 LCD 顯示動態掃描 display() 動態掃描顯示 TH0 = (65536-65535)256 重設計時初值 TL0 = (65536-65535)256

64

void InitialLCD(void) 設定 LCD 模組初始狀態 delay() 延遲函數 WriteIns(0x38) 設定 LCD 模組為 WriteIns(0x38) 2 行顯示 WriteIns(0x38) 8 位元介面 WriteIns(0x38) 5x7 點字型 WriteIns(0x08) 關閉顯示器 WriteIns(0x01) 清除 LCD 螢幕 WriteIns(0x0c) 令顯示器 ON但游標不顯示 WriteIns(0x06) 令 LCD 模組每接收到 1Byte 資料 AC 值自動加 1 void display() 掃描顯示 WriteIns(0x80) 設定 LCD 座標 WriteString(13MSG0) 將字串 MSG0 寫入 LCD 中 WriteIns(0xc0) 設定 LCD 座標 WriteString(8MSG1) 將字串 MSG1 寫入 LCD 中 WriteIns(0xc8) 設定 LCD 座標 WriteString(4MSG2) 將字串 MSG2 寫入 LCD 中 void convert(void) 換算轉速 long int freq freq = ((value)4000) - 16000 數位資料換成頻率公式 rpm = freq3 頻率換算轉速公式 MSG1[0] = (rpm1000000)+0x30 將結果存入字串 MSG1 中 MSG1[1] = ((rpm1000000)100000)+0x30 MSG1[2] = ((rpm100000)10000)+0x30 MSG1[3] = ((rpm10000)1000)+0x30 MSG1[4] = 0x2e MSG1[5] = ((rpm1000)100)+0x30 MSG1[6] = ((rpm100)10)+0x30 MSG1[7] = rpm10+0x30

65

void WriteIns(char instruction) 寫命令至 LCD 中 RS = 0 選擇指令暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = instruction 輸出命令至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteData(char i) 寫資料至 LCD 中 RS = 1 選擇資料暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = i 輸出資料至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteString(countMSG) 寫字串至 LCD 中 char count 字串長度 char MSG[] 字串資料 char i 定義位元組變數 for(i=0 iltcount i++) count 個位元組 WriteData(MSG[i]) 寫入一位元組的資料至 LCD 中 void CheckBusy(void) char i=0x80 檢查忙碌旗標 while(iamp0x80) 忙錄旗標 BF = 1 RS = 0 選擇指令暫存器 RW = 1 讀取 Enable = 1 致能 LCD i = P2 讀取 LCD 指令暫存器內的資料

66

Enable = 0 除能 LCD delay() 延遲函數 void delay() 延遲 5ms int i for(i=0 ilt250 i++)

  • 畢業專題封面pdf
  • File0004pdf
  • 最終版pdfpdf
Page 45: Based on Fuzzy Control Theorem and TPWM Method for DC ... · 使吾人想設計一模糊控制器來做為馬達轉速的閉迴路控制,以解決非線性系統的 問題。除此之外,flcs

36

第四章 軟體規劃與製作

41 PWM 之軟體設計

因為之前所介紹的硬體方式是以調整可變電阻來達到轉速的調整因此無法

得知所給予的脈寬長度和轉速大小尤其在回授時也不易給予適當的訊號來調整

轉速因此改良之方法就是以8051之軟體撰寫方式來產生固定的脈寬也就等

於給予轉速的命令而在其回授控制時也只要在內部程式给予適當的指令便可

達到脈寬長度的調整以達到閉迴路之受控系統

411 PWM 軟體流程

設定Timer0模式為0

TH0 = temp 32 TL0 = temp 32

temp = 8192 ndash j4 Key = 0

檢查是否有鍵值

將鍵值存入Key

Yes

No

設定Key值所對應的 j值

If P30 == 1Then P30 = 0 temp = 8192 ndash j4Else P30 = 1 temp=8192ndash880+j4

TH0 = temp 32 TL0 = temp 32

Start Timer0中斷副程式

啟動Timer0

等待Timer0中斷

返回主程式

圖 41 PWM 軟體設計流程圖

37

在此總共設計了五個按鈕分別代表不同的轉速停止正轉〈慢〉正轉

〈快〉逆轉〈慢〉和逆轉〈快〉使用Timer0是因為8051之計時中斷比延遲程

式來的準確故可以達到準確的計時程式設計理念中並沒有將中斷致能清除

因此Timer0會一直處於計時的狀態程式執行時將一邊檢查鍵值〈KeyStatus〉一

邊進行計時當計時完畢便呼叫中斷副程式然後執行改變Port 30的輸出狀

態若是為high則變為low反之若是為low即變為high同時並重設計時時間

Timer0繼續計時

當鍵值改變時計時的時間也會跟著改變如此一來Timer0將ㄧ直重覆上

述動作直到電源切掉Timer0才會停止計時

42 模糊控制之程式規劃與撰寫

本專題目標在完成了先前所規劃的硬體電路之後接著就是要達成利用模糊

控制理論來設計控制器在此採用了單晶片8051目的是為了以硬體實現方式來

代替電腦模擬期望能夠按照原訂計畫完成本專題「具模糊控制理論與雙脈寬調

變法之直流馬達驅動電路設計」

單晶片 8051 模糊控制的程式撰寫採下列幾個步驟依序完成

1 設定變數轉速誤差〈dspeed〉目前轉速〈sspeed〉

2 模糊化採用三角形歸屬函數採用三角形歸屬函數的原因

〈1〉 三角形函數為一連續函數

〈2〉 三角形函數為線性的函數所以計算速度較快

〈3〉 是具有發散也有收斂的函數和指數函數一樣接近

事實

3 模糊推論模糊規則將其所有可能發生情況以 IFhellipTHENhellip表示

並建立控制規則表

4 解模糊化採用重心法

38

421 歸屬函數

設定變數為目前轉速〈sspeed〉與轉速誤差〈dspeed〉因此此模糊控制器共

有兩個輸入訊號與一輸出訊號輸出訊號為脈寬長度該加或是減多少又因為有

五種不同的轉速因此各分別設計了不同的歸屬函數如下

1 當轉速 = 0

ml h

s s p e e d

d s p e e d

r p m0 5 0 1 0 0- 5 0- 1 0 0

mv l l h v h

r p m0- 3 0- 6 0- 1 0 0 3 0 6 0 1 0 0 圖 42 停止時之歸屬函數

2 正轉〈慢〉

ml hsspeed

dspeed

rpm150 225 300750

mvl l h vh

rpm150100500 200 250 300

圖 43 正轉〈慢〉之歸屬函數

39

3 正轉〈快〉

ml hsspeed

dspeed

rpm520 670 820370220

mvl l h vh

rpm500400300200 600 700 800

圖 44 正轉〈快〉之歸屬函數

4 逆轉〈慢〉

ml hsspeed

dspeed

rpm100 250 400500

mvl l h vh

rpm10050250 200 300 400 圖 45 逆轉〈慢〉之歸屬函數

40

5 逆轉〈快〉

ml hsspeed

dspeed

rpm300 450 600150

mvl l h vh

rpm450350250150 550 650 750

750

圖 46 逆轉〈快〉之歸屬函數

6 輸出

OutputMVL L H VH

rpm0-50-150-250 50 150 250

圖 47 輸出之歸屬函數

41

422 模糊規則庫

表 41 為吾人所設計的模糊控制規則庫並利用 Matlab 之 Fuzzy ToolBox 來

建立此規則庫以進行模擬推論圖 48 為當馬達輸入指令為正轉慢時推論後所得

到的三維空間圖

表 41 模糊控制規則表

Dspeed

vl l m h vh

l H M L VL VL

m VH H M L VL sspeed

h VH VH H M L

圖 48 推論後的三維空間圖

42

423 模糊控制器之軟體設計流程

Start 外部中斷副程式

ADCWR = 0 ADCWR = 1

〈令AD開始轉換〉

檢查鍵值以得到對應的歸屬函數

取得目前轉速與

轉速誤差

Fuzzy Rules決策

得到輸出訊號

Delay 10ms

ADC = 0 讀取AD值 ADCRD = 0

將AD值換算成轉速

ADCWR = 0 ADCWR = 1

〈AD開始轉換〉

返回主程式

致能外部中斷

圖 49 Fuzzy Controller 程式流程圖

當控制器一開始動作時便先執行AD轉換的工作當AD轉換完成時其

INTR的接腳便會觸發8051的外部中斷INTR0於是程式便發生外部中斷執行

外部中斷副程式的指令

43

在外部中斷副程式中AD將ㄧ直進行轉換與讀取的工作同時並將轉換後

的值直接換算成目前轉速與轉速誤差以供模糊控制器使用換算目前encoder

的頻率其公式為

160-V2000 times=頻率 〈4-1〉

式4-1之公式是根據表31所導出來的其中V為encoder之頻率轉成電壓之值

又假設所讀取的AD轉換值為value因為

AD的解析度 = bit256

5V+ = 511 ( Vbit ) 〈4-2〉

故value值與電壓V之關係為

511 value V times= 〈4-3〉

所以encoder之頻率與value值的關係為

頻率= 2000times ⎟⎠⎞

⎜⎝⎛ times

511 value - 160 〈4-4〉

故目前轉速為

sspeed = ( )rpm 60 200

times頻率 〈4-5〉

另ㄧ方面在主程式中程式會先去檢查鍵值也就等於檢查輸入指令以

找出符合使用的歸屬函數並將AD所獲得的轉速對應到歸屬函數中然後執行

決策判斷即進入規則庫中尋找出適當的決策判斷最後將此決策送入PWM程

式裡進行脈寬長度的調整使馬達在合理的要求下達到理想的轉速控制不會

因為外在環境的影響而使馬達轉速受到干擾

43 LCD 顯示轉速

此專題最後再增加一LCD顯示幕以顯示目前的轉速否則在程式設計完成

後人卻因無法以肉眼得知目前轉速而不能肯定馬達轉速是否有達到控制的目

標因此增加一顯示幕LCD是有必要的不僅隨時得知目前的轉速還能知道

44

設計出來的軟體其控制性是否夠好夠穩定

431 LCD 顯示幕之軟體流程

Start

設定LCD模組的初始狀態

設定外部中斷INTR0

與Timer0

設定TH0 = (65536 ndash 5000) 256 TL0 = (65536 ndash 5000)256

令ADCWR = 0 ADCWR = 1 AD開始轉換

等待中斷

外部中斷副程式

ADCRD = 0 讀取AD值 ADCRD = 1

將AD值換算成速度

ADCWR = 0 ADCWR = 1 AD開始轉換

Timer0中斷副程式

顯示LCD第一行

ldquoMotor Speed =

顯示LCD第二行ldquoxxxxxxx rpm其中 xxxxxx為外部中斷副程式所換算出的轉速

重設TH0與TL0

返回主程式返回主程式

圖 410 LCD 顯示幕之程式流程圖

此程式主要由兩個部分完成一為外部中斷副程式另ㄧ為 Timer0 中斷副

程式當主程式完成外部與 Timer0 兩個中斷的設定後隨即命令 AD 開始轉換

之後便一直停在 while〈1〉的迴圈裡不做任何動作而由兩個中斷副程式來完

成整個轉換與顯示的工作

45

外部中斷副程式主要負責 AD 的轉換讀取與轉速換算的工作AD 第一

次的轉換由主程式來下達命令當轉換完成後AD 的 INTR 接腳將觸發外部中

斷〈INTR0〉副程式此時程式便進入外部中斷副程式執行讀取 AD 值與轉速

換算的工作當這些工作完成時外部中斷副程式再次下達 AD 開始轉換的命

令而離開中斷副程式當 AD 再次轉換完成時又將再次執行中斷副程式

如此週而復始中斷副程式將ㄧ直進行讀取換算與轉換的工作

而 Timer0 中斷副程式主要負責 LCD 顯示之工作當主程式所設定的計時時

間計數完時程式便進入 Timer0 中斷副程式一旦進入 Timer0 中斷副程式程

式將執行 LCD 的顯示然後再重設 Timer0 的計數時間Timer0 將重新計數當

計數完時程式又將再度進入 Timer0 中斷副程式執行因為程式中並無清除

Timer0 的中斷致能故 Timer0 中斷副程式和外部中斷副程式ㄧ樣週而復始的

執行其副程式的工作

46

第五章 結論

本計劃主旨為具模糊控制理論與雙脈寬調變法之直流馬達驅動電路設計主

要是針對傳統電路設計之缺點提出改良之方法以TPWM取代PWM電路以模

糊理論基礎設計之控制器替代傳統PID控制器

TPWM轉速控制優於PWM之處在於

1 TPWM只需使用單電源即可達到正轉和逆轉的轉速控制而PWM必須

加上逆向開關或是雙電源才能使馬達產生正轉和逆轉

2 TPWM可控制馬達處於停止狀態無論在正向或逆向加上負載皆無法使

馬達產生轉動

3 馬達消耗定額功率輸出轉矩為額定值

4 馬達由停止到某定轉速時反應時間較快

模糊控制器優於PID控制器

1 不須導出繁雜的數學模型

2 適用於非線性系統

3 強健性與容錯性較高

本專題至此雖說大致的目標都已達到但是此系統仍然有許多不完美而需要

改進的地方例如在實驗過程中發現整個轉速的控制在回授上其反應時間

有點慢探討其原因有可能是控制器之程式上的問題

1 因為使用C語言撰寫程式故其執行速度較慢

2 程式可能寫的太累贅

3 模糊控制規則庫建立不良

若想改善這些問題可以嘗試著將C語言改為組合語言來撰寫並盡量減少

47

不必要的指令相信此動作一定能大大提昇程式的執行速度其次就是多做測

試利用測試中所學到的經驗來幫助模糊控制規則庫的改寫同時也能從測試中

發現更多的問題若是都能對問題加以一一解決的話相信必定能將此控制系統

做的更盡善盡美

48

參考文獻

﹝1﹞ 李適中直流馬達速度控制伺服控制〈基礎篇〉全華科技圖書股份有

限公司民 74

﹝2﹞ 廖錦文ldquo直流電動機之雙脈寬調變是〈TPWM〉驅動電路研究電

子技術月刊第 69 期pp94-1021992

﹝3﹞ 楊英魁孫宗瀛鄭魁香林建德蔣旭堂模糊控制理論與技術全華

科技圖書股份有限公司民 85

﹝4﹞ 林敦煌陳憬德直流馬達定位及轉速的模糊控制逢甲大學自動控制工

程學系學士論文民 87

﹝5﹞ LAZadehldquo Fuzzy Sets Information and Control Vol8 pp338-353

1965

﹝6﹞ EHMamdani and SAsslianldquo A fuzzy logic controller for a dynamic

plant Internation Journal of Man-Machine Studies Vol7 pp1-13 1975

﹝7﹞ 孫宗瀛楊英魁Fuzzy 控制理論實作與應用全華科技圖書股份有

限公司民 83 年

﹝8﹞ 許中平黃煌嘉直流電動機控制電路設計全華科技圖書股份有限公司

民 75

﹝9﹞ 盧明智黃敏祥OP Amp 應用+實驗模擬全華科技圖書股份有限公司

民 83

﹝10﹞陳文耀電動機控制工程復文書局2003

﹝11﹞許中平林全福電動機運轉控制技術全華科技圖書股份有限公司民

77

﹝12﹞楊明豐8051 單晶片 C 語言設計實務碁峯資訊2003 年

﹝13﹞蔡朝洋單晶片微電腦 80518951 原理與應用全華科技圖書股份有限公

司民 91

49

﹝14﹞王文俊認識 Fuzzy全華科技圖書股份有限公司民 90

50

附錄 A 專題硬體展示圖

圖 A-1 硬體整體圖

圖 A-2 硬體整體鳥瞰圖

51

圖 A-3 硬體側視圖

圖 A-4 操作與顯示面板

圖 A-5 間距脈波電路與 FV 電路

52

圖 A-6 橋型驅動功率放大電路

圖 A-7 操作與控制面板

53

附錄 B PWM 與模糊控制之程式

include reg51h include stdioh sbit ADCRD = P3^1 設定 RD 控制線接腳為 P31 sbit ADCWR = P3^3 設定 WR 控制線接腳為 P33 sbit P2_0 = 0xA0 接腳定義 sbit P2_1 = 0xA1 接腳定義 sbit P3_0 = 0xB0 接腳定義 sbit P3_1 = 0xB1 接腳定義 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P3_6 = 0xB6 接腳定義 void KeyStatus(void) 函數原型宣告 void feedback(void) 函數原型宣告 void compute_grade(void) 函數原型宣告 void delay1ms(int count) 函數原型宣告 void convert() 函數原型宣告 void condition() 函數原型宣告 void CW(void) 函數原型宣告 int j i 對應 PWM 的寬度 unsigned int temp 所設計的計時器時間 int sample = 1000 取樣率設定消除顯示值跳動 long int value r1 讀取 ADC0804 數位資料 long int set n condition select long int r grade_reg[2] grade[15] error1 error2 long int a1 b1 I long int membership[5][3]membership1[3][3] 定義歸屬函數 long int membership2[3][3] = -10-50-5050510 long int error[2] int Rule[15][3] = 113213313 定義判斷規則庫 212223323 311232333 411241342 511251351

54

main() 主程式 j = PWM = 110 設定 PWM 初始值 IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x00 設定計時器 0 工作於模式 0 temp=8192-j4 設定計時器 0 初值 TH0 = temp 32 TL0 = temp 32 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 P3_4 = 1 P3_5 = 0 P3_6 = 0 ADCWR = 0 令 ADC0804 的 WR = 0 ADCWR = 1 令 ADC0804 的 WR = 1 while (1) KeyStatus() 檢查鍵值 void KeyStatus(void) 檢查鍵值並給對應的 PWM 值 char KeyScan(void) 按鍵掃描函數宣告 unsigned char KeyStatus unsigned char Key = 0 KeyStatus=KeyScan() 呼叫按鍵掃描函數 if (KeyStatus = 0) 已有按鍵輸入 Key = KeyStatus Key = 鍵值 if (Key == 0x01) 假如輸入為按鍵 1 i = 110 PWM 為 110us j = i P3_4 = 1 LED 亮第一顆〈表馬達停止〉 P3_5 = 0 P3_6 = 0

55

else if (Key == 0x02 ) 假如輸入為按鍵 2 i = 140 PWM 為 140us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x04 ) 假如輸入為按鍵 3 i = 180 PWM 為 180us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x08 ) 假如輸入為按鍵 4 i = 80 PWM 為 80us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 else if (Key == 0x10 ) 假如輸入為按鍵 5 i = 40 PWM 為 40us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 PWM = j delay1ms(10) 呼叫延遲函數 feedback() 模糊控制判斷

56

void To_int(void) interrupt 1 Timer0 中斷函數 if (P3_0 == 0) 假如 PWM 輸出為 Low P3_0 = 1 變更 PWM 輸出為 High temp=8192-j4 設定 High 的時間 else 若 PWM 輸出為 High P3_0 = 0 變更 PWM 輸出為 Low temp=8192-880+j4 設定 Low 的時間 TH0 = temp 32 Timer0 的計時時間 TL0 = temp 32 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 char KeyScan(void) 檢查鍵值 char KeyStatus 按鍵狀態 P0=0xff 設定 P0 為輸入模式 KeyStatus=~P0 讀取按鍵狀態 return(KeyStatus) 將鍵值送回程式 void feedback(void) 模糊判斷 void Fuzzycontroller() 函數原型宣告 void condition1() 函數原型宣告

57

void condition2() 函數原型宣告 error1 = ((value)40-160)03 輸入變數 1 delay10ms(10) 延遲 10ms error2 = ((value)40-160)03 輸入變數 2 if (key == 0x01 ) 當按鍵 1找出對應的歸屬函數 並做出模糊控制判斷

int membership[5][3]= -100-60-30-60-300-30030030603060100

int membership1[3][3]=-100-500-50050050100 Fuzzycontroller() condition() if (key == 0x02 ) 當按鍵 2找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

05010050100150100150200150200250200250300 int membership1[3][3]=07515075150225150225300 Fuzzycontroller() condition() else if (key == 0x04) 當按鍵 3找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

200320400300400500400500600500600700600700800 int membership1[3][3]=220370520370520670520670820 Fuzzycontroller() condition() else if (key == 0x08) 當按鍵 4找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

02550255010050100200100200300200300400 int membership1[3][3]=05010050100250100250400 Fuzzycontroller() condition()

58

else if (key == 0x10) 當按鍵 5找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

150250350250350450350450550450550650550650750 int membership1[3][3]=150300450300450600450600750 Fuzzycontroller() condition2() void Fuzzycontroller() 模糊控制判斷 void compute_grade() 函數原型宣告 void compute_grade1() 函數原型宣告 a1 = 0 b1 = 001 I = 0 for (n=0 nlt=14 n++) r = error1 set = Rule[n][0]-1 compute_grade() 計算輸入變數 1 與

模糊程度的歸屬函數 condition = 1 r = error2 set = Rule[n][1]-1 compute_grade1() 計算輸入變數 2 與 模糊程度的歸屬函數 grade[n] = MIN(grade_reg[0] grade_reg[1]) a1 = a1 + (grade[n]membership2[Rule[n][2]-1][1]) b1 = b1 + grade[n] I = a1 b1 得到模糊控制判斷的結果 void compute_grade() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership[set][0]) || (r gt membership[set][2])) 當輸入變數不在 歸屬函數內

59

grade_reg[condition] = 0 else if ((r gt membership[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership[set][2]-r) (membership[set][2] - membership[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership[set][0]) (membership[set][1] - membership[set][0]) void compute_grade1() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership1[set][0]) || (r gt membership1[set][2])) 當輸入變數不在 歸屬函數內 grade_reg[condition] = 0 else if ((r gt membership1[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership1[set][2]-r) (membership1[set][2]-membership1[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership1[set][0]) (membership1[set][1]-membership1[set][0])

60

void condition() P2_0 = 1 設定 P20 為輸入模式 P2_1 = 1 設定 P21 為輸入模式 if ( (P2_0 == 1) ampamp (P2_1 == 0)) 當馬達為正轉時 if ( I gt 0 ) 若模糊判斷結果為正 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 若模糊判斷結果為零 PWM = PWM + 0 PWM 寬度不變 if ( I lt 0 ) 若模糊控制結果小於零 PWM = PWM + 1 PWM 寬度加 1 else if ( (P2_0 == 0) ampamp (P2_1 == 1) ) 若馬達為反轉 if ( I lt 0 ) 模糊控制小於零 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 模糊控制等於零 PWM = PWM + 0 PWM 寬度不變 if ( I gt 0 ) 模糊控制大於零 PWM = PWM + 1 PWM 寬度加 1 CW() 判斷 PWM 寬度上下限

61

void CW() 判斷 PWM 寬度上下限 if ( PWM gt= 215 ) 若 PWM 寬度 gt= 最大寬度 j = 215 PWM 寬度維持於 215us if ( PWM lt= 5 ) 若 PWM 寬度 lt= 最小寬度 j = 5 PWM 寬度維持在 5us if ( PWM gt 5 ampamp PWM lt 215 ) PWM 寬度介於最大與最小間 j = PWM PWM 依模糊控制判斷結果增減 void delay1ms(int count) 延遲 1ms int x y for ( x = 0 x lt count x++ ) for ( y = 0 y lt 122 y++ ) void convert() 數位資料換算成馬達轉速 r1 = ((value)40)-160

62

附錄 C LCD 顯示之程式

includereg51h 含 8051 所有暫存器宣告 include mathh define RS P3_5 LCD 指令資料選擇控制 define RW P3_4 LCD 讀寫控制腳 define Enable P3_3 LCD 致能接腳 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P0_0 = 0x80 接腳定義 sbit P0_1 = 0x81 接腳定義 sbit P0_2 = 0x82 接腳定義 sbit P0_3 = 0x83 接腳定義 sbit P0_4 = 0x84 接腳定義 sbit P0_5 = 0x85 接腳定義 sbit P0_6 = 0x86 接腳定義 sbit ADCRD = P3^7 設定 RD 控制線接腳為 P37 sbit ADCWR = P3^6 設定 WR 控制線接腳為 P36 void delay(void) 函數原型宣告 void delay10ms(int count) 函數原型宣告 void display(void) 函數原型宣告 void InitialLCD(void) 函數原型宣告 void WriteIns(char) 函數原型宣告 void WriteData(char) 函數原型宣告 void WriteString(charchar) 函數原型宣告 void CheckBusy(void) 函數原型宣告 void convert(void) 函數原型宣告 char MSG0[] = Motor Speed = 定義字串 MSG0 char MSG2[] = rpm 定義字串 MSG2 unsigned char MSG1[8]=0000000 定義字串 MSG1 unsigned long int value 讀取 ADC0804 數位資料 int sample = 1000 取樣率設定消除顯示值跳動 long int rpm

63

main() 主程式 InitialLCD() 初始化 LCD IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x01 設定計時器 0 工作於模式 1 TH0 = (65536-5000)256 設定計時器 0 初值 TL0 = (65536-5000)256 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 while(1) 等待中斷 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 while (--sample == 0) 取樣率減 1 sample = 1000 重設取樣率 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 void T0_int(void) interrupt 1 LCD 顯示動態掃描 display() 動態掃描顯示 TH0 = (65536-65535)256 重設計時初值 TL0 = (65536-65535)256

64

void InitialLCD(void) 設定 LCD 模組初始狀態 delay() 延遲函數 WriteIns(0x38) 設定 LCD 模組為 WriteIns(0x38) 2 行顯示 WriteIns(0x38) 8 位元介面 WriteIns(0x38) 5x7 點字型 WriteIns(0x08) 關閉顯示器 WriteIns(0x01) 清除 LCD 螢幕 WriteIns(0x0c) 令顯示器 ON但游標不顯示 WriteIns(0x06) 令 LCD 模組每接收到 1Byte 資料 AC 值自動加 1 void display() 掃描顯示 WriteIns(0x80) 設定 LCD 座標 WriteString(13MSG0) 將字串 MSG0 寫入 LCD 中 WriteIns(0xc0) 設定 LCD 座標 WriteString(8MSG1) 將字串 MSG1 寫入 LCD 中 WriteIns(0xc8) 設定 LCD 座標 WriteString(4MSG2) 將字串 MSG2 寫入 LCD 中 void convert(void) 換算轉速 long int freq freq = ((value)4000) - 16000 數位資料換成頻率公式 rpm = freq3 頻率換算轉速公式 MSG1[0] = (rpm1000000)+0x30 將結果存入字串 MSG1 中 MSG1[1] = ((rpm1000000)100000)+0x30 MSG1[2] = ((rpm100000)10000)+0x30 MSG1[3] = ((rpm10000)1000)+0x30 MSG1[4] = 0x2e MSG1[5] = ((rpm1000)100)+0x30 MSG1[6] = ((rpm100)10)+0x30 MSG1[7] = rpm10+0x30

65

void WriteIns(char instruction) 寫命令至 LCD 中 RS = 0 選擇指令暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = instruction 輸出命令至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteData(char i) 寫資料至 LCD 中 RS = 1 選擇資料暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = i 輸出資料至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteString(countMSG) 寫字串至 LCD 中 char count 字串長度 char MSG[] 字串資料 char i 定義位元組變數 for(i=0 iltcount i++) count 個位元組 WriteData(MSG[i]) 寫入一位元組的資料至 LCD 中 void CheckBusy(void) char i=0x80 檢查忙碌旗標 while(iamp0x80) 忙錄旗標 BF = 1 RS = 0 選擇指令暫存器 RW = 1 讀取 Enable = 1 致能 LCD i = P2 讀取 LCD 指令暫存器內的資料

66

Enable = 0 除能 LCD delay() 延遲函數 void delay() 延遲 5ms int i for(i=0 ilt250 i++)

  • 畢業專題封面pdf
  • File0004pdf
  • 最終版pdfpdf
Page 46: Based on Fuzzy Control Theorem and TPWM Method for DC ... · 使吾人想設計一模糊控制器來做為馬達轉速的閉迴路控制,以解決非線性系統的 問題。除此之外,flcs

37

在此總共設計了五個按鈕分別代表不同的轉速停止正轉〈慢〉正轉

〈快〉逆轉〈慢〉和逆轉〈快〉使用Timer0是因為8051之計時中斷比延遲程

式來的準確故可以達到準確的計時程式設計理念中並沒有將中斷致能清除

因此Timer0會一直處於計時的狀態程式執行時將一邊檢查鍵值〈KeyStatus〉一

邊進行計時當計時完畢便呼叫中斷副程式然後執行改變Port 30的輸出狀

態若是為high則變為low反之若是為low即變為high同時並重設計時時間

Timer0繼續計時

當鍵值改變時計時的時間也會跟著改變如此一來Timer0將ㄧ直重覆上

述動作直到電源切掉Timer0才會停止計時

42 模糊控制之程式規劃與撰寫

本專題目標在完成了先前所規劃的硬體電路之後接著就是要達成利用模糊

控制理論來設計控制器在此採用了單晶片8051目的是為了以硬體實現方式來

代替電腦模擬期望能夠按照原訂計畫完成本專題「具模糊控制理論與雙脈寬調

變法之直流馬達驅動電路設計」

單晶片 8051 模糊控制的程式撰寫採下列幾個步驟依序完成

1 設定變數轉速誤差〈dspeed〉目前轉速〈sspeed〉

2 模糊化採用三角形歸屬函數採用三角形歸屬函數的原因

〈1〉 三角形函數為一連續函數

〈2〉 三角形函數為線性的函數所以計算速度較快

〈3〉 是具有發散也有收斂的函數和指數函數一樣接近

事實

3 模糊推論模糊規則將其所有可能發生情況以 IFhellipTHENhellip表示

並建立控制規則表

4 解模糊化採用重心法

38

421 歸屬函數

設定變數為目前轉速〈sspeed〉與轉速誤差〈dspeed〉因此此模糊控制器共

有兩個輸入訊號與一輸出訊號輸出訊號為脈寬長度該加或是減多少又因為有

五種不同的轉速因此各分別設計了不同的歸屬函數如下

1 當轉速 = 0

ml h

s s p e e d

d s p e e d

r p m0 5 0 1 0 0- 5 0- 1 0 0

mv l l h v h

r p m0- 3 0- 6 0- 1 0 0 3 0 6 0 1 0 0 圖 42 停止時之歸屬函數

2 正轉〈慢〉

ml hsspeed

dspeed

rpm150 225 300750

mvl l h vh

rpm150100500 200 250 300

圖 43 正轉〈慢〉之歸屬函數

39

3 正轉〈快〉

ml hsspeed

dspeed

rpm520 670 820370220

mvl l h vh

rpm500400300200 600 700 800

圖 44 正轉〈快〉之歸屬函數

4 逆轉〈慢〉

ml hsspeed

dspeed

rpm100 250 400500

mvl l h vh

rpm10050250 200 300 400 圖 45 逆轉〈慢〉之歸屬函數

40

5 逆轉〈快〉

ml hsspeed

dspeed

rpm300 450 600150

mvl l h vh

rpm450350250150 550 650 750

750

圖 46 逆轉〈快〉之歸屬函數

6 輸出

OutputMVL L H VH

rpm0-50-150-250 50 150 250

圖 47 輸出之歸屬函數

41

422 模糊規則庫

表 41 為吾人所設計的模糊控制規則庫並利用 Matlab 之 Fuzzy ToolBox 來

建立此規則庫以進行模擬推論圖 48 為當馬達輸入指令為正轉慢時推論後所得

到的三維空間圖

表 41 模糊控制規則表

Dspeed

vl l m h vh

l H M L VL VL

m VH H M L VL sspeed

h VH VH H M L

圖 48 推論後的三維空間圖

42

423 模糊控制器之軟體設計流程

Start 外部中斷副程式

ADCWR = 0 ADCWR = 1

〈令AD開始轉換〉

檢查鍵值以得到對應的歸屬函數

取得目前轉速與

轉速誤差

Fuzzy Rules決策

得到輸出訊號

Delay 10ms

ADC = 0 讀取AD值 ADCRD = 0

將AD值換算成轉速

ADCWR = 0 ADCWR = 1

〈AD開始轉換〉

返回主程式

致能外部中斷

圖 49 Fuzzy Controller 程式流程圖

當控制器一開始動作時便先執行AD轉換的工作當AD轉換完成時其

INTR的接腳便會觸發8051的外部中斷INTR0於是程式便發生外部中斷執行

外部中斷副程式的指令

43

在外部中斷副程式中AD將ㄧ直進行轉換與讀取的工作同時並將轉換後

的值直接換算成目前轉速與轉速誤差以供模糊控制器使用換算目前encoder

的頻率其公式為

160-V2000 times=頻率 〈4-1〉

式4-1之公式是根據表31所導出來的其中V為encoder之頻率轉成電壓之值

又假設所讀取的AD轉換值為value因為

AD的解析度 = bit256

5V+ = 511 ( Vbit ) 〈4-2〉

故value值與電壓V之關係為

511 value V times= 〈4-3〉

所以encoder之頻率與value值的關係為

頻率= 2000times ⎟⎠⎞

⎜⎝⎛ times

511 value - 160 〈4-4〉

故目前轉速為

sspeed = ( )rpm 60 200

times頻率 〈4-5〉

另ㄧ方面在主程式中程式會先去檢查鍵值也就等於檢查輸入指令以

找出符合使用的歸屬函數並將AD所獲得的轉速對應到歸屬函數中然後執行

決策判斷即進入規則庫中尋找出適當的決策判斷最後將此決策送入PWM程

式裡進行脈寬長度的調整使馬達在合理的要求下達到理想的轉速控制不會

因為外在環境的影響而使馬達轉速受到干擾

43 LCD 顯示轉速

此專題最後再增加一LCD顯示幕以顯示目前的轉速否則在程式設計完成

後人卻因無法以肉眼得知目前轉速而不能肯定馬達轉速是否有達到控制的目

標因此增加一顯示幕LCD是有必要的不僅隨時得知目前的轉速還能知道

44

設計出來的軟體其控制性是否夠好夠穩定

431 LCD 顯示幕之軟體流程

Start

設定LCD模組的初始狀態

設定外部中斷INTR0

與Timer0

設定TH0 = (65536 ndash 5000) 256 TL0 = (65536 ndash 5000)256

令ADCWR = 0 ADCWR = 1 AD開始轉換

等待中斷

外部中斷副程式

ADCRD = 0 讀取AD值 ADCRD = 1

將AD值換算成速度

ADCWR = 0 ADCWR = 1 AD開始轉換

Timer0中斷副程式

顯示LCD第一行

ldquoMotor Speed =

顯示LCD第二行ldquoxxxxxxx rpm其中 xxxxxx為外部中斷副程式所換算出的轉速

重設TH0與TL0

返回主程式返回主程式

圖 410 LCD 顯示幕之程式流程圖

此程式主要由兩個部分完成一為外部中斷副程式另ㄧ為 Timer0 中斷副

程式當主程式完成外部與 Timer0 兩個中斷的設定後隨即命令 AD 開始轉換

之後便一直停在 while〈1〉的迴圈裡不做任何動作而由兩個中斷副程式來完

成整個轉換與顯示的工作

45

外部中斷副程式主要負責 AD 的轉換讀取與轉速換算的工作AD 第一

次的轉換由主程式來下達命令當轉換完成後AD 的 INTR 接腳將觸發外部中

斷〈INTR0〉副程式此時程式便進入外部中斷副程式執行讀取 AD 值與轉速

換算的工作當這些工作完成時外部中斷副程式再次下達 AD 開始轉換的命

令而離開中斷副程式當 AD 再次轉換完成時又將再次執行中斷副程式

如此週而復始中斷副程式將ㄧ直進行讀取換算與轉換的工作

而 Timer0 中斷副程式主要負責 LCD 顯示之工作當主程式所設定的計時時

間計數完時程式便進入 Timer0 中斷副程式一旦進入 Timer0 中斷副程式程

式將執行 LCD 的顯示然後再重設 Timer0 的計數時間Timer0 將重新計數當

計數完時程式又將再度進入 Timer0 中斷副程式執行因為程式中並無清除

Timer0 的中斷致能故 Timer0 中斷副程式和外部中斷副程式ㄧ樣週而復始的

執行其副程式的工作

46

第五章 結論

本計劃主旨為具模糊控制理論與雙脈寬調變法之直流馬達驅動電路設計主

要是針對傳統電路設計之缺點提出改良之方法以TPWM取代PWM電路以模

糊理論基礎設計之控制器替代傳統PID控制器

TPWM轉速控制優於PWM之處在於

1 TPWM只需使用單電源即可達到正轉和逆轉的轉速控制而PWM必須

加上逆向開關或是雙電源才能使馬達產生正轉和逆轉

2 TPWM可控制馬達處於停止狀態無論在正向或逆向加上負載皆無法使

馬達產生轉動

3 馬達消耗定額功率輸出轉矩為額定值

4 馬達由停止到某定轉速時反應時間較快

模糊控制器優於PID控制器

1 不須導出繁雜的數學模型

2 適用於非線性系統

3 強健性與容錯性較高

本專題至此雖說大致的目標都已達到但是此系統仍然有許多不完美而需要

改進的地方例如在實驗過程中發現整個轉速的控制在回授上其反應時間

有點慢探討其原因有可能是控制器之程式上的問題

1 因為使用C語言撰寫程式故其執行速度較慢

2 程式可能寫的太累贅

3 模糊控制規則庫建立不良

若想改善這些問題可以嘗試著將C語言改為組合語言來撰寫並盡量減少

47

不必要的指令相信此動作一定能大大提昇程式的執行速度其次就是多做測

試利用測試中所學到的經驗來幫助模糊控制規則庫的改寫同時也能從測試中

發現更多的問題若是都能對問題加以一一解決的話相信必定能將此控制系統

做的更盡善盡美

48

參考文獻

﹝1﹞ 李適中直流馬達速度控制伺服控制〈基礎篇〉全華科技圖書股份有

限公司民 74

﹝2﹞ 廖錦文ldquo直流電動機之雙脈寬調變是〈TPWM〉驅動電路研究電

子技術月刊第 69 期pp94-1021992

﹝3﹞ 楊英魁孫宗瀛鄭魁香林建德蔣旭堂模糊控制理論與技術全華

科技圖書股份有限公司民 85

﹝4﹞ 林敦煌陳憬德直流馬達定位及轉速的模糊控制逢甲大學自動控制工

程學系學士論文民 87

﹝5﹞ LAZadehldquo Fuzzy Sets Information and Control Vol8 pp338-353

1965

﹝6﹞ EHMamdani and SAsslianldquo A fuzzy logic controller for a dynamic

plant Internation Journal of Man-Machine Studies Vol7 pp1-13 1975

﹝7﹞ 孫宗瀛楊英魁Fuzzy 控制理論實作與應用全華科技圖書股份有

限公司民 83 年

﹝8﹞ 許中平黃煌嘉直流電動機控制電路設計全華科技圖書股份有限公司

民 75

﹝9﹞ 盧明智黃敏祥OP Amp 應用+實驗模擬全華科技圖書股份有限公司

民 83

﹝10﹞陳文耀電動機控制工程復文書局2003

﹝11﹞許中平林全福電動機運轉控制技術全華科技圖書股份有限公司民

77

﹝12﹞楊明豐8051 單晶片 C 語言設計實務碁峯資訊2003 年

﹝13﹞蔡朝洋單晶片微電腦 80518951 原理與應用全華科技圖書股份有限公

司民 91

49

﹝14﹞王文俊認識 Fuzzy全華科技圖書股份有限公司民 90

50

附錄 A 專題硬體展示圖

圖 A-1 硬體整體圖

圖 A-2 硬體整體鳥瞰圖

51

圖 A-3 硬體側視圖

圖 A-4 操作與顯示面板

圖 A-5 間距脈波電路與 FV 電路

52

圖 A-6 橋型驅動功率放大電路

圖 A-7 操作與控制面板

53

附錄 B PWM 與模糊控制之程式

include reg51h include stdioh sbit ADCRD = P3^1 設定 RD 控制線接腳為 P31 sbit ADCWR = P3^3 設定 WR 控制線接腳為 P33 sbit P2_0 = 0xA0 接腳定義 sbit P2_1 = 0xA1 接腳定義 sbit P3_0 = 0xB0 接腳定義 sbit P3_1 = 0xB1 接腳定義 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P3_6 = 0xB6 接腳定義 void KeyStatus(void) 函數原型宣告 void feedback(void) 函數原型宣告 void compute_grade(void) 函數原型宣告 void delay1ms(int count) 函數原型宣告 void convert() 函數原型宣告 void condition() 函數原型宣告 void CW(void) 函數原型宣告 int j i 對應 PWM 的寬度 unsigned int temp 所設計的計時器時間 int sample = 1000 取樣率設定消除顯示值跳動 long int value r1 讀取 ADC0804 數位資料 long int set n condition select long int r grade_reg[2] grade[15] error1 error2 long int a1 b1 I long int membership[5][3]membership1[3][3] 定義歸屬函數 long int membership2[3][3] = -10-50-5050510 long int error[2] int Rule[15][3] = 113213313 定義判斷規則庫 212223323 311232333 411241342 511251351

54

main() 主程式 j = PWM = 110 設定 PWM 初始值 IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x00 設定計時器 0 工作於模式 0 temp=8192-j4 設定計時器 0 初值 TH0 = temp 32 TL0 = temp 32 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 P3_4 = 1 P3_5 = 0 P3_6 = 0 ADCWR = 0 令 ADC0804 的 WR = 0 ADCWR = 1 令 ADC0804 的 WR = 1 while (1) KeyStatus() 檢查鍵值 void KeyStatus(void) 檢查鍵值並給對應的 PWM 值 char KeyScan(void) 按鍵掃描函數宣告 unsigned char KeyStatus unsigned char Key = 0 KeyStatus=KeyScan() 呼叫按鍵掃描函數 if (KeyStatus = 0) 已有按鍵輸入 Key = KeyStatus Key = 鍵值 if (Key == 0x01) 假如輸入為按鍵 1 i = 110 PWM 為 110us j = i P3_4 = 1 LED 亮第一顆〈表馬達停止〉 P3_5 = 0 P3_6 = 0

55

else if (Key == 0x02 ) 假如輸入為按鍵 2 i = 140 PWM 為 140us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x04 ) 假如輸入為按鍵 3 i = 180 PWM 為 180us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x08 ) 假如輸入為按鍵 4 i = 80 PWM 為 80us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 else if (Key == 0x10 ) 假如輸入為按鍵 5 i = 40 PWM 為 40us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 PWM = j delay1ms(10) 呼叫延遲函數 feedback() 模糊控制判斷

56

void To_int(void) interrupt 1 Timer0 中斷函數 if (P3_0 == 0) 假如 PWM 輸出為 Low P3_0 = 1 變更 PWM 輸出為 High temp=8192-j4 設定 High 的時間 else 若 PWM 輸出為 High P3_0 = 0 變更 PWM 輸出為 Low temp=8192-880+j4 設定 Low 的時間 TH0 = temp 32 Timer0 的計時時間 TL0 = temp 32 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 char KeyScan(void) 檢查鍵值 char KeyStatus 按鍵狀態 P0=0xff 設定 P0 為輸入模式 KeyStatus=~P0 讀取按鍵狀態 return(KeyStatus) 將鍵值送回程式 void feedback(void) 模糊判斷 void Fuzzycontroller() 函數原型宣告 void condition1() 函數原型宣告

57

void condition2() 函數原型宣告 error1 = ((value)40-160)03 輸入變數 1 delay10ms(10) 延遲 10ms error2 = ((value)40-160)03 輸入變數 2 if (key == 0x01 ) 當按鍵 1找出對應的歸屬函數 並做出模糊控制判斷

int membership[5][3]= -100-60-30-60-300-30030030603060100

int membership1[3][3]=-100-500-50050050100 Fuzzycontroller() condition() if (key == 0x02 ) 當按鍵 2找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

05010050100150100150200150200250200250300 int membership1[3][3]=07515075150225150225300 Fuzzycontroller() condition() else if (key == 0x04) 當按鍵 3找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

200320400300400500400500600500600700600700800 int membership1[3][3]=220370520370520670520670820 Fuzzycontroller() condition() else if (key == 0x08) 當按鍵 4找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

02550255010050100200100200300200300400 int membership1[3][3]=05010050100250100250400 Fuzzycontroller() condition()

58

else if (key == 0x10) 當按鍵 5找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

150250350250350450350450550450550650550650750 int membership1[3][3]=150300450300450600450600750 Fuzzycontroller() condition2() void Fuzzycontroller() 模糊控制判斷 void compute_grade() 函數原型宣告 void compute_grade1() 函數原型宣告 a1 = 0 b1 = 001 I = 0 for (n=0 nlt=14 n++) r = error1 set = Rule[n][0]-1 compute_grade() 計算輸入變數 1 與

模糊程度的歸屬函數 condition = 1 r = error2 set = Rule[n][1]-1 compute_grade1() 計算輸入變數 2 與 模糊程度的歸屬函數 grade[n] = MIN(grade_reg[0] grade_reg[1]) a1 = a1 + (grade[n]membership2[Rule[n][2]-1][1]) b1 = b1 + grade[n] I = a1 b1 得到模糊控制判斷的結果 void compute_grade() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership[set][0]) || (r gt membership[set][2])) 當輸入變數不在 歸屬函數內

59

grade_reg[condition] = 0 else if ((r gt membership[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership[set][2]-r) (membership[set][2] - membership[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership[set][0]) (membership[set][1] - membership[set][0]) void compute_grade1() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership1[set][0]) || (r gt membership1[set][2])) 當輸入變數不在 歸屬函數內 grade_reg[condition] = 0 else if ((r gt membership1[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership1[set][2]-r) (membership1[set][2]-membership1[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership1[set][0]) (membership1[set][1]-membership1[set][0])

60

void condition() P2_0 = 1 設定 P20 為輸入模式 P2_1 = 1 設定 P21 為輸入模式 if ( (P2_0 == 1) ampamp (P2_1 == 0)) 當馬達為正轉時 if ( I gt 0 ) 若模糊判斷結果為正 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 若模糊判斷結果為零 PWM = PWM + 0 PWM 寬度不變 if ( I lt 0 ) 若模糊控制結果小於零 PWM = PWM + 1 PWM 寬度加 1 else if ( (P2_0 == 0) ampamp (P2_1 == 1) ) 若馬達為反轉 if ( I lt 0 ) 模糊控制小於零 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 模糊控制等於零 PWM = PWM + 0 PWM 寬度不變 if ( I gt 0 ) 模糊控制大於零 PWM = PWM + 1 PWM 寬度加 1 CW() 判斷 PWM 寬度上下限

61

void CW() 判斷 PWM 寬度上下限 if ( PWM gt= 215 ) 若 PWM 寬度 gt= 最大寬度 j = 215 PWM 寬度維持於 215us if ( PWM lt= 5 ) 若 PWM 寬度 lt= 最小寬度 j = 5 PWM 寬度維持在 5us if ( PWM gt 5 ampamp PWM lt 215 ) PWM 寬度介於最大與最小間 j = PWM PWM 依模糊控制判斷結果增減 void delay1ms(int count) 延遲 1ms int x y for ( x = 0 x lt count x++ ) for ( y = 0 y lt 122 y++ ) void convert() 數位資料換算成馬達轉速 r1 = ((value)40)-160

62

附錄 C LCD 顯示之程式

includereg51h 含 8051 所有暫存器宣告 include mathh define RS P3_5 LCD 指令資料選擇控制 define RW P3_4 LCD 讀寫控制腳 define Enable P3_3 LCD 致能接腳 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P0_0 = 0x80 接腳定義 sbit P0_1 = 0x81 接腳定義 sbit P0_2 = 0x82 接腳定義 sbit P0_3 = 0x83 接腳定義 sbit P0_4 = 0x84 接腳定義 sbit P0_5 = 0x85 接腳定義 sbit P0_6 = 0x86 接腳定義 sbit ADCRD = P3^7 設定 RD 控制線接腳為 P37 sbit ADCWR = P3^6 設定 WR 控制線接腳為 P36 void delay(void) 函數原型宣告 void delay10ms(int count) 函數原型宣告 void display(void) 函數原型宣告 void InitialLCD(void) 函數原型宣告 void WriteIns(char) 函數原型宣告 void WriteData(char) 函數原型宣告 void WriteString(charchar) 函數原型宣告 void CheckBusy(void) 函數原型宣告 void convert(void) 函數原型宣告 char MSG0[] = Motor Speed = 定義字串 MSG0 char MSG2[] = rpm 定義字串 MSG2 unsigned char MSG1[8]=0000000 定義字串 MSG1 unsigned long int value 讀取 ADC0804 數位資料 int sample = 1000 取樣率設定消除顯示值跳動 long int rpm

63

main() 主程式 InitialLCD() 初始化 LCD IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x01 設定計時器 0 工作於模式 1 TH0 = (65536-5000)256 設定計時器 0 初值 TL0 = (65536-5000)256 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 while(1) 等待中斷 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 while (--sample == 0) 取樣率減 1 sample = 1000 重設取樣率 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 void T0_int(void) interrupt 1 LCD 顯示動態掃描 display() 動態掃描顯示 TH0 = (65536-65535)256 重設計時初值 TL0 = (65536-65535)256

64

void InitialLCD(void) 設定 LCD 模組初始狀態 delay() 延遲函數 WriteIns(0x38) 設定 LCD 模組為 WriteIns(0x38) 2 行顯示 WriteIns(0x38) 8 位元介面 WriteIns(0x38) 5x7 點字型 WriteIns(0x08) 關閉顯示器 WriteIns(0x01) 清除 LCD 螢幕 WriteIns(0x0c) 令顯示器 ON但游標不顯示 WriteIns(0x06) 令 LCD 模組每接收到 1Byte 資料 AC 值自動加 1 void display() 掃描顯示 WriteIns(0x80) 設定 LCD 座標 WriteString(13MSG0) 將字串 MSG0 寫入 LCD 中 WriteIns(0xc0) 設定 LCD 座標 WriteString(8MSG1) 將字串 MSG1 寫入 LCD 中 WriteIns(0xc8) 設定 LCD 座標 WriteString(4MSG2) 將字串 MSG2 寫入 LCD 中 void convert(void) 換算轉速 long int freq freq = ((value)4000) - 16000 數位資料換成頻率公式 rpm = freq3 頻率換算轉速公式 MSG1[0] = (rpm1000000)+0x30 將結果存入字串 MSG1 中 MSG1[1] = ((rpm1000000)100000)+0x30 MSG1[2] = ((rpm100000)10000)+0x30 MSG1[3] = ((rpm10000)1000)+0x30 MSG1[4] = 0x2e MSG1[5] = ((rpm1000)100)+0x30 MSG1[6] = ((rpm100)10)+0x30 MSG1[7] = rpm10+0x30

65

void WriteIns(char instruction) 寫命令至 LCD 中 RS = 0 選擇指令暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = instruction 輸出命令至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteData(char i) 寫資料至 LCD 中 RS = 1 選擇資料暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = i 輸出資料至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteString(countMSG) 寫字串至 LCD 中 char count 字串長度 char MSG[] 字串資料 char i 定義位元組變數 for(i=0 iltcount i++) count 個位元組 WriteData(MSG[i]) 寫入一位元組的資料至 LCD 中 void CheckBusy(void) char i=0x80 檢查忙碌旗標 while(iamp0x80) 忙錄旗標 BF = 1 RS = 0 選擇指令暫存器 RW = 1 讀取 Enable = 1 致能 LCD i = P2 讀取 LCD 指令暫存器內的資料

66

Enable = 0 除能 LCD delay() 延遲函數 void delay() 延遲 5ms int i for(i=0 ilt250 i++)

  • 畢業專題封面pdf
  • File0004pdf
  • 最終版pdfpdf
Page 47: Based on Fuzzy Control Theorem and TPWM Method for DC ... · 使吾人想設計一模糊控制器來做為馬達轉速的閉迴路控制,以解決非線性系統的 問題。除此之外,flcs

38

421 歸屬函數

設定變數為目前轉速〈sspeed〉與轉速誤差〈dspeed〉因此此模糊控制器共

有兩個輸入訊號與一輸出訊號輸出訊號為脈寬長度該加或是減多少又因為有

五種不同的轉速因此各分別設計了不同的歸屬函數如下

1 當轉速 = 0

ml h

s s p e e d

d s p e e d

r p m0 5 0 1 0 0- 5 0- 1 0 0

mv l l h v h

r p m0- 3 0- 6 0- 1 0 0 3 0 6 0 1 0 0 圖 42 停止時之歸屬函數

2 正轉〈慢〉

ml hsspeed

dspeed

rpm150 225 300750

mvl l h vh

rpm150100500 200 250 300

圖 43 正轉〈慢〉之歸屬函數

39

3 正轉〈快〉

ml hsspeed

dspeed

rpm520 670 820370220

mvl l h vh

rpm500400300200 600 700 800

圖 44 正轉〈快〉之歸屬函數

4 逆轉〈慢〉

ml hsspeed

dspeed

rpm100 250 400500

mvl l h vh

rpm10050250 200 300 400 圖 45 逆轉〈慢〉之歸屬函數

40

5 逆轉〈快〉

ml hsspeed

dspeed

rpm300 450 600150

mvl l h vh

rpm450350250150 550 650 750

750

圖 46 逆轉〈快〉之歸屬函數

6 輸出

OutputMVL L H VH

rpm0-50-150-250 50 150 250

圖 47 輸出之歸屬函數

41

422 模糊規則庫

表 41 為吾人所設計的模糊控制規則庫並利用 Matlab 之 Fuzzy ToolBox 來

建立此規則庫以進行模擬推論圖 48 為當馬達輸入指令為正轉慢時推論後所得

到的三維空間圖

表 41 模糊控制規則表

Dspeed

vl l m h vh

l H M L VL VL

m VH H M L VL sspeed

h VH VH H M L

圖 48 推論後的三維空間圖

42

423 模糊控制器之軟體設計流程

Start 外部中斷副程式

ADCWR = 0 ADCWR = 1

〈令AD開始轉換〉

檢查鍵值以得到對應的歸屬函數

取得目前轉速與

轉速誤差

Fuzzy Rules決策

得到輸出訊號

Delay 10ms

ADC = 0 讀取AD值 ADCRD = 0

將AD值換算成轉速

ADCWR = 0 ADCWR = 1

〈AD開始轉換〉

返回主程式

致能外部中斷

圖 49 Fuzzy Controller 程式流程圖

當控制器一開始動作時便先執行AD轉換的工作當AD轉換完成時其

INTR的接腳便會觸發8051的外部中斷INTR0於是程式便發生外部中斷執行

外部中斷副程式的指令

43

在外部中斷副程式中AD將ㄧ直進行轉換與讀取的工作同時並將轉換後

的值直接換算成目前轉速與轉速誤差以供模糊控制器使用換算目前encoder

的頻率其公式為

160-V2000 times=頻率 〈4-1〉

式4-1之公式是根據表31所導出來的其中V為encoder之頻率轉成電壓之值

又假設所讀取的AD轉換值為value因為

AD的解析度 = bit256

5V+ = 511 ( Vbit ) 〈4-2〉

故value值與電壓V之關係為

511 value V times= 〈4-3〉

所以encoder之頻率與value值的關係為

頻率= 2000times ⎟⎠⎞

⎜⎝⎛ times

511 value - 160 〈4-4〉

故目前轉速為

sspeed = ( )rpm 60 200

times頻率 〈4-5〉

另ㄧ方面在主程式中程式會先去檢查鍵值也就等於檢查輸入指令以

找出符合使用的歸屬函數並將AD所獲得的轉速對應到歸屬函數中然後執行

決策判斷即進入規則庫中尋找出適當的決策判斷最後將此決策送入PWM程

式裡進行脈寬長度的調整使馬達在合理的要求下達到理想的轉速控制不會

因為外在環境的影響而使馬達轉速受到干擾

43 LCD 顯示轉速

此專題最後再增加一LCD顯示幕以顯示目前的轉速否則在程式設計完成

後人卻因無法以肉眼得知目前轉速而不能肯定馬達轉速是否有達到控制的目

標因此增加一顯示幕LCD是有必要的不僅隨時得知目前的轉速還能知道

44

設計出來的軟體其控制性是否夠好夠穩定

431 LCD 顯示幕之軟體流程

Start

設定LCD模組的初始狀態

設定外部中斷INTR0

與Timer0

設定TH0 = (65536 ndash 5000) 256 TL0 = (65536 ndash 5000)256

令ADCWR = 0 ADCWR = 1 AD開始轉換

等待中斷

外部中斷副程式

ADCRD = 0 讀取AD值 ADCRD = 1

將AD值換算成速度

ADCWR = 0 ADCWR = 1 AD開始轉換

Timer0中斷副程式

顯示LCD第一行

ldquoMotor Speed =

顯示LCD第二行ldquoxxxxxxx rpm其中 xxxxxx為外部中斷副程式所換算出的轉速

重設TH0與TL0

返回主程式返回主程式

圖 410 LCD 顯示幕之程式流程圖

此程式主要由兩個部分完成一為外部中斷副程式另ㄧ為 Timer0 中斷副

程式當主程式完成外部與 Timer0 兩個中斷的設定後隨即命令 AD 開始轉換

之後便一直停在 while〈1〉的迴圈裡不做任何動作而由兩個中斷副程式來完

成整個轉換與顯示的工作

45

外部中斷副程式主要負責 AD 的轉換讀取與轉速換算的工作AD 第一

次的轉換由主程式來下達命令當轉換完成後AD 的 INTR 接腳將觸發外部中

斷〈INTR0〉副程式此時程式便進入外部中斷副程式執行讀取 AD 值與轉速

換算的工作當這些工作完成時外部中斷副程式再次下達 AD 開始轉換的命

令而離開中斷副程式當 AD 再次轉換完成時又將再次執行中斷副程式

如此週而復始中斷副程式將ㄧ直進行讀取換算與轉換的工作

而 Timer0 中斷副程式主要負責 LCD 顯示之工作當主程式所設定的計時時

間計數完時程式便進入 Timer0 中斷副程式一旦進入 Timer0 中斷副程式程

式將執行 LCD 的顯示然後再重設 Timer0 的計數時間Timer0 將重新計數當

計數完時程式又將再度進入 Timer0 中斷副程式執行因為程式中並無清除

Timer0 的中斷致能故 Timer0 中斷副程式和外部中斷副程式ㄧ樣週而復始的

執行其副程式的工作

46

第五章 結論

本計劃主旨為具模糊控制理論與雙脈寬調變法之直流馬達驅動電路設計主

要是針對傳統電路設計之缺點提出改良之方法以TPWM取代PWM電路以模

糊理論基礎設計之控制器替代傳統PID控制器

TPWM轉速控制優於PWM之處在於

1 TPWM只需使用單電源即可達到正轉和逆轉的轉速控制而PWM必須

加上逆向開關或是雙電源才能使馬達產生正轉和逆轉

2 TPWM可控制馬達處於停止狀態無論在正向或逆向加上負載皆無法使

馬達產生轉動

3 馬達消耗定額功率輸出轉矩為額定值

4 馬達由停止到某定轉速時反應時間較快

模糊控制器優於PID控制器

1 不須導出繁雜的數學模型

2 適用於非線性系統

3 強健性與容錯性較高

本專題至此雖說大致的目標都已達到但是此系統仍然有許多不完美而需要

改進的地方例如在實驗過程中發現整個轉速的控制在回授上其反應時間

有點慢探討其原因有可能是控制器之程式上的問題

1 因為使用C語言撰寫程式故其執行速度較慢

2 程式可能寫的太累贅

3 模糊控制規則庫建立不良

若想改善這些問題可以嘗試著將C語言改為組合語言來撰寫並盡量減少

47

不必要的指令相信此動作一定能大大提昇程式的執行速度其次就是多做測

試利用測試中所學到的經驗來幫助模糊控制規則庫的改寫同時也能從測試中

發現更多的問題若是都能對問題加以一一解決的話相信必定能將此控制系統

做的更盡善盡美

48

參考文獻

﹝1﹞ 李適中直流馬達速度控制伺服控制〈基礎篇〉全華科技圖書股份有

限公司民 74

﹝2﹞ 廖錦文ldquo直流電動機之雙脈寬調變是〈TPWM〉驅動電路研究電

子技術月刊第 69 期pp94-1021992

﹝3﹞ 楊英魁孫宗瀛鄭魁香林建德蔣旭堂模糊控制理論與技術全華

科技圖書股份有限公司民 85

﹝4﹞ 林敦煌陳憬德直流馬達定位及轉速的模糊控制逢甲大學自動控制工

程學系學士論文民 87

﹝5﹞ LAZadehldquo Fuzzy Sets Information and Control Vol8 pp338-353

1965

﹝6﹞ EHMamdani and SAsslianldquo A fuzzy logic controller for a dynamic

plant Internation Journal of Man-Machine Studies Vol7 pp1-13 1975

﹝7﹞ 孫宗瀛楊英魁Fuzzy 控制理論實作與應用全華科技圖書股份有

限公司民 83 年

﹝8﹞ 許中平黃煌嘉直流電動機控制電路設計全華科技圖書股份有限公司

民 75

﹝9﹞ 盧明智黃敏祥OP Amp 應用+實驗模擬全華科技圖書股份有限公司

民 83

﹝10﹞陳文耀電動機控制工程復文書局2003

﹝11﹞許中平林全福電動機運轉控制技術全華科技圖書股份有限公司民

77

﹝12﹞楊明豐8051 單晶片 C 語言設計實務碁峯資訊2003 年

﹝13﹞蔡朝洋單晶片微電腦 80518951 原理與應用全華科技圖書股份有限公

司民 91

49

﹝14﹞王文俊認識 Fuzzy全華科技圖書股份有限公司民 90

50

附錄 A 專題硬體展示圖

圖 A-1 硬體整體圖

圖 A-2 硬體整體鳥瞰圖

51

圖 A-3 硬體側視圖

圖 A-4 操作與顯示面板

圖 A-5 間距脈波電路與 FV 電路

52

圖 A-6 橋型驅動功率放大電路

圖 A-7 操作與控制面板

53

附錄 B PWM 與模糊控制之程式

include reg51h include stdioh sbit ADCRD = P3^1 設定 RD 控制線接腳為 P31 sbit ADCWR = P3^3 設定 WR 控制線接腳為 P33 sbit P2_0 = 0xA0 接腳定義 sbit P2_1 = 0xA1 接腳定義 sbit P3_0 = 0xB0 接腳定義 sbit P3_1 = 0xB1 接腳定義 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P3_6 = 0xB6 接腳定義 void KeyStatus(void) 函數原型宣告 void feedback(void) 函數原型宣告 void compute_grade(void) 函數原型宣告 void delay1ms(int count) 函數原型宣告 void convert() 函數原型宣告 void condition() 函數原型宣告 void CW(void) 函數原型宣告 int j i 對應 PWM 的寬度 unsigned int temp 所設計的計時器時間 int sample = 1000 取樣率設定消除顯示值跳動 long int value r1 讀取 ADC0804 數位資料 long int set n condition select long int r grade_reg[2] grade[15] error1 error2 long int a1 b1 I long int membership[5][3]membership1[3][3] 定義歸屬函數 long int membership2[3][3] = -10-50-5050510 long int error[2] int Rule[15][3] = 113213313 定義判斷規則庫 212223323 311232333 411241342 511251351

54

main() 主程式 j = PWM = 110 設定 PWM 初始值 IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x00 設定計時器 0 工作於模式 0 temp=8192-j4 設定計時器 0 初值 TH0 = temp 32 TL0 = temp 32 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 P3_4 = 1 P3_5 = 0 P3_6 = 0 ADCWR = 0 令 ADC0804 的 WR = 0 ADCWR = 1 令 ADC0804 的 WR = 1 while (1) KeyStatus() 檢查鍵值 void KeyStatus(void) 檢查鍵值並給對應的 PWM 值 char KeyScan(void) 按鍵掃描函數宣告 unsigned char KeyStatus unsigned char Key = 0 KeyStatus=KeyScan() 呼叫按鍵掃描函數 if (KeyStatus = 0) 已有按鍵輸入 Key = KeyStatus Key = 鍵值 if (Key == 0x01) 假如輸入為按鍵 1 i = 110 PWM 為 110us j = i P3_4 = 1 LED 亮第一顆〈表馬達停止〉 P3_5 = 0 P3_6 = 0

55

else if (Key == 0x02 ) 假如輸入為按鍵 2 i = 140 PWM 為 140us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x04 ) 假如輸入為按鍵 3 i = 180 PWM 為 180us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x08 ) 假如輸入為按鍵 4 i = 80 PWM 為 80us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 else if (Key == 0x10 ) 假如輸入為按鍵 5 i = 40 PWM 為 40us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 PWM = j delay1ms(10) 呼叫延遲函數 feedback() 模糊控制判斷

56

void To_int(void) interrupt 1 Timer0 中斷函數 if (P3_0 == 0) 假如 PWM 輸出為 Low P3_0 = 1 變更 PWM 輸出為 High temp=8192-j4 設定 High 的時間 else 若 PWM 輸出為 High P3_0 = 0 變更 PWM 輸出為 Low temp=8192-880+j4 設定 Low 的時間 TH0 = temp 32 Timer0 的計時時間 TL0 = temp 32 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 char KeyScan(void) 檢查鍵值 char KeyStatus 按鍵狀態 P0=0xff 設定 P0 為輸入模式 KeyStatus=~P0 讀取按鍵狀態 return(KeyStatus) 將鍵值送回程式 void feedback(void) 模糊判斷 void Fuzzycontroller() 函數原型宣告 void condition1() 函數原型宣告

57

void condition2() 函數原型宣告 error1 = ((value)40-160)03 輸入變數 1 delay10ms(10) 延遲 10ms error2 = ((value)40-160)03 輸入變數 2 if (key == 0x01 ) 當按鍵 1找出對應的歸屬函數 並做出模糊控制判斷

int membership[5][3]= -100-60-30-60-300-30030030603060100

int membership1[3][3]=-100-500-50050050100 Fuzzycontroller() condition() if (key == 0x02 ) 當按鍵 2找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

05010050100150100150200150200250200250300 int membership1[3][3]=07515075150225150225300 Fuzzycontroller() condition() else if (key == 0x04) 當按鍵 3找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

200320400300400500400500600500600700600700800 int membership1[3][3]=220370520370520670520670820 Fuzzycontroller() condition() else if (key == 0x08) 當按鍵 4找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

02550255010050100200100200300200300400 int membership1[3][3]=05010050100250100250400 Fuzzycontroller() condition()

58

else if (key == 0x10) 當按鍵 5找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

150250350250350450350450550450550650550650750 int membership1[3][3]=150300450300450600450600750 Fuzzycontroller() condition2() void Fuzzycontroller() 模糊控制判斷 void compute_grade() 函數原型宣告 void compute_grade1() 函數原型宣告 a1 = 0 b1 = 001 I = 0 for (n=0 nlt=14 n++) r = error1 set = Rule[n][0]-1 compute_grade() 計算輸入變數 1 與

模糊程度的歸屬函數 condition = 1 r = error2 set = Rule[n][1]-1 compute_grade1() 計算輸入變數 2 與 模糊程度的歸屬函數 grade[n] = MIN(grade_reg[0] grade_reg[1]) a1 = a1 + (grade[n]membership2[Rule[n][2]-1][1]) b1 = b1 + grade[n] I = a1 b1 得到模糊控制判斷的結果 void compute_grade() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership[set][0]) || (r gt membership[set][2])) 當輸入變數不在 歸屬函數內

59

grade_reg[condition] = 0 else if ((r gt membership[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership[set][2]-r) (membership[set][2] - membership[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership[set][0]) (membership[set][1] - membership[set][0]) void compute_grade1() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership1[set][0]) || (r gt membership1[set][2])) 當輸入變數不在 歸屬函數內 grade_reg[condition] = 0 else if ((r gt membership1[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership1[set][2]-r) (membership1[set][2]-membership1[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership1[set][0]) (membership1[set][1]-membership1[set][0])

60

void condition() P2_0 = 1 設定 P20 為輸入模式 P2_1 = 1 設定 P21 為輸入模式 if ( (P2_0 == 1) ampamp (P2_1 == 0)) 當馬達為正轉時 if ( I gt 0 ) 若模糊判斷結果為正 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 若模糊判斷結果為零 PWM = PWM + 0 PWM 寬度不變 if ( I lt 0 ) 若模糊控制結果小於零 PWM = PWM + 1 PWM 寬度加 1 else if ( (P2_0 == 0) ampamp (P2_1 == 1) ) 若馬達為反轉 if ( I lt 0 ) 模糊控制小於零 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 模糊控制等於零 PWM = PWM + 0 PWM 寬度不變 if ( I gt 0 ) 模糊控制大於零 PWM = PWM + 1 PWM 寬度加 1 CW() 判斷 PWM 寬度上下限

61

void CW() 判斷 PWM 寬度上下限 if ( PWM gt= 215 ) 若 PWM 寬度 gt= 最大寬度 j = 215 PWM 寬度維持於 215us if ( PWM lt= 5 ) 若 PWM 寬度 lt= 最小寬度 j = 5 PWM 寬度維持在 5us if ( PWM gt 5 ampamp PWM lt 215 ) PWM 寬度介於最大與最小間 j = PWM PWM 依模糊控制判斷結果增減 void delay1ms(int count) 延遲 1ms int x y for ( x = 0 x lt count x++ ) for ( y = 0 y lt 122 y++ ) void convert() 數位資料換算成馬達轉速 r1 = ((value)40)-160

62

附錄 C LCD 顯示之程式

includereg51h 含 8051 所有暫存器宣告 include mathh define RS P3_5 LCD 指令資料選擇控制 define RW P3_4 LCD 讀寫控制腳 define Enable P3_3 LCD 致能接腳 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P0_0 = 0x80 接腳定義 sbit P0_1 = 0x81 接腳定義 sbit P0_2 = 0x82 接腳定義 sbit P0_3 = 0x83 接腳定義 sbit P0_4 = 0x84 接腳定義 sbit P0_5 = 0x85 接腳定義 sbit P0_6 = 0x86 接腳定義 sbit ADCRD = P3^7 設定 RD 控制線接腳為 P37 sbit ADCWR = P3^6 設定 WR 控制線接腳為 P36 void delay(void) 函數原型宣告 void delay10ms(int count) 函數原型宣告 void display(void) 函數原型宣告 void InitialLCD(void) 函數原型宣告 void WriteIns(char) 函數原型宣告 void WriteData(char) 函數原型宣告 void WriteString(charchar) 函數原型宣告 void CheckBusy(void) 函數原型宣告 void convert(void) 函數原型宣告 char MSG0[] = Motor Speed = 定義字串 MSG0 char MSG2[] = rpm 定義字串 MSG2 unsigned char MSG1[8]=0000000 定義字串 MSG1 unsigned long int value 讀取 ADC0804 數位資料 int sample = 1000 取樣率設定消除顯示值跳動 long int rpm

63

main() 主程式 InitialLCD() 初始化 LCD IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x01 設定計時器 0 工作於模式 1 TH0 = (65536-5000)256 設定計時器 0 初值 TL0 = (65536-5000)256 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 while(1) 等待中斷 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 while (--sample == 0) 取樣率減 1 sample = 1000 重設取樣率 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 void T0_int(void) interrupt 1 LCD 顯示動態掃描 display() 動態掃描顯示 TH0 = (65536-65535)256 重設計時初值 TL0 = (65536-65535)256

64

void InitialLCD(void) 設定 LCD 模組初始狀態 delay() 延遲函數 WriteIns(0x38) 設定 LCD 模組為 WriteIns(0x38) 2 行顯示 WriteIns(0x38) 8 位元介面 WriteIns(0x38) 5x7 點字型 WriteIns(0x08) 關閉顯示器 WriteIns(0x01) 清除 LCD 螢幕 WriteIns(0x0c) 令顯示器 ON但游標不顯示 WriteIns(0x06) 令 LCD 模組每接收到 1Byte 資料 AC 值自動加 1 void display() 掃描顯示 WriteIns(0x80) 設定 LCD 座標 WriteString(13MSG0) 將字串 MSG0 寫入 LCD 中 WriteIns(0xc0) 設定 LCD 座標 WriteString(8MSG1) 將字串 MSG1 寫入 LCD 中 WriteIns(0xc8) 設定 LCD 座標 WriteString(4MSG2) 將字串 MSG2 寫入 LCD 中 void convert(void) 換算轉速 long int freq freq = ((value)4000) - 16000 數位資料換成頻率公式 rpm = freq3 頻率換算轉速公式 MSG1[0] = (rpm1000000)+0x30 將結果存入字串 MSG1 中 MSG1[1] = ((rpm1000000)100000)+0x30 MSG1[2] = ((rpm100000)10000)+0x30 MSG1[3] = ((rpm10000)1000)+0x30 MSG1[4] = 0x2e MSG1[5] = ((rpm1000)100)+0x30 MSG1[6] = ((rpm100)10)+0x30 MSG1[7] = rpm10+0x30

65

void WriteIns(char instruction) 寫命令至 LCD 中 RS = 0 選擇指令暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = instruction 輸出命令至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteData(char i) 寫資料至 LCD 中 RS = 1 選擇資料暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = i 輸出資料至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteString(countMSG) 寫字串至 LCD 中 char count 字串長度 char MSG[] 字串資料 char i 定義位元組變數 for(i=0 iltcount i++) count 個位元組 WriteData(MSG[i]) 寫入一位元組的資料至 LCD 中 void CheckBusy(void) char i=0x80 檢查忙碌旗標 while(iamp0x80) 忙錄旗標 BF = 1 RS = 0 選擇指令暫存器 RW = 1 讀取 Enable = 1 致能 LCD i = P2 讀取 LCD 指令暫存器內的資料

66

Enable = 0 除能 LCD delay() 延遲函數 void delay() 延遲 5ms int i for(i=0 ilt250 i++)

  • 畢業專題封面pdf
  • File0004pdf
  • 最終版pdfpdf
Page 48: Based on Fuzzy Control Theorem and TPWM Method for DC ... · 使吾人想設計一模糊控制器來做為馬達轉速的閉迴路控制,以解決非線性系統的 問題。除此之外,flcs

39

3 正轉〈快〉

ml hsspeed

dspeed

rpm520 670 820370220

mvl l h vh

rpm500400300200 600 700 800

圖 44 正轉〈快〉之歸屬函數

4 逆轉〈慢〉

ml hsspeed

dspeed

rpm100 250 400500

mvl l h vh

rpm10050250 200 300 400 圖 45 逆轉〈慢〉之歸屬函數

40

5 逆轉〈快〉

ml hsspeed

dspeed

rpm300 450 600150

mvl l h vh

rpm450350250150 550 650 750

750

圖 46 逆轉〈快〉之歸屬函數

6 輸出

OutputMVL L H VH

rpm0-50-150-250 50 150 250

圖 47 輸出之歸屬函數

41

422 模糊規則庫

表 41 為吾人所設計的模糊控制規則庫並利用 Matlab 之 Fuzzy ToolBox 來

建立此規則庫以進行模擬推論圖 48 為當馬達輸入指令為正轉慢時推論後所得

到的三維空間圖

表 41 模糊控制規則表

Dspeed

vl l m h vh

l H M L VL VL

m VH H M L VL sspeed

h VH VH H M L

圖 48 推論後的三維空間圖

42

423 模糊控制器之軟體設計流程

Start 外部中斷副程式

ADCWR = 0 ADCWR = 1

〈令AD開始轉換〉

檢查鍵值以得到對應的歸屬函數

取得目前轉速與

轉速誤差

Fuzzy Rules決策

得到輸出訊號

Delay 10ms

ADC = 0 讀取AD值 ADCRD = 0

將AD值換算成轉速

ADCWR = 0 ADCWR = 1

〈AD開始轉換〉

返回主程式

致能外部中斷

圖 49 Fuzzy Controller 程式流程圖

當控制器一開始動作時便先執行AD轉換的工作當AD轉換完成時其

INTR的接腳便會觸發8051的外部中斷INTR0於是程式便發生外部中斷執行

外部中斷副程式的指令

43

在外部中斷副程式中AD將ㄧ直進行轉換與讀取的工作同時並將轉換後

的值直接換算成目前轉速與轉速誤差以供模糊控制器使用換算目前encoder

的頻率其公式為

160-V2000 times=頻率 〈4-1〉

式4-1之公式是根據表31所導出來的其中V為encoder之頻率轉成電壓之值

又假設所讀取的AD轉換值為value因為

AD的解析度 = bit256

5V+ = 511 ( Vbit ) 〈4-2〉

故value值與電壓V之關係為

511 value V times= 〈4-3〉

所以encoder之頻率與value值的關係為

頻率= 2000times ⎟⎠⎞

⎜⎝⎛ times

511 value - 160 〈4-4〉

故目前轉速為

sspeed = ( )rpm 60 200

times頻率 〈4-5〉

另ㄧ方面在主程式中程式會先去檢查鍵值也就等於檢查輸入指令以

找出符合使用的歸屬函數並將AD所獲得的轉速對應到歸屬函數中然後執行

決策判斷即進入規則庫中尋找出適當的決策判斷最後將此決策送入PWM程

式裡進行脈寬長度的調整使馬達在合理的要求下達到理想的轉速控制不會

因為外在環境的影響而使馬達轉速受到干擾

43 LCD 顯示轉速

此專題最後再增加一LCD顯示幕以顯示目前的轉速否則在程式設計完成

後人卻因無法以肉眼得知目前轉速而不能肯定馬達轉速是否有達到控制的目

標因此增加一顯示幕LCD是有必要的不僅隨時得知目前的轉速還能知道

44

設計出來的軟體其控制性是否夠好夠穩定

431 LCD 顯示幕之軟體流程

Start

設定LCD模組的初始狀態

設定外部中斷INTR0

與Timer0

設定TH0 = (65536 ndash 5000) 256 TL0 = (65536 ndash 5000)256

令ADCWR = 0 ADCWR = 1 AD開始轉換

等待中斷

外部中斷副程式

ADCRD = 0 讀取AD值 ADCRD = 1

將AD值換算成速度

ADCWR = 0 ADCWR = 1 AD開始轉換

Timer0中斷副程式

顯示LCD第一行

ldquoMotor Speed =

顯示LCD第二行ldquoxxxxxxx rpm其中 xxxxxx為外部中斷副程式所換算出的轉速

重設TH0與TL0

返回主程式返回主程式

圖 410 LCD 顯示幕之程式流程圖

此程式主要由兩個部分完成一為外部中斷副程式另ㄧ為 Timer0 中斷副

程式當主程式完成外部與 Timer0 兩個中斷的設定後隨即命令 AD 開始轉換

之後便一直停在 while〈1〉的迴圈裡不做任何動作而由兩個中斷副程式來完

成整個轉換與顯示的工作

45

外部中斷副程式主要負責 AD 的轉換讀取與轉速換算的工作AD 第一

次的轉換由主程式來下達命令當轉換完成後AD 的 INTR 接腳將觸發外部中

斷〈INTR0〉副程式此時程式便進入外部中斷副程式執行讀取 AD 值與轉速

換算的工作當這些工作完成時外部中斷副程式再次下達 AD 開始轉換的命

令而離開中斷副程式當 AD 再次轉換完成時又將再次執行中斷副程式

如此週而復始中斷副程式將ㄧ直進行讀取換算與轉換的工作

而 Timer0 中斷副程式主要負責 LCD 顯示之工作當主程式所設定的計時時

間計數完時程式便進入 Timer0 中斷副程式一旦進入 Timer0 中斷副程式程

式將執行 LCD 的顯示然後再重設 Timer0 的計數時間Timer0 將重新計數當

計數完時程式又將再度進入 Timer0 中斷副程式執行因為程式中並無清除

Timer0 的中斷致能故 Timer0 中斷副程式和外部中斷副程式ㄧ樣週而復始的

執行其副程式的工作

46

第五章 結論

本計劃主旨為具模糊控制理論與雙脈寬調變法之直流馬達驅動電路設計主

要是針對傳統電路設計之缺點提出改良之方法以TPWM取代PWM電路以模

糊理論基礎設計之控制器替代傳統PID控制器

TPWM轉速控制優於PWM之處在於

1 TPWM只需使用單電源即可達到正轉和逆轉的轉速控制而PWM必須

加上逆向開關或是雙電源才能使馬達產生正轉和逆轉

2 TPWM可控制馬達處於停止狀態無論在正向或逆向加上負載皆無法使

馬達產生轉動

3 馬達消耗定額功率輸出轉矩為額定值

4 馬達由停止到某定轉速時反應時間較快

模糊控制器優於PID控制器

1 不須導出繁雜的數學模型

2 適用於非線性系統

3 強健性與容錯性較高

本專題至此雖說大致的目標都已達到但是此系統仍然有許多不完美而需要

改進的地方例如在實驗過程中發現整個轉速的控制在回授上其反應時間

有點慢探討其原因有可能是控制器之程式上的問題

1 因為使用C語言撰寫程式故其執行速度較慢

2 程式可能寫的太累贅

3 模糊控制規則庫建立不良

若想改善這些問題可以嘗試著將C語言改為組合語言來撰寫並盡量減少

47

不必要的指令相信此動作一定能大大提昇程式的執行速度其次就是多做測

試利用測試中所學到的經驗來幫助模糊控制規則庫的改寫同時也能從測試中

發現更多的問題若是都能對問題加以一一解決的話相信必定能將此控制系統

做的更盡善盡美

48

參考文獻

﹝1﹞ 李適中直流馬達速度控制伺服控制〈基礎篇〉全華科技圖書股份有

限公司民 74

﹝2﹞ 廖錦文ldquo直流電動機之雙脈寬調變是〈TPWM〉驅動電路研究電

子技術月刊第 69 期pp94-1021992

﹝3﹞ 楊英魁孫宗瀛鄭魁香林建德蔣旭堂模糊控制理論與技術全華

科技圖書股份有限公司民 85

﹝4﹞ 林敦煌陳憬德直流馬達定位及轉速的模糊控制逢甲大學自動控制工

程學系學士論文民 87

﹝5﹞ LAZadehldquo Fuzzy Sets Information and Control Vol8 pp338-353

1965

﹝6﹞ EHMamdani and SAsslianldquo A fuzzy logic controller for a dynamic

plant Internation Journal of Man-Machine Studies Vol7 pp1-13 1975

﹝7﹞ 孫宗瀛楊英魁Fuzzy 控制理論實作與應用全華科技圖書股份有

限公司民 83 年

﹝8﹞ 許中平黃煌嘉直流電動機控制電路設計全華科技圖書股份有限公司

民 75

﹝9﹞ 盧明智黃敏祥OP Amp 應用+實驗模擬全華科技圖書股份有限公司

民 83

﹝10﹞陳文耀電動機控制工程復文書局2003

﹝11﹞許中平林全福電動機運轉控制技術全華科技圖書股份有限公司民

77

﹝12﹞楊明豐8051 單晶片 C 語言設計實務碁峯資訊2003 年

﹝13﹞蔡朝洋單晶片微電腦 80518951 原理與應用全華科技圖書股份有限公

司民 91

49

﹝14﹞王文俊認識 Fuzzy全華科技圖書股份有限公司民 90

50

附錄 A 專題硬體展示圖

圖 A-1 硬體整體圖

圖 A-2 硬體整體鳥瞰圖

51

圖 A-3 硬體側視圖

圖 A-4 操作與顯示面板

圖 A-5 間距脈波電路與 FV 電路

52

圖 A-6 橋型驅動功率放大電路

圖 A-7 操作與控制面板

53

附錄 B PWM 與模糊控制之程式

include reg51h include stdioh sbit ADCRD = P3^1 設定 RD 控制線接腳為 P31 sbit ADCWR = P3^3 設定 WR 控制線接腳為 P33 sbit P2_0 = 0xA0 接腳定義 sbit P2_1 = 0xA1 接腳定義 sbit P3_0 = 0xB0 接腳定義 sbit P3_1 = 0xB1 接腳定義 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P3_6 = 0xB6 接腳定義 void KeyStatus(void) 函數原型宣告 void feedback(void) 函數原型宣告 void compute_grade(void) 函數原型宣告 void delay1ms(int count) 函數原型宣告 void convert() 函數原型宣告 void condition() 函數原型宣告 void CW(void) 函數原型宣告 int j i 對應 PWM 的寬度 unsigned int temp 所設計的計時器時間 int sample = 1000 取樣率設定消除顯示值跳動 long int value r1 讀取 ADC0804 數位資料 long int set n condition select long int r grade_reg[2] grade[15] error1 error2 long int a1 b1 I long int membership[5][3]membership1[3][3] 定義歸屬函數 long int membership2[3][3] = -10-50-5050510 long int error[2] int Rule[15][3] = 113213313 定義判斷規則庫 212223323 311232333 411241342 511251351

54

main() 主程式 j = PWM = 110 設定 PWM 初始值 IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x00 設定計時器 0 工作於模式 0 temp=8192-j4 設定計時器 0 初值 TH0 = temp 32 TL0 = temp 32 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 P3_4 = 1 P3_5 = 0 P3_6 = 0 ADCWR = 0 令 ADC0804 的 WR = 0 ADCWR = 1 令 ADC0804 的 WR = 1 while (1) KeyStatus() 檢查鍵值 void KeyStatus(void) 檢查鍵值並給對應的 PWM 值 char KeyScan(void) 按鍵掃描函數宣告 unsigned char KeyStatus unsigned char Key = 0 KeyStatus=KeyScan() 呼叫按鍵掃描函數 if (KeyStatus = 0) 已有按鍵輸入 Key = KeyStatus Key = 鍵值 if (Key == 0x01) 假如輸入為按鍵 1 i = 110 PWM 為 110us j = i P3_4 = 1 LED 亮第一顆〈表馬達停止〉 P3_5 = 0 P3_6 = 0

55

else if (Key == 0x02 ) 假如輸入為按鍵 2 i = 140 PWM 為 140us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x04 ) 假如輸入為按鍵 3 i = 180 PWM 為 180us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x08 ) 假如輸入為按鍵 4 i = 80 PWM 為 80us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 else if (Key == 0x10 ) 假如輸入為按鍵 5 i = 40 PWM 為 40us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 PWM = j delay1ms(10) 呼叫延遲函數 feedback() 模糊控制判斷

56

void To_int(void) interrupt 1 Timer0 中斷函數 if (P3_0 == 0) 假如 PWM 輸出為 Low P3_0 = 1 變更 PWM 輸出為 High temp=8192-j4 設定 High 的時間 else 若 PWM 輸出為 High P3_0 = 0 變更 PWM 輸出為 Low temp=8192-880+j4 設定 Low 的時間 TH0 = temp 32 Timer0 的計時時間 TL0 = temp 32 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 char KeyScan(void) 檢查鍵值 char KeyStatus 按鍵狀態 P0=0xff 設定 P0 為輸入模式 KeyStatus=~P0 讀取按鍵狀態 return(KeyStatus) 將鍵值送回程式 void feedback(void) 模糊判斷 void Fuzzycontroller() 函數原型宣告 void condition1() 函數原型宣告

57

void condition2() 函數原型宣告 error1 = ((value)40-160)03 輸入變數 1 delay10ms(10) 延遲 10ms error2 = ((value)40-160)03 輸入變數 2 if (key == 0x01 ) 當按鍵 1找出對應的歸屬函數 並做出模糊控制判斷

int membership[5][3]= -100-60-30-60-300-30030030603060100

int membership1[3][3]=-100-500-50050050100 Fuzzycontroller() condition() if (key == 0x02 ) 當按鍵 2找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

05010050100150100150200150200250200250300 int membership1[3][3]=07515075150225150225300 Fuzzycontroller() condition() else if (key == 0x04) 當按鍵 3找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

200320400300400500400500600500600700600700800 int membership1[3][3]=220370520370520670520670820 Fuzzycontroller() condition() else if (key == 0x08) 當按鍵 4找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

02550255010050100200100200300200300400 int membership1[3][3]=05010050100250100250400 Fuzzycontroller() condition()

58

else if (key == 0x10) 當按鍵 5找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

150250350250350450350450550450550650550650750 int membership1[3][3]=150300450300450600450600750 Fuzzycontroller() condition2() void Fuzzycontroller() 模糊控制判斷 void compute_grade() 函數原型宣告 void compute_grade1() 函數原型宣告 a1 = 0 b1 = 001 I = 0 for (n=0 nlt=14 n++) r = error1 set = Rule[n][0]-1 compute_grade() 計算輸入變數 1 與

模糊程度的歸屬函數 condition = 1 r = error2 set = Rule[n][1]-1 compute_grade1() 計算輸入變數 2 與 模糊程度的歸屬函數 grade[n] = MIN(grade_reg[0] grade_reg[1]) a1 = a1 + (grade[n]membership2[Rule[n][2]-1][1]) b1 = b1 + grade[n] I = a1 b1 得到模糊控制判斷的結果 void compute_grade() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership[set][0]) || (r gt membership[set][2])) 當輸入變數不在 歸屬函數內

59

grade_reg[condition] = 0 else if ((r gt membership[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership[set][2]-r) (membership[set][2] - membership[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership[set][0]) (membership[set][1] - membership[set][0]) void compute_grade1() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership1[set][0]) || (r gt membership1[set][2])) 當輸入變數不在 歸屬函數內 grade_reg[condition] = 0 else if ((r gt membership1[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership1[set][2]-r) (membership1[set][2]-membership1[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership1[set][0]) (membership1[set][1]-membership1[set][0])

60

void condition() P2_0 = 1 設定 P20 為輸入模式 P2_1 = 1 設定 P21 為輸入模式 if ( (P2_0 == 1) ampamp (P2_1 == 0)) 當馬達為正轉時 if ( I gt 0 ) 若模糊判斷結果為正 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 若模糊判斷結果為零 PWM = PWM + 0 PWM 寬度不變 if ( I lt 0 ) 若模糊控制結果小於零 PWM = PWM + 1 PWM 寬度加 1 else if ( (P2_0 == 0) ampamp (P2_1 == 1) ) 若馬達為反轉 if ( I lt 0 ) 模糊控制小於零 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 模糊控制等於零 PWM = PWM + 0 PWM 寬度不變 if ( I gt 0 ) 模糊控制大於零 PWM = PWM + 1 PWM 寬度加 1 CW() 判斷 PWM 寬度上下限

61

void CW() 判斷 PWM 寬度上下限 if ( PWM gt= 215 ) 若 PWM 寬度 gt= 最大寬度 j = 215 PWM 寬度維持於 215us if ( PWM lt= 5 ) 若 PWM 寬度 lt= 最小寬度 j = 5 PWM 寬度維持在 5us if ( PWM gt 5 ampamp PWM lt 215 ) PWM 寬度介於最大與最小間 j = PWM PWM 依模糊控制判斷結果增減 void delay1ms(int count) 延遲 1ms int x y for ( x = 0 x lt count x++ ) for ( y = 0 y lt 122 y++ ) void convert() 數位資料換算成馬達轉速 r1 = ((value)40)-160

62

附錄 C LCD 顯示之程式

includereg51h 含 8051 所有暫存器宣告 include mathh define RS P3_5 LCD 指令資料選擇控制 define RW P3_4 LCD 讀寫控制腳 define Enable P3_3 LCD 致能接腳 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P0_0 = 0x80 接腳定義 sbit P0_1 = 0x81 接腳定義 sbit P0_2 = 0x82 接腳定義 sbit P0_3 = 0x83 接腳定義 sbit P0_4 = 0x84 接腳定義 sbit P0_5 = 0x85 接腳定義 sbit P0_6 = 0x86 接腳定義 sbit ADCRD = P3^7 設定 RD 控制線接腳為 P37 sbit ADCWR = P3^6 設定 WR 控制線接腳為 P36 void delay(void) 函數原型宣告 void delay10ms(int count) 函數原型宣告 void display(void) 函數原型宣告 void InitialLCD(void) 函數原型宣告 void WriteIns(char) 函數原型宣告 void WriteData(char) 函數原型宣告 void WriteString(charchar) 函數原型宣告 void CheckBusy(void) 函數原型宣告 void convert(void) 函數原型宣告 char MSG0[] = Motor Speed = 定義字串 MSG0 char MSG2[] = rpm 定義字串 MSG2 unsigned char MSG1[8]=0000000 定義字串 MSG1 unsigned long int value 讀取 ADC0804 數位資料 int sample = 1000 取樣率設定消除顯示值跳動 long int rpm

63

main() 主程式 InitialLCD() 初始化 LCD IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x01 設定計時器 0 工作於模式 1 TH0 = (65536-5000)256 設定計時器 0 初值 TL0 = (65536-5000)256 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 while(1) 等待中斷 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 while (--sample == 0) 取樣率減 1 sample = 1000 重設取樣率 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 void T0_int(void) interrupt 1 LCD 顯示動態掃描 display() 動態掃描顯示 TH0 = (65536-65535)256 重設計時初值 TL0 = (65536-65535)256

64

void InitialLCD(void) 設定 LCD 模組初始狀態 delay() 延遲函數 WriteIns(0x38) 設定 LCD 模組為 WriteIns(0x38) 2 行顯示 WriteIns(0x38) 8 位元介面 WriteIns(0x38) 5x7 點字型 WriteIns(0x08) 關閉顯示器 WriteIns(0x01) 清除 LCD 螢幕 WriteIns(0x0c) 令顯示器 ON但游標不顯示 WriteIns(0x06) 令 LCD 模組每接收到 1Byte 資料 AC 值自動加 1 void display() 掃描顯示 WriteIns(0x80) 設定 LCD 座標 WriteString(13MSG0) 將字串 MSG0 寫入 LCD 中 WriteIns(0xc0) 設定 LCD 座標 WriteString(8MSG1) 將字串 MSG1 寫入 LCD 中 WriteIns(0xc8) 設定 LCD 座標 WriteString(4MSG2) 將字串 MSG2 寫入 LCD 中 void convert(void) 換算轉速 long int freq freq = ((value)4000) - 16000 數位資料換成頻率公式 rpm = freq3 頻率換算轉速公式 MSG1[0] = (rpm1000000)+0x30 將結果存入字串 MSG1 中 MSG1[1] = ((rpm1000000)100000)+0x30 MSG1[2] = ((rpm100000)10000)+0x30 MSG1[3] = ((rpm10000)1000)+0x30 MSG1[4] = 0x2e MSG1[5] = ((rpm1000)100)+0x30 MSG1[6] = ((rpm100)10)+0x30 MSG1[7] = rpm10+0x30

65

void WriteIns(char instruction) 寫命令至 LCD 中 RS = 0 選擇指令暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = instruction 輸出命令至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteData(char i) 寫資料至 LCD 中 RS = 1 選擇資料暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = i 輸出資料至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteString(countMSG) 寫字串至 LCD 中 char count 字串長度 char MSG[] 字串資料 char i 定義位元組變數 for(i=0 iltcount i++) count 個位元組 WriteData(MSG[i]) 寫入一位元組的資料至 LCD 中 void CheckBusy(void) char i=0x80 檢查忙碌旗標 while(iamp0x80) 忙錄旗標 BF = 1 RS = 0 選擇指令暫存器 RW = 1 讀取 Enable = 1 致能 LCD i = P2 讀取 LCD 指令暫存器內的資料

66

Enable = 0 除能 LCD delay() 延遲函數 void delay() 延遲 5ms int i for(i=0 ilt250 i++)

  • 畢業專題封面pdf
  • File0004pdf
  • 最終版pdfpdf
Page 49: Based on Fuzzy Control Theorem and TPWM Method for DC ... · 使吾人想設計一模糊控制器來做為馬達轉速的閉迴路控制,以解決非線性系統的 問題。除此之外,flcs

40

5 逆轉〈快〉

ml hsspeed

dspeed

rpm300 450 600150

mvl l h vh

rpm450350250150 550 650 750

750

圖 46 逆轉〈快〉之歸屬函數

6 輸出

OutputMVL L H VH

rpm0-50-150-250 50 150 250

圖 47 輸出之歸屬函數

41

422 模糊規則庫

表 41 為吾人所設計的模糊控制規則庫並利用 Matlab 之 Fuzzy ToolBox 來

建立此規則庫以進行模擬推論圖 48 為當馬達輸入指令為正轉慢時推論後所得

到的三維空間圖

表 41 模糊控制規則表

Dspeed

vl l m h vh

l H M L VL VL

m VH H M L VL sspeed

h VH VH H M L

圖 48 推論後的三維空間圖

42

423 模糊控制器之軟體設計流程

Start 外部中斷副程式

ADCWR = 0 ADCWR = 1

〈令AD開始轉換〉

檢查鍵值以得到對應的歸屬函數

取得目前轉速與

轉速誤差

Fuzzy Rules決策

得到輸出訊號

Delay 10ms

ADC = 0 讀取AD值 ADCRD = 0

將AD值換算成轉速

ADCWR = 0 ADCWR = 1

〈AD開始轉換〉

返回主程式

致能外部中斷

圖 49 Fuzzy Controller 程式流程圖

當控制器一開始動作時便先執行AD轉換的工作當AD轉換完成時其

INTR的接腳便會觸發8051的外部中斷INTR0於是程式便發生外部中斷執行

外部中斷副程式的指令

43

在外部中斷副程式中AD將ㄧ直進行轉換與讀取的工作同時並將轉換後

的值直接換算成目前轉速與轉速誤差以供模糊控制器使用換算目前encoder

的頻率其公式為

160-V2000 times=頻率 〈4-1〉

式4-1之公式是根據表31所導出來的其中V為encoder之頻率轉成電壓之值

又假設所讀取的AD轉換值為value因為

AD的解析度 = bit256

5V+ = 511 ( Vbit ) 〈4-2〉

故value值與電壓V之關係為

511 value V times= 〈4-3〉

所以encoder之頻率與value值的關係為

頻率= 2000times ⎟⎠⎞

⎜⎝⎛ times

511 value - 160 〈4-4〉

故目前轉速為

sspeed = ( )rpm 60 200

times頻率 〈4-5〉

另ㄧ方面在主程式中程式會先去檢查鍵值也就等於檢查輸入指令以

找出符合使用的歸屬函數並將AD所獲得的轉速對應到歸屬函數中然後執行

決策判斷即進入規則庫中尋找出適當的決策判斷最後將此決策送入PWM程

式裡進行脈寬長度的調整使馬達在合理的要求下達到理想的轉速控制不會

因為外在環境的影響而使馬達轉速受到干擾

43 LCD 顯示轉速

此專題最後再增加一LCD顯示幕以顯示目前的轉速否則在程式設計完成

後人卻因無法以肉眼得知目前轉速而不能肯定馬達轉速是否有達到控制的目

標因此增加一顯示幕LCD是有必要的不僅隨時得知目前的轉速還能知道

44

設計出來的軟體其控制性是否夠好夠穩定

431 LCD 顯示幕之軟體流程

Start

設定LCD模組的初始狀態

設定外部中斷INTR0

與Timer0

設定TH0 = (65536 ndash 5000) 256 TL0 = (65536 ndash 5000)256

令ADCWR = 0 ADCWR = 1 AD開始轉換

等待中斷

外部中斷副程式

ADCRD = 0 讀取AD值 ADCRD = 1

將AD值換算成速度

ADCWR = 0 ADCWR = 1 AD開始轉換

Timer0中斷副程式

顯示LCD第一行

ldquoMotor Speed =

顯示LCD第二行ldquoxxxxxxx rpm其中 xxxxxx為外部中斷副程式所換算出的轉速

重設TH0與TL0

返回主程式返回主程式

圖 410 LCD 顯示幕之程式流程圖

此程式主要由兩個部分完成一為外部中斷副程式另ㄧ為 Timer0 中斷副

程式當主程式完成外部與 Timer0 兩個中斷的設定後隨即命令 AD 開始轉換

之後便一直停在 while〈1〉的迴圈裡不做任何動作而由兩個中斷副程式來完

成整個轉換與顯示的工作

45

外部中斷副程式主要負責 AD 的轉換讀取與轉速換算的工作AD 第一

次的轉換由主程式來下達命令當轉換完成後AD 的 INTR 接腳將觸發外部中

斷〈INTR0〉副程式此時程式便進入外部中斷副程式執行讀取 AD 值與轉速

換算的工作當這些工作完成時外部中斷副程式再次下達 AD 開始轉換的命

令而離開中斷副程式當 AD 再次轉換完成時又將再次執行中斷副程式

如此週而復始中斷副程式將ㄧ直進行讀取換算與轉換的工作

而 Timer0 中斷副程式主要負責 LCD 顯示之工作當主程式所設定的計時時

間計數完時程式便進入 Timer0 中斷副程式一旦進入 Timer0 中斷副程式程

式將執行 LCD 的顯示然後再重設 Timer0 的計數時間Timer0 將重新計數當

計數完時程式又將再度進入 Timer0 中斷副程式執行因為程式中並無清除

Timer0 的中斷致能故 Timer0 中斷副程式和外部中斷副程式ㄧ樣週而復始的

執行其副程式的工作

46

第五章 結論

本計劃主旨為具模糊控制理論與雙脈寬調變法之直流馬達驅動電路設計主

要是針對傳統電路設計之缺點提出改良之方法以TPWM取代PWM電路以模

糊理論基礎設計之控制器替代傳統PID控制器

TPWM轉速控制優於PWM之處在於

1 TPWM只需使用單電源即可達到正轉和逆轉的轉速控制而PWM必須

加上逆向開關或是雙電源才能使馬達產生正轉和逆轉

2 TPWM可控制馬達處於停止狀態無論在正向或逆向加上負載皆無法使

馬達產生轉動

3 馬達消耗定額功率輸出轉矩為額定值

4 馬達由停止到某定轉速時反應時間較快

模糊控制器優於PID控制器

1 不須導出繁雜的數學模型

2 適用於非線性系統

3 強健性與容錯性較高

本專題至此雖說大致的目標都已達到但是此系統仍然有許多不完美而需要

改進的地方例如在實驗過程中發現整個轉速的控制在回授上其反應時間

有點慢探討其原因有可能是控制器之程式上的問題

1 因為使用C語言撰寫程式故其執行速度較慢

2 程式可能寫的太累贅

3 模糊控制規則庫建立不良

若想改善這些問題可以嘗試著將C語言改為組合語言來撰寫並盡量減少

47

不必要的指令相信此動作一定能大大提昇程式的執行速度其次就是多做測

試利用測試中所學到的經驗來幫助模糊控制規則庫的改寫同時也能從測試中

發現更多的問題若是都能對問題加以一一解決的話相信必定能將此控制系統

做的更盡善盡美

48

參考文獻

﹝1﹞ 李適中直流馬達速度控制伺服控制〈基礎篇〉全華科技圖書股份有

限公司民 74

﹝2﹞ 廖錦文ldquo直流電動機之雙脈寬調變是〈TPWM〉驅動電路研究電

子技術月刊第 69 期pp94-1021992

﹝3﹞ 楊英魁孫宗瀛鄭魁香林建德蔣旭堂模糊控制理論與技術全華

科技圖書股份有限公司民 85

﹝4﹞ 林敦煌陳憬德直流馬達定位及轉速的模糊控制逢甲大學自動控制工

程學系學士論文民 87

﹝5﹞ LAZadehldquo Fuzzy Sets Information and Control Vol8 pp338-353

1965

﹝6﹞ EHMamdani and SAsslianldquo A fuzzy logic controller for a dynamic

plant Internation Journal of Man-Machine Studies Vol7 pp1-13 1975

﹝7﹞ 孫宗瀛楊英魁Fuzzy 控制理論實作與應用全華科技圖書股份有

限公司民 83 年

﹝8﹞ 許中平黃煌嘉直流電動機控制電路設計全華科技圖書股份有限公司

民 75

﹝9﹞ 盧明智黃敏祥OP Amp 應用+實驗模擬全華科技圖書股份有限公司

民 83

﹝10﹞陳文耀電動機控制工程復文書局2003

﹝11﹞許中平林全福電動機運轉控制技術全華科技圖書股份有限公司民

77

﹝12﹞楊明豐8051 單晶片 C 語言設計實務碁峯資訊2003 年

﹝13﹞蔡朝洋單晶片微電腦 80518951 原理與應用全華科技圖書股份有限公

司民 91

49

﹝14﹞王文俊認識 Fuzzy全華科技圖書股份有限公司民 90

50

附錄 A 專題硬體展示圖

圖 A-1 硬體整體圖

圖 A-2 硬體整體鳥瞰圖

51

圖 A-3 硬體側視圖

圖 A-4 操作與顯示面板

圖 A-5 間距脈波電路與 FV 電路

52

圖 A-6 橋型驅動功率放大電路

圖 A-7 操作與控制面板

53

附錄 B PWM 與模糊控制之程式

include reg51h include stdioh sbit ADCRD = P3^1 設定 RD 控制線接腳為 P31 sbit ADCWR = P3^3 設定 WR 控制線接腳為 P33 sbit P2_0 = 0xA0 接腳定義 sbit P2_1 = 0xA1 接腳定義 sbit P3_0 = 0xB0 接腳定義 sbit P3_1 = 0xB1 接腳定義 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P3_6 = 0xB6 接腳定義 void KeyStatus(void) 函數原型宣告 void feedback(void) 函數原型宣告 void compute_grade(void) 函數原型宣告 void delay1ms(int count) 函數原型宣告 void convert() 函數原型宣告 void condition() 函數原型宣告 void CW(void) 函數原型宣告 int j i 對應 PWM 的寬度 unsigned int temp 所設計的計時器時間 int sample = 1000 取樣率設定消除顯示值跳動 long int value r1 讀取 ADC0804 數位資料 long int set n condition select long int r grade_reg[2] grade[15] error1 error2 long int a1 b1 I long int membership[5][3]membership1[3][3] 定義歸屬函數 long int membership2[3][3] = -10-50-5050510 long int error[2] int Rule[15][3] = 113213313 定義判斷規則庫 212223323 311232333 411241342 511251351

54

main() 主程式 j = PWM = 110 設定 PWM 初始值 IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x00 設定計時器 0 工作於模式 0 temp=8192-j4 設定計時器 0 初值 TH0 = temp 32 TL0 = temp 32 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 P3_4 = 1 P3_5 = 0 P3_6 = 0 ADCWR = 0 令 ADC0804 的 WR = 0 ADCWR = 1 令 ADC0804 的 WR = 1 while (1) KeyStatus() 檢查鍵值 void KeyStatus(void) 檢查鍵值並給對應的 PWM 值 char KeyScan(void) 按鍵掃描函數宣告 unsigned char KeyStatus unsigned char Key = 0 KeyStatus=KeyScan() 呼叫按鍵掃描函數 if (KeyStatus = 0) 已有按鍵輸入 Key = KeyStatus Key = 鍵值 if (Key == 0x01) 假如輸入為按鍵 1 i = 110 PWM 為 110us j = i P3_4 = 1 LED 亮第一顆〈表馬達停止〉 P3_5 = 0 P3_6 = 0

55

else if (Key == 0x02 ) 假如輸入為按鍵 2 i = 140 PWM 為 140us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x04 ) 假如輸入為按鍵 3 i = 180 PWM 為 180us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x08 ) 假如輸入為按鍵 4 i = 80 PWM 為 80us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 else if (Key == 0x10 ) 假如輸入為按鍵 5 i = 40 PWM 為 40us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 PWM = j delay1ms(10) 呼叫延遲函數 feedback() 模糊控制判斷

56

void To_int(void) interrupt 1 Timer0 中斷函數 if (P3_0 == 0) 假如 PWM 輸出為 Low P3_0 = 1 變更 PWM 輸出為 High temp=8192-j4 設定 High 的時間 else 若 PWM 輸出為 High P3_0 = 0 變更 PWM 輸出為 Low temp=8192-880+j4 設定 Low 的時間 TH0 = temp 32 Timer0 的計時時間 TL0 = temp 32 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 char KeyScan(void) 檢查鍵值 char KeyStatus 按鍵狀態 P0=0xff 設定 P0 為輸入模式 KeyStatus=~P0 讀取按鍵狀態 return(KeyStatus) 將鍵值送回程式 void feedback(void) 模糊判斷 void Fuzzycontroller() 函數原型宣告 void condition1() 函數原型宣告

57

void condition2() 函數原型宣告 error1 = ((value)40-160)03 輸入變數 1 delay10ms(10) 延遲 10ms error2 = ((value)40-160)03 輸入變數 2 if (key == 0x01 ) 當按鍵 1找出對應的歸屬函數 並做出模糊控制判斷

int membership[5][3]= -100-60-30-60-300-30030030603060100

int membership1[3][3]=-100-500-50050050100 Fuzzycontroller() condition() if (key == 0x02 ) 當按鍵 2找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

05010050100150100150200150200250200250300 int membership1[3][3]=07515075150225150225300 Fuzzycontroller() condition() else if (key == 0x04) 當按鍵 3找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

200320400300400500400500600500600700600700800 int membership1[3][3]=220370520370520670520670820 Fuzzycontroller() condition() else if (key == 0x08) 當按鍵 4找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

02550255010050100200100200300200300400 int membership1[3][3]=05010050100250100250400 Fuzzycontroller() condition()

58

else if (key == 0x10) 當按鍵 5找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

150250350250350450350450550450550650550650750 int membership1[3][3]=150300450300450600450600750 Fuzzycontroller() condition2() void Fuzzycontroller() 模糊控制判斷 void compute_grade() 函數原型宣告 void compute_grade1() 函數原型宣告 a1 = 0 b1 = 001 I = 0 for (n=0 nlt=14 n++) r = error1 set = Rule[n][0]-1 compute_grade() 計算輸入變數 1 與

模糊程度的歸屬函數 condition = 1 r = error2 set = Rule[n][1]-1 compute_grade1() 計算輸入變數 2 與 模糊程度的歸屬函數 grade[n] = MIN(grade_reg[0] grade_reg[1]) a1 = a1 + (grade[n]membership2[Rule[n][2]-1][1]) b1 = b1 + grade[n] I = a1 b1 得到模糊控制判斷的結果 void compute_grade() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership[set][0]) || (r gt membership[set][2])) 當輸入變數不在 歸屬函數內

59

grade_reg[condition] = 0 else if ((r gt membership[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership[set][2]-r) (membership[set][2] - membership[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership[set][0]) (membership[set][1] - membership[set][0]) void compute_grade1() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership1[set][0]) || (r gt membership1[set][2])) 當輸入變數不在 歸屬函數內 grade_reg[condition] = 0 else if ((r gt membership1[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership1[set][2]-r) (membership1[set][2]-membership1[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership1[set][0]) (membership1[set][1]-membership1[set][0])

60

void condition() P2_0 = 1 設定 P20 為輸入模式 P2_1 = 1 設定 P21 為輸入模式 if ( (P2_0 == 1) ampamp (P2_1 == 0)) 當馬達為正轉時 if ( I gt 0 ) 若模糊判斷結果為正 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 若模糊判斷結果為零 PWM = PWM + 0 PWM 寬度不變 if ( I lt 0 ) 若模糊控制結果小於零 PWM = PWM + 1 PWM 寬度加 1 else if ( (P2_0 == 0) ampamp (P2_1 == 1) ) 若馬達為反轉 if ( I lt 0 ) 模糊控制小於零 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 模糊控制等於零 PWM = PWM + 0 PWM 寬度不變 if ( I gt 0 ) 模糊控制大於零 PWM = PWM + 1 PWM 寬度加 1 CW() 判斷 PWM 寬度上下限

61

void CW() 判斷 PWM 寬度上下限 if ( PWM gt= 215 ) 若 PWM 寬度 gt= 最大寬度 j = 215 PWM 寬度維持於 215us if ( PWM lt= 5 ) 若 PWM 寬度 lt= 最小寬度 j = 5 PWM 寬度維持在 5us if ( PWM gt 5 ampamp PWM lt 215 ) PWM 寬度介於最大與最小間 j = PWM PWM 依模糊控制判斷結果增減 void delay1ms(int count) 延遲 1ms int x y for ( x = 0 x lt count x++ ) for ( y = 0 y lt 122 y++ ) void convert() 數位資料換算成馬達轉速 r1 = ((value)40)-160

62

附錄 C LCD 顯示之程式

includereg51h 含 8051 所有暫存器宣告 include mathh define RS P3_5 LCD 指令資料選擇控制 define RW P3_4 LCD 讀寫控制腳 define Enable P3_3 LCD 致能接腳 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P0_0 = 0x80 接腳定義 sbit P0_1 = 0x81 接腳定義 sbit P0_2 = 0x82 接腳定義 sbit P0_3 = 0x83 接腳定義 sbit P0_4 = 0x84 接腳定義 sbit P0_5 = 0x85 接腳定義 sbit P0_6 = 0x86 接腳定義 sbit ADCRD = P3^7 設定 RD 控制線接腳為 P37 sbit ADCWR = P3^6 設定 WR 控制線接腳為 P36 void delay(void) 函數原型宣告 void delay10ms(int count) 函數原型宣告 void display(void) 函數原型宣告 void InitialLCD(void) 函數原型宣告 void WriteIns(char) 函數原型宣告 void WriteData(char) 函數原型宣告 void WriteString(charchar) 函數原型宣告 void CheckBusy(void) 函數原型宣告 void convert(void) 函數原型宣告 char MSG0[] = Motor Speed = 定義字串 MSG0 char MSG2[] = rpm 定義字串 MSG2 unsigned char MSG1[8]=0000000 定義字串 MSG1 unsigned long int value 讀取 ADC0804 數位資料 int sample = 1000 取樣率設定消除顯示值跳動 long int rpm

63

main() 主程式 InitialLCD() 初始化 LCD IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x01 設定計時器 0 工作於模式 1 TH0 = (65536-5000)256 設定計時器 0 初值 TL0 = (65536-5000)256 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 while(1) 等待中斷 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 while (--sample == 0) 取樣率減 1 sample = 1000 重設取樣率 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 void T0_int(void) interrupt 1 LCD 顯示動態掃描 display() 動態掃描顯示 TH0 = (65536-65535)256 重設計時初值 TL0 = (65536-65535)256

64

void InitialLCD(void) 設定 LCD 模組初始狀態 delay() 延遲函數 WriteIns(0x38) 設定 LCD 模組為 WriteIns(0x38) 2 行顯示 WriteIns(0x38) 8 位元介面 WriteIns(0x38) 5x7 點字型 WriteIns(0x08) 關閉顯示器 WriteIns(0x01) 清除 LCD 螢幕 WriteIns(0x0c) 令顯示器 ON但游標不顯示 WriteIns(0x06) 令 LCD 模組每接收到 1Byte 資料 AC 值自動加 1 void display() 掃描顯示 WriteIns(0x80) 設定 LCD 座標 WriteString(13MSG0) 將字串 MSG0 寫入 LCD 中 WriteIns(0xc0) 設定 LCD 座標 WriteString(8MSG1) 將字串 MSG1 寫入 LCD 中 WriteIns(0xc8) 設定 LCD 座標 WriteString(4MSG2) 將字串 MSG2 寫入 LCD 中 void convert(void) 換算轉速 long int freq freq = ((value)4000) - 16000 數位資料換成頻率公式 rpm = freq3 頻率換算轉速公式 MSG1[0] = (rpm1000000)+0x30 將結果存入字串 MSG1 中 MSG1[1] = ((rpm1000000)100000)+0x30 MSG1[2] = ((rpm100000)10000)+0x30 MSG1[3] = ((rpm10000)1000)+0x30 MSG1[4] = 0x2e MSG1[5] = ((rpm1000)100)+0x30 MSG1[6] = ((rpm100)10)+0x30 MSG1[7] = rpm10+0x30

65

void WriteIns(char instruction) 寫命令至 LCD 中 RS = 0 選擇指令暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = instruction 輸出命令至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteData(char i) 寫資料至 LCD 中 RS = 1 選擇資料暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = i 輸出資料至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteString(countMSG) 寫字串至 LCD 中 char count 字串長度 char MSG[] 字串資料 char i 定義位元組變數 for(i=0 iltcount i++) count 個位元組 WriteData(MSG[i]) 寫入一位元組的資料至 LCD 中 void CheckBusy(void) char i=0x80 檢查忙碌旗標 while(iamp0x80) 忙錄旗標 BF = 1 RS = 0 選擇指令暫存器 RW = 1 讀取 Enable = 1 致能 LCD i = P2 讀取 LCD 指令暫存器內的資料

66

Enable = 0 除能 LCD delay() 延遲函數 void delay() 延遲 5ms int i for(i=0 ilt250 i++)

  • 畢業專題封面pdf
  • File0004pdf
  • 最終版pdfpdf
Page 50: Based on Fuzzy Control Theorem and TPWM Method for DC ... · 使吾人想設計一模糊控制器來做為馬達轉速的閉迴路控制,以解決非線性系統的 問題。除此之外,flcs

41

422 模糊規則庫

表 41 為吾人所設計的模糊控制規則庫並利用 Matlab 之 Fuzzy ToolBox 來

建立此規則庫以進行模擬推論圖 48 為當馬達輸入指令為正轉慢時推論後所得

到的三維空間圖

表 41 模糊控制規則表

Dspeed

vl l m h vh

l H M L VL VL

m VH H M L VL sspeed

h VH VH H M L

圖 48 推論後的三維空間圖

42

423 模糊控制器之軟體設計流程

Start 外部中斷副程式

ADCWR = 0 ADCWR = 1

〈令AD開始轉換〉

檢查鍵值以得到對應的歸屬函數

取得目前轉速與

轉速誤差

Fuzzy Rules決策

得到輸出訊號

Delay 10ms

ADC = 0 讀取AD值 ADCRD = 0

將AD值換算成轉速

ADCWR = 0 ADCWR = 1

〈AD開始轉換〉

返回主程式

致能外部中斷

圖 49 Fuzzy Controller 程式流程圖

當控制器一開始動作時便先執行AD轉換的工作當AD轉換完成時其

INTR的接腳便會觸發8051的外部中斷INTR0於是程式便發生外部中斷執行

外部中斷副程式的指令

43

在外部中斷副程式中AD將ㄧ直進行轉換與讀取的工作同時並將轉換後

的值直接換算成目前轉速與轉速誤差以供模糊控制器使用換算目前encoder

的頻率其公式為

160-V2000 times=頻率 〈4-1〉

式4-1之公式是根據表31所導出來的其中V為encoder之頻率轉成電壓之值

又假設所讀取的AD轉換值為value因為

AD的解析度 = bit256

5V+ = 511 ( Vbit ) 〈4-2〉

故value值與電壓V之關係為

511 value V times= 〈4-3〉

所以encoder之頻率與value值的關係為

頻率= 2000times ⎟⎠⎞

⎜⎝⎛ times

511 value - 160 〈4-4〉

故目前轉速為

sspeed = ( )rpm 60 200

times頻率 〈4-5〉

另ㄧ方面在主程式中程式會先去檢查鍵值也就等於檢查輸入指令以

找出符合使用的歸屬函數並將AD所獲得的轉速對應到歸屬函數中然後執行

決策判斷即進入規則庫中尋找出適當的決策判斷最後將此決策送入PWM程

式裡進行脈寬長度的調整使馬達在合理的要求下達到理想的轉速控制不會

因為外在環境的影響而使馬達轉速受到干擾

43 LCD 顯示轉速

此專題最後再增加一LCD顯示幕以顯示目前的轉速否則在程式設計完成

後人卻因無法以肉眼得知目前轉速而不能肯定馬達轉速是否有達到控制的目

標因此增加一顯示幕LCD是有必要的不僅隨時得知目前的轉速還能知道

44

設計出來的軟體其控制性是否夠好夠穩定

431 LCD 顯示幕之軟體流程

Start

設定LCD模組的初始狀態

設定外部中斷INTR0

與Timer0

設定TH0 = (65536 ndash 5000) 256 TL0 = (65536 ndash 5000)256

令ADCWR = 0 ADCWR = 1 AD開始轉換

等待中斷

外部中斷副程式

ADCRD = 0 讀取AD值 ADCRD = 1

將AD值換算成速度

ADCWR = 0 ADCWR = 1 AD開始轉換

Timer0中斷副程式

顯示LCD第一行

ldquoMotor Speed =

顯示LCD第二行ldquoxxxxxxx rpm其中 xxxxxx為外部中斷副程式所換算出的轉速

重設TH0與TL0

返回主程式返回主程式

圖 410 LCD 顯示幕之程式流程圖

此程式主要由兩個部分完成一為外部中斷副程式另ㄧ為 Timer0 中斷副

程式當主程式完成外部與 Timer0 兩個中斷的設定後隨即命令 AD 開始轉換

之後便一直停在 while〈1〉的迴圈裡不做任何動作而由兩個中斷副程式來完

成整個轉換與顯示的工作

45

外部中斷副程式主要負責 AD 的轉換讀取與轉速換算的工作AD 第一

次的轉換由主程式來下達命令當轉換完成後AD 的 INTR 接腳將觸發外部中

斷〈INTR0〉副程式此時程式便進入外部中斷副程式執行讀取 AD 值與轉速

換算的工作當這些工作完成時外部中斷副程式再次下達 AD 開始轉換的命

令而離開中斷副程式當 AD 再次轉換完成時又將再次執行中斷副程式

如此週而復始中斷副程式將ㄧ直進行讀取換算與轉換的工作

而 Timer0 中斷副程式主要負責 LCD 顯示之工作當主程式所設定的計時時

間計數完時程式便進入 Timer0 中斷副程式一旦進入 Timer0 中斷副程式程

式將執行 LCD 的顯示然後再重設 Timer0 的計數時間Timer0 將重新計數當

計數完時程式又將再度進入 Timer0 中斷副程式執行因為程式中並無清除

Timer0 的中斷致能故 Timer0 中斷副程式和外部中斷副程式ㄧ樣週而復始的

執行其副程式的工作

46

第五章 結論

本計劃主旨為具模糊控制理論與雙脈寬調變法之直流馬達驅動電路設計主

要是針對傳統電路設計之缺點提出改良之方法以TPWM取代PWM電路以模

糊理論基礎設計之控制器替代傳統PID控制器

TPWM轉速控制優於PWM之處在於

1 TPWM只需使用單電源即可達到正轉和逆轉的轉速控制而PWM必須

加上逆向開關或是雙電源才能使馬達產生正轉和逆轉

2 TPWM可控制馬達處於停止狀態無論在正向或逆向加上負載皆無法使

馬達產生轉動

3 馬達消耗定額功率輸出轉矩為額定值

4 馬達由停止到某定轉速時反應時間較快

模糊控制器優於PID控制器

1 不須導出繁雜的數學模型

2 適用於非線性系統

3 強健性與容錯性較高

本專題至此雖說大致的目標都已達到但是此系統仍然有許多不完美而需要

改進的地方例如在實驗過程中發現整個轉速的控制在回授上其反應時間

有點慢探討其原因有可能是控制器之程式上的問題

1 因為使用C語言撰寫程式故其執行速度較慢

2 程式可能寫的太累贅

3 模糊控制規則庫建立不良

若想改善這些問題可以嘗試著將C語言改為組合語言來撰寫並盡量減少

47

不必要的指令相信此動作一定能大大提昇程式的執行速度其次就是多做測

試利用測試中所學到的經驗來幫助模糊控制規則庫的改寫同時也能從測試中

發現更多的問題若是都能對問題加以一一解決的話相信必定能將此控制系統

做的更盡善盡美

48

參考文獻

﹝1﹞ 李適中直流馬達速度控制伺服控制〈基礎篇〉全華科技圖書股份有

限公司民 74

﹝2﹞ 廖錦文ldquo直流電動機之雙脈寬調變是〈TPWM〉驅動電路研究電

子技術月刊第 69 期pp94-1021992

﹝3﹞ 楊英魁孫宗瀛鄭魁香林建德蔣旭堂模糊控制理論與技術全華

科技圖書股份有限公司民 85

﹝4﹞ 林敦煌陳憬德直流馬達定位及轉速的模糊控制逢甲大學自動控制工

程學系學士論文民 87

﹝5﹞ LAZadehldquo Fuzzy Sets Information and Control Vol8 pp338-353

1965

﹝6﹞ EHMamdani and SAsslianldquo A fuzzy logic controller for a dynamic

plant Internation Journal of Man-Machine Studies Vol7 pp1-13 1975

﹝7﹞ 孫宗瀛楊英魁Fuzzy 控制理論實作與應用全華科技圖書股份有

限公司民 83 年

﹝8﹞ 許中平黃煌嘉直流電動機控制電路設計全華科技圖書股份有限公司

民 75

﹝9﹞ 盧明智黃敏祥OP Amp 應用+實驗模擬全華科技圖書股份有限公司

民 83

﹝10﹞陳文耀電動機控制工程復文書局2003

﹝11﹞許中平林全福電動機運轉控制技術全華科技圖書股份有限公司民

77

﹝12﹞楊明豐8051 單晶片 C 語言設計實務碁峯資訊2003 年

﹝13﹞蔡朝洋單晶片微電腦 80518951 原理與應用全華科技圖書股份有限公

司民 91

49

﹝14﹞王文俊認識 Fuzzy全華科技圖書股份有限公司民 90

50

附錄 A 專題硬體展示圖

圖 A-1 硬體整體圖

圖 A-2 硬體整體鳥瞰圖

51

圖 A-3 硬體側視圖

圖 A-4 操作與顯示面板

圖 A-5 間距脈波電路與 FV 電路

52

圖 A-6 橋型驅動功率放大電路

圖 A-7 操作與控制面板

53

附錄 B PWM 與模糊控制之程式

include reg51h include stdioh sbit ADCRD = P3^1 設定 RD 控制線接腳為 P31 sbit ADCWR = P3^3 設定 WR 控制線接腳為 P33 sbit P2_0 = 0xA0 接腳定義 sbit P2_1 = 0xA1 接腳定義 sbit P3_0 = 0xB0 接腳定義 sbit P3_1 = 0xB1 接腳定義 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P3_6 = 0xB6 接腳定義 void KeyStatus(void) 函數原型宣告 void feedback(void) 函數原型宣告 void compute_grade(void) 函數原型宣告 void delay1ms(int count) 函數原型宣告 void convert() 函數原型宣告 void condition() 函數原型宣告 void CW(void) 函數原型宣告 int j i 對應 PWM 的寬度 unsigned int temp 所設計的計時器時間 int sample = 1000 取樣率設定消除顯示值跳動 long int value r1 讀取 ADC0804 數位資料 long int set n condition select long int r grade_reg[2] grade[15] error1 error2 long int a1 b1 I long int membership[5][3]membership1[3][3] 定義歸屬函數 long int membership2[3][3] = -10-50-5050510 long int error[2] int Rule[15][3] = 113213313 定義判斷規則庫 212223323 311232333 411241342 511251351

54

main() 主程式 j = PWM = 110 設定 PWM 初始值 IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x00 設定計時器 0 工作於模式 0 temp=8192-j4 設定計時器 0 初值 TH0 = temp 32 TL0 = temp 32 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 P3_4 = 1 P3_5 = 0 P3_6 = 0 ADCWR = 0 令 ADC0804 的 WR = 0 ADCWR = 1 令 ADC0804 的 WR = 1 while (1) KeyStatus() 檢查鍵值 void KeyStatus(void) 檢查鍵值並給對應的 PWM 值 char KeyScan(void) 按鍵掃描函數宣告 unsigned char KeyStatus unsigned char Key = 0 KeyStatus=KeyScan() 呼叫按鍵掃描函數 if (KeyStatus = 0) 已有按鍵輸入 Key = KeyStatus Key = 鍵值 if (Key == 0x01) 假如輸入為按鍵 1 i = 110 PWM 為 110us j = i P3_4 = 1 LED 亮第一顆〈表馬達停止〉 P3_5 = 0 P3_6 = 0

55

else if (Key == 0x02 ) 假如輸入為按鍵 2 i = 140 PWM 為 140us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x04 ) 假如輸入為按鍵 3 i = 180 PWM 為 180us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x08 ) 假如輸入為按鍵 4 i = 80 PWM 為 80us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 else if (Key == 0x10 ) 假如輸入為按鍵 5 i = 40 PWM 為 40us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 PWM = j delay1ms(10) 呼叫延遲函數 feedback() 模糊控制判斷

56

void To_int(void) interrupt 1 Timer0 中斷函數 if (P3_0 == 0) 假如 PWM 輸出為 Low P3_0 = 1 變更 PWM 輸出為 High temp=8192-j4 設定 High 的時間 else 若 PWM 輸出為 High P3_0 = 0 變更 PWM 輸出為 Low temp=8192-880+j4 設定 Low 的時間 TH0 = temp 32 Timer0 的計時時間 TL0 = temp 32 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 char KeyScan(void) 檢查鍵值 char KeyStatus 按鍵狀態 P0=0xff 設定 P0 為輸入模式 KeyStatus=~P0 讀取按鍵狀態 return(KeyStatus) 將鍵值送回程式 void feedback(void) 模糊判斷 void Fuzzycontroller() 函數原型宣告 void condition1() 函數原型宣告

57

void condition2() 函數原型宣告 error1 = ((value)40-160)03 輸入變數 1 delay10ms(10) 延遲 10ms error2 = ((value)40-160)03 輸入變數 2 if (key == 0x01 ) 當按鍵 1找出對應的歸屬函數 並做出模糊控制判斷

int membership[5][3]= -100-60-30-60-300-30030030603060100

int membership1[3][3]=-100-500-50050050100 Fuzzycontroller() condition() if (key == 0x02 ) 當按鍵 2找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

05010050100150100150200150200250200250300 int membership1[3][3]=07515075150225150225300 Fuzzycontroller() condition() else if (key == 0x04) 當按鍵 3找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

200320400300400500400500600500600700600700800 int membership1[3][3]=220370520370520670520670820 Fuzzycontroller() condition() else if (key == 0x08) 當按鍵 4找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

02550255010050100200100200300200300400 int membership1[3][3]=05010050100250100250400 Fuzzycontroller() condition()

58

else if (key == 0x10) 當按鍵 5找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

150250350250350450350450550450550650550650750 int membership1[3][3]=150300450300450600450600750 Fuzzycontroller() condition2() void Fuzzycontroller() 模糊控制判斷 void compute_grade() 函數原型宣告 void compute_grade1() 函數原型宣告 a1 = 0 b1 = 001 I = 0 for (n=0 nlt=14 n++) r = error1 set = Rule[n][0]-1 compute_grade() 計算輸入變數 1 與

模糊程度的歸屬函數 condition = 1 r = error2 set = Rule[n][1]-1 compute_grade1() 計算輸入變數 2 與 模糊程度的歸屬函數 grade[n] = MIN(grade_reg[0] grade_reg[1]) a1 = a1 + (grade[n]membership2[Rule[n][2]-1][1]) b1 = b1 + grade[n] I = a1 b1 得到模糊控制判斷的結果 void compute_grade() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership[set][0]) || (r gt membership[set][2])) 當輸入變數不在 歸屬函數內

59

grade_reg[condition] = 0 else if ((r gt membership[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership[set][2]-r) (membership[set][2] - membership[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership[set][0]) (membership[set][1] - membership[set][0]) void compute_grade1() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership1[set][0]) || (r gt membership1[set][2])) 當輸入變數不在 歸屬函數內 grade_reg[condition] = 0 else if ((r gt membership1[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership1[set][2]-r) (membership1[set][2]-membership1[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership1[set][0]) (membership1[set][1]-membership1[set][0])

60

void condition() P2_0 = 1 設定 P20 為輸入模式 P2_1 = 1 設定 P21 為輸入模式 if ( (P2_0 == 1) ampamp (P2_1 == 0)) 當馬達為正轉時 if ( I gt 0 ) 若模糊判斷結果為正 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 若模糊判斷結果為零 PWM = PWM + 0 PWM 寬度不變 if ( I lt 0 ) 若模糊控制結果小於零 PWM = PWM + 1 PWM 寬度加 1 else if ( (P2_0 == 0) ampamp (P2_1 == 1) ) 若馬達為反轉 if ( I lt 0 ) 模糊控制小於零 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 模糊控制等於零 PWM = PWM + 0 PWM 寬度不變 if ( I gt 0 ) 模糊控制大於零 PWM = PWM + 1 PWM 寬度加 1 CW() 判斷 PWM 寬度上下限

61

void CW() 判斷 PWM 寬度上下限 if ( PWM gt= 215 ) 若 PWM 寬度 gt= 最大寬度 j = 215 PWM 寬度維持於 215us if ( PWM lt= 5 ) 若 PWM 寬度 lt= 最小寬度 j = 5 PWM 寬度維持在 5us if ( PWM gt 5 ampamp PWM lt 215 ) PWM 寬度介於最大與最小間 j = PWM PWM 依模糊控制判斷結果增減 void delay1ms(int count) 延遲 1ms int x y for ( x = 0 x lt count x++ ) for ( y = 0 y lt 122 y++ ) void convert() 數位資料換算成馬達轉速 r1 = ((value)40)-160

62

附錄 C LCD 顯示之程式

includereg51h 含 8051 所有暫存器宣告 include mathh define RS P3_5 LCD 指令資料選擇控制 define RW P3_4 LCD 讀寫控制腳 define Enable P3_3 LCD 致能接腳 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P0_0 = 0x80 接腳定義 sbit P0_1 = 0x81 接腳定義 sbit P0_2 = 0x82 接腳定義 sbit P0_3 = 0x83 接腳定義 sbit P0_4 = 0x84 接腳定義 sbit P0_5 = 0x85 接腳定義 sbit P0_6 = 0x86 接腳定義 sbit ADCRD = P3^7 設定 RD 控制線接腳為 P37 sbit ADCWR = P3^6 設定 WR 控制線接腳為 P36 void delay(void) 函數原型宣告 void delay10ms(int count) 函數原型宣告 void display(void) 函數原型宣告 void InitialLCD(void) 函數原型宣告 void WriteIns(char) 函數原型宣告 void WriteData(char) 函數原型宣告 void WriteString(charchar) 函數原型宣告 void CheckBusy(void) 函數原型宣告 void convert(void) 函數原型宣告 char MSG0[] = Motor Speed = 定義字串 MSG0 char MSG2[] = rpm 定義字串 MSG2 unsigned char MSG1[8]=0000000 定義字串 MSG1 unsigned long int value 讀取 ADC0804 數位資料 int sample = 1000 取樣率設定消除顯示值跳動 long int rpm

63

main() 主程式 InitialLCD() 初始化 LCD IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x01 設定計時器 0 工作於模式 1 TH0 = (65536-5000)256 設定計時器 0 初值 TL0 = (65536-5000)256 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 while(1) 等待中斷 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 while (--sample == 0) 取樣率減 1 sample = 1000 重設取樣率 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 void T0_int(void) interrupt 1 LCD 顯示動態掃描 display() 動態掃描顯示 TH0 = (65536-65535)256 重設計時初值 TL0 = (65536-65535)256

64

void InitialLCD(void) 設定 LCD 模組初始狀態 delay() 延遲函數 WriteIns(0x38) 設定 LCD 模組為 WriteIns(0x38) 2 行顯示 WriteIns(0x38) 8 位元介面 WriteIns(0x38) 5x7 點字型 WriteIns(0x08) 關閉顯示器 WriteIns(0x01) 清除 LCD 螢幕 WriteIns(0x0c) 令顯示器 ON但游標不顯示 WriteIns(0x06) 令 LCD 模組每接收到 1Byte 資料 AC 值自動加 1 void display() 掃描顯示 WriteIns(0x80) 設定 LCD 座標 WriteString(13MSG0) 將字串 MSG0 寫入 LCD 中 WriteIns(0xc0) 設定 LCD 座標 WriteString(8MSG1) 將字串 MSG1 寫入 LCD 中 WriteIns(0xc8) 設定 LCD 座標 WriteString(4MSG2) 將字串 MSG2 寫入 LCD 中 void convert(void) 換算轉速 long int freq freq = ((value)4000) - 16000 數位資料換成頻率公式 rpm = freq3 頻率換算轉速公式 MSG1[0] = (rpm1000000)+0x30 將結果存入字串 MSG1 中 MSG1[1] = ((rpm1000000)100000)+0x30 MSG1[2] = ((rpm100000)10000)+0x30 MSG1[3] = ((rpm10000)1000)+0x30 MSG1[4] = 0x2e MSG1[5] = ((rpm1000)100)+0x30 MSG1[6] = ((rpm100)10)+0x30 MSG1[7] = rpm10+0x30

65

void WriteIns(char instruction) 寫命令至 LCD 中 RS = 0 選擇指令暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = instruction 輸出命令至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteData(char i) 寫資料至 LCD 中 RS = 1 選擇資料暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = i 輸出資料至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteString(countMSG) 寫字串至 LCD 中 char count 字串長度 char MSG[] 字串資料 char i 定義位元組變數 for(i=0 iltcount i++) count 個位元組 WriteData(MSG[i]) 寫入一位元組的資料至 LCD 中 void CheckBusy(void) char i=0x80 檢查忙碌旗標 while(iamp0x80) 忙錄旗標 BF = 1 RS = 0 選擇指令暫存器 RW = 1 讀取 Enable = 1 致能 LCD i = P2 讀取 LCD 指令暫存器內的資料

66

Enable = 0 除能 LCD delay() 延遲函數 void delay() 延遲 5ms int i for(i=0 ilt250 i++)

  • 畢業專題封面pdf
  • File0004pdf
  • 最終版pdfpdf
Page 51: Based on Fuzzy Control Theorem and TPWM Method for DC ... · 使吾人想設計一模糊控制器來做為馬達轉速的閉迴路控制,以解決非線性系統的 問題。除此之外,flcs

42

423 模糊控制器之軟體設計流程

Start 外部中斷副程式

ADCWR = 0 ADCWR = 1

〈令AD開始轉換〉

檢查鍵值以得到對應的歸屬函數

取得目前轉速與

轉速誤差

Fuzzy Rules決策

得到輸出訊號

Delay 10ms

ADC = 0 讀取AD值 ADCRD = 0

將AD值換算成轉速

ADCWR = 0 ADCWR = 1

〈AD開始轉換〉

返回主程式

致能外部中斷

圖 49 Fuzzy Controller 程式流程圖

當控制器一開始動作時便先執行AD轉換的工作當AD轉換完成時其

INTR的接腳便會觸發8051的外部中斷INTR0於是程式便發生外部中斷執行

外部中斷副程式的指令

43

在外部中斷副程式中AD將ㄧ直進行轉換與讀取的工作同時並將轉換後

的值直接換算成目前轉速與轉速誤差以供模糊控制器使用換算目前encoder

的頻率其公式為

160-V2000 times=頻率 〈4-1〉

式4-1之公式是根據表31所導出來的其中V為encoder之頻率轉成電壓之值

又假設所讀取的AD轉換值為value因為

AD的解析度 = bit256

5V+ = 511 ( Vbit ) 〈4-2〉

故value值與電壓V之關係為

511 value V times= 〈4-3〉

所以encoder之頻率與value值的關係為

頻率= 2000times ⎟⎠⎞

⎜⎝⎛ times

511 value - 160 〈4-4〉

故目前轉速為

sspeed = ( )rpm 60 200

times頻率 〈4-5〉

另ㄧ方面在主程式中程式會先去檢查鍵值也就等於檢查輸入指令以

找出符合使用的歸屬函數並將AD所獲得的轉速對應到歸屬函數中然後執行

決策判斷即進入規則庫中尋找出適當的決策判斷最後將此決策送入PWM程

式裡進行脈寬長度的調整使馬達在合理的要求下達到理想的轉速控制不會

因為外在環境的影響而使馬達轉速受到干擾

43 LCD 顯示轉速

此專題最後再增加一LCD顯示幕以顯示目前的轉速否則在程式設計完成

後人卻因無法以肉眼得知目前轉速而不能肯定馬達轉速是否有達到控制的目

標因此增加一顯示幕LCD是有必要的不僅隨時得知目前的轉速還能知道

44

設計出來的軟體其控制性是否夠好夠穩定

431 LCD 顯示幕之軟體流程

Start

設定LCD模組的初始狀態

設定外部中斷INTR0

與Timer0

設定TH0 = (65536 ndash 5000) 256 TL0 = (65536 ndash 5000)256

令ADCWR = 0 ADCWR = 1 AD開始轉換

等待中斷

外部中斷副程式

ADCRD = 0 讀取AD值 ADCRD = 1

將AD值換算成速度

ADCWR = 0 ADCWR = 1 AD開始轉換

Timer0中斷副程式

顯示LCD第一行

ldquoMotor Speed =

顯示LCD第二行ldquoxxxxxxx rpm其中 xxxxxx為外部中斷副程式所換算出的轉速

重設TH0與TL0

返回主程式返回主程式

圖 410 LCD 顯示幕之程式流程圖

此程式主要由兩個部分完成一為外部中斷副程式另ㄧ為 Timer0 中斷副

程式當主程式完成外部與 Timer0 兩個中斷的設定後隨即命令 AD 開始轉換

之後便一直停在 while〈1〉的迴圈裡不做任何動作而由兩個中斷副程式來完

成整個轉換與顯示的工作

45

外部中斷副程式主要負責 AD 的轉換讀取與轉速換算的工作AD 第一

次的轉換由主程式來下達命令當轉換完成後AD 的 INTR 接腳將觸發外部中

斷〈INTR0〉副程式此時程式便進入外部中斷副程式執行讀取 AD 值與轉速

換算的工作當這些工作完成時外部中斷副程式再次下達 AD 開始轉換的命

令而離開中斷副程式當 AD 再次轉換完成時又將再次執行中斷副程式

如此週而復始中斷副程式將ㄧ直進行讀取換算與轉換的工作

而 Timer0 中斷副程式主要負責 LCD 顯示之工作當主程式所設定的計時時

間計數完時程式便進入 Timer0 中斷副程式一旦進入 Timer0 中斷副程式程

式將執行 LCD 的顯示然後再重設 Timer0 的計數時間Timer0 將重新計數當

計數完時程式又將再度進入 Timer0 中斷副程式執行因為程式中並無清除

Timer0 的中斷致能故 Timer0 中斷副程式和外部中斷副程式ㄧ樣週而復始的

執行其副程式的工作

46

第五章 結論

本計劃主旨為具模糊控制理論與雙脈寬調變法之直流馬達驅動電路設計主

要是針對傳統電路設計之缺點提出改良之方法以TPWM取代PWM電路以模

糊理論基礎設計之控制器替代傳統PID控制器

TPWM轉速控制優於PWM之處在於

1 TPWM只需使用單電源即可達到正轉和逆轉的轉速控制而PWM必須

加上逆向開關或是雙電源才能使馬達產生正轉和逆轉

2 TPWM可控制馬達處於停止狀態無論在正向或逆向加上負載皆無法使

馬達產生轉動

3 馬達消耗定額功率輸出轉矩為額定值

4 馬達由停止到某定轉速時反應時間較快

模糊控制器優於PID控制器

1 不須導出繁雜的數學模型

2 適用於非線性系統

3 強健性與容錯性較高

本專題至此雖說大致的目標都已達到但是此系統仍然有許多不完美而需要

改進的地方例如在實驗過程中發現整個轉速的控制在回授上其反應時間

有點慢探討其原因有可能是控制器之程式上的問題

1 因為使用C語言撰寫程式故其執行速度較慢

2 程式可能寫的太累贅

3 模糊控制規則庫建立不良

若想改善這些問題可以嘗試著將C語言改為組合語言來撰寫並盡量減少

47

不必要的指令相信此動作一定能大大提昇程式的執行速度其次就是多做測

試利用測試中所學到的經驗來幫助模糊控制規則庫的改寫同時也能從測試中

發現更多的問題若是都能對問題加以一一解決的話相信必定能將此控制系統

做的更盡善盡美

48

參考文獻

﹝1﹞ 李適中直流馬達速度控制伺服控制〈基礎篇〉全華科技圖書股份有

限公司民 74

﹝2﹞ 廖錦文ldquo直流電動機之雙脈寬調變是〈TPWM〉驅動電路研究電

子技術月刊第 69 期pp94-1021992

﹝3﹞ 楊英魁孫宗瀛鄭魁香林建德蔣旭堂模糊控制理論與技術全華

科技圖書股份有限公司民 85

﹝4﹞ 林敦煌陳憬德直流馬達定位及轉速的模糊控制逢甲大學自動控制工

程學系學士論文民 87

﹝5﹞ LAZadehldquo Fuzzy Sets Information and Control Vol8 pp338-353

1965

﹝6﹞ EHMamdani and SAsslianldquo A fuzzy logic controller for a dynamic

plant Internation Journal of Man-Machine Studies Vol7 pp1-13 1975

﹝7﹞ 孫宗瀛楊英魁Fuzzy 控制理論實作與應用全華科技圖書股份有

限公司民 83 年

﹝8﹞ 許中平黃煌嘉直流電動機控制電路設計全華科技圖書股份有限公司

民 75

﹝9﹞ 盧明智黃敏祥OP Amp 應用+實驗模擬全華科技圖書股份有限公司

民 83

﹝10﹞陳文耀電動機控制工程復文書局2003

﹝11﹞許中平林全福電動機運轉控制技術全華科技圖書股份有限公司民

77

﹝12﹞楊明豐8051 單晶片 C 語言設計實務碁峯資訊2003 年

﹝13﹞蔡朝洋單晶片微電腦 80518951 原理與應用全華科技圖書股份有限公

司民 91

49

﹝14﹞王文俊認識 Fuzzy全華科技圖書股份有限公司民 90

50

附錄 A 專題硬體展示圖

圖 A-1 硬體整體圖

圖 A-2 硬體整體鳥瞰圖

51

圖 A-3 硬體側視圖

圖 A-4 操作與顯示面板

圖 A-5 間距脈波電路與 FV 電路

52

圖 A-6 橋型驅動功率放大電路

圖 A-7 操作與控制面板

53

附錄 B PWM 與模糊控制之程式

include reg51h include stdioh sbit ADCRD = P3^1 設定 RD 控制線接腳為 P31 sbit ADCWR = P3^3 設定 WR 控制線接腳為 P33 sbit P2_0 = 0xA0 接腳定義 sbit P2_1 = 0xA1 接腳定義 sbit P3_0 = 0xB0 接腳定義 sbit P3_1 = 0xB1 接腳定義 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P3_6 = 0xB6 接腳定義 void KeyStatus(void) 函數原型宣告 void feedback(void) 函數原型宣告 void compute_grade(void) 函數原型宣告 void delay1ms(int count) 函數原型宣告 void convert() 函數原型宣告 void condition() 函數原型宣告 void CW(void) 函數原型宣告 int j i 對應 PWM 的寬度 unsigned int temp 所設計的計時器時間 int sample = 1000 取樣率設定消除顯示值跳動 long int value r1 讀取 ADC0804 數位資料 long int set n condition select long int r grade_reg[2] grade[15] error1 error2 long int a1 b1 I long int membership[5][3]membership1[3][3] 定義歸屬函數 long int membership2[3][3] = -10-50-5050510 long int error[2] int Rule[15][3] = 113213313 定義判斷規則庫 212223323 311232333 411241342 511251351

54

main() 主程式 j = PWM = 110 設定 PWM 初始值 IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x00 設定計時器 0 工作於模式 0 temp=8192-j4 設定計時器 0 初值 TH0 = temp 32 TL0 = temp 32 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 P3_4 = 1 P3_5 = 0 P3_6 = 0 ADCWR = 0 令 ADC0804 的 WR = 0 ADCWR = 1 令 ADC0804 的 WR = 1 while (1) KeyStatus() 檢查鍵值 void KeyStatus(void) 檢查鍵值並給對應的 PWM 值 char KeyScan(void) 按鍵掃描函數宣告 unsigned char KeyStatus unsigned char Key = 0 KeyStatus=KeyScan() 呼叫按鍵掃描函數 if (KeyStatus = 0) 已有按鍵輸入 Key = KeyStatus Key = 鍵值 if (Key == 0x01) 假如輸入為按鍵 1 i = 110 PWM 為 110us j = i P3_4 = 1 LED 亮第一顆〈表馬達停止〉 P3_5 = 0 P3_6 = 0

55

else if (Key == 0x02 ) 假如輸入為按鍵 2 i = 140 PWM 為 140us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x04 ) 假如輸入為按鍵 3 i = 180 PWM 為 180us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x08 ) 假如輸入為按鍵 4 i = 80 PWM 為 80us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 else if (Key == 0x10 ) 假如輸入為按鍵 5 i = 40 PWM 為 40us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 PWM = j delay1ms(10) 呼叫延遲函數 feedback() 模糊控制判斷

56

void To_int(void) interrupt 1 Timer0 中斷函數 if (P3_0 == 0) 假如 PWM 輸出為 Low P3_0 = 1 變更 PWM 輸出為 High temp=8192-j4 設定 High 的時間 else 若 PWM 輸出為 High P3_0 = 0 變更 PWM 輸出為 Low temp=8192-880+j4 設定 Low 的時間 TH0 = temp 32 Timer0 的計時時間 TL0 = temp 32 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 char KeyScan(void) 檢查鍵值 char KeyStatus 按鍵狀態 P0=0xff 設定 P0 為輸入模式 KeyStatus=~P0 讀取按鍵狀態 return(KeyStatus) 將鍵值送回程式 void feedback(void) 模糊判斷 void Fuzzycontroller() 函數原型宣告 void condition1() 函數原型宣告

57

void condition2() 函數原型宣告 error1 = ((value)40-160)03 輸入變數 1 delay10ms(10) 延遲 10ms error2 = ((value)40-160)03 輸入變數 2 if (key == 0x01 ) 當按鍵 1找出對應的歸屬函數 並做出模糊控制判斷

int membership[5][3]= -100-60-30-60-300-30030030603060100

int membership1[3][3]=-100-500-50050050100 Fuzzycontroller() condition() if (key == 0x02 ) 當按鍵 2找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

05010050100150100150200150200250200250300 int membership1[3][3]=07515075150225150225300 Fuzzycontroller() condition() else if (key == 0x04) 當按鍵 3找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

200320400300400500400500600500600700600700800 int membership1[3][3]=220370520370520670520670820 Fuzzycontroller() condition() else if (key == 0x08) 當按鍵 4找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

02550255010050100200100200300200300400 int membership1[3][3]=05010050100250100250400 Fuzzycontroller() condition()

58

else if (key == 0x10) 當按鍵 5找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

150250350250350450350450550450550650550650750 int membership1[3][3]=150300450300450600450600750 Fuzzycontroller() condition2() void Fuzzycontroller() 模糊控制判斷 void compute_grade() 函數原型宣告 void compute_grade1() 函數原型宣告 a1 = 0 b1 = 001 I = 0 for (n=0 nlt=14 n++) r = error1 set = Rule[n][0]-1 compute_grade() 計算輸入變數 1 與

模糊程度的歸屬函數 condition = 1 r = error2 set = Rule[n][1]-1 compute_grade1() 計算輸入變數 2 與 模糊程度的歸屬函數 grade[n] = MIN(grade_reg[0] grade_reg[1]) a1 = a1 + (grade[n]membership2[Rule[n][2]-1][1]) b1 = b1 + grade[n] I = a1 b1 得到模糊控制判斷的結果 void compute_grade() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership[set][0]) || (r gt membership[set][2])) 當輸入變數不在 歸屬函數內

59

grade_reg[condition] = 0 else if ((r gt membership[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership[set][2]-r) (membership[set][2] - membership[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership[set][0]) (membership[set][1] - membership[set][0]) void compute_grade1() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership1[set][0]) || (r gt membership1[set][2])) 當輸入變數不在 歸屬函數內 grade_reg[condition] = 0 else if ((r gt membership1[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership1[set][2]-r) (membership1[set][2]-membership1[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership1[set][0]) (membership1[set][1]-membership1[set][0])

60

void condition() P2_0 = 1 設定 P20 為輸入模式 P2_1 = 1 設定 P21 為輸入模式 if ( (P2_0 == 1) ampamp (P2_1 == 0)) 當馬達為正轉時 if ( I gt 0 ) 若模糊判斷結果為正 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 若模糊判斷結果為零 PWM = PWM + 0 PWM 寬度不變 if ( I lt 0 ) 若模糊控制結果小於零 PWM = PWM + 1 PWM 寬度加 1 else if ( (P2_0 == 0) ampamp (P2_1 == 1) ) 若馬達為反轉 if ( I lt 0 ) 模糊控制小於零 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 模糊控制等於零 PWM = PWM + 0 PWM 寬度不變 if ( I gt 0 ) 模糊控制大於零 PWM = PWM + 1 PWM 寬度加 1 CW() 判斷 PWM 寬度上下限

61

void CW() 判斷 PWM 寬度上下限 if ( PWM gt= 215 ) 若 PWM 寬度 gt= 最大寬度 j = 215 PWM 寬度維持於 215us if ( PWM lt= 5 ) 若 PWM 寬度 lt= 最小寬度 j = 5 PWM 寬度維持在 5us if ( PWM gt 5 ampamp PWM lt 215 ) PWM 寬度介於最大與最小間 j = PWM PWM 依模糊控制判斷結果增減 void delay1ms(int count) 延遲 1ms int x y for ( x = 0 x lt count x++ ) for ( y = 0 y lt 122 y++ ) void convert() 數位資料換算成馬達轉速 r1 = ((value)40)-160

62

附錄 C LCD 顯示之程式

includereg51h 含 8051 所有暫存器宣告 include mathh define RS P3_5 LCD 指令資料選擇控制 define RW P3_4 LCD 讀寫控制腳 define Enable P3_3 LCD 致能接腳 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P0_0 = 0x80 接腳定義 sbit P0_1 = 0x81 接腳定義 sbit P0_2 = 0x82 接腳定義 sbit P0_3 = 0x83 接腳定義 sbit P0_4 = 0x84 接腳定義 sbit P0_5 = 0x85 接腳定義 sbit P0_6 = 0x86 接腳定義 sbit ADCRD = P3^7 設定 RD 控制線接腳為 P37 sbit ADCWR = P3^6 設定 WR 控制線接腳為 P36 void delay(void) 函數原型宣告 void delay10ms(int count) 函數原型宣告 void display(void) 函數原型宣告 void InitialLCD(void) 函數原型宣告 void WriteIns(char) 函數原型宣告 void WriteData(char) 函數原型宣告 void WriteString(charchar) 函數原型宣告 void CheckBusy(void) 函數原型宣告 void convert(void) 函數原型宣告 char MSG0[] = Motor Speed = 定義字串 MSG0 char MSG2[] = rpm 定義字串 MSG2 unsigned char MSG1[8]=0000000 定義字串 MSG1 unsigned long int value 讀取 ADC0804 數位資料 int sample = 1000 取樣率設定消除顯示值跳動 long int rpm

63

main() 主程式 InitialLCD() 初始化 LCD IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x01 設定計時器 0 工作於模式 1 TH0 = (65536-5000)256 設定計時器 0 初值 TL0 = (65536-5000)256 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 while(1) 等待中斷 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 while (--sample == 0) 取樣率減 1 sample = 1000 重設取樣率 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 void T0_int(void) interrupt 1 LCD 顯示動態掃描 display() 動態掃描顯示 TH0 = (65536-65535)256 重設計時初值 TL0 = (65536-65535)256

64

void InitialLCD(void) 設定 LCD 模組初始狀態 delay() 延遲函數 WriteIns(0x38) 設定 LCD 模組為 WriteIns(0x38) 2 行顯示 WriteIns(0x38) 8 位元介面 WriteIns(0x38) 5x7 點字型 WriteIns(0x08) 關閉顯示器 WriteIns(0x01) 清除 LCD 螢幕 WriteIns(0x0c) 令顯示器 ON但游標不顯示 WriteIns(0x06) 令 LCD 模組每接收到 1Byte 資料 AC 值自動加 1 void display() 掃描顯示 WriteIns(0x80) 設定 LCD 座標 WriteString(13MSG0) 將字串 MSG0 寫入 LCD 中 WriteIns(0xc0) 設定 LCD 座標 WriteString(8MSG1) 將字串 MSG1 寫入 LCD 中 WriteIns(0xc8) 設定 LCD 座標 WriteString(4MSG2) 將字串 MSG2 寫入 LCD 中 void convert(void) 換算轉速 long int freq freq = ((value)4000) - 16000 數位資料換成頻率公式 rpm = freq3 頻率換算轉速公式 MSG1[0] = (rpm1000000)+0x30 將結果存入字串 MSG1 中 MSG1[1] = ((rpm1000000)100000)+0x30 MSG1[2] = ((rpm100000)10000)+0x30 MSG1[3] = ((rpm10000)1000)+0x30 MSG1[4] = 0x2e MSG1[5] = ((rpm1000)100)+0x30 MSG1[6] = ((rpm100)10)+0x30 MSG1[7] = rpm10+0x30

65

void WriteIns(char instruction) 寫命令至 LCD 中 RS = 0 選擇指令暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = instruction 輸出命令至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteData(char i) 寫資料至 LCD 中 RS = 1 選擇資料暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = i 輸出資料至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteString(countMSG) 寫字串至 LCD 中 char count 字串長度 char MSG[] 字串資料 char i 定義位元組變數 for(i=0 iltcount i++) count 個位元組 WriteData(MSG[i]) 寫入一位元組的資料至 LCD 中 void CheckBusy(void) char i=0x80 檢查忙碌旗標 while(iamp0x80) 忙錄旗標 BF = 1 RS = 0 選擇指令暫存器 RW = 1 讀取 Enable = 1 致能 LCD i = P2 讀取 LCD 指令暫存器內的資料

66

Enable = 0 除能 LCD delay() 延遲函數 void delay() 延遲 5ms int i for(i=0 ilt250 i++)

  • 畢業專題封面pdf
  • File0004pdf
  • 最終版pdfpdf
Page 52: Based on Fuzzy Control Theorem and TPWM Method for DC ... · 使吾人想設計一模糊控制器來做為馬達轉速的閉迴路控制,以解決非線性系統的 問題。除此之外,flcs

43

在外部中斷副程式中AD將ㄧ直進行轉換與讀取的工作同時並將轉換後

的值直接換算成目前轉速與轉速誤差以供模糊控制器使用換算目前encoder

的頻率其公式為

160-V2000 times=頻率 〈4-1〉

式4-1之公式是根據表31所導出來的其中V為encoder之頻率轉成電壓之值

又假設所讀取的AD轉換值為value因為

AD的解析度 = bit256

5V+ = 511 ( Vbit ) 〈4-2〉

故value值與電壓V之關係為

511 value V times= 〈4-3〉

所以encoder之頻率與value值的關係為

頻率= 2000times ⎟⎠⎞

⎜⎝⎛ times

511 value - 160 〈4-4〉

故目前轉速為

sspeed = ( )rpm 60 200

times頻率 〈4-5〉

另ㄧ方面在主程式中程式會先去檢查鍵值也就等於檢查輸入指令以

找出符合使用的歸屬函數並將AD所獲得的轉速對應到歸屬函數中然後執行

決策判斷即進入規則庫中尋找出適當的決策判斷最後將此決策送入PWM程

式裡進行脈寬長度的調整使馬達在合理的要求下達到理想的轉速控制不會

因為外在環境的影響而使馬達轉速受到干擾

43 LCD 顯示轉速

此專題最後再增加一LCD顯示幕以顯示目前的轉速否則在程式設計完成

後人卻因無法以肉眼得知目前轉速而不能肯定馬達轉速是否有達到控制的目

標因此增加一顯示幕LCD是有必要的不僅隨時得知目前的轉速還能知道

44

設計出來的軟體其控制性是否夠好夠穩定

431 LCD 顯示幕之軟體流程

Start

設定LCD模組的初始狀態

設定外部中斷INTR0

與Timer0

設定TH0 = (65536 ndash 5000) 256 TL0 = (65536 ndash 5000)256

令ADCWR = 0 ADCWR = 1 AD開始轉換

等待中斷

外部中斷副程式

ADCRD = 0 讀取AD值 ADCRD = 1

將AD值換算成速度

ADCWR = 0 ADCWR = 1 AD開始轉換

Timer0中斷副程式

顯示LCD第一行

ldquoMotor Speed =

顯示LCD第二行ldquoxxxxxxx rpm其中 xxxxxx為外部中斷副程式所換算出的轉速

重設TH0與TL0

返回主程式返回主程式

圖 410 LCD 顯示幕之程式流程圖

此程式主要由兩個部分完成一為外部中斷副程式另ㄧ為 Timer0 中斷副

程式當主程式完成外部與 Timer0 兩個中斷的設定後隨即命令 AD 開始轉換

之後便一直停在 while〈1〉的迴圈裡不做任何動作而由兩個中斷副程式來完

成整個轉換與顯示的工作

45

外部中斷副程式主要負責 AD 的轉換讀取與轉速換算的工作AD 第一

次的轉換由主程式來下達命令當轉換完成後AD 的 INTR 接腳將觸發外部中

斷〈INTR0〉副程式此時程式便進入外部中斷副程式執行讀取 AD 值與轉速

換算的工作當這些工作完成時外部中斷副程式再次下達 AD 開始轉換的命

令而離開中斷副程式當 AD 再次轉換完成時又將再次執行中斷副程式

如此週而復始中斷副程式將ㄧ直進行讀取換算與轉換的工作

而 Timer0 中斷副程式主要負責 LCD 顯示之工作當主程式所設定的計時時

間計數完時程式便進入 Timer0 中斷副程式一旦進入 Timer0 中斷副程式程

式將執行 LCD 的顯示然後再重設 Timer0 的計數時間Timer0 將重新計數當

計數完時程式又將再度進入 Timer0 中斷副程式執行因為程式中並無清除

Timer0 的中斷致能故 Timer0 中斷副程式和外部中斷副程式ㄧ樣週而復始的

執行其副程式的工作

46

第五章 結論

本計劃主旨為具模糊控制理論與雙脈寬調變法之直流馬達驅動電路設計主

要是針對傳統電路設計之缺點提出改良之方法以TPWM取代PWM電路以模

糊理論基礎設計之控制器替代傳統PID控制器

TPWM轉速控制優於PWM之處在於

1 TPWM只需使用單電源即可達到正轉和逆轉的轉速控制而PWM必須

加上逆向開關或是雙電源才能使馬達產生正轉和逆轉

2 TPWM可控制馬達處於停止狀態無論在正向或逆向加上負載皆無法使

馬達產生轉動

3 馬達消耗定額功率輸出轉矩為額定值

4 馬達由停止到某定轉速時反應時間較快

模糊控制器優於PID控制器

1 不須導出繁雜的數學模型

2 適用於非線性系統

3 強健性與容錯性較高

本專題至此雖說大致的目標都已達到但是此系統仍然有許多不完美而需要

改進的地方例如在實驗過程中發現整個轉速的控制在回授上其反應時間

有點慢探討其原因有可能是控制器之程式上的問題

1 因為使用C語言撰寫程式故其執行速度較慢

2 程式可能寫的太累贅

3 模糊控制規則庫建立不良

若想改善這些問題可以嘗試著將C語言改為組合語言來撰寫並盡量減少

47

不必要的指令相信此動作一定能大大提昇程式的執行速度其次就是多做測

試利用測試中所學到的經驗來幫助模糊控制規則庫的改寫同時也能從測試中

發現更多的問題若是都能對問題加以一一解決的話相信必定能將此控制系統

做的更盡善盡美

48

參考文獻

﹝1﹞ 李適中直流馬達速度控制伺服控制〈基礎篇〉全華科技圖書股份有

限公司民 74

﹝2﹞ 廖錦文ldquo直流電動機之雙脈寬調變是〈TPWM〉驅動電路研究電

子技術月刊第 69 期pp94-1021992

﹝3﹞ 楊英魁孫宗瀛鄭魁香林建德蔣旭堂模糊控制理論與技術全華

科技圖書股份有限公司民 85

﹝4﹞ 林敦煌陳憬德直流馬達定位及轉速的模糊控制逢甲大學自動控制工

程學系學士論文民 87

﹝5﹞ LAZadehldquo Fuzzy Sets Information and Control Vol8 pp338-353

1965

﹝6﹞ EHMamdani and SAsslianldquo A fuzzy logic controller for a dynamic

plant Internation Journal of Man-Machine Studies Vol7 pp1-13 1975

﹝7﹞ 孫宗瀛楊英魁Fuzzy 控制理論實作與應用全華科技圖書股份有

限公司民 83 年

﹝8﹞ 許中平黃煌嘉直流電動機控制電路設計全華科技圖書股份有限公司

民 75

﹝9﹞ 盧明智黃敏祥OP Amp 應用+實驗模擬全華科技圖書股份有限公司

民 83

﹝10﹞陳文耀電動機控制工程復文書局2003

﹝11﹞許中平林全福電動機運轉控制技術全華科技圖書股份有限公司民

77

﹝12﹞楊明豐8051 單晶片 C 語言設計實務碁峯資訊2003 年

﹝13﹞蔡朝洋單晶片微電腦 80518951 原理與應用全華科技圖書股份有限公

司民 91

49

﹝14﹞王文俊認識 Fuzzy全華科技圖書股份有限公司民 90

50

附錄 A 專題硬體展示圖

圖 A-1 硬體整體圖

圖 A-2 硬體整體鳥瞰圖

51

圖 A-3 硬體側視圖

圖 A-4 操作與顯示面板

圖 A-5 間距脈波電路與 FV 電路

52

圖 A-6 橋型驅動功率放大電路

圖 A-7 操作與控制面板

53

附錄 B PWM 與模糊控制之程式

include reg51h include stdioh sbit ADCRD = P3^1 設定 RD 控制線接腳為 P31 sbit ADCWR = P3^3 設定 WR 控制線接腳為 P33 sbit P2_0 = 0xA0 接腳定義 sbit P2_1 = 0xA1 接腳定義 sbit P3_0 = 0xB0 接腳定義 sbit P3_1 = 0xB1 接腳定義 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P3_6 = 0xB6 接腳定義 void KeyStatus(void) 函數原型宣告 void feedback(void) 函數原型宣告 void compute_grade(void) 函數原型宣告 void delay1ms(int count) 函數原型宣告 void convert() 函數原型宣告 void condition() 函數原型宣告 void CW(void) 函數原型宣告 int j i 對應 PWM 的寬度 unsigned int temp 所設計的計時器時間 int sample = 1000 取樣率設定消除顯示值跳動 long int value r1 讀取 ADC0804 數位資料 long int set n condition select long int r grade_reg[2] grade[15] error1 error2 long int a1 b1 I long int membership[5][3]membership1[3][3] 定義歸屬函數 long int membership2[3][3] = -10-50-5050510 long int error[2] int Rule[15][3] = 113213313 定義判斷規則庫 212223323 311232333 411241342 511251351

54

main() 主程式 j = PWM = 110 設定 PWM 初始值 IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x00 設定計時器 0 工作於模式 0 temp=8192-j4 設定計時器 0 初值 TH0 = temp 32 TL0 = temp 32 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 P3_4 = 1 P3_5 = 0 P3_6 = 0 ADCWR = 0 令 ADC0804 的 WR = 0 ADCWR = 1 令 ADC0804 的 WR = 1 while (1) KeyStatus() 檢查鍵值 void KeyStatus(void) 檢查鍵值並給對應的 PWM 值 char KeyScan(void) 按鍵掃描函數宣告 unsigned char KeyStatus unsigned char Key = 0 KeyStatus=KeyScan() 呼叫按鍵掃描函數 if (KeyStatus = 0) 已有按鍵輸入 Key = KeyStatus Key = 鍵值 if (Key == 0x01) 假如輸入為按鍵 1 i = 110 PWM 為 110us j = i P3_4 = 1 LED 亮第一顆〈表馬達停止〉 P3_5 = 0 P3_6 = 0

55

else if (Key == 0x02 ) 假如輸入為按鍵 2 i = 140 PWM 為 140us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x04 ) 假如輸入為按鍵 3 i = 180 PWM 為 180us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x08 ) 假如輸入為按鍵 4 i = 80 PWM 為 80us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 else if (Key == 0x10 ) 假如輸入為按鍵 5 i = 40 PWM 為 40us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 PWM = j delay1ms(10) 呼叫延遲函數 feedback() 模糊控制判斷

56

void To_int(void) interrupt 1 Timer0 中斷函數 if (P3_0 == 0) 假如 PWM 輸出為 Low P3_0 = 1 變更 PWM 輸出為 High temp=8192-j4 設定 High 的時間 else 若 PWM 輸出為 High P3_0 = 0 變更 PWM 輸出為 Low temp=8192-880+j4 設定 Low 的時間 TH0 = temp 32 Timer0 的計時時間 TL0 = temp 32 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 char KeyScan(void) 檢查鍵值 char KeyStatus 按鍵狀態 P0=0xff 設定 P0 為輸入模式 KeyStatus=~P0 讀取按鍵狀態 return(KeyStatus) 將鍵值送回程式 void feedback(void) 模糊判斷 void Fuzzycontroller() 函數原型宣告 void condition1() 函數原型宣告

57

void condition2() 函數原型宣告 error1 = ((value)40-160)03 輸入變數 1 delay10ms(10) 延遲 10ms error2 = ((value)40-160)03 輸入變數 2 if (key == 0x01 ) 當按鍵 1找出對應的歸屬函數 並做出模糊控制判斷

int membership[5][3]= -100-60-30-60-300-30030030603060100

int membership1[3][3]=-100-500-50050050100 Fuzzycontroller() condition() if (key == 0x02 ) 當按鍵 2找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

05010050100150100150200150200250200250300 int membership1[3][3]=07515075150225150225300 Fuzzycontroller() condition() else if (key == 0x04) 當按鍵 3找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

200320400300400500400500600500600700600700800 int membership1[3][3]=220370520370520670520670820 Fuzzycontroller() condition() else if (key == 0x08) 當按鍵 4找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

02550255010050100200100200300200300400 int membership1[3][3]=05010050100250100250400 Fuzzycontroller() condition()

58

else if (key == 0x10) 當按鍵 5找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

150250350250350450350450550450550650550650750 int membership1[3][3]=150300450300450600450600750 Fuzzycontroller() condition2() void Fuzzycontroller() 模糊控制判斷 void compute_grade() 函數原型宣告 void compute_grade1() 函數原型宣告 a1 = 0 b1 = 001 I = 0 for (n=0 nlt=14 n++) r = error1 set = Rule[n][0]-1 compute_grade() 計算輸入變數 1 與

模糊程度的歸屬函數 condition = 1 r = error2 set = Rule[n][1]-1 compute_grade1() 計算輸入變數 2 與 模糊程度的歸屬函數 grade[n] = MIN(grade_reg[0] grade_reg[1]) a1 = a1 + (grade[n]membership2[Rule[n][2]-1][1]) b1 = b1 + grade[n] I = a1 b1 得到模糊控制判斷的結果 void compute_grade() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership[set][0]) || (r gt membership[set][2])) 當輸入變數不在 歸屬函數內

59

grade_reg[condition] = 0 else if ((r gt membership[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership[set][2]-r) (membership[set][2] - membership[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership[set][0]) (membership[set][1] - membership[set][0]) void compute_grade1() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership1[set][0]) || (r gt membership1[set][2])) 當輸入變數不在 歸屬函數內 grade_reg[condition] = 0 else if ((r gt membership1[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership1[set][2]-r) (membership1[set][2]-membership1[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership1[set][0]) (membership1[set][1]-membership1[set][0])

60

void condition() P2_0 = 1 設定 P20 為輸入模式 P2_1 = 1 設定 P21 為輸入模式 if ( (P2_0 == 1) ampamp (P2_1 == 0)) 當馬達為正轉時 if ( I gt 0 ) 若模糊判斷結果為正 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 若模糊判斷結果為零 PWM = PWM + 0 PWM 寬度不變 if ( I lt 0 ) 若模糊控制結果小於零 PWM = PWM + 1 PWM 寬度加 1 else if ( (P2_0 == 0) ampamp (P2_1 == 1) ) 若馬達為反轉 if ( I lt 0 ) 模糊控制小於零 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 模糊控制等於零 PWM = PWM + 0 PWM 寬度不變 if ( I gt 0 ) 模糊控制大於零 PWM = PWM + 1 PWM 寬度加 1 CW() 判斷 PWM 寬度上下限

61

void CW() 判斷 PWM 寬度上下限 if ( PWM gt= 215 ) 若 PWM 寬度 gt= 最大寬度 j = 215 PWM 寬度維持於 215us if ( PWM lt= 5 ) 若 PWM 寬度 lt= 最小寬度 j = 5 PWM 寬度維持在 5us if ( PWM gt 5 ampamp PWM lt 215 ) PWM 寬度介於最大與最小間 j = PWM PWM 依模糊控制判斷結果增減 void delay1ms(int count) 延遲 1ms int x y for ( x = 0 x lt count x++ ) for ( y = 0 y lt 122 y++ ) void convert() 數位資料換算成馬達轉速 r1 = ((value)40)-160

62

附錄 C LCD 顯示之程式

includereg51h 含 8051 所有暫存器宣告 include mathh define RS P3_5 LCD 指令資料選擇控制 define RW P3_4 LCD 讀寫控制腳 define Enable P3_3 LCD 致能接腳 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P0_0 = 0x80 接腳定義 sbit P0_1 = 0x81 接腳定義 sbit P0_2 = 0x82 接腳定義 sbit P0_3 = 0x83 接腳定義 sbit P0_4 = 0x84 接腳定義 sbit P0_5 = 0x85 接腳定義 sbit P0_6 = 0x86 接腳定義 sbit ADCRD = P3^7 設定 RD 控制線接腳為 P37 sbit ADCWR = P3^6 設定 WR 控制線接腳為 P36 void delay(void) 函數原型宣告 void delay10ms(int count) 函數原型宣告 void display(void) 函數原型宣告 void InitialLCD(void) 函數原型宣告 void WriteIns(char) 函數原型宣告 void WriteData(char) 函數原型宣告 void WriteString(charchar) 函數原型宣告 void CheckBusy(void) 函數原型宣告 void convert(void) 函數原型宣告 char MSG0[] = Motor Speed = 定義字串 MSG0 char MSG2[] = rpm 定義字串 MSG2 unsigned char MSG1[8]=0000000 定義字串 MSG1 unsigned long int value 讀取 ADC0804 數位資料 int sample = 1000 取樣率設定消除顯示值跳動 long int rpm

63

main() 主程式 InitialLCD() 初始化 LCD IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x01 設定計時器 0 工作於模式 1 TH0 = (65536-5000)256 設定計時器 0 初值 TL0 = (65536-5000)256 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 while(1) 等待中斷 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 while (--sample == 0) 取樣率減 1 sample = 1000 重設取樣率 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 void T0_int(void) interrupt 1 LCD 顯示動態掃描 display() 動態掃描顯示 TH0 = (65536-65535)256 重設計時初值 TL0 = (65536-65535)256

64

void InitialLCD(void) 設定 LCD 模組初始狀態 delay() 延遲函數 WriteIns(0x38) 設定 LCD 模組為 WriteIns(0x38) 2 行顯示 WriteIns(0x38) 8 位元介面 WriteIns(0x38) 5x7 點字型 WriteIns(0x08) 關閉顯示器 WriteIns(0x01) 清除 LCD 螢幕 WriteIns(0x0c) 令顯示器 ON但游標不顯示 WriteIns(0x06) 令 LCD 模組每接收到 1Byte 資料 AC 值自動加 1 void display() 掃描顯示 WriteIns(0x80) 設定 LCD 座標 WriteString(13MSG0) 將字串 MSG0 寫入 LCD 中 WriteIns(0xc0) 設定 LCD 座標 WriteString(8MSG1) 將字串 MSG1 寫入 LCD 中 WriteIns(0xc8) 設定 LCD 座標 WriteString(4MSG2) 將字串 MSG2 寫入 LCD 中 void convert(void) 換算轉速 long int freq freq = ((value)4000) - 16000 數位資料換成頻率公式 rpm = freq3 頻率換算轉速公式 MSG1[0] = (rpm1000000)+0x30 將結果存入字串 MSG1 中 MSG1[1] = ((rpm1000000)100000)+0x30 MSG1[2] = ((rpm100000)10000)+0x30 MSG1[3] = ((rpm10000)1000)+0x30 MSG1[4] = 0x2e MSG1[5] = ((rpm1000)100)+0x30 MSG1[6] = ((rpm100)10)+0x30 MSG1[7] = rpm10+0x30

65

void WriteIns(char instruction) 寫命令至 LCD 中 RS = 0 選擇指令暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = instruction 輸出命令至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteData(char i) 寫資料至 LCD 中 RS = 1 選擇資料暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = i 輸出資料至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteString(countMSG) 寫字串至 LCD 中 char count 字串長度 char MSG[] 字串資料 char i 定義位元組變數 for(i=0 iltcount i++) count 個位元組 WriteData(MSG[i]) 寫入一位元組的資料至 LCD 中 void CheckBusy(void) char i=0x80 檢查忙碌旗標 while(iamp0x80) 忙錄旗標 BF = 1 RS = 0 選擇指令暫存器 RW = 1 讀取 Enable = 1 致能 LCD i = P2 讀取 LCD 指令暫存器內的資料

66

Enable = 0 除能 LCD delay() 延遲函數 void delay() 延遲 5ms int i for(i=0 ilt250 i++)

  • 畢業專題封面pdf
  • File0004pdf
  • 最終版pdfpdf
Page 53: Based on Fuzzy Control Theorem and TPWM Method for DC ... · 使吾人想設計一模糊控制器來做為馬達轉速的閉迴路控制,以解決非線性系統的 問題。除此之外,flcs

44

設計出來的軟體其控制性是否夠好夠穩定

431 LCD 顯示幕之軟體流程

Start

設定LCD模組的初始狀態

設定外部中斷INTR0

與Timer0

設定TH0 = (65536 ndash 5000) 256 TL0 = (65536 ndash 5000)256

令ADCWR = 0 ADCWR = 1 AD開始轉換

等待中斷

外部中斷副程式

ADCRD = 0 讀取AD值 ADCRD = 1

將AD值換算成速度

ADCWR = 0 ADCWR = 1 AD開始轉換

Timer0中斷副程式

顯示LCD第一行

ldquoMotor Speed =

顯示LCD第二行ldquoxxxxxxx rpm其中 xxxxxx為外部中斷副程式所換算出的轉速

重設TH0與TL0

返回主程式返回主程式

圖 410 LCD 顯示幕之程式流程圖

此程式主要由兩個部分完成一為外部中斷副程式另ㄧ為 Timer0 中斷副

程式當主程式完成外部與 Timer0 兩個中斷的設定後隨即命令 AD 開始轉換

之後便一直停在 while〈1〉的迴圈裡不做任何動作而由兩個中斷副程式來完

成整個轉換與顯示的工作

45

外部中斷副程式主要負責 AD 的轉換讀取與轉速換算的工作AD 第一

次的轉換由主程式來下達命令當轉換完成後AD 的 INTR 接腳將觸發外部中

斷〈INTR0〉副程式此時程式便進入外部中斷副程式執行讀取 AD 值與轉速

換算的工作當這些工作完成時外部中斷副程式再次下達 AD 開始轉換的命

令而離開中斷副程式當 AD 再次轉換完成時又將再次執行中斷副程式

如此週而復始中斷副程式將ㄧ直進行讀取換算與轉換的工作

而 Timer0 中斷副程式主要負責 LCD 顯示之工作當主程式所設定的計時時

間計數完時程式便進入 Timer0 中斷副程式一旦進入 Timer0 中斷副程式程

式將執行 LCD 的顯示然後再重設 Timer0 的計數時間Timer0 將重新計數當

計數完時程式又將再度進入 Timer0 中斷副程式執行因為程式中並無清除

Timer0 的中斷致能故 Timer0 中斷副程式和外部中斷副程式ㄧ樣週而復始的

執行其副程式的工作

46

第五章 結論

本計劃主旨為具模糊控制理論與雙脈寬調變法之直流馬達驅動電路設計主

要是針對傳統電路設計之缺點提出改良之方法以TPWM取代PWM電路以模

糊理論基礎設計之控制器替代傳統PID控制器

TPWM轉速控制優於PWM之處在於

1 TPWM只需使用單電源即可達到正轉和逆轉的轉速控制而PWM必須

加上逆向開關或是雙電源才能使馬達產生正轉和逆轉

2 TPWM可控制馬達處於停止狀態無論在正向或逆向加上負載皆無法使

馬達產生轉動

3 馬達消耗定額功率輸出轉矩為額定值

4 馬達由停止到某定轉速時反應時間較快

模糊控制器優於PID控制器

1 不須導出繁雜的數學模型

2 適用於非線性系統

3 強健性與容錯性較高

本專題至此雖說大致的目標都已達到但是此系統仍然有許多不完美而需要

改進的地方例如在實驗過程中發現整個轉速的控制在回授上其反應時間

有點慢探討其原因有可能是控制器之程式上的問題

1 因為使用C語言撰寫程式故其執行速度較慢

2 程式可能寫的太累贅

3 模糊控制規則庫建立不良

若想改善這些問題可以嘗試著將C語言改為組合語言來撰寫並盡量減少

47

不必要的指令相信此動作一定能大大提昇程式的執行速度其次就是多做測

試利用測試中所學到的經驗來幫助模糊控制規則庫的改寫同時也能從測試中

發現更多的問題若是都能對問題加以一一解決的話相信必定能將此控制系統

做的更盡善盡美

48

參考文獻

﹝1﹞ 李適中直流馬達速度控制伺服控制〈基礎篇〉全華科技圖書股份有

限公司民 74

﹝2﹞ 廖錦文ldquo直流電動機之雙脈寬調變是〈TPWM〉驅動電路研究電

子技術月刊第 69 期pp94-1021992

﹝3﹞ 楊英魁孫宗瀛鄭魁香林建德蔣旭堂模糊控制理論與技術全華

科技圖書股份有限公司民 85

﹝4﹞ 林敦煌陳憬德直流馬達定位及轉速的模糊控制逢甲大學自動控制工

程學系學士論文民 87

﹝5﹞ LAZadehldquo Fuzzy Sets Information and Control Vol8 pp338-353

1965

﹝6﹞ EHMamdani and SAsslianldquo A fuzzy logic controller for a dynamic

plant Internation Journal of Man-Machine Studies Vol7 pp1-13 1975

﹝7﹞ 孫宗瀛楊英魁Fuzzy 控制理論實作與應用全華科技圖書股份有

限公司民 83 年

﹝8﹞ 許中平黃煌嘉直流電動機控制電路設計全華科技圖書股份有限公司

民 75

﹝9﹞ 盧明智黃敏祥OP Amp 應用+實驗模擬全華科技圖書股份有限公司

民 83

﹝10﹞陳文耀電動機控制工程復文書局2003

﹝11﹞許中平林全福電動機運轉控制技術全華科技圖書股份有限公司民

77

﹝12﹞楊明豐8051 單晶片 C 語言設計實務碁峯資訊2003 年

﹝13﹞蔡朝洋單晶片微電腦 80518951 原理與應用全華科技圖書股份有限公

司民 91

49

﹝14﹞王文俊認識 Fuzzy全華科技圖書股份有限公司民 90

50

附錄 A 專題硬體展示圖

圖 A-1 硬體整體圖

圖 A-2 硬體整體鳥瞰圖

51

圖 A-3 硬體側視圖

圖 A-4 操作與顯示面板

圖 A-5 間距脈波電路與 FV 電路

52

圖 A-6 橋型驅動功率放大電路

圖 A-7 操作與控制面板

53

附錄 B PWM 與模糊控制之程式

include reg51h include stdioh sbit ADCRD = P3^1 設定 RD 控制線接腳為 P31 sbit ADCWR = P3^3 設定 WR 控制線接腳為 P33 sbit P2_0 = 0xA0 接腳定義 sbit P2_1 = 0xA1 接腳定義 sbit P3_0 = 0xB0 接腳定義 sbit P3_1 = 0xB1 接腳定義 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P3_6 = 0xB6 接腳定義 void KeyStatus(void) 函數原型宣告 void feedback(void) 函數原型宣告 void compute_grade(void) 函數原型宣告 void delay1ms(int count) 函數原型宣告 void convert() 函數原型宣告 void condition() 函數原型宣告 void CW(void) 函數原型宣告 int j i 對應 PWM 的寬度 unsigned int temp 所設計的計時器時間 int sample = 1000 取樣率設定消除顯示值跳動 long int value r1 讀取 ADC0804 數位資料 long int set n condition select long int r grade_reg[2] grade[15] error1 error2 long int a1 b1 I long int membership[5][3]membership1[3][3] 定義歸屬函數 long int membership2[3][3] = -10-50-5050510 long int error[2] int Rule[15][3] = 113213313 定義判斷規則庫 212223323 311232333 411241342 511251351

54

main() 主程式 j = PWM = 110 設定 PWM 初始值 IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x00 設定計時器 0 工作於模式 0 temp=8192-j4 設定計時器 0 初值 TH0 = temp 32 TL0 = temp 32 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 P3_4 = 1 P3_5 = 0 P3_6 = 0 ADCWR = 0 令 ADC0804 的 WR = 0 ADCWR = 1 令 ADC0804 的 WR = 1 while (1) KeyStatus() 檢查鍵值 void KeyStatus(void) 檢查鍵值並給對應的 PWM 值 char KeyScan(void) 按鍵掃描函數宣告 unsigned char KeyStatus unsigned char Key = 0 KeyStatus=KeyScan() 呼叫按鍵掃描函數 if (KeyStatus = 0) 已有按鍵輸入 Key = KeyStatus Key = 鍵值 if (Key == 0x01) 假如輸入為按鍵 1 i = 110 PWM 為 110us j = i P3_4 = 1 LED 亮第一顆〈表馬達停止〉 P3_5 = 0 P3_6 = 0

55

else if (Key == 0x02 ) 假如輸入為按鍵 2 i = 140 PWM 為 140us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x04 ) 假如輸入為按鍵 3 i = 180 PWM 為 180us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x08 ) 假如輸入為按鍵 4 i = 80 PWM 為 80us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 else if (Key == 0x10 ) 假如輸入為按鍵 5 i = 40 PWM 為 40us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 PWM = j delay1ms(10) 呼叫延遲函數 feedback() 模糊控制判斷

56

void To_int(void) interrupt 1 Timer0 中斷函數 if (P3_0 == 0) 假如 PWM 輸出為 Low P3_0 = 1 變更 PWM 輸出為 High temp=8192-j4 設定 High 的時間 else 若 PWM 輸出為 High P3_0 = 0 變更 PWM 輸出為 Low temp=8192-880+j4 設定 Low 的時間 TH0 = temp 32 Timer0 的計時時間 TL0 = temp 32 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 char KeyScan(void) 檢查鍵值 char KeyStatus 按鍵狀態 P0=0xff 設定 P0 為輸入模式 KeyStatus=~P0 讀取按鍵狀態 return(KeyStatus) 將鍵值送回程式 void feedback(void) 模糊判斷 void Fuzzycontroller() 函數原型宣告 void condition1() 函數原型宣告

57

void condition2() 函數原型宣告 error1 = ((value)40-160)03 輸入變數 1 delay10ms(10) 延遲 10ms error2 = ((value)40-160)03 輸入變數 2 if (key == 0x01 ) 當按鍵 1找出對應的歸屬函數 並做出模糊控制判斷

int membership[5][3]= -100-60-30-60-300-30030030603060100

int membership1[3][3]=-100-500-50050050100 Fuzzycontroller() condition() if (key == 0x02 ) 當按鍵 2找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

05010050100150100150200150200250200250300 int membership1[3][3]=07515075150225150225300 Fuzzycontroller() condition() else if (key == 0x04) 當按鍵 3找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

200320400300400500400500600500600700600700800 int membership1[3][3]=220370520370520670520670820 Fuzzycontroller() condition() else if (key == 0x08) 當按鍵 4找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

02550255010050100200100200300200300400 int membership1[3][3]=05010050100250100250400 Fuzzycontroller() condition()

58

else if (key == 0x10) 當按鍵 5找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

150250350250350450350450550450550650550650750 int membership1[3][3]=150300450300450600450600750 Fuzzycontroller() condition2() void Fuzzycontroller() 模糊控制判斷 void compute_grade() 函數原型宣告 void compute_grade1() 函數原型宣告 a1 = 0 b1 = 001 I = 0 for (n=0 nlt=14 n++) r = error1 set = Rule[n][0]-1 compute_grade() 計算輸入變數 1 與

模糊程度的歸屬函數 condition = 1 r = error2 set = Rule[n][1]-1 compute_grade1() 計算輸入變數 2 與 模糊程度的歸屬函數 grade[n] = MIN(grade_reg[0] grade_reg[1]) a1 = a1 + (grade[n]membership2[Rule[n][2]-1][1]) b1 = b1 + grade[n] I = a1 b1 得到模糊控制判斷的結果 void compute_grade() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership[set][0]) || (r gt membership[set][2])) 當輸入變數不在 歸屬函數內

59

grade_reg[condition] = 0 else if ((r gt membership[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership[set][2]-r) (membership[set][2] - membership[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership[set][0]) (membership[set][1] - membership[set][0]) void compute_grade1() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership1[set][0]) || (r gt membership1[set][2])) 當輸入變數不在 歸屬函數內 grade_reg[condition] = 0 else if ((r gt membership1[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership1[set][2]-r) (membership1[set][2]-membership1[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership1[set][0]) (membership1[set][1]-membership1[set][0])

60

void condition() P2_0 = 1 設定 P20 為輸入模式 P2_1 = 1 設定 P21 為輸入模式 if ( (P2_0 == 1) ampamp (P2_1 == 0)) 當馬達為正轉時 if ( I gt 0 ) 若模糊判斷結果為正 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 若模糊判斷結果為零 PWM = PWM + 0 PWM 寬度不變 if ( I lt 0 ) 若模糊控制結果小於零 PWM = PWM + 1 PWM 寬度加 1 else if ( (P2_0 == 0) ampamp (P2_1 == 1) ) 若馬達為反轉 if ( I lt 0 ) 模糊控制小於零 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 模糊控制等於零 PWM = PWM + 0 PWM 寬度不變 if ( I gt 0 ) 模糊控制大於零 PWM = PWM + 1 PWM 寬度加 1 CW() 判斷 PWM 寬度上下限

61

void CW() 判斷 PWM 寬度上下限 if ( PWM gt= 215 ) 若 PWM 寬度 gt= 最大寬度 j = 215 PWM 寬度維持於 215us if ( PWM lt= 5 ) 若 PWM 寬度 lt= 最小寬度 j = 5 PWM 寬度維持在 5us if ( PWM gt 5 ampamp PWM lt 215 ) PWM 寬度介於最大與最小間 j = PWM PWM 依模糊控制判斷結果增減 void delay1ms(int count) 延遲 1ms int x y for ( x = 0 x lt count x++ ) for ( y = 0 y lt 122 y++ ) void convert() 數位資料換算成馬達轉速 r1 = ((value)40)-160

62

附錄 C LCD 顯示之程式

includereg51h 含 8051 所有暫存器宣告 include mathh define RS P3_5 LCD 指令資料選擇控制 define RW P3_4 LCD 讀寫控制腳 define Enable P3_3 LCD 致能接腳 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P0_0 = 0x80 接腳定義 sbit P0_1 = 0x81 接腳定義 sbit P0_2 = 0x82 接腳定義 sbit P0_3 = 0x83 接腳定義 sbit P0_4 = 0x84 接腳定義 sbit P0_5 = 0x85 接腳定義 sbit P0_6 = 0x86 接腳定義 sbit ADCRD = P3^7 設定 RD 控制線接腳為 P37 sbit ADCWR = P3^6 設定 WR 控制線接腳為 P36 void delay(void) 函數原型宣告 void delay10ms(int count) 函數原型宣告 void display(void) 函數原型宣告 void InitialLCD(void) 函數原型宣告 void WriteIns(char) 函數原型宣告 void WriteData(char) 函數原型宣告 void WriteString(charchar) 函數原型宣告 void CheckBusy(void) 函數原型宣告 void convert(void) 函數原型宣告 char MSG0[] = Motor Speed = 定義字串 MSG0 char MSG2[] = rpm 定義字串 MSG2 unsigned char MSG1[8]=0000000 定義字串 MSG1 unsigned long int value 讀取 ADC0804 數位資料 int sample = 1000 取樣率設定消除顯示值跳動 long int rpm

63

main() 主程式 InitialLCD() 初始化 LCD IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x01 設定計時器 0 工作於模式 1 TH0 = (65536-5000)256 設定計時器 0 初值 TL0 = (65536-5000)256 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 while(1) 等待中斷 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 while (--sample == 0) 取樣率減 1 sample = 1000 重設取樣率 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 void T0_int(void) interrupt 1 LCD 顯示動態掃描 display() 動態掃描顯示 TH0 = (65536-65535)256 重設計時初值 TL0 = (65536-65535)256

64

void InitialLCD(void) 設定 LCD 模組初始狀態 delay() 延遲函數 WriteIns(0x38) 設定 LCD 模組為 WriteIns(0x38) 2 行顯示 WriteIns(0x38) 8 位元介面 WriteIns(0x38) 5x7 點字型 WriteIns(0x08) 關閉顯示器 WriteIns(0x01) 清除 LCD 螢幕 WriteIns(0x0c) 令顯示器 ON但游標不顯示 WriteIns(0x06) 令 LCD 模組每接收到 1Byte 資料 AC 值自動加 1 void display() 掃描顯示 WriteIns(0x80) 設定 LCD 座標 WriteString(13MSG0) 將字串 MSG0 寫入 LCD 中 WriteIns(0xc0) 設定 LCD 座標 WriteString(8MSG1) 將字串 MSG1 寫入 LCD 中 WriteIns(0xc8) 設定 LCD 座標 WriteString(4MSG2) 將字串 MSG2 寫入 LCD 中 void convert(void) 換算轉速 long int freq freq = ((value)4000) - 16000 數位資料換成頻率公式 rpm = freq3 頻率換算轉速公式 MSG1[0] = (rpm1000000)+0x30 將結果存入字串 MSG1 中 MSG1[1] = ((rpm1000000)100000)+0x30 MSG1[2] = ((rpm100000)10000)+0x30 MSG1[3] = ((rpm10000)1000)+0x30 MSG1[4] = 0x2e MSG1[5] = ((rpm1000)100)+0x30 MSG1[6] = ((rpm100)10)+0x30 MSG1[7] = rpm10+0x30

65

void WriteIns(char instruction) 寫命令至 LCD 中 RS = 0 選擇指令暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = instruction 輸出命令至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteData(char i) 寫資料至 LCD 中 RS = 1 選擇資料暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = i 輸出資料至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteString(countMSG) 寫字串至 LCD 中 char count 字串長度 char MSG[] 字串資料 char i 定義位元組變數 for(i=0 iltcount i++) count 個位元組 WriteData(MSG[i]) 寫入一位元組的資料至 LCD 中 void CheckBusy(void) char i=0x80 檢查忙碌旗標 while(iamp0x80) 忙錄旗標 BF = 1 RS = 0 選擇指令暫存器 RW = 1 讀取 Enable = 1 致能 LCD i = P2 讀取 LCD 指令暫存器內的資料

66

Enable = 0 除能 LCD delay() 延遲函數 void delay() 延遲 5ms int i for(i=0 ilt250 i++)

  • 畢業專題封面pdf
  • File0004pdf
  • 最終版pdfpdf
Page 54: Based on Fuzzy Control Theorem and TPWM Method for DC ... · 使吾人想設計一模糊控制器來做為馬達轉速的閉迴路控制,以解決非線性系統的 問題。除此之外,flcs

45

外部中斷副程式主要負責 AD 的轉換讀取與轉速換算的工作AD 第一

次的轉換由主程式來下達命令當轉換完成後AD 的 INTR 接腳將觸發外部中

斷〈INTR0〉副程式此時程式便進入外部中斷副程式執行讀取 AD 值與轉速

換算的工作當這些工作完成時外部中斷副程式再次下達 AD 開始轉換的命

令而離開中斷副程式當 AD 再次轉換完成時又將再次執行中斷副程式

如此週而復始中斷副程式將ㄧ直進行讀取換算與轉換的工作

而 Timer0 中斷副程式主要負責 LCD 顯示之工作當主程式所設定的計時時

間計數完時程式便進入 Timer0 中斷副程式一旦進入 Timer0 中斷副程式程

式將執行 LCD 的顯示然後再重設 Timer0 的計數時間Timer0 將重新計數當

計數完時程式又將再度進入 Timer0 中斷副程式執行因為程式中並無清除

Timer0 的中斷致能故 Timer0 中斷副程式和外部中斷副程式ㄧ樣週而復始的

執行其副程式的工作

46

第五章 結論

本計劃主旨為具模糊控制理論與雙脈寬調變法之直流馬達驅動電路設計主

要是針對傳統電路設計之缺點提出改良之方法以TPWM取代PWM電路以模

糊理論基礎設計之控制器替代傳統PID控制器

TPWM轉速控制優於PWM之處在於

1 TPWM只需使用單電源即可達到正轉和逆轉的轉速控制而PWM必須

加上逆向開關或是雙電源才能使馬達產生正轉和逆轉

2 TPWM可控制馬達處於停止狀態無論在正向或逆向加上負載皆無法使

馬達產生轉動

3 馬達消耗定額功率輸出轉矩為額定值

4 馬達由停止到某定轉速時反應時間較快

模糊控制器優於PID控制器

1 不須導出繁雜的數學模型

2 適用於非線性系統

3 強健性與容錯性較高

本專題至此雖說大致的目標都已達到但是此系統仍然有許多不完美而需要

改進的地方例如在實驗過程中發現整個轉速的控制在回授上其反應時間

有點慢探討其原因有可能是控制器之程式上的問題

1 因為使用C語言撰寫程式故其執行速度較慢

2 程式可能寫的太累贅

3 模糊控制規則庫建立不良

若想改善這些問題可以嘗試著將C語言改為組合語言來撰寫並盡量減少

47

不必要的指令相信此動作一定能大大提昇程式的執行速度其次就是多做測

試利用測試中所學到的經驗來幫助模糊控制規則庫的改寫同時也能從測試中

發現更多的問題若是都能對問題加以一一解決的話相信必定能將此控制系統

做的更盡善盡美

48

參考文獻

﹝1﹞ 李適中直流馬達速度控制伺服控制〈基礎篇〉全華科技圖書股份有

限公司民 74

﹝2﹞ 廖錦文ldquo直流電動機之雙脈寬調變是〈TPWM〉驅動電路研究電

子技術月刊第 69 期pp94-1021992

﹝3﹞ 楊英魁孫宗瀛鄭魁香林建德蔣旭堂模糊控制理論與技術全華

科技圖書股份有限公司民 85

﹝4﹞ 林敦煌陳憬德直流馬達定位及轉速的模糊控制逢甲大學自動控制工

程學系學士論文民 87

﹝5﹞ LAZadehldquo Fuzzy Sets Information and Control Vol8 pp338-353

1965

﹝6﹞ EHMamdani and SAsslianldquo A fuzzy logic controller for a dynamic

plant Internation Journal of Man-Machine Studies Vol7 pp1-13 1975

﹝7﹞ 孫宗瀛楊英魁Fuzzy 控制理論實作與應用全華科技圖書股份有

限公司民 83 年

﹝8﹞ 許中平黃煌嘉直流電動機控制電路設計全華科技圖書股份有限公司

民 75

﹝9﹞ 盧明智黃敏祥OP Amp 應用+實驗模擬全華科技圖書股份有限公司

民 83

﹝10﹞陳文耀電動機控制工程復文書局2003

﹝11﹞許中平林全福電動機運轉控制技術全華科技圖書股份有限公司民

77

﹝12﹞楊明豐8051 單晶片 C 語言設計實務碁峯資訊2003 年

﹝13﹞蔡朝洋單晶片微電腦 80518951 原理與應用全華科技圖書股份有限公

司民 91

49

﹝14﹞王文俊認識 Fuzzy全華科技圖書股份有限公司民 90

50

附錄 A 專題硬體展示圖

圖 A-1 硬體整體圖

圖 A-2 硬體整體鳥瞰圖

51

圖 A-3 硬體側視圖

圖 A-4 操作與顯示面板

圖 A-5 間距脈波電路與 FV 電路

52

圖 A-6 橋型驅動功率放大電路

圖 A-7 操作與控制面板

53

附錄 B PWM 與模糊控制之程式

include reg51h include stdioh sbit ADCRD = P3^1 設定 RD 控制線接腳為 P31 sbit ADCWR = P3^3 設定 WR 控制線接腳為 P33 sbit P2_0 = 0xA0 接腳定義 sbit P2_1 = 0xA1 接腳定義 sbit P3_0 = 0xB0 接腳定義 sbit P3_1 = 0xB1 接腳定義 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P3_6 = 0xB6 接腳定義 void KeyStatus(void) 函數原型宣告 void feedback(void) 函數原型宣告 void compute_grade(void) 函數原型宣告 void delay1ms(int count) 函數原型宣告 void convert() 函數原型宣告 void condition() 函數原型宣告 void CW(void) 函數原型宣告 int j i 對應 PWM 的寬度 unsigned int temp 所設計的計時器時間 int sample = 1000 取樣率設定消除顯示值跳動 long int value r1 讀取 ADC0804 數位資料 long int set n condition select long int r grade_reg[2] grade[15] error1 error2 long int a1 b1 I long int membership[5][3]membership1[3][3] 定義歸屬函數 long int membership2[3][3] = -10-50-5050510 long int error[2] int Rule[15][3] = 113213313 定義判斷規則庫 212223323 311232333 411241342 511251351

54

main() 主程式 j = PWM = 110 設定 PWM 初始值 IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x00 設定計時器 0 工作於模式 0 temp=8192-j4 設定計時器 0 初值 TH0 = temp 32 TL0 = temp 32 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 P3_4 = 1 P3_5 = 0 P3_6 = 0 ADCWR = 0 令 ADC0804 的 WR = 0 ADCWR = 1 令 ADC0804 的 WR = 1 while (1) KeyStatus() 檢查鍵值 void KeyStatus(void) 檢查鍵值並給對應的 PWM 值 char KeyScan(void) 按鍵掃描函數宣告 unsigned char KeyStatus unsigned char Key = 0 KeyStatus=KeyScan() 呼叫按鍵掃描函數 if (KeyStatus = 0) 已有按鍵輸入 Key = KeyStatus Key = 鍵值 if (Key == 0x01) 假如輸入為按鍵 1 i = 110 PWM 為 110us j = i P3_4 = 1 LED 亮第一顆〈表馬達停止〉 P3_5 = 0 P3_6 = 0

55

else if (Key == 0x02 ) 假如輸入為按鍵 2 i = 140 PWM 為 140us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x04 ) 假如輸入為按鍵 3 i = 180 PWM 為 180us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x08 ) 假如輸入為按鍵 4 i = 80 PWM 為 80us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 else if (Key == 0x10 ) 假如輸入為按鍵 5 i = 40 PWM 為 40us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 PWM = j delay1ms(10) 呼叫延遲函數 feedback() 模糊控制判斷

56

void To_int(void) interrupt 1 Timer0 中斷函數 if (P3_0 == 0) 假如 PWM 輸出為 Low P3_0 = 1 變更 PWM 輸出為 High temp=8192-j4 設定 High 的時間 else 若 PWM 輸出為 High P3_0 = 0 變更 PWM 輸出為 Low temp=8192-880+j4 設定 Low 的時間 TH0 = temp 32 Timer0 的計時時間 TL0 = temp 32 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 char KeyScan(void) 檢查鍵值 char KeyStatus 按鍵狀態 P0=0xff 設定 P0 為輸入模式 KeyStatus=~P0 讀取按鍵狀態 return(KeyStatus) 將鍵值送回程式 void feedback(void) 模糊判斷 void Fuzzycontroller() 函數原型宣告 void condition1() 函數原型宣告

57

void condition2() 函數原型宣告 error1 = ((value)40-160)03 輸入變數 1 delay10ms(10) 延遲 10ms error2 = ((value)40-160)03 輸入變數 2 if (key == 0x01 ) 當按鍵 1找出對應的歸屬函數 並做出模糊控制判斷

int membership[5][3]= -100-60-30-60-300-30030030603060100

int membership1[3][3]=-100-500-50050050100 Fuzzycontroller() condition() if (key == 0x02 ) 當按鍵 2找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

05010050100150100150200150200250200250300 int membership1[3][3]=07515075150225150225300 Fuzzycontroller() condition() else if (key == 0x04) 當按鍵 3找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

200320400300400500400500600500600700600700800 int membership1[3][3]=220370520370520670520670820 Fuzzycontroller() condition() else if (key == 0x08) 當按鍵 4找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

02550255010050100200100200300200300400 int membership1[3][3]=05010050100250100250400 Fuzzycontroller() condition()

58

else if (key == 0x10) 當按鍵 5找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

150250350250350450350450550450550650550650750 int membership1[3][3]=150300450300450600450600750 Fuzzycontroller() condition2() void Fuzzycontroller() 模糊控制判斷 void compute_grade() 函數原型宣告 void compute_grade1() 函數原型宣告 a1 = 0 b1 = 001 I = 0 for (n=0 nlt=14 n++) r = error1 set = Rule[n][0]-1 compute_grade() 計算輸入變數 1 與

模糊程度的歸屬函數 condition = 1 r = error2 set = Rule[n][1]-1 compute_grade1() 計算輸入變數 2 與 模糊程度的歸屬函數 grade[n] = MIN(grade_reg[0] grade_reg[1]) a1 = a1 + (grade[n]membership2[Rule[n][2]-1][1]) b1 = b1 + grade[n] I = a1 b1 得到模糊控制判斷的結果 void compute_grade() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership[set][0]) || (r gt membership[set][2])) 當輸入變數不在 歸屬函數內

59

grade_reg[condition] = 0 else if ((r gt membership[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership[set][2]-r) (membership[set][2] - membership[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership[set][0]) (membership[set][1] - membership[set][0]) void compute_grade1() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership1[set][0]) || (r gt membership1[set][2])) 當輸入變數不在 歸屬函數內 grade_reg[condition] = 0 else if ((r gt membership1[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership1[set][2]-r) (membership1[set][2]-membership1[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership1[set][0]) (membership1[set][1]-membership1[set][0])

60

void condition() P2_0 = 1 設定 P20 為輸入模式 P2_1 = 1 設定 P21 為輸入模式 if ( (P2_0 == 1) ampamp (P2_1 == 0)) 當馬達為正轉時 if ( I gt 0 ) 若模糊判斷結果為正 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 若模糊判斷結果為零 PWM = PWM + 0 PWM 寬度不變 if ( I lt 0 ) 若模糊控制結果小於零 PWM = PWM + 1 PWM 寬度加 1 else if ( (P2_0 == 0) ampamp (P2_1 == 1) ) 若馬達為反轉 if ( I lt 0 ) 模糊控制小於零 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 模糊控制等於零 PWM = PWM + 0 PWM 寬度不變 if ( I gt 0 ) 模糊控制大於零 PWM = PWM + 1 PWM 寬度加 1 CW() 判斷 PWM 寬度上下限

61

void CW() 判斷 PWM 寬度上下限 if ( PWM gt= 215 ) 若 PWM 寬度 gt= 最大寬度 j = 215 PWM 寬度維持於 215us if ( PWM lt= 5 ) 若 PWM 寬度 lt= 最小寬度 j = 5 PWM 寬度維持在 5us if ( PWM gt 5 ampamp PWM lt 215 ) PWM 寬度介於最大與最小間 j = PWM PWM 依模糊控制判斷結果增減 void delay1ms(int count) 延遲 1ms int x y for ( x = 0 x lt count x++ ) for ( y = 0 y lt 122 y++ ) void convert() 數位資料換算成馬達轉速 r1 = ((value)40)-160

62

附錄 C LCD 顯示之程式

includereg51h 含 8051 所有暫存器宣告 include mathh define RS P3_5 LCD 指令資料選擇控制 define RW P3_4 LCD 讀寫控制腳 define Enable P3_3 LCD 致能接腳 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P0_0 = 0x80 接腳定義 sbit P0_1 = 0x81 接腳定義 sbit P0_2 = 0x82 接腳定義 sbit P0_3 = 0x83 接腳定義 sbit P0_4 = 0x84 接腳定義 sbit P0_5 = 0x85 接腳定義 sbit P0_6 = 0x86 接腳定義 sbit ADCRD = P3^7 設定 RD 控制線接腳為 P37 sbit ADCWR = P3^6 設定 WR 控制線接腳為 P36 void delay(void) 函數原型宣告 void delay10ms(int count) 函數原型宣告 void display(void) 函數原型宣告 void InitialLCD(void) 函數原型宣告 void WriteIns(char) 函數原型宣告 void WriteData(char) 函數原型宣告 void WriteString(charchar) 函數原型宣告 void CheckBusy(void) 函數原型宣告 void convert(void) 函數原型宣告 char MSG0[] = Motor Speed = 定義字串 MSG0 char MSG2[] = rpm 定義字串 MSG2 unsigned char MSG1[8]=0000000 定義字串 MSG1 unsigned long int value 讀取 ADC0804 數位資料 int sample = 1000 取樣率設定消除顯示值跳動 long int rpm

63

main() 主程式 InitialLCD() 初始化 LCD IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x01 設定計時器 0 工作於模式 1 TH0 = (65536-5000)256 設定計時器 0 初值 TL0 = (65536-5000)256 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 while(1) 等待中斷 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 while (--sample == 0) 取樣率減 1 sample = 1000 重設取樣率 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 void T0_int(void) interrupt 1 LCD 顯示動態掃描 display() 動態掃描顯示 TH0 = (65536-65535)256 重設計時初值 TL0 = (65536-65535)256

64

void InitialLCD(void) 設定 LCD 模組初始狀態 delay() 延遲函數 WriteIns(0x38) 設定 LCD 模組為 WriteIns(0x38) 2 行顯示 WriteIns(0x38) 8 位元介面 WriteIns(0x38) 5x7 點字型 WriteIns(0x08) 關閉顯示器 WriteIns(0x01) 清除 LCD 螢幕 WriteIns(0x0c) 令顯示器 ON但游標不顯示 WriteIns(0x06) 令 LCD 模組每接收到 1Byte 資料 AC 值自動加 1 void display() 掃描顯示 WriteIns(0x80) 設定 LCD 座標 WriteString(13MSG0) 將字串 MSG0 寫入 LCD 中 WriteIns(0xc0) 設定 LCD 座標 WriteString(8MSG1) 將字串 MSG1 寫入 LCD 中 WriteIns(0xc8) 設定 LCD 座標 WriteString(4MSG2) 將字串 MSG2 寫入 LCD 中 void convert(void) 換算轉速 long int freq freq = ((value)4000) - 16000 數位資料換成頻率公式 rpm = freq3 頻率換算轉速公式 MSG1[0] = (rpm1000000)+0x30 將結果存入字串 MSG1 中 MSG1[1] = ((rpm1000000)100000)+0x30 MSG1[2] = ((rpm100000)10000)+0x30 MSG1[3] = ((rpm10000)1000)+0x30 MSG1[4] = 0x2e MSG1[5] = ((rpm1000)100)+0x30 MSG1[6] = ((rpm100)10)+0x30 MSG1[7] = rpm10+0x30

65

void WriteIns(char instruction) 寫命令至 LCD 中 RS = 0 選擇指令暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = instruction 輸出命令至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteData(char i) 寫資料至 LCD 中 RS = 1 選擇資料暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = i 輸出資料至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteString(countMSG) 寫字串至 LCD 中 char count 字串長度 char MSG[] 字串資料 char i 定義位元組變數 for(i=0 iltcount i++) count 個位元組 WriteData(MSG[i]) 寫入一位元組的資料至 LCD 中 void CheckBusy(void) char i=0x80 檢查忙碌旗標 while(iamp0x80) 忙錄旗標 BF = 1 RS = 0 選擇指令暫存器 RW = 1 讀取 Enable = 1 致能 LCD i = P2 讀取 LCD 指令暫存器內的資料

66

Enable = 0 除能 LCD delay() 延遲函數 void delay() 延遲 5ms int i for(i=0 ilt250 i++)

  • 畢業專題封面pdf
  • File0004pdf
  • 最終版pdfpdf
Page 55: Based on Fuzzy Control Theorem and TPWM Method for DC ... · 使吾人想設計一模糊控制器來做為馬達轉速的閉迴路控制,以解決非線性系統的 問題。除此之外,flcs

46

第五章 結論

本計劃主旨為具模糊控制理論與雙脈寬調變法之直流馬達驅動電路設計主

要是針對傳統電路設計之缺點提出改良之方法以TPWM取代PWM電路以模

糊理論基礎設計之控制器替代傳統PID控制器

TPWM轉速控制優於PWM之處在於

1 TPWM只需使用單電源即可達到正轉和逆轉的轉速控制而PWM必須

加上逆向開關或是雙電源才能使馬達產生正轉和逆轉

2 TPWM可控制馬達處於停止狀態無論在正向或逆向加上負載皆無法使

馬達產生轉動

3 馬達消耗定額功率輸出轉矩為額定值

4 馬達由停止到某定轉速時反應時間較快

模糊控制器優於PID控制器

1 不須導出繁雜的數學模型

2 適用於非線性系統

3 強健性與容錯性較高

本專題至此雖說大致的目標都已達到但是此系統仍然有許多不完美而需要

改進的地方例如在實驗過程中發現整個轉速的控制在回授上其反應時間

有點慢探討其原因有可能是控制器之程式上的問題

1 因為使用C語言撰寫程式故其執行速度較慢

2 程式可能寫的太累贅

3 模糊控制規則庫建立不良

若想改善這些問題可以嘗試著將C語言改為組合語言來撰寫並盡量減少

47

不必要的指令相信此動作一定能大大提昇程式的執行速度其次就是多做測

試利用測試中所學到的經驗來幫助模糊控制規則庫的改寫同時也能從測試中

發現更多的問題若是都能對問題加以一一解決的話相信必定能將此控制系統

做的更盡善盡美

48

參考文獻

﹝1﹞ 李適中直流馬達速度控制伺服控制〈基礎篇〉全華科技圖書股份有

限公司民 74

﹝2﹞ 廖錦文ldquo直流電動機之雙脈寬調變是〈TPWM〉驅動電路研究電

子技術月刊第 69 期pp94-1021992

﹝3﹞ 楊英魁孫宗瀛鄭魁香林建德蔣旭堂模糊控制理論與技術全華

科技圖書股份有限公司民 85

﹝4﹞ 林敦煌陳憬德直流馬達定位及轉速的模糊控制逢甲大學自動控制工

程學系學士論文民 87

﹝5﹞ LAZadehldquo Fuzzy Sets Information and Control Vol8 pp338-353

1965

﹝6﹞ EHMamdani and SAsslianldquo A fuzzy logic controller for a dynamic

plant Internation Journal of Man-Machine Studies Vol7 pp1-13 1975

﹝7﹞ 孫宗瀛楊英魁Fuzzy 控制理論實作與應用全華科技圖書股份有

限公司民 83 年

﹝8﹞ 許中平黃煌嘉直流電動機控制電路設計全華科技圖書股份有限公司

民 75

﹝9﹞ 盧明智黃敏祥OP Amp 應用+實驗模擬全華科技圖書股份有限公司

民 83

﹝10﹞陳文耀電動機控制工程復文書局2003

﹝11﹞許中平林全福電動機運轉控制技術全華科技圖書股份有限公司民

77

﹝12﹞楊明豐8051 單晶片 C 語言設計實務碁峯資訊2003 年

﹝13﹞蔡朝洋單晶片微電腦 80518951 原理與應用全華科技圖書股份有限公

司民 91

49

﹝14﹞王文俊認識 Fuzzy全華科技圖書股份有限公司民 90

50

附錄 A 專題硬體展示圖

圖 A-1 硬體整體圖

圖 A-2 硬體整體鳥瞰圖

51

圖 A-3 硬體側視圖

圖 A-4 操作與顯示面板

圖 A-5 間距脈波電路與 FV 電路

52

圖 A-6 橋型驅動功率放大電路

圖 A-7 操作與控制面板

53

附錄 B PWM 與模糊控制之程式

include reg51h include stdioh sbit ADCRD = P3^1 設定 RD 控制線接腳為 P31 sbit ADCWR = P3^3 設定 WR 控制線接腳為 P33 sbit P2_0 = 0xA0 接腳定義 sbit P2_1 = 0xA1 接腳定義 sbit P3_0 = 0xB0 接腳定義 sbit P3_1 = 0xB1 接腳定義 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P3_6 = 0xB6 接腳定義 void KeyStatus(void) 函數原型宣告 void feedback(void) 函數原型宣告 void compute_grade(void) 函數原型宣告 void delay1ms(int count) 函數原型宣告 void convert() 函數原型宣告 void condition() 函數原型宣告 void CW(void) 函數原型宣告 int j i 對應 PWM 的寬度 unsigned int temp 所設計的計時器時間 int sample = 1000 取樣率設定消除顯示值跳動 long int value r1 讀取 ADC0804 數位資料 long int set n condition select long int r grade_reg[2] grade[15] error1 error2 long int a1 b1 I long int membership[5][3]membership1[3][3] 定義歸屬函數 long int membership2[3][3] = -10-50-5050510 long int error[2] int Rule[15][3] = 113213313 定義判斷規則庫 212223323 311232333 411241342 511251351

54

main() 主程式 j = PWM = 110 設定 PWM 初始值 IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x00 設定計時器 0 工作於模式 0 temp=8192-j4 設定計時器 0 初值 TH0 = temp 32 TL0 = temp 32 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 P3_4 = 1 P3_5 = 0 P3_6 = 0 ADCWR = 0 令 ADC0804 的 WR = 0 ADCWR = 1 令 ADC0804 的 WR = 1 while (1) KeyStatus() 檢查鍵值 void KeyStatus(void) 檢查鍵值並給對應的 PWM 值 char KeyScan(void) 按鍵掃描函數宣告 unsigned char KeyStatus unsigned char Key = 0 KeyStatus=KeyScan() 呼叫按鍵掃描函數 if (KeyStatus = 0) 已有按鍵輸入 Key = KeyStatus Key = 鍵值 if (Key == 0x01) 假如輸入為按鍵 1 i = 110 PWM 為 110us j = i P3_4 = 1 LED 亮第一顆〈表馬達停止〉 P3_5 = 0 P3_6 = 0

55

else if (Key == 0x02 ) 假如輸入為按鍵 2 i = 140 PWM 為 140us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x04 ) 假如輸入為按鍵 3 i = 180 PWM 為 180us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x08 ) 假如輸入為按鍵 4 i = 80 PWM 為 80us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 else if (Key == 0x10 ) 假如輸入為按鍵 5 i = 40 PWM 為 40us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 PWM = j delay1ms(10) 呼叫延遲函數 feedback() 模糊控制判斷

56

void To_int(void) interrupt 1 Timer0 中斷函數 if (P3_0 == 0) 假如 PWM 輸出為 Low P3_0 = 1 變更 PWM 輸出為 High temp=8192-j4 設定 High 的時間 else 若 PWM 輸出為 High P3_0 = 0 變更 PWM 輸出為 Low temp=8192-880+j4 設定 Low 的時間 TH0 = temp 32 Timer0 的計時時間 TL0 = temp 32 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 char KeyScan(void) 檢查鍵值 char KeyStatus 按鍵狀態 P0=0xff 設定 P0 為輸入模式 KeyStatus=~P0 讀取按鍵狀態 return(KeyStatus) 將鍵值送回程式 void feedback(void) 模糊判斷 void Fuzzycontroller() 函數原型宣告 void condition1() 函數原型宣告

57

void condition2() 函數原型宣告 error1 = ((value)40-160)03 輸入變數 1 delay10ms(10) 延遲 10ms error2 = ((value)40-160)03 輸入變數 2 if (key == 0x01 ) 當按鍵 1找出對應的歸屬函數 並做出模糊控制判斷

int membership[5][3]= -100-60-30-60-300-30030030603060100

int membership1[3][3]=-100-500-50050050100 Fuzzycontroller() condition() if (key == 0x02 ) 當按鍵 2找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

05010050100150100150200150200250200250300 int membership1[3][3]=07515075150225150225300 Fuzzycontroller() condition() else if (key == 0x04) 當按鍵 3找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

200320400300400500400500600500600700600700800 int membership1[3][3]=220370520370520670520670820 Fuzzycontroller() condition() else if (key == 0x08) 當按鍵 4找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

02550255010050100200100200300200300400 int membership1[3][3]=05010050100250100250400 Fuzzycontroller() condition()

58

else if (key == 0x10) 當按鍵 5找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

150250350250350450350450550450550650550650750 int membership1[3][3]=150300450300450600450600750 Fuzzycontroller() condition2() void Fuzzycontroller() 模糊控制判斷 void compute_grade() 函數原型宣告 void compute_grade1() 函數原型宣告 a1 = 0 b1 = 001 I = 0 for (n=0 nlt=14 n++) r = error1 set = Rule[n][0]-1 compute_grade() 計算輸入變數 1 與

模糊程度的歸屬函數 condition = 1 r = error2 set = Rule[n][1]-1 compute_grade1() 計算輸入變數 2 與 模糊程度的歸屬函數 grade[n] = MIN(grade_reg[0] grade_reg[1]) a1 = a1 + (grade[n]membership2[Rule[n][2]-1][1]) b1 = b1 + grade[n] I = a1 b1 得到模糊控制判斷的結果 void compute_grade() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership[set][0]) || (r gt membership[set][2])) 當輸入變數不在 歸屬函數內

59

grade_reg[condition] = 0 else if ((r gt membership[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership[set][2]-r) (membership[set][2] - membership[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership[set][0]) (membership[set][1] - membership[set][0]) void compute_grade1() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership1[set][0]) || (r gt membership1[set][2])) 當輸入變數不在 歸屬函數內 grade_reg[condition] = 0 else if ((r gt membership1[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership1[set][2]-r) (membership1[set][2]-membership1[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership1[set][0]) (membership1[set][1]-membership1[set][0])

60

void condition() P2_0 = 1 設定 P20 為輸入模式 P2_1 = 1 設定 P21 為輸入模式 if ( (P2_0 == 1) ampamp (P2_1 == 0)) 當馬達為正轉時 if ( I gt 0 ) 若模糊判斷結果為正 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 若模糊判斷結果為零 PWM = PWM + 0 PWM 寬度不變 if ( I lt 0 ) 若模糊控制結果小於零 PWM = PWM + 1 PWM 寬度加 1 else if ( (P2_0 == 0) ampamp (P2_1 == 1) ) 若馬達為反轉 if ( I lt 0 ) 模糊控制小於零 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 模糊控制等於零 PWM = PWM + 0 PWM 寬度不變 if ( I gt 0 ) 模糊控制大於零 PWM = PWM + 1 PWM 寬度加 1 CW() 判斷 PWM 寬度上下限

61

void CW() 判斷 PWM 寬度上下限 if ( PWM gt= 215 ) 若 PWM 寬度 gt= 最大寬度 j = 215 PWM 寬度維持於 215us if ( PWM lt= 5 ) 若 PWM 寬度 lt= 最小寬度 j = 5 PWM 寬度維持在 5us if ( PWM gt 5 ampamp PWM lt 215 ) PWM 寬度介於最大與最小間 j = PWM PWM 依模糊控制判斷結果增減 void delay1ms(int count) 延遲 1ms int x y for ( x = 0 x lt count x++ ) for ( y = 0 y lt 122 y++ ) void convert() 數位資料換算成馬達轉速 r1 = ((value)40)-160

62

附錄 C LCD 顯示之程式

includereg51h 含 8051 所有暫存器宣告 include mathh define RS P3_5 LCD 指令資料選擇控制 define RW P3_4 LCD 讀寫控制腳 define Enable P3_3 LCD 致能接腳 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P0_0 = 0x80 接腳定義 sbit P0_1 = 0x81 接腳定義 sbit P0_2 = 0x82 接腳定義 sbit P0_3 = 0x83 接腳定義 sbit P0_4 = 0x84 接腳定義 sbit P0_5 = 0x85 接腳定義 sbit P0_6 = 0x86 接腳定義 sbit ADCRD = P3^7 設定 RD 控制線接腳為 P37 sbit ADCWR = P3^6 設定 WR 控制線接腳為 P36 void delay(void) 函數原型宣告 void delay10ms(int count) 函數原型宣告 void display(void) 函數原型宣告 void InitialLCD(void) 函數原型宣告 void WriteIns(char) 函數原型宣告 void WriteData(char) 函數原型宣告 void WriteString(charchar) 函數原型宣告 void CheckBusy(void) 函數原型宣告 void convert(void) 函數原型宣告 char MSG0[] = Motor Speed = 定義字串 MSG0 char MSG2[] = rpm 定義字串 MSG2 unsigned char MSG1[8]=0000000 定義字串 MSG1 unsigned long int value 讀取 ADC0804 數位資料 int sample = 1000 取樣率設定消除顯示值跳動 long int rpm

63

main() 主程式 InitialLCD() 初始化 LCD IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x01 設定計時器 0 工作於模式 1 TH0 = (65536-5000)256 設定計時器 0 初值 TL0 = (65536-5000)256 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 while(1) 等待中斷 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 while (--sample == 0) 取樣率減 1 sample = 1000 重設取樣率 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 void T0_int(void) interrupt 1 LCD 顯示動態掃描 display() 動態掃描顯示 TH0 = (65536-65535)256 重設計時初值 TL0 = (65536-65535)256

64

void InitialLCD(void) 設定 LCD 模組初始狀態 delay() 延遲函數 WriteIns(0x38) 設定 LCD 模組為 WriteIns(0x38) 2 行顯示 WriteIns(0x38) 8 位元介面 WriteIns(0x38) 5x7 點字型 WriteIns(0x08) 關閉顯示器 WriteIns(0x01) 清除 LCD 螢幕 WriteIns(0x0c) 令顯示器 ON但游標不顯示 WriteIns(0x06) 令 LCD 模組每接收到 1Byte 資料 AC 值自動加 1 void display() 掃描顯示 WriteIns(0x80) 設定 LCD 座標 WriteString(13MSG0) 將字串 MSG0 寫入 LCD 中 WriteIns(0xc0) 設定 LCD 座標 WriteString(8MSG1) 將字串 MSG1 寫入 LCD 中 WriteIns(0xc8) 設定 LCD 座標 WriteString(4MSG2) 將字串 MSG2 寫入 LCD 中 void convert(void) 換算轉速 long int freq freq = ((value)4000) - 16000 數位資料換成頻率公式 rpm = freq3 頻率換算轉速公式 MSG1[0] = (rpm1000000)+0x30 將結果存入字串 MSG1 中 MSG1[1] = ((rpm1000000)100000)+0x30 MSG1[2] = ((rpm100000)10000)+0x30 MSG1[3] = ((rpm10000)1000)+0x30 MSG1[4] = 0x2e MSG1[5] = ((rpm1000)100)+0x30 MSG1[6] = ((rpm100)10)+0x30 MSG1[7] = rpm10+0x30

65

void WriteIns(char instruction) 寫命令至 LCD 中 RS = 0 選擇指令暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = instruction 輸出命令至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteData(char i) 寫資料至 LCD 中 RS = 1 選擇資料暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = i 輸出資料至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteString(countMSG) 寫字串至 LCD 中 char count 字串長度 char MSG[] 字串資料 char i 定義位元組變數 for(i=0 iltcount i++) count 個位元組 WriteData(MSG[i]) 寫入一位元組的資料至 LCD 中 void CheckBusy(void) char i=0x80 檢查忙碌旗標 while(iamp0x80) 忙錄旗標 BF = 1 RS = 0 選擇指令暫存器 RW = 1 讀取 Enable = 1 致能 LCD i = P2 讀取 LCD 指令暫存器內的資料

66

Enable = 0 除能 LCD delay() 延遲函數 void delay() 延遲 5ms int i for(i=0 ilt250 i++)

  • 畢業專題封面pdf
  • File0004pdf
  • 最終版pdfpdf
Page 56: Based on Fuzzy Control Theorem and TPWM Method for DC ... · 使吾人想設計一模糊控制器來做為馬達轉速的閉迴路控制,以解決非線性系統的 問題。除此之外,flcs

47

不必要的指令相信此動作一定能大大提昇程式的執行速度其次就是多做測

試利用測試中所學到的經驗來幫助模糊控制規則庫的改寫同時也能從測試中

發現更多的問題若是都能對問題加以一一解決的話相信必定能將此控制系統

做的更盡善盡美

48

參考文獻

﹝1﹞ 李適中直流馬達速度控制伺服控制〈基礎篇〉全華科技圖書股份有

限公司民 74

﹝2﹞ 廖錦文ldquo直流電動機之雙脈寬調變是〈TPWM〉驅動電路研究電

子技術月刊第 69 期pp94-1021992

﹝3﹞ 楊英魁孫宗瀛鄭魁香林建德蔣旭堂模糊控制理論與技術全華

科技圖書股份有限公司民 85

﹝4﹞ 林敦煌陳憬德直流馬達定位及轉速的模糊控制逢甲大學自動控制工

程學系學士論文民 87

﹝5﹞ LAZadehldquo Fuzzy Sets Information and Control Vol8 pp338-353

1965

﹝6﹞ EHMamdani and SAsslianldquo A fuzzy logic controller for a dynamic

plant Internation Journal of Man-Machine Studies Vol7 pp1-13 1975

﹝7﹞ 孫宗瀛楊英魁Fuzzy 控制理論實作與應用全華科技圖書股份有

限公司民 83 年

﹝8﹞ 許中平黃煌嘉直流電動機控制電路設計全華科技圖書股份有限公司

民 75

﹝9﹞ 盧明智黃敏祥OP Amp 應用+實驗模擬全華科技圖書股份有限公司

民 83

﹝10﹞陳文耀電動機控制工程復文書局2003

﹝11﹞許中平林全福電動機運轉控制技術全華科技圖書股份有限公司民

77

﹝12﹞楊明豐8051 單晶片 C 語言設計實務碁峯資訊2003 年

﹝13﹞蔡朝洋單晶片微電腦 80518951 原理與應用全華科技圖書股份有限公

司民 91

49

﹝14﹞王文俊認識 Fuzzy全華科技圖書股份有限公司民 90

50

附錄 A 專題硬體展示圖

圖 A-1 硬體整體圖

圖 A-2 硬體整體鳥瞰圖

51

圖 A-3 硬體側視圖

圖 A-4 操作與顯示面板

圖 A-5 間距脈波電路與 FV 電路

52

圖 A-6 橋型驅動功率放大電路

圖 A-7 操作與控制面板

53

附錄 B PWM 與模糊控制之程式

include reg51h include stdioh sbit ADCRD = P3^1 設定 RD 控制線接腳為 P31 sbit ADCWR = P3^3 設定 WR 控制線接腳為 P33 sbit P2_0 = 0xA0 接腳定義 sbit P2_1 = 0xA1 接腳定義 sbit P3_0 = 0xB0 接腳定義 sbit P3_1 = 0xB1 接腳定義 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P3_6 = 0xB6 接腳定義 void KeyStatus(void) 函數原型宣告 void feedback(void) 函數原型宣告 void compute_grade(void) 函數原型宣告 void delay1ms(int count) 函數原型宣告 void convert() 函數原型宣告 void condition() 函數原型宣告 void CW(void) 函數原型宣告 int j i 對應 PWM 的寬度 unsigned int temp 所設計的計時器時間 int sample = 1000 取樣率設定消除顯示值跳動 long int value r1 讀取 ADC0804 數位資料 long int set n condition select long int r grade_reg[2] grade[15] error1 error2 long int a1 b1 I long int membership[5][3]membership1[3][3] 定義歸屬函數 long int membership2[3][3] = -10-50-5050510 long int error[2] int Rule[15][3] = 113213313 定義判斷規則庫 212223323 311232333 411241342 511251351

54

main() 主程式 j = PWM = 110 設定 PWM 初始值 IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x00 設定計時器 0 工作於模式 0 temp=8192-j4 設定計時器 0 初值 TH0 = temp 32 TL0 = temp 32 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 P3_4 = 1 P3_5 = 0 P3_6 = 0 ADCWR = 0 令 ADC0804 的 WR = 0 ADCWR = 1 令 ADC0804 的 WR = 1 while (1) KeyStatus() 檢查鍵值 void KeyStatus(void) 檢查鍵值並給對應的 PWM 值 char KeyScan(void) 按鍵掃描函數宣告 unsigned char KeyStatus unsigned char Key = 0 KeyStatus=KeyScan() 呼叫按鍵掃描函數 if (KeyStatus = 0) 已有按鍵輸入 Key = KeyStatus Key = 鍵值 if (Key == 0x01) 假如輸入為按鍵 1 i = 110 PWM 為 110us j = i P3_4 = 1 LED 亮第一顆〈表馬達停止〉 P3_5 = 0 P3_6 = 0

55

else if (Key == 0x02 ) 假如輸入為按鍵 2 i = 140 PWM 為 140us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x04 ) 假如輸入為按鍵 3 i = 180 PWM 為 180us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x08 ) 假如輸入為按鍵 4 i = 80 PWM 為 80us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 else if (Key == 0x10 ) 假如輸入為按鍵 5 i = 40 PWM 為 40us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 PWM = j delay1ms(10) 呼叫延遲函數 feedback() 模糊控制判斷

56

void To_int(void) interrupt 1 Timer0 中斷函數 if (P3_0 == 0) 假如 PWM 輸出為 Low P3_0 = 1 變更 PWM 輸出為 High temp=8192-j4 設定 High 的時間 else 若 PWM 輸出為 High P3_0 = 0 變更 PWM 輸出為 Low temp=8192-880+j4 設定 Low 的時間 TH0 = temp 32 Timer0 的計時時間 TL0 = temp 32 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 char KeyScan(void) 檢查鍵值 char KeyStatus 按鍵狀態 P0=0xff 設定 P0 為輸入模式 KeyStatus=~P0 讀取按鍵狀態 return(KeyStatus) 將鍵值送回程式 void feedback(void) 模糊判斷 void Fuzzycontroller() 函數原型宣告 void condition1() 函數原型宣告

57

void condition2() 函數原型宣告 error1 = ((value)40-160)03 輸入變數 1 delay10ms(10) 延遲 10ms error2 = ((value)40-160)03 輸入變數 2 if (key == 0x01 ) 當按鍵 1找出對應的歸屬函數 並做出模糊控制判斷

int membership[5][3]= -100-60-30-60-300-30030030603060100

int membership1[3][3]=-100-500-50050050100 Fuzzycontroller() condition() if (key == 0x02 ) 當按鍵 2找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

05010050100150100150200150200250200250300 int membership1[3][3]=07515075150225150225300 Fuzzycontroller() condition() else if (key == 0x04) 當按鍵 3找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

200320400300400500400500600500600700600700800 int membership1[3][3]=220370520370520670520670820 Fuzzycontroller() condition() else if (key == 0x08) 當按鍵 4找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

02550255010050100200100200300200300400 int membership1[3][3]=05010050100250100250400 Fuzzycontroller() condition()

58

else if (key == 0x10) 當按鍵 5找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

150250350250350450350450550450550650550650750 int membership1[3][3]=150300450300450600450600750 Fuzzycontroller() condition2() void Fuzzycontroller() 模糊控制判斷 void compute_grade() 函數原型宣告 void compute_grade1() 函數原型宣告 a1 = 0 b1 = 001 I = 0 for (n=0 nlt=14 n++) r = error1 set = Rule[n][0]-1 compute_grade() 計算輸入變數 1 與

模糊程度的歸屬函數 condition = 1 r = error2 set = Rule[n][1]-1 compute_grade1() 計算輸入變數 2 與 模糊程度的歸屬函數 grade[n] = MIN(grade_reg[0] grade_reg[1]) a1 = a1 + (grade[n]membership2[Rule[n][2]-1][1]) b1 = b1 + grade[n] I = a1 b1 得到模糊控制判斷的結果 void compute_grade() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership[set][0]) || (r gt membership[set][2])) 當輸入變數不在 歸屬函數內

59

grade_reg[condition] = 0 else if ((r gt membership[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership[set][2]-r) (membership[set][2] - membership[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership[set][0]) (membership[set][1] - membership[set][0]) void compute_grade1() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership1[set][0]) || (r gt membership1[set][2])) 當輸入變數不在 歸屬函數內 grade_reg[condition] = 0 else if ((r gt membership1[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership1[set][2]-r) (membership1[set][2]-membership1[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership1[set][0]) (membership1[set][1]-membership1[set][0])

60

void condition() P2_0 = 1 設定 P20 為輸入模式 P2_1 = 1 設定 P21 為輸入模式 if ( (P2_0 == 1) ampamp (P2_1 == 0)) 當馬達為正轉時 if ( I gt 0 ) 若模糊判斷結果為正 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 若模糊判斷結果為零 PWM = PWM + 0 PWM 寬度不變 if ( I lt 0 ) 若模糊控制結果小於零 PWM = PWM + 1 PWM 寬度加 1 else if ( (P2_0 == 0) ampamp (P2_1 == 1) ) 若馬達為反轉 if ( I lt 0 ) 模糊控制小於零 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 模糊控制等於零 PWM = PWM + 0 PWM 寬度不變 if ( I gt 0 ) 模糊控制大於零 PWM = PWM + 1 PWM 寬度加 1 CW() 判斷 PWM 寬度上下限

61

void CW() 判斷 PWM 寬度上下限 if ( PWM gt= 215 ) 若 PWM 寬度 gt= 最大寬度 j = 215 PWM 寬度維持於 215us if ( PWM lt= 5 ) 若 PWM 寬度 lt= 最小寬度 j = 5 PWM 寬度維持在 5us if ( PWM gt 5 ampamp PWM lt 215 ) PWM 寬度介於最大與最小間 j = PWM PWM 依模糊控制判斷結果增減 void delay1ms(int count) 延遲 1ms int x y for ( x = 0 x lt count x++ ) for ( y = 0 y lt 122 y++ ) void convert() 數位資料換算成馬達轉速 r1 = ((value)40)-160

62

附錄 C LCD 顯示之程式

includereg51h 含 8051 所有暫存器宣告 include mathh define RS P3_5 LCD 指令資料選擇控制 define RW P3_4 LCD 讀寫控制腳 define Enable P3_3 LCD 致能接腳 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P0_0 = 0x80 接腳定義 sbit P0_1 = 0x81 接腳定義 sbit P0_2 = 0x82 接腳定義 sbit P0_3 = 0x83 接腳定義 sbit P0_4 = 0x84 接腳定義 sbit P0_5 = 0x85 接腳定義 sbit P0_6 = 0x86 接腳定義 sbit ADCRD = P3^7 設定 RD 控制線接腳為 P37 sbit ADCWR = P3^6 設定 WR 控制線接腳為 P36 void delay(void) 函數原型宣告 void delay10ms(int count) 函數原型宣告 void display(void) 函數原型宣告 void InitialLCD(void) 函數原型宣告 void WriteIns(char) 函數原型宣告 void WriteData(char) 函數原型宣告 void WriteString(charchar) 函數原型宣告 void CheckBusy(void) 函數原型宣告 void convert(void) 函數原型宣告 char MSG0[] = Motor Speed = 定義字串 MSG0 char MSG2[] = rpm 定義字串 MSG2 unsigned char MSG1[8]=0000000 定義字串 MSG1 unsigned long int value 讀取 ADC0804 數位資料 int sample = 1000 取樣率設定消除顯示值跳動 long int rpm

63

main() 主程式 InitialLCD() 初始化 LCD IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x01 設定計時器 0 工作於模式 1 TH0 = (65536-5000)256 設定計時器 0 初值 TL0 = (65536-5000)256 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 while(1) 等待中斷 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 while (--sample == 0) 取樣率減 1 sample = 1000 重設取樣率 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 void T0_int(void) interrupt 1 LCD 顯示動態掃描 display() 動態掃描顯示 TH0 = (65536-65535)256 重設計時初值 TL0 = (65536-65535)256

64

void InitialLCD(void) 設定 LCD 模組初始狀態 delay() 延遲函數 WriteIns(0x38) 設定 LCD 模組為 WriteIns(0x38) 2 行顯示 WriteIns(0x38) 8 位元介面 WriteIns(0x38) 5x7 點字型 WriteIns(0x08) 關閉顯示器 WriteIns(0x01) 清除 LCD 螢幕 WriteIns(0x0c) 令顯示器 ON但游標不顯示 WriteIns(0x06) 令 LCD 模組每接收到 1Byte 資料 AC 值自動加 1 void display() 掃描顯示 WriteIns(0x80) 設定 LCD 座標 WriteString(13MSG0) 將字串 MSG0 寫入 LCD 中 WriteIns(0xc0) 設定 LCD 座標 WriteString(8MSG1) 將字串 MSG1 寫入 LCD 中 WriteIns(0xc8) 設定 LCD 座標 WriteString(4MSG2) 將字串 MSG2 寫入 LCD 中 void convert(void) 換算轉速 long int freq freq = ((value)4000) - 16000 數位資料換成頻率公式 rpm = freq3 頻率換算轉速公式 MSG1[0] = (rpm1000000)+0x30 將結果存入字串 MSG1 中 MSG1[1] = ((rpm1000000)100000)+0x30 MSG1[2] = ((rpm100000)10000)+0x30 MSG1[3] = ((rpm10000)1000)+0x30 MSG1[4] = 0x2e MSG1[5] = ((rpm1000)100)+0x30 MSG1[6] = ((rpm100)10)+0x30 MSG1[7] = rpm10+0x30

65

void WriteIns(char instruction) 寫命令至 LCD 中 RS = 0 選擇指令暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = instruction 輸出命令至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteData(char i) 寫資料至 LCD 中 RS = 1 選擇資料暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = i 輸出資料至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteString(countMSG) 寫字串至 LCD 中 char count 字串長度 char MSG[] 字串資料 char i 定義位元組變數 for(i=0 iltcount i++) count 個位元組 WriteData(MSG[i]) 寫入一位元組的資料至 LCD 中 void CheckBusy(void) char i=0x80 檢查忙碌旗標 while(iamp0x80) 忙錄旗標 BF = 1 RS = 0 選擇指令暫存器 RW = 1 讀取 Enable = 1 致能 LCD i = P2 讀取 LCD 指令暫存器內的資料

66

Enable = 0 除能 LCD delay() 延遲函數 void delay() 延遲 5ms int i for(i=0 ilt250 i++)

  • 畢業專題封面pdf
  • File0004pdf
  • 最終版pdfpdf
Page 57: Based on Fuzzy Control Theorem and TPWM Method for DC ... · 使吾人想設計一模糊控制器來做為馬達轉速的閉迴路控制,以解決非線性系統的 問題。除此之外,flcs

48

參考文獻

﹝1﹞ 李適中直流馬達速度控制伺服控制〈基礎篇〉全華科技圖書股份有

限公司民 74

﹝2﹞ 廖錦文ldquo直流電動機之雙脈寬調變是〈TPWM〉驅動電路研究電

子技術月刊第 69 期pp94-1021992

﹝3﹞ 楊英魁孫宗瀛鄭魁香林建德蔣旭堂模糊控制理論與技術全華

科技圖書股份有限公司民 85

﹝4﹞ 林敦煌陳憬德直流馬達定位及轉速的模糊控制逢甲大學自動控制工

程學系學士論文民 87

﹝5﹞ LAZadehldquo Fuzzy Sets Information and Control Vol8 pp338-353

1965

﹝6﹞ EHMamdani and SAsslianldquo A fuzzy logic controller for a dynamic

plant Internation Journal of Man-Machine Studies Vol7 pp1-13 1975

﹝7﹞ 孫宗瀛楊英魁Fuzzy 控制理論實作與應用全華科技圖書股份有

限公司民 83 年

﹝8﹞ 許中平黃煌嘉直流電動機控制電路設計全華科技圖書股份有限公司

民 75

﹝9﹞ 盧明智黃敏祥OP Amp 應用+實驗模擬全華科技圖書股份有限公司

民 83

﹝10﹞陳文耀電動機控制工程復文書局2003

﹝11﹞許中平林全福電動機運轉控制技術全華科技圖書股份有限公司民

77

﹝12﹞楊明豐8051 單晶片 C 語言設計實務碁峯資訊2003 年

﹝13﹞蔡朝洋單晶片微電腦 80518951 原理與應用全華科技圖書股份有限公

司民 91

49

﹝14﹞王文俊認識 Fuzzy全華科技圖書股份有限公司民 90

50

附錄 A 專題硬體展示圖

圖 A-1 硬體整體圖

圖 A-2 硬體整體鳥瞰圖

51

圖 A-3 硬體側視圖

圖 A-4 操作與顯示面板

圖 A-5 間距脈波電路與 FV 電路

52

圖 A-6 橋型驅動功率放大電路

圖 A-7 操作與控制面板

53

附錄 B PWM 與模糊控制之程式

include reg51h include stdioh sbit ADCRD = P3^1 設定 RD 控制線接腳為 P31 sbit ADCWR = P3^3 設定 WR 控制線接腳為 P33 sbit P2_0 = 0xA0 接腳定義 sbit P2_1 = 0xA1 接腳定義 sbit P3_0 = 0xB0 接腳定義 sbit P3_1 = 0xB1 接腳定義 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P3_6 = 0xB6 接腳定義 void KeyStatus(void) 函數原型宣告 void feedback(void) 函數原型宣告 void compute_grade(void) 函數原型宣告 void delay1ms(int count) 函數原型宣告 void convert() 函數原型宣告 void condition() 函數原型宣告 void CW(void) 函數原型宣告 int j i 對應 PWM 的寬度 unsigned int temp 所設計的計時器時間 int sample = 1000 取樣率設定消除顯示值跳動 long int value r1 讀取 ADC0804 數位資料 long int set n condition select long int r grade_reg[2] grade[15] error1 error2 long int a1 b1 I long int membership[5][3]membership1[3][3] 定義歸屬函數 long int membership2[3][3] = -10-50-5050510 long int error[2] int Rule[15][3] = 113213313 定義判斷規則庫 212223323 311232333 411241342 511251351

54

main() 主程式 j = PWM = 110 設定 PWM 初始值 IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x00 設定計時器 0 工作於模式 0 temp=8192-j4 設定計時器 0 初值 TH0 = temp 32 TL0 = temp 32 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 P3_4 = 1 P3_5 = 0 P3_6 = 0 ADCWR = 0 令 ADC0804 的 WR = 0 ADCWR = 1 令 ADC0804 的 WR = 1 while (1) KeyStatus() 檢查鍵值 void KeyStatus(void) 檢查鍵值並給對應的 PWM 值 char KeyScan(void) 按鍵掃描函數宣告 unsigned char KeyStatus unsigned char Key = 0 KeyStatus=KeyScan() 呼叫按鍵掃描函數 if (KeyStatus = 0) 已有按鍵輸入 Key = KeyStatus Key = 鍵值 if (Key == 0x01) 假如輸入為按鍵 1 i = 110 PWM 為 110us j = i P3_4 = 1 LED 亮第一顆〈表馬達停止〉 P3_5 = 0 P3_6 = 0

55

else if (Key == 0x02 ) 假如輸入為按鍵 2 i = 140 PWM 為 140us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x04 ) 假如輸入為按鍵 3 i = 180 PWM 為 180us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x08 ) 假如輸入為按鍵 4 i = 80 PWM 為 80us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 else if (Key == 0x10 ) 假如輸入為按鍵 5 i = 40 PWM 為 40us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 PWM = j delay1ms(10) 呼叫延遲函數 feedback() 模糊控制判斷

56

void To_int(void) interrupt 1 Timer0 中斷函數 if (P3_0 == 0) 假如 PWM 輸出為 Low P3_0 = 1 變更 PWM 輸出為 High temp=8192-j4 設定 High 的時間 else 若 PWM 輸出為 High P3_0 = 0 變更 PWM 輸出為 Low temp=8192-880+j4 設定 Low 的時間 TH0 = temp 32 Timer0 的計時時間 TL0 = temp 32 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 char KeyScan(void) 檢查鍵值 char KeyStatus 按鍵狀態 P0=0xff 設定 P0 為輸入模式 KeyStatus=~P0 讀取按鍵狀態 return(KeyStatus) 將鍵值送回程式 void feedback(void) 模糊判斷 void Fuzzycontroller() 函數原型宣告 void condition1() 函數原型宣告

57

void condition2() 函數原型宣告 error1 = ((value)40-160)03 輸入變數 1 delay10ms(10) 延遲 10ms error2 = ((value)40-160)03 輸入變數 2 if (key == 0x01 ) 當按鍵 1找出對應的歸屬函數 並做出模糊控制判斷

int membership[5][3]= -100-60-30-60-300-30030030603060100

int membership1[3][3]=-100-500-50050050100 Fuzzycontroller() condition() if (key == 0x02 ) 當按鍵 2找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

05010050100150100150200150200250200250300 int membership1[3][3]=07515075150225150225300 Fuzzycontroller() condition() else if (key == 0x04) 當按鍵 3找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

200320400300400500400500600500600700600700800 int membership1[3][3]=220370520370520670520670820 Fuzzycontroller() condition() else if (key == 0x08) 當按鍵 4找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

02550255010050100200100200300200300400 int membership1[3][3]=05010050100250100250400 Fuzzycontroller() condition()

58

else if (key == 0x10) 當按鍵 5找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

150250350250350450350450550450550650550650750 int membership1[3][3]=150300450300450600450600750 Fuzzycontroller() condition2() void Fuzzycontroller() 模糊控制判斷 void compute_grade() 函數原型宣告 void compute_grade1() 函數原型宣告 a1 = 0 b1 = 001 I = 0 for (n=0 nlt=14 n++) r = error1 set = Rule[n][0]-1 compute_grade() 計算輸入變數 1 與

模糊程度的歸屬函數 condition = 1 r = error2 set = Rule[n][1]-1 compute_grade1() 計算輸入變數 2 與 模糊程度的歸屬函數 grade[n] = MIN(grade_reg[0] grade_reg[1]) a1 = a1 + (grade[n]membership2[Rule[n][2]-1][1]) b1 = b1 + grade[n] I = a1 b1 得到模糊控制判斷的結果 void compute_grade() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership[set][0]) || (r gt membership[set][2])) 當輸入變數不在 歸屬函數內

59

grade_reg[condition] = 0 else if ((r gt membership[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership[set][2]-r) (membership[set][2] - membership[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership[set][0]) (membership[set][1] - membership[set][0]) void compute_grade1() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership1[set][0]) || (r gt membership1[set][2])) 當輸入變數不在 歸屬函數內 grade_reg[condition] = 0 else if ((r gt membership1[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership1[set][2]-r) (membership1[set][2]-membership1[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership1[set][0]) (membership1[set][1]-membership1[set][0])

60

void condition() P2_0 = 1 設定 P20 為輸入模式 P2_1 = 1 設定 P21 為輸入模式 if ( (P2_0 == 1) ampamp (P2_1 == 0)) 當馬達為正轉時 if ( I gt 0 ) 若模糊判斷結果為正 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 若模糊判斷結果為零 PWM = PWM + 0 PWM 寬度不變 if ( I lt 0 ) 若模糊控制結果小於零 PWM = PWM + 1 PWM 寬度加 1 else if ( (P2_0 == 0) ampamp (P2_1 == 1) ) 若馬達為反轉 if ( I lt 0 ) 模糊控制小於零 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 模糊控制等於零 PWM = PWM + 0 PWM 寬度不變 if ( I gt 0 ) 模糊控制大於零 PWM = PWM + 1 PWM 寬度加 1 CW() 判斷 PWM 寬度上下限

61

void CW() 判斷 PWM 寬度上下限 if ( PWM gt= 215 ) 若 PWM 寬度 gt= 最大寬度 j = 215 PWM 寬度維持於 215us if ( PWM lt= 5 ) 若 PWM 寬度 lt= 最小寬度 j = 5 PWM 寬度維持在 5us if ( PWM gt 5 ampamp PWM lt 215 ) PWM 寬度介於最大與最小間 j = PWM PWM 依模糊控制判斷結果增減 void delay1ms(int count) 延遲 1ms int x y for ( x = 0 x lt count x++ ) for ( y = 0 y lt 122 y++ ) void convert() 數位資料換算成馬達轉速 r1 = ((value)40)-160

62

附錄 C LCD 顯示之程式

includereg51h 含 8051 所有暫存器宣告 include mathh define RS P3_5 LCD 指令資料選擇控制 define RW P3_4 LCD 讀寫控制腳 define Enable P3_3 LCD 致能接腳 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P0_0 = 0x80 接腳定義 sbit P0_1 = 0x81 接腳定義 sbit P0_2 = 0x82 接腳定義 sbit P0_3 = 0x83 接腳定義 sbit P0_4 = 0x84 接腳定義 sbit P0_5 = 0x85 接腳定義 sbit P0_6 = 0x86 接腳定義 sbit ADCRD = P3^7 設定 RD 控制線接腳為 P37 sbit ADCWR = P3^6 設定 WR 控制線接腳為 P36 void delay(void) 函數原型宣告 void delay10ms(int count) 函數原型宣告 void display(void) 函數原型宣告 void InitialLCD(void) 函數原型宣告 void WriteIns(char) 函數原型宣告 void WriteData(char) 函數原型宣告 void WriteString(charchar) 函數原型宣告 void CheckBusy(void) 函數原型宣告 void convert(void) 函數原型宣告 char MSG0[] = Motor Speed = 定義字串 MSG0 char MSG2[] = rpm 定義字串 MSG2 unsigned char MSG1[8]=0000000 定義字串 MSG1 unsigned long int value 讀取 ADC0804 數位資料 int sample = 1000 取樣率設定消除顯示值跳動 long int rpm

63

main() 主程式 InitialLCD() 初始化 LCD IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x01 設定計時器 0 工作於模式 1 TH0 = (65536-5000)256 設定計時器 0 初值 TL0 = (65536-5000)256 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 while(1) 等待中斷 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 while (--sample == 0) 取樣率減 1 sample = 1000 重設取樣率 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 void T0_int(void) interrupt 1 LCD 顯示動態掃描 display() 動態掃描顯示 TH0 = (65536-65535)256 重設計時初值 TL0 = (65536-65535)256

64

void InitialLCD(void) 設定 LCD 模組初始狀態 delay() 延遲函數 WriteIns(0x38) 設定 LCD 模組為 WriteIns(0x38) 2 行顯示 WriteIns(0x38) 8 位元介面 WriteIns(0x38) 5x7 點字型 WriteIns(0x08) 關閉顯示器 WriteIns(0x01) 清除 LCD 螢幕 WriteIns(0x0c) 令顯示器 ON但游標不顯示 WriteIns(0x06) 令 LCD 模組每接收到 1Byte 資料 AC 值自動加 1 void display() 掃描顯示 WriteIns(0x80) 設定 LCD 座標 WriteString(13MSG0) 將字串 MSG0 寫入 LCD 中 WriteIns(0xc0) 設定 LCD 座標 WriteString(8MSG1) 將字串 MSG1 寫入 LCD 中 WriteIns(0xc8) 設定 LCD 座標 WriteString(4MSG2) 將字串 MSG2 寫入 LCD 中 void convert(void) 換算轉速 long int freq freq = ((value)4000) - 16000 數位資料換成頻率公式 rpm = freq3 頻率換算轉速公式 MSG1[0] = (rpm1000000)+0x30 將結果存入字串 MSG1 中 MSG1[1] = ((rpm1000000)100000)+0x30 MSG1[2] = ((rpm100000)10000)+0x30 MSG1[3] = ((rpm10000)1000)+0x30 MSG1[4] = 0x2e MSG1[5] = ((rpm1000)100)+0x30 MSG1[6] = ((rpm100)10)+0x30 MSG1[7] = rpm10+0x30

65

void WriteIns(char instruction) 寫命令至 LCD 中 RS = 0 選擇指令暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = instruction 輸出命令至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteData(char i) 寫資料至 LCD 中 RS = 1 選擇資料暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = i 輸出資料至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteString(countMSG) 寫字串至 LCD 中 char count 字串長度 char MSG[] 字串資料 char i 定義位元組變數 for(i=0 iltcount i++) count 個位元組 WriteData(MSG[i]) 寫入一位元組的資料至 LCD 中 void CheckBusy(void) char i=0x80 檢查忙碌旗標 while(iamp0x80) 忙錄旗標 BF = 1 RS = 0 選擇指令暫存器 RW = 1 讀取 Enable = 1 致能 LCD i = P2 讀取 LCD 指令暫存器內的資料

66

Enable = 0 除能 LCD delay() 延遲函數 void delay() 延遲 5ms int i for(i=0 ilt250 i++)

  • 畢業專題封面pdf
  • File0004pdf
  • 最終版pdfpdf
Page 58: Based on Fuzzy Control Theorem and TPWM Method for DC ... · 使吾人想設計一模糊控制器來做為馬達轉速的閉迴路控制,以解決非線性系統的 問題。除此之外,flcs

49

﹝14﹞王文俊認識 Fuzzy全華科技圖書股份有限公司民 90

50

附錄 A 專題硬體展示圖

圖 A-1 硬體整體圖

圖 A-2 硬體整體鳥瞰圖

51

圖 A-3 硬體側視圖

圖 A-4 操作與顯示面板

圖 A-5 間距脈波電路與 FV 電路

52

圖 A-6 橋型驅動功率放大電路

圖 A-7 操作與控制面板

53

附錄 B PWM 與模糊控制之程式

include reg51h include stdioh sbit ADCRD = P3^1 設定 RD 控制線接腳為 P31 sbit ADCWR = P3^3 設定 WR 控制線接腳為 P33 sbit P2_0 = 0xA0 接腳定義 sbit P2_1 = 0xA1 接腳定義 sbit P3_0 = 0xB0 接腳定義 sbit P3_1 = 0xB1 接腳定義 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P3_6 = 0xB6 接腳定義 void KeyStatus(void) 函數原型宣告 void feedback(void) 函數原型宣告 void compute_grade(void) 函數原型宣告 void delay1ms(int count) 函數原型宣告 void convert() 函數原型宣告 void condition() 函數原型宣告 void CW(void) 函數原型宣告 int j i 對應 PWM 的寬度 unsigned int temp 所設計的計時器時間 int sample = 1000 取樣率設定消除顯示值跳動 long int value r1 讀取 ADC0804 數位資料 long int set n condition select long int r grade_reg[2] grade[15] error1 error2 long int a1 b1 I long int membership[5][3]membership1[3][3] 定義歸屬函數 long int membership2[3][3] = -10-50-5050510 long int error[2] int Rule[15][3] = 113213313 定義判斷規則庫 212223323 311232333 411241342 511251351

54

main() 主程式 j = PWM = 110 設定 PWM 初始值 IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x00 設定計時器 0 工作於模式 0 temp=8192-j4 設定計時器 0 初值 TH0 = temp 32 TL0 = temp 32 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 P3_4 = 1 P3_5 = 0 P3_6 = 0 ADCWR = 0 令 ADC0804 的 WR = 0 ADCWR = 1 令 ADC0804 的 WR = 1 while (1) KeyStatus() 檢查鍵值 void KeyStatus(void) 檢查鍵值並給對應的 PWM 值 char KeyScan(void) 按鍵掃描函數宣告 unsigned char KeyStatus unsigned char Key = 0 KeyStatus=KeyScan() 呼叫按鍵掃描函數 if (KeyStatus = 0) 已有按鍵輸入 Key = KeyStatus Key = 鍵值 if (Key == 0x01) 假如輸入為按鍵 1 i = 110 PWM 為 110us j = i P3_4 = 1 LED 亮第一顆〈表馬達停止〉 P3_5 = 0 P3_6 = 0

55

else if (Key == 0x02 ) 假如輸入為按鍵 2 i = 140 PWM 為 140us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x04 ) 假如輸入為按鍵 3 i = 180 PWM 為 180us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x08 ) 假如輸入為按鍵 4 i = 80 PWM 為 80us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 else if (Key == 0x10 ) 假如輸入為按鍵 5 i = 40 PWM 為 40us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 PWM = j delay1ms(10) 呼叫延遲函數 feedback() 模糊控制判斷

56

void To_int(void) interrupt 1 Timer0 中斷函數 if (P3_0 == 0) 假如 PWM 輸出為 Low P3_0 = 1 變更 PWM 輸出為 High temp=8192-j4 設定 High 的時間 else 若 PWM 輸出為 High P3_0 = 0 變更 PWM 輸出為 Low temp=8192-880+j4 設定 Low 的時間 TH0 = temp 32 Timer0 的計時時間 TL0 = temp 32 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 char KeyScan(void) 檢查鍵值 char KeyStatus 按鍵狀態 P0=0xff 設定 P0 為輸入模式 KeyStatus=~P0 讀取按鍵狀態 return(KeyStatus) 將鍵值送回程式 void feedback(void) 模糊判斷 void Fuzzycontroller() 函數原型宣告 void condition1() 函數原型宣告

57

void condition2() 函數原型宣告 error1 = ((value)40-160)03 輸入變數 1 delay10ms(10) 延遲 10ms error2 = ((value)40-160)03 輸入變數 2 if (key == 0x01 ) 當按鍵 1找出對應的歸屬函數 並做出模糊控制判斷

int membership[5][3]= -100-60-30-60-300-30030030603060100

int membership1[3][3]=-100-500-50050050100 Fuzzycontroller() condition() if (key == 0x02 ) 當按鍵 2找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

05010050100150100150200150200250200250300 int membership1[3][3]=07515075150225150225300 Fuzzycontroller() condition() else if (key == 0x04) 當按鍵 3找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

200320400300400500400500600500600700600700800 int membership1[3][3]=220370520370520670520670820 Fuzzycontroller() condition() else if (key == 0x08) 當按鍵 4找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

02550255010050100200100200300200300400 int membership1[3][3]=05010050100250100250400 Fuzzycontroller() condition()

58

else if (key == 0x10) 當按鍵 5找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

150250350250350450350450550450550650550650750 int membership1[3][3]=150300450300450600450600750 Fuzzycontroller() condition2() void Fuzzycontroller() 模糊控制判斷 void compute_grade() 函數原型宣告 void compute_grade1() 函數原型宣告 a1 = 0 b1 = 001 I = 0 for (n=0 nlt=14 n++) r = error1 set = Rule[n][0]-1 compute_grade() 計算輸入變數 1 與

模糊程度的歸屬函數 condition = 1 r = error2 set = Rule[n][1]-1 compute_grade1() 計算輸入變數 2 與 模糊程度的歸屬函數 grade[n] = MIN(grade_reg[0] grade_reg[1]) a1 = a1 + (grade[n]membership2[Rule[n][2]-1][1]) b1 = b1 + grade[n] I = a1 b1 得到模糊控制判斷的結果 void compute_grade() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership[set][0]) || (r gt membership[set][2])) 當輸入變數不在 歸屬函數內

59

grade_reg[condition] = 0 else if ((r gt membership[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership[set][2]-r) (membership[set][2] - membership[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership[set][0]) (membership[set][1] - membership[set][0]) void compute_grade1() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership1[set][0]) || (r gt membership1[set][2])) 當輸入變數不在 歸屬函數內 grade_reg[condition] = 0 else if ((r gt membership1[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership1[set][2]-r) (membership1[set][2]-membership1[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership1[set][0]) (membership1[set][1]-membership1[set][0])

60

void condition() P2_0 = 1 設定 P20 為輸入模式 P2_1 = 1 設定 P21 為輸入模式 if ( (P2_0 == 1) ampamp (P2_1 == 0)) 當馬達為正轉時 if ( I gt 0 ) 若模糊判斷結果為正 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 若模糊判斷結果為零 PWM = PWM + 0 PWM 寬度不變 if ( I lt 0 ) 若模糊控制結果小於零 PWM = PWM + 1 PWM 寬度加 1 else if ( (P2_0 == 0) ampamp (P2_1 == 1) ) 若馬達為反轉 if ( I lt 0 ) 模糊控制小於零 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 模糊控制等於零 PWM = PWM + 0 PWM 寬度不變 if ( I gt 0 ) 模糊控制大於零 PWM = PWM + 1 PWM 寬度加 1 CW() 判斷 PWM 寬度上下限

61

void CW() 判斷 PWM 寬度上下限 if ( PWM gt= 215 ) 若 PWM 寬度 gt= 最大寬度 j = 215 PWM 寬度維持於 215us if ( PWM lt= 5 ) 若 PWM 寬度 lt= 最小寬度 j = 5 PWM 寬度維持在 5us if ( PWM gt 5 ampamp PWM lt 215 ) PWM 寬度介於最大與最小間 j = PWM PWM 依模糊控制判斷結果增減 void delay1ms(int count) 延遲 1ms int x y for ( x = 0 x lt count x++ ) for ( y = 0 y lt 122 y++ ) void convert() 數位資料換算成馬達轉速 r1 = ((value)40)-160

62

附錄 C LCD 顯示之程式

includereg51h 含 8051 所有暫存器宣告 include mathh define RS P3_5 LCD 指令資料選擇控制 define RW P3_4 LCD 讀寫控制腳 define Enable P3_3 LCD 致能接腳 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P0_0 = 0x80 接腳定義 sbit P0_1 = 0x81 接腳定義 sbit P0_2 = 0x82 接腳定義 sbit P0_3 = 0x83 接腳定義 sbit P0_4 = 0x84 接腳定義 sbit P0_5 = 0x85 接腳定義 sbit P0_6 = 0x86 接腳定義 sbit ADCRD = P3^7 設定 RD 控制線接腳為 P37 sbit ADCWR = P3^6 設定 WR 控制線接腳為 P36 void delay(void) 函數原型宣告 void delay10ms(int count) 函數原型宣告 void display(void) 函數原型宣告 void InitialLCD(void) 函數原型宣告 void WriteIns(char) 函數原型宣告 void WriteData(char) 函數原型宣告 void WriteString(charchar) 函數原型宣告 void CheckBusy(void) 函數原型宣告 void convert(void) 函數原型宣告 char MSG0[] = Motor Speed = 定義字串 MSG0 char MSG2[] = rpm 定義字串 MSG2 unsigned char MSG1[8]=0000000 定義字串 MSG1 unsigned long int value 讀取 ADC0804 數位資料 int sample = 1000 取樣率設定消除顯示值跳動 long int rpm

63

main() 主程式 InitialLCD() 初始化 LCD IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x01 設定計時器 0 工作於模式 1 TH0 = (65536-5000)256 設定計時器 0 初值 TL0 = (65536-5000)256 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 while(1) 等待中斷 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 while (--sample == 0) 取樣率減 1 sample = 1000 重設取樣率 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 void T0_int(void) interrupt 1 LCD 顯示動態掃描 display() 動態掃描顯示 TH0 = (65536-65535)256 重設計時初值 TL0 = (65536-65535)256

64

void InitialLCD(void) 設定 LCD 模組初始狀態 delay() 延遲函數 WriteIns(0x38) 設定 LCD 模組為 WriteIns(0x38) 2 行顯示 WriteIns(0x38) 8 位元介面 WriteIns(0x38) 5x7 點字型 WriteIns(0x08) 關閉顯示器 WriteIns(0x01) 清除 LCD 螢幕 WriteIns(0x0c) 令顯示器 ON但游標不顯示 WriteIns(0x06) 令 LCD 模組每接收到 1Byte 資料 AC 值自動加 1 void display() 掃描顯示 WriteIns(0x80) 設定 LCD 座標 WriteString(13MSG0) 將字串 MSG0 寫入 LCD 中 WriteIns(0xc0) 設定 LCD 座標 WriteString(8MSG1) 將字串 MSG1 寫入 LCD 中 WriteIns(0xc8) 設定 LCD 座標 WriteString(4MSG2) 將字串 MSG2 寫入 LCD 中 void convert(void) 換算轉速 long int freq freq = ((value)4000) - 16000 數位資料換成頻率公式 rpm = freq3 頻率換算轉速公式 MSG1[0] = (rpm1000000)+0x30 將結果存入字串 MSG1 中 MSG1[1] = ((rpm1000000)100000)+0x30 MSG1[2] = ((rpm100000)10000)+0x30 MSG1[3] = ((rpm10000)1000)+0x30 MSG1[4] = 0x2e MSG1[5] = ((rpm1000)100)+0x30 MSG1[6] = ((rpm100)10)+0x30 MSG1[7] = rpm10+0x30

65

void WriteIns(char instruction) 寫命令至 LCD 中 RS = 0 選擇指令暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = instruction 輸出命令至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteData(char i) 寫資料至 LCD 中 RS = 1 選擇資料暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = i 輸出資料至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteString(countMSG) 寫字串至 LCD 中 char count 字串長度 char MSG[] 字串資料 char i 定義位元組變數 for(i=0 iltcount i++) count 個位元組 WriteData(MSG[i]) 寫入一位元組的資料至 LCD 中 void CheckBusy(void) char i=0x80 檢查忙碌旗標 while(iamp0x80) 忙錄旗標 BF = 1 RS = 0 選擇指令暫存器 RW = 1 讀取 Enable = 1 致能 LCD i = P2 讀取 LCD 指令暫存器內的資料

66

Enable = 0 除能 LCD delay() 延遲函數 void delay() 延遲 5ms int i for(i=0 ilt250 i++)

  • 畢業專題封面pdf
  • File0004pdf
  • 最終版pdfpdf
Page 59: Based on Fuzzy Control Theorem and TPWM Method for DC ... · 使吾人想設計一模糊控制器來做為馬達轉速的閉迴路控制,以解決非線性系統的 問題。除此之外,flcs

50

附錄 A 專題硬體展示圖

圖 A-1 硬體整體圖

圖 A-2 硬體整體鳥瞰圖

51

圖 A-3 硬體側視圖

圖 A-4 操作與顯示面板

圖 A-5 間距脈波電路與 FV 電路

52

圖 A-6 橋型驅動功率放大電路

圖 A-7 操作與控制面板

53

附錄 B PWM 與模糊控制之程式

include reg51h include stdioh sbit ADCRD = P3^1 設定 RD 控制線接腳為 P31 sbit ADCWR = P3^3 設定 WR 控制線接腳為 P33 sbit P2_0 = 0xA0 接腳定義 sbit P2_1 = 0xA1 接腳定義 sbit P3_0 = 0xB0 接腳定義 sbit P3_1 = 0xB1 接腳定義 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P3_6 = 0xB6 接腳定義 void KeyStatus(void) 函數原型宣告 void feedback(void) 函數原型宣告 void compute_grade(void) 函數原型宣告 void delay1ms(int count) 函數原型宣告 void convert() 函數原型宣告 void condition() 函數原型宣告 void CW(void) 函數原型宣告 int j i 對應 PWM 的寬度 unsigned int temp 所設計的計時器時間 int sample = 1000 取樣率設定消除顯示值跳動 long int value r1 讀取 ADC0804 數位資料 long int set n condition select long int r grade_reg[2] grade[15] error1 error2 long int a1 b1 I long int membership[5][3]membership1[3][3] 定義歸屬函數 long int membership2[3][3] = -10-50-5050510 long int error[2] int Rule[15][3] = 113213313 定義判斷規則庫 212223323 311232333 411241342 511251351

54

main() 主程式 j = PWM = 110 設定 PWM 初始值 IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x00 設定計時器 0 工作於模式 0 temp=8192-j4 設定計時器 0 初值 TH0 = temp 32 TL0 = temp 32 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 P3_4 = 1 P3_5 = 0 P3_6 = 0 ADCWR = 0 令 ADC0804 的 WR = 0 ADCWR = 1 令 ADC0804 的 WR = 1 while (1) KeyStatus() 檢查鍵值 void KeyStatus(void) 檢查鍵值並給對應的 PWM 值 char KeyScan(void) 按鍵掃描函數宣告 unsigned char KeyStatus unsigned char Key = 0 KeyStatus=KeyScan() 呼叫按鍵掃描函數 if (KeyStatus = 0) 已有按鍵輸入 Key = KeyStatus Key = 鍵值 if (Key == 0x01) 假如輸入為按鍵 1 i = 110 PWM 為 110us j = i P3_4 = 1 LED 亮第一顆〈表馬達停止〉 P3_5 = 0 P3_6 = 0

55

else if (Key == 0x02 ) 假如輸入為按鍵 2 i = 140 PWM 為 140us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x04 ) 假如輸入為按鍵 3 i = 180 PWM 為 180us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x08 ) 假如輸入為按鍵 4 i = 80 PWM 為 80us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 else if (Key == 0x10 ) 假如輸入為按鍵 5 i = 40 PWM 為 40us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 PWM = j delay1ms(10) 呼叫延遲函數 feedback() 模糊控制判斷

56

void To_int(void) interrupt 1 Timer0 中斷函數 if (P3_0 == 0) 假如 PWM 輸出為 Low P3_0 = 1 變更 PWM 輸出為 High temp=8192-j4 設定 High 的時間 else 若 PWM 輸出為 High P3_0 = 0 變更 PWM 輸出為 Low temp=8192-880+j4 設定 Low 的時間 TH0 = temp 32 Timer0 的計時時間 TL0 = temp 32 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 char KeyScan(void) 檢查鍵值 char KeyStatus 按鍵狀態 P0=0xff 設定 P0 為輸入模式 KeyStatus=~P0 讀取按鍵狀態 return(KeyStatus) 將鍵值送回程式 void feedback(void) 模糊判斷 void Fuzzycontroller() 函數原型宣告 void condition1() 函數原型宣告

57

void condition2() 函數原型宣告 error1 = ((value)40-160)03 輸入變數 1 delay10ms(10) 延遲 10ms error2 = ((value)40-160)03 輸入變數 2 if (key == 0x01 ) 當按鍵 1找出對應的歸屬函數 並做出模糊控制判斷

int membership[5][3]= -100-60-30-60-300-30030030603060100

int membership1[3][3]=-100-500-50050050100 Fuzzycontroller() condition() if (key == 0x02 ) 當按鍵 2找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

05010050100150100150200150200250200250300 int membership1[3][3]=07515075150225150225300 Fuzzycontroller() condition() else if (key == 0x04) 當按鍵 3找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

200320400300400500400500600500600700600700800 int membership1[3][3]=220370520370520670520670820 Fuzzycontroller() condition() else if (key == 0x08) 當按鍵 4找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

02550255010050100200100200300200300400 int membership1[3][3]=05010050100250100250400 Fuzzycontroller() condition()

58

else if (key == 0x10) 當按鍵 5找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

150250350250350450350450550450550650550650750 int membership1[3][3]=150300450300450600450600750 Fuzzycontroller() condition2() void Fuzzycontroller() 模糊控制判斷 void compute_grade() 函數原型宣告 void compute_grade1() 函數原型宣告 a1 = 0 b1 = 001 I = 0 for (n=0 nlt=14 n++) r = error1 set = Rule[n][0]-1 compute_grade() 計算輸入變數 1 與

模糊程度的歸屬函數 condition = 1 r = error2 set = Rule[n][1]-1 compute_grade1() 計算輸入變數 2 與 模糊程度的歸屬函數 grade[n] = MIN(grade_reg[0] grade_reg[1]) a1 = a1 + (grade[n]membership2[Rule[n][2]-1][1]) b1 = b1 + grade[n] I = a1 b1 得到模糊控制判斷的結果 void compute_grade() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership[set][0]) || (r gt membership[set][2])) 當輸入變數不在 歸屬函數內

59

grade_reg[condition] = 0 else if ((r gt membership[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership[set][2]-r) (membership[set][2] - membership[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership[set][0]) (membership[set][1] - membership[set][0]) void compute_grade1() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership1[set][0]) || (r gt membership1[set][2])) 當輸入變數不在 歸屬函數內 grade_reg[condition] = 0 else if ((r gt membership1[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership1[set][2]-r) (membership1[set][2]-membership1[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership1[set][0]) (membership1[set][1]-membership1[set][0])

60

void condition() P2_0 = 1 設定 P20 為輸入模式 P2_1 = 1 設定 P21 為輸入模式 if ( (P2_0 == 1) ampamp (P2_1 == 0)) 當馬達為正轉時 if ( I gt 0 ) 若模糊判斷結果為正 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 若模糊判斷結果為零 PWM = PWM + 0 PWM 寬度不變 if ( I lt 0 ) 若模糊控制結果小於零 PWM = PWM + 1 PWM 寬度加 1 else if ( (P2_0 == 0) ampamp (P2_1 == 1) ) 若馬達為反轉 if ( I lt 0 ) 模糊控制小於零 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 模糊控制等於零 PWM = PWM + 0 PWM 寬度不變 if ( I gt 0 ) 模糊控制大於零 PWM = PWM + 1 PWM 寬度加 1 CW() 判斷 PWM 寬度上下限

61

void CW() 判斷 PWM 寬度上下限 if ( PWM gt= 215 ) 若 PWM 寬度 gt= 最大寬度 j = 215 PWM 寬度維持於 215us if ( PWM lt= 5 ) 若 PWM 寬度 lt= 最小寬度 j = 5 PWM 寬度維持在 5us if ( PWM gt 5 ampamp PWM lt 215 ) PWM 寬度介於最大與最小間 j = PWM PWM 依模糊控制判斷結果增減 void delay1ms(int count) 延遲 1ms int x y for ( x = 0 x lt count x++ ) for ( y = 0 y lt 122 y++ ) void convert() 數位資料換算成馬達轉速 r1 = ((value)40)-160

62

附錄 C LCD 顯示之程式

includereg51h 含 8051 所有暫存器宣告 include mathh define RS P3_5 LCD 指令資料選擇控制 define RW P3_4 LCD 讀寫控制腳 define Enable P3_3 LCD 致能接腳 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P0_0 = 0x80 接腳定義 sbit P0_1 = 0x81 接腳定義 sbit P0_2 = 0x82 接腳定義 sbit P0_3 = 0x83 接腳定義 sbit P0_4 = 0x84 接腳定義 sbit P0_5 = 0x85 接腳定義 sbit P0_6 = 0x86 接腳定義 sbit ADCRD = P3^7 設定 RD 控制線接腳為 P37 sbit ADCWR = P3^6 設定 WR 控制線接腳為 P36 void delay(void) 函數原型宣告 void delay10ms(int count) 函數原型宣告 void display(void) 函數原型宣告 void InitialLCD(void) 函數原型宣告 void WriteIns(char) 函數原型宣告 void WriteData(char) 函數原型宣告 void WriteString(charchar) 函數原型宣告 void CheckBusy(void) 函數原型宣告 void convert(void) 函數原型宣告 char MSG0[] = Motor Speed = 定義字串 MSG0 char MSG2[] = rpm 定義字串 MSG2 unsigned char MSG1[8]=0000000 定義字串 MSG1 unsigned long int value 讀取 ADC0804 數位資料 int sample = 1000 取樣率設定消除顯示值跳動 long int rpm

63

main() 主程式 InitialLCD() 初始化 LCD IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x01 設定計時器 0 工作於模式 1 TH0 = (65536-5000)256 設定計時器 0 初值 TL0 = (65536-5000)256 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 while(1) 等待中斷 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 while (--sample == 0) 取樣率減 1 sample = 1000 重設取樣率 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 void T0_int(void) interrupt 1 LCD 顯示動態掃描 display() 動態掃描顯示 TH0 = (65536-65535)256 重設計時初值 TL0 = (65536-65535)256

64

void InitialLCD(void) 設定 LCD 模組初始狀態 delay() 延遲函數 WriteIns(0x38) 設定 LCD 模組為 WriteIns(0x38) 2 行顯示 WriteIns(0x38) 8 位元介面 WriteIns(0x38) 5x7 點字型 WriteIns(0x08) 關閉顯示器 WriteIns(0x01) 清除 LCD 螢幕 WriteIns(0x0c) 令顯示器 ON但游標不顯示 WriteIns(0x06) 令 LCD 模組每接收到 1Byte 資料 AC 值自動加 1 void display() 掃描顯示 WriteIns(0x80) 設定 LCD 座標 WriteString(13MSG0) 將字串 MSG0 寫入 LCD 中 WriteIns(0xc0) 設定 LCD 座標 WriteString(8MSG1) 將字串 MSG1 寫入 LCD 中 WriteIns(0xc8) 設定 LCD 座標 WriteString(4MSG2) 將字串 MSG2 寫入 LCD 中 void convert(void) 換算轉速 long int freq freq = ((value)4000) - 16000 數位資料換成頻率公式 rpm = freq3 頻率換算轉速公式 MSG1[0] = (rpm1000000)+0x30 將結果存入字串 MSG1 中 MSG1[1] = ((rpm1000000)100000)+0x30 MSG1[2] = ((rpm100000)10000)+0x30 MSG1[3] = ((rpm10000)1000)+0x30 MSG1[4] = 0x2e MSG1[5] = ((rpm1000)100)+0x30 MSG1[6] = ((rpm100)10)+0x30 MSG1[7] = rpm10+0x30

65

void WriteIns(char instruction) 寫命令至 LCD 中 RS = 0 選擇指令暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = instruction 輸出命令至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteData(char i) 寫資料至 LCD 中 RS = 1 選擇資料暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = i 輸出資料至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteString(countMSG) 寫字串至 LCD 中 char count 字串長度 char MSG[] 字串資料 char i 定義位元組變數 for(i=0 iltcount i++) count 個位元組 WriteData(MSG[i]) 寫入一位元組的資料至 LCD 中 void CheckBusy(void) char i=0x80 檢查忙碌旗標 while(iamp0x80) 忙錄旗標 BF = 1 RS = 0 選擇指令暫存器 RW = 1 讀取 Enable = 1 致能 LCD i = P2 讀取 LCD 指令暫存器內的資料

66

Enable = 0 除能 LCD delay() 延遲函數 void delay() 延遲 5ms int i for(i=0 ilt250 i++)

  • 畢業專題封面pdf
  • File0004pdf
  • 最終版pdfpdf
Page 60: Based on Fuzzy Control Theorem and TPWM Method for DC ... · 使吾人想設計一模糊控制器來做為馬達轉速的閉迴路控制,以解決非線性系統的 問題。除此之外,flcs

51

圖 A-3 硬體側視圖

圖 A-4 操作與顯示面板

圖 A-5 間距脈波電路與 FV 電路

52

圖 A-6 橋型驅動功率放大電路

圖 A-7 操作與控制面板

53

附錄 B PWM 與模糊控制之程式

include reg51h include stdioh sbit ADCRD = P3^1 設定 RD 控制線接腳為 P31 sbit ADCWR = P3^3 設定 WR 控制線接腳為 P33 sbit P2_0 = 0xA0 接腳定義 sbit P2_1 = 0xA1 接腳定義 sbit P3_0 = 0xB0 接腳定義 sbit P3_1 = 0xB1 接腳定義 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P3_6 = 0xB6 接腳定義 void KeyStatus(void) 函數原型宣告 void feedback(void) 函數原型宣告 void compute_grade(void) 函數原型宣告 void delay1ms(int count) 函數原型宣告 void convert() 函數原型宣告 void condition() 函數原型宣告 void CW(void) 函數原型宣告 int j i 對應 PWM 的寬度 unsigned int temp 所設計的計時器時間 int sample = 1000 取樣率設定消除顯示值跳動 long int value r1 讀取 ADC0804 數位資料 long int set n condition select long int r grade_reg[2] grade[15] error1 error2 long int a1 b1 I long int membership[5][3]membership1[3][3] 定義歸屬函數 long int membership2[3][3] = -10-50-5050510 long int error[2] int Rule[15][3] = 113213313 定義判斷規則庫 212223323 311232333 411241342 511251351

54

main() 主程式 j = PWM = 110 設定 PWM 初始值 IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x00 設定計時器 0 工作於模式 0 temp=8192-j4 設定計時器 0 初值 TH0 = temp 32 TL0 = temp 32 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 P3_4 = 1 P3_5 = 0 P3_6 = 0 ADCWR = 0 令 ADC0804 的 WR = 0 ADCWR = 1 令 ADC0804 的 WR = 1 while (1) KeyStatus() 檢查鍵值 void KeyStatus(void) 檢查鍵值並給對應的 PWM 值 char KeyScan(void) 按鍵掃描函數宣告 unsigned char KeyStatus unsigned char Key = 0 KeyStatus=KeyScan() 呼叫按鍵掃描函數 if (KeyStatus = 0) 已有按鍵輸入 Key = KeyStatus Key = 鍵值 if (Key == 0x01) 假如輸入為按鍵 1 i = 110 PWM 為 110us j = i P3_4 = 1 LED 亮第一顆〈表馬達停止〉 P3_5 = 0 P3_6 = 0

55

else if (Key == 0x02 ) 假如輸入為按鍵 2 i = 140 PWM 為 140us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x04 ) 假如輸入為按鍵 3 i = 180 PWM 為 180us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x08 ) 假如輸入為按鍵 4 i = 80 PWM 為 80us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 else if (Key == 0x10 ) 假如輸入為按鍵 5 i = 40 PWM 為 40us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 PWM = j delay1ms(10) 呼叫延遲函數 feedback() 模糊控制判斷

56

void To_int(void) interrupt 1 Timer0 中斷函數 if (P3_0 == 0) 假如 PWM 輸出為 Low P3_0 = 1 變更 PWM 輸出為 High temp=8192-j4 設定 High 的時間 else 若 PWM 輸出為 High P3_0 = 0 變更 PWM 輸出為 Low temp=8192-880+j4 設定 Low 的時間 TH0 = temp 32 Timer0 的計時時間 TL0 = temp 32 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 char KeyScan(void) 檢查鍵值 char KeyStatus 按鍵狀態 P0=0xff 設定 P0 為輸入模式 KeyStatus=~P0 讀取按鍵狀態 return(KeyStatus) 將鍵值送回程式 void feedback(void) 模糊判斷 void Fuzzycontroller() 函數原型宣告 void condition1() 函數原型宣告

57

void condition2() 函數原型宣告 error1 = ((value)40-160)03 輸入變數 1 delay10ms(10) 延遲 10ms error2 = ((value)40-160)03 輸入變數 2 if (key == 0x01 ) 當按鍵 1找出對應的歸屬函數 並做出模糊控制判斷

int membership[5][3]= -100-60-30-60-300-30030030603060100

int membership1[3][3]=-100-500-50050050100 Fuzzycontroller() condition() if (key == 0x02 ) 當按鍵 2找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

05010050100150100150200150200250200250300 int membership1[3][3]=07515075150225150225300 Fuzzycontroller() condition() else if (key == 0x04) 當按鍵 3找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

200320400300400500400500600500600700600700800 int membership1[3][3]=220370520370520670520670820 Fuzzycontroller() condition() else if (key == 0x08) 當按鍵 4找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

02550255010050100200100200300200300400 int membership1[3][3]=05010050100250100250400 Fuzzycontroller() condition()

58

else if (key == 0x10) 當按鍵 5找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

150250350250350450350450550450550650550650750 int membership1[3][3]=150300450300450600450600750 Fuzzycontroller() condition2() void Fuzzycontroller() 模糊控制判斷 void compute_grade() 函數原型宣告 void compute_grade1() 函數原型宣告 a1 = 0 b1 = 001 I = 0 for (n=0 nlt=14 n++) r = error1 set = Rule[n][0]-1 compute_grade() 計算輸入變數 1 與

模糊程度的歸屬函數 condition = 1 r = error2 set = Rule[n][1]-1 compute_grade1() 計算輸入變數 2 與 模糊程度的歸屬函數 grade[n] = MIN(grade_reg[0] grade_reg[1]) a1 = a1 + (grade[n]membership2[Rule[n][2]-1][1]) b1 = b1 + grade[n] I = a1 b1 得到模糊控制判斷的結果 void compute_grade() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership[set][0]) || (r gt membership[set][2])) 當輸入變數不在 歸屬函數內

59

grade_reg[condition] = 0 else if ((r gt membership[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership[set][2]-r) (membership[set][2] - membership[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership[set][0]) (membership[set][1] - membership[set][0]) void compute_grade1() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership1[set][0]) || (r gt membership1[set][2])) 當輸入變數不在 歸屬函數內 grade_reg[condition] = 0 else if ((r gt membership1[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership1[set][2]-r) (membership1[set][2]-membership1[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership1[set][0]) (membership1[set][1]-membership1[set][0])

60

void condition() P2_0 = 1 設定 P20 為輸入模式 P2_1 = 1 設定 P21 為輸入模式 if ( (P2_0 == 1) ampamp (P2_1 == 0)) 當馬達為正轉時 if ( I gt 0 ) 若模糊判斷結果為正 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 若模糊判斷結果為零 PWM = PWM + 0 PWM 寬度不變 if ( I lt 0 ) 若模糊控制結果小於零 PWM = PWM + 1 PWM 寬度加 1 else if ( (P2_0 == 0) ampamp (P2_1 == 1) ) 若馬達為反轉 if ( I lt 0 ) 模糊控制小於零 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 模糊控制等於零 PWM = PWM + 0 PWM 寬度不變 if ( I gt 0 ) 模糊控制大於零 PWM = PWM + 1 PWM 寬度加 1 CW() 判斷 PWM 寬度上下限

61

void CW() 判斷 PWM 寬度上下限 if ( PWM gt= 215 ) 若 PWM 寬度 gt= 最大寬度 j = 215 PWM 寬度維持於 215us if ( PWM lt= 5 ) 若 PWM 寬度 lt= 最小寬度 j = 5 PWM 寬度維持在 5us if ( PWM gt 5 ampamp PWM lt 215 ) PWM 寬度介於最大與最小間 j = PWM PWM 依模糊控制判斷結果增減 void delay1ms(int count) 延遲 1ms int x y for ( x = 0 x lt count x++ ) for ( y = 0 y lt 122 y++ ) void convert() 數位資料換算成馬達轉速 r1 = ((value)40)-160

62

附錄 C LCD 顯示之程式

includereg51h 含 8051 所有暫存器宣告 include mathh define RS P3_5 LCD 指令資料選擇控制 define RW P3_4 LCD 讀寫控制腳 define Enable P3_3 LCD 致能接腳 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P0_0 = 0x80 接腳定義 sbit P0_1 = 0x81 接腳定義 sbit P0_2 = 0x82 接腳定義 sbit P0_3 = 0x83 接腳定義 sbit P0_4 = 0x84 接腳定義 sbit P0_5 = 0x85 接腳定義 sbit P0_6 = 0x86 接腳定義 sbit ADCRD = P3^7 設定 RD 控制線接腳為 P37 sbit ADCWR = P3^6 設定 WR 控制線接腳為 P36 void delay(void) 函數原型宣告 void delay10ms(int count) 函數原型宣告 void display(void) 函數原型宣告 void InitialLCD(void) 函數原型宣告 void WriteIns(char) 函數原型宣告 void WriteData(char) 函數原型宣告 void WriteString(charchar) 函數原型宣告 void CheckBusy(void) 函數原型宣告 void convert(void) 函數原型宣告 char MSG0[] = Motor Speed = 定義字串 MSG0 char MSG2[] = rpm 定義字串 MSG2 unsigned char MSG1[8]=0000000 定義字串 MSG1 unsigned long int value 讀取 ADC0804 數位資料 int sample = 1000 取樣率設定消除顯示值跳動 long int rpm

63

main() 主程式 InitialLCD() 初始化 LCD IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x01 設定計時器 0 工作於模式 1 TH0 = (65536-5000)256 設定計時器 0 初值 TL0 = (65536-5000)256 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 while(1) 等待中斷 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 while (--sample == 0) 取樣率減 1 sample = 1000 重設取樣率 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 void T0_int(void) interrupt 1 LCD 顯示動態掃描 display() 動態掃描顯示 TH0 = (65536-65535)256 重設計時初值 TL0 = (65536-65535)256

64

void InitialLCD(void) 設定 LCD 模組初始狀態 delay() 延遲函數 WriteIns(0x38) 設定 LCD 模組為 WriteIns(0x38) 2 行顯示 WriteIns(0x38) 8 位元介面 WriteIns(0x38) 5x7 點字型 WriteIns(0x08) 關閉顯示器 WriteIns(0x01) 清除 LCD 螢幕 WriteIns(0x0c) 令顯示器 ON但游標不顯示 WriteIns(0x06) 令 LCD 模組每接收到 1Byte 資料 AC 值自動加 1 void display() 掃描顯示 WriteIns(0x80) 設定 LCD 座標 WriteString(13MSG0) 將字串 MSG0 寫入 LCD 中 WriteIns(0xc0) 設定 LCD 座標 WriteString(8MSG1) 將字串 MSG1 寫入 LCD 中 WriteIns(0xc8) 設定 LCD 座標 WriteString(4MSG2) 將字串 MSG2 寫入 LCD 中 void convert(void) 換算轉速 long int freq freq = ((value)4000) - 16000 數位資料換成頻率公式 rpm = freq3 頻率換算轉速公式 MSG1[0] = (rpm1000000)+0x30 將結果存入字串 MSG1 中 MSG1[1] = ((rpm1000000)100000)+0x30 MSG1[2] = ((rpm100000)10000)+0x30 MSG1[3] = ((rpm10000)1000)+0x30 MSG1[4] = 0x2e MSG1[5] = ((rpm1000)100)+0x30 MSG1[6] = ((rpm100)10)+0x30 MSG1[7] = rpm10+0x30

65

void WriteIns(char instruction) 寫命令至 LCD 中 RS = 0 選擇指令暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = instruction 輸出命令至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteData(char i) 寫資料至 LCD 中 RS = 1 選擇資料暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = i 輸出資料至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteString(countMSG) 寫字串至 LCD 中 char count 字串長度 char MSG[] 字串資料 char i 定義位元組變數 for(i=0 iltcount i++) count 個位元組 WriteData(MSG[i]) 寫入一位元組的資料至 LCD 中 void CheckBusy(void) char i=0x80 檢查忙碌旗標 while(iamp0x80) 忙錄旗標 BF = 1 RS = 0 選擇指令暫存器 RW = 1 讀取 Enable = 1 致能 LCD i = P2 讀取 LCD 指令暫存器內的資料

66

Enable = 0 除能 LCD delay() 延遲函數 void delay() 延遲 5ms int i for(i=0 ilt250 i++)

  • 畢業專題封面pdf
  • File0004pdf
  • 最終版pdfpdf
Page 61: Based on Fuzzy Control Theorem and TPWM Method for DC ... · 使吾人想設計一模糊控制器來做為馬達轉速的閉迴路控制,以解決非線性系統的 問題。除此之外,flcs

52

圖 A-6 橋型驅動功率放大電路

圖 A-7 操作與控制面板

53

附錄 B PWM 與模糊控制之程式

include reg51h include stdioh sbit ADCRD = P3^1 設定 RD 控制線接腳為 P31 sbit ADCWR = P3^3 設定 WR 控制線接腳為 P33 sbit P2_0 = 0xA0 接腳定義 sbit P2_1 = 0xA1 接腳定義 sbit P3_0 = 0xB0 接腳定義 sbit P3_1 = 0xB1 接腳定義 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P3_6 = 0xB6 接腳定義 void KeyStatus(void) 函數原型宣告 void feedback(void) 函數原型宣告 void compute_grade(void) 函數原型宣告 void delay1ms(int count) 函數原型宣告 void convert() 函數原型宣告 void condition() 函數原型宣告 void CW(void) 函數原型宣告 int j i 對應 PWM 的寬度 unsigned int temp 所設計的計時器時間 int sample = 1000 取樣率設定消除顯示值跳動 long int value r1 讀取 ADC0804 數位資料 long int set n condition select long int r grade_reg[2] grade[15] error1 error2 long int a1 b1 I long int membership[5][3]membership1[3][3] 定義歸屬函數 long int membership2[3][3] = -10-50-5050510 long int error[2] int Rule[15][3] = 113213313 定義判斷規則庫 212223323 311232333 411241342 511251351

54

main() 主程式 j = PWM = 110 設定 PWM 初始值 IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x00 設定計時器 0 工作於模式 0 temp=8192-j4 設定計時器 0 初值 TH0 = temp 32 TL0 = temp 32 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 P3_4 = 1 P3_5 = 0 P3_6 = 0 ADCWR = 0 令 ADC0804 的 WR = 0 ADCWR = 1 令 ADC0804 的 WR = 1 while (1) KeyStatus() 檢查鍵值 void KeyStatus(void) 檢查鍵值並給對應的 PWM 值 char KeyScan(void) 按鍵掃描函數宣告 unsigned char KeyStatus unsigned char Key = 0 KeyStatus=KeyScan() 呼叫按鍵掃描函數 if (KeyStatus = 0) 已有按鍵輸入 Key = KeyStatus Key = 鍵值 if (Key == 0x01) 假如輸入為按鍵 1 i = 110 PWM 為 110us j = i P3_4 = 1 LED 亮第一顆〈表馬達停止〉 P3_5 = 0 P3_6 = 0

55

else if (Key == 0x02 ) 假如輸入為按鍵 2 i = 140 PWM 為 140us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x04 ) 假如輸入為按鍵 3 i = 180 PWM 為 180us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x08 ) 假如輸入為按鍵 4 i = 80 PWM 為 80us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 else if (Key == 0x10 ) 假如輸入為按鍵 5 i = 40 PWM 為 40us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 PWM = j delay1ms(10) 呼叫延遲函數 feedback() 模糊控制判斷

56

void To_int(void) interrupt 1 Timer0 中斷函數 if (P3_0 == 0) 假如 PWM 輸出為 Low P3_0 = 1 變更 PWM 輸出為 High temp=8192-j4 設定 High 的時間 else 若 PWM 輸出為 High P3_0 = 0 變更 PWM 輸出為 Low temp=8192-880+j4 設定 Low 的時間 TH0 = temp 32 Timer0 的計時時間 TL0 = temp 32 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 char KeyScan(void) 檢查鍵值 char KeyStatus 按鍵狀態 P0=0xff 設定 P0 為輸入模式 KeyStatus=~P0 讀取按鍵狀態 return(KeyStatus) 將鍵值送回程式 void feedback(void) 模糊判斷 void Fuzzycontroller() 函數原型宣告 void condition1() 函數原型宣告

57

void condition2() 函數原型宣告 error1 = ((value)40-160)03 輸入變數 1 delay10ms(10) 延遲 10ms error2 = ((value)40-160)03 輸入變數 2 if (key == 0x01 ) 當按鍵 1找出對應的歸屬函數 並做出模糊控制判斷

int membership[5][3]= -100-60-30-60-300-30030030603060100

int membership1[3][3]=-100-500-50050050100 Fuzzycontroller() condition() if (key == 0x02 ) 當按鍵 2找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

05010050100150100150200150200250200250300 int membership1[3][3]=07515075150225150225300 Fuzzycontroller() condition() else if (key == 0x04) 當按鍵 3找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

200320400300400500400500600500600700600700800 int membership1[3][3]=220370520370520670520670820 Fuzzycontroller() condition() else if (key == 0x08) 當按鍵 4找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

02550255010050100200100200300200300400 int membership1[3][3]=05010050100250100250400 Fuzzycontroller() condition()

58

else if (key == 0x10) 當按鍵 5找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

150250350250350450350450550450550650550650750 int membership1[3][3]=150300450300450600450600750 Fuzzycontroller() condition2() void Fuzzycontroller() 模糊控制判斷 void compute_grade() 函數原型宣告 void compute_grade1() 函數原型宣告 a1 = 0 b1 = 001 I = 0 for (n=0 nlt=14 n++) r = error1 set = Rule[n][0]-1 compute_grade() 計算輸入變數 1 與

模糊程度的歸屬函數 condition = 1 r = error2 set = Rule[n][1]-1 compute_grade1() 計算輸入變數 2 與 模糊程度的歸屬函數 grade[n] = MIN(grade_reg[0] grade_reg[1]) a1 = a1 + (grade[n]membership2[Rule[n][2]-1][1]) b1 = b1 + grade[n] I = a1 b1 得到模糊控制判斷的結果 void compute_grade() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership[set][0]) || (r gt membership[set][2])) 當輸入變數不在 歸屬函數內

59

grade_reg[condition] = 0 else if ((r gt membership[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership[set][2]-r) (membership[set][2] - membership[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership[set][0]) (membership[set][1] - membership[set][0]) void compute_grade1() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership1[set][0]) || (r gt membership1[set][2])) 當輸入變數不在 歸屬函數內 grade_reg[condition] = 0 else if ((r gt membership1[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership1[set][2]-r) (membership1[set][2]-membership1[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership1[set][0]) (membership1[set][1]-membership1[set][0])

60

void condition() P2_0 = 1 設定 P20 為輸入模式 P2_1 = 1 設定 P21 為輸入模式 if ( (P2_0 == 1) ampamp (P2_1 == 0)) 當馬達為正轉時 if ( I gt 0 ) 若模糊判斷結果為正 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 若模糊判斷結果為零 PWM = PWM + 0 PWM 寬度不變 if ( I lt 0 ) 若模糊控制結果小於零 PWM = PWM + 1 PWM 寬度加 1 else if ( (P2_0 == 0) ampamp (P2_1 == 1) ) 若馬達為反轉 if ( I lt 0 ) 模糊控制小於零 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 模糊控制等於零 PWM = PWM + 0 PWM 寬度不變 if ( I gt 0 ) 模糊控制大於零 PWM = PWM + 1 PWM 寬度加 1 CW() 判斷 PWM 寬度上下限

61

void CW() 判斷 PWM 寬度上下限 if ( PWM gt= 215 ) 若 PWM 寬度 gt= 最大寬度 j = 215 PWM 寬度維持於 215us if ( PWM lt= 5 ) 若 PWM 寬度 lt= 最小寬度 j = 5 PWM 寬度維持在 5us if ( PWM gt 5 ampamp PWM lt 215 ) PWM 寬度介於最大與最小間 j = PWM PWM 依模糊控制判斷結果增減 void delay1ms(int count) 延遲 1ms int x y for ( x = 0 x lt count x++ ) for ( y = 0 y lt 122 y++ ) void convert() 數位資料換算成馬達轉速 r1 = ((value)40)-160

62

附錄 C LCD 顯示之程式

includereg51h 含 8051 所有暫存器宣告 include mathh define RS P3_5 LCD 指令資料選擇控制 define RW P3_4 LCD 讀寫控制腳 define Enable P3_3 LCD 致能接腳 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P0_0 = 0x80 接腳定義 sbit P0_1 = 0x81 接腳定義 sbit P0_2 = 0x82 接腳定義 sbit P0_3 = 0x83 接腳定義 sbit P0_4 = 0x84 接腳定義 sbit P0_5 = 0x85 接腳定義 sbit P0_6 = 0x86 接腳定義 sbit ADCRD = P3^7 設定 RD 控制線接腳為 P37 sbit ADCWR = P3^6 設定 WR 控制線接腳為 P36 void delay(void) 函數原型宣告 void delay10ms(int count) 函數原型宣告 void display(void) 函數原型宣告 void InitialLCD(void) 函數原型宣告 void WriteIns(char) 函數原型宣告 void WriteData(char) 函數原型宣告 void WriteString(charchar) 函數原型宣告 void CheckBusy(void) 函數原型宣告 void convert(void) 函數原型宣告 char MSG0[] = Motor Speed = 定義字串 MSG0 char MSG2[] = rpm 定義字串 MSG2 unsigned char MSG1[8]=0000000 定義字串 MSG1 unsigned long int value 讀取 ADC0804 數位資料 int sample = 1000 取樣率設定消除顯示值跳動 long int rpm

63

main() 主程式 InitialLCD() 初始化 LCD IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x01 設定計時器 0 工作於模式 1 TH0 = (65536-5000)256 設定計時器 0 初值 TL0 = (65536-5000)256 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 while(1) 等待中斷 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 while (--sample == 0) 取樣率減 1 sample = 1000 重設取樣率 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 void T0_int(void) interrupt 1 LCD 顯示動態掃描 display() 動態掃描顯示 TH0 = (65536-65535)256 重設計時初值 TL0 = (65536-65535)256

64

void InitialLCD(void) 設定 LCD 模組初始狀態 delay() 延遲函數 WriteIns(0x38) 設定 LCD 模組為 WriteIns(0x38) 2 行顯示 WriteIns(0x38) 8 位元介面 WriteIns(0x38) 5x7 點字型 WriteIns(0x08) 關閉顯示器 WriteIns(0x01) 清除 LCD 螢幕 WriteIns(0x0c) 令顯示器 ON但游標不顯示 WriteIns(0x06) 令 LCD 模組每接收到 1Byte 資料 AC 值自動加 1 void display() 掃描顯示 WriteIns(0x80) 設定 LCD 座標 WriteString(13MSG0) 將字串 MSG0 寫入 LCD 中 WriteIns(0xc0) 設定 LCD 座標 WriteString(8MSG1) 將字串 MSG1 寫入 LCD 中 WriteIns(0xc8) 設定 LCD 座標 WriteString(4MSG2) 將字串 MSG2 寫入 LCD 中 void convert(void) 換算轉速 long int freq freq = ((value)4000) - 16000 數位資料換成頻率公式 rpm = freq3 頻率換算轉速公式 MSG1[0] = (rpm1000000)+0x30 將結果存入字串 MSG1 中 MSG1[1] = ((rpm1000000)100000)+0x30 MSG1[2] = ((rpm100000)10000)+0x30 MSG1[3] = ((rpm10000)1000)+0x30 MSG1[4] = 0x2e MSG1[5] = ((rpm1000)100)+0x30 MSG1[6] = ((rpm100)10)+0x30 MSG1[7] = rpm10+0x30

65

void WriteIns(char instruction) 寫命令至 LCD 中 RS = 0 選擇指令暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = instruction 輸出命令至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteData(char i) 寫資料至 LCD 中 RS = 1 選擇資料暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = i 輸出資料至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteString(countMSG) 寫字串至 LCD 中 char count 字串長度 char MSG[] 字串資料 char i 定義位元組變數 for(i=0 iltcount i++) count 個位元組 WriteData(MSG[i]) 寫入一位元組的資料至 LCD 中 void CheckBusy(void) char i=0x80 檢查忙碌旗標 while(iamp0x80) 忙錄旗標 BF = 1 RS = 0 選擇指令暫存器 RW = 1 讀取 Enable = 1 致能 LCD i = P2 讀取 LCD 指令暫存器內的資料

66

Enable = 0 除能 LCD delay() 延遲函數 void delay() 延遲 5ms int i for(i=0 ilt250 i++)

  • 畢業專題封面pdf
  • File0004pdf
  • 最終版pdfpdf
Page 62: Based on Fuzzy Control Theorem and TPWM Method for DC ... · 使吾人想設計一模糊控制器來做為馬達轉速的閉迴路控制,以解決非線性系統的 問題。除此之外,flcs

53

附錄 B PWM 與模糊控制之程式

include reg51h include stdioh sbit ADCRD = P3^1 設定 RD 控制線接腳為 P31 sbit ADCWR = P3^3 設定 WR 控制線接腳為 P33 sbit P2_0 = 0xA0 接腳定義 sbit P2_1 = 0xA1 接腳定義 sbit P3_0 = 0xB0 接腳定義 sbit P3_1 = 0xB1 接腳定義 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P3_6 = 0xB6 接腳定義 void KeyStatus(void) 函數原型宣告 void feedback(void) 函數原型宣告 void compute_grade(void) 函數原型宣告 void delay1ms(int count) 函數原型宣告 void convert() 函數原型宣告 void condition() 函數原型宣告 void CW(void) 函數原型宣告 int j i 對應 PWM 的寬度 unsigned int temp 所設計的計時器時間 int sample = 1000 取樣率設定消除顯示值跳動 long int value r1 讀取 ADC0804 數位資料 long int set n condition select long int r grade_reg[2] grade[15] error1 error2 long int a1 b1 I long int membership[5][3]membership1[3][3] 定義歸屬函數 long int membership2[3][3] = -10-50-5050510 long int error[2] int Rule[15][3] = 113213313 定義判斷規則庫 212223323 311232333 411241342 511251351

54

main() 主程式 j = PWM = 110 設定 PWM 初始值 IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x00 設定計時器 0 工作於模式 0 temp=8192-j4 設定計時器 0 初值 TH0 = temp 32 TL0 = temp 32 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 P3_4 = 1 P3_5 = 0 P3_6 = 0 ADCWR = 0 令 ADC0804 的 WR = 0 ADCWR = 1 令 ADC0804 的 WR = 1 while (1) KeyStatus() 檢查鍵值 void KeyStatus(void) 檢查鍵值並給對應的 PWM 值 char KeyScan(void) 按鍵掃描函數宣告 unsigned char KeyStatus unsigned char Key = 0 KeyStatus=KeyScan() 呼叫按鍵掃描函數 if (KeyStatus = 0) 已有按鍵輸入 Key = KeyStatus Key = 鍵值 if (Key == 0x01) 假如輸入為按鍵 1 i = 110 PWM 為 110us j = i P3_4 = 1 LED 亮第一顆〈表馬達停止〉 P3_5 = 0 P3_6 = 0

55

else if (Key == 0x02 ) 假如輸入為按鍵 2 i = 140 PWM 為 140us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x04 ) 假如輸入為按鍵 3 i = 180 PWM 為 180us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x08 ) 假如輸入為按鍵 4 i = 80 PWM 為 80us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 else if (Key == 0x10 ) 假如輸入為按鍵 5 i = 40 PWM 為 40us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 PWM = j delay1ms(10) 呼叫延遲函數 feedback() 模糊控制判斷

56

void To_int(void) interrupt 1 Timer0 中斷函數 if (P3_0 == 0) 假如 PWM 輸出為 Low P3_0 = 1 變更 PWM 輸出為 High temp=8192-j4 設定 High 的時間 else 若 PWM 輸出為 High P3_0 = 0 變更 PWM 輸出為 Low temp=8192-880+j4 設定 Low 的時間 TH0 = temp 32 Timer0 的計時時間 TL0 = temp 32 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 char KeyScan(void) 檢查鍵值 char KeyStatus 按鍵狀態 P0=0xff 設定 P0 為輸入模式 KeyStatus=~P0 讀取按鍵狀態 return(KeyStatus) 將鍵值送回程式 void feedback(void) 模糊判斷 void Fuzzycontroller() 函數原型宣告 void condition1() 函數原型宣告

57

void condition2() 函數原型宣告 error1 = ((value)40-160)03 輸入變數 1 delay10ms(10) 延遲 10ms error2 = ((value)40-160)03 輸入變數 2 if (key == 0x01 ) 當按鍵 1找出對應的歸屬函數 並做出模糊控制判斷

int membership[5][3]= -100-60-30-60-300-30030030603060100

int membership1[3][3]=-100-500-50050050100 Fuzzycontroller() condition() if (key == 0x02 ) 當按鍵 2找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

05010050100150100150200150200250200250300 int membership1[3][3]=07515075150225150225300 Fuzzycontroller() condition() else if (key == 0x04) 當按鍵 3找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

200320400300400500400500600500600700600700800 int membership1[3][3]=220370520370520670520670820 Fuzzycontroller() condition() else if (key == 0x08) 當按鍵 4找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

02550255010050100200100200300200300400 int membership1[3][3]=05010050100250100250400 Fuzzycontroller() condition()

58

else if (key == 0x10) 當按鍵 5找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

150250350250350450350450550450550650550650750 int membership1[3][3]=150300450300450600450600750 Fuzzycontroller() condition2() void Fuzzycontroller() 模糊控制判斷 void compute_grade() 函數原型宣告 void compute_grade1() 函數原型宣告 a1 = 0 b1 = 001 I = 0 for (n=0 nlt=14 n++) r = error1 set = Rule[n][0]-1 compute_grade() 計算輸入變數 1 與

模糊程度的歸屬函數 condition = 1 r = error2 set = Rule[n][1]-1 compute_grade1() 計算輸入變數 2 與 模糊程度的歸屬函數 grade[n] = MIN(grade_reg[0] grade_reg[1]) a1 = a1 + (grade[n]membership2[Rule[n][2]-1][1]) b1 = b1 + grade[n] I = a1 b1 得到模糊控制判斷的結果 void compute_grade() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership[set][0]) || (r gt membership[set][2])) 當輸入變數不在 歸屬函數內

59

grade_reg[condition] = 0 else if ((r gt membership[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership[set][2]-r) (membership[set][2] - membership[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership[set][0]) (membership[set][1] - membership[set][0]) void compute_grade1() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership1[set][0]) || (r gt membership1[set][2])) 當輸入變數不在 歸屬函數內 grade_reg[condition] = 0 else if ((r gt membership1[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership1[set][2]-r) (membership1[set][2]-membership1[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership1[set][0]) (membership1[set][1]-membership1[set][0])

60

void condition() P2_0 = 1 設定 P20 為輸入模式 P2_1 = 1 設定 P21 為輸入模式 if ( (P2_0 == 1) ampamp (P2_1 == 0)) 當馬達為正轉時 if ( I gt 0 ) 若模糊判斷結果為正 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 若模糊判斷結果為零 PWM = PWM + 0 PWM 寬度不變 if ( I lt 0 ) 若模糊控制結果小於零 PWM = PWM + 1 PWM 寬度加 1 else if ( (P2_0 == 0) ampamp (P2_1 == 1) ) 若馬達為反轉 if ( I lt 0 ) 模糊控制小於零 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 模糊控制等於零 PWM = PWM + 0 PWM 寬度不變 if ( I gt 0 ) 模糊控制大於零 PWM = PWM + 1 PWM 寬度加 1 CW() 判斷 PWM 寬度上下限

61

void CW() 判斷 PWM 寬度上下限 if ( PWM gt= 215 ) 若 PWM 寬度 gt= 最大寬度 j = 215 PWM 寬度維持於 215us if ( PWM lt= 5 ) 若 PWM 寬度 lt= 最小寬度 j = 5 PWM 寬度維持在 5us if ( PWM gt 5 ampamp PWM lt 215 ) PWM 寬度介於最大與最小間 j = PWM PWM 依模糊控制判斷結果增減 void delay1ms(int count) 延遲 1ms int x y for ( x = 0 x lt count x++ ) for ( y = 0 y lt 122 y++ ) void convert() 數位資料換算成馬達轉速 r1 = ((value)40)-160

62

附錄 C LCD 顯示之程式

includereg51h 含 8051 所有暫存器宣告 include mathh define RS P3_5 LCD 指令資料選擇控制 define RW P3_4 LCD 讀寫控制腳 define Enable P3_3 LCD 致能接腳 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P0_0 = 0x80 接腳定義 sbit P0_1 = 0x81 接腳定義 sbit P0_2 = 0x82 接腳定義 sbit P0_3 = 0x83 接腳定義 sbit P0_4 = 0x84 接腳定義 sbit P0_5 = 0x85 接腳定義 sbit P0_6 = 0x86 接腳定義 sbit ADCRD = P3^7 設定 RD 控制線接腳為 P37 sbit ADCWR = P3^6 設定 WR 控制線接腳為 P36 void delay(void) 函數原型宣告 void delay10ms(int count) 函數原型宣告 void display(void) 函數原型宣告 void InitialLCD(void) 函數原型宣告 void WriteIns(char) 函數原型宣告 void WriteData(char) 函數原型宣告 void WriteString(charchar) 函數原型宣告 void CheckBusy(void) 函數原型宣告 void convert(void) 函數原型宣告 char MSG0[] = Motor Speed = 定義字串 MSG0 char MSG2[] = rpm 定義字串 MSG2 unsigned char MSG1[8]=0000000 定義字串 MSG1 unsigned long int value 讀取 ADC0804 數位資料 int sample = 1000 取樣率設定消除顯示值跳動 long int rpm

63

main() 主程式 InitialLCD() 初始化 LCD IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x01 設定計時器 0 工作於模式 1 TH0 = (65536-5000)256 設定計時器 0 初值 TL0 = (65536-5000)256 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 while(1) 等待中斷 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 while (--sample == 0) 取樣率減 1 sample = 1000 重設取樣率 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 void T0_int(void) interrupt 1 LCD 顯示動態掃描 display() 動態掃描顯示 TH0 = (65536-65535)256 重設計時初值 TL0 = (65536-65535)256

64

void InitialLCD(void) 設定 LCD 模組初始狀態 delay() 延遲函數 WriteIns(0x38) 設定 LCD 模組為 WriteIns(0x38) 2 行顯示 WriteIns(0x38) 8 位元介面 WriteIns(0x38) 5x7 點字型 WriteIns(0x08) 關閉顯示器 WriteIns(0x01) 清除 LCD 螢幕 WriteIns(0x0c) 令顯示器 ON但游標不顯示 WriteIns(0x06) 令 LCD 模組每接收到 1Byte 資料 AC 值自動加 1 void display() 掃描顯示 WriteIns(0x80) 設定 LCD 座標 WriteString(13MSG0) 將字串 MSG0 寫入 LCD 中 WriteIns(0xc0) 設定 LCD 座標 WriteString(8MSG1) 將字串 MSG1 寫入 LCD 中 WriteIns(0xc8) 設定 LCD 座標 WriteString(4MSG2) 將字串 MSG2 寫入 LCD 中 void convert(void) 換算轉速 long int freq freq = ((value)4000) - 16000 數位資料換成頻率公式 rpm = freq3 頻率換算轉速公式 MSG1[0] = (rpm1000000)+0x30 將結果存入字串 MSG1 中 MSG1[1] = ((rpm1000000)100000)+0x30 MSG1[2] = ((rpm100000)10000)+0x30 MSG1[3] = ((rpm10000)1000)+0x30 MSG1[4] = 0x2e MSG1[5] = ((rpm1000)100)+0x30 MSG1[6] = ((rpm100)10)+0x30 MSG1[7] = rpm10+0x30

65

void WriteIns(char instruction) 寫命令至 LCD 中 RS = 0 選擇指令暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = instruction 輸出命令至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteData(char i) 寫資料至 LCD 中 RS = 1 選擇資料暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = i 輸出資料至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteString(countMSG) 寫字串至 LCD 中 char count 字串長度 char MSG[] 字串資料 char i 定義位元組變數 for(i=0 iltcount i++) count 個位元組 WriteData(MSG[i]) 寫入一位元組的資料至 LCD 中 void CheckBusy(void) char i=0x80 檢查忙碌旗標 while(iamp0x80) 忙錄旗標 BF = 1 RS = 0 選擇指令暫存器 RW = 1 讀取 Enable = 1 致能 LCD i = P2 讀取 LCD 指令暫存器內的資料

66

Enable = 0 除能 LCD delay() 延遲函數 void delay() 延遲 5ms int i for(i=0 ilt250 i++)

  • 畢業專題封面pdf
  • File0004pdf
  • 最終版pdfpdf
Page 63: Based on Fuzzy Control Theorem and TPWM Method for DC ... · 使吾人想設計一模糊控制器來做為馬達轉速的閉迴路控制,以解決非線性系統的 問題。除此之外,flcs

54

main() 主程式 j = PWM = 110 設定 PWM 初始值 IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x00 設定計時器 0 工作於模式 0 temp=8192-j4 設定計時器 0 初值 TH0 = temp 32 TL0 = temp 32 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 P3_4 = 1 P3_5 = 0 P3_6 = 0 ADCWR = 0 令 ADC0804 的 WR = 0 ADCWR = 1 令 ADC0804 的 WR = 1 while (1) KeyStatus() 檢查鍵值 void KeyStatus(void) 檢查鍵值並給對應的 PWM 值 char KeyScan(void) 按鍵掃描函數宣告 unsigned char KeyStatus unsigned char Key = 0 KeyStatus=KeyScan() 呼叫按鍵掃描函數 if (KeyStatus = 0) 已有按鍵輸入 Key = KeyStatus Key = 鍵值 if (Key == 0x01) 假如輸入為按鍵 1 i = 110 PWM 為 110us j = i P3_4 = 1 LED 亮第一顆〈表馬達停止〉 P3_5 = 0 P3_6 = 0

55

else if (Key == 0x02 ) 假如輸入為按鍵 2 i = 140 PWM 為 140us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x04 ) 假如輸入為按鍵 3 i = 180 PWM 為 180us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x08 ) 假如輸入為按鍵 4 i = 80 PWM 為 80us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 else if (Key == 0x10 ) 假如輸入為按鍵 5 i = 40 PWM 為 40us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 PWM = j delay1ms(10) 呼叫延遲函數 feedback() 模糊控制判斷

56

void To_int(void) interrupt 1 Timer0 中斷函數 if (P3_0 == 0) 假如 PWM 輸出為 Low P3_0 = 1 變更 PWM 輸出為 High temp=8192-j4 設定 High 的時間 else 若 PWM 輸出為 High P3_0 = 0 變更 PWM 輸出為 Low temp=8192-880+j4 設定 Low 的時間 TH0 = temp 32 Timer0 的計時時間 TL0 = temp 32 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 char KeyScan(void) 檢查鍵值 char KeyStatus 按鍵狀態 P0=0xff 設定 P0 為輸入模式 KeyStatus=~P0 讀取按鍵狀態 return(KeyStatus) 將鍵值送回程式 void feedback(void) 模糊判斷 void Fuzzycontroller() 函數原型宣告 void condition1() 函數原型宣告

57

void condition2() 函數原型宣告 error1 = ((value)40-160)03 輸入變數 1 delay10ms(10) 延遲 10ms error2 = ((value)40-160)03 輸入變數 2 if (key == 0x01 ) 當按鍵 1找出對應的歸屬函數 並做出模糊控制判斷

int membership[5][3]= -100-60-30-60-300-30030030603060100

int membership1[3][3]=-100-500-50050050100 Fuzzycontroller() condition() if (key == 0x02 ) 當按鍵 2找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

05010050100150100150200150200250200250300 int membership1[3][3]=07515075150225150225300 Fuzzycontroller() condition() else if (key == 0x04) 當按鍵 3找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

200320400300400500400500600500600700600700800 int membership1[3][3]=220370520370520670520670820 Fuzzycontroller() condition() else if (key == 0x08) 當按鍵 4找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

02550255010050100200100200300200300400 int membership1[3][3]=05010050100250100250400 Fuzzycontroller() condition()

58

else if (key == 0x10) 當按鍵 5找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

150250350250350450350450550450550650550650750 int membership1[3][3]=150300450300450600450600750 Fuzzycontroller() condition2() void Fuzzycontroller() 模糊控制判斷 void compute_grade() 函數原型宣告 void compute_grade1() 函數原型宣告 a1 = 0 b1 = 001 I = 0 for (n=0 nlt=14 n++) r = error1 set = Rule[n][0]-1 compute_grade() 計算輸入變數 1 與

模糊程度的歸屬函數 condition = 1 r = error2 set = Rule[n][1]-1 compute_grade1() 計算輸入變數 2 與 模糊程度的歸屬函數 grade[n] = MIN(grade_reg[0] grade_reg[1]) a1 = a1 + (grade[n]membership2[Rule[n][2]-1][1]) b1 = b1 + grade[n] I = a1 b1 得到模糊控制判斷的結果 void compute_grade() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership[set][0]) || (r gt membership[set][2])) 當輸入變數不在 歸屬函數內

59

grade_reg[condition] = 0 else if ((r gt membership[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership[set][2]-r) (membership[set][2] - membership[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership[set][0]) (membership[set][1] - membership[set][0]) void compute_grade1() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership1[set][0]) || (r gt membership1[set][2])) 當輸入變數不在 歸屬函數內 grade_reg[condition] = 0 else if ((r gt membership1[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership1[set][2]-r) (membership1[set][2]-membership1[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership1[set][0]) (membership1[set][1]-membership1[set][0])

60

void condition() P2_0 = 1 設定 P20 為輸入模式 P2_1 = 1 設定 P21 為輸入模式 if ( (P2_0 == 1) ampamp (P2_1 == 0)) 當馬達為正轉時 if ( I gt 0 ) 若模糊判斷結果為正 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 若模糊判斷結果為零 PWM = PWM + 0 PWM 寬度不變 if ( I lt 0 ) 若模糊控制結果小於零 PWM = PWM + 1 PWM 寬度加 1 else if ( (P2_0 == 0) ampamp (P2_1 == 1) ) 若馬達為反轉 if ( I lt 0 ) 模糊控制小於零 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 模糊控制等於零 PWM = PWM + 0 PWM 寬度不變 if ( I gt 0 ) 模糊控制大於零 PWM = PWM + 1 PWM 寬度加 1 CW() 判斷 PWM 寬度上下限

61

void CW() 判斷 PWM 寬度上下限 if ( PWM gt= 215 ) 若 PWM 寬度 gt= 最大寬度 j = 215 PWM 寬度維持於 215us if ( PWM lt= 5 ) 若 PWM 寬度 lt= 最小寬度 j = 5 PWM 寬度維持在 5us if ( PWM gt 5 ampamp PWM lt 215 ) PWM 寬度介於最大與最小間 j = PWM PWM 依模糊控制判斷結果增減 void delay1ms(int count) 延遲 1ms int x y for ( x = 0 x lt count x++ ) for ( y = 0 y lt 122 y++ ) void convert() 數位資料換算成馬達轉速 r1 = ((value)40)-160

62

附錄 C LCD 顯示之程式

includereg51h 含 8051 所有暫存器宣告 include mathh define RS P3_5 LCD 指令資料選擇控制 define RW P3_4 LCD 讀寫控制腳 define Enable P3_3 LCD 致能接腳 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P0_0 = 0x80 接腳定義 sbit P0_1 = 0x81 接腳定義 sbit P0_2 = 0x82 接腳定義 sbit P0_3 = 0x83 接腳定義 sbit P0_4 = 0x84 接腳定義 sbit P0_5 = 0x85 接腳定義 sbit P0_6 = 0x86 接腳定義 sbit ADCRD = P3^7 設定 RD 控制線接腳為 P37 sbit ADCWR = P3^6 設定 WR 控制線接腳為 P36 void delay(void) 函數原型宣告 void delay10ms(int count) 函數原型宣告 void display(void) 函數原型宣告 void InitialLCD(void) 函數原型宣告 void WriteIns(char) 函數原型宣告 void WriteData(char) 函數原型宣告 void WriteString(charchar) 函數原型宣告 void CheckBusy(void) 函數原型宣告 void convert(void) 函數原型宣告 char MSG0[] = Motor Speed = 定義字串 MSG0 char MSG2[] = rpm 定義字串 MSG2 unsigned char MSG1[8]=0000000 定義字串 MSG1 unsigned long int value 讀取 ADC0804 數位資料 int sample = 1000 取樣率設定消除顯示值跳動 long int rpm

63

main() 主程式 InitialLCD() 初始化 LCD IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x01 設定計時器 0 工作於模式 1 TH0 = (65536-5000)256 設定計時器 0 初值 TL0 = (65536-5000)256 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 while(1) 等待中斷 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 while (--sample == 0) 取樣率減 1 sample = 1000 重設取樣率 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 void T0_int(void) interrupt 1 LCD 顯示動態掃描 display() 動態掃描顯示 TH0 = (65536-65535)256 重設計時初值 TL0 = (65536-65535)256

64

void InitialLCD(void) 設定 LCD 模組初始狀態 delay() 延遲函數 WriteIns(0x38) 設定 LCD 模組為 WriteIns(0x38) 2 行顯示 WriteIns(0x38) 8 位元介面 WriteIns(0x38) 5x7 點字型 WriteIns(0x08) 關閉顯示器 WriteIns(0x01) 清除 LCD 螢幕 WriteIns(0x0c) 令顯示器 ON但游標不顯示 WriteIns(0x06) 令 LCD 模組每接收到 1Byte 資料 AC 值自動加 1 void display() 掃描顯示 WriteIns(0x80) 設定 LCD 座標 WriteString(13MSG0) 將字串 MSG0 寫入 LCD 中 WriteIns(0xc0) 設定 LCD 座標 WriteString(8MSG1) 將字串 MSG1 寫入 LCD 中 WriteIns(0xc8) 設定 LCD 座標 WriteString(4MSG2) 將字串 MSG2 寫入 LCD 中 void convert(void) 換算轉速 long int freq freq = ((value)4000) - 16000 數位資料換成頻率公式 rpm = freq3 頻率換算轉速公式 MSG1[0] = (rpm1000000)+0x30 將結果存入字串 MSG1 中 MSG1[1] = ((rpm1000000)100000)+0x30 MSG1[2] = ((rpm100000)10000)+0x30 MSG1[3] = ((rpm10000)1000)+0x30 MSG1[4] = 0x2e MSG1[5] = ((rpm1000)100)+0x30 MSG1[6] = ((rpm100)10)+0x30 MSG1[7] = rpm10+0x30

65

void WriteIns(char instruction) 寫命令至 LCD 中 RS = 0 選擇指令暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = instruction 輸出命令至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteData(char i) 寫資料至 LCD 中 RS = 1 選擇資料暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = i 輸出資料至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteString(countMSG) 寫字串至 LCD 中 char count 字串長度 char MSG[] 字串資料 char i 定義位元組變數 for(i=0 iltcount i++) count 個位元組 WriteData(MSG[i]) 寫入一位元組的資料至 LCD 中 void CheckBusy(void) char i=0x80 檢查忙碌旗標 while(iamp0x80) 忙錄旗標 BF = 1 RS = 0 選擇指令暫存器 RW = 1 讀取 Enable = 1 致能 LCD i = P2 讀取 LCD 指令暫存器內的資料

66

Enable = 0 除能 LCD delay() 延遲函數 void delay() 延遲 5ms int i for(i=0 ilt250 i++)

  • 畢業專題封面pdf
  • File0004pdf
  • 最終版pdfpdf
Page 64: Based on Fuzzy Control Theorem and TPWM Method for DC ... · 使吾人想設計一模糊控制器來做為馬達轉速的閉迴路控制,以解決非線性系統的 問題。除此之外,flcs

55

else if (Key == 0x02 ) 假如輸入為按鍵 2 i = 140 PWM 為 140us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x04 ) 假如輸入為按鍵 3 i = 180 PWM 為 180us j = i P3_4 = 0 LED 亮第二顆〈表馬達正轉〉 P3_5 = 1 P3_6 = 0 else if (Key == 0x08 ) 假如輸入為按鍵 4 i = 80 PWM 為 80us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 else if (Key == 0x10 ) 假如輸入為按鍵 5 i = 40 PWM 為 40us j = i P3_4 = 0 LED 亮第三顆〈表馬達反轉〉 P3_5 = 0 P3_6 = 1 PWM = j delay1ms(10) 呼叫延遲函數 feedback() 模糊控制判斷

56

void To_int(void) interrupt 1 Timer0 中斷函數 if (P3_0 == 0) 假如 PWM 輸出為 Low P3_0 = 1 變更 PWM 輸出為 High temp=8192-j4 設定 High 的時間 else 若 PWM 輸出為 High P3_0 = 0 變更 PWM 輸出為 Low temp=8192-880+j4 設定 Low 的時間 TH0 = temp 32 Timer0 的計時時間 TL0 = temp 32 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 char KeyScan(void) 檢查鍵值 char KeyStatus 按鍵狀態 P0=0xff 設定 P0 為輸入模式 KeyStatus=~P0 讀取按鍵狀態 return(KeyStatus) 將鍵值送回程式 void feedback(void) 模糊判斷 void Fuzzycontroller() 函數原型宣告 void condition1() 函數原型宣告

57

void condition2() 函數原型宣告 error1 = ((value)40-160)03 輸入變數 1 delay10ms(10) 延遲 10ms error2 = ((value)40-160)03 輸入變數 2 if (key == 0x01 ) 當按鍵 1找出對應的歸屬函數 並做出模糊控制判斷

int membership[5][3]= -100-60-30-60-300-30030030603060100

int membership1[3][3]=-100-500-50050050100 Fuzzycontroller() condition() if (key == 0x02 ) 當按鍵 2找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

05010050100150100150200150200250200250300 int membership1[3][3]=07515075150225150225300 Fuzzycontroller() condition() else if (key == 0x04) 當按鍵 3找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

200320400300400500400500600500600700600700800 int membership1[3][3]=220370520370520670520670820 Fuzzycontroller() condition() else if (key == 0x08) 當按鍵 4找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

02550255010050100200100200300200300400 int membership1[3][3]=05010050100250100250400 Fuzzycontroller() condition()

58

else if (key == 0x10) 當按鍵 5找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

150250350250350450350450550450550650550650750 int membership1[3][3]=150300450300450600450600750 Fuzzycontroller() condition2() void Fuzzycontroller() 模糊控制判斷 void compute_grade() 函數原型宣告 void compute_grade1() 函數原型宣告 a1 = 0 b1 = 001 I = 0 for (n=0 nlt=14 n++) r = error1 set = Rule[n][0]-1 compute_grade() 計算輸入變數 1 與

模糊程度的歸屬函數 condition = 1 r = error2 set = Rule[n][1]-1 compute_grade1() 計算輸入變數 2 與 模糊程度的歸屬函數 grade[n] = MIN(grade_reg[0] grade_reg[1]) a1 = a1 + (grade[n]membership2[Rule[n][2]-1][1]) b1 = b1 + grade[n] I = a1 b1 得到模糊控制判斷的結果 void compute_grade() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership[set][0]) || (r gt membership[set][2])) 當輸入變數不在 歸屬函數內

59

grade_reg[condition] = 0 else if ((r gt membership[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership[set][2]-r) (membership[set][2] - membership[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership[set][0]) (membership[set][1] - membership[set][0]) void compute_grade1() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership1[set][0]) || (r gt membership1[set][2])) 當輸入變數不在 歸屬函數內 grade_reg[condition] = 0 else if ((r gt membership1[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership1[set][2]-r) (membership1[set][2]-membership1[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership1[set][0]) (membership1[set][1]-membership1[set][0])

60

void condition() P2_0 = 1 設定 P20 為輸入模式 P2_1 = 1 設定 P21 為輸入模式 if ( (P2_0 == 1) ampamp (P2_1 == 0)) 當馬達為正轉時 if ( I gt 0 ) 若模糊判斷結果為正 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 若模糊判斷結果為零 PWM = PWM + 0 PWM 寬度不變 if ( I lt 0 ) 若模糊控制結果小於零 PWM = PWM + 1 PWM 寬度加 1 else if ( (P2_0 == 0) ampamp (P2_1 == 1) ) 若馬達為反轉 if ( I lt 0 ) 模糊控制小於零 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 模糊控制等於零 PWM = PWM + 0 PWM 寬度不變 if ( I gt 0 ) 模糊控制大於零 PWM = PWM + 1 PWM 寬度加 1 CW() 判斷 PWM 寬度上下限

61

void CW() 判斷 PWM 寬度上下限 if ( PWM gt= 215 ) 若 PWM 寬度 gt= 最大寬度 j = 215 PWM 寬度維持於 215us if ( PWM lt= 5 ) 若 PWM 寬度 lt= 最小寬度 j = 5 PWM 寬度維持在 5us if ( PWM gt 5 ampamp PWM lt 215 ) PWM 寬度介於最大與最小間 j = PWM PWM 依模糊控制判斷結果增減 void delay1ms(int count) 延遲 1ms int x y for ( x = 0 x lt count x++ ) for ( y = 0 y lt 122 y++ ) void convert() 數位資料換算成馬達轉速 r1 = ((value)40)-160

62

附錄 C LCD 顯示之程式

includereg51h 含 8051 所有暫存器宣告 include mathh define RS P3_5 LCD 指令資料選擇控制 define RW P3_4 LCD 讀寫控制腳 define Enable P3_3 LCD 致能接腳 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P0_0 = 0x80 接腳定義 sbit P0_1 = 0x81 接腳定義 sbit P0_2 = 0x82 接腳定義 sbit P0_3 = 0x83 接腳定義 sbit P0_4 = 0x84 接腳定義 sbit P0_5 = 0x85 接腳定義 sbit P0_6 = 0x86 接腳定義 sbit ADCRD = P3^7 設定 RD 控制線接腳為 P37 sbit ADCWR = P3^6 設定 WR 控制線接腳為 P36 void delay(void) 函數原型宣告 void delay10ms(int count) 函數原型宣告 void display(void) 函數原型宣告 void InitialLCD(void) 函數原型宣告 void WriteIns(char) 函數原型宣告 void WriteData(char) 函數原型宣告 void WriteString(charchar) 函數原型宣告 void CheckBusy(void) 函數原型宣告 void convert(void) 函數原型宣告 char MSG0[] = Motor Speed = 定義字串 MSG0 char MSG2[] = rpm 定義字串 MSG2 unsigned char MSG1[8]=0000000 定義字串 MSG1 unsigned long int value 讀取 ADC0804 數位資料 int sample = 1000 取樣率設定消除顯示值跳動 long int rpm

63

main() 主程式 InitialLCD() 初始化 LCD IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x01 設定計時器 0 工作於模式 1 TH0 = (65536-5000)256 設定計時器 0 初值 TL0 = (65536-5000)256 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 while(1) 等待中斷 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 while (--sample == 0) 取樣率減 1 sample = 1000 重設取樣率 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 void T0_int(void) interrupt 1 LCD 顯示動態掃描 display() 動態掃描顯示 TH0 = (65536-65535)256 重設計時初值 TL0 = (65536-65535)256

64

void InitialLCD(void) 設定 LCD 模組初始狀態 delay() 延遲函數 WriteIns(0x38) 設定 LCD 模組為 WriteIns(0x38) 2 行顯示 WriteIns(0x38) 8 位元介面 WriteIns(0x38) 5x7 點字型 WriteIns(0x08) 關閉顯示器 WriteIns(0x01) 清除 LCD 螢幕 WriteIns(0x0c) 令顯示器 ON但游標不顯示 WriteIns(0x06) 令 LCD 模組每接收到 1Byte 資料 AC 值自動加 1 void display() 掃描顯示 WriteIns(0x80) 設定 LCD 座標 WriteString(13MSG0) 將字串 MSG0 寫入 LCD 中 WriteIns(0xc0) 設定 LCD 座標 WriteString(8MSG1) 將字串 MSG1 寫入 LCD 中 WriteIns(0xc8) 設定 LCD 座標 WriteString(4MSG2) 將字串 MSG2 寫入 LCD 中 void convert(void) 換算轉速 long int freq freq = ((value)4000) - 16000 數位資料換成頻率公式 rpm = freq3 頻率換算轉速公式 MSG1[0] = (rpm1000000)+0x30 將結果存入字串 MSG1 中 MSG1[1] = ((rpm1000000)100000)+0x30 MSG1[2] = ((rpm100000)10000)+0x30 MSG1[3] = ((rpm10000)1000)+0x30 MSG1[4] = 0x2e MSG1[5] = ((rpm1000)100)+0x30 MSG1[6] = ((rpm100)10)+0x30 MSG1[7] = rpm10+0x30

65

void WriteIns(char instruction) 寫命令至 LCD 中 RS = 0 選擇指令暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = instruction 輸出命令至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteData(char i) 寫資料至 LCD 中 RS = 1 選擇資料暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = i 輸出資料至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteString(countMSG) 寫字串至 LCD 中 char count 字串長度 char MSG[] 字串資料 char i 定義位元組變數 for(i=0 iltcount i++) count 個位元組 WriteData(MSG[i]) 寫入一位元組的資料至 LCD 中 void CheckBusy(void) char i=0x80 檢查忙碌旗標 while(iamp0x80) 忙錄旗標 BF = 1 RS = 0 選擇指令暫存器 RW = 1 讀取 Enable = 1 致能 LCD i = P2 讀取 LCD 指令暫存器內的資料

66

Enable = 0 除能 LCD delay() 延遲函數 void delay() 延遲 5ms int i for(i=0 ilt250 i++)

  • 畢業專題封面pdf
  • File0004pdf
  • 最終版pdfpdf
Page 65: Based on Fuzzy Control Theorem and TPWM Method for DC ... · 使吾人想設計一模糊控制器來做為馬達轉速的閉迴路控制,以解決非線性系統的 問題。除此之外,flcs

56

void To_int(void) interrupt 1 Timer0 中斷函數 if (P3_0 == 0) 假如 PWM 輸出為 Low P3_0 = 1 變更 PWM 輸出為 High temp=8192-j4 設定 High 的時間 else 若 PWM 輸出為 High P3_0 = 0 變更 PWM 輸出為 Low temp=8192-880+j4 設定 Low 的時間 TH0 = temp 32 Timer0 的計時時間 TL0 = temp 32 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 char KeyScan(void) 檢查鍵值 char KeyStatus 按鍵狀態 P0=0xff 設定 P0 為輸入模式 KeyStatus=~P0 讀取按鍵狀態 return(KeyStatus) 將鍵值送回程式 void feedback(void) 模糊判斷 void Fuzzycontroller() 函數原型宣告 void condition1() 函數原型宣告

57

void condition2() 函數原型宣告 error1 = ((value)40-160)03 輸入變數 1 delay10ms(10) 延遲 10ms error2 = ((value)40-160)03 輸入變數 2 if (key == 0x01 ) 當按鍵 1找出對應的歸屬函數 並做出模糊控制判斷

int membership[5][3]= -100-60-30-60-300-30030030603060100

int membership1[3][3]=-100-500-50050050100 Fuzzycontroller() condition() if (key == 0x02 ) 當按鍵 2找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

05010050100150100150200150200250200250300 int membership1[3][3]=07515075150225150225300 Fuzzycontroller() condition() else if (key == 0x04) 當按鍵 3找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

200320400300400500400500600500600700600700800 int membership1[3][3]=220370520370520670520670820 Fuzzycontroller() condition() else if (key == 0x08) 當按鍵 4找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

02550255010050100200100200300200300400 int membership1[3][3]=05010050100250100250400 Fuzzycontroller() condition()

58

else if (key == 0x10) 當按鍵 5找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

150250350250350450350450550450550650550650750 int membership1[3][3]=150300450300450600450600750 Fuzzycontroller() condition2() void Fuzzycontroller() 模糊控制判斷 void compute_grade() 函數原型宣告 void compute_grade1() 函數原型宣告 a1 = 0 b1 = 001 I = 0 for (n=0 nlt=14 n++) r = error1 set = Rule[n][0]-1 compute_grade() 計算輸入變數 1 與

模糊程度的歸屬函數 condition = 1 r = error2 set = Rule[n][1]-1 compute_grade1() 計算輸入變數 2 與 模糊程度的歸屬函數 grade[n] = MIN(grade_reg[0] grade_reg[1]) a1 = a1 + (grade[n]membership2[Rule[n][2]-1][1]) b1 = b1 + grade[n] I = a1 b1 得到模糊控制判斷的結果 void compute_grade() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership[set][0]) || (r gt membership[set][2])) 當輸入變數不在 歸屬函數內

59

grade_reg[condition] = 0 else if ((r gt membership[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership[set][2]-r) (membership[set][2] - membership[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership[set][0]) (membership[set][1] - membership[set][0]) void compute_grade1() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership1[set][0]) || (r gt membership1[set][2])) 當輸入變數不在 歸屬函數內 grade_reg[condition] = 0 else if ((r gt membership1[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership1[set][2]-r) (membership1[set][2]-membership1[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership1[set][0]) (membership1[set][1]-membership1[set][0])

60

void condition() P2_0 = 1 設定 P20 為輸入模式 P2_1 = 1 設定 P21 為輸入模式 if ( (P2_0 == 1) ampamp (P2_1 == 0)) 當馬達為正轉時 if ( I gt 0 ) 若模糊判斷結果為正 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 若模糊判斷結果為零 PWM = PWM + 0 PWM 寬度不變 if ( I lt 0 ) 若模糊控制結果小於零 PWM = PWM + 1 PWM 寬度加 1 else if ( (P2_0 == 0) ampamp (P2_1 == 1) ) 若馬達為反轉 if ( I lt 0 ) 模糊控制小於零 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 模糊控制等於零 PWM = PWM + 0 PWM 寬度不變 if ( I gt 0 ) 模糊控制大於零 PWM = PWM + 1 PWM 寬度加 1 CW() 判斷 PWM 寬度上下限

61

void CW() 判斷 PWM 寬度上下限 if ( PWM gt= 215 ) 若 PWM 寬度 gt= 最大寬度 j = 215 PWM 寬度維持於 215us if ( PWM lt= 5 ) 若 PWM 寬度 lt= 最小寬度 j = 5 PWM 寬度維持在 5us if ( PWM gt 5 ampamp PWM lt 215 ) PWM 寬度介於最大與最小間 j = PWM PWM 依模糊控制判斷結果增減 void delay1ms(int count) 延遲 1ms int x y for ( x = 0 x lt count x++ ) for ( y = 0 y lt 122 y++ ) void convert() 數位資料換算成馬達轉速 r1 = ((value)40)-160

62

附錄 C LCD 顯示之程式

includereg51h 含 8051 所有暫存器宣告 include mathh define RS P3_5 LCD 指令資料選擇控制 define RW P3_4 LCD 讀寫控制腳 define Enable P3_3 LCD 致能接腳 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P0_0 = 0x80 接腳定義 sbit P0_1 = 0x81 接腳定義 sbit P0_2 = 0x82 接腳定義 sbit P0_3 = 0x83 接腳定義 sbit P0_4 = 0x84 接腳定義 sbit P0_5 = 0x85 接腳定義 sbit P0_6 = 0x86 接腳定義 sbit ADCRD = P3^7 設定 RD 控制線接腳為 P37 sbit ADCWR = P3^6 設定 WR 控制線接腳為 P36 void delay(void) 函數原型宣告 void delay10ms(int count) 函數原型宣告 void display(void) 函數原型宣告 void InitialLCD(void) 函數原型宣告 void WriteIns(char) 函數原型宣告 void WriteData(char) 函數原型宣告 void WriteString(charchar) 函數原型宣告 void CheckBusy(void) 函數原型宣告 void convert(void) 函數原型宣告 char MSG0[] = Motor Speed = 定義字串 MSG0 char MSG2[] = rpm 定義字串 MSG2 unsigned char MSG1[8]=0000000 定義字串 MSG1 unsigned long int value 讀取 ADC0804 數位資料 int sample = 1000 取樣率設定消除顯示值跳動 long int rpm

63

main() 主程式 InitialLCD() 初始化 LCD IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x01 設定計時器 0 工作於模式 1 TH0 = (65536-5000)256 設定計時器 0 初值 TL0 = (65536-5000)256 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 while(1) 等待中斷 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 while (--sample == 0) 取樣率減 1 sample = 1000 重設取樣率 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 void T0_int(void) interrupt 1 LCD 顯示動態掃描 display() 動態掃描顯示 TH0 = (65536-65535)256 重設計時初值 TL0 = (65536-65535)256

64

void InitialLCD(void) 設定 LCD 模組初始狀態 delay() 延遲函數 WriteIns(0x38) 設定 LCD 模組為 WriteIns(0x38) 2 行顯示 WriteIns(0x38) 8 位元介面 WriteIns(0x38) 5x7 點字型 WriteIns(0x08) 關閉顯示器 WriteIns(0x01) 清除 LCD 螢幕 WriteIns(0x0c) 令顯示器 ON但游標不顯示 WriteIns(0x06) 令 LCD 模組每接收到 1Byte 資料 AC 值自動加 1 void display() 掃描顯示 WriteIns(0x80) 設定 LCD 座標 WriteString(13MSG0) 將字串 MSG0 寫入 LCD 中 WriteIns(0xc0) 設定 LCD 座標 WriteString(8MSG1) 將字串 MSG1 寫入 LCD 中 WriteIns(0xc8) 設定 LCD 座標 WriteString(4MSG2) 將字串 MSG2 寫入 LCD 中 void convert(void) 換算轉速 long int freq freq = ((value)4000) - 16000 數位資料換成頻率公式 rpm = freq3 頻率換算轉速公式 MSG1[0] = (rpm1000000)+0x30 將結果存入字串 MSG1 中 MSG1[1] = ((rpm1000000)100000)+0x30 MSG1[2] = ((rpm100000)10000)+0x30 MSG1[3] = ((rpm10000)1000)+0x30 MSG1[4] = 0x2e MSG1[5] = ((rpm1000)100)+0x30 MSG1[6] = ((rpm100)10)+0x30 MSG1[7] = rpm10+0x30

65

void WriteIns(char instruction) 寫命令至 LCD 中 RS = 0 選擇指令暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = instruction 輸出命令至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteData(char i) 寫資料至 LCD 中 RS = 1 選擇資料暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = i 輸出資料至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteString(countMSG) 寫字串至 LCD 中 char count 字串長度 char MSG[] 字串資料 char i 定義位元組變數 for(i=0 iltcount i++) count 個位元組 WriteData(MSG[i]) 寫入一位元組的資料至 LCD 中 void CheckBusy(void) char i=0x80 檢查忙碌旗標 while(iamp0x80) 忙錄旗標 BF = 1 RS = 0 選擇指令暫存器 RW = 1 讀取 Enable = 1 致能 LCD i = P2 讀取 LCD 指令暫存器內的資料

66

Enable = 0 除能 LCD delay() 延遲函數 void delay() 延遲 5ms int i for(i=0 ilt250 i++)

  • 畢業專題封面pdf
  • File0004pdf
  • 最終版pdfpdf
Page 66: Based on Fuzzy Control Theorem and TPWM Method for DC ... · 使吾人想設計一模糊控制器來做為馬達轉速的閉迴路控制,以解決非線性系統的 問題。除此之外,flcs

57

void condition2() 函數原型宣告 error1 = ((value)40-160)03 輸入變數 1 delay10ms(10) 延遲 10ms error2 = ((value)40-160)03 輸入變數 2 if (key == 0x01 ) 當按鍵 1找出對應的歸屬函數 並做出模糊控制判斷

int membership[5][3]= -100-60-30-60-300-30030030603060100

int membership1[3][3]=-100-500-50050050100 Fuzzycontroller() condition() if (key == 0x02 ) 當按鍵 2找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

05010050100150100150200150200250200250300 int membership1[3][3]=07515075150225150225300 Fuzzycontroller() condition() else if (key == 0x04) 當按鍵 3找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

200320400300400500400500600500600700600700800 int membership1[3][3]=220370520370520670520670820 Fuzzycontroller() condition() else if (key == 0x08) 當按鍵 4找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

02550255010050100200100200300200300400 int membership1[3][3]=05010050100250100250400 Fuzzycontroller() condition()

58

else if (key == 0x10) 當按鍵 5找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

150250350250350450350450550450550650550650750 int membership1[3][3]=150300450300450600450600750 Fuzzycontroller() condition2() void Fuzzycontroller() 模糊控制判斷 void compute_grade() 函數原型宣告 void compute_grade1() 函數原型宣告 a1 = 0 b1 = 001 I = 0 for (n=0 nlt=14 n++) r = error1 set = Rule[n][0]-1 compute_grade() 計算輸入變數 1 與

模糊程度的歸屬函數 condition = 1 r = error2 set = Rule[n][1]-1 compute_grade1() 計算輸入變數 2 與 模糊程度的歸屬函數 grade[n] = MIN(grade_reg[0] grade_reg[1]) a1 = a1 + (grade[n]membership2[Rule[n][2]-1][1]) b1 = b1 + grade[n] I = a1 b1 得到模糊控制判斷的結果 void compute_grade() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership[set][0]) || (r gt membership[set][2])) 當輸入變數不在 歸屬函數內

59

grade_reg[condition] = 0 else if ((r gt membership[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership[set][2]-r) (membership[set][2] - membership[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership[set][0]) (membership[set][1] - membership[set][0]) void compute_grade1() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership1[set][0]) || (r gt membership1[set][2])) 當輸入變數不在 歸屬函數內 grade_reg[condition] = 0 else if ((r gt membership1[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership1[set][2]-r) (membership1[set][2]-membership1[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership1[set][0]) (membership1[set][1]-membership1[set][0])

60

void condition() P2_0 = 1 設定 P20 為輸入模式 P2_1 = 1 設定 P21 為輸入模式 if ( (P2_0 == 1) ampamp (P2_1 == 0)) 當馬達為正轉時 if ( I gt 0 ) 若模糊判斷結果為正 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 若模糊判斷結果為零 PWM = PWM + 0 PWM 寬度不變 if ( I lt 0 ) 若模糊控制結果小於零 PWM = PWM + 1 PWM 寬度加 1 else if ( (P2_0 == 0) ampamp (P2_1 == 1) ) 若馬達為反轉 if ( I lt 0 ) 模糊控制小於零 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 模糊控制等於零 PWM = PWM + 0 PWM 寬度不變 if ( I gt 0 ) 模糊控制大於零 PWM = PWM + 1 PWM 寬度加 1 CW() 判斷 PWM 寬度上下限

61

void CW() 判斷 PWM 寬度上下限 if ( PWM gt= 215 ) 若 PWM 寬度 gt= 最大寬度 j = 215 PWM 寬度維持於 215us if ( PWM lt= 5 ) 若 PWM 寬度 lt= 最小寬度 j = 5 PWM 寬度維持在 5us if ( PWM gt 5 ampamp PWM lt 215 ) PWM 寬度介於最大與最小間 j = PWM PWM 依模糊控制判斷結果增減 void delay1ms(int count) 延遲 1ms int x y for ( x = 0 x lt count x++ ) for ( y = 0 y lt 122 y++ ) void convert() 數位資料換算成馬達轉速 r1 = ((value)40)-160

62

附錄 C LCD 顯示之程式

includereg51h 含 8051 所有暫存器宣告 include mathh define RS P3_5 LCD 指令資料選擇控制 define RW P3_4 LCD 讀寫控制腳 define Enable P3_3 LCD 致能接腳 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P0_0 = 0x80 接腳定義 sbit P0_1 = 0x81 接腳定義 sbit P0_2 = 0x82 接腳定義 sbit P0_3 = 0x83 接腳定義 sbit P0_4 = 0x84 接腳定義 sbit P0_5 = 0x85 接腳定義 sbit P0_6 = 0x86 接腳定義 sbit ADCRD = P3^7 設定 RD 控制線接腳為 P37 sbit ADCWR = P3^6 設定 WR 控制線接腳為 P36 void delay(void) 函數原型宣告 void delay10ms(int count) 函數原型宣告 void display(void) 函數原型宣告 void InitialLCD(void) 函數原型宣告 void WriteIns(char) 函數原型宣告 void WriteData(char) 函數原型宣告 void WriteString(charchar) 函數原型宣告 void CheckBusy(void) 函數原型宣告 void convert(void) 函數原型宣告 char MSG0[] = Motor Speed = 定義字串 MSG0 char MSG2[] = rpm 定義字串 MSG2 unsigned char MSG1[8]=0000000 定義字串 MSG1 unsigned long int value 讀取 ADC0804 數位資料 int sample = 1000 取樣率設定消除顯示值跳動 long int rpm

63

main() 主程式 InitialLCD() 初始化 LCD IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x01 設定計時器 0 工作於模式 1 TH0 = (65536-5000)256 設定計時器 0 初值 TL0 = (65536-5000)256 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 while(1) 等待中斷 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 while (--sample == 0) 取樣率減 1 sample = 1000 重設取樣率 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 void T0_int(void) interrupt 1 LCD 顯示動態掃描 display() 動態掃描顯示 TH0 = (65536-65535)256 重設計時初值 TL0 = (65536-65535)256

64

void InitialLCD(void) 設定 LCD 模組初始狀態 delay() 延遲函數 WriteIns(0x38) 設定 LCD 模組為 WriteIns(0x38) 2 行顯示 WriteIns(0x38) 8 位元介面 WriteIns(0x38) 5x7 點字型 WriteIns(0x08) 關閉顯示器 WriteIns(0x01) 清除 LCD 螢幕 WriteIns(0x0c) 令顯示器 ON但游標不顯示 WriteIns(0x06) 令 LCD 模組每接收到 1Byte 資料 AC 值自動加 1 void display() 掃描顯示 WriteIns(0x80) 設定 LCD 座標 WriteString(13MSG0) 將字串 MSG0 寫入 LCD 中 WriteIns(0xc0) 設定 LCD 座標 WriteString(8MSG1) 將字串 MSG1 寫入 LCD 中 WriteIns(0xc8) 設定 LCD 座標 WriteString(4MSG2) 將字串 MSG2 寫入 LCD 中 void convert(void) 換算轉速 long int freq freq = ((value)4000) - 16000 數位資料換成頻率公式 rpm = freq3 頻率換算轉速公式 MSG1[0] = (rpm1000000)+0x30 將結果存入字串 MSG1 中 MSG1[1] = ((rpm1000000)100000)+0x30 MSG1[2] = ((rpm100000)10000)+0x30 MSG1[3] = ((rpm10000)1000)+0x30 MSG1[4] = 0x2e MSG1[5] = ((rpm1000)100)+0x30 MSG1[6] = ((rpm100)10)+0x30 MSG1[7] = rpm10+0x30

65

void WriteIns(char instruction) 寫命令至 LCD 中 RS = 0 選擇指令暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = instruction 輸出命令至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteData(char i) 寫資料至 LCD 中 RS = 1 選擇資料暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = i 輸出資料至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteString(countMSG) 寫字串至 LCD 中 char count 字串長度 char MSG[] 字串資料 char i 定義位元組變數 for(i=0 iltcount i++) count 個位元組 WriteData(MSG[i]) 寫入一位元組的資料至 LCD 中 void CheckBusy(void) char i=0x80 檢查忙碌旗標 while(iamp0x80) 忙錄旗標 BF = 1 RS = 0 選擇指令暫存器 RW = 1 讀取 Enable = 1 致能 LCD i = P2 讀取 LCD 指令暫存器內的資料

66

Enable = 0 除能 LCD delay() 延遲函數 void delay() 延遲 5ms int i for(i=0 ilt250 i++)

  • 畢業專題封面pdf
  • File0004pdf
  • 最終版pdfpdf
Page 67: Based on Fuzzy Control Theorem and TPWM Method for DC ... · 使吾人想設計一模糊控制器來做為馬達轉速的閉迴路控制,以解決非線性系統的 問題。除此之外,flcs

58

else if (key == 0x10) 當按鍵 5找出對應的歸屬函數 並做出模糊控制判斷 int membership[5][3]=

150250350250350450350450550450550650550650750 int membership1[3][3]=150300450300450600450600750 Fuzzycontroller() condition2() void Fuzzycontroller() 模糊控制判斷 void compute_grade() 函數原型宣告 void compute_grade1() 函數原型宣告 a1 = 0 b1 = 001 I = 0 for (n=0 nlt=14 n++) r = error1 set = Rule[n][0]-1 compute_grade() 計算輸入變數 1 與

模糊程度的歸屬函數 condition = 1 r = error2 set = Rule[n][1]-1 compute_grade1() 計算輸入變數 2 與 模糊程度的歸屬函數 grade[n] = MIN(grade_reg[0] grade_reg[1]) a1 = a1 + (grade[n]membership2[Rule[n][2]-1][1]) b1 = b1 + grade[n] I = a1 b1 得到模糊控制判斷的結果 void compute_grade() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership[set][0]) || (r gt membership[set][2])) 當輸入變數不在 歸屬函數內

59

grade_reg[condition] = 0 else if ((r gt membership[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership[set][2]-r) (membership[set][2] - membership[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership[set][0]) (membership[set][1] - membership[set][0]) void compute_grade1() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership1[set][0]) || (r gt membership1[set][2])) 當輸入變數不在 歸屬函數內 grade_reg[condition] = 0 else if ((r gt membership1[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership1[set][2]-r) (membership1[set][2]-membership1[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership1[set][0]) (membership1[set][1]-membership1[set][0])

60

void condition() P2_0 = 1 設定 P20 為輸入模式 P2_1 = 1 設定 P21 為輸入模式 if ( (P2_0 == 1) ampamp (P2_1 == 0)) 當馬達為正轉時 if ( I gt 0 ) 若模糊判斷結果為正 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 若模糊判斷結果為零 PWM = PWM + 0 PWM 寬度不變 if ( I lt 0 ) 若模糊控制結果小於零 PWM = PWM + 1 PWM 寬度加 1 else if ( (P2_0 == 0) ampamp (P2_1 == 1) ) 若馬達為反轉 if ( I lt 0 ) 模糊控制小於零 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 模糊控制等於零 PWM = PWM + 0 PWM 寬度不變 if ( I gt 0 ) 模糊控制大於零 PWM = PWM + 1 PWM 寬度加 1 CW() 判斷 PWM 寬度上下限

61

void CW() 判斷 PWM 寬度上下限 if ( PWM gt= 215 ) 若 PWM 寬度 gt= 最大寬度 j = 215 PWM 寬度維持於 215us if ( PWM lt= 5 ) 若 PWM 寬度 lt= 最小寬度 j = 5 PWM 寬度維持在 5us if ( PWM gt 5 ampamp PWM lt 215 ) PWM 寬度介於最大與最小間 j = PWM PWM 依模糊控制判斷結果增減 void delay1ms(int count) 延遲 1ms int x y for ( x = 0 x lt count x++ ) for ( y = 0 y lt 122 y++ ) void convert() 數位資料換算成馬達轉速 r1 = ((value)40)-160

62

附錄 C LCD 顯示之程式

includereg51h 含 8051 所有暫存器宣告 include mathh define RS P3_5 LCD 指令資料選擇控制 define RW P3_4 LCD 讀寫控制腳 define Enable P3_3 LCD 致能接腳 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P0_0 = 0x80 接腳定義 sbit P0_1 = 0x81 接腳定義 sbit P0_2 = 0x82 接腳定義 sbit P0_3 = 0x83 接腳定義 sbit P0_4 = 0x84 接腳定義 sbit P0_5 = 0x85 接腳定義 sbit P0_6 = 0x86 接腳定義 sbit ADCRD = P3^7 設定 RD 控制線接腳為 P37 sbit ADCWR = P3^6 設定 WR 控制線接腳為 P36 void delay(void) 函數原型宣告 void delay10ms(int count) 函數原型宣告 void display(void) 函數原型宣告 void InitialLCD(void) 函數原型宣告 void WriteIns(char) 函數原型宣告 void WriteData(char) 函數原型宣告 void WriteString(charchar) 函數原型宣告 void CheckBusy(void) 函數原型宣告 void convert(void) 函數原型宣告 char MSG0[] = Motor Speed = 定義字串 MSG0 char MSG2[] = rpm 定義字串 MSG2 unsigned char MSG1[8]=0000000 定義字串 MSG1 unsigned long int value 讀取 ADC0804 數位資料 int sample = 1000 取樣率設定消除顯示值跳動 long int rpm

63

main() 主程式 InitialLCD() 初始化 LCD IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x01 設定計時器 0 工作於模式 1 TH0 = (65536-5000)256 設定計時器 0 初值 TL0 = (65536-5000)256 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 while(1) 等待中斷 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 while (--sample == 0) 取樣率減 1 sample = 1000 重設取樣率 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 void T0_int(void) interrupt 1 LCD 顯示動態掃描 display() 動態掃描顯示 TH0 = (65536-65535)256 重設計時初值 TL0 = (65536-65535)256

64

void InitialLCD(void) 設定 LCD 模組初始狀態 delay() 延遲函數 WriteIns(0x38) 設定 LCD 模組為 WriteIns(0x38) 2 行顯示 WriteIns(0x38) 8 位元介面 WriteIns(0x38) 5x7 點字型 WriteIns(0x08) 關閉顯示器 WriteIns(0x01) 清除 LCD 螢幕 WriteIns(0x0c) 令顯示器 ON但游標不顯示 WriteIns(0x06) 令 LCD 模組每接收到 1Byte 資料 AC 值自動加 1 void display() 掃描顯示 WriteIns(0x80) 設定 LCD 座標 WriteString(13MSG0) 將字串 MSG0 寫入 LCD 中 WriteIns(0xc0) 設定 LCD 座標 WriteString(8MSG1) 將字串 MSG1 寫入 LCD 中 WriteIns(0xc8) 設定 LCD 座標 WriteString(4MSG2) 將字串 MSG2 寫入 LCD 中 void convert(void) 換算轉速 long int freq freq = ((value)4000) - 16000 數位資料換成頻率公式 rpm = freq3 頻率換算轉速公式 MSG1[0] = (rpm1000000)+0x30 將結果存入字串 MSG1 中 MSG1[1] = ((rpm1000000)100000)+0x30 MSG1[2] = ((rpm100000)10000)+0x30 MSG1[3] = ((rpm10000)1000)+0x30 MSG1[4] = 0x2e MSG1[5] = ((rpm1000)100)+0x30 MSG1[6] = ((rpm100)10)+0x30 MSG1[7] = rpm10+0x30

65

void WriteIns(char instruction) 寫命令至 LCD 中 RS = 0 選擇指令暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = instruction 輸出命令至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteData(char i) 寫資料至 LCD 中 RS = 1 選擇資料暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = i 輸出資料至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteString(countMSG) 寫字串至 LCD 中 char count 字串長度 char MSG[] 字串資料 char i 定義位元組變數 for(i=0 iltcount i++) count 個位元組 WriteData(MSG[i]) 寫入一位元組的資料至 LCD 中 void CheckBusy(void) char i=0x80 檢查忙碌旗標 while(iamp0x80) 忙錄旗標 BF = 1 RS = 0 選擇指令暫存器 RW = 1 讀取 Enable = 1 致能 LCD i = P2 讀取 LCD 指令暫存器內的資料

66

Enable = 0 除能 LCD delay() 延遲函數 void delay() 延遲 5ms int i for(i=0 ilt250 i++)

  • 畢業專題封面pdf
  • File0004pdf
  • 最終版pdfpdf
Page 68: Based on Fuzzy Control Theorem and TPWM Method for DC ... · 使吾人想設計一模糊控制器來做為馬達轉速的閉迴路控制,以解決非線性系統的 問題。除此之外,flcs

59

grade_reg[condition] = 0 else if ((r gt membership[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership[set][2]-r) (membership[set][2] - membership[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership[set][0]) (membership[set][1] - membership[set][0]) void compute_grade1() 計算輸入變數 1 與 模糊程度的歸屬函數 if ((r lt membership1[set][0]) || (r gt membership1[set][2])) 當輸入變數不在 歸屬函數內 grade_reg[condition] = 0 else if ((r gt membership1[set][1])) 當輸入變數位於 三角型歸屬函數的右半邊 grade_reg[condition] =

(membership1[set][2]-r) (membership1[set][2]-membership1[set][1]) else 當輸入變數位於 三角型歸屬函數的左半邊 grade_reg[condition] =

(r-membership1[set][0]) (membership1[set][1]-membership1[set][0])

60

void condition() P2_0 = 1 設定 P20 為輸入模式 P2_1 = 1 設定 P21 為輸入模式 if ( (P2_0 == 1) ampamp (P2_1 == 0)) 當馬達為正轉時 if ( I gt 0 ) 若模糊判斷結果為正 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 若模糊判斷結果為零 PWM = PWM + 0 PWM 寬度不變 if ( I lt 0 ) 若模糊控制結果小於零 PWM = PWM + 1 PWM 寬度加 1 else if ( (P2_0 == 0) ampamp (P2_1 == 1) ) 若馬達為反轉 if ( I lt 0 ) 模糊控制小於零 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 模糊控制等於零 PWM = PWM + 0 PWM 寬度不變 if ( I gt 0 ) 模糊控制大於零 PWM = PWM + 1 PWM 寬度加 1 CW() 判斷 PWM 寬度上下限

61

void CW() 判斷 PWM 寬度上下限 if ( PWM gt= 215 ) 若 PWM 寬度 gt= 最大寬度 j = 215 PWM 寬度維持於 215us if ( PWM lt= 5 ) 若 PWM 寬度 lt= 最小寬度 j = 5 PWM 寬度維持在 5us if ( PWM gt 5 ampamp PWM lt 215 ) PWM 寬度介於最大與最小間 j = PWM PWM 依模糊控制判斷結果增減 void delay1ms(int count) 延遲 1ms int x y for ( x = 0 x lt count x++ ) for ( y = 0 y lt 122 y++ ) void convert() 數位資料換算成馬達轉速 r1 = ((value)40)-160

62

附錄 C LCD 顯示之程式

includereg51h 含 8051 所有暫存器宣告 include mathh define RS P3_5 LCD 指令資料選擇控制 define RW P3_4 LCD 讀寫控制腳 define Enable P3_3 LCD 致能接腳 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P0_0 = 0x80 接腳定義 sbit P0_1 = 0x81 接腳定義 sbit P0_2 = 0x82 接腳定義 sbit P0_3 = 0x83 接腳定義 sbit P0_4 = 0x84 接腳定義 sbit P0_5 = 0x85 接腳定義 sbit P0_6 = 0x86 接腳定義 sbit ADCRD = P3^7 設定 RD 控制線接腳為 P37 sbit ADCWR = P3^6 設定 WR 控制線接腳為 P36 void delay(void) 函數原型宣告 void delay10ms(int count) 函數原型宣告 void display(void) 函數原型宣告 void InitialLCD(void) 函數原型宣告 void WriteIns(char) 函數原型宣告 void WriteData(char) 函數原型宣告 void WriteString(charchar) 函數原型宣告 void CheckBusy(void) 函數原型宣告 void convert(void) 函數原型宣告 char MSG0[] = Motor Speed = 定義字串 MSG0 char MSG2[] = rpm 定義字串 MSG2 unsigned char MSG1[8]=0000000 定義字串 MSG1 unsigned long int value 讀取 ADC0804 數位資料 int sample = 1000 取樣率設定消除顯示值跳動 long int rpm

63

main() 主程式 InitialLCD() 初始化 LCD IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x01 設定計時器 0 工作於模式 1 TH0 = (65536-5000)256 設定計時器 0 初值 TL0 = (65536-5000)256 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 while(1) 等待中斷 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 while (--sample == 0) 取樣率減 1 sample = 1000 重設取樣率 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 void T0_int(void) interrupt 1 LCD 顯示動態掃描 display() 動態掃描顯示 TH0 = (65536-65535)256 重設計時初值 TL0 = (65536-65535)256

64

void InitialLCD(void) 設定 LCD 模組初始狀態 delay() 延遲函數 WriteIns(0x38) 設定 LCD 模組為 WriteIns(0x38) 2 行顯示 WriteIns(0x38) 8 位元介面 WriteIns(0x38) 5x7 點字型 WriteIns(0x08) 關閉顯示器 WriteIns(0x01) 清除 LCD 螢幕 WriteIns(0x0c) 令顯示器 ON但游標不顯示 WriteIns(0x06) 令 LCD 模組每接收到 1Byte 資料 AC 值自動加 1 void display() 掃描顯示 WriteIns(0x80) 設定 LCD 座標 WriteString(13MSG0) 將字串 MSG0 寫入 LCD 中 WriteIns(0xc0) 設定 LCD 座標 WriteString(8MSG1) 將字串 MSG1 寫入 LCD 中 WriteIns(0xc8) 設定 LCD 座標 WriteString(4MSG2) 將字串 MSG2 寫入 LCD 中 void convert(void) 換算轉速 long int freq freq = ((value)4000) - 16000 數位資料換成頻率公式 rpm = freq3 頻率換算轉速公式 MSG1[0] = (rpm1000000)+0x30 將結果存入字串 MSG1 中 MSG1[1] = ((rpm1000000)100000)+0x30 MSG1[2] = ((rpm100000)10000)+0x30 MSG1[3] = ((rpm10000)1000)+0x30 MSG1[4] = 0x2e MSG1[5] = ((rpm1000)100)+0x30 MSG1[6] = ((rpm100)10)+0x30 MSG1[7] = rpm10+0x30

65

void WriteIns(char instruction) 寫命令至 LCD 中 RS = 0 選擇指令暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = instruction 輸出命令至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteData(char i) 寫資料至 LCD 中 RS = 1 選擇資料暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = i 輸出資料至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteString(countMSG) 寫字串至 LCD 中 char count 字串長度 char MSG[] 字串資料 char i 定義位元組變數 for(i=0 iltcount i++) count 個位元組 WriteData(MSG[i]) 寫入一位元組的資料至 LCD 中 void CheckBusy(void) char i=0x80 檢查忙碌旗標 while(iamp0x80) 忙錄旗標 BF = 1 RS = 0 選擇指令暫存器 RW = 1 讀取 Enable = 1 致能 LCD i = P2 讀取 LCD 指令暫存器內的資料

66

Enable = 0 除能 LCD delay() 延遲函數 void delay() 延遲 5ms int i for(i=0 ilt250 i++)

  • 畢業專題封面pdf
  • File0004pdf
  • 最終版pdfpdf
Page 69: Based on Fuzzy Control Theorem and TPWM Method for DC ... · 使吾人想設計一模糊控制器來做為馬達轉速的閉迴路控制,以解決非線性系統的 問題。除此之外,flcs

60

void condition() P2_0 = 1 設定 P20 為輸入模式 P2_1 = 1 設定 P21 為輸入模式 if ( (P2_0 == 1) ampamp (P2_1 == 0)) 當馬達為正轉時 if ( I gt 0 ) 若模糊判斷結果為正 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 若模糊判斷結果為零 PWM = PWM + 0 PWM 寬度不變 if ( I lt 0 ) 若模糊控制結果小於零 PWM = PWM + 1 PWM 寬度加 1 else if ( (P2_0 == 0) ampamp (P2_1 == 1) ) 若馬達為反轉 if ( I lt 0 ) 模糊控制小於零 PWM = PWM - 1 PWM 寬度減 1us if ( I == 0 ) 模糊控制等於零 PWM = PWM + 0 PWM 寬度不變 if ( I gt 0 ) 模糊控制大於零 PWM = PWM + 1 PWM 寬度加 1 CW() 判斷 PWM 寬度上下限

61

void CW() 判斷 PWM 寬度上下限 if ( PWM gt= 215 ) 若 PWM 寬度 gt= 最大寬度 j = 215 PWM 寬度維持於 215us if ( PWM lt= 5 ) 若 PWM 寬度 lt= 最小寬度 j = 5 PWM 寬度維持在 5us if ( PWM gt 5 ampamp PWM lt 215 ) PWM 寬度介於最大與最小間 j = PWM PWM 依模糊控制判斷結果增減 void delay1ms(int count) 延遲 1ms int x y for ( x = 0 x lt count x++ ) for ( y = 0 y lt 122 y++ ) void convert() 數位資料換算成馬達轉速 r1 = ((value)40)-160

62

附錄 C LCD 顯示之程式

includereg51h 含 8051 所有暫存器宣告 include mathh define RS P3_5 LCD 指令資料選擇控制 define RW P3_4 LCD 讀寫控制腳 define Enable P3_3 LCD 致能接腳 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P0_0 = 0x80 接腳定義 sbit P0_1 = 0x81 接腳定義 sbit P0_2 = 0x82 接腳定義 sbit P0_3 = 0x83 接腳定義 sbit P0_4 = 0x84 接腳定義 sbit P0_5 = 0x85 接腳定義 sbit P0_6 = 0x86 接腳定義 sbit ADCRD = P3^7 設定 RD 控制線接腳為 P37 sbit ADCWR = P3^6 設定 WR 控制線接腳為 P36 void delay(void) 函數原型宣告 void delay10ms(int count) 函數原型宣告 void display(void) 函數原型宣告 void InitialLCD(void) 函數原型宣告 void WriteIns(char) 函數原型宣告 void WriteData(char) 函數原型宣告 void WriteString(charchar) 函數原型宣告 void CheckBusy(void) 函數原型宣告 void convert(void) 函數原型宣告 char MSG0[] = Motor Speed = 定義字串 MSG0 char MSG2[] = rpm 定義字串 MSG2 unsigned char MSG1[8]=0000000 定義字串 MSG1 unsigned long int value 讀取 ADC0804 數位資料 int sample = 1000 取樣率設定消除顯示值跳動 long int rpm

63

main() 主程式 InitialLCD() 初始化 LCD IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x01 設定計時器 0 工作於模式 1 TH0 = (65536-5000)256 設定計時器 0 初值 TL0 = (65536-5000)256 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 while(1) 等待中斷 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 while (--sample == 0) 取樣率減 1 sample = 1000 重設取樣率 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 void T0_int(void) interrupt 1 LCD 顯示動態掃描 display() 動態掃描顯示 TH0 = (65536-65535)256 重設計時初值 TL0 = (65536-65535)256

64

void InitialLCD(void) 設定 LCD 模組初始狀態 delay() 延遲函數 WriteIns(0x38) 設定 LCD 模組為 WriteIns(0x38) 2 行顯示 WriteIns(0x38) 8 位元介面 WriteIns(0x38) 5x7 點字型 WriteIns(0x08) 關閉顯示器 WriteIns(0x01) 清除 LCD 螢幕 WriteIns(0x0c) 令顯示器 ON但游標不顯示 WriteIns(0x06) 令 LCD 模組每接收到 1Byte 資料 AC 值自動加 1 void display() 掃描顯示 WriteIns(0x80) 設定 LCD 座標 WriteString(13MSG0) 將字串 MSG0 寫入 LCD 中 WriteIns(0xc0) 設定 LCD 座標 WriteString(8MSG1) 將字串 MSG1 寫入 LCD 中 WriteIns(0xc8) 設定 LCD 座標 WriteString(4MSG2) 將字串 MSG2 寫入 LCD 中 void convert(void) 換算轉速 long int freq freq = ((value)4000) - 16000 數位資料換成頻率公式 rpm = freq3 頻率換算轉速公式 MSG1[0] = (rpm1000000)+0x30 將結果存入字串 MSG1 中 MSG1[1] = ((rpm1000000)100000)+0x30 MSG1[2] = ((rpm100000)10000)+0x30 MSG1[3] = ((rpm10000)1000)+0x30 MSG1[4] = 0x2e MSG1[5] = ((rpm1000)100)+0x30 MSG1[6] = ((rpm100)10)+0x30 MSG1[7] = rpm10+0x30

65

void WriteIns(char instruction) 寫命令至 LCD 中 RS = 0 選擇指令暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = instruction 輸出命令至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteData(char i) 寫資料至 LCD 中 RS = 1 選擇資料暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = i 輸出資料至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteString(countMSG) 寫字串至 LCD 中 char count 字串長度 char MSG[] 字串資料 char i 定義位元組變數 for(i=0 iltcount i++) count 個位元組 WriteData(MSG[i]) 寫入一位元組的資料至 LCD 中 void CheckBusy(void) char i=0x80 檢查忙碌旗標 while(iamp0x80) 忙錄旗標 BF = 1 RS = 0 選擇指令暫存器 RW = 1 讀取 Enable = 1 致能 LCD i = P2 讀取 LCD 指令暫存器內的資料

66

Enable = 0 除能 LCD delay() 延遲函數 void delay() 延遲 5ms int i for(i=0 ilt250 i++)

  • 畢業專題封面pdf
  • File0004pdf
  • 最終版pdfpdf
Page 70: Based on Fuzzy Control Theorem and TPWM Method for DC ... · 使吾人想設計一模糊控制器來做為馬達轉速的閉迴路控制,以解決非線性系統的 問題。除此之外,flcs

61

void CW() 判斷 PWM 寬度上下限 if ( PWM gt= 215 ) 若 PWM 寬度 gt= 最大寬度 j = 215 PWM 寬度維持於 215us if ( PWM lt= 5 ) 若 PWM 寬度 lt= 最小寬度 j = 5 PWM 寬度維持在 5us if ( PWM gt 5 ampamp PWM lt 215 ) PWM 寬度介於最大與最小間 j = PWM PWM 依模糊控制判斷結果增減 void delay1ms(int count) 延遲 1ms int x y for ( x = 0 x lt count x++ ) for ( y = 0 y lt 122 y++ ) void convert() 數位資料換算成馬達轉速 r1 = ((value)40)-160

62

附錄 C LCD 顯示之程式

includereg51h 含 8051 所有暫存器宣告 include mathh define RS P3_5 LCD 指令資料選擇控制 define RW P3_4 LCD 讀寫控制腳 define Enable P3_3 LCD 致能接腳 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P0_0 = 0x80 接腳定義 sbit P0_1 = 0x81 接腳定義 sbit P0_2 = 0x82 接腳定義 sbit P0_3 = 0x83 接腳定義 sbit P0_4 = 0x84 接腳定義 sbit P0_5 = 0x85 接腳定義 sbit P0_6 = 0x86 接腳定義 sbit ADCRD = P3^7 設定 RD 控制線接腳為 P37 sbit ADCWR = P3^6 設定 WR 控制線接腳為 P36 void delay(void) 函數原型宣告 void delay10ms(int count) 函數原型宣告 void display(void) 函數原型宣告 void InitialLCD(void) 函數原型宣告 void WriteIns(char) 函數原型宣告 void WriteData(char) 函數原型宣告 void WriteString(charchar) 函數原型宣告 void CheckBusy(void) 函數原型宣告 void convert(void) 函數原型宣告 char MSG0[] = Motor Speed = 定義字串 MSG0 char MSG2[] = rpm 定義字串 MSG2 unsigned char MSG1[8]=0000000 定義字串 MSG1 unsigned long int value 讀取 ADC0804 數位資料 int sample = 1000 取樣率設定消除顯示值跳動 long int rpm

63

main() 主程式 InitialLCD() 初始化 LCD IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x01 設定計時器 0 工作於模式 1 TH0 = (65536-5000)256 設定計時器 0 初值 TL0 = (65536-5000)256 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 while(1) 等待中斷 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 while (--sample == 0) 取樣率減 1 sample = 1000 重設取樣率 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 void T0_int(void) interrupt 1 LCD 顯示動態掃描 display() 動態掃描顯示 TH0 = (65536-65535)256 重設計時初值 TL0 = (65536-65535)256

64

void InitialLCD(void) 設定 LCD 模組初始狀態 delay() 延遲函數 WriteIns(0x38) 設定 LCD 模組為 WriteIns(0x38) 2 行顯示 WriteIns(0x38) 8 位元介面 WriteIns(0x38) 5x7 點字型 WriteIns(0x08) 關閉顯示器 WriteIns(0x01) 清除 LCD 螢幕 WriteIns(0x0c) 令顯示器 ON但游標不顯示 WriteIns(0x06) 令 LCD 模組每接收到 1Byte 資料 AC 值自動加 1 void display() 掃描顯示 WriteIns(0x80) 設定 LCD 座標 WriteString(13MSG0) 將字串 MSG0 寫入 LCD 中 WriteIns(0xc0) 設定 LCD 座標 WriteString(8MSG1) 將字串 MSG1 寫入 LCD 中 WriteIns(0xc8) 設定 LCD 座標 WriteString(4MSG2) 將字串 MSG2 寫入 LCD 中 void convert(void) 換算轉速 long int freq freq = ((value)4000) - 16000 數位資料換成頻率公式 rpm = freq3 頻率換算轉速公式 MSG1[0] = (rpm1000000)+0x30 將結果存入字串 MSG1 中 MSG1[1] = ((rpm1000000)100000)+0x30 MSG1[2] = ((rpm100000)10000)+0x30 MSG1[3] = ((rpm10000)1000)+0x30 MSG1[4] = 0x2e MSG1[5] = ((rpm1000)100)+0x30 MSG1[6] = ((rpm100)10)+0x30 MSG1[7] = rpm10+0x30

65

void WriteIns(char instruction) 寫命令至 LCD 中 RS = 0 選擇指令暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = instruction 輸出命令至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteData(char i) 寫資料至 LCD 中 RS = 1 選擇資料暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = i 輸出資料至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteString(countMSG) 寫字串至 LCD 中 char count 字串長度 char MSG[] 字串資料 char i 定義位元組變數 for(i=0 iltcount i++) count 個位元組 WriteData(MSG[i]) 寫入一位元組的資料至 LCD 中 void CheckBusy(void) char i=0x80 檢查忙碌旗標 while(iamp0x80) 忙錄旗標 BF = 1 RS = 0 選擇指令暫存器 RW = 1 讀取 Enable = 1 致能 LCD i = P2 讀取 LCD 指令暫存器內的資料

66

Enable = 0 除能 LCD delay() 延遲函數 void delay() 延遲 5ms int i for(i=0 ilt250 i++)

  • 畢業專題封面pdf
  • File0004pdf
  • 最終版pdfpdf
Page 71: Based on Fuzzy Control Theorem and TPWM Method for DC ... · 使吾人想設計一模糊控制器來做為馬達轉速的閉迴路控制,以解決非線性系統的 問題。除此之外,flcs

62

附錄 C LCD 顯示之程式

includereg51h 含 8051 所有暫存器宣告 include mathh define RS P3_5 LCD 指令資料選擇控制 define RW P3_4 LCD 讀寫控制腳 define Enable P3_3 LCD 致能接腳 sbit P3_3 = 0xB3 接腳定義 sbit P3_4 = 0xB4 接腳定義 sbit P3_5 = 0xB5 接腳定義 sbit P0_0 = 0x80 接腳定義 sbit P0_1 = 0x81 接腳定義 sbit P0_2 = 0x82 接腳定義 sbit P0_3 = 0x83 接腳定義 sbit P0_4 = 0x84 接腳定義 sbit P0_5 = 0x85 接腳定義 sbit P0_6 = 0x86 接腳定義 sbit ADCRD = P3^7 設定 RD 控制線接腳為 P37 sbit ADCWR = P3^6 設定 WR 控制線接腳為 P36 void delay(void) 函數原型宣告 void delay10ms(int count) 函數原型宣告 void display(void) 函數原型宣告 void InitialLCD(void) 函數原型宣告 void WriteIns(char) 函數原型宣告 void WriteData(char) 函數原型宣告 void WriteString(charchar) 函數原型宣告 void CheckBusy(void) 函數原型宣告 void convert(void) 函數原型宣告 char MSG0[] = Motor Speed = 定義字串 MSG0 char MSG2[] = rpm 定義字串 MSG2 unsigned char MSG1[8]=0000000 定義字串 MSG1 unsigned long int value 讀取 ADC0804 數位資料 int sample = 1000 取樣率設定消除顯示值跳動 long int rpm

63

main() 主程式 InitialLCD() 初始化 LCD IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x01 設定計時器 0 工作於模式 1 TH0 = (65536-5000)256 設定計時器 0 初值 TL0 = (65536-5000)256 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 while(1) 等待中斷 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 while (--sample == 0) 取樣率減 1 sample = 1000 重設取樣率 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 void T0_int(void) interrupt 1 LCD 顯示動態掃描 display() 動態掃描顯示 TH0 = (65536-65535)256 重設計時初值 TL0 = (65536-65535)256

64

void InitialLCD(void) 設定 LCD 模組初始狀態 delay() 延遲函數 WriteIns(0x38) 設定 LCD 模組為 WriteIns(0x38) 2 行顯示 WriteIns(0x38) 8 位元介面 WriteIns(0x38) 5x7 點字型 WriteIns(0x08) 關閉顯示器 WriteIns(0x01) 清除 LCD 螢幕 WriteIns(0x0c) 令顯示器 ON但游標不顯示 WriteIns(0x06) 令 LCD 模組每接收到 1Byte 資料 AC 值自動加 1 void display() 掃描顯示 WriteIns(0x80) 設定 LCD 座標 WriteString(13MSG0) 將字串 MSG0 寫入 LCD 中 WriteIns(0xc0) 設定 LCD 座標 WriteString(8MSG1) 將字串 MSG1 寫入 LCD 中 WriteIns(0xc8) 設定 LCD 座標 WriteString(4MSG2) 將字串 MSG2 寫入 LCD 中 void convert(void) 換算轉速 long int freq freq = ((value)4000) - 16000 數位資料換成頻率公式 rpm = freq3 頻率換算轉速公式 MSG1[0] = (rpm1000000)+0x30 將結果存入字串 MSG1 中 MSG1[1] = ((rpm1000000)100000)+0x30 MSG1[2] = ((rpm100000)10000)+0x30 MSG1[3] = ((rpm10000)1000)+0x30 MSG1[4] = 0x2e MSG1[5] = ((rpm1000)100)+0x30 MSG1[6] = ((rpm100)10)+0x30 MSG1[7] = rpm10+0x30

65

void WriteIns(char instruction) 寫命令至 LCD 中 RS = 0 選擇指令暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = instruction 輸出命令至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteData(char i) 寫資料至 LCD 中 RS = 1 選擇資料暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = i 輸出資料至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteString(countMSG) 寫字串至 LCD 中 char count 字串長度 char MSG[] 字串資料 char i 定義位元組變數 for(i=0 iltcount i++) count 個位元組 WriteData(MSG[i]) 寫入一位元組的資料至 LCD 中 void CheckBusy(void) char i=0x80 檢查忙碌旗標 while(iamp0x80) 忙錄旗標 BF = 1 RS = 0 選擇指令暫存器 RW = 1 讀取 Enable = 1 致能 LCD i = P2 讀取 LCD 指令暫存器內的資料

66

Enable = 0 除能 LCD delay() 延遲函數 void delay() 延遲 5ms int i for(i=0 ilt250 i++)

  • 畢業專題封面pdf
  • File0004pdf
  • 最終版pdfpdf
Page 72: Based on Fuzzy Control Theorem and TPWM Method for DC ... · 使吾人想設計一模糊控制器來做為馬達轉速的閉迴路控制,以解決非線性系統的 問題。除此之外,flcs

63

main() 主程式 InitialLCD() 初始化 LCD IE = 0x83 致能 T0 與外部中斷 0 中斷 TMOD = 0x01 設定計時器 0 工作於模式 1 TH0 = (65536-5000)256 設定計時器 0 初值 TL0 = (65536-5000)256 TCON = 0x01 設定外部中斷 0 為負緣觸發 TR0 = 1 啟動計時器 0 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 while(1) 等待中斷 void EX0_int(void) interrupt 0 偵測 ADC0804 是否已轉換完成 while (--sample == 0) 取樣率減 1 sample = 1000 重設取樣率 ADCRD = 0 RD = 0從 ADC0804 讀取資料 value = P1 將 P1 讀取到的資料存入 value ADCRD = 1 RD = 1 convert() 呼叫換算轉速函數 ADCWR = 0 ADCWR = 1 正緣觸發啟動 ADC 讀取狀態 void T0_int(void) interrupt 1 LCD 顯示動態掃描 display() 動態掃描顯示 TH0 = (65536-65535)256 重設計時初值 TL0 = (65536-65535)256

64

void InitialLCD(void) 設定 LCD 模組初始狀態 delay() 延遲函數 WriteIns(0x38) 設定 LCD 模組為 WriteIns(0x38) 2 行顯示 WriteIns(0x38) 8 位元介面 WriteIns(0x38) 5x7 點字型 WriteIns(0x08) 關閉顯示器 WriteIns(0x01) 清除 LCD 螢幕 WriteIns(0x0c) 令顯示器 ON但游標不顯示 WriteIns(0x06) 令 LCD 模組每接收到 1Byte 資料 AC 值自動加 1 void display() 掃描顯示 WriteIns(0x80) 設定 LCD 座標 WriteString(13MSG0) 將字串 MSG0 寫入 LCD 中 WriteIns(0xc0) 設定 LCD 座標 WriteString(8MSG1) 將字串 MSG1 寫入 LCD 中 WriteIns(0xc8) 設定 LCD 座標 WriteString(4MSG2) 將字串 MSG2 寫入 LCD 中 void convert(void) 換算轉速 long int freq freq = ((value)4000) - 16000 數位資料換成頻率公式 rpm = freq3 頻率換算轉速公式 MSG1[0] = (rpm1000000)+0x30 將結果存入字串 MSG1 中 MSG1[1] = ((rpm1000000)100000)+0x30 MSG1[2] = ((rpm100000)10000)+0x30 MSG1[3] = ((rpm10000)1000)+0x30 MSG1[4] = 0x2e MSG1[5] = ((rpm1000)100)+0x30 MSG1[6] = ((rpm100)10)+0x30 MSG1[7] = rpm10+0x30

65

void WriteIns(char instruction) 寫命令至 LCD 中 RS = 0 選擇指令暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = instruction 輸出命令至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteData(char i) 寫資料至 LCD 中 RS = 1 選擇資料暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = i 輸出資料至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteString(countMSG) 寫字串至 LCD 中 char count 字串長度 char MSG[] 字串資料 char i 定義位元組變數 for(i=0 iltcount i++) count 個位元組 WriteData(MSG[i]) 寫入一位元組的資料至 LCD 中 void CheckBusy(void) char i=0x80 檢查忙碌旗標 while(iamp0x80) 忙錄旗標 BF = 1 RS = 0 選擇指令暫存器 RW = 1 讀取 Enable = 1 致能 LCD i = P2 讀取 LCD 指令暫存器內的資料

66

Enable = 0 除能 LCD delay() 延遲函數 void delay() 延遲 5ms int i for(i=0 ilt250 i++)

  • 畢業專題封面pdf
  • File0004pdf
  • 最終版pdfpdf
Page 73: Based on Fuzzy Control Theorem and TPWM Method for DC ... · 使吾人想設計一模糊控制器來做為馬達轉速的閉迴路控制,以解決非線性系統的 問題。除此之外,flcs

64

void InitialLCD(void) 設定 LCD 模組初始狀態 delay() 延遲函數 WriteIns(0x38) 設定 LCD 模組為 WriteIns(0x38) 2 行顯示 WriteIns(0x38) 8 位元介面 WriteIns(0x38) 5x7 點字型 WriteIns(0x08) 關閉顯示器 WriteIns(0x01) 清除 LCD 螢幕 WriteIns(0x0c) 令顯示器 ON但游標不顯示 WriteIns(0x06) 令 LCD 模組每接收到 1Byte 資料 AC 值自動加 1 void display() 掃描顯示 WriteIns(0x80) 設定 LCD 座標 WriteString(13MSG0) 將字串 MSG0 寫入 LCD 中 WriteIns(0xc0) 設定 LCD 座標 WriteString(8MSG1) 將字串 MSG1 寫入 LCD 中 WriteIns(0xc8) 設定 LCD 座標 WriteString(4MSG2) 將字串 MSG2 寫入 LCD 中 void convert(void) 換算轉速 long int freq freq = ((value)4000) - 16000 數位資料換成頻率公式 rpm = freq3 頻率換算轉速公式 MSG1[0] = (rpm1000000)+0x30 將結果存入字串 MSG1 中 MSG1[1] = ((rpm1000000)100000)+0x30 MSG1[2] = ((rpm100000)10000)+0x30 MSG1[3] = ((rpm10000)1000)+0x30 MSG1[4] = 0x2e MSG1[5] = ((rpm1000)100)+0x30 MSG1[6] = ((rpm100)10)+0x30 MSG1[7] = rpm10+0x30

65

void WriteIns(char instruction) 寫命令至 LCD 中 RS = 0 選擇指令暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = instruction 輸出命令至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteData(char i) 寫資料至 LCD 中 RS = 1 選擇資料暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = i 輸出資料至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteString(countMSG) 寫字串至 LCD 中 char count 字串長度 char MSG[] 字串資料 char i 定義位元組變數 for(i=0 iltcount i++) count 個位元組 WriteData(MSG[i]) 寫入一位元組的資料至 LCD 中 void CheckBusy(void) char i=0x80 檢查忙碌旗標 while(iamp0x80) 忙錄旗標 BF = 1 RS = 0 選擇指令暫存器 RW = 1 讀取 Enable = 1 致能 LCD i = P2 讀取 LCD 指令暫存器內的資料

66

Enable = 0 除能 LCD delay() 延遲函數 void delay() 延遲 5ms int i for(i=0 ilt250 i++)

  • 畢業專題封面pdf
  • File0004pdf
  • 最終版pdfpdf
Page 74: Based on Fuzzy Control Theorem and TPWM Method for DC ... · 使吾人想設計一模糊控制器來做為馬達轉速的閉迴路控制,以解決非線性系統的 問題。除此之外,flcs

65

void WriteIns(char instruction) 寫命令至 LCD 中 RS = 0 選擇指令暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = instruction 輸出命令至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteData(char i) 寫資料至 LCD 中 RS = 1 選擇資料暫存器 RW = 0 寫入 Enable = 1 致能 LCD P2 = i 輸出資料至 LCD 中 Enable = 0 除能 LCD CheckBusy() 檢查 LCD 忙碌旗標 void WriteString(countMSG) 寫字串至 LCD 中 char count 字串長度 char MSG[] 字串資料 char i 定義位元組變數 for(i=0 iltcount i++) count 個位元組 WriteData(MSG[i]) 寫入一位元組的資料至 LCD 中 void CheckBusy(void) char i=0x80 檢查忙碌旗標 while(iamp0x80) 忙錄旗標 BF = 1 RS = 0 選擇指令暫存器 RW = 1 讀取 Enable = 1 致能 LCD i = P2 讀取 LCD 指令暫存器內的資料

66

Enable = 0 除能 LCD delay() 延遲函數 void delay() 延遲 5ms int i for(i=0 ilt250 i++)

  • 畢業專題封面pdf
  • File0004pdf
  • 最終版pdfpdf
Page 75: Based on Fuzzy Control Theorem and TPWM Method for DC ... · 使吾人想設計一模糊控制器來做為馬達轉速的閉迴路控制,以解決非線性系統的 問題。除此之外,flcs

66

Enable = 0 除能 LCD delay() 延遲函數 void delay() 延遲 5ms int i for(i=0 ilt250 i++)

  • 畢業專題封面pdf
  • File0004pdf
  • 最終版pdfpdf