Skip to content

File evamTB6612Driver.h

File List > src > evamTB6612Driver.h

Go to the documentation of this file

#pragma once
#include <Arduino.h>

namespace evam
{
    struct TB6612Config {
        int pinSpeed;
        int pinMode1;
        int pinMode2;

        TB6612Config(int pinSpeed, int pinMode1, int pinMode2) 
            : pinSpeed(pinSpeed), pinMode1(pinMode1), pinMode2(pinMode2) {}
    };

    template <int kPinSpeed, int kPinMode1, int kPinMode2>
    class TB6612FNGDriver
    {
    private:
        TB6612Config mConfig;

    public:
        TB6612FNGDriver() : mConfig(kPinSpeed, kPinMode1, kPinMode2)
        {
            pinMode(mConfig.pinSpeed, OUTPUT);
            pinMode(mConfig.pinMode1, OUTPUT);
            pinMode(mConfig.pinMode2, OUTPUT);
            actBipolar(0);
        }

        template<typename... Args>
        TB6612FNGDriver(TB6612Config config, Args... args) : mConfig(config)
        {
            pinMode(mConfig.pinSpeed, OUTPUT);
            pinMode(mConfig.pinMode1, OUTPUT);
            pinMode(mConfig.pinMode2, OUTPUT);
            actBipolar(0);
        }

        int GetSpeedPin() const
        {
            return mConfig.pinSpeed;
        }

        int GetMode1Pin() const
        {
            return mConfig.pinMode1;
        }

        int GetMode2Pin() const
        {
            return mConfig.pinMode2;
        }

    protected:
        void actBipolar(signed short aValue)
        {
            int pwm = map(constrain(abs(aValue), 0, 1000), 0, 1000, 0, 255);
            digitalWrite(mConfig.pinMode1, aValue > 0);
            digitalWrite(mConfig.pinMode2, aValue < 0);
            analogWrite(mConfig.pinSpeed, pwm);
        }
    };
}