86 lines
2.0 KiB
C++
86 lines
2.0 KiB
C++
/**
|
|
* @file motorControl.h
|
|
* @author Alexander Klein (alex@kleiax.de)
|
|
* @brief
|
|
* @version 0.1
|
|
* @date 2021-12-09
|
|
*
|
|
* @copyright Copyright (c) 2021
|
|
*
|
|
*/
|
|
#ifndef MOTOR_CONTROL_H
|
|
#define MOTOR_CONTROL_H
|
|
|
|
#include <cstdint>
|
|
#include <string>
|
|
#include <Arduino.h>
|
|
|
|
#define DELAY 10
|
|
#define PWMFREQ 16000
|
|
#define PWMRES 8
|
|
#define POWERSTEPS 2 // A total of 20 levels ( 100 / SPEED_STEPS ) * RUN_MOTOR_CONTROL_DELAY = 500ms
|
|
#define PWMMIN 50
|
|
#define PWMMAX 95 // Max 98% of 2^PWM_RES
|
|
|
|
/**
|
|
* @brief
|
|
*
|
|
*/
|
|
class MotorControl {
|
|
public:
|
|
MotorControl();
|
|
void init(uint8_t pwm_pin, uint8_t pwm_channel, uint8_t dir_1, uint8_t dir_2);
|
|
void loop();
|
|
void runMotorControl();
|
|
|
|
/**
|
|
* @brief Set the minimum duty cycle
|
|
*
|
|
* @param min duty cycle in percent
|
|
*/
|
|
void setMinPwm(uint8_t min);
|
|
|
|
/**
|
|
* @brief Set the maximum duty cycle
|
|
*
|
|
* @param max duty cycle in percent
|
|
*/
|
|
void setMaxPwm(uint8_t max);
|
|
|
|
void setPowerSteps(uint8_t steps); // Min anfahrkurve einbauen
|
|
void setTargetPower(int8_t power);
|
|
void setDelay(uint8_t delay); // Min anfahrkurve einbauen
|
|
void stop();
|
|
|
|
/**
|
|
* @brief
|
|
*
|
|
*/
|
|
void emergencyStop();
|
|
|
|
int8_t getPower();
|
|
int8_t getTargetPower();
|
|
bool isTargetPowerReached();
|
|
bool isAccelerationPositive();
|
|
bool isAccelerationNegative();
|
|
|
|
private:
|
|
void setRealPower(int8_t power);
|
|
void increasePower(int8_t power);
|
|
|
|
int8_t target_power = 0;
|
|
int8_t power = 0;
|
|
uint8_t direction = 0; // 0 = stop, 1 = forward, 2 = backward
|
|
|
|
uint8_t pwm_pin;
|
|
uint8_t pwm_channel;
|
|
uint8_t pwm_min = PWMMIN;
|
|
uint8_t pwm_max = PWMMAX;
|
|
uint8_t dir_1;
|
|
uint8_t dir_2;
|
|
uint8_t delay = DELAY;
|
|
uint8_t powersteps = POWERSTEPS;
|
|
|
|
};
|
|
|
|
#endif // MOTOR_CONTROL_H
|