chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

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

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

GReq_mcu168 ? 來源:電鹵藥丸 ? 作者:電鹵藥丸 ? 2021-05-03 10:14 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

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

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

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

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

在PLC編程里,上升沿指令和下降沿指令可以直接調(diào)用;那么對于單片機C語言編程,又如何實現(xiàn)邊沿信號的判斷呢?因為早期做過PLC編程的緣故,受PLC編程思路的影響,對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;(此時New_Value[m]初始值為0)

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

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

④返回_PLS[m]值為1。

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

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

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

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

④返回_PLS[m]值為0。

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

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

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

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

下降沿函數(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ù)為例(單片機使用的是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按鍵長按計數(shù)間隔50ms

if(i == 50) //取經(jīng)驗值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按鍵長按計數(shù)間隔50ms

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

{

i = 0;

Cnt_Code--;

if(Cnt_Code == 0) Cnt_Code = 100;

}

}

}

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

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

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

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

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

②電池過壓保護程序

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ù)最為普遍的用法,運用熟練后,可以自由發(fā)揮,另外,以上變量的數(shù)據(jù)類型我都定義為u8(unsigned char),因為我的STM32的標(biāo)準(zhǔn)庫里沒有布爾類型(bool)的定義,我也一直沒使用過布爾類型。變量定義如下:

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

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

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

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

要點:

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

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

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

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

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

責(zé)任編輯:haq

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

    關(guān)注

    5045

    文章

    14447

    瀏覽量

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

    關(guān)注

    183

    文章

    7642

    瀏覽量

    144644

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

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

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    E203 test_mode信號是干啥用的?

    最近在研究E203的RTL代碼,有一個信號是test_mode,開源代碼里面給了個常量0。 請教一各位大佬,這個信號是干啥用的?在什么情況下接0,
    發(fā)表于 11-11 06:51

    高扇出信號線優(yōu)化技巧(

    該屬性會將每個驅(qū)動程序的扇出限制告知工具,并通過指示布局器了解扇出限制來指引該工具對高扇出的負(fù)載進(jìn)行分配。此屬性可同時應(yīng)用于 FF 與 LUT 驅(qū)動程序。當(dāng) MAX_FANOUT 值小于約束的信號線的實際扇出時,將對該信號線進(jìn)行寄存器復(fù)制評估。值得注意的是,僅當(dāng)時序會得到
    的頭像 發(fā)表于 08-28 10:47 ?1533次閱讀
    高扇出<b class='flag-5'>信號</b>線優(yōu)化技巧(<b class='flag-5'>下</b>)

    請問DTU的設(shè)備號都在什么情況下需要填寫,填寫的規(guī)則是什么?

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

    DS1232LPS-2+T&amp;R,在什么情況下,5腳RST會一直輸出高電平?

    DS1232LPS-2+T&R,這款芯片在什么情況下,5腳RST會一直輸出高電平?(正常時序是上電有個400多ms的高電平后,一直處于低電平,如果7腳沒有及時喂狗,會觸發(fā)復(fù)位,也就是重復(fù)400多ms的高電平后,一直處于低電平)
    發(fā)表于 04-18 07:51

    DLPC350管角FAULT_STATUS是什么含義,什么樣的情況下這個指示燈會亮?

    ,這個指示燈會亮,具體是在什么情況下,這個指示燈會亮呢?或者說在哪些情況下,這個指示燈會亮。 幫忙解答,感謝。
    發(fā)表于 02-26 08:20

    DLPA3000 ILLUM_HSIDE_DRIVE ILLUM_LSIDE_DRIVE這二個腳外置MOS是什么情況下可以用?

    ILLUM_HSIDE_DRIVEILLUM_LSIDE_DRIVE這二個腳外置MOS是什么情況下可以用
    發(fā)表于 02-21 06:00

    ads1256有沒有辦法在不換ad的情況下采集10路信號

    在使用ads1256,但是發(fā)現(xiàn)需要采集10路信號,有沒有辦法在不換ad的情況下采集10路信號
    發(fā)表于 01-22 07:36

    ADS5474模數(shù)轉(zhuǎn)換器的VCM和VREF引腳在什么情況下使用?

    是什么?在什么情況下使用?文檔上有張圖表明兩個時鐘引腳在內(nèi)部通過兩個1000歐電阻接到2.4V電壓,這個2.4V是不是就是VREF? 此外,信號輸入規(guī)定是2.2VPP,共模電壓設(shè)置為3.1V或是0V是不是都行?
    發(fā)表于 01-13 08:04

    ADS1115未接傳感器的通道會不時的出現(xiàn)數(shù)值,這是什么情況?

    最近做了塊AD采樣的板子,在其中1路接傳感器,其他3路不接傳感器的情況下,接傳感器的讀數(shù)正常,而未接傳感器的通道會不時的出現(xiàn)數(shù)值。這是什么情況?怎么解決?望大家給點意見
    發(fā)表于 01-09 06:47

    MSP430F4250的四種模式分別是在什么情況下使用呢?

    我是一名初學(xué)者,看了書知道MSP430F4250的AD轉(zhuǎn)換模式有四種,我想知道這四種轉(zhuǎn)化模式有什么區(qū)別,分別應(yīng)該在什么情況下使用。各位高手能否為我解答哈,在下不勝感激。因為是初學(xué)者,有很多東西都不知道,能盡量詳細(xì)就盡量哈,謝謝了。
    發(fā)表于 01-06 06:16

    ldc1614EVM評估版背面的沒焊電容時用來干嘛的?在什么情況下使用?

    請教一個關(guān)于ldc1614EVM的問題,評估版背面的沒焊電容時用來干嘛的?在什么情況下使用?
    發(fā)表于 01-02 08:23

    ADS1278數(shù)據(jù)輸出引腳Dout1有脈沖輸出是什么情況

    ADS1278配置成SPI TDM模式,CLK時鐘24MHz,在SCLK沒給時鐘的情況下,用示波器觀察Dout1管腳就不規(guī)則脈沖輸出,寬度大約6us,周期不定。另外DRDY有規(guī)律性脈沖輸出,寬度大約50ns,間隔60us,請問這是什么情況?
    發(fā)表于 12-31 06:12

    ADS5401滿量程情況下,模擬信號的輸入范圍遠(yuǎn)超過了參考電壓的范圍,為什么?

    我在設(shè)計過程中遇到一個問題,ADC滿量程情況下,模擬信號的輸入范圍遠(yuǎn)超過了參考電壓的范圍, 1. 如設(shè)置參考電壓為1V的情況下,轉(zhuǎn)換輸出滿量程-127~127(我只取ADC的高8位,低4位不要)所
    發(fā)表于 12-30 08:34

    LM98620的offset寄存器值什么情況下起作用?

    我想問下LM98620 的offset寄存器值什么情況下起作用?我是通過FPGA設(shè)置的,6個C_OFFS_XX寄存器和6個F_OFFS_XX都設(shè)置了,但是波形沒有整體抬升或者下降。 另外,我在
    發(fā)表于 12-23 07:48

    DAC8820將數(shù)字信號轉(zhuǎn)換為模擬信號的這段時間,芯片的輸出是什么情況?

    我想問一DAC8820如何輸出的問題,在DAC將數(shù)字信號轉(zhuǎn)換為模擬信號的這段時間,芯片的輸出是什么情況,芯片內(nèi)部是否存在類似模擬開關(guān)的結(jié)構(gòu),只有數(shù)字轉(zhuǎn)換好了才能輸出?
    發(fā)表于 12-18 06:26