Skip to content

PWM con State Configurable Timer (SCT)

Gonzalo G. Fernández edited this page Feb 9, 2020 · 2 revisions

Funcionamiento del SCT para generar salida PWM

En la siguiente figura se puede observar el funcionamiento del SCT para la generación de una salida PWM:

Sin entrar en detalles de la implementación en hardware del SCT, consiste en un contador que se incrementa y desborda al llegar al máximo, generando una señal diente de cierra como el de la figura. Se puede obtener, entonces, una onda modulada si la salida se setea en alto cuando dicho contador se resetea a cero; y si la salida se setean en bajo cuando el contador alcanza un valor específico menor al máximo del contador (registro MATCH). Variando el valor en MATCH se puede variar el duty-cycle de 0 a 100%.

Multi Channel

Utilizar SCT permite la generación de diferentes señales con la misma frecuencia pero duty-cycle independientes. Cada salidad se denomina canal PWM.

Para más información soble el SCT, ver capítulo 30 del Chip User Manual "LPC43xx/LPC43Sxx State Configurable Timer (SCT)".

Configuración del SCT para salida PWM con librería LPCOpen

A continuación se describen los pasos básicos para configurar una salida PWM en un determinado pin, haciendo uso del SCT, con el driver SCTPWM que provee la librería LPCOpen. A su vez se aplican los diferentes pasos a la aplicación concreta en un pin que se utilizará para el control del servo motor Tower Pro SG90.

  1. Inicializar SCT con API Chip_SCTPWM_Init:
// inc/servo.h
#define SCT_PWM    LPC_SCT

// src/servo.c
Chip_SCTPWM_Init( SCT_PWM );
  1. Setear frecuencia del SCT con API Chip_SCTPWM_SetRate:
// inc/servo.h
#define SCT_PWM_RATE    50 // Frecuencia PWM 50Hz

// src/servo.c
Chip_SCTPWM_SetRate( SCT_PWM, SCT_PWM_RATE );
  1. Configurar PinMUX para el pin SCT_OUTx, donde x es el número SCT_OUT del pin (ver capítulo 16 del Chip User Manual "LPC43xx/LPC43Sxx Pin configuration", y la descripción del pin utilizado):
// inc/servo.h
// Se utiliza el pin P4_1
#define SCU_PORT_SERVO    0x4 // Puerto 4 de SCU
#define SCU_PIN_SERVO     1   // Pin 1 de SCU

// src/servo.c
Chip_SCU_PinMuxSet( SCU_PORT_SERVO, SCU_PIN_SERVO, ( SCU_MODE_INACT | SCU_MODE_FUNC1 ) );
  1. Asignar un pin de salida PWM a un canal del SCT con API Chip_SCTPWM_SetOutPin (en la figura al inicio de la sección puede observarse el motivo por el que se selecciona index 2):
// inc/servo.h
#define SCT_PWM_PIN_SERVO    1 // COUT1, Pin TFIL_1 o SERVO0
#define SCT_PWM_SERVO        2 // Index 2

// src/servo.c
Chip_SCTPWM_SetOutPin( SCT_PWM, SCT_PWM_SERVO, SCT_PWM_PIN_SERVO );
  1. Setear el duty-cycle para la salida de PWM generada en el canal, con API Chip_SCTPWM_SetDutyCycle:
// src/servo.c
Chip_SCTPWM_SetDutyCycle( SCT_PWM, SCT_PWM_SERVO, 0 ); // duty-cycle inicializado en 0
  1. Repetir pasos 3, 4 y 5 para el número de canales deseados. Opcional

  2. Lanzar el canal PWM en la salida configurada, con API Chip_SCTPWM_Start:

Chip_SCTPWM_Start( SCT_PWM );
  1. Modificar el duty-cycle al requerido en la aplicación. Se puede utilizar la API Chip_SCTPWM_PercentageToTicks para modificarlo mediante un porcentaje de duty-cycle:
uint32_t valor_porcentaje = 50;

Chip_SCTPWM_SetDutyCycle( SCT_PWM, SCT_PWM_SERVO, 
        Chip_SCTPWM_PercentageToTicks( SCT_PWM, valor_porcentaje ) );
  1. Se puede detener el SCT mediante la API Chip_SCTPWM_Stop:
Chip_SCTPWM_Stop( SCT_PWM );

Además del capítulo 30 del Chip User Manual "LPC43xx/LPC43Sxx State Configurable Timer (SCT)", ver la siguiente publicación How to use SCT as a standard PWM using LPCOpen en NXP Community, por LPCware Support.

Descripción del pin utilizado

El pin utilizado como salida PWM para el control del servo motor es el siguiente:

EDU-CIAA-NXP SCU GPIO SCT
T_FIL1 P4_1 GPIO2[1] CTOUT_1

Salida observada

Mediante el analizador lógico Saleae de 8 canales y 24 MHz, se pudo observar la salida PWM ya configurada, con un duty-cycle de 30% en el canal 1.