94 lines
2.7 KiB
C++
94 lines
2.7 KiB
C++
// 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; // Îñòàâëÿåì ôëàã ÷òî èìïóëüñû óæå âêëþ÷åíû.
|
|
}
|
|
}
|
|
|
|
}
|