0% encontró este documento útil (0 votos)
53 vistas11 páginas

Chuleta MICRO

Este documento describe el código para controlar diferentes periféricos en una tarjeta de desarrollo STM32 mediante timers y ADC. Incluye el control de un servo con potenciómetro, luces LED con timers, detección de pulsaciones con EXTI e interrupciones, y comunicación UART. También proporciona ejemplos de código para examenes que implican la gestión de servos, LEDs y pulsadores.
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
53 vistas11 páginas

Chuleta MICRO

Este documento describe el código para controlar diferentes periféricos en una tarjeta de desarrollo STM32 mediante timers y ADC. Incluye el control de un servo con potenciómetro, luces LED con timers, detección de pulsaciones con EXTI e interrupciones, y comunicación UART. También proporciona ejemplos de código para examenes que implican la gestión de servos, LEDs y pulsadores.
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

LPTIM (Gestion Rebotes)

TIM/128
NVIC

–EXTI 4_15 IRQ()


HAL_LPTIM_TIMEOUT_START_IT(&hlptim, 625,312);
EXTI-> IMR &=~(1UL<<4)

–LPTIM IRQ()
HAL_LPTIM_TIMEOUT_STOP_IT(&hlptim);
EXTI-> IMR|= (1UL<<4)
if(GPIOB-> IDR(1UL<<4)
Pestado=1
else
Pestado=0

+el otro pulsador

UART
transmitir y recibir datos

uint8_t palabra[14]
uint8_t dato

HAL_UART_Transmit (&huart, palabra, tamaño, HAL_MAX_DELAY);


HAL_UART_Receive (&huart, dato, 1, HAL_MAX_DELAY);

Leds
CP=99
PSC=159
f=500hz=> t=0,002 s

Cambiar intensidad: TIM2-> CCR1= X


Cambiar frecuencia: TIM2-> ARR = Y

Chicharra
CP=99
PSC=39
f=2kHz=> t = 0,0005 s
Servo(con pot)
Clock PS: Synch./4
resolution: 12 bits (4096)
sampling time: 3,5 cycles

a) toma de valor temporizado:

HAL_ADC_ Start_IT(&hadc);

–ADC1 IRQ()
int valor= HAL_ADC_GetValue(&hadc);
float porcen=valor/4095 *100 (led)
float porcen= valor*180/4096 (servo)
TIM21->CCR1=180+porcen
HAL_ADC_STOP_IT(&hadc);

b) Toma de valores constante


(se puede hacer igual que el anterior pero con un timer cada 0,01)

while(1)
HAL_ADC_START(&hadc)
HAL_ADC_PollforConversion(&hadc,1000)
float porcen=valor/4095 *100 (led)
float porcen= valor*180/4096 (servo)
TIM21->CCR1=180+porcen

para 10 grados

1ms- 18 pos
20 ms- 360 pos

para 1 grado

1ms- 180 pos


20ms-3600 pos

Potenciometro
clock prescaler: sync. clock/4
resolution: 12 bits (4096)
sampling time: 3,5 cycles
Funcion temporizadora (30s)

Funcion Contador temporizador

Config. Optima
Servo: PB13- TIM21 ch1 (fuera)
Buzzer: PB4- TIM22 ch1 (D5)
Leds: PA0- TIM2 CH1 (A0)
PA1- TIM2 CH2 (A1)
PB10- TIM2 CH3 (D6)
Poten: PA4- ADC4
Pulsador: PB3-D3
PB5-D4
PB0-A3

volatile enum direccion {UP, DOWN} sentido=UP ;


Ej. examen 1
Desarrolla el siguiente sistema mediante la tarjeta de desarrollo NUCLEO L053R8

Gestionar la posición de un servo (0-180º) mediante un potenciómetro, permitiendo 180 posiciones


diferentes.

Generar un juego de luces con dos diodos LED que consista en el encendido/apagado progresivo de cada
led secuencialmente.

● El proceso de encendido consumirá 4 segundos con 100 niveles de luminosidad.


● El proceso de apagado durará 2 segundos manteniendo los 100 niveles de luminosidad.

Contar el número de pulsaciones realizadas sobre un pulsador en el periodo de los últimos 10 segundos.
La evaluación se llevará a cabo cada segundo y se procederá al control de un LED en base al número de
pulsaciones:

● < 3 pulsaciones --> LED apagado


● >= 3 y < 7 pulsaciones --> LED encendido al 60% luminosidad
● >= 7 pulsaciones --> LED encendido al 100% luminosidad

main.c

uint16_t valor; //Declarar en función main


volatile uint8_t estado = 0, parray = 0, contPul = 0, Pestado = 0;
volatile uint8_t pulsaciones[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};

/* USER CODE BEGIN 2 */

HAL_TIM_PWM_Start(&htim21, TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_2);
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_3);
HAL_TIM_Base_Start_IT(&htim6);
HAL_TIM_Base_Start_IT(&htim22);

/* USER CODE END 2 */

/* Infinite loop */
/* USER CODE BEGIN WHILE */
float grados = 0;
if (GPIOB->IDR & (1UL << 4))
{
Pestado = 1;
}
else
{
Pestado = 0;
}
while (1)
{
HAL_ADC_Start(&hadc);
HAL_ADC_PollForConversion(&hadc, 1000);
valor = HAL_ADC_GetValue(&hadc);
grados = valor * 180 / 4096;
TIM21->CCR1 = 180 + grados;
//HAL_Delay(500);

/* USER CODE END WHILE */

it.c

EXTI4_15_IRQHandler(void)
{
/* USER CODE BEGIN EXTI4_15_IRQn 0 */
if (Pestado == 0)
contPul++;
HAL_LPTIM_TimeOut_Start_IT(&hlptim1, 625, 312);
EXTI->IMR &= ~(1UL << 4);
/* USER CODE END EXTI4_15_IRQn 0 */
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_4);
HAL_GPIO_EXTI_IRQHandler(B1_Pin);
/* USER CODE BEGIN EXTI4_15_IRQn 1 */

/* USER CODE END EXTI4_15_IRQn 1 */


}

/**
* @brief This function handles LPTIM1 global interrupt / LPTIM1 wake-up interrupt through EXTI line 29.
*/
void LPTIM1_IRQHandler(void)
{
/* USER CODE BEGIN LPTIM1_IRQn 0 */
HAL_LPTIM_TimeOut_Stop_IT(&hlptim1);
EXTI->IMR |= (1UL << 4);
if (GPIOB->IDR & (1UL << 4))
{
Pestado = 1;
}
else
{
Pestado = 0;
}
/* USER CODE END LPTIM1_IRQn 0 */
HAL_LPTIM_IRQHandler(&hlptim1);
/* USER CODE BEGIN LPTIM1_IRQn 1 */

/* USER CODE END LPTIM1_IRQn 1 */


}

/**
* @brief This function handles TIM6 global interrupt and DAC1/DAC2 underrun error interrupts.
*/
void TIM6_DAC_IRQHandler(void)
{
/* USER CODE BEGIN TIM6_DAC_IRQn 0 */
switch (estado)
{
case 0: if (TIM2->CCR1 < 100)
TIM2->CCR1 ++;
else
estado = 1;
TIM6->ARR = 19;
break;
case 1: if (TIM2->CCR1 > 0)
TIM2->CCR1 --;
else
estado = 2;
TIM6->ARR = 39;
break;
case 2: if (TIM2->CCR2 < 100)
TIM2->CCR2 ++;
else
estado = 3;
TIM6->ARR = 19;
break;
case 3: if (TIM2->CCR2 > 0)
TIM2->CCR2 --;
else
estado = 0;
TIM6->ARR = 39;
break;
}
/* USER CODE END TIM6_DAC_IRQn 0 */
HAL_TIM_IRQHandler(&htim6);
/* USER CODE BEGIN TIM6_DAC_IRQn 1 */

/* USER CODE END TIM6_DAC_IRQn 1 */


}

/**
* @brief This function handles TIM22 global interrupt.
*/
void TIM22_IRQHandler(void)
{
/* USER CODE BEGIN TIM22_IRQn 0 */
pulsaciones[parray] = contPul;
contPul = 0;
if (++parray == 10)
parray = 0;
uint16_t suma = 0;
for (uint8_t i = 0; i < 10; i++)
{
suma += pulsaciones[i];
}
if (suma < 3)
TIM2->CCR3 = 0;
else if (suma < 7)
TIM2->CCR3 = 60;
else
TIM2->CCR3 = 99;
/* USER CODE END TIM22_IRQn 0 */
HAL_TIM_IRQHandler(&htim22);
/* USER CODE BEGIN TIM22_IRQn 1 */

/* USER CODE END TIM22_IRQn 1 */


}
Ej. examen 2
1º) Diseña un sistema que gestione el posicionamiento de un servo mediante dos pulsadores. Un pulsador
incrementará la posición del servo en 10º hasta llegar al límite y el otro los reducirá. Debes gestionar los rebotes
para que no alteren el funcionamiento del sistema.

2º) Si durante 30 segundos no se pulsa ningún pulsador, el servo volverá a la posición 0 a una velocidad de 1
grado por cada 200ms.

3º) Contabiliza cuántas pulsaciones han sufrido cada uno de los pulsadores en los últimos 10 segundos y activa
un diodo LED (uno por pulsador) en el caso de que un pulsador no haya sido pulsado en los últimos 10
segundos.

main.c

/* USER CODE BEGIN 2 */


HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);
HAL_TIM_Base_Start_IT(&htim6);
if (GPIOB->IDR & 1UL) //PB0==1? si se pulsa
P1state = 1; //pulsado
else
P1state = 0; //reposo
if (GPIOA->IDR & (1UL << 1)) //PA1==1?
P2state = 1; //pulsado
else
P2state = 0; //reposo

/* USER CODE END 2 */

it.c

void EXTI0_1_IRQHandler(void)
{
/* USER CODE BEGIN EXTI0_1_IRQn 0 */
cont30s = 0; resetea el contador de 30s
if (EXTI->PR == (1UL)) //P1? PB0?
{
cont10sP1 = 0; resetea el de 10
GPIOA->BSRR = 1UL << 20;
if (P1state == 0)
{
if ((TIM2->CCR1 + 10) <= 360)
TIM2->CCR1 += 10;
else
TIM2->CCR1 = 360;
}
TIM22->CNT=0;
HAL_TIM_Base_Start_IT(&htim22);
EXTI->IMR &= ~(1UL);
}
if (EXTI->PR == (1UL << 1)) //P2? PA1?
{
cont10sP2 = 0;
GPIOB->BSRR = 1UL << 21;
if (P2state == 0)
{
if ((TIM2->CCR1 - 10) >= 180)
TIM2->CCR1 -= 10;
else
TIM2->CCR1 = 0;
}
TIM22->CNT=0;
HAL_TIM_Base_Start_IT(&htim22);
EXTI->IMR &= ~(1UL << 1);
}
/* USER CODE END EXTI0_1_IRQn 0 */
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_1);
/* USER CODE BEGIN EXTI0_1_IRQn 1 */

/* USER CODE END EXTI0_1_IRQn 1 */


}

//Pasan 200ms
void TIM6_DAC_IRQHandler(void)
{
/* USER CODE BEGIN TIM6_DAC_IRQn 0 */
cont10sP1++;
cont10sP2++;
if (cont30s < 150)
cont30s++;
if (cont10sP1 == 50)
GPIOA->BSRR = 1UL << 4; //Activar LEd en A4
if (cont10sP2 == 50)
GPIOB->BSRR = 1UL << 5; //Activar LEd en B5
if (cont30s == 150)
{
if (TIM2->CCR1 > 180)
TIM2->CCR1--;
}
/* USER CODE END TIM6_DAC_IRQn 0 */
HAL_TIM_IRQHandler(&htim6);
/* USER CODE BEGIN TIM6_DAC_IRQn 1 */

/* USER CODE END TIM6_DAC_IRQn 1 */


}

void TIM22_IRQHandler(void)
{
/* USER CODE BEGIN TIM22_IRQn 0 */
EXTI->IMR |= (1UL << 1) | (1UL);
if (GPIOB->IDR & 1UL) //actualizar styado PB0 (P1)
{
P1state = 1;
}
else
{
P1state = 0;
}
if (GPIOA->IDR & (1UL << 1)) //actualizar styado PA1 (P2)
{
P2state = 1;
}
else
{
P2state = 0;
}
HAL_TIM_Base_Stop_IT(&htim22);
/* USER CODE END TIM22_IRQn 0 */
HAL_TIM_IRQHandler(&htim22);
/* USER CODE BEGIN TIM22_IRQn 1 */

/* USER CODE END TIM22_IRQn 1 */


}

Ej. Leds
2 PULSADORES,
1 para pasar de secuencia, otro para cambiar la frecuencia

main.c

/* USER CODE BEGIN 2 */


if (GPIOB->IDR & (1UL << 4))
PUL4 = ON;
if (GPIOB->IDR & (1UL << 10))
PUL10 = ON;
HAL_TIM_Base_Start_IT(&htim21);
/* USER CODE END 2 */

it.c

void EXTI4_15_IRQHandler(void)
{
/* USER CODE BEGIN EXTI4_15_IRQn 0 */
if (EXTI->PR & (1UL << 4))
{
EXTI->IMR &= ~(1UL << 4); //MASK EXTI4
if (PUL4 == OFF)
{
if (secuencia++ == 2)
secuencia = 0;
PUL4 = ON;
}
else
PUL4 = OFF;
}
if (EXTI->PR & (1UL << 10))
{
EXTI->IMR &= ~(1UL << 10); //MASK EXTI10
if (PUL10 == OFF)
{
if (freq == 100)
freq = 0;
freq += 5;

TIM21->ARR = 100000 / freq;


PUL10 = ON;
TIM6->CNT=0;
HAL_TIM_Base_Start_IT(&htim6);
TIM2->CNT = 0;
HAL_TIM_Base_Start_IT(&htim2);
sistemaON = 1;
}
else
{
PUL10 = OFF;
HAL_TIM_Base_Stop_IT(&htim6);
TIM6->ARR = 1999; //Restauro 2s
}
}
TIM22->CNT=0;
HAL_TIM_Base_Start_IT(&htim22);

/* USER CODE END EXTI4_15_IRQn 0 */


HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_4);
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_10);
HAL_GPIO_EXTI_IRQHandler(B1_Pin);
/* USER CODE BEGIN EXTI4_15_IRQn 1 */

/* USER CODE END EXTI4_15_IRQn 1 */


}

/**
* @brief This function handles TIM2 global interrupt.
*/
void TIM2_IRQHandler(void)
{
/* USER CODE BEGIN TIM2_IRQn 0 */
sistemaON = 0;
/* USER CODE END TIM2_IRQn 0 */
HAL_TIM_IRQHandler(&htim2);
/* USER CODE BEGIN TIM2_IRQn 1 */

/* USER CODE END TIM2_IRQn 1 */


}

/**
* @brief This function handles TIM6 global interrupt and DAC1/DAC2 underrun error interrupts.
*/
void TIM6_DAC_IRQHandler(void)
{
/* USER CODE BEGIN TIM6_DAC_IRQn 0 */
TIM6->ARR = 499;
if (freq == 100)
freq = 0;
freq += 5;

TIM21->ARR = 100000 / freq;


/* USER CODE END TIM6_DAC_IRQn 0 */
HAL_TIM_IRQHandler(&htim6);
/* USER CODE BEGIN TIM6_DAC_IRQn 1 */

/* USER CODE END TIM6_DAC_IRQn 1 */


}

/**
* @brief This function handles TIM21 global interrupt.
*/
void TIM21_IRQHandler(void)
{
/* USER CODE BEGIN TIM21_IRQn 0 */
if (code++ == 3)
code = 0;
/* USER CODE END TIM21_IRQn 0 */
HAL_TIM_IRQHandler(&htim21);
/* USER CODE BEGIN TIM21_IRQn 1 */
/* USER CODE END TIM21_IRQn 1 */
}

/**
* @brief This function handles TIM22 global interrupt.
*/
void TIM22_IRQHandler(void)
{
/* USER CODE BEGIN TIM22_IRQn 0 */
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_4);
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_10);

EXTI->IMR |= ((1UL << 10) | (1UL << 4)); //Reactivar EXIT4 y EXTI10
HAL_TIM_Base_Stop_IT(&htim22);
/* USER CODE END TIM22_IRQn 0 */
HAL_TIM_IRQHandler(&htim22);
/* USER CODE BEGIN TIM22_IRQn 1 */

/* USER CODE END TIM22_IRQn 1 */


}

También podría gustarte