色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

什么情況下我們才會(huì)使用邊沿信號(hào)?

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

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

那么什么情況下我們才會(huì)使用或必須使用邊沿信號(hào)呢?邊沿信號(hào)我們又如何獲取呢?

如圖1,任何一個(gè)開關(guān)信號(hào)(或數(shù)字信號(hào))都可以分解成4個(gè)狀態(tài):①高電平 ②低電平 ③上升沿 ④下降沿。

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

圖1:開關(guān)信號(hào)

在PLC編程里,上升沿指令和下降沿指令可以直接調(diào)用;那么對(duì)于單片機(jī)C語言編程,又如何實(shí)現(xiàn)邊沿信號(hào)的判斷呢?因?yàn)樵缙谧鲞^PLC編程的緣故,受PLC編程思路的影響,對(duì)C語言編程急需簡單而高效的邊沿函數(shù),于是痛定思痛,編寫了以下上升沿函數(shù)和下降沿函數(shù),使用方便、簡單暴力。

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

上升沿函數(shù)

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

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]);

}

上升沿函數(shù)的邏輯原理是:

第一次進(jìn)入函數(shù):

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

②_PLS[m] = Old_Value & (Old_Value ^ New_Value[m])的運(yùn)算結(jié)果為1(括號(hào)里異或運(yùn)算為1);

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

④返回_PLS[m]值為1。

第二次及以后進(jìn)入函數(shù):

①New_Value[m]保持為1(因?yàn)楸欢x了static類型,第二次調(diào)用不會(huì)被清0);

②_PLS[m] = Old_Value & (Old_Value ^ New_Value[m])的運(yùn)算結(jié)果為0(括號(hào)里異或運(yùn)算為0);

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

④返回_PLS[m]值為0。

⑤Old_Value從1→0,運(yùn)算結(jié)果為0,返回值也為0;

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

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

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

下降沿函數(shù)

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

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]);

}

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

應(yīng)用實(shí)例講解:

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

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

{

Flag_1ms = 0;

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

{

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

i++; //以下為SW2按鍵長按計(jì)數(shù)間隔50ms

if(i == 50) //取經(jīng)驗(yàn)值50

{

i = 0;

Cnt_Code++;

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

}

}

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

{

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

i++; //以下為SW2按鍵長按計(jì)數(shù)間隔50ms

if(i == 50) //取經(jīng)驗(yàn)值50

{

i = 0;

Cnt_Code--;

if(Cnt_Code == 0) Cnt_Code = 100;

}

}

}

是不是發(fā)現(xiàn)了一個(gè)bug,本人沒有做按鍵的消抖處理,別急,用邊沿函數(shù)處理開關(guān)信號(hào)完全不需要消抖處理,是不是很簡單省事!

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

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

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

邏輯同上,但注意括號(hào)(SW2_IN,1)內(nèi)不是0,而是1,是為了避免與前一個(gè)下降沿函數(shù)在調(diào)用時(shí)有沖突。

②電池過壓保護(hù)程序

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

{

Flag_OVP = 1; //過壓標(biāo)志置位

}

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

{

Flag_OVP = 0; //過壓標(biāo)志復(fù)位

}

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

以上的兩種用法只是上升沿函數(shù)和下降沿函數(shù)最為普遍的用法,運(yùn)用熟練后,可以自由發(fā)揮,另外,以上變量的數(shù)據(jù)類型我都定義為u8(unsigned char),因?yàn)槲业腟TM32的標(biāo)準(zhǔn)庫里沒有布爾類型(bool)的定義,我也一直沒使用過布爾類型。變量定義如下:

u8 i; //按鈕長按間隔計(jì)數(shù)

u8 Cnt_Code;//參數(shù)碼

u8 Flag_OVP;//過壓標(biāo)志

u8 Flag_1ms;//1ms標(biāo)志

要點(diǎn):

①上升沿函數(shù)和下降沿函數(shù)的返回值都為1,且在當(dāng)前掃描周期內(nèi)有效,下一個(gè)周期就變?yōu)?了,所以可以理解為其輸出了一個(gè)脈沖;

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

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

原文標(biāo)題:C語言中實(shí)現(xiàn)邊沿函數(shù)算法及應(yīng)用,這是拋棄PLC留下的痛!

文章出處:【微信公眾號(hào):玩轉(zhuǎn)單片機(jī)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

責(zé)任編輯:haq

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • plc
    plc
    +關(guān)注

    關(guān)注

    5010

    文章

    13271

    瀏覽量

    463067
  • C語言
    +關(guān)注

    關(guān)注

    180

    文章

    7604

    瀏覽量

    136692

原文標(biāo)題:C語言中實(shí)現(xiàn)邊沿函數(shù)算法及應(yīng)用,這是拋棄PLC留下的痛!

文章出處:【微信號(hào):mcu168,微信公眾號(hào):硬件攻城獅】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    請(qǐng)問什么情況下會(huì)損壞TLV2548,或者導(dǎo)致INT信號(hào)不再反應(yīng)?

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

    tas5754的TDM功能在什么情況下使用,有什么優(yōu)點(diǎn)?

    問下,這個(gè)TDM功能在什么情況下使用,有什么優(yōu)點(diǎn),還有同步信號(hào)是否就把LRCLK連接就可以,這個(gè)需要根據(jù)采樣率改寄存器嗎?
    發(fā)表于 10-31 06:03

    什么情況下OPA541容易損壞?

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

    INA226的Alert引腳什么情況下會(huì)異常?

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

    DTU的設(shè)備號(hào)都在什么情況下需要填寫呢?填寫的規(guī)則是什么?

    DTU的設(shè)備號(hào)都在什么情況下需要填寫,填寫的規(guī)則是什么?
    發(fā)表于 07-26 08:18

    什么情況下會(huì)產(chǎn)生零序電流

    零序電流是指在三相電力系統(tǒng)中,三相電流的矢量和不為零的情況。在正常情況下,三相電力系統(tǒng)中的三相電流是平衡的,即三相電流的矢量和為零。但是,在某些特殊情況下,三相電流的矢量和不為零,就會(huì)產(chǎn)生零序電流
    的頭像 發(fā)表于 07-15 14:53 ?3831次閱讀

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

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

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

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

    什么情況下需要申請(qǐng)T-mobile認(rèn)證?T-mobile的優(yōu)勢(shì)是什么?

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

    什么情況下電容器會(huì)被擊穿

    電容器是一種常見的電子元件,廣泛應(yīng)用于各個(gè)領(lǐng)域。然而,在特定條件,電容器可能會(huì)發(fā)生擊穿現(xiàn)象,導(dǎo)致其無法正常工作甚至損壞。那么,在什么情況下電容器會(huì)被擊穿呢?
    的頭像 發(fā)表于 02-19 14:11 ?2668次閱讀

    什么情況下應(yīng)選擇使用環(huán)形變壓器而不是其他類型的變壓器?

    什么情況下應(yīng)選擇使用環(huán)形變壓器而不是其他類型的變壓器? 環(huán)形變壓器是一種特殊類型的變壓器,其獨(dú)特的設(shè)計(jì)和結(jié)構(gòu)使得它在特定情況下比其他類型的變壓器更適用。在本文中,我們將探討一些情況下
    的頭像 發(fā)表于 01-30 16:18 ?552次閱讀

    高壓差分探頭什么情況下容易壞?

    高壓差分探頭什么情況下容易壞? 高壓差分探頭是一種用于測(cè)量電氣設(shè)備中的電壓差異的儀器。它通常由兩個(gè)金屬電極組成,它們用于感測(cè)電場(chǎng)強(qiáng)度,并將其轉(zhuǎn)換為電壓信號(hào)。然而,由于其特殊的設(shè)計(jì)和工作環(huán)境,高壓差分
    的頭像 發(fā)表于 01-08 16:36 ?658次閱讀

    LTC2945什么情況下INTVCC/SDAO才會(huì)對(duì)地?fù)舸?/a>

    。 LTC2945的供電是用穩(wěn)壓模塊輸出的+26V供電,INTVCC只是為后面的光耦供電,請(qǐng)教一什么情況下INTVCC或者SDAO才會(huì)對(duì)地?fù)舸?電路是用的手冊(cè)里推薦的電路,VDD供電是用的+26V,SDAI
    發(fā)表于 01-05 06:07

    AD7705的自校準(zhǔn)與系統(tǒng)校準(zhǔn)有什么區(qū)別,分別在什么情況下用的?

    請(qǐng)教一AD7705的自校準(zhǔn)與系統(tǒng)校準(zhǔn)有什么區(qū)別,分別在什么情況下用的?最好舉個(gè)例子,我的AD接的是重量傳感器輸出信號(hào)
    發(fā)表于 12-25 07:35

    請(qǐng)問在什么情況下會(huì)使用帶內(nèi)置濾波器的變頻器?

    請(qǐng)問大家一般在什么情況下會(huì)使用帶內(nèi)置濾波器的變頻器?
    發(fā)表于 12-25 06:07
    主站蜘蛛池模板: 国产免费怕怕免费视频观看| qvod 在线| 两个吃奶一个添下面视频| 欧美日韩亚洲一区二区三区在线观看 | 99视频精品全部 国产| 暖暖 免费 日本 高清 在线1| 全免费午夜一级毛片| 草莓视频cm.888tw| 午夜欧洲亚洲AV永久无码精品| 国产色精品久久人妻无码看片软件| 亚洲黄色免费在线观看| 久久精品天天中文字幕| avtt一区| 无码国产欧美日韩精品| 久久精品国产欧美| 99re热精品视频国产免费| 免费无码又爽又黄又刺激网站| 亚洲伊人久久综合影院2021| 国产精品久久久久影院| 无码国产精品高潮久久9 | 免费的好黄的漫画| 免费精品美女久久久久久久久| 亚洲乱码中文字幕久久| 啊灬啊别停灬用力啊老师| 亲胸吻胸添奶头GIF动态图免费| 99热这里精品| 少妇无码吹潮久久精品AV网站| 国内精品自线在拍2020不卡| 最近免费视频中文2019完整版| 日本69xxxxx| 黄梅戏mp3大全| 亚洲一区免费在线观看| 女人色极品影院| 国产日韩精品一区二区在线观看 | 最近2019中文字幕MV免费看| 久久精品午夜一区二区福利 | xx69欧美| 秋霞电影院兔费理论84MB| jizz黑丝| 三级黄色a| 在线日本v二区不卡|