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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3002|回復: 13
打印 上一主題 下一主題
收起左側

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

[復制鏈接]
跳轉到指定樓層
樓主
現在是100毫秒讀取一次傳感器的值,但是在讀取期間,大量的延時操作會阻塞中斷函數的Key_slow_down按鍵消抖計時操作
能設置中斷優先級解決嗎,或者是設置兩個定時器、兩個中斷,在觸發中斷時會互相影響嗎
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 以越過不穩定狀態在此期間無需發送任何指令
        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的響應信號
        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不存在,則不必進行下面步驟
        {
                for(j=0;j<5;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])// 校驗數據是否正確,若不正確則數組全部寫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空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

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

使用道具 舉報

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

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

使用道具 舉報

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

但是這樣會出現一個問題,假如該詩序要求在固定時間段內發送一個字節,那么輪詢的方法就會打亂這個時序
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

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

2.在中斷服務函數中,進行按鍵消抖計時操作。

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

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

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


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

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

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

    // 執行其他任務

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

請注意,以上示例代碼為偽代碼,實際的實現可能會因具體的STM32系列和使用的開發環境而有所不同。您需要根據實際情況進行相應的配置和編程。
回復

使用道具 舉報

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

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

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


回復

使用道具 舉報

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产专区免费 | 日韩在线一区二区三区 | 亚洲精品乱码久久久久久蜜桃91 | 国产一区二区精品在线观看 | 日韩欧美三区 | 波多野结衣在线观看一区二区三区 | 日本一区二区三区精品视频 | 日韩欧美在线一区 | 日韩波多野结衣 | 亚洲视频免费在线观看 | 九九综合九九 | 91精品国产欧美一区二区成人 | 久久久久久国产精品免费免费 | 欧美午夜精品理论片a级按摩 | 久久一区二区视频 | 日韩精品一区二区三区视频播放 | 中文字幕1区 | 久久久精品一区二区三区 | 国产欧美一区二区三区在线看 | 午夜影院在线观看版 | 可以在线看的黄色网址 | 欧美日韩一区二区三区四区五区 | 一区二区三区精品视频 | 国产精品毛片一区二区在线看 | 国产大学生情侣呻吟视频 | 中文字幕在线精品 | 五月香婷婷 | 黄色在线免费网站 | 免费国产一区二区 | 国产一区二区在线免费观看 | 国产一区二区三区在线 | 影视一区 | 一区二区三区四区av | 四虎永久影院 | av中文字幕网站 | 午夜看片网站 | 中文字幕11页| 中文字幕亚洲欧美日韩在线不卡 | 日本成人在线播放 | 国产日韩久久 | 国产成人在线观看免费 |