El módulo PWM del microcontrolador STC8H, con sus 8 canales de 16 bits, relojes independientes para PWMA y PWMB, y características como salidas complementarias y control de tiempo muerto, es altamente versátil para aplicaciones como control de motores y regulación de iluminación LED. Sin embargo, su complejidad en la inicialización propicia erores comunes que pueden resultar en la ausencia de señal, frecuencias incorrectas o comportamientos inestables en el sistema.
- Acceso a registros extendidos: habilitación obligatoria
Los registros de configuración del PWM (por ejemplo, PWMA_CCMR1, PWMA_ARR) residen en una región de memoria extendida del SFR. Después de un reinicio, el microcontrolador no permite su acceso directo; se debe activar un bit específico para autorizar la operación. Omitir este paso invalida cualquier configuración posterior, resultando en salidas sin actividad.
Diagnóstico: Al monitorear los pines con un osciloscopio, no se observa forma de onda, a pesar de que el código aparenta ser correcto en cuanto a relojes, modos de GPIO y parámetros PWM.
Solución: Invocar la macro EAXSFR() o configurar manualmente el bit 7 del registro P_SW2 antes de cualquier manipulación de registros PWM. Este paso debee realizarse al inicio de la inicialización, preferentemente en la función main(), después de configurar el sistema de reloj pero antes de configurar otros periféricos.
#include "STC8H.h"
void setup_pwm() {
// Habilitar acceso a registros extendidos
EAXSFR();
// Configuraciones adicionales del reloj y GPIO...
// Inicialización del módulo PWM
// ...
}
void main() {
setup_pwm();
while(1) {
// Lógica principal
}
}
Alternativamente, es válido colocar EAXSFR() dentro de la función de configuración PWM, siempre que esta se llame tempranamente en el flujo de inicialización.
- Configuración de pines: modo y asignación funcional
Los pines de salida PWM deben asignarse mediante la función de conmutación de pines y configurarse en modo push-pull (salida a dos estados) para garantizar una conducción adecuada. Usar modos como bidireccional con pull-up o drenaje abierto provoca salidas débiles o requiere componentes externos, generando fallos como atenuación en LEDs o torque insuficiente en motores.
Diagnóstico: Señal PWM presente pero con amplitud reducida, tiempos de respuesta lentos o calentamiento anormal del actuador.
Solución: Durante la inicialización de los GPIO, definir explícitamente el pin seleccionado como salida push-pull. Además, verificar el registro de asignación de pines para mapear correctamente el canal PWM al pin físico deseado.
#include "STC8H.h"
#define PWM_PIN P1_0
void configurar_pin_pwm() {
// Establecer P1.0 como salida push-pull
P1M0 |= 0x01;
P1M1 &= ~0x01;
// Asignar la función PWM al pin (ejemplo usando registro de asignación)
// P_SW2 = (P_SW2 & ~0x04) | 0x00; // Ajustar según el pin requerido
}
void main() {
EAXSFR();
configurar_pin_pwm();
// Resto de inicialización PWM...
while(1) {}
}
Es crucial consultar la hoja de datos para determinar la asignación de pines específica, ya que varía entre paquetes y versiones del STC8H.