ESP8266毫秒微秒延時測量

陳拓 [email protected] 2020/06/19-2020/06/22

1. 概述

在實際工作中我們經常用到較爲精確的延時,比如在讀取溫度傳感器DS18B20時。

ESP8266 Non-OS SDK的延時函數os_delay_us的最大值是65535us,我們可以通過循環來增加延時。

我們用來測量的樣品是ESP8266-01S,測試儀器是廣州致遠的LA1016邏輯分析儀。

2. 毫秒級延時

  • 測試代碼
#include "gpio.h"

LOCAL void ICACHE_FLASH_ATTR delay_ms(u32 x)
{
    for(;x>0;x--) {
        os_delay_us(1000);
    }
}

void user_init(void)
{
    PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO2_U,FUNC_GPIO2);

	while(1) {
		GPIO_OUTPUT_SET(GPIO_ID_PIN(2), 1);
		delay_ms(1);
		GPIO_OUTPUT_SET(GPIO_ID_PIN(2), 0);
		delay_ms(1);
	}
}

代碼寫在文件user_main.c的void user_init(void)函數中。

  • 邏輯分析儀設置

  • 測試

ESP8266先上電,在邏輯分析儀界面上點擊“啓動(單次)”按鈕

查看波形,測量時間。

高電平延時:

一個週期延時:

可以看到1ms的延時很準確。

3. 微秒級延時

  • 1us測試代碼
    while(1) {
        GPIO_OUTPUT_SET(GPIO_ID_PIN(2), 1);
        os_delay_us(1);
        GPIO_OUTPUT_SET(GPIO_ID_PIN(2), 0);
        os_delay_us(1);
    }
  • 邏輯分析儀設置

  • 波形和時間測量

高電平延時:

低電平延時:

可以看到1us延時實測超過2us,而且高低電平延時有差異。

一個週期的測量:

  • 10us測試代碼
 while(1) {

        GPIO_OUTPUT_SET(GPIO_ID_PIN(2), 1);

        os_delay_us(10);

        GPIO_OUTPUT_SET(GPIO_ID_PIN(2), 0);

        os_delay_us(10);

}
  • 10us波形和測量

高電平延時:

一個週期延時:

由此可以看出微秒延時誤差大約是+1us~+2us。時間越短誤差越大。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章