日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當前位置:首頁 > > 小麥大叔
[導讀]相信很多道友都有對輸入IO 口進行濾波的需求,比如按鍵輸入、紅外對管輸入等。本文以按鍵為例,簡單介紹了如何進行較為高效的濾波。

來源:公眾號【魚鷹談單片機】
作者:魚鷹Osprey
ID ??: emOsprey

相信很多道友都有對輸入IO 口進行濾波的需求,比如按鍵輸入、紅外對管輸入等。這里魚鷹就以按鍵為例介紹如何進行較為高效的濾波。
我們以為接入單片機引腳的按鍵按下后(并彈起)電平變化應(yīng)該是這樣的:
實際上卻是這樣的:
首先思考一個問題,如果沒有進行濾波,會有什么問題?
一次按下過程可能被認為多次按下,因為按下后有抖動過程,這個過程電平并不穩(wěn)定,導致單片機在很短的時間內(nèi)多次檢測到低電平狀態(tài)。這樣一來,本來只按下了一次,程序卻認為按下了多次,這對按鍵功能會產(chǎn)生影響。
如果將按鍵引腳設(shè)置為外部中斷觸發(fā),那么在極短的時間內(nèi)CPU將多次進入中斷,影響中斷的性能(所以對于非數(shù)字接口,即沒有穩(wěn)定的高低電平的接口,如果不需要非常高的實時性,那么魚鷹不建議設(shè)置為外部中斷觸發(fā)方式)。
那么我們該如何進行處理呢?
很自然的,因為按下過程中有抖動期,我們就會想辦法跳過抖動時間,然后再檢測電平變化,所以,V0.1 版本就應(yīng)運而生,這也是郭天祥老師告訴我們 初學者最簡單易懂的方式:
V0.1
    
typedef enum { KEY_LEVEL_DOWN, // 假設(shè)低電平為按下 KEY_LEVEL_UP, }KeyLevelTypedef;
KeyLevelTypedef get_key_level() { return (KeyLevelTypedef)HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0); }
// V0.1 void key_scan() { // 歡迎關(guān)注:魚鷹談單片機 if(get_key_level() == KEY_LEVEL_DOWN) { HAL_Delay(20); // 假設(shè)抖動時間 20 ms if(get_key_level() == KEY_LEVEL_DOWN) { key_flag = 1;// 按鍵按下標志位 } } }
對于初學者而言,這段代碼簡單易懂,但是對于工作多年的人來說,這種方式效率極其低下。
有可能你會說,如果使用操作系統(tǒng),當延時函數(shù)使用 系統(tǒng)延時,那么這段時間就可以切換到其他任務(wù)進行處理,而不會浪費CPU使其空轉(zhuǎn)了。但是如果這個任務(wù)本身功能比較復(fù)雜,那么這種處理會 嚴重影響其他功能的執(zhí)行,所以這種代碼應(yīng)該不會出現(xiàn)在工作多年的工程師手中。
那么是否有更高效的方式呢?
有,就是記錄前后兩次電平的變化,通過比較兩次電平是否相等來確定電平是否穩(wěn)定(這個方式在《延時功能進化論(合集)》有做簡單介紹)。
V 1 . 0

    
typedef enum { KEY_STATE_IDLE, // 按鍵空閑 KEY_STATE_DOWN, // 按鍵按下 KEY_STATE_FINISH, // 按鍵處理完成(由應(yīng)用程序設(shè)置) }KeyStateTypedef;
KeyStateTypedef key_state; KeyLevelTypedef key_last_level; // 上次電平狀態(tài)
// V1.0 // 函數(shù)調(diào)用周期 20 ms(如何實現(xiàn)應(yīng)該不需要再說明了吧) void key_scan() { // 歡迎關(guān)注:魚鷹談單片機 KeyLevelTypedef temp; // 可不可以不使用這個中間變量? temp = get_key_level(); if(temp != key_last_level){ key_last_level = temp; return; } // 當運行到這里,說明電平已經(jīng)穩(wěn)定下來了 if(temp == KEY_LEVEL_DOWN){ if(key_state == KEY_STATE_IDLE){ // 確保曾經(jīng)釋放過按鍵,這樣可以保證在按下時不會不停設(shè)置該標志位 key_state = KEY_STATE_DOWN;// 按鍵按下標志位 } } else{ if(key_state == KEY_STATE_FINISH){ // 防止多線程情況下同時修改 key_state = KEY_STATE_IDLE; // 釋放按鍵 } } }
在這里,使用了兩個全局變量,一個是 key_state,一個是 key_last_level。
前者共三種狀態(tài),這是為了防止按鍵掃描和按鍵處理程序不是順序執(zhí)行而設(shè)定的。當你按下按鍵后,保證按鍵處理程序必然可以得到按下狀態(tài),同時只有釋放了按鍵之后才可以更改狀態(tài)位,然后才能再次觸發(fā)。
這樣可以保證按鍵掃描和按鍵處理得以順序執(zhí)行(這里面的關(guān)系需要考慮清楚,否則的就會寫出有 BUG 的程序)。
而后者只在本函數(shù)使用,所以不存在使用風險(前提是沒有多個任務(wù)同時調(diào)用該函數(shù),否則照樣有風險)。
可以看到該代碼沒有任何延時函數(shù),簡單、高效,當然這里有一個前提,那就是該函數(shù)的 調(diào)用周期必須大于抖動時間,但是也別太長,否則實時性不好。
假設(shè)抖動期時間為 20 ms,實現(xiàn) 20 ms 的調(diào)用周期有很多種方法:
1、中斷定時器定時調(diào)用
2、軟件定時器調(diào)用(需操作系統(tǒng))
3、線程內(nèi)周期執(zhí)行該函數(shù)(需操作系統(tǒng))
4、使用魚鷹介紹的方式(《延時功能進化論之V2.5~V2.7(魚鷹強烈建議)》)
我們再次看這個圖:
如果我們使用 V1.0 的方式,我們就會發(fā)現(xiàn),當程序運行在抖動期,因為函數(shù)調(diào)用的時間大于抖動時間,那么程序總是可以得到穩(wěn)定后的狀態(tài)。
比如空閑狀態(tài)下(key_last_level為高電平),突然按下按鍵,假設(shè)在 抖動中期程序檢測到 高電平,那么20 ms 后檢測的是 低電平,顯然這是不相等的(key_last_level更新為低電平),那么程序就會執(zhí)行下一次,下一次即40 ms 后檢測肯定是低電平(如果不是,說明電平不穩(wěn)定),此時電平相等,即可認為電平穩(wěn)定了。
而如果在 抖動中期程序檢測到 低電平,那么20 ms 后檢測的應(yīng)該還是低電平,那么程序認為此時電平已經(jīng)穩(wěn)定了,那也沒有問題,因為它已經(jīng)跳過了抖動期。
V 2 . 0
如果說,濾波只有按鍵這種抖動的話,那么上述方式應(yīng)該算很不錯了,但有時對IO濾波的需求比較復(fù)雜,那么上述方式只可參考,不可直接拿來對任何 IO 進行濾波。
而且很多時候,程序需要定時檢測多個 IO 的電平狀態(tài),當電平發(fā)生變化時,我們能及時通知應(yīng)用層,而且 只在電平發(fā)生變化時才進行通知。但與此同時我們需要在 電平穩(wěn)定之后才通知,而不是變化后馬上進行通知,否則可能在電平抖動時多次通知。
所以針對這種需求,我們需要設(shè)計一個更加通用一些的濾波函數(shù),能應(yīng)對所有 數(shù)字 IO 的濾波(包括按鍵)。
其實按鍵濾波已經(jīng)包含了濾波思想,只是不夠通用,需要進一步改進。
typedef enum { LEVEL_LOW, // LEVEL_HIGH, }LevelTypedef;
typedef struct { uint32_t last_time; // 上次時間 ????LevelTypedef?last_level;?//?上次電平狀態(tài)}FilterParaTypedef;
// V2.0// para 濾波變量,level 當前檢測電平狀態(tài), time 當前時間戳,單位 1 ms, stable_time希望電平穩(wěn)定的時間uint8_t filter(FilterParaTypedef *para, LevelTypedef level, uint32_t time, uint32_t stable_time){ // 歡迎關(guān)注:魚鷹談單片機 if(level != para->last_level){ para->last_level = level; // 更新當前電平狀態(tài) para->last_time = time; // 更新電平變化的時刻 return 0; // 電平未穩(wěn)定 } if(time - para->last_time > stable_time){ // 這兩個條件可以放在一起進行 && 判斷嗎? return 1; // 需要上報 ???} return 0; // 電平穩(wěn)定時間不夠長}
這個代碼的思想就是, 當電平不穩(wěn)定時,更新當前時間戳,一旦電平不再變化,并且持續(xù)的時間夠長(這個時間由用戶決定),那么返回 1 表示電平已經(jīng)穩(wěn)定了(這個函數(shù)沒有調(diào)用周期限制,調(diào)用周期不同,會產(chǎn)生一些影響,這個和濾波時間精度有關(guān))。
這個代碼看起來挺簡單的,也好像沒啥問題,但實際上是存在問題的。
看到那個穩(wěn)定時間判斷條件了嗎?如果下次繼續(xù)執(zhí)行這個函數(shù),那么程序依然返回 1,所以它總是會在穩(wěn)定后不停的返回 1(判斷條件總是成立),這樣一來,這個函數(shù)并不能實現(xiàn)電平變化后才進行通知,也就是說調(diào)用者無法通過返回值直接決定下一步動作。
可能你會說,如果在返回 1 之前先更新一下時間戳呢?看過魚鷹之前筆記的應(yīng)該知道,這種方式會 周期性返回 1,即如果希望電平穩(wěn)定時間為 10 ms,那么在電平穩(wěn)定后,每隔 10 ms 返回 1,這是我們不希望看到的。
那么有沒有什么解決辦法呢?當然。
因為我們只希望在變化之后再穩(wěn)定時才返回1,即我們既希望短暫電平變化并不返回1,而那些長時間穩(wěn)定的電平能在穩(wěn)定時間閾值之后返回1,又希望在穩(wěn)定之后 只返回一次 1,之后電平變化后如果再次穩(wěn)定才返回1。
有點繞口,看圖好了:
因為目前判斷條件總是返回1,所以我們需要增加限制條件,讓它不總是返回1。
簡單的辦法是,增加一個變量,用于記錄上次的穩(wěn)定后的電平,比如這樣:
typedef enum { LEVEL_LOW, // LEVEL_HIGH, }LevelTypedef;
typedef struct { uint32_t last_time; // 上次時間 LevelTypedef last_level; // 上次電平狀態(tài) LevelTypedef last_stable_level; // 上次穩(wěn)定的電平狀態(tài) }FilterParaTypedef;
// V2.0// para 濾波變量,level 當前檢測電平狀態(tài), time 當前時間戳,單位 1 ms, stable_time希望電平穩(wěn)定的時間uint8_t filter(FilterParaTypedef *para, LevelTypedef level, uint32_t time, uint32_t stable_time){ // 歡迎關(guān)注:魚鷹談單片機 if(level != para->last_level){ para->last_level = level; // 更新當前電平狀態(tài) para->last_time = time; // 更新電平變化的時刻 return 0; // 電平未穩(wěn)定 } if(time - para->last_time > stable_time){ // 這兩個條件可以放在一起進行 && 判斷嗎? if(level != para->last_stable_level) { // 電平穩(wěn)定時間夠長且電平發(fā)生了變化 para->last_stable_level = level; return 1; // 需要上報 } } return 0; // 電平穩(wěn)定時間不夠長}
這樣一來,下一次繼續(xù)執(zhí)行時,就不會再次返回1了。
但是以上代碼其實是有一個隱含問題的,那就是如果兩次長時間電平之間有一個短時間的不同電平存在,那么也只會上報一次,即返回一次1,即如下情況:
如果說這是你想要的效果,那么恭喜你,你不用更改代碼;但如果這不是你想要的結(jié)果,那這個代碼就存在BUG,畢竟變化的時間雖然短,但還是變化了的嘛(這個問題稍后討論)。
還有一個問題,看過魚鷹以前筆記的人都知道,這種計時方式是存在問題的,因為如果你的電平穩(wěn)定時間很長,長到四字節(jié)計時器溢出了,那么就可能出問題。
不過在這里,即使出現(xiàn)溢出,也沒關(guān)系,結(jié)果是一樣的,因為如果電平穩(wěn)定時間很長了,那么肯定已經(jīng)上報過一次了,后面肯定也不需要再次上報了。
V 2 . 5
V2.0方式確實很高效,但是為了只在變化時上報一次,就要增加一個變量還是很不爽的,如果說魚鷹沒有找到好的方式,那么魚鷹會采用的,但湊巧的是,魚鷹想到了更好的方式,不需要增加這個變量也能達到效果。
一個用于計時,一個用于記錄上次電平,這兩個變量肯定是不可或缺的。但是如果你仔細思考一下,就會發(fā)現(xiàn),所謂的記錄上次電平,其實是在變化時就被快速更改了的,它記錄的是實時電平變化,而計時是在變化后更新時間戳,穩(wěn)定時判斷穩(wěn)定時間,如果我們把計時順序換一下,會如何呢?
即,穩(wěn)定時更新時間戳,變化時判斷穩(wěn)定時間,而記錄電平的變量 只記錄已穩(wěn)定的電平,會怎么樣?
typedef struct { uint32_t last_time; // 上次時間  LevelTypedef last_stable_level; // 上次穩(wěn)定的電平狀態(tài) }FilterParaTypedef;
// V2.5// para 濾波變量,level 當前檢測電平狀態(tài), time 當前時間戳,單位 1 ms, stable_time希望電平穩(wěn)定的時間uint8_t filter(FilterParaTypedef *para, LevelTypedef level, uint32_t time, uint32_t stable_time){ // 歡迎關(guān)注:魚鷹談單片機 if(level != para->last_stable_level){ if(time - para->last_time > stable_time) { para->last_stable_level = level; // 如果這次電平穩(wěn)定時間足夠長,那么記錄這次穩(wěn)定的電平 return 1; // 上報 } return 0; // 不上報,同時不更新時間戳(穩(wěn)定時間不夠) }
para->last_time = time; // 不斷更新電平穩(wěn)定時間,保存電平穩(wěn)定時的時間戳 return 0; // 不上報}
上面的代碼比V2.0簡單了許多,但也稍微難理解,但如果你仿真測試一番,其實也容易理解。
測試代碼(rt_tick_get() 函數(shù)用于獲取當前時間,單位 ms):
FilterParaTypedef FilterPara;
void task(void *parameter){ while(1) { LevelTypedef temp = (LevelTypedef)HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0); if(filter(&FilterPara, temp, rt_tick_get(), 100)) { rt_kprintf("stable level is %u\n",temp); } rt_thread_delay(5); } }
當你修改PB0電平時,可得到如下測試結(jié)果:
在這個例子中,要求電平穩(wěn)定時間20 ms,而線程的執(zhí)行周期為 5 ms,即電平采樣率為5 ms,當你的手速點擊足夠快時(如果不夠快,可以加長 20 ms),那么應(yīng)該不會有任何打印信息輸出。
需要注意的是,采樣率比較關(guān)鍵,如果電平變化快,而采樣率設(shè)置的不合適,那么不能完全反應(yīng)外界引腳電平的變化,這個和“香農(nóng)定理”有關(guān),超出魚鷹的范圍,就不多說了。
V 3 . 0
有的時候需求可能要求只需要穩(wěn)定一個高電平或者低電平才上報,其他時候不上報,那么該如何修改V2.5的代碼呢?
上報時加入限制條件即可,如下所示:
// V3.0// para 濾波變量,level 當前檢測電平狀態(tài), time 當前時間戳,單位 1 ms, stable_time希望電平穩(wěn)定的時間uint8_t filter(FilterParaTypedef *para, LevelTypedef level, uint32_t time, uint32_t stable_time){ // 歡迎關(guān)注:魚鷹談單片機  if(level != para->last_stable_level){ if(time - para->last_time > stable_time) { para->last_stable_level = level; // 如果這次電平穩(wěn)定時間足夠長,那么記錄這次穩(wěn)定的電平 if(level == LEVEL_HIGH) // LEVEL_HIGH 可以作為 para 的成員變量參數(shù)傳入,方便適應(yīng)其他電平  { return 1; // 上報 }  }  return 0; // 不上報,同時不更新時間戳(穩(wěn)定時間不夠) }
para->last_time = time; // 不斷更新電平穩(wěn)定時間,保存電平穩(wěn)定時的時間戳 return 0; // 不上報}
這樣一來,只會在高電平穩(wěn)定時才會進行上報,而低電平卻不會上報。但是這種方式同樣有一個 隱藏限制,那就是 低電平必須能穩(wěn)定一段時間,否則下次高電平無法上報,照樣有 V2.0 的限制,如何打破這種限制呢?
V 3 . 1
如果我們的需求是,變化后高電平穩(wěn)定時上報一次,如果之后存在低電平,然后又變?yōu)楦唠娖?,并且穩(wěn)定了,那么希望也能上報,那該如何處理呢?
代碼如下:
// V3.1// para 濾波變量,level 當前檢測電平狀態(tài), time 當前時間戳,單位 1 ms, stable_time希望電平穩(wěn)定的時間uint8_t filter(FilterParaTypedef *para, LevelTypedef level, uint32_t time, uint32_t stable_time){ // 歡迎關(guān)注:魚鷹談單片機  if(level != para->last_stable_level){ if(level != LEVEL_HIGH) // LEVEL_HIGH 可以作為 para 的成員變量參數(shù)傳入,方便適應(yīng)其他電平 { para->last_stable_level = level; // 快速切換狀態(tài) // para->last_time = time; // 是否有必要同時更新時間戳呢? } else if(time - para->last_time > stable_time) { para->last_stable_level = level; // 如果這次電平穩(wěn)定時間足夠長,那么記錄這次穩(wěn)定的電平 if(level == LEVEL_HIGH) // LEVEL_HIGH 可以作為 para 的成員變量參數(shù)傳入,方便適應(yīng)其他電平  { return 1; // 上報 }  }  return 0; // 不上報,同時不更新時間戳(穩(wěn)定時間不夠) }
para->last_time = time; // 不斷更新電平穩(wěn)定時間,保存電平穩(wěn)定時的時間戳 return 0; // 不上報}
V 3 . 2
為了讓這個濾波代碼(事實上已經(jīng)不僅僅承擔濾波功能,同時承擔了變化并穩(wěn)定后上報功能)更加通用,可以這樣設(shè)計:
typedef enum { LEVEL_LOW, // LEVEL_HIGH, }LevelTypedef;
typedef struct { uint32_t last_time; // 上次時間 LevelTypedef last_stable_level; // 上次穩(wěn)定的電平狀態(tài) LevelTypedef filter_level; // 希望濾波的電平}FilterParaTypedef;
// V3.2// para 濾波變量,level 當前檢測電平狀態(tài), time 當前時間戳,單位 1 ms, stable_time希望電平穩(wěn)定的時間uint8_t filter(FilterParaTypedef *para, LevelTypedef level, uint32_t time, uint32_t stable_time){ // 歡迎關(guān)注:魚鷹談單片機 if(level != para->last_stable_level){ if(level != para->filter_level) // LEVEL_HIGH 可以作為 para 的成員變量參數(shù)傳入,方便適應(yīng)其他電平 { para->last_stable_level = level; // 快速切換狀態(tài) // para->last_time = time; // 是否有必要同時更新時間戳呢? } else if(time - para->last_time > stable_time) { para->last_stable_level = level; // 如果這次電平穩(wěn)定時間足夠長,那么記錄這次穩(wěn)定的電平 if(level == para->filter_level) // LEVEL_HIGH 可以作為 para 的成員變量參數(shù)傳入,方便適應(yīng)其他電平 { return 1; // 上報 } } return 0; // 不上報,同時不更新時間戳(穩(wěn)定時間不夠) }
para->last_time = time; // 不斷更新電平穩(wěn)定時間,保存電平穩(wěn)定時的時間戳 return 0; // 不上報}
因為函數(shù)沒有全局變量,所以可以認為它是一個可重入函數(shù)(前提是傳入的參數(shù)指針地址不同),可放心使用。
以上就是魚鷹能想到的比較高效的濾波方式,可以參考借鑒一番。當然,如果你有更好的方式,不如留言交流。


—— The End?—

推薦好文 ??點擊藍色字體即可跳轉(zhuǎn)
?感覺身體被掏空!只因為肝了這篇空間矢量控制算法
?當心!別再被大小端的問題坑了
?PID微分器與濾波器的愛恨情仇
?簡易PID算法的快速掃盲
?增量式PID到底是什么?
?三面大疆慘敗,因為不懂PID的積分抗飽和

原創(chuàng)不易,歡迎轉(zhuǎn)發(fā)、留言、點贊、分享給你的朋友,感謝您的支持!


長按識別二維碼關(guān)注獲取更多內(nèi)容


免責聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺僅提供信息存儲服務(wù)。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除( 郵箱:macysun@21ic.com )。
換一批
延伸閱讀

在單片機通信系統(tǒng)中,數(shù)據(jù)幀是實現(xiàn)設(shè)備間可靠對話的核心載體。不同于網(wǎng)絡(luò)通信中成熟的TCP/IP協(xié)議,單片機通信往往需要自定義數(shù)據(jù)幀格式,而幀頭、幀尾與校驗機制則是保障數(shù)據(jù)傳輸準確性的三大關(guān)鍵。

關(guān)鍵字: 單片機 數(shù)據(jù)幀

隨著嵌入式技術(shù)的不斷發(fā)展,時序分析工具和方法也在不斷進步,未來將朝著智能化、自動化的方向發(fā)展,為開發(fā)者提供更高效的調(diào)試手段。但無論技術(shù)如何發(fā)展,扎實的時序分析基礎(chǔ)都是嵌入式開發(fā)者不可或缺的能力,只有深入理解通信時序的本質(zhì)...

關(guān)鍵字: 時序 單片機

在嵌入式系統(tǒng)設(shè)計中,不同架構(gòu)、不同廠商的單片機協(xié)同工作早已成為常態(tài)。從8位的51系列到32位的STM32,從精簡指令集的PIC到復(fù)雜指令集的AVR,這些性能各異的單片機如何突破硬件差異實現(xiàn)數(shù)據(jù)交互,是嵌入式開發(fā)中的核心課...

關(guān)鍵字: 嵌入式 單片機

在嵌入式系統(tǒng)開發(fā)中,單片機的時鐘系統(tǒng)是整個系統(tǒng)的"心臟",所有的指令執(zhí)行、外設(shè)操作、定時器中斷都依賴于精準的時鐘信號。但在實際開發(fā)過程中,很多開發(fā)者都會遇到單片機時鐘不準的問題,表現(xiàn)為定時器計時偏差、UART通信波特率錯...

關(guān)鍵字: 控制系統(tǒng) 單片機

在單片機開發(fā)與調(diào)試過程中,復(fù)位電路作為保障芯片正常啟動的核心模塊,其穩(wěn)定性直接影響程序燒錄與系統(tǒng)運行。實際應(yīng)用中,不少開發(fā)者會遇到“接穩(wěn)壓電源可正常燒錄,接入電池后卻無法燒錄程序”的故障,此類問題多與復(fù)位電路設(shè)計、電池供...

關(guān)鍵字: 單片機 復(fù)位電路 時序匹配

在單片機的世界里,“字節(jié)”(Byte)是一個貫穿始終的核心概念。從存儲數(shù)據(jù)到執(zhí)行指令,從變量定義到外設(shè)通信,字節(jié)無處不在。很多初學者在學習單片機時,往往更關(guān)注復(fù)雜的程序邏輯和外設(shè)驅(qū)動,卻忽略了字節(jié)這個基礎(chǔ)知識點,導致在后...

關(guān)鍵字: 單片機 字節(jié)

在單片機的數(shù)字邏輯中,我們通常最關(guān)注的是高電平和低電平兩種狀態(tài),它們構(gòu)成了二進制數(shù)字世界的基礎(chǔ)。然而,除了這兩種狀態(tài)之外,還有一種至關(guān)重要但常常被忽視的狀態(tài)——高阻態(tài)(High Impedance State)。高阻態(tài)就...

關(guān)鍵字: 單片機 高阻態(tài)

對于PIC入門者來說,不需要盲目追求高端開發(fā)板,一塊功能均衡、資料豐富的入門款就能滿足需求。比如Microchip官方推出的PIC16F84A開發(fā)板,它搭載經(jīng)典的8位PIC內(nèi)核,引腳布局清晰,自帶LED、按鍵等基礎(chǔ)外設(shè),...

關(guān)鍵字: PIC 單片機

該低功耗器件支持5V運行,在實現(xiàn)高性能的同時,能有效保障系統(tǒng)簡潔性與成本效益

關(guān)鍵字: MCU 單片機 工業(yè)自動化
關(guān)閉