PIC32 Wake From Idle reset type: ¿qué puede causar esto?

0

Tengo un sistema que contiene un microcontrolador PIC32 que controla la conmutación de matrices de electroimanes. Estas preguntas anteriores proporcionan información de antecedentes sobre el sistema en cuestión aquí:

La mayoría de los cambios mencionados / sugeridos al diseño en estas preguntas anteriores se han incorporado en un diseño de PCB revisado que contiene el PIC32. (También se determinó que el evento de restablecimiento no es un evento de restablecimiento de MCLR). Para completar, aquí están los cambios que se han hecho al diseño original (aparte de un rediseño completo del diseño de PCB):

  • Se agregaron resistencias a las puertas MOSFET.
  • Diodos Schottky para la supresión del retroceso inductivo.
  • Un aumento significativo en los capacitores de derivación en el PIC.
  • Cambie de un diseño de 2 capas a un diseño de 4 capas, con un plano de poder interno (el segundo plano desde la parte superior) y un plano de tierra interno (el segundo plano desde la parte inferior).
  • Se colocó un escudo metálico conectado a tierra sobre el PIC.

Los cambios anteriores se hicieron antes de que se produjera un problema de fuente de alimentación inestable al PIC, en particular en un evento de reinicio de reducción de tensión causado por un rebote en tierra.

Aquí se muestra una ilustración del nuevo diseño de PCB, centrado en el PIC:

Aquíhayunextractodelesquema,quemuestraloscondensadoresdedesacoplamiento:

(Tengaencuentaqueloscomponentescondesignador"SH" son derivaciones muy cortas para los propósitos de enrutar correctamente los condensadores de desacoplamiento. El crédito va a Olin Lathrop por esta idea y por hacer disponible este componente de derivación desde su biblioteca EAGLE).

Tenga en cuenta que los condensadores de desacoplamiento (3x en cada par de clavijas de alimentación PIC) se colocan lo más cerca posible de las clavijas de alimentación. Además, dado que las 2 capas medias de la PCB son los planos de potencia y tierra, estos condensadores de desacoplamiento se enrutan directamente a estos planos internos, y ninguna de las dos capas exteriores contiene ningún plano, simplemente están pobladas por pistas de señal y componentes. En resumen: se han tenido en cuenta todas las sugerencias contenidas en la hoja de datos PIC con respecto al diseño óptimo de PCB.

Hasta ahora, no había una funcionalidad confiable para registrar el tipo de reinicio que se produjo. Ahora que esto se ha solucionado, he logrado capturar el estado del Registro de control de reinicio (RCON) cuando se producen estos reinicios. Se realizó una prueba en vivo para capturar estos eventos de reinicio y se redujo a solo el bit IDLE (Wake From Idle Flag) en el registro RCON que se configuró al inicio (después de que se produjo el reinicio).

De acuerdo con la hoja de datos del PIC, parece que el estado inactivo se logra mediante la emisión de la instrucción WAIT, algo que nunca ocurre en ningún lugar en mi código fuente. Todo parece indicar que el dispositivo se puso en modo inactivo, pero simplemente no funciona. Dado que el diseño de la PCB se ha revisado exhaustivamente, tengo serias dudas de que aún podría ser un problema de alimentación inestable para el PIC: el bit BOR (restablecimiento de reducción de tensión) nunca se establece durante un restablecimiento, a excepción de un encendido restablecer (junto con el bit POR, que es totalmente normal para un inicio del sistema).

No se puede determinar ninguna cadena particular de eventos de conmutación que cause este evento de reinicio; es realmente intermitente. Varía de ocurrir solo después de aproximadamente 20 minutos de conmutación constante de los electroimanes, y algunas veces solo después de aproximadamente 3 minutos de conmutación constante.

Dado que no hay ninguna instrucción de ESPERA en mi código fuente, ¿qué podría causar que el PIC pase repentinamente al estado inactivo? ¿Podría una excepción (como un desbordamiento de pila o un desbordamiento de pila) causar este evento de reinicio? ¿Podría todavía estar relacionado con el poder? ¿Podría algo en la configuración del módulo abrir una puerta para que esto suceda? Los bits de configuración que se utilizan se indican a continuación:

// DEVCFG3
//#pragma config PMDL1WAY = OFF           // Peripheral Module Disable Configuration (Allow multiple reconfigurations)
//#pragma config IOL1WAY = OFF            // Peripheral Pin Select Configuration (Allow multiple reconfigurations)
//#pragma config FUSBIDIO = OFF            // USB USID Selection (Controlled by the USB Module) 
//#pragma config FVBUSONIO = OFF           // USB VBUS ON Selection (Controlled by USB Module)
// DEVCFG2 /* see DEFINES section for further details on oscillator configuration */
#pragma config FPLLIDIV = DIV_2        // PLL Input Divider (2x Divider)
#pragma config FPLLMUL = MUL_20        // PLL Multiplier (20x Multiplier)
#pragma config FPLLODIV = DIV_1       // System PLL Output Clock Divider (PLL Divide by 2)
//#pragma config UPLLIDIV = DIV_1        // USB PLL Input Divider (12x Divider)
//#pragma config UPLLEN = OFF             // USB PLL Enable (Disabled and Bypassed)
// DEVCFG1
#pragma config FNOSC = FRCPLL             // Oscillator Selection Bits (Fast RC Osc with PLL (FRCPLL))
#pragma config FSOSCEN = OFF             // Secondary Oscillator Disnable (Disabled)
#pragma config IESO = ON                // Internal/External Switch Over (Enabled)
#pragma config POSCMOD = OFF            // Primary Oscillator Configuration (Primary osc disabled)
#pragma config OSCIOFNC = OFF           // CLKO Output Signal Active on the OSCO Pin (Disabled)
#pragma config FPBDIV = DIV_1           // Peripheral Clock Divisor (Pb_Clk is Sys_Clk/1)
#pragma config FCKSM = CSECMD           // Clock Switching and Monitor Selection (Clock Switch Disable, FSCM Disabled)
#pragma config WDTPS = PS1048576        // Watchdog Timer Postscaler (1:1048576)
//#pragma config WINDIS = OFF             // Watchdog Timer Window Enable (Watchdog Timer is in Non-Window Mode)
#pragma config FWDTEN = OFF             // Watchdog Timer Enable (WDT Disabled (SWDTEN Bit Controls))
//#pragma config FWDTWINSZ = WISZ_25      // Watchdog Timer Window Size (Window Size is 25%)
// DEVCFG0
//#pragma config JTAGEN = OFF             // JTAG Enable (JTAG Disabled)
#pragma config ICESEL = ICS_PGx1        // ICE/ICD Comm Channel Select (Communicate on PGEC1/PGED1)
#pragma config PWP = OFF                // Program Flash Write Protect (Disable)
#pragma config BWP = OFF                // Boot Flash Write Protect bit (Protection Disabled)
#pragma config CP = OFF                  // Code Protect (Protection Enabled)

La única interrupción utilizada es para la recepción de datos UART desde un subsistema diferente.

Cualquier ayuda sería muy apreciada.

    
pregunta wave.jaco

0 respuestas

Lea otras preguntas en las etiquetas