172 lines
4.7 KiB
C++
172 lines
4.7 KiB
C++
/**
|
|
* @file motorControl.h
|
|
* @author Alexander Klein (alex@kleiax.de)
|
|
* @brief Inherits a class to control a motor with pwm signal.
|
|
* @version 0.1
|
|
* @date 2021-12-09
|
|
*
|
|
* @copyright Copyright (c) 2021
|
|
*
|
|
*/
|
|
#ifndef MOTOR_CONTROL_H
|
|
#define MOTOR_CONTROL_H
|
|
|
|
#include <cstdint>
|
|
#include <string>
|
|
#include <iostream>
|
|
#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 55
|
|
#define PWMMAX 80 // Max 98% of 2^PWM_RES
|
|
|
|
/**
|
|
* @brief A class which use PWM to control the power of DC Motor
|
|
* You can control the acceleration of the motor, for example to
|
|
* prevent a damage on your H-Bridge.
|
|
*/
|
|
class MotorControl {
|
|
public:
|
|
MotorControl();
|
|
|
|
/**
|
|
* @brief Initialize the motorController
|
|
*
|
|
* @param pwm_pin The output pin for the signal on the esp.
|
|
* @param pwm_channel One of the pwm channels from the esp.
|
|
* @param dir_1 First direction pin for the H-Bridge.
|
|
* @param dir_2 Second direction pin for the H-Bridge.
|
|
*/
|
|
void init(uint8_t pwm_pin, uint8_t pwm_channel, uint8_t dir_1, uint8_t dir_2);
|
|
|
|
/**
|
|
* @brief Calls runMotorControl() to update the pwm signal
|
|
*
|
|
* This function should be called every mainloop. If the delay is not reached, than the
|
|
* functions returns immediately.
|
|
* @see runMotorControl()
|
|
* @see DELAY
|
|
* @return time since the last call in Milliseconds
|
|
*/
|
|
uint16_t loop();
|
|
|
|
/**
|
|
* @brief Normally called repeatedly by loop() to update the pwm signal.
|
|
*
|
|
* Checks the difference between target power and current power to
|
|
* increase or decrease the duty cycle. The amount of decrease or increase
|
|
* is set by setPowerSetps() (default = 2).
|
|
*/
|
|
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);
|
|
|
|
/**
|
|
* @brief Set the Power Steps
|
|
*
|
|
* Set the increment of the steps with which the dutycycle is
|
|
* increased or decreased. Note the dependency between the increment
|
|
* and delay().
|
|
*
|
|
* The formula for the time between 0% and 100% power is:
|
|
* time[ms] = delay * ( 100 / increment )
|
|
* 500 ms are recommended
|
|
*
|
|
* @see setDelay()
|
|
*
|
|
* @param increment
|
|
* @return time from 0% power to 100% power in Milliseconds
|
|
*/
|
|
uint16_t setPowerSteps(uint8_t increment);
|
|
|
|
/**
|
|
* @brief Set the Target Power
|
|
*
|
|
* If the given power is greater than 100 or smaller than -100, then
|
|
* this function only print an error to consol.
|
|
*
|
|
* @param power power in percent
|
|
*/
|
|
void setTargetPower(int8_t power);
|
|
|
|
/**
|
|
* @brief Set the min delay between each loop
|
|
*
|
|
* Note the dependency between delay and
|
|
* setPowerSteps().
|
|
*
|
|
* @see setPowerSteps()
|
|
*
|
|
* @param delay time in Milliseconds
|
|
* @return time from 0% power to 100% power in Milliseconds
|
|
*/
|
|
uint16_t setDelay(uint8_t delay);
|
|
|
|
/**
|
|
* @brief Stops the motor like setTargetPower() to 0
|
|
*
|
|
*/
|
|
void stop();
|
|
|
|
/**
|
|
* @brief Stops the motor immediately
|
|
*
|
|
*/
|
|
void emergencyStop();
|
|
|
|
/**
|
|
* @brief Get the current power
|
|
*
|
|
* @return int8_t percent of power (-100 to 100)
|
|
*/
|
|
int8_t getPower();
|
|
|
|
/**
|
|
* @brief Get the target power
|
|
*
|
|
* @return int8_t percent of power (-100 to 100)
|
|
*/
|
|
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_res = PWMRES;
|
|
uint8_t dutycycle_min;
|
|
uint8_t dutycycle_max;
|
|
uint8_t dir_1;
|
|
uint8_t dir_2;
|
|
uint8_t delay = DELAY;
|
|
uint8_t powersteps = POWERSTEPS;
|
|
|
|
uint32_t lastMillis = 0;
|
|
|
|
};
|
|
|
|
#endif // MOTOR_CONTROL_H
|