/**
******************************************************************************
* @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"
//Codigo proporcionado template [
void delay_ms(uint16_t ms) {
volatile unsigned long t = 0;
for(uint16_t i = 0; i < ms; i++) {
for(t = 0; t < 800; t++);
}
}
// ] fin de codigo template
volatile uint16_t duty_cycle = 50; //init duty cycle en 50 para que esté "centrado"
//o sea lo puedas hacer más lento o más rápido la misma cantidad de veces desde punto inicial
int main(void)
{
rcc_clock_enable(RCC_GPIOA);//clocks a, b, tim2 en ese orden
rcc_clock_enable(RCC_GPIOB);
rcc_clock_enable(RCC_TIM2);
gpio_set_output(GPIOA, GPIO_PIN_0, GPIO_OUTPUT_AF_PP, GPIO_SPEED_50MHZ); //puente h, que no puse en este caso
//botón de dirección
gpio_set_output(GPIOA, GPIO_PIN_1, GPIO_OUTPUT_PP, GPIO_SPEED_2MHZ);
gpio_set_output(GPIOA, GPIO_PIN_2, GPIO_OUTPUT_PP, GPIO_SPEED_2MHZ);
gpio_set_input(GPIOB, GPIO_PIN_0, GPIO_INPUT_PD); //boton acelerador
gpio_set_input(GPIOB, GPIO_PIN_1, GPIO_INPUT_PD); //boton alentador
GPIOA->ODR |= (1 << 1); //init direccion (está fija fwd, no se puede cambiar a 0 ni 1 los valores de in1 & in2)
GPIOA->ODR &= ~(1 << 2);
timer_init(TIM2, TIMER_MODE_UP, 99, 7); //pwm 10khz resultante de arr y prescaler
TIM2->CCMR1 |= TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_2;
TIM2->CCMR1 |= TIM_CCMR1_OC1PE;
TIM2->CCER |= TIM_CCER_CC1E;
TIM2->CCR1 = duty_cycle;
timer_start(TIM2, TIMER_CONTINUOUS); //strt timer2
while (1)
{
if (gpio_read_pin(GPIOB, GPIO_PIN_0)) { //if se presiona boton acelerar
if (duty_cycle < 100) {
duty_cycle += 5;
TIM2->CCR1 = duty_cycle; //cmabio duty cycle a 5prcnt mayor cada vez
}
delay_ms(150); // Debounce
}
if (gpio_read_pin(GPIOB, GPIO_PIN_1)) { //if presionas desacelerador
if (duty_cycle > 0) {
if(duty_cycle >= 5) duty_cycle -= 5;
else duty_cycle = 0; //duy cycle se reduce de 5prcnt en 5prcnt
TIM2->CCR1 = duty_cycle;
}
delay_ms(150); // Debounce
}
}
}Loading
stm32-bluepill
stm32-bluepill