c++实现svpwm并带防飞车功能

该代码实现了一个SVPWM(空间矢量脉宽调制)类,用于计算三相电机的占空比,并包含一个AntiFlicker类,用于过滤掉低于阈值的电压波动,减少闪烁效应。在主函数中,模拟了输入信号并进行了SVPWM调制与滤波处理。
摘要由CSDN通过智能技术生成

下面是gpt生成的代码

#include <iostream>
#include <cmath>

using namespace std;

class SVPWM {
private:
    float dcBusVoltage;
    float loVoltage; 
    float hiVoltage;
    float freq;
    float period;
    float a;
    float b;
    float c;

public:
    SVPWM(float _dcBusVoltage, float _freq) {
        dcBusVoltage = _dcBusVoltage;
        freq = _freq;
        period = 1.0f/freq;
        loVoltage = 0.5f*dcBusVoltage;
        hiVoltage = dcBusVoltage - loVoltage;
    }

    void calc(float v1, float v2, float v3, float &dutyA, float &dutyB, float &dutyC) {
        float sinA = sin(2.0f*3.14159f*freq*a);
        float sinB = sin(2.0f*3.14159f*freq*b);
        float sinC = sin(2.0f*3.14159f*freq*c);
        float maxSin = max(sinA, max(sinB, sinC));
        float angle = asin(maxSin);
        float t1, t2, t3;
        if (maxSin == sinA) {
            t1 = angle/(2.0f*3.14159f*freq);
            t2 = (3.0f*3.14159f/2.0f - angle)/(2.0f*3.14159f*freq);
            t3 = (3.0f*3.14159f/2.0f + angle)/(2.0f*3.14159f*freq);
            dutyA = hiVoltage/dcBusVoltage;
            dutyB = ((loVoltage*sinB)/(dcBusVoltage*sinA));
            dutyC = ((loVoltage*sinC)/(dcBusVoltage*sinA));
        } else if (maxSin == sinB) {
            t1 = (3.0f*3.14159f/2.0f - angle)/(2.0f*3.14159f*freq);
            t2 = angle/(2.0f*3.14159f*freq);
            t3 = (3.0f*3.14159f/2.0f + angle)/(2.0f*3.14159f*freq);
            dutyA = ((loVoltage*sinA)/(dcBusVoltage*sinB));
            dutyB = hiVoltage/dcBusVoltage;
            dutyC = ((loVoltage*sinC)/(dcBusVoltage*sinB));
        } else {
            t1 = (3.0f*3.14159f/2.0f + angle)/(2.0f*3.14159f*freq);
            t2 = (3.0f*3.14159f/2.0f - angle)/(2.0f*3.14159f*freq);
            t3 = angle/(2.0f*3.14159f*freq);
            dutyA = ((loVoltage*sinA)/(dcBusVoltage*sinC));
            dutyB = ((loVoltage*sinB)/(dcBusVoltage*sinC));
            dutyC = hiVoltage/dcBusVoltage;
        }
        float minDuty = min(dutyA, min(dutyB, dutyC));
        if (minDuty < 0) {
            dutyA -= minDuty;
            dutyB -= minDuty;
            dutyC -= minDuty;
        }
        if (dutyA > 1.0f) {
            dutyA = 1.0f;
        }
        if (dutyB > 1.0f) {
            dutyB = 1.0f;
        }
        if (dutyC > 1.0f) {
            dutyC = 1.0f;
        }
        if ((t2 - t1) > period/2.0f) {
            dutyA = 0;
        }
        if ((t3 - t2) > period/2.0f) {
            dutyB = 0;
        }
        if ((period - t3 + t1) > period/2.0f) {
            dutyC = 0;
        }
    }

    void setPhase(float _a, float _b, float _c) {
        a = _a;
        b = _b;
        c = _c;
    }
};

class AntiFlicker {
private:
    float dcBusVoltage;
    float freq;
    float period;
    float threshold;
    bool lastUp;
    bool lastDown;
    int lastSign;
    int count;

public:
    AntiFlicker(float _dcBusVoltage, float _freq, float _threshold) {
        dcBusVoltage = _dcBusVoltage;
        freq = _freq;
        period = 1.0f/freq;
        threshold = _threshold;
        lastUp = false;
        lastDown = false;
        count = 0;
    }

    bool check(float voltage) {
        if (voltage <= threshold) {
            if (lastUp) {
                count++;
            }
            lastUp = false;
            lastSign = -1;
        } else {
            if (lastDown) {
                count++;
            }
            lastDown = false;
            lastSign = 1;
        }
        if (count >= 3) {
            count = 0;
            return true;
        }
        return false;
    }

    float filter(float voltage) {
        float filteredVoltage = voltage;
        if (check(voltage)) {
            filteredVoltage = dcBusVoltage*lastSign;
        }
        return filteredVoltage;
    }
};

int main() {
    SVPWM svpwm(12.0f, 10.0f);
    AntiFlicker antiFlicker(12.0f, 10.0f, 0.1f);
    float dutyA, dutyB, dutyC, filteredVoltage;
    float a = 0.0f;
    float b = 2.0f/3.0f;
    float c = -2.0f/3.0f;
    while (true) {
        filteredVoltage = antiFlicker.filter(2.0f*sin(2.0f*3.14159f*10.0f*a));
        svpwm.setPhase(a, b, c);
        svpwm.calc(0.0f, 0.0f, filteredVoltage, dutyA, dutyB, dutyC);
        cout << "Duty A: " << dutyA << ", Duty B: " << dutyB << ", Duty C: " << dutyC << endl;
        a += 0.001f;
        b += 0.001f;
        c += 0.001f;
        if (a > 1.0f) {
            a -= 1.0f;
        }
        if (b > 1.0f) {
            b -= 1.0f;
        }
        if (c > 1.0f) {
            c -= 1.0f;
        }
    }
    return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值