国产清洁工av剧情精品_欧洲日韩av网站_国产视频手机在线播放_亚洲精品国产va在线观看蜜芽_AV网页在线好看_久久精品国产亚洲精品2023_一级日韩一级欧美_亚洲欧美日韩中文天堂_最近中文字幕mv在线视频_男女啪啪高潮激烈免费版网站

您好,歡迎訪問泰安宏盛自動(dòng)化科技有限公司!
20年專注工控自動(dòng)化研發(fā)制造 系統(tǒng)設(shè)計(jì)\制作\安裝一條龍服務(wù)
全國咨詢熱線:18605386049
當(dāng)前位置: 首頁 > 技術(shù)資料 > 程序案例

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

作者:小編 時(shí)間:2024-06-05 08:30:36 點(diǎn)擊:

后續(xù)準(zhǔn)備穿插一些有關(guān)單片機(jī)應(yīng)用C語言編程技巧的文章,那么本期講解邊沿信號(hào)的應(yīng)用。很多從事PLC編程的朋友都知道,不管是什么品牌的PLC,都有上升沿和下降沿指令。

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

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

image.png

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

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

/*************************************************
 上升沿函數(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í)例講解:

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

if(Flag_1ms) 		 //在1ms掃描周期內(nèi)
{
 Flag_1ms = 0;
 
 if(SW1_IN == 0) //SW1按鍵長(zhǎng)按,參數(shù)碼Cnt_Code以50ms間隔遞增
 {
 if(Negedge(SW1_IN,0) == 1) Cnt_Code++; //SW1按鍵短按,Cnt_Code只加1
 i++; //以下為SW2按鍵長(zhǎng)按計(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按鍵長(zhǎng)按,參數(shù)碼Cnt_Code以50ms間隔遞減
 {
 if(Negedge(SW2_IN,1) == 1) Cnt_Code--; //SW1按鍵短按,Cnt_Code只減1
 i++; //以下為SW2按鍵長(zhǎng)按計(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)完全不需要消抖處理,是不是很簡(jiǎn)單省事!

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; //按鈕長(zhǎng)按間隔計(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á)到理想效果;

免責(zé)聲明:本文轉(zhuǎn)自電鹵藥丸,版權(quán)歸原作者所有,如涉及作品版權(quán)問題,請(qǐng)及時(shí)與我們聯(lián)系刪除,謝謝!

QQ在線咨詢
聯(lián)系電話
17658151177
售后服務(wù)
17658151177