Files
TweinStein/inc/Motor.c

74 lines
2.4 KiB
C
Raw Normal View History

2026-06-12 02:55:04 -07:00
/* Motor.c
* Jonathan Valvano
* v2.0.2
* June 28, 2024
// Motor
// TM4C MSPM0
// PF2 PB4 Motor_PWML, ML+, IN3, PWM M1PWM6
// PF3 PB1 Motor_PWMR, MR+, IN1, PWM M1PWM7
// PA3 PB0 Motor_DIR_L,ML-, IN4, GPIO 0 means forward, 1 means backward
// PA2 PB16 Motor_DIR_R,MR-, IN2, GPIO 0 means forward, 1 means backward
*
*/
#include <ti/devices/msp/msp.h>
#include "../inc/LaunchPad.h"
#include "../inc/Clock.h"
#include "../inc/PWM1.h"
#define DRV8847 1
#define DIR_L 1
#define DIR_R (1<<16)
#define MOTOR_PERIOD 10000
void Motor_Init(void){
// LaunchPad_Init was called
IOMUX->SECCFG.PINCM[PB0INDEX] = (uint32_t) 0x00000081;
IOMUX->SECCFG.PINCM[PB16INDEX] = (uint32_t) 0x00000081;
// DOE31_0 Data output enable
GPIOB->DOE31_0 |= (1 | (1<<16)); // enable outputs
GPIOB->DOUTCLR31_0 = DIR_L | DIR_R; // forward
PWM1_Init(PWMUSEBUSCLK,39,MOTOR_PERIOD,MOTOR_PERIOD-4,MOTOR_PERIOD-4); // 100Hz, stopped
}
#if DRV8847
void Motor_Forward(uint32_t dutyLeft, uint32_t dutyRight){
GPIOB->DOUTCLR31_0 = DIR_L | DIR_R; // forward
PWM1_SetDuty(MOTOR_PERIOD-dutyLeft,MOTOR_PERIOD-dutyRight);
}
void Motor_Backward(uint32_t dutyLeft, uint32_t dutyRight){
GPIOB->DOUTSET31_0 = DIR_L | DIR_R; // backward
PWM1_SetDuty(dutyLeft,dutyRight);
}
void Motor_Right(uint32_t dutyLeft, uint32_t dutyRight){
GPIOB->DOUTCLR31_0 = DIR_L; // left forward
GPIOB->DOUTSET31_0 = DIR_R; // right backward
PWM1_SetDuty(MOTOR_PERIOD-dutyLeft,dutyRight);
}
void Motor_Left(uint32_t dutyLeft, uint32_t dutyRight){
GPIOB->DOUTCLR31_0 = DIR_R; // right forward
GPIOB->DOUTSET31_0 = DIR_L; // left backward
PWM1_SetDuty(dutyLeft,MOTOR_PERIOD-dutyRight);
}
#else
// L293 code
void Motor_Forward(uint32_t dutyLeft, uint32_t dutyRight){
GPIOB->DOUTCLR31_0 = DIR_L | DIR_R; // forward
PWM1_SetDuty(MOTOR_PERIOD-dutyLeft,MOTOR_PERIOD-dutyRight);
}
void Motor_Backward(uint32_t dutyLeft, uint32_t dutyRight){
GPIOB->DOUTSET31_0 = DIR_L | DIR_R; // backward
PWM1_SetDuty(dutyLeft,dutyRight);
}
void Motor_Right(uint32_t dutyLeft, uint32_t dutyRight){
GPIOB->DOUTCLR31_0 = DIR_L; // left forward
GPIOB->DOUTSET31_0 = DIR_R; // right backward
PWM1_SetDuty(MOTOR_PERIOD-dutyLeft,dutyRight);
}
void Motor_Left(uint32_t dutyLeft, uint32_t dutyRight){
GPIOB->DOUTCLR31_0 = DIR_R; // right forward
GPIOB->DOUTSET31_0 = DIR_L; // left backward
PWM1_SetDuty(dutyLeft,MOTOR_PERIOD-dutyRight);
}
#endif