久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2851|回復(fù): 13
打印 上一主題 下一主題
收起左側(cè)

DHT11這類需要大量延時操作的傳感器讀取問題

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:1057946 發(fā)表于 2023-7-10 21:04 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
現(xiàn)在是100毫秒讀取一次傳感器的值,但是在讀取期間,大量的延時操作會阻塞中斷函數(shù)的Key_slow_down按鍵消抖計時操作
能設(shè)置中斷優(yōu)先級解決嗎,或者是設(shè)置兩個定時器、兩個中斷,在觸發(fā)中斷時會互相影響嗎
void TIM3_IRQHandler(void)
{
        if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET)
                {
                        if(++Key_slow_down==10) Key_slow_down=0;
                        if(++DHT11_slow_down==100) DHT11_slow_down=0;
                        TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
                }
}
void DHT11_Start(void)
{
        Delay_s(1);//傳感器上電后,要等待 1s 以越過不穩(wěn)定狀態(tài)在此期間無需發(fā)送任何指令
        DHT11_DataPin_Init(MCU_Output);//IO口輸出模式
        GPIO_SetBits(GPIOA,GPIO_Pin_10);
        GPIO_ResetBits(GPIOA,GPIO_Pin_10);
        Delay_ms(20);//拉低總線必須大于18毫秒,保證DHT11能檢測到起始信號
        GPIO_SetBits(GPIOA,GPIO_Pin_10);
        Delay_us(30);//延時等待20-40us后,讀取DHT11的響應(yīng)信號
        DHT11_DataPin_Init(MCU_Input);//IO口輸入模式
        if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_10)==0)
        {
                DHT11_exist_Plag=1;
                while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_10)==0);
                while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_10)==1);
        }
}
/****
        *@brief DHT11溫濕度測量
        *@parameter 無
        *@ReturnValue 無
        */
void DHT11_GetData(void)
{
        int8_t i,j,Temp=0x00;
        if(DHT11_exist_Plag==1)// 檢測DHT11是否存在,若DHT11不存在,則不必進(jìn)行下面步驟
        {
                for(j=0;j<5;j++)//一次完整的數(shù)據(jù)傳輸為40bit,高位先出
                {
                       
                        for(i=0;i<8;i++)
                        {
                                while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_10)==0);
                                Delay_us(30);
                                if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_10)==1)
                                {
                                        Temp=Temp|(0x80>>i);// 從高位開始接收
                                        while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_10)==1);
                                }
                        }
                        Hum_Tem_Data[j]=Temp;
                        Temp=0x00;
                }
                if(Hum_Tem_Data[0]+Hum_Tem_Data[1]+Hum_Tem_Data[2]+Hum_Tem_Data[3]!=Hum_Tem_Data[4])// 校驗數(shù)據(jù)是否正確,若不正確則數(shù)組全部寫1
                {
                        Hum_Tem_Data[0]=0xff;
                        Hum_Tem_Data[1]=0xff;
                        Hum_Tem_Data[2]=0xff;
                        Hum_Tem_Data[3]=0xff;
                       
                }
        }else
        {
                DHT11_Start();
        }
}

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:1085441 發(fā)表于 2023-7-10 23:56 | 只看該作者
是的,延時時間比較長,好像有400uS,受一些中斷間隔時間短(小于400uS)的程序影響。我后來換了I2C接口的芯片避免了這個問題,型號好像是SHT30
回復(fù)

使用道具 舉報

板凳
ID:420836 發(fā)表于 2023-7-11 06:52 | 只看該作者
請注意,讀取傳感器的時間間隔與讀取寄存器的時間不同。 讀取寄存器并不需要花費(fèi)太多時間。
回復(fù)

使用道具 舉報

地板
ID:584195 發(fā)表于 2023-7-11 07:12 | 只看該作者
100ms 好象DH11都沒有轉(zhuǎn)換完成。別讀太快了,太快了也沒有意義。
回復(fù)

使用道具 舉報

5#
ID:213173 發(fā)表于 2023-7-11 07:21 | 只看該作者
對于DHT11這類外設(shè),一個完整的工作周期比較長,長時間的阻滯延時操作會影響其它需要及時響應(yīng)的程序的正常運(yùn)行。這種情況并不是使用中斷就能夠完美避免。這就需要換一種編程思路,使用輪詢法。假設(shè)你這個設(shè)備使用了DHT11溫濕度測量,時鐘芯片1302,按鍵掃描,8位數(shù)碼管動態(tài)顯示等。那么使用定時器將主函數(shù)循環(huán)周期以最小時間單位要求的外設(shè)來設(shè)置。例如8位數(shù)碼管動態(tài)顯示為參考取2~2.5ms,2*8=16ms,時間再長碼管就要閃爍了。我們用switch-case-break分支語句編寫(如有必要)上述各外設(shè)的子程序,每次主循環(huán)只執(zhí)行各子函數(shù)的一部分代碼,這就把各子函數(shù)中需要長延時的時間用于執(zhí)行其它程序,提高運(yùn)行效率,避免互相干擾。
回復(fù)

使用道具 舉報

6#
ID:1057946 發(fā)表于 2023-7-11 08:54 | 只看該作者
zyluglugl 發(fā)表于 2023-7-11 07:12
100ms 好象DH11都沒有轉(zhuǎn)換完成。別讀太快了,太快了也沒有意義。

確實(shí),但是怎么解決讀取傳感器期間按鍵不能用的問題呢
回復(fù)

使用道具 舉報

7#
ID:1057946 發(fā)表于 2023-7-11 08:55 | 只看該作者
TTQ001 發(fā)表于 2023-7-11 06:52
請注意,讀取傳感器的時間間隔與讀取寄存器的時間不同。 讀取寄存器并不需要花費(fèi)太多時間。

什么意思,能具體說一下嗎,新手求指教
回復(fù)

使用道具 舉報

8#
ID:1057946 發(fā)表于 2023-7-11 09:04 | 只看該作者
wulin 發(fā)表于 2023-7-11 07:21
對于DHT11這類外設(shè),一個完整的工作周期比較長,長時間的阻滯延時操作會影響其它需要及時響應(yīng)的程序的正常 ...

但是這樣會出現(xiàn)一個問題,假如該詩序要求在固定時間段內(nèi)發(fā)送一個字節(jié),那么輪詢的方法就會打亂這個時序
回復(fù)

使用道具 舉報

9#
ID:161164 發(fā)表于 2023-7-11 09:10 | 只看該作者
1. 代碼開頭那1s delay是不必要的
2. 18ms的低電平是最少時間,即是說,你可以先拉低電平,然后去干其他事,超過18ms后再回來繼續(xù)剩下的動作
3. 40bit x (50us + 70us(max)) = 4.8ms, 如果4.8ms的耗時也不能接受,可以改為用定時器捕獲下降沿時間差
回復(fù)

使用道具 舉報

10#
ID:69038 發(fā)表于 2023-7-11 10:00 | 只看該作者
溫濕傳感器100ms讀一次值毫無意義!1分鐘讀一次就夠了。
回復(fù)

使用道具 舉報

11#
ID:123289 發(fā)表于 2023-7-11 11:10 | 只看該作者
1、合理規(guī)劃時序。這與你對邏輯的的架構(gòu)方案有關(guān)。
2、禁用DELAY函數(shù),因為DELAY期間,其它程序被迫等待,誤事。改用中斷實(shí)現(xiàn)延時(希望你會這一著)。
3、如果調(diào)用的函數(shù)庫中有用到DELAY,請改之,自己寫函數(shù)。
4、不要在中斷服務(wù)程序中進(jìn)行復(fù)雜運(yùn)算等耗時大的程序運(yùn)行。因為中斷有優(yōu)先執(zhí)行的權(quán)利,會占用其它程序的時間。這些程序移至MAIN中運(yùn)行(也希望你會這一著)。
以上,需要你對單片機(jī)有較深的理解。沒有一定的功底,是解決不了你提出的問題的。
例如:
不會用中斷實(shí)現(xiàn)延時。只會用DELAY。
不會將中斷服務(wù)程序中的非緊要程序分離出來。
死等硬件(溫度傳感器)的返回信息。未預(yù)計等不到怎么辦。
對他人的函數(shù)缺點(diǎn),無法改動。
……
回復(fù)

使用道具 舉報

12#
ID:155507 發(fā)表于 2023-7-11 11:41 | 只看該作者
讀取DHT11這類需要大量延時操作的傳感器時,可以結(jié)合定時器和中斷來解決問題。以下是一種可能的解決方案:

1.配置一個定時器,讓它以較高的頻率觸發(fā)中斷,例如每隔1毫秒觸發(fā)一次中斷。

2.在中斷服務(wù)函數(shù)中,進(jìn)行按鍵消抖計時操作。

3.在主循環(huán)中使用輪詢法讀取DHT11傳感器的值。每次主循環(huán)迭代中,只讀取傳感器值的一部分,并確保不會阻塞太長時間。

4.如果需要在固定時間段內(nèi)發(fā)送一個字節(jié),可以利用定時器的輸出比較功能生成一個精確的時序。可以將要發(fā)送的字節(jié)數(shù)據(jù)預(yù)先存儲在一個緩沖區(qū)中,并在定時器的比較中斷中逐個發(fā)送字節(jié)。通過設(shè)置合適的定時器頻率和比較值,可以滿足時序要求。

下面是一個偽代碼示例,演示了上述思路:


// 定時器中斷服務(wù)函數(shù)
void TIM_IRQHandler() {
    if (TIM_GetITStatus(TIMx, TIM_IT_Update) != RESET) {
        // 按鍵消抖計時操作

        // 清除中斷標(biāo)志位
        TIM_ClearITPendingBit(TIMx, TIM_IT_Update);
    }
}

// 主循環(huán)
while (1) {
    // 讀取DHT11傳感器的值的一部分
    // 不要阻塞太長時間

    // 執(zhí)行其他任務(wù)

    // 如果需要發(fā)送字節(jié)
    if (isSendByteRequired) {
        // 通過定時器的輸出比較來生成時序
        // 逐個發(fā)送字節(jié)
    }
}
通過結(jié)合定時器中斷和主循環(huán)的輪詢,可以實(shí)現(xiàn)同時進(jìn)行傳感器讀取、按鍵消抖和其他任務(wù)的處理。同時,通過合理設(shè)置定時器的頻率和比較值,可以滿足發(fā)送字節(jié)的精確時序要求。

請注意,以上示例代碼為偽代碼,實(shí)際的實(shí)現(xiàn)可能會因具體的STM32系列和使用的開發(fā)環(huán)境而有所不同。您需要根據(jù)實(shí)際情況進(jìn)行相應(yīng)的配置和編程。
回復(fù)

使用道具 舉報

13#
ID:213173 發(fā)表于 2023-7-13 16:41 | 只看該作者
ZZZZZ134679 發(fā)表于 2023-7-11 09:04
但是這樣會出現(xiàn)一個問題,假如該詩序要求在固定時間段內(nèi)發(fā)送一個字節(jié),那么輪詢的方法就會打亂這個時序

微妙級的阻滯延時一般不影響其它程序運(yùn)行,毫秒級阻滯延時就要考慮用其它方法避免。給你一個示例參考。

DHT11溫濕度上下限報警 仿真.rar (146.88 KB, 下載次數(shù): 6)


回復(fù)

使用道具 舉報

14#
ID:1054554 發(fā)表于 2023-7-13 17:39 | 只看該作者
上述各外設(shè)的子程序,每次主循環(huán)只執(zhí)行各子函數(shù)的一部分代碼,這就把各子函數(shù)中需要長延時的時間用于執(zhí)行其它程序,提高運(yùn)行效率,避免互相干擾。
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 精品国产一级 | 99热国产在线播放 | 一区二区在线不卡 | 麻豆av电影网 | 天堂色| 91精品国产高清久久久久久久久 | 欧美片网站免费 | 国产韩国精品一区二区三区 | 国产成人一区二区三区 | 97人人干 | 美女逼网站 | 国产精品久久久免费 | 欧美日韩手机在线观看 | 国产目拍亚洲精品99久久精品 | 亚洲欧美激情四射 | 久久久av| 欧美一级艳情片免费观看 | 视频在线亚洲 | 国产成人91视频 | 国产亚洲第一页 | 日韩一区三区 | 国产在线精品一区 | 91人人爽| 欧美一区永久视频免费观看 | 国产中文字幕亚洲 | 日本精品一区二区三区在线观看视频 | 欧美又大粗又爽又黄大片视频 | 欧美a在线 | 伊人网在线综合 | 精品成人一区 | 国产精品成人久久久久a级 久久蜜桃av一区二区天堂 | 国产一区视频在线 | 久久久久久精 | 日韩一二三 | 久久久久国产一区二区三区四区 | 午夜精品久久久久久久久久久久 | 国产丝袜人妖cd露出 | 亚洲综合色婷婷 | 国产精品一级在线观看 | 国产精品一区在线观看 | 日韩激情视频一区 |