/**
******************************************************************************
* @file : main.c
* @author : Auto-generated by STM32CubeIDE
* @brief : Main program body
******************************************************************************
*
* 3. Realice un programa para controlar la velocidad
* de rotación de un motor de DC con PWM.
* a. Para ello deberá configurar un timer para
* generar una señal cuadrada de 10 kHz en un
* pin del timer usando Output Compare.
* b. Su sistema deberá tener dos botones:
* i. Botón UP: Permite subir la velocidad
* ii. Botón DOWN: Permite bajar la velocidad
*
* En este repositorio se encuentra el componente de
* puente H y motor DC con salida de encoder.
*
* El puente H tiene tres entradas:
* - IN1: Entrada de control 1 de puente H
* - IN2: Entrada de control 2 de puente H
* - ENA: Señal de PWM
*
* A fin de elegir el sentido de giro se debe de establecer un nivel logico en
* las señales IN1 e IN2, acorde a la tabla siguiente:
*
* IN1 IN2 | DIR
* --------|---------
* 1 0 | Forward
* 0 1 | Backward
* 0 0 | Stop
* 1 1 | Prohibido
*
* Asi mismo, para controlar la velocidad del motor, se
* debe de generar una señal de PWM de 10kHz, y el ciclo
* de trabajo establecera la velocidad de giro.
*
* El motor tiene 2 salidas:
* QA: Salida de cuadratura A
* QB: Salida de cuadratura B
*
* Estas no se utilizan para este ejercicio.
******************************************************************************
*/
#include <stdint.h>
#include "stm32f103_hal.h"
void delay_ms(uint16_t t);
/* Variables --------------------------------------*/
uint32_t duty = 0;
/* Codigo principal -------------------------------*/
int main(void)
{
rcc_clock_enable(RCC_GPIOA);
rcc_clock_enable(RCC_GPIOB);
rcc_clock_enable(RCC_TIM3);
// Botones con pull-up
gpio_set_input(GPIOB, GPIO_PIN_0, GPIO_INPUT_PU); // UP
gpio_set_input(GPIOB, GPIO_PIN_1, GPIO_INPUT_PU); // DOWN
// IN1, IN2 del puente H → Forward
gpio_set_output(GPIOB, GPIO_PIN_12, GPIO_OUTPUT_PP, GPIO_SPEED_50MHZ);
gpio_set_output(GPIOB, GPIO_PIN_13, GPIO_OUTPUT_PP, GPIO_SPEED_50MHZ);
GPIOB->ODR |= (1 << 12); // IN1=1
GPIOB->ODR &= ~(1 << 13); // IN2=0
// PWM 10kHz en TIM3 CH1 (PA6)
// Fclk=8MHz, PSC=0 → Ftick=8MHz, ARR=799 → Fpwm=10kHz
timer_init(TIM3, TIMER_MODE_UP, 799, 0);
timer_set_oc_channel(TIM3, TIMER_CHANNEL_1, TIMER_OC_PWM1,
TIMER_OC_POLARITY_HIGH, duty, true);
timer_start(TIM3, TIMER_CONTINUOUS);
while (1)
{
// Botón UP (PB0 activo bajo)
if (gpio_read_pin(GPIOB, GPIO_PIN_0) == 0)
{
if (duty + 80 <= 799) duty += 80;
else duty = 799;
timer_set_compare_value(TIM3, TIMER_CHANNEL_1, duty);
delay_ms(200); // antirrebote
}
// Botón DOWN (PB1 activo bajo)
if (gpio_read_pin(GPIOB, GPIO_PIN_1) == 0)
{
if (duty >= 80) duty -= 80;
else duty = 0;
timer_set_compare_value(TIM3, TIMER_CHANNEL_1, duty);
delay_ms(200); // antirrebote
}
}
}
void delay_ms(uint16_t t) {
volatile unsigned long l = 0;
for(uint16_t i = 0; i < t; i++)
for(l = 0; l < 800; l++);
}
Loading
stm32-bluepill
stm32-bluepill