-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathMotorControl.cpp
45 lines (32 loc) · 2.01 KB
/
MotorControl.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include "MotorControl.h"
#include <Arduino.h>
MotorControl::MotorControl(int leftChannel, int rightChannel, int cameraChannel)
: PWM_LEFT_CHANNEL(leftChannel), PWM_RIGHT_CHANNEL(rightChannel), PWM_CAMERA_CHANNEL(cameraChannel) {}
void MotorControl::begin(int leftPin, int rightPin, int cameraPin) {
ledcSetup(PWM_LEFT_CHANNEL, PWM_BASE_FREQ, PWM_TIMER_12_BIT);
ledcAttachPin(leftPin, PWM_LEFT_CHANNEL);
ledcSetup(PWM_RIGHT_CHANNEL, PWM_BASE_FREQ, PWM_TIMER_12_BIT);
ledcAttachPin(rightPin, PWM_RIGHT_CHANNEL);
ledcSetup(PWM_CAMERA_CHANNEL, PWM_CAMERA_BASE_FREQ, PWM_TIMER_12_BIT);
ledcAttachPin(cameraPin, PWM_CAMERA_CHANNEL);
}
void MotorControl::update(double forwardVelocityCommand, double steeringVelocityCommand, double cameraPositionCommand) {
double leftWheelCommand = forwardVelocityCommand + steeringVelocityCommand;
double rightWheelCommand = forwardVelocityCommand - steeringVelocityCommand;
double maxValue = max(max(abs(leftWheelCommand), abs(rightWheelCommand)), 1.0);
leftWheelCommand = leftWheelCommand / maxValue;
rightWheelCommand = rightWheelCommand / maxValue;
int leftMotorPulsewidth = map(leftWheelCommand*1000, -1000, 1000, SERVO_MIN, SERVO_MAX);
int rightMotorPulsewidth = map(rightWheelCommand*1000, -1000, 1000, SERVO_MIN, SERVO_MAX);
uint16_t leftMotorDutyCycle = map(leftMotorPulsewidth, 0, 1e6/PWM_BASE_FREQ, 0, 4095);
uint16_t rightMotorDutyCycle = map(rightMotorPulsewidth, 0, 1e6/PWM_BASE_FREQ, 0, 4095);
ledcAnalogWrite(PWM_LEFT_CHANNEL, leftMotorDutyCycle, 4095);
ledcAnalogWrite(PWM_RIGHT_CHANNEL, rightMotorDutyCycle, 4095);
int cameraPulsewidth = map(cameraPositionCommand*1000, -1000, 1000, CAMERA_SERVO_MIN, CAMERA_SERVO_MAX);
uint16_t cameraServoDutyCycle = map(cameraPulsewidth, 0, 1e6/PWM_CAMERA_BASE_FREQ, 0, 4095);
ledcAnalogWrite(PWM_CAMERA_CHANNEL, cameraServoDutyCycle, 4095);
}
void MotorControl::ledcAnalogWrite(uint8_t channel, uint32_t value, uint32_t valueMax) {
uint32_t duty = (4095 / valueMax) * min(value, valueMax);
ledcWrite(channel, duty);
}