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


von Florian M. (corben)


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:
1
architecture Behavioral of blink is
2
3
  constant max_count : natural := 50000000; -- 50M um auf 50 Hz zu kommen
4
  signal count : natural range 0 to max_count; --der Zähler von 0 bis 50M
5
  
6
begin
7
  
8
  blink : process (clk,a,b)  --wird ausgeführt bei Änderung des   Taktes, der beides Schalter
9
      
10
      begin        
11
        
12
          if a = '1' and b = '0' then      --wenn schalter a 1 ist und b 0, soll die LED mit 1Hz blinken
13
            if rising_edge (clk) then      --rising_edge --> Bei Takt wird 1
14
              count <= count+1;          --count +1
15
            if count < max_count/2 then    --so lange count kleiner als 25M ist mach die LED an 
16
            
17
              c <= '0';
18
            elsif count > max_count/2 then  --sobald >25M aus
19
              c <= '1';
20
            elsif count > max_count then    --wenn count 50M übersteigt dann wird der Zähler zurück gesetzt und es geht von vorn los
21
              count <= 0;              
22
            end if;
23
          end if;
24
          end if;
25
          if a = '0' and b = '1' then      --wenn b aktiviert ist wird die led um 50% gedimmt.
26
            c <= clk;                
27
          end if;
28
          if (a = '1' and b='1') or (a='0' and b='0') then -- sont bleibt c aus
29
            c <= '1';
30
          end if;
31
        
32
end process blink;
33
    
34
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:
1
constant max_count : std_logic_vector(7 downto 0) := PWM1FanInsideValue; 
2
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 :-)

von Robert K. (Firma: Projektleiter Medizinsoftware) (robident)


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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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!

von Uwe (Gast)


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 
=:) ).

von Michael (Gast)


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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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?

von Georg A. (georga)


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...

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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"

von MLG (Gast)


Lesenswert?

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

von Georg A. (georga)


Lesenswert?

Neu? Schau mal, von wann das Originaldatenblatt des SN7497 ist ;)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.