// This is an independent project of an individual developer. Dear PVS-Studio, please check it. // PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com /* * Inverter.cpp * * Created on: 1 нояб. 2016 г. * Author: titov */ #include "Inverter.hh" #include namespace driver { Inverter::Inverter( peripheral::IPwm & u, peripheral::IPwm & v, peripheral::IPwm & w, IDiscreteOutput & pulse_en ) : phase_u(u), phase_v(v), phase_w(w), pulse_en(pulse_en), disabled_u(false), disabled_v(false), disabled_w(false), pulse_enable(false), Tp(0), pulse_release(false), _Ta(NAN), _Tb(NAN), _Tc(NAN) { peripheral::IPwm::PwmTime time = phase_u.getMaxThreshold(); Tp = static_cast( time ); } void Inverter::enPulse() { pulse_en.on(); pulse_enable = true; } void Inverter::disPulse() { pulse_en.off(); pulse_enable = false; pulse_release = false; phase_u.disableOutput(); phase_v.disableOutput(); phase_w.disableOutput(); _Ta = _Tb = _Tc = NAN; } void Inverter::pwm(float Ta, float Tb, float Tc) { using namespace std; //core::CriticalSection cs_0; if(isnan(Ta)) { // Если NAN - значит фазу отключаем целиком, disabled_u = true; // оставляем флаг что фаза была отключена, phase_u.disableOutput(); // осуществляем отключаение фазы. } else if(disabled_u && pulse_release) { // Если фаза была отключена, и импульсы разрешены, phase_u.enableOutput(); // включаем фазу, disabled_u = false; // и снимаем флаг. } _Ta = Ta; phase_u.setThreshold(TxToTreshold(Ta)); // Просто выставляем новую уставку ШИМ. if(isnan(Tb)) { disabled_v = true; phase_v.disableOutput(); } else if(disabled_v && pulse_release) { phase_v.enableOutput(); disabled_v = false; } _Tb = Tb; phase_v.setThreshold(TxToTreshold(Tb)); if(isnan(Tc)) { disabled_w = true; phase_w.disableOutput(); } else if(disabled_w && pulse_release) { phase_w.enableOutput(); disabled_w = false; } _Tc = Tc; phase_w.setThreshold(TxToTreshold(Tc)); if(pulse_enable) { // Если необходимо включить импульсы, if(!disabled_u) phase_u.enableOutput(); // то включаем импульсы, так как if(!disabled_v) phase_v.enableOutput(); // новая правильная уставка уже записана. if(!disabled_w) phase_w.enableOutput(); pulse_enable = false; // Оставляем флаг что не нужно включать импульсы. pulse_release = true; // Оставляем флаг что импульсы уже включены. } } }