*
* Created on: 2021/5/17 9:48
* Author: ChenWei
*
*/
#include "stm32f1xx_hal.h"
#include "MotorDriver.h"
namespace motorDriver {
// motor driver for the 40mm linear actuator, left and right movement
MotorDriver::MotorDriver() :
m_left{
.pwmPin = GPIO_PIN_12,
.motorPwdnPin = GPIO_PIN_13,
.directionPin = GPIO_PIN_14,
.speedLimitHz = 5000, // max speed limit
.dutyRange = 1000 // duty cycle range: 0~100%
},
m_right{
.pwmPin = GPIO_PIN_9,
.motorPwdnPin = GPIO_PIN_10,
.directionPin = GPIO_PIN_8,
.speedLimitHz = 5000, // max speed limit
.dutyRange = 1000 // duty cycle range: 0~100%
} {
}
void MotorDriver::move(float32_t leftSpeed, float32_t rightSpeed) {
m_left.setSpeed(leftSpeed);
m_right.setSpeed(rightSpeed);
// move left motor
if (m_left.isMoving()) {
HAL_GPIO_WritePin(m_left.pwmPin, GPIO_HIGH);
} else {
HAL_GPIO_WritePin(m_left.pwmPin, GPIO_LOW);
}
// move right motor
if (m_right.isMoving()) {
HAL_GPIO_WritePin(m_right.pwmPin, GPIO_HIGH);
} else {
HAL_GPIO_WritePin(m_right.pwmPin, GPIO_LOW);
}
}
void MotorDriver::stop() {
m_left.stop();
m_right.stop();
// move left motor
if (m_left.isMoving()) {
HAL_GPIO_WritePin(m_left.pwmPin, GPIO_HIGH);
} else {
HAL_GPIO_WritePin(m_left.pwmPin, GPIO_LOW);
}
// move right motor
if (m_right.isMoving()) {
HAL_GPIO_WritePin(m_right.pwmPin, GPIO_HIGH);
} else {
HAL_GPIO_WritePin(m_right.pwmPin, GPIO_LOW);
}
}
void MotorDriver::setDirection(bool32_t direction) {
if (direction == DIR_LEFT) {
m_left.setDirection(DIRECTION_FORWARD);
m_right.setDirection(DIRECTION_BACKWARD);
} else if (direction == DIR_RIGHT) {
m_left.setDirection(DIRECTION_BACKWARD);
m_right.setDirection(DIRECTION_FORWARD);
} else {
// stop motors
stop();
}
}
bool32_t MotorDriver::isMoving() const {
return (m_left.isMoving() || m_right.isMoving());
}
}