de.thkwalter.et.pulsmuster.SchaltwinkelRaumzeigermodulation.java Source code

Java tutorial

Introduction

Here is the source code for de.thkwalter.et.pulsmuster.SchaltwinkelRaumzeigermodulation.java

Source

/**
 *  Copyright 2014 Th. K. Walter, Nrnberg.
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */
package de.thkwalter.et.pulsmuster;

import org.apache.commons.math3.analysis.solvers.BisectionSolver;

/**
 * Diese Klasse berechnet die Schaltwinkel bei Raumzeigermodulation.
 * 
 * @author Th. K. Walter
 */
public class SchaltwinkelRaumzeigermodulation {
    /**
     * Die absolute Genauigkeit der berechneten Schaltwinkel (im Bogenma), bei der die Iteration abgebrochen wird.
     */
    private final static double ABBRUCHKRITERIUM_ABSOLUTE_GENAUIGKEIT_SCHALTWINKEL = 1e-6;

    /**
     * Die relative Genauigkeit der berechneten Schaltwinkel, bei der die Iteration abgebrochen wird.
     */
    private final static double ABBRUCHKRITERIUM_RELATIVE_GENAUIGKEIT_SCHALTWINKEL = 0.0;

    /**
     * Die maximale Anzahl von Iterationen.
     */
    private final static int MAX_ANZAHL_ITERATIONEN = 100;

    // ---------------------------------------------------------------------------------------------------------------------

    /**
     * Die berechneten Schaltwinkel (im Bogenma).
     */
    private double[] schaltwinkel;

    // =====================================================================================================================
    // =====================================================================================================================

    /**
     * Diese Methode bildet den Einsprungpunkt in die Berechnung der Schaltwinkel. 
     * 
     * @param args Die Kommandozeilenparameter. Das Programm muss mit genau einem Kommandozeilenparameter aufgerufen werden, 
     * nmlich mit der Pulszahl.
     */
    public static void main(String[] args) {
        // Falls das Programm nicht mit genau einem Parameter gestartet wurde, wird eine Fehlermeldung ausgegeben.
        if (args == null || args.length != 1) {
            System.out.println(
                    "Das Programm muss mit genau einem Parameter gestartet werden, nmlich mit der Pulszahl!");
        }

        // Falls das Programm mit genau einem Programm gestartet wurde, ...
        else {
            // Das erste Kommandozeilenargument wird in die Pulszahl umgewandelt.
            int pulszahl = Integer.MIN_VALUE;
            try {
                pulszahl = Integer.parseInt(args[0]);
            } catch (NumberFormatException e) {
                System.out.println("Der Parameter muss eine ");
            }

            if (pulszahl < 0) {
                System.out.println("Der Parameter");
            }

            else {
                // Die Schaltwinkel werden berechnet.
                SchaltwinkelRaumzeigermodulation schaltwinkelRaumzeigermodulation = new SchaltwinkelRaumzeigermodulation(
                        pulszahl);

                // Die berechneten Schaltwinkel werden gelesen und auf der Kommandozeile ausgegeben.
                for (double schaltwinkel : schaltwinkelRaumzeigermodulation.getSchaltwinkel()) {
                    System.out.println(schaltwinkel);
                }
            }
        }
    }

    // =====================================================================================================================
    // =====================================================================================================================

    /**
     * Der Konstruktor berechnet die Schaltwinkel (im Bogenma) bei Raumzeigermodulation.
     * 
     * @param pulszahl Die Pulszahl
     */
    public SchaltwinkelRaumzeigermodulation(int pulszahl) {
        // Die Anzahl der Schnittpunkte (Schaltwinkel) wird berechnet. Pro Puls ergeben sich zwei Schnittpunkte 
        // (Schaltwinkel), jeweils ein Schnittpunkt fr den Einschalt- und fr den Ausschaltvorgang.
        int nSchnittpunkte = 2 * pulszahl;

        // Die Variablen fr die obere und untere Grenze des Suchintervalls werden deklatiert.
        double min = Double.NaN;
        double max = Double.NaN;

        BisectionSolver bisectionSolver = new BisectionSolver(
                SchaltwinkelRaumzeigermodulation.ABBRUCHKRITERIUM_RELATIVE_GENAUIGKEIT_SCHALTWINKEL,
                SchaltwinkelRaumzeigermodulation.ABBRUCHKRITERIUM_ABSOLUTE_GENAUIGKEIT_SCHALTWINKEL);

        // Das Feld fr die Schaltwinkel (im Bogenma) wird erzeugt.
        this.schaltwinkel = new double[nSchnittpunkte];

        // Das Differnezsignal wird deklariert.
        Differenzsignal differenzsignal = null;

        // In der folgenden Schleife werden die Schnittpunkte (Schaltwinkel) berechnet.
        for (int i = 0; i < nSchnittpunkte; i++) {
            // Die obere und untere Grenze des Suchintervalls werden bestimmt. Das Suchintervall umfasst je eine halbe Periode
            // des Sgezahns.
            min = i * Math.PI / pulszahl;
            max = (i + 1) * Math.PI / pulszahl;

            // Das Differenzsignal fr diese Flanke wird erzeugt.
            differenzsignal = new Differenzsignal(min, 2.0 * Math.pow(-1, i), max, 2.0 * Math.pow(-1, i + 1));

            // Der Schaltwinkel wird berechnet und gespeichert.
            this.schaltwinkel[i] = bisectionSolver.solve(SchaltwinkelRaumzeigermodulation.MAX_ANZAHL_ITERATIONEN,
                    differenzsignal, min, max);
        }
    }

    // =====================================================================================================================
    // =====================================================================================================================

    /**
     * Diese Methode gibt die berechneten Schaltwinkel (im Bogenma) zurck.
     * 
     * @return Die berechneten Schaltwinkel (im Bogenma)
     */
    public double[] getSchaltwinkel() {
        // Die berechneten Schaltwinkel (im Bogenma) werden zurckgegeben.
        return this.schaltwinkel;
    }
}