1. Características principales
2. Inicialización
pwm_init
/*!
\brief pwm initialize
\param[in] pwm_sc: pwm control register
\param[in] pwm_mod: pwm mod count
\param[out] none
\retval none
*/
void pwm_init(uint8_t pwm_sc,uint16_t pwm_mod)
{
PWM_MOD = pwm_mod;
PWM_SC = pwm_sc;
if((pwm_sc & PWM_SC_TOIE) != 0U){
NVIC_EnableIRQ(PWM_TOF_IRQN);
}else{
NVIC_DisableIRQ(PWM_TOF_IRQN);
}
}
La entrada es el registro pwm_sc y pwm_mod
registro pwm_sc:
son ocho
El bit 0-2 es PWM_SC_CLK_DIV (XXX) El reloj de conteo se divide por la potencia PWM_SC_CLK_DIV de X
El bit 3-4 PWM_SC_CLK_SEL (01) indica la selección de la cuenta del reloj del sistema
5 bits PWM_SC_CPWMS (0) significa contar
6 bits PWM_SC_TOIE (1) Activar la habilitación de interrupción
PWM_SC_TOF (0) de 7 bits no desbordado
El registro PWM_SC_CLK_DIV de 0-2 bits es el siguiente, elegimos 32 divisiones de frecuencia para convertir 5 en binario (101)
Luego pwm_sc se configura como 01001101 y se convierte a hexadecimal como 0x4D
registro pwm_mod:
Tiene de 0 a 15 dígitos, lo que significa que el valor máximo del ciclo del contador es 111111111111111, que es 32767 cuando se convierte a decimal
Lo configuramos en 2000 (el período es de 2 ms). El tamaño específico depende de cómo lo use. Generalmente, no es demasiado grande. Uso PWM para impulsar el motor.
Convertido a hexadecimal es 0x07D0
Entonces pwm_init se inicializa como pwm_init(0x4D,0x07D0);
inicialización del canal pwm_ch1_init
Introduzca el registro de control pwm_ch_sc y pwm_ch_cnt
pwm_ch_sc
/*!
\brief pwm channel 1 initialize
\param[in] pwm_ch_sc: pwm channel 1 control register
\param[in] pwm_ch_cnt: pwm channel 1 count
\param[out] none
\retval none
*/
void pwm_ch1_init(uint8_t pwm_ch_sc,uint16_t pwm_ch_cnt)
{
PWM_C1SC = pwm_ch_sc;
PWM_C1V = pwm_ch_cnt; //占空比
if((pwm_ch_sc & PWM_CnSC_IE) != 0U){
NVIC_EnableIRQ(PWM_CH1_IRQn);
}else{
NVIC_DisableIRQ(PWM_CH1_IRQn);
}
}
El bit 0-2 es PWM_SC_CLK_DIV (000) El reloj de conteo se divide por la potencia de 2 PWM_SC_CLK_DIV
El bit 3-4 PWM_SC_CLK_SEL (01) indica la selección de la cuenta del reloj del sistema
PWM_SC_CPWMS de 5 bits (1) significa cuenta ascendente seguida de cuenta regresiva (alineado al centro)
6 bits PWM_SC_TOIE (1) Activar la habilitación de interrupción
PWM_SC_TOF (0) de 7 bits no desbordado
pwm_ch1_sc es 01101000
pwm_ch_cnt
3. Período y ciclo de trabajo
El período de la señal PWM está determinado por el valor del registro de módulo PWM_MOD (hexadecimal 0x07D0=decimal 2000=2ms )
PWM_C x V en la inicialización del canal pwm_ch1_init PWM_C1V = pwm_ch_cnt;
Y PWM_C1V es la dirección de registro de la siguiente manera
Ciclo de trabajo = ( pwm_ch_cnt)/( pwm_mod )
50% = 1000/2000 = 0x03E8 / 0x07D0
Luego, pwm siempre genera un ciclo de trabajo de 50, si desea ajustar el ciclo de trabajo, ajuste el tamaño de pwm_ch_cnt.
El principio en el hardware es probablemente que el pwm ingresa un nivel alto, lo que hace que se conecte el triodo, y luego conecte los polos positivo y negativo para impulsar el motor, y luego la velocidad del ciclo de trabajo es el momento de establecer el nivel alto en el ciclo Un período de nivel alto es un ciclo de trabajo del 100 %.
Para la dirección, el relé generalmente se usa para controlar la dirección del motor, y el PWM controla la velocidad del motor.