/* Platine mit H-Bridge IFX9201SG und PCA8574D */ #pragma once #include #include #include class HBridge { private: OutputPin pwmTakt; // PB0 TCA1 WO0 OutputPin direction; OutputPin en; InputPin fault; OutputPin cs; InputPin eFuse; TCAnFreqGen <1> tca1; MyPCA8574 icGleis; enum class State : uint8_t { IDLE, CW, CCW, SLOW, HALT, STOP }; State lokState {State::IDLE}; State requestState {State::IDLE}; uint8_t duty {0}; uint16_t frequency {0}; uint8_t dutyTarget {0}; public: HBridge(uint8_t a, TwoWire &w) : icGleis (a, w, 0b11111111) // I2C Addr, wire0/wire1, I/O Config {} void init (void) { pwmTakt.init(); pwmTakt.setOff(); direction.init(); en.enableInvertIO(); en.setOff(); en.init(); fault.init(); cs.enableInvertIO(); cs.setOff(); cs.init(); eFuse.init(); tca1.init(); // Dual-Slope Mode tca1.setFrequency(200); tca1.setDuty(30); tca1.update(); icGleis.init(); } void setFrequency (const uint16_t f) { frequency = f; tca1.setFrequency(f); tca1.update(); } uint16_t getFrequency (void) { return frequency; } void setDuty (const uint8_t d) { duty = d; tca1.setDuty(d); tca1.update(); } uint8_t getDuty (void) { return duty; } void stop (void) { tca1.stop(); } void run (void) { tca1.run(); } void disable (void) { en.setOff(); } void enable (void) { en.setOn(); } void dirCW (void) { direction.setOn(); } void dirCCW (void) { direction.setOff(); } void gleisOn (const uint8_t g) { icGleis.setPin(g); } void gleisOff (const uint8_t g) { icGleis.clearPin(g); } void gleisAllOff (void) { for (uint8_t i=0; i<8; i++) { icGleis.clearPin(i); } } };