Biblioteca HAL: uso del temporizador y PWM

Comparación de tiempos con 51 microcontroladores

Retraso del microcontrolador 51 (sincronización del software):

//由stc软件生成的51延时代码
void Delay500ms() //@11.0592MHz
{
    
    
unsigned char i, j, k;
_nop_();
i = 4;
j = 129;
k = 119;
do
{
    
    
do
{
    
    
while (--k);
} while (--j);
} while (--i);
}

Desventajas: impreciso, ocupa recursos de CPU

Principio de funcionamiento del temporizador stm32:

Utilice una base de tiempo precisa para implementar funciones de sincronización a través del hardware. El núcleo del cronómetro es el contador.
Insertar descripción de la imagen aquí

Clasificación del temporizador:

  • Temporizador básico (TIM6~TIM7)
  • Temporizador general (TIM2~TIM5)
  • Temporizadores avanzados (TIM1 y TIM8)

Insertar descripción de la imagen aquí

Recursos del temporizador STM32F103C8T6:

Insertar descripción de la imagen aquí
Introducción general al temporizador:

  1. Contador de carga automática ascendente, descendente y ascendente/descendente de 16 bits (TIMx_CNT).

  2. Preescalador programable de 16 bits (puede modificarse en tiempo real) (TIMx_PSC), el coeficiente de división de la frecuencia del reloj del contador es cualquier valor entre 1 y 65535 .
  3. 4 canales independientes (TIMx_CH1~4), estos canales se pueden utilizar como:
    A. Captura de entrada
    B. Comparación de salida
    C.Generación PWM (modo alineado en el centro o en el borde)
    D. Salida en modo de pulso único
  4. El circuito de sincronización de temporizadores y sus interconexiones (un temporizador se puede utilizar para controlar otro temporizador) se puede controlar mediante señales externas (TIMx_ETR)
    .
  5. La interrupción/DMA se genera cuando ocurren los siguientes eventos:
    A. Actualización: contador desbordado/insuficiente, inicialización del contador (mediante software o disparador interno/externo)
    B. Eventos de activación (inicio del contador, parada, inicialización o conteo activado por interno/externo)
    C. Captura de entradaD
    . Comparación de resultados
    E. Admite codificador incremental (cuadratura) y circuitos de sensor Hall para posicionamiento
    F. Entrada de disparo como reloj externo o gestión de corriente ciclo a ciclo

Modo de conteo del temporizador:

Insertar descripción de la imagen aquí
Insertar descripción de la imagen aquí

Fuente del reloj del temporizador:

Insertar descripción de la imagen aquí

La fórmula de cálculo del tiempo de desbordamiento del temporizador es:

Insertar descripción de la imagen aquí
(PSC es el coeficiente de división de frecuencia) (ARR es el valor de recarga) (Tout es el tiempo de salida (requerido)) (Tclk es la frecuencia del reloj)
Conocido: Tclk = 72 MHZ.
Por ejemplo, si desea cronometrar 1000 ms, entonces: PSC=7199, ARR=9999, Tclk=72M

################################################## ###########################

Recursos PWM

  • Temporizador avanzado (TIM1): 7 canales
  • Temporizador general (TIM2~TIM4): 4 canales cada uno

Modo de salida PWM:

  • Modo PWM 1: Cuando se cuenta hacia arriba, una vez CNT < CCRx, la salida es un nivel válido, de lo contrario es un nivel no válido; cuando se cuenta hacia atrás, una vez CNT
    > CCRx, la salida es un nivel no válido, de lo contrario es un nivel válido.

  • Modo PWM 2: Cuando se cuenta hacia arriba, la salida es un nivel válido una vez CNT < CCRx, de lo contrario es un nivel válido; cuando se cuenta hacia atrás, la salida es un nivel válido
    una vez CNT > CCRx, de lo contrario es un nivel no válido.

Insertar descripción de la imagen aquí
Ciclo de trabajo PWM: determinado por el registro TIMx_CCRx.

Configuración PWM (Cube Max)

Insertar descripción de la imagen aquí

//启动tim2
HAL_TIM_Base_Start_IT(&htim2);
//配置占空比
//参数:句柄,通道,值
__HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_3, pwmVal);

Experimento de luz respiratoria PWM

int main()
{
    
    
// 定义变量
uint16_t pwmVal=0; //调整PWM占空比
uint8_t flag=1; //设置改变方向。1:占空比越来越大;0:占空比越来越小

// 使能 Timer4 第3通道 PWM 输出
HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_3);
// while循环实现呼吸灯效果
	while (1)
	{
    
    
		HAL_Delay(1);
		if (flag)
		pwmVal++;
		else
		pwmVal--;
		if (pwmVal > 500)
		flag = 0;
		if (pwmVal == 0)
		flag = 1;
		//修改比较值,修改占空比
		__HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_3, pwmVal);
	}
}

Finalizar

Si tiene alguna pregunta, no dude en plantearla y avanzar juntos.

Supongo que te gusta

Origin blog.csdn.net/qq_52749711/article/details/131350886
Recomendado
Clasificación