Documentos de Académico
Documentos de Profesional
Documentos de Cultura
1. Objetivo General
Desarrollar una aplicación con el uso de temporizadores para su
funcionamiento.
A. Objetivos específicos
Al finalizar la práctica el estudiante:
• Será capaz de configurar temporizadores básicos en un
STM32.
• Será capaz de configurar un STM32 para medir la
frecuencia de un evento externo (Modo Captura).
• Será capaz de configurar un STM32 para controlar una
forma de onda de salida, o para indicar cuando ha
trascurrido un periodo de tiempo (Modo Comparador).
3. Marco teórico
● Un temporizador es un contador con una frecuencia de conteo que es
una fracción de su reloj fuente.
● Dependiendo del tipo de temporizador, su fuente de reloj puede ser un
reloj interno, un reloj externo u otro temporizador usado como maestro.
● Puede contar de manera incremental, decremental o ambas.
● Los temporizadores de los STM32 se pueden agrupar en varias
categorías.
● Temporizadores básicos – Basic timers: Timers de 16 bits usados como
generadores de bases de tiempo, que no tienen pines de entrada/salida.
También se pueden usar para alimentar el DAC y para actuar como
maestros para otros timers. TIM6, TIM7, TIM18.
Temporizadores de propósito general–General purpose timers:
Timers de 16 o 32 bits, con las mismas características que los
básicos,pero además pueden ser usados para captura y comparación,
captura de entrada (medición de frecuencia de entrada), modulación da
ancho de pulso – PWM, interfaz con sensores (encoder, sensor Hall), etc.
Proveen cuatro canales de entrada/salida programables. TIM2, TIM3,
TIM4, TIM5, TIM19, TIM22.
Temporizadores avanzados – Advanced timers:
Tienen las mismas funcionalidades que los de propósito general, pero
añaden varias otras, relacionadas con aplicaciones de control de motores
y la conversión digital de potencia (tres señales complementarias con
inserción de tiempo muerto y entrada de apagado de emergencia). TIM1,
TIM8, TIM20.
Estructura
TIM_Base_InitTypeDef
typedef struct {
uint32_t Prescaler;
uint32_t CounterMode;
uint32_t Period;
uint32_t ClockDivision;
uint32_t RepetitionCounter;
} TIM_Base_InitTypeDef;
Prescaler: Divide el reloj del timer por un factor entre 1 y 65535 (16 bits
de resolución).
CounterMode: Define la dirección de la cuenta. Para los temporizadores
básicos solamente puede ser hacia arriba.
Period: Valor máximo para el contador antes de reiniciarse. 1 a 65535
para un timer de 16 bits. Si su valor es cero, el timer no inicia.
4. Diseño
B. Enunciados
C. Cálculos
𝑃𝑒𝑟𝑖𝑜𝑑 + 1
0.0625 =
20000
Period=1249
8𝑀
20000 =
𝑃𝑟𝑒𝑠𝑐𝑎𝑙𝑒𝑟+1
Prescaler=399
D. Código
Parte 1
#include "main.h"
#include "stm32f1xx_hal.h"
TIM_HandleTypeDef htim2;
TIM_HandleTypeDef htim3
uint8_t con=0;
uint8_t con1=0;
uint8_t val=0;
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_TIM2_Init(void);
static void MX_TIM3_Init(void);
int main(void)
{
Systick. */
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_TIM2_Init();
MX_TIM3_Init();
/* USER CODE BEGIN 2 */
HAL_TIM_Base_Start_IT(&htim2);
HAL_TIM_Base_Start_IT(&htim3);
uint32_t tabla[8]={1,2,4,8,16,32,64,128};
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
GPIOA->ODR=tabla[val];
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
void
HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef*htim){
if(htim->Instance==TIM2){
con++;
if(con<64){
val++;
if(val==8)
val=0;
}
if(con>64){
__HAL_TIM_SET_PRESCALER(&htim2,799);
__HAL_TIM_SET_AUTORELOAD(&htim2,2499);
val++;
if(val==8)
val=0;
}
if(con==80){
con=0;
__HAL_TIM_SET_PRESCALER(&htim2,399);
__HAL_TIM_SET_AUTORELOAD(&htim2,1249);
}
}
}
/**
* @brief System Clock Configuration
* @retval None
*/
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSE;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct,
FLASH_LATENCY_0) != HAL_OK)
{
Error_Handler();
}
}
htim2.Instance = TIM2;
htim2.Init.Prescaler = 399;
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
htim2.Init.Period = 1249;
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim2.Init.AutoReloadPreload =
TIM_AUTORELOAD_PRELOAD_DISABLE;
if (HAL_TIM_Base_Init(&htim2) != HAL_OK)
{
Error_Handler();
}
sClockSourceConfig.ClockSource =
TIM_CLOCKSOURCE_INTERNAL;
if (HAL_TIM_ConfigClockSource(&htim2,
&sClockSourceConfig) != HAL_OK)
{
Error_Handler();
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode =
TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim2,
&sMasterConfig) != HAL_OK)
{
Error_Handler();
}
htim3.Instance = TIM3;
htim3.Init.Prescaler = 799;
htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
htim3.Init.Period = 2499;
htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim3.Init.AutoReloadPreload =
TIM_AUTORELOAD_PRELOAD_DISABLE;
if (HAL_TIM_Base_Init(&htim3) != HAL_OK)
{
Error_Handler();
}
sClockSourceConfig.ClockSource =
TIM_CLOCKSOURCE_INTERNAL;
if (HAL_TIM_ConfigClockSource(&htim3,
&sClockSourceConfig) != HAL_OK)
{
Error_Handler();
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode =
TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim3,
&sMasterConfig) != HAL_OK)
{
Error_Handler();
}
}
/**
* @brief GPIO Initialization Function
* @param None
* @retval None
*/
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7,
GPIO_PIN_RESET);
GPIO_InitStruct.Pin =
GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3
|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
void Error_Handler(void)
{
#ifdef USE_FULL_ASSERT
void assert_failed(uint8_t *file, uint32_t line)
{
}
#endif /* USE_FULL_ASSERT */
Parte 2
#include "main.h"
#include "stm32f1xx_hal.h"
TIM_HandleTypeDef htim2;
int pwm=0;
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_TIM2_Init(void);
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_TIM2_Init();
HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1);
while (1)
{
/* USER CODE END WHILE */
for (pwm=0;pwm<=999;pwm=pwm+1){
__HAL_TIM_SET_COMPARE(&htim2,
TIM_CHANNEL_1, pwm);
HAL_Delay(5);
}
HAL_Delay(500);
for (pwm=999;pwm>=0;pwm=pwm-1){
__HAL_TIM_SET_COMPARE(&htim2,
TIM_CHANNEL_1, pwm);
HAL_Delay(5);
}
HAL_Delay(500);
/**
* @brief System Clock Configuration
* @retval None
*/
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct,
FLASH_LATENCY_0) != HAL_OK)
{
Error_Handler();
}
}
/**
* @brief TIM2 Initialization Function
* @param None
* @retval None
*/
static void MX_TIM2_Init(void)
{
HAL_TIM_MspPostInit(&htim2);
void Error_Handler(void)
{
}
#ifdef USE_FULL_ASSERT
void assert_failed(uint8_t *file, uint32_t line)
{
/* USER CODE BEGIN 6 */
}
E. Simulación
Parte 1
Parte 2
5. Conclusiones
*Se pudo implementar el TIM2 como temprizador para el conteo de 0.0625
s y 0.25 s por un periodo de 4 s , se realiao un cambio de period y
prescaler para lograrlo.
*Se programo el TIM2 el CHANNEL 1 para poder realizar la salida pwm.
*Se pudo implementar los conocimientos adquiridos en clase para poder
realizar cada una de las practicas.
6. Cuestionario
1. Explicar la diferencia de la captura y la comparación.
2. Explique la diferencia entre un temporizador básico y un contador de
eventos.
7. Bibliografía