PWM aus "aktuellem" 8bit Wert

OP #2729736
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 :-)
Moderator (Firma: Titel) Persönliche Seite #2729934
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!
Gast #2729996
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 
=:) ).
#2819695
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...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren