Temperaturmessung

Temperaturmessung mit dem FPGA Teil 2

In der Fortsetzung zum ersten Teil zur Temperaturmessung im FPGA geht es nun um die Umsetzung in der Software im FPGA. Ich stelle einen Code-Ausschnitt vor, der so ähnlich auch schon in aktiven Systemen im Einsatz ist und damit gute Dienste leistet.

Codeschnipsel

-- Rampensignal erzeugen 
process( clk ) begin 
        if rising_edge( clk ) then 
                if sub_cnt = 0 then 
                        PWM_val <= PWM_val + 1 ; 
                end if ; 
                sub_cnt <= sub_cnt + 1 ; 
        end if ; 
end process ; 

-- PWM Erzeugung 
process( clk ) begin 
        if rising_edge( clk ) then 
                PWM_cnt <= ( "0" & PWM_cnt( 11 downto 0 ) ) + ( "0" & PWM_val ); 
        end if ; 
end process ; 

-- PWM Ausgabe 
process( clk ) begin 
        if rising_edge( clk ) then 
                PWMout <= PWM_cnt( 12 ) ; 
        end if ; 
end process ; 

-- Komparatoreingänge synchronisieren 
process( clk ) begin 
        if rising_edge( clk ) then 
                Comp_int <= Comp_int( 2 downto 0 ) & Comp_In; 
        end if ; 
end process ; 
        
-- Komparatorwert ausgeben 
process( clk ) begin 
        if rising_edge( clk ) then 
                if Comp_int( 3 downto 1 ) = "110" then 
                        NTC_val <= PWM_val( 11 downto 4 ) ; 
                end if ; 
        end if ; 
end process ; 

NTC : NTC_Kennlinie 
        port map ( 
                clka => clk, 
                addra => NTC_val, 
                douta => TempWertOut
        ) ; 

Erklärung

Bevor die Erklärung startet, noch eine kurze Anmerkung zu den Begrifflichkeiten. Der Begriff PWM ist nur teilweise korrekt, hier geht es mehr um eine PDM (Pulsdichtemodulation) mit Hilfe eines Sigma-Delta Modulators. Da jedoch der Begriff PWM bekannter ist und man sich eher etwas darunter vorstellen kann, benutze ich diesen Begriff.

Der obige Prozess läuft mit 10MHz, wobei der Takt mit Hilfe eine Zählers und dem Clock-Enable Signal um den Faktor 16 reduziert wird. Der PWM-Counter und damit auch das Abtastwort des Analog-Digital-Wandlers ist 12 Bit breit. Damit ergibt sich eine PWM-Signal-Frequenz von ca. 152Hz (10MHz / 16 / 2^12).

Im ersten Schritt wird ein Rampensignal erzeugt, das mit 1/16 der Prozessfrequenz inkrementiert wird. Die Periode ist wie oben erwähnt bei 152Hz.

Im zweiten Schritt wird im PWM Akkumulator, der auf der Systemfrequenz läuft, das aktuelle Inkrement zum Zähler hinzugezählt.

Im dritten Schritt wird das höchste Bit als PWM-Signal ausgegeben.

Je höher nun das Inkrement ist, desto mehr Einsen werden als PWM-Signal ausgegeben.

Parallel zu diesem Prozess wird nun der Komparator eingelesen und auf den Systemtakt synchronisiert. Wenn nun eine positive Flanke erkannt wird, dann speichert ein Prozess den Wert des Rampensignals, denn dann hat die Rampe den selben Wert wie der zu messende analoge Wert. Dieser Wert wird dann für die weitere Verarbeitung bereit gestellt. Für die Temperaturmessung erfolgt nun noch eine Anpassung der Kennlinie des NTC.

 

Ersatzschaltbild

In der Simulation sieht der Sprung in der Rampe zum Beispiel wie folgt aus:

Simulation FPGA Temperaturmessung
Zu erkennen ist hier sehr gut die Änderung in den Ausgangspulsen der PWM.

 

Zusammenfassung

Natürlich lässt sich dieses Verfahren statt für eine Temperaturmessung auch auf andere analoge Signale anwenden. Es stellt einen sehr einfach nachzubauenden AD-Wandler dar.

Wie schon beschrieben, liegt der Vorteil hier in der Einfachheit dieses Messprinzips, denn wenn eine Systemkomponente nur aus einem FPGA besteht und dieser über einen Bus mit dem Hauptsystem kommuniziert, lassen sich auch mit geringem Aufwand (also ohne extra ADCs mit speziellen Schnittstellen) eine Diagnosemöglichkeit einbauen.