63 lines
1.4 KiB
C
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;
|
|
}
|
|
}
|
|
|