ihsm-strain-gage-controller-fw/src/motor.c
2023-06-06 14:24:09 +02:00

63 lines
1.4 KiB
C

#include <motor.h>
struct motor_state st_motor;
void motor_init() {
memset(&st_motor, 0, sizeof(st_motor));
/* PB1 (BT1) -> Open drain, TIM2 CH3N for speed PWM*/
GPIOB->MODER &= ~GPIO_MODER_MODER0_Msk;
GPIOB->MODER |= AF(1);
GPIOB->AFR[0] &= ~GPIO_AFRL_AFRL1_Msk;
GPIOB->AFR[0] |= AFRL(1, 2);
GPIOB->OSPEEDR |= (3<<GPIO_OSPEEDR_OSPEEDR1_Pos);
//GPIOB->OTYPER |= GPIO_OTYPER_OT_0;
/* PB0 (BT2) -> Output for Forward/Reverse */
GPIOB->MODER &= ~GPIO_MODER_MODER0_Msk;
GPIOB->MODER |= OUT(0);
GPIOB->BRR = 1<<0;
/* PB12 (BT3) -> Output for Enable */
GPIOB->MODER &= ~GPIO_MODER_MODER12_Msk;
GPIOB->MODER |= OUT(12);
GPIOB->BRR = 1<<12;
TIM1->PSC = 1;
TIM1->ARR = 0xffff;
TIM1->CCMR2 = (6<<TIM_CCMR2_OC3M_Pos);
TIM1->CCER = TIM_CCER_CC3NE;
TIM1->BDTR = TIM_BDTR_MOE;
TIM1->CR1 |= TIM_CR1_CEN;
}
void motor_set_speed(int speed_rpm) {
if (speed_rpm > 3000) {
speed_rpm = 3000;
} else if (speed_rpm < -3000) {
speed_rpm = -3000;
}
st_motor.speed_rpm = speed_rpm;
int speed = speed_rpm * 65535 / 3000;
if (speed == 0) {
GPIOB->BRR = 1<<12;
} else {
GPIOB->BSRR = 1<<12;
if (speed < 0) {
speed = -speed;
GPIOB->BSRR = 1<<1;
} else {
GPIOB->BRR = 1<<1;
}
TIM1->CCR3 = speed;
TIM1->EGR = TIM_EGR_UG;
}
}