在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

什么情況下我們才會使用邊沿信號?

GReq_mcu168 ? 來源:電鹵藥丸 ? 作者:電鹵藥丸 ? 2021-05-03 10:14 ? 次閱讀

很多從事PLC編程的朋友都知道,不管是什么品牌PLC,都有上升沿和下降沿指令。

那么什么情況下我們才會使用或必須使用邊沿信號呢?邊沿信號我們又如何獲取呢?

如圖1,任何一個開關信號(或數字信號)都可以分解成4個狀態:①高電平 ②低電平 ③上升沿 ④下降沿。

a8e9b718-a10a-11eb-8b86-12bb97331649.png

圖1:開關信號

在PLC編程里,上升沿指令和下降沿指令可以直接調用;那么對于單片機C語言編程,又如何實現邊沿信號的判斷呢?因為早期做過PLC編程的緣故,受PLC編程思路的影響,對C語言編程急需簡單而高效的邊沿函數,于是痛定思痛,編寫了以下上升沿函數和下降沿函數,使用方便、簡單暴力。

/*************************************************

上升沿函數

*************************************************/

u8 Posedge(u8 Old_Value,u8 m)

{

static u8 New_Value[100];

u8 _PLS[100];

_PLS[m] = Old_Value & (Old_Value ^ New_Value[m]);

New_Value[m] = Old_Value;

return(_PLS[m]);

}

上升沿函數的邏輯原理是:

第一次進入函數:

①Old_Value從0→1;(此時New_Value[m]初始值為0)

②_PLS[m] = Old_Value & (Old_Value ^ New_Value[m])的運算結果為1(括號里異或運算為1);

③New_Value[m])= Old_Value被賦值為1;

④返回_PLS[m]值為1。

第二次及以后進入函數:

①New_Value[m]保持為1(因為被定義了static類型,第二次調用不會被清0);

②_PLS[m] = Old_Value & (Old_Value ^ New_Value[m])的運算結果為0(括號里異或運算為0);

③New_Value[m])= Old_Value仍然被賦值為1;

④返回_PLS[m]值為0。

⑤Old_Value從1→0,運算結果為0,返回值也為0;

所以上升沿函數只在變量0→1變化時返回值為1。

另外形參m的取值范圍是0~99,是為了區分不同Old_Value的實參,如果不同的實參用相同的m值(比如0),則該函數返回值會發生混亂;具體應用下面會附上實例。

/************************************************

下降沿函數

************************************************/

u8 Negedge(u8 Old_Value,u8 m)

{

static u8 New_Value[100];

u8 _PLF[100];

_PLF[m] = ~Old_Value & (~Old_Value ^ New_Value[m]);

New_Value[m] = ~Old_Value;

return(_PLF[m]);

}

下降沿函數的原理與上升沿函數完全一樣,只需把Old_Value值取反即可。

應用實例講解:

①以下為按鍵短按長按計數為例(單片機使用的是STM32F103系列的)。

if(Flag_1ms) //在1ms掃描周期內

{

Flag_1ms = 0;

if(SW1_IN == 0) //SW1按鍵長按,參數碼Cnt_Code以50ms間隔遞增

{

if(Negedge(SW1_IN,0) == 1) Cnt_Code++; //SW1按鍵短按,Cnt_Code只加1

i++; //以下為SW2按鍵長按計數間隔50ms

if(i == 50) //取經驗值50

{

i = 0;

Cnt_Code++;

if(Cnt_Code == 101) Cnt_Code = 0; //Cnt_Code值范圍1--100

}

}

if(SW2_IN == 0) //SW2按鍵長按,參數碼Cnt_Code以50ms間隔遞減

{

if(Negedge(SW2_IN,1) == 1) Cnt_Code--; //SW1按鍵短按,Cnt_Code只減1

i++; //以下為SW2按鍵長按計數間隔50ms

if(i == 50) //取經驗值50

{

i = 0;

Cnt_Code--;

if(Cnt_Code == 0) Cnt_Code = 100;

}

}

}

是不是發現了一個bug,本人沒有做按鍵的消抖處理,別急,用邊沿函數處理開關信號完全不需要消抖處理,是不是很簡單省事!

if(Negedge(SW1_IN,0) == 1) Cnt_Code++;

上面代碼表示SW1按鍵按下時,函數Negedge(SW1_IN,0)返回值為1,if條件語句判斷為真,在1ms周期內Cnt_Code加1;

if(Negedge(SW2_IN,1) == 1) Cnt_Code--;

邏輯同上,但注意括號(SW2_IN,1)內不是0,而是1,是為了避免與前一個下降沿函數在調用時有沖突。

②電池過壓保護程序

if(Posedge(Battery_Voltage 》 14 ,0) == 1)//電池電壓大于14V

{

Flag_OVP = 1; //過壓標志置位

}

if(Posedge(Battery_Voltage 《 14 ,1) == 1)//電池電壓小于14V

{

Flag_OVP = 0; //過壓標志復位

}

上面代碼的上升沿函數Posedge(Battery_Voltage 》 14 ,0) 中判斷語句的假值→真值也可以作為上升沿來使用,是不是很妙。

以上的兩種用法只是上升沿函數和下降沿函數最為普遍的用法,運用熟練后,可以自由發揮,另外,以上變量的數據類型我都定義為u8(unsigned char),因為我的STM32的標準庫里沒有布爾類型(bool)的定義,我也一直沒使用過布爾類型。變量定義如下:

u8 i; //按鈕長按間隔計數

u8 Cnt_Code;//參數碼

u8 Flag_OVP;//過壓標志

u8 Flag_1ms;//1ms標志

要點:

①上升沿函數和下降沿函數的返回值都為1,且在當前掃描周期內有效,下一個周期就變為0了,所以可以理解為其輸出了一個脈沖;

②按鍵消抖的常用方法是延時判斷,其實用邊沿函數處理開關信號完全不用消抖,直接調用即可;如果主函數有實時性要求較高的掃描程序存在,延時函數的弊病就出來了,ta會嚴重影響掃描周期。

③用于只需要執行一次的指令(非保持),如加一減一、移位、交換、存儲,以及一個變量受制于多個條件等,如果不用上升沿或者下降沿,那么代碼在每個周期都會被執行一次,于是就不能達到理想效果;

原文標題:C語言中實現邊沿函數算法及應用,這是拋棄PLC留下的痛!

文章出處:【微信公眾號:玩轉單片機】歡迎添加關注!文章轉載請注明出處。

責任編輯:haq

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • plc
    plc
    +關注

    關注

    5013

    文章

    13327

    瀏覽量

    464064
  • C語言
    +關注

    關注

    180

    文章

    7608

    瀏覽量

    137119

原文標題:C語言中實現邊沿函數算法及應用,這是拋棄PLC留下的痛!

文章出處:【微信號:mcu168,微信公眾號:硬件攻城獅】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    請問什么情況下會損壞TLV2548,或者導致INT信號不再反應?

    如題,請問什么情況下會損壞TLV2548,或者導致INT信號不再反應? 我曾多次驅動過該AD,都可以正常讀取碼值。但有兩次遇到過AD沒有任何反應,只在上電的瞬間讀取電壓,INT不再拉低(我用的模式
    發表于 11-14 06:39

    tas5754的TDM功能在什么情況下使用,有什么優點?

    問下,這個TDM功能在什么情況下使用,有什么優點,還有同步信號是否就把LRCLK連接就可以,這個需要根據采樣率改寄存器嗎?
    發表于 10-31 06:03

    運放在什么情況下會出現正反輸入端電壓不等?

    專家老師,運放在什么情況下會出現正反輸入端電壓不等?
    發表于 09-24 08:06

    運放使用時,虛短,虛斷在什么情況下使用呢?

    運放使用時,虛短,虛斷在什么情況下使用呢?是在單端,差分輸入條件都能使用么?
    發表于 09-14 08:53

    什么情況下OPA541容易損壞?

    后用示波器TEK1012觀察限流保護電阻兩端的電壓,結果再次損壞OPA541。 我想請問什么情況下OPA541容易損壞,另外我使用的限流保護電阻和負載均為水泥電阻,不知是否因存在感性成分造成。附電路圖如下:
    發表于 09-11 07:49

    INA226的Alert引腳什么情況下會異常?

    INA226的Alert引腳什么情況下異常
    發表于 08-28 08:01

    DTU的設備號都在什么情況下需要填寫呢?填寫的規則是什么?

    DTU的設備號都在什么情況下需要填寫,填寫的規則是什么?
    發表于 07-26 08:18

    MOS管什么情況下會短路

    MOS管(Metal-Oxide-Semiconductor Field-Effect Transistor,金屬-氧化物半導體場效應晶體管)在多種情況下可能會發生短路,這些情況主要涉及其工作環境、操作條件、物理特性以及制造工藝等多個方面。以下是對MOS管短路原因的詳細分
    的頭像 發表于 07-16 11:39 ?3320次閱讀

    什么情況下會產生零序電流

    零序電流是指在三相電力系統中,三相電流的矢量和不為零的情況。在正常情況下,三相電力系統中的三相電流是平衡的,即三相電流的矢量和為零。但是,在某些特殊情況下,三相電流的矢量和不為零,就會產生零序電流
    的頭像 發表于 07-15 14:53 ?4253次閱讀

    受控源什么情況下可看為電阻

    受控源,又稱為非獨立源,是指其電壓或電流值受電路中其他部分的電壓或電流控制的電源。受控源在電路分析中具有重要的作用,其特性和行為與獨立源(如電池、發電機等)有所不同。在某些特定情況下,受控源可以看作
    的頭像 發表于 07-12 09:29 ?2125次閱讀

    什么情況下需要使用接地電阻柜

    什么情況下需要使用接地電阻柜?中性點電阻柜不接地時,中性點接地方式一般為不接地、直接接地和通過消弧線圈或小電阻接地。接地電阻測試需要將接地引下線接至大地,但大地電阻因季節變化而不同,需要用數字鉗形表
    的頭像 發表于 06-18 08:36 ?295次閱讀

    什么情況下需要申請T-mobile認證?T-mobile的優勢是什么?

    T-Mobile認證呢?讓我們一起來探討。一、什么情況下需要申請T-Mobile認證?進軍北美市場:如果您的公司計劃將無線通信設備推向北美市場,特別是與美國T-M
    的頭像 發表于 05-20 17:33 ?535次閱讀
    <b class='flag-5'>什么情況下</b>需要申請T-mobile認證?T-mobile的優勢是什么?

    什么情況下電容器會被擊穿

    電容器是一種常見的電子元件,廣泛應用于各個領域。然而,在特定條件,電容器可能會發生擊穿現象,導致其無法正常工作甚至損壞。那么,在什么情況下電容器會被擊穿呢?
    的頭像 發表于 02-19 14:11 ?2814次閱讀

    什么情況下應選擇使用環形變壓器而不是其他類型的變壓器?

    什么情況下應選擇使用環形變壓器而不是其他類型的變壓器? 環形變壓器是一種特殊類型的變壓器,其獨特的設計和結構使得它在特定情況下比其他類型的變壓器更適用。在本文中,我們將探討一些情況下
    的頭像 發表于 01-30 16:18 ?584次閱讀

    ADU7023的EEPROM在什么情況下會被改寫?

    ADU7023的EEPROM在什么情況下會被改寫?知道電源噪聲在特定頻率超過一定幅度會發生這種情況,排除電源噪聲因素,還可能有什么原因呢?
    發表于 01-11 06:17
    主站蜘蛛池模板: 天天狠狠| yyy6080韩国三级理论| 国产色视频一区| 国产高清不卡一区二区| 国产91丝袜在线播放九色| xvideos国产| 天天色天天操天天射| 男女啪视频大全1000| 插插好爽爽爽| 中文字幕一二三区乱码老| 男男宿舍高h炒肉bl| 亚洲欧美在线播放| 99精品久久久久久久婷婷| 成年网站在线| 五月天婷婷综合| 狠狠干狠狠爱| 在线婷婷| 亚洲欧美日韩在线观看你懂的 | 成人5252色| 一区二区三区视频在线| 真实女人寂寞偷人视频| 色综合久久久久综合99| 美女全黄网站免费观看| 四虎永久免费网站入口2020| 欧美在线观看视频一区| 国产一区二区三区四卡| 激情理论片| 亚洲免费黄色网址| 国产亚洲精品aa在线观看| 在线观看一二三区| 午夜宅男视频| 久久综合免费视频| 五月天婷婷在线视频国产在线| 99国产福利| 在线观看视频色| 欧美zoozzooz在线观看| 又粗又长又大又黄的日本视频| 国产精品www夜色影视| 福利片午夜| 免费看 s色| 日本最黄|