MotorControlModuleSDFM_TMS3.../Projects/EFC_Communication/UMLibrary/driver/Inverter.cpp
2024-06-07 11:12:56 +03:00

94 lines
3.0 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// 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 <cmath>
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<float>( 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; // Оставляем флаг что импульсы уже включены.
}
}
}