外部看门狗定时器是那些无法为微控制器或稳定电路开发适当工作程序的开发人员的拐杖。
此外,大多数现代微控制器都提供内置的WDT。
但是有些时候,您必须处理带有某些问题的成品板或模块。
我制作了第一个WDT以处理ESP8266的罕见但仍有时发生的挂起。 而且,软重置没有保存,然后ESP机柜不想重新连接到WiFi。 使用外部WDT使电源失真解决了该问题。
第二个问题是
Elecrow ATMEGA 32u4 A9G GSM控制器引起的 。 在这里,很少发生SIM卡冻结的情况。 (顺便说一下,3G和4G USB调制解调器也会发生同样的问题)。 为了解决这种冻结问题,您需要使SIM-KE的电源失真。 而且似乎GSM调制解调器也可以得出结论,但是该功能未包含在设备电路中。 为了获得最大的可靠性,我再次不得不求助于外部护卫犬。
我没有在计时器555上重复该电路。 她发现了太多缺陷:
- 大尺寸和很多捆扎
- 使用调谐电阻器不方便设置响应时间
- 相当长的复位时间(需要电容器放电)
- 好吧,当计时器停止工作时,计时器输出处的MK可能会挂起一个低电平。
- 而且我在互联网上找不到完全符合我要求的OpenSource项目。
新WDT的要求
- 设备成本低,易于制造且尺寸小
- 在输入上控制逻辑电平0/1的周期性变化
- 简单调整响应时间(作为选择,可以选择预定义的时间间隔)
铁的发展
选择了
ATtiny13微控制器作为主微电路。 它的功能足以满足我的任务。 而且,考虑到减少了捆扎元件,其价格与555微电路的价格几乎相同。

MK(RESET决定不触摸)的五个结论分配如下:
- 定时器输出
- 重置输入
- 剩下的三个结论是响应时间。
对于开关电源,使用P沟道MOSFET。 任何兼容的情况都是合适的,但建议将其与所谓的“逻辑控制电平”一起使用-也就是说,它会在3-5V的低压下完全断开:IRMLL2502,AO3415等。 尽管其尺寸很小,但该晶体管仍能够控制4A的负载。 如果您需要切换其他东西,则可以将5V继电器直接连接到此输出。
激活计时器并关闭主机后,LED会亮起。
连接到微控制器板的主连接器有四个输出
- 普通巴士
- 输入-重置计时器
- + 5V输出(由计时器控制)
- 输入+ 5V
两个连接器-ICSP编程器和电源跳线不能安装在板上。 预先刷新编程器中的微控制器,并使用恒定的跳线设置响应时间。
零件清单
制造业
板子很小-18×22毫米。 我有两个选择:
对于LUT的单面制造:


并且为了在工厂订购具有改进的设计以及双方之间的过渡。 (我有时会从中文订购)


家用技术提供了这种原型。



韧体
对于固件,我使用了基于Arduino Nano的自制编程器

我在
Arduino IDE中编程,安装了对
Attiny13-MicroCore的支持。 IDE的最新版本在ArduinoISP编程器上存在问题,但在Arduino IDE 1.6.13版本中运行良好。 友好的团队arduino.cc不想
弄明白那里到底是怎么回事))))

Tinku调谐为使用1.2 MHz频率的内部谐振器工作。 该程序很简单-配置输入/输出,读取PB2-PB4并确定响应时间,设置计时器并切换到IDLE模式。 根据定时器中断,我们确定控制输入的状态。 如果状态变为相反状态,请重置计数器。 如果计数器读数超过设置的响应时间,我们会使输出功率失真。
#define F_CPU 1200000UL #include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> boolean pb1_state; volatile uint16_t pb1_count; // TIMER0 ISR(TIM0_OVF_vect){ pb1_count++; } int main(){ // PB0 DDRB |= (1 << PB0); // pinMode(PB0, OUTPUT); PORTB &= ~(1 << PB0); // digitalWrite(PB0, LOW);} // PB1 DDRB &= ~(1 << PB1); // pinMode(PB1, INPUT_PULLUP); PORTB |= (1 << PB1); // PB2 DDRB &= ~(1 << PB2); // pinMode(PB2, INPUT_PULLUP); PORTB |= (1 << PB2); // PB3 DDRB &= ~(1 << PB3); // pinMode(PB3, INPUT_PULLUP); PORTB |= (1 << PB3); // PB4 DDRB &= ~(1 << PB4); // pinMode(PB4, INPUT_PULLUP); PORTB |= (1 << PB4); // PB2,PB3,PB4 ( ) (, = TM/4 ) uint16_t TM = 0; bool pb2 = false; bool pb3 = false; bool pb4 = false; if( PINB & (1 << PINB2) )pb2 = true; if( PINB & (1 << PINB3) )pb3 = true; if( PINB & (1 << PINB4) )pb4 = true; if( pb2 == true && pb3 == true && pb4 == true )TM = 4; // 1 else if( pb2 == false && pb3 == true && pb4 == true )TM = 8; // 2 else if( pb2 == true && pb3 == false && pb4 == true )TM = 20; // 5 else if( pb2 == false && pb3 == false && pb4 == true )TM = 40; // 10 else if( pb2 == true && pb3 == true && pb4 == false )TM = 80; // 20 else if( pb2 == false && pb3 == true && pb4 == false )TM = 120; // 30 else if( pb2 == true && pb3 == false && pb4 == false )TM = 240; // 60 else if( pb2 == false && pb3 == false && pb4 == false )TM = 480; // 120 pb1_count = 0; pb1_state = false; // ADC PRR = (1<<PRADC); // shut down ADC // TIMSK0 = (1<<TOIE0); // TIMER0 TCCR0B = (1<<CS02) | (1<<CS00); // 1/1024 // MCUCR &= ~(1<<SM1); // idle mode MCUCR &= ~(1<<SM0); // idle mode MCUCR |= (1<<SE); sei(); while(1) { // asm("sleep"); // TIMSK0 &= ~ (1<<TOIE0); // TIMER0 // PB1 bool pb1 = false; if( PINB & (1 << PINB1) )pb1 = true; // , if( pb1 != pb1_state )pb1_count = 0; pb1_state = pb1; // if( pb1_count >= TM ){ PORTB |= (1 << PB0); // digitalWrite(PB0, HIGH);} _delay_ms(1000); // PORTB &= ~(1 << PB0); // digitalWrite(PB0, LOW);} pb1_count = 0; // } TIMSK0 = (1<<TOIE0); // TIMER0 sei(); } return 0; }
所有代码都可以容纳340个字节-恰好是一千字节的小巧内存的三分之一。 只需检查计时器的操作-根据安装时间-LED定期点亮1秒钟。 此时,输出Vout电压5V消失。 如果“输入”触点以1秒的频率接地,则不会执行复位并且LED不会点亮。
主程序中的WDT管理如下
#define PIN_WDT 5
仅此而已。 所有源文件,电路和电路板均可从以下位置下载
Github