ศึกษาเรื่องการแก้ปัญหา Watchdog Timer (WDT)

ข้อมูลนี้ถูกเก็บไว้หลังบ้านนานแล้วครับ ขอแชร์ออกมาให้เผื่อใครต้องการข้อมูล ผมรวบรวมมาจากหลายที่ ผมเน้นศึกษากันแบบกลุ่มนะครับ เพราะฉะนั้นมีอะไรแชร์ได้อย่างเต็มที่ ถ้าคิดว่าจะเป็นประโยชน์ต่อผู้คน

ภาพ

ภาพ

1 Likes

Another solution:
I use an ESP32 Doit Board. By replacing the small diode on the USB input I could successfully fix this problem. (red) Use a Schottky Diode with a low voltage drop!
Extra capacitance is good, too (yellow).
I re-soldered all ESPP32 Pins , just in case (blue).

ฉันใช้บอร์ด ESP32 Doit โดยการเปลี่ยนไดโอดขนาดเล็กบนอินพุต USB ฉันสามารถแก้ไขปัญหานี้ได้สำเร็จ (สีแดง) ใช้ Schottky Diode ที่มีแรงดันตกต่ำ!
ความจุพิเศษก็ดีด้วย (สีเหลือง)
ฉันบัดกรี ESPP32 Pins ใหม่ทั้งหมด เผื่อไว้ (สีน้ำเงิน)

inkedimg_20180626_115127_li

1 Likes

Debugger ESP32

https://www.visualmicro.com/page/Arduino-development-plugin-for-Visual-Studio.aspx

1 Likes

ผมเคยเจอ อาการติดๆ ดับๆ และมันชอบ restart
หลังจากที่เกาะ wifi ได้ เป็นบ่อยมาก หรือไม่ก็ค้าง
ไปเลยก็มี
บน ESP32 โดยผมใช้ Hardware Serial ทั่งคู่
และถ้าใช้ PZEM ตัวเดียวไม่มีปัญหาอะไร แต่พอ
ต่อ 2 ตัวเมือไร อาการเริ่มมา เป็นระยะๆ ลองหาวิธี
แก้อยู่หลายวิธี จนจับทางได้
วิธีแก้ของผมคือ แยกไฟเลี้ยงของ PZEM ทั้งคู่นี้
ออกจากกัน (ก่อนหน้านี้ทั้งคู่ใช้ไฟเลี้ยง 5v จาก
ESP32 ขา vin).
ผมแยกโดยให้ PZEM-017 ใช้ไฟ 5v จากขา vin
ของ esp32
ส่วน PZEM004t ใช้ไฟจากขา 3.3v จาก esp32
(ทั้งคู่ยังคงใช้ไฟจาก ESP32 แต่แค่แยก เอาไฟ
จาก regulator คนละที)
แล้วอารการหาย งง เหมือนกัน ใช้ได้จนถึงทุกวันนี้
ผมคิดว่าน่าจะเป็นทีสัญญาณรบกวนหรือป่าวไม่
แน่ใจ

การ RTC Watchdog

ตัวจับเวลาจ้องจับผิดนี้มีไว้สำหรับการวิเคราะห์ ESP32 อย่างเต็มรูปแบบ เพื่อให้แน่ใจว่าระบบทั้งหมดจะไม่ติดขัด เช่น สัญญาณรบกวนจากพลังงาน ความล้มเหลวของ CPU และอื่นๆ

IDF ใช้มัน (โดยค่าเริ่มต้น) เฉพาะระหว่าง bootloader และถูกปิดใช้งานก่อน app_main() อย่างไรก็ตาม เราสามารถเปิดใช้งานเพื่ออนุญาตให้ผู้ใช้ควบคุมได้ ในการทำเช่นนี้เพียงเปิดใช้งานใน “menuconfig> bootloader config> อนุญาตให้ปิดใช้งาน RTC WDT ในรหัสผู้ใช้”

#include <freertos/FreeRTOS.h>
#include <freertos/task.h>
#include <soc/rtc_wdt.h>
#include <esp_log.h>
 
 
void app_main()
{
 
   while (1)
   {
       rtc_wdt_feed(); //Alimenta o RTC WDT
 
       ESP_LOGI("Teste", "OK");
       vTaskDelay(pdMS_TO_TICKS(900));
   }
}

โค้ดด้านบนฟีด RTC WDT ก่อนหมดเวลา (1000 ms) อย่างไรก็ตาม หากคุณเพิ่มการหน่วงเวลาหรือแสดงความคิดเห็นในบรรทัดฟีด จะทำให้ ESP32 รีสตาร์ท

idf.py -p COM10 flash
idf.py build

แก้ wdt reset เพิ่มคำสั่ง

  disableCore0WDT();
  disableCore1WDT();

วิธีที่ 1

#include "esp_task_wdt.h"
esp_task_wdt_reset();

วิธีที่ 2

#include "soc/timer_group_struct.h"
#include "soc/timer_group_reg.h"
void feedTheDog(){
  // feed dog 0
  TIMERG0.wdt_wprotect=TIMG_WDT_WKEY_VALUE; // write enable
  TIMERG0.wdt_feed=1;                       // feed dog
  TIMERG0.wdt_wprotect=0;                   // write protect
  // feed dog 1
  TIMERG1.wdt_wprotect=TIMG_WDT_WKEY_VALUE; // write enable
  TIMERG1.wdt_feed=1;                       // feed dog
  TIMERG1.wdt_wprotect=0;                   // write protect
}