日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

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)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • plc
    plc
    +關(guān)注

    關(guān)注

    5052

    文章

    14823

    瀏覽量

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

    關(guān)注

    183

    文章

    7646

    瀏覽量

    146200

原文標(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)推薦
    熱點(diǎn)推薦

    VOOHU沃虎:音頻變壓器的主要作用是什么?什么情況下必須使用?

    純凈度、消除底噪、匹配設(shè)備阻抗以及轉(zhuǎn)換信號(hào)格式方面發(fā)揮著不可替代的作用。然而,許多工程師在選型時(shí)常常困惑:音頻變壓器到底能解決什么問題?哪些場景沒有它就“過不去”?今天,沃虎電子(VOOHU)帶你深入解析。 一、音頻變壓器的
    的頭像 發(fā)表于 04-23 14:03 ?78次閱讀

    電路板是否在沒有 tf 卡的情況下啟動(dòng)?

    電路板是否在沒有 tf 卡的情況下啟動(dòng)? 主板是否使用沒有 tf 卡的 NVMe SSD 啟動(dòng)?
    發(fā)表于 03-26 07:14

    請(qǐng)問如何在不按按鈕的情況下重置電路板?

    我有一臺(tái)舊的 Raspberry Pi 1B,我用它通過 UART 照顧 VF2。如果 VF2 無法啟動(dòng)但 u-boot 仍然可以訪問,我可以 ssh 進(jìn)入 RPI 并運(yùn)行 picocom 來修復(fù)它。 如果 VF2 崩潰且無法訪問 u-boot,有沒有辦法在不按重置按鈕的情況下重置它?
    發(fā)表于 03-20 08:01

    如何設(shè)計(jì)好自動(dòng)駕駛ODD?

    為確定自動(dòng)駕駛的可使用范圍,會(huì)給自動(dòng)駕駛設(shè)置一個(gè)運(yùn)行設(shè)計(jì)域(Operational Design Domain,ODD)。ODD的作用就是用來明確自動(dòng)駕駛在什么情況下能工作,在什么情況下不能工作,給車設(shè)定“工作范圍”。
    的頭像 發(fā)表于 01-24 09:27 ?1804次閱讀

    什么情況下用安規(guī)電容?

    安規(guī)電容指符合特定安規(guī)標(biāo)準(zhǔn),在電容器失效后,不會(huì)導(dǎo)致電擊,不危及人身安危的電容器,根據(jù)應(yīng)用場景和連接方式的不同,安規(guī)電容分為X電容和Y電容。
    的頭像 發(fā)表于 01-21 17:20 ?936次閱讀
    <b class='flag-5'>什么情況下</b>用安規(guī)電容?

    什么情況下用安規(guī)電容?

    安規(guī)電容是指符合特點(diǎn)安規(guī)標(biāo)準(zhǔn),在電容器失效后,不會(huì)導(dǎo)致電擊,不危及人身安危的電容器。根據(jù)應(yīng)用場景和鏈接方式的不同,安規(guī)電容分為X電容和Y電容。
    的頭像 發(fā)表于 01-21 16:40 ?887次閱讀
    <b class='flag-5'>什么情況下</b>用安規(guī)電容?

    E203 test_mode信號(hào)是干啥用的?

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

    如何在“SD 卡 NAND 閃存”的情況下使用 Non-OS NVTFAT?

    如何在“SD 卡 NAND 閃存”的情況下使用 Non-OS NVTFAT
    發(fā)表于 09-01 07:58

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

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

    如何在沒有 NuLink 編程器的情況下執(zhí)行 SWD 解鎖序列?

    我迫切需要知道如何在沒有 NuLink 編程器的情況下執(zhí)行 SWD 解鎖序列。
    發(fā)表于 08-18 07:04

    什么情況會(huì)導(dǎo)致BUFFER_RYD一直為低電平?

    :LINK_TRAINING_STS1:0 這種信息是表示“PHY and LINK training”訓(xùn)練完成了嗎? 還有什么情況會(huì)導(dǎo)致BUFFER_RYD一直為低電平?
    發(fā)表于 08-14 06:21

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

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

    請(qǐng)問CYW20835在sleep mode的情況下,不進(jìn)入SDS或HIDOF的情況下,底電流最低是多少?

    請(qǐng)問CYW20835在sleep mode的情況下,不進(jìn)入SDS或HIDOF的情況下,底電流最低是多少?
    發(fā)表于 07-07 07:54

    在外部實(shí)質(zhì)信號(hào)不突變的情況下,經(jīng)過AD9278采集到的數(shù)據(jù)突然變小,為什么?

    應(yīng)用場景:使用AD9278采集超聲信號(hào) 問題:在外部實(shí)質(zhì)信號(hào)不突變的情況下,經(jīng)過AD9278采集到的數(shù)據(jù)突然變小?。?!為什么??? 如果將TGC減小,這個(gè)突然變暗的點(diǎn)會(huì)往下移, 但是通過FPGA抓到
    發(fā)表于 06-10 06:39

    什么情況下用M12線性傳感器?

    在工業(yè)自動(dòng)化和精密測量領(lǐng)域,M12線性傳感器憑借其獨(dú)特的性能優(yōu)勢,成為眾多行業(yè)不可或缺的關(guān)鍵組件。
    的頭像 發(fā)表于 05-14 14:42 ?757次閱讀
    宁武县| 龙门县| 柘荣县| 东乌珠穆沁旗| 思南县| 塔河县| 弥勒县| 资阳市| 平舆县| 富阳市| 乐清市| 玉山县| 朝阳区| 竹山县| 凉城县| 嵊州市| 河北区| 莒南县| 萍乡市| 莱芜市| 高阳县| 阿鲁科尔沁旗| 米脂县| 龙南县| 安顺市| 运城市| 木兰县| 宁德市| 金寨县| 潜山县| 沙坪坝区| 商城县| 平潭县| 滦平县| 赣州市| 普洱| 临颍县| 汨罗市| 阳信县| 集安市| 泉州市|