【关于eps8266自动重启 Soft WDT reset】

【关于eps8266自动重启 Soft WDT reset】

  • 1. 前言
  • 2. 分析问题
    • 2.1 长时间没有喂狗
    • 2.2 delayMicroseconds 函数触发
  • 3. 解决问题
    • 3.1 解决长时间没有喂狗
    • 3.2 解决`delayMicroseconds` 函数触发
    • 3.3 设置定义域
  • 4. 小结

【关于eps8266自动重启 Soft WDT reset】_第1张图片

1. 前言

最近使用esp8266进行远程遥控时, 但是在驱动舵机servo库的过程中出现了esp8266 自动重启问题, 具体表现为串口助手不断输出错误信息,如下。
【关于eps8266自动重启 Soft WDT reset】_第2张图片

--------------- CUT HERE FOR EXCEPTION DECODER ---------------

Soft WDT reset

>>>stack>>>

ctx: cont
sp: 3ffffce0 end: 3fffffc0 offset: 01a0
3ffffe80:  00000002 40105a43 00000001 60000200 
3ffffe90:  00000002 4000410f 00001001 00000205 
3ffffea0:  3fffc718 40004a3c 000003fb 00000001 

在这里插入图片描述

2. 分析问题

2.1 长时间没有喂狗

显然是由于长时间没有喂狗导致的看门狗复位, 原因是在loop函数中长时间执行函数,没有延时函数delay

【关于eps8266自动重启 Soft WDT reset】_第3张图片

2.2 delayMicroseconds 函数触发

注意的是 delay 函数和 delayMicroseconds 函数之间的区别, 长时间执行 delay 函数不会出现复位, 但是长时间执行 delayMicroseconds 函数则会导致复位

delayMicroseconds(1000);
servo.write(90);//舵机驱动自带delayMicroseconds操作

由于远程控制中含有Ticker定时器与`delayMicroseconds``冲突

Ticker是ESP32 arduino的自带库,可以设置以固定时间间隔反复执行某个任务,特别适合以固定频率从传感器收集数据。
官方解释:Arduino Ticker 库允许您轻松创建 Ticker 回调,这些回调可以在预定的时间间隔内调用函数。您可以更改回调的重复次数,如果重复为 0,则代码以无限模式运行。工作方式类似于“线程”,必要时将运行辅助函数。该库不使用硬件计时器的中断,并使用micros() / millis()函数。您(实际上)不受股票代码数量的限制。

3. 解决问题

3.1 解决长时间没有喂狗

所以添加了喂狗函数或者delay函数,如下

ESP.wdtFeed();
delay(100);//延时100ms

3.2 解决delayMicroseconds 函数触发

解决delayMicroseconds 函数问题关键在于替代方法,delay 函数内部有喂狗机制, 而 delayMicroseconds 没有这个机制,自己写一个servo驱动函数,具体可见Arduino与SG90舵机握手

【关于eps8266自动重启 Soft WDT reset】_第4张图片

/*

int servopin 是端口号
int myangle  目标位置0~180度,此函数不精确,只有4分度-90 -45 45 90
int loops    循环次数,响应时间
*/
void servopulse(int servopin, int myangle, int loops) /*定义一个脉冲函数,用来模拟方式产生PWM值*/
{
  for (int i = 0; i <= loops; i++)  //给予舵机足够的时间让它转到指定角度
  {
    int pulsewidth = (myangle * 11) + 500;  //将角度转化为500-2480 的脉宽值
    digitalWrite(servopin, HIGH);           //将舵机接口电平置高
    delay(pulsewidth / 1000);               //延时脉宽值的微秒数
    digitalWrite(servopin, LOW);            //将舵机接口电平置低
    delay(20 - pulsewidth / 1000);          //延时周期内剩余时间
  }
  delay(1);
}

3.3 设置定义域

采用舵机的attach函数定义时,设定范围就可解决
【关于eps8266自动重启 Soft WDT reset】_第5张图片

servo_R.attach(D5,500,2500);

4. 小结

通过对这篇文章我们掌握了关于eps8266自动重启 Soft WDT reset问题解决,接下来会有许多有趣的实验,尝试与Arduino通讯做语音小车,进而丰富我们的生活。从而实现对外部世界进行感知,充分认识这个有机与无机的环境,科学地合理地进行创作和发挥效益,然后为人类社会发展贡献一点微薄之力。

参考文献:

eps8266自动重启问题, Soft WDT reset (已解决)
Arduino:关于解决 pluseIn与官方舵机库冲突的办法
ESP32 Arduino Ticker定时库

你可能感兴趣的:(arduino学习,单片机,物联网,嵌入式硬件)