Stap 7: Servo Driver
Driver for the twee servo modules (een voor elke servo) regelen het toerental en de richting van de servo's die draaien van het frame en zonnepaneel. Deze modules deelnemen aan een signaal van het inschakelen van de FSM en verzend een PWM-signaal (pulse-breedte-modulation) naar hun respectieve servo die bepalend is voor de richting en de snelheid die de servo's draaien. Afhankelijk van de waarde van het PWM-signaal, kunt u de servo links of rechts gaan met een trage of snelle snelheid.
Onze chauffeur servo is eigenlijk structureel bepaald. Dit betekent dat, zoals de ADC, we hebben gegeven het zijn functie door andere modules importeren en ze aan elkaar koppelen op een manier waar we het gewenste resultaat hebt ontvangen. In dit geval zijn de twee modules die we met elkaar verbinden om te maken van het servo-stuurprogramma een scheidslijn klok en een PWM controller.
Hier is de beschrijving van onze entiteit voor onze servo stuurprogramma, klok divider en PWM controller:
entiteit servo_driver is
Poort (CLK: in STD_LOGIC;
BTN_0: In STD_LOGIC;
BTN_1: In STD_LOGIC;
SERVO: Uit STD_LOGIC);
einde servo_driver;
component pwm_control is
Poort (CLK: in STD_LOGIC;
DIR: In STD_LOGIC_VECTOR (1 downto 0);
NL: In STD_LOGIC;
SERVO: Uit STD_LOGIC);
einde component;
component clk_div2 is
Poort (CLK: in STD_LOGIC
SCLK: Uit de STD_LOGIC);
einde component;
De interface voor het stuurprogramma van de servo is zeer eenvoudig. BTN_0 en BTN_1 zijn inschakelen signalen die de servo vertellen welke weg te zetten. In de architectuur van de servo_driver, worden BTN_0 en BTN_1 gebracht door middel van enkele logica om een waarde voor DIR die is gevoed in pwm_control. pwm_control maakt een pwm-signaal afhankelijk van de richting die we de servo willen te reizen. In het geval van onze servo's, een blokgolf met een breedte van 1,5 milliseconden met een lage periode van 20 ms als gestopt. Golf boven 1.5 ms leiden de servo tot zal te beginnen te bewegen tegen de klok in om het even wat. Iets minder dan 1.5 zorgt ervoor dat de servo om te gaan met de klok mee. In ons geval wilden we de servo's vrij om langzaam te bewegen dus we een blokgolf van 1,52 ms voor de ccw-beweging en een blokgolf van 1,48 ms voor de cw-beweging hadden. Wat betreft onze klok scheidingslijn wilden we onze servo-chauffeur voor het ontvangen van een kloksignaal dat had een periode van een microseconde. De Basys bestuur heeft een standaard kloksnelheid van 100 Mhz, zodat we de klok gedeeld door 100 in de scheidingslijn klok met het oog op een frequentie van 1 Mhz (1/1 Mhz is 1 microseconde).
Hier is deel van de uitvoeringvan de pwm_controler:
constant time_high_stopped: INTEGER: = (1500); ---1500 microseconden = 1,5 ms
constant time_low: INTEGER: = (20000);
variabele th_cntr: INTEGER bereik 0 tot 2047: = 0;
variabele tl_cntr: INTEGER bereik 0 tot en met 32767: = 0;
Als nl = '1' then
Als rising_edge(CLK) dan---stoppen de servo
als DIR = "00" then
Als tl_cntr < = time_low then
tl_cntr: = tl_cntr + 1;
SERVO < = "0";
elsif th_cntr < = time_high_stopped then
th_cntr: = th_cntr + 1;
SERVO < = '1';
anders
tl_cntr: = 0;
th_cntr: = 0;
SERVO < = "0";
einde als;
Zoals u zien kunt, wij vergelijken een teller variabele maximaal en verander het volgende geval dienovereenkomstig. Met de grootte van de variabelen en de kloksnelheid van 1 Mhz verdeeld krijgen we een perfect vierkant Golf met een 1.5 ms hoog en 20 ms laag.