① 單片機AD轉換問題。
1,什麼是AD轉換?
A是模擬信號的意思,D是數字信號的意思,AD轉換就是模數轉換,顧名思義,就是把模擬信號轉換成數字信號,例如把電壓值轉化為數字信號。
2,為什麼要AD轉換?
單片機(以及其他處理器)只能處理數字信號,當單片機想要獲取電路上某一點的電壓值時,就得用到AD轉換了,如果你直接把單片機的引腳接到電路這個點上,單片機只知道這個點的電壓是低電平還是高電平,又怎麼能得到他的電壓值呢?例如數字式的萬用表,它測量電壓時,先有一個AD轉換電路,把電壓值轉換成一個數值,然後把這個值送個單片機(當然萬用表裡的用的處理晶元不是單片機),單片機經過計算處理後,再把這電壓值顯示到顯示到屏幕上。
不過現在有一些比較強的單片機,其內部已經集成了AD轉換器,不需要你再外接AD轉換晶元。
3,8位16位的ad轉換晶元是什麼意思?
8位,16位就代表了AD轉換晶元的轉換解析度,數字越大,解析度越高,同時也反映了它的精度,數字越大,精度相對也越高。8位算是最低了,有些單片機里集成的AD轉換器一般是10位的。12位和16位的晶元價格就比較貴了。
4,解析度?
舉個簡單的例子,8位晶元只能轉換最小到0.01V的電壓,而12位的晶元卻能轉換最小到0.001V的電壓,如果一個電壓為3.359V,8位晶元轉出來後的數值是3.35V,12位晶元轉換出來後是3.359V,精度比8位就高一個檔次了。(注:這里數值不是正確的數值,舉例用,切勿實際使用)
5,采樣?
采樣是AD轉換的速度性能指標,通俗的說就是每秒里能采樣多少次,采樣次數越高晶元性能越好。如果對采樣不理解,也可以用另一種方式理解,就是一個AD轉換芯把電壓值轉換成數字值這個過程所需要的時間,時間越短越好。
6,精度?
精度是AD晶元的一個重要參數,表示採集到的數據和真實值之間的相差的程度。例如單片機轉換出來的結果是0.3V,而實際可能是0.31V,這樣就相差了0.01V。這種誤差是不可避免無法消除的。這和在第3點中提到的位數有關,位數越高,這樣的誤差越小。
7,這些知識點在「數字電路基礎」一書中有詳細解釋,說明你數字電路沒學好,自己好好加油了。
② 單片機 時鍾頻率,振盪頻率,方波,脈沖,之間關系
先說方波,方波一般從名字上就可以看出是什麼意思,看圖就知道了,就是像長城牆的那個
那究竟什麼是脈沖?從字面上理解——脈搏的跳動所產生的沖擊波。脈沖的定義其實是這樣的:電壓(V)或電流(A)的波形象心電圖上的脈搏跳動的波形但現在聽到的什麼電源脈沖、聲脈沖……又作何解釋呢——脈沖的原意被延伸出來得:隔一段相同的時間發出的波等機械形式,學術上把脈沖定義為:在短時間內突變,隨後又迅速返回其初始值的物理量稱之為脈沖。
在數字電路裡面一般就把一個凸起的方波叫脈沖。
單片機的機構特徵是將組成計算機的基本部件集成在一塊晶體晶元上,構成一台功能獨特的,完整的單片微型計算機。它的英文名是MCU(microcontrollerunit)微型控制單元。
單片機的工作需要時鍾信號,時鍾信號是時序邏輯的基礎,它用於決定邏輯單元中的狀態何時更新。時鍾信號是指有固定周期並與運行無關的信號量,時鍾頻率(clockfrequency,CF)是時鍾周期的倒數。
也可以說時鍾頻率越高,CPU或者單片機運行的越快。
而振盪頻率一般就是指振盪電路的頻率,由於時鍾信號是由振盪電路產生的,所以一般振盪頻率等於時鍾頻率
③ stc系列單片機_μC/OS-Ⅱ在C8051F系列單片機上的移植及其應用系統開發
隨著微處理器技術的飛速發展和嵌入式系統實時性要求的不斷提高,應用實時多任務操作系統(RTOS)作為嵌入式設計的開發平台已逐步成為嵌入式應用設計的主流。本研究討論將μC/OS-Ⅱ移植到C8051F系列高性能8位單片機中,並以C8051F060為例闡述了其應用系統的開正基發過程。
一、μC/OS-Ⅱ的基本工作原理
1.任務管理
µC/OS-II中的任務可以是一個無限的循環,也可以在一次執行完畢後被「刪除」掉,即該任務可以認為CPU完全屬於該任務本身,實時應用程序的設計過程包括將問題分割為多個任務。µC/OS-II可以管理64個任務,每個任務有一定的優先順序,且優先順序不重復。
2.任務調度機制的實現
µC/OS-II是可剝奪型內核,優先順序高的任務一旦就緒就能剝奪優先順序較低任務的CPU使用權,這提高了系統的實時響應能力。在沒有中斷情況下,任務間的切換一般會調用OSSched()函數。µC/OS-II的中斷服務子程序和一般前/後台的操作有所不同。
3.任務之間的通信
在µC/OS-II中,可以通過信號量、消息郵箱和消息隊列等機制,實現數據共享和任務通信。消息郵箱用一個指針型變數,一個任務或一個中斷服務子程序通過內核服務,將一則消息放入郵箱,一個或多個任務通過內核服務接受這則消息。每個郵箱有相應的等待消息任務表,等待消息的任務在無消息時被置掛起態,並記入郵箱等待消息任務表中。消息放入郵箱,內核將運行等待消息任務表中優先順序最高的任務。
二、移植及應用
C8051F060系列單片機特別適舉數謹用於任務繁重的小型化測控系統。當晶元具有的功能被較多地使用時,系統要處理的任務就較多,編程頭緒也多。為了簡化應用程序實現程序模塊化,提高應用程序的實時性和可靠畢納性,將μCOS2Ⅱ移植到C8051F060中就成為一件很有意義的事。
1.µC/OS-II的移植
(1)修改INCLUDES.H文件:增加的頭文件放在頭文件列表的最後。
#include "os_cpu.h"
#include "os_cfg.h"
#include "ucos_ii.h"
(2)修改OS CPU.H文件:為確保系統在KEIL環境下正常運行,重新定義了一系列與C8051F060和KEIL編譯器相關的數據結構、宏和常數。
typedef unsigned char OS_STK;/*定義堆棧寬度為8位*/
typedef unsigned char OS_CPU_SR;
#define OS_ENTER_CRITICAL() EA="0"
#define OS_EXIT CRITICAL()EA="1"
(3)修改OS_CPU_A.ASM文件
①編寫OSSTartHihgRdy()函數:獲得將要恢復運行的就緒任務的堆棧映像的最低地址,並計算出堆棧長度,然後向系統堆棧復制數據、堆棧指針SP和堆棧映像指針?C_XBP,最後利用中斷返回。
②編寫OSCtxSw()函數:先從當前任務的TCB控制塊中獲得當前任務堆棧長度和堆棧映像指針,然後將系統堆棧的內容復制到任務堆棧映像,最後獲得將要恢復運行的就緒任務的TCB,程序跳至OSSTartHihgRdy()函數的入口,實現任務的切換。
③編寫OSIntCtxSw()函數:代碼大部分與OSCtxSw()相同,不同之處在於此處不需要再保存寄存器;需要調整堆棧指針(SP=SP-4),去掉在調用OSIntExit(),OSIntCtxSw()中壓入堆棧中的多餘的內容,以使堆棧中只包含任務的運行環境。
④編寫OSTickISR()函數:用定時器0作中斷源,初始化定時器0使系統每秒中斷100次,節拍率Tick=100次/秒。
(4)修改OS_CPU_C.C文件:編寫OSTaskStkInit()函數用來初始化堆棧。
2. 基於µC/OS-II的C8051F060應用系統開發
移植了µC/OS-II的C8051F060的每個功能都可以作為一個獨立的任務,每個任務都有自己的堆棧空間,可以被其他任務和中斷服務程序掛起。在設計中,主函數均以OSInit()開始,以OSStart()結束,中間部分為與硬體相關的系統初始化函數。對於任務的建立,必須依照µC/OS-II系統中建立任務的格式,根據自己的需求來確定任務的個數,並且根據任務的重要程度和被調用的頻率來設置好優先順序。創建好任務後,在主函數外面分別列出各個任務函數,每個任務函數都是一個無限循環程序,調用實現某些功能的應用程序函數,然後按設計的需求設置掛起方式和掛起時間。
應用系統測試程序實現了6個任務:Task1是每1s發送CAN數據包,Task2是處理CAN接收到的數據,Task3是每3s發送串口數據,Task4是處理串口接收到的數據,Task5是處理按鍵信息,Task6是顯示數據。CAN匯流排接收採用中斷方式,其優先順序高於其他任務,為了保證系統的實時性,在中斷程序中不處理數據,只是發送一個信號量,在Task2中處理CAN數據。串口數據接收亦採用中斷方式,其優先順序低於CAN高於其他任務。串口數據發送採用的是查詢方式,按位元組發送。程序中設置6個任務的優先順序依次為13,11,14,12,15,16。
在主程序中,首先初始化C8051F060和CAN,調用OsInit();然後調用API函數,創建6個任務(不包括空閑任務);再創建一個信號量CAN_EVENT,為中斷與Task2通信所用;最後調用OSStart(),OS系統開始運行優先順序最高的任務。Task2的優先順序最高,但是在沒收到CAN_EVENT之前,任務一直處於休眠狀態,當CAN接收器收到數據包後,Task2進入就緒態,在中斷返回時,進行任務切換,執行優先順序最高Task2。在Task2還未收到信號量之前,Task1、Task3、Task4、Task5和Task6根據時間延時和優先順序的不同各自獨立運行。
三、結束語
將編寫的測試程序下載到C8051F060應用系統中進行了實際的運行測試,測試表明,基於µC/OS-II的C8051F060應用系統中的各任務工作穩定可靠,取得了滿意的效果,為進行嵌入式應用系統的進一步設計奠定了基礎。
(作者單位:黑龍江省大慶職業學院)
註:本文中所涉及到的圖表、註解、公式等內容請以PDF格式閱讀原文
本文為全文原貌 未安裝PDF瀏覽器用戶請先下載安裝 原版全文
④ 單片機STC89C52如何採集毫伏級電壓信號
用模擬電路的放大信號的辦法(其實絕大部分感測器過來的信號都需要放大才能給MCU使用,MCU在做A/D轉換,最後根據A/D結果執行你的要求,所以這個是一個根本方法)。至於怎麼放大,那就是看模擬電路的硬體知識了。如果你是毫伏級的電壓信號。你可以用集成運算放大器放大。我不知道你的毫伏級到底是多少?所以只能做一個假設:感測器沒有接到輻射時輸出電壓是0v,接到輻射時電壓假定你最大是100mv。所以你的輸入信號量是0~100mv。單片機I/O口能承受的電壓一般是5v(也有3.3v的,假設是5v)那麼你需要把100mv信號放大到5v。就是放大50倍。最簡單的方法你可以用一個同相放大器放大50倍。(因為你信號是正的,如果是負的你可以用反相放大器放大),這裡面其實還有很多問題,比如A/D轉換的精度問題,你信號源干擾問題,如果要求高,運放的選擇和電路的設計都是很大的問題。同相放大器只是一種基本放大器而已。如果雜訊大,你還有可能用差分放大器。用各種抗干擾的措施。模擬電路的知識很復雜的。當然如果簡單的,你就直接用同相放大或者反相放大就行了。要看具體要求的,不能一概而論。