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

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

1. 前言

最近使用esp8266进行远程遥控时, 但是在驱动舵机servo库的过程中出现了esp8266 自动重启问题, 具体表现为串口助手不断输出错误信息,如下。

1.png

--------------- 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.png

2. 分析问题

2.1 长时间没有喂狗

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


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舵机握手


3.png



/*
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函数定义时,设定范围就可解决


servo_R.attach(D5,500,2500);


4. 小结

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

目录
相关文章
|
6月前
|
Linux
linux启动卡一会在random: nonblocking pool is initialized之前
linux启动卡一会在random: nonblocking pool is initialized之前
600 1
|
2月前
|
开发工具 git
7-5git reset --hard origin/master代表什么意思
7-5git reset --hard origin/master代表什么意思
|
6月前
|
Linux
嵌入式Linux系统(NUC980)tf卡出错处理errors=remount-ro改为errors=continue
嵌入式Linux系统(NUC980)tf卡出错处理errors=remount-ro改为errors=continue
138 1
|
机器学习/深度学习 人工智能 自然语言处理
Schneider 140CPU67160 SEW DFS56L-TF-RH1M-KK
Schneider 140CPU67160 SEW DFS56L-TF-RH1M-KK
64 0
|
Linux
Linux重新启动后提示 Failed to load SELinux policy. Freezing系统hung住
重新启动之前修改了selinux的配置,disable selinux,估计多半是修改的时候哪里改错了。
229 0
|
Ubuntu
ubuntu启动virtualbox出错解决办法:RTR3InitEx failed with rc=-1912 (rc=-1912)
ubuntu启动virtualbox出错解决办法:RTR3InitEx failed with rc=-1912 (rc=-1912)
715 0
ubuntu启动virtualbox出错解决办法:RTR3InitEx failed with rc=-1912 (rc=-1912)
|
流计算
四十四、nimbus,supervisor进程自动停止(Read a frame size of ..., which is bigger than the maximum allowable...)
四十四、nimbus,supervisor进程自动停止(Read a frame size of ..., which is bigger than the maximum allowable...)
四十四、nimbus,supervisor进程自动停止(Read a frame size of ..., which is bigger than the maximum allowable...)