http://chamberplus.myweb.hinet.net/
<<前言>>: 我學單晶片就是從引擎控制器的單晶片先碰起,也不知是福或是禍?學的是很辛苦,但也很榮幸能接觸到這麼高深的程式的技巧,尤其是看到老外他們寫的程式之後,對我寫單晶片程式功力,奠下不錯的基礎,所以是蠻值得闢一討論天地來討論。
我想車用電子控制單元(ECU)這種東西,以硬體來看是容易想出他的架構!但真正比較有學問的東西,還是在軟體方面!基本他是個單晶片!但連個簡單的點火控制,可能都不好搞得定~舉個簡單的例子: 寫單晶片程式對我們來說:20usec 沒什麼~當然有些單晶片速度不夠的~以單缸二行程引擎來說:
20 uSec 在rpm =1000 時的點火誤差是:0.12 度!
在 rpm = 6000 時,誤差卻放大到 0.72 度!
引擎很討厭的是:一旦您點火正時跑掉,他就雞生蛋,蛋生雞...的一直不穩! 所以,作這種東西還是要有點機電整合的觀念!
機:就是有引擎燃燒的感覺!
電:就是要有類似單晶片中 Timer/Counter 的觀念!
(零) 單晶片與引擎控制 --- Q & A集錦
(一) 單晶片與引擎控制 (一)--- 前言
(二) 單晶片與引擎控制 (二)--- 數學篇
(三) 單晶片與引擎控制 (三)--- 歷史篇
(四) 單晶片與引擎控制 (四)--- 國內歷史篇
(五) 單晶片與引擎控制(五) -- 點火系統概念篇
(六) 單晶片與引擎控制(六) -- 點火系統微控器篇
(七) 單晶片與引擎控制(七) -- 噴油系統概念篇
單晶片與引擎控制(二) -- 數學篇
以前唸書時,老師一直跟我們說要寫程式要念好數學,念工程數學時,也沒特別的感覺~後來寫論文時,因為題目也是跟數值分析有關的,還是對數學與程式的關係也一直搭不起!
後來,就是看了引擎控制單晶片程式時,才恍然大悟。我相信大多數的寫單晶片程式的人或許多體會過我前面的那種感覺。或許大家後來也習慣用C高階語言寫程式,所以,也沒特別感覺。但是,的確,懂數學對寫程式真的有很大的幫助。
其實,我有在旗標出版的『8051 單晶片徹底研究經驗篇』也有舉一兩個例子。其中,以3.14 圓周率的計算最能解釋這個道理:
(就是這本書,小弟只在裡面插花一下而已!)
方法一:用C直接呼叫浮點運算。這是只會用C的軟體工程師,而非是真正作韌體的工程師。不是不好,只會寫這種程式的工程師不但自己沒有長進外,公司的核心競爭力也沒有。因為,您都得要買比人家高一級的產品(譬如,人家只要用 8KBytes 的ROM Size ,您就非得用 32KBytes;人家用 12 MHz 的8051 跑得嚇嚇叫,您還是得找24MHz 的~)。賣得越多,賺得越少。
方法二:x314/100 = 3.14。這是比較不笨的工程師,但您有沒有想過,314 是大於 256 啊~您還是得呼叫一個 16 位元的乘法?!再來一個 16 位元對固定的 100 (八位元)的除法?!
方法三: *201/64 = *201+右移六次。您覺得您要被訓練多久?才會有這種想法啊?!
以上方法您想到哪一個?!
書中我也附了一個內差公式,說明無須梯形公式也可以算出A/D 對應的物理數值。
書中的標題寫錯了,這不是點火控制器程式,而是一個A/D 的轉換程式,這個程式,可能大家用的機會會很多,一般我們會利用A/D 來讀外面的感測器的值,然後經由公式換算得到一個真正的物理量(如上圖中就是一個溫度感測器的轉換程式),其實有許多感測器都不是很線性(就是有一點二次拋物曲線的樣子),反正不管是不是線性,這個程式都可以適用的。程式裡的 Table 值,就是我們從一個 12 bits 的A/D 讀到的值。所以他的範圍就是在 0~4096 之間,他所對應的物理溫度就是在 0~ 70度之間(以此程式例子來說!),所以我們的程式就是把 12 bits A/D 丟進副程式,傳回物理量的值(您可能要直接顯示在一些Output Device ~)。雖然這個程式是用C語言寫的,但他的語法與邏輯還是依據單晶片八位元的觀念在寫的,沒有複雜的梯型公式,是用數值分析的逼近法來直接求得答案的!版主個人覺得是蠻值得參考價值的,所以當初才把他放在書中提出的,不之各位看官的覺得呢?!
在引擎控制的程式中,這種觀念就一直根深蒂固。尤其,在引擎控制程式裡,會常用到查表功能~就需要常常用到這種內差公式的。所以,若您每段查表都是呼叫梯型公式的話,您的單晶片就算是 ARM 也是會被操得很可憐,更何況人家發展引擎控制器時,那時有八位元的單晶片就要偷笑了,哪來 32 位元的 ARM 啊。
再舉例來說:引擎轉速幾乎是計算所有參數的重要依據。所以,大家也都比較喜歡轉速表的東西。
但是很不幸的是:一般轉速是16 位元的數值。在計算或比大小過程中,對八位元的單晶片是很辛苦的!那我們該如何處理他呢?!學問就在這,16 位元的轉速是『人類』看的!單晶片才未必要看這種數值。
比如要算加速曲線,需要一轉一轉比嗎?!非也!
此時,只需以25 轉或50 轉為單位即可。然後 256 就是代表 6400 或 12500 轉!(也就是紅線區)。
對引擎來說,紅線區不是斷油,就是油門全開,此時燃油也不必精確控制了。那點火角度也類似道理,您若做過機車點火器的就知道了。所以,以 0~255 來計算就輕鬆多了。
當然,有些CAN 或OBD-II 也是有把轉速給傳出來,代表單晶片也有計算此值啊!但他可不是像一般人的觀念,呼叫一個 24 bits/16 bits 的除法器。那鐵定會算到死!(我若記得沒錯,像PIC16 這種連乘法器都沒有的,每呼叫一次就動輒一兩千個 Machine cycle!)所以在單晶片他裡面也有一套數學公式。
其實,這個公式也困擾我好幾年,因為我們一般的平價單晶片的的內部也沒有什麼乘法器或除法器!用高階寫,速度慢,又浪費程式空間,也實在沒解。您看市面上一堆想自製數位轉速表的。
用一棵89C2051 寫完程式就沒什麼好寫了。
後來,我進入IC設計業後,有幸認識一些做過CPU設計的高材生(也是LKK老前輩級的,當然他們也不是很懂引擎或轉速的東西!)把他們唸書時的那種古老的書拿給我K,再跟我說明一些觀念之後,我就把這個困擾多年的問題給解了。(註:這一點是我覺得我蠻幸運的,從單晶片的門外漢,然後一路走來rq還可以與作CPU設計人員一起共事,彼此提供經驗以利發展出新一代的CPU 架構~是蠻Enjoy 這樣的過程,我也希望把這個經驗分享給雷兒協會的伙伴們)
我是不知道作單晶片的各位前輩大哥們,您們都是怎麼處理這個問題的。因為我剛剛有說明,您除了要算 16位元解析度一轉的轉速值外,還要算出 8位元 解析度為25轉的值喔! 您該不會再呼叫一個 16/8 的除法器吧!?當然啊~萬一您又要把這值傳出去又要顯示在LCD 這種東西上。那真的~單晶片就不用作別的事了!(或許很誇張,但引擎控制裡的程式還要算一大堆東西耶~這些還都是物理數學題目,可不是什麼I/O 而已!)
這些都是很基本的問題,單晶片的I/O 及周邊電路當然可以幫您作許多事情,但他最厲害的還是計算能力,但可不是我們『人類』那種十根手指頭的計算方式喔!單晶片是八位元的世界,您就應該轉換成八位元的思考模式,才能寫出有效率的好程式。
其他的數學觀念就像一般作FFT 或Laplace 轉換,他們會存在不是沒道理的。其實,數學是我們在工程上的輔助工具,我們的工程不是專門拿來解複雜數學運算,就算以前我們老同事在作計算機產品*時,也是用數值方法來很快的算出答案的~公式(那種三角函數、面積公式...)這種東西是學校老師拿來考學生的,人類發明數學不是拿來考試用的,而是幫我們解決問題的。如何快速又簡單的運算出一個可以接受的答案是重點。因為畢竟八位元的計算還是有他的極限在的啦。至少以我接觸過的引擎控制程式來說,是這樣子的。
計算機產品* :來講一個笑話,大家都知道現在去大潤發或大賣場買個工程用的機算機,可能都只剩下兩三百塊不到了,裡面卻都要有指數計算啊~三角函數計算啊等等功能一點都不差。卻苦了那些當初的工程師啊~計算機的操作方式千奇百怪,說要測到完全沒問題,那真的是天方夜譚。而這些產品的程式一寫完,可能就好幾百顆IC要出了~誰還管那麼多?!
話說有一天,在公司裡開會無聊把玩著手上這台『大潤發牌』的工程計算機,同事就搶過來,二話不說就來個一大串的公式運算:多少乘多少...再加多少...除以多少...再取函數 #$@....劈哩啪啦按了一大堆,然後等於答案,然後指著小數點第幾位跟我說:喔~這是我們公司IC的產品!!因為答案錯了!! ....我當場傻眼!!天啊~怎麼有這回事?!所以,下次您若要拿這種計算機要去跟人家斤斤計較時,您得要小心喔!
沒有留言:
張貼留言
注意:只有此網誌的成員可以留言。