www.mikrocontroller.net

Forum: FPGA, VHDL & Co. PWM aus "aktuellem" 8bit Wert


Important announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Florian M. (corben)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Hallo zusammen,

Ich bekommem einen 8Bit Wert geliefert der sich zu jeder Zeit ändern 
kann.
Aufgrund dieses Wertes soll die Leistung z.B. einer Led eines Lüfters 
oder was auch immer angepasst werden.
Ich hab das schon mal mit einem festen Wert gemacht:
architecture Behavioral of blink is

  constant max_count : natural := 50000000; -- 50M um auf 50 Hz zu kommen
  signal count : natural range 0 to max_count; --der Zähler von 0 bis 50M
  
begin
  
  blink : process (clk,a,b)  --wird ausgeführt bei Änderung des   Taktes, der beides Schalter
      
      begin        
        
          if a = '1' and b = '0' then      --wenn schalter a 1 ist und b 0, soll die LED mit 1Hz blinken
            if rising_edge (clk) then      --rising_edge --> Bei Takt wird 1
              count <= count+1;          --count +1
            if count < max_count/2 then    --so lange count kleiner als 25M ist mach die LED an 
            
              c <= '0';
            elsif count > max_count/2 then  --sobald >25M aus
              c <= '1';
            elsif count > max_count then    --wenn count 50M übersteigt dann wird der Zähler zurück gesetzt und es geht von vorn los
              count <= 0;              
            end if;
          end if;
          end if;
          if a = '0' and b = '1' then      --wenn b aktiviert ist wird die led um 50% gedimmt.
            c <= clk;                
          end if;
          if (a = '1' and b='1') or (a='0' and b='0') then -- sont bleibt c aus
            c <= '1';
          end if;
        
end process blink;
    
end Behavioral;

jetzt hoffe ich dass ich das wieder so machen kann, es ändert sich ja 
eigendlich nur der max_count Wert (der bisher fest eingestellt ist). Nur 
binn ich momentan noch mit den gegebenen 8bit Wreten überfordert.

Mein Ansatz:
constant max_count : std_logic_vector(7 downto 0) := PWM1FanInsideValue; 
signal count : std_logic_vector(7 downto 0) range "00000000" to max_count;
So gehts nicht.

geht das villeicht nur wenn ich den Binärwert zuvor in Dez umwandle?

Danke schon mal :-)

Autor: Robert Kuhn (Firma: Medizintechnik) (robident)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Florian M. schrieb:
> begin
>
>
>
>           if a = '1' and b = '0' then      --wenn schalter a 1 ist und b 0, soll 
die LED mit 1Hz blinken
>
>             if rising_edge (clk) then


bitte das IF hinter den rising-Konstrukt

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite Flattr this
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Ich habe den Eindruck, dass da was ganz einfaches ziemlich kompliziert 
umgesetzt werden soll...

Und dieser "kombinatorischgetaktetkombinierte" Prozess ist da nur die 
Spitze des Eisbergs.

Eine PWM braucht idR zwei Zähler und einen Komparator: einen Zähler zum 
Herunterzeilen des Quarztaktes und einen PWM-Zähler, der dann zusammen 
mit einem Vergleicher das PWM-Signal macht.

BTW: Was hast du für einen Quarz, wenn dessen Frequenz geteilt durch 50 
Millionen immer noch 50 Hz ergibt?

BTW2: Ein Zähler von 0 bis 50000000 zählt 50000001 Takte!

Autor: Uwe (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Was du brauchst ist einen Counter mit n Bits und Overflow, einen 
Comperator mit n Bits un "kleiner als" Output, 2 Register mit enable und 
Takteingang, sowie inputs laden des registers, das 2. Register wir 
jeweils beim Overflow neu aus dem ersten geladen damit keine Glitches 
etstehen, der Comperator vergleicht Counter und das 2. Register und gibt 
einen Output bei "Counter < Register 2" auf High. Nun wäre noch ein 
Prescaler für den Counter angebracht.
Man könnte mit ein paar weiteren Gattern und FlipFlops noch weitere 
PWM-Modi implementieren.
Zeichne dir das mal auf und poste es hier. Dann versuchst du daraus ein 
VHDL zu machen und guckst dir das Ergebnis mal auf RTL an. ( oder RTL2 
=:) ).

Autor: Michael (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Lothar Miller schrieb:
> Und dieser "kombinatorischgetaktetkombinierte" Prozess ist da nur die
>
> Spitze des Eisbergs.
Aber ein schicker :-)

Eine solche schnell ändernde PWM geht am Besten nach dem 
Delta-Sigma-Prinzip.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite Flattr this
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Was soll sich denn da schnell ändern sollen?

Zeig doch mal ein Beispiel für die Delta-Sigma PWM.

BTW: im Quelltext oben ist noch ein eklatanter Fehler.
Was passiert, wenn   count = max_count   ist?

Autor: Georg A. (georga)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Wenn es keine echte PWM sein muss (d.h. a '1' Takte und b '0' Takte und 
gar noch Periode a+b=const) sind binary rate multiplier einfacher. Die 
verteilen die 0/1-Pulse in der Gesamtperiode. Damit filtert sich das 
ganze auch einfacher, wenn man es analog braucht. Ist quasi die Vorstufe 
zum delta-sigma-Wandler... Ein Beispiel wäre der 7497, das geht auch im 
FPGA ganz simpel...

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite Flattr this
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Georg A. schrieb:
> Damit filtert sich das
> ganze auch einfacher, wenn man es analog braucht.
Da wäre noch was im Beitrag "Re: optimale PWM erzeugen"

Autor: MLG (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Georg A. schrieb:
> binary rate multiplier
Ui, ein neuer Begriff für ein bekanntes Werk. Man lernt nie aus.

Autor: Georg A. (georga)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Neu? Schau mal, von wann das Originaldatenblatt des SN7497 ist ;)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel




Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder GIF-Format hochladen.
Siehe Bildformate
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net