FPGA solpanel Optimizer (7 / 12 steg)
Steg 7: Servo drivrutin
Två servo drivrutinsmoduler (en för varje servo) styra hastighet och riktning av servon som roterar ram och solpanel. Dessa moduler ta i en aktivera signal från Mikronesien och sedan skicka en PWM (pulse-bredd-modulation) signal till deras respektive servo som bestämmer riktning och hastighet som servon rotera. Beroende på värdet av PWM-signal, kan du göra servo gå åt vänster eller höger med en långsam eller snabb hastighet.
Vår servo föraren är faktiskt definierat strukturellt. Detta innebär att, som ADC, vi har gett den dess funktion genom att importera andra moduler och koppla ihop dem på ett sätt där vi får det önskade resultatet. I det här fallet är två modulerna vi koppla ihop för att skapa servo föraren en klocka avdelare och en PWM controller.
Här är vår enhet beskrivning för våra servo drivrutin, klocka avdelare och PWM controller:
enhet servo_driver är
Port (CLK: i STD_LOGIC;
BTN_0: I STD_LOGIC;
BTN_1: I STD_LOGIC;
SERVO: Ut STD_LOGIC);
slutet servo_driver;
komponent pwm_control är
Port (CLK: i STD_LOGIC;
DIR: I STD_LOGIC_VECTOR (1 CEN. 0);
SV: I STD_LOGIC;
SERVO: Ut STD_LOGIC);
slutet komponent;
komponent clk_div2 är
Port (CLK: i STD_LOGIC
SCLK: Ut STD_LOGIC);
slutet komponent;
Gränssnittet för servo föraren är mycket enkel. BTN_0 och BTN_1 är aktivera signaler som berättar servo vilken väg att vända. I den servo_driver arkitekturen sätts BTN_0 och BTN_1 genom viss logik att få ett värde för DIR som matas in i pwm_control. pwm_control skapar sedan en pwm-signal enligt den riktning vi vill servo att resa. När det gäller våra servon, en fyrkantsvåg med en bredd av 1,5 millisekunder med en låg 20 ms om stoppas. Något våg över 1.5 ms kommer att orsaka servo att börja flytta motsols. Något lägre än 1,5 kommer att orsaka servo flytta medsols. I vårt fall ville vi servon till flytta ganska långsamt så vi hade en fyrkantsvåg 1.52 MS för ccw rörelsen och en fyrkantsvåg 1,48 MS för cw rörelsen. Som för vår klocka avdelare, vi ville ha våra servo förare att ta emot en klocksignal som hade en period på en mikrosekund. Basys styrelsen har en standard klockfrekvens på 100 Mhz, så att vi delat upp klockan med 100 i klocka avdelare för att uppnå en frekvens på 1 Mhz (1/1 Mhz är 1 mikrosekund).
Här är en del av genomförandet av pwm_controler:
konstant time_high_stopped: heltal: = (1500); ---1500 mikrosekunder = 1.5 ms
konstant time_low: heltal: = (20000);
variabeln th_cntr: heltal intervallet 0 till 2047: = 0;
variabeln tl_cntr: heltal intervallet 0 till 32767: = 0;
om sv = '1' då
om rising_edge(CLK) då---stoppa servo
om DIR = "00" då
om tl_cntr < = time_low sedan
tl_cntr: = tl_cntr + 1.
SERVO < = "0";
elsif th_cntr < = time_high_stopped sedan
th_cntr: = th_cntr + 1.
SERVO < = '1';
annat
tl_cntr: = 0;
th_cntr: = 0;
SERVO < = "0";
slutet om;
Som ni ser, vi jämför en variabel till högst och ändras i nästa fall. Med storleken på variablerna och klockfrekvens 1 Mhz uppdelat får vi en perfekt kvadrat våg med en 1.5 ms hög och 20 ms låg.