Hvordan lage en Pulse Width Modulation (PWM) i en Verilog modul kjører du en Motor / Servo

Hvordan lage en Pulse Width Modulation (PWM) i en Verilog modul kjører du en Motor / Servo


En pulsbreddemodulering er en måte å kontrollere rotasjon eller posisjonen av en elektrisk motor eller servo.

Ved hjelp Verilog HDL, vil jeg vise hvor enkelt det er å bruke tellere for å skape en PWM.

Bruksanvisning

1 Så hvordan en PWM arbeid?

Å ha en periodisk firkantsignal, endrer vi driftssyklus (modulerer) for å være mindre eller større, og derfor kontrollere vår enhet.

Hvorfor bruke en PWM?

Det er en enkel digital-til-analog konvertering teknikk som ikke krever en ADC.

2 Hvordan lage en Pulse Width Modulation (PWM) i en Verilog modul kjører du en Motor / Servo


OK, så kan tenke hva innganger, utganger, registre og tellere vil vi trenger og hvilken design vi ønsker å skape.

Jeg vil bruke de åtte brytere på Spartan FPGA bord for å kontrollere hvordan mine motor / servo beveger seg eller hvor fort eller sakte jeg vil den skal bevege seg.

Innganger: klokke, 8 brytere
Utganger: PWM
Registre: PWM
Tellere: 16 bit teller (vil forklare hvorfor 16 bit senere)

3 Hvordan lage en Pulse Width Modulation (PWM) i en Verilog modul kjører du en Motor / Servo


Vite hva som er klokkehastighet på FPGA og hvilken periode du ønsker å bruke.

Jeg har en Spartan FPGA bord med en 50MHz klokke. Jeg ønsker å oppdatere signal hver 1 millisekund (t). Vi bruker følgende beregning for å finne bølgeformen perioden (p)

p = t * FPGA clock

I mitt tilfelle:

p = .001 seconds * 50MHz = 50000

Å vite min p er viktig for å beregne min trinn forsinkelse (sd):

sd = p / 256 = 195

Hvorfor gjorde jeg bruke 256? Jeg skal bruke 8 brytere for å styre min servo / motor, så 2 ^ 8 = 256.

4 Hvordan lage en Pulse Width Modulation (PWM) i en Verilog modul kjører du en Motor / Servo


Til slutt ønsker vi å bruke vår telleren som vår plikt syklus. For å beregne hvor mange biter komponere vår teller vi bruke:

log2 (sd) = hvor mange biter er vår teller

Mens telleren er mindre enn sd (trinn forsinkelse) multiplisert med brytere verdi (som kan variere fra 0 til 255), dette er vår plikt syklus.

Hint

  • Når du oppretter registeret disken må du ha det initialisert til null ellers programmet vil ikke fungere.