ESP32 PCNT的测试

1、 先了解一下我上篇写的。
https://www.jianshu.com/p/1f7bb66d9b40

2、 创建了一个定时器


static void periodic_timer_callback(void* arg)
{
    //int64_t time_since_boot = esp_timer_get_time();
    //ESP_LOGI(TAG, "Periodic timer called, time since boot: %010lld us", time_since_boot);
            printf("------->Event PCNT unit<-------------%d\n",hallGetCounter(HALL_PCNT_UINT_L));
        hallClearCounter(HALL_PCNT_UINT_L);
}

void my_time_init(void)
{
    const esp_timer_create_args_t periodic_timer_args = {
            .callback = &periodic_timer_callback,
            /* name is optional, but may help identify the timer when debugging */
            .name = "periodic"
    };
        esp_timer_handle_t periodic_timer;
    ESP_ERROR_CHECK(esp_timer_create(&periodic_timer_args, &periodic_timer));
    ESP_ERROR_CHECK(esp_timer_start_periodic(periodic_timer,  1000000));

}

3、 创建4个任务

void reset_task(void *arg)
{
uint32_t i;
    uint32_t j;

    int *tab;

    while(1)
    {
        i=0xfffff;
        while(i)
        {
            i--;
            for (j=0; j<100;j++)
            {
            }
        }
    printf("------->reset_task<------------:%d\n",*((int *) arg));
    vTaskDelay(1000 / portTICK_RATE_MS);
    
        
    }
}

int task1_par =1;
int task2_par =2;


int task3_par =3;
int task4_par =4;


void my_create_task(void)
{
    xTaskCreatePinnedToCore(reset_task, "reset task", 2048, (void*)&task1_par, 10, NULL, 1);
    xTaskCreatePinnedToCore(reset_task, "reset task", 2048, (void*)&task2_par, 10, NULL, 1);


    xTaskCreatePinnedToCore(reset_task, "reset task", 2048, (void*)&task3_par, 10, NULL, 0);
    xTaskCreatePinnedToCore(reset_task, "reset task", 2048, (void*)&task4_par, 10, NULL, 0);

}


4、测试应用和效果

void app_main()
{   
    hallInit();
    hallStartCounter(HALL_PCNT_UINT_L);
    my_time_init();
    my_create_task();

    while(1)
    {
    
        vTaskDelay(1000 / portTICK_RATE_MS);
    }

}


image.png
image.png

在这种极端的条件下,误差在0.7%。

你可能感兴趣的:(ESP32 PCNT的测试)