Stap 4: Maken de CNC goed verplaatsen
Het programmeergedeelte van dit project volledig in VHDL gebeurd is, en ik de voorkeur om te schrijven van mijn eigen component implementaties, hoewel u verschillende voorbeelden van code vindt voor het beheersen van de RC servo's / DC motoren.
Voor het beheersen van beide soorten motoren zullen we om een PWM (Pulsbreedtemodulatie). Als u niet bekend bent met het proberen te zoeken op het internet voor meer informatie. U kan ook lezen over hoe de servo's en DC motoren werk, als u wilt meer weten.
Het PWM-periode zullen afwijken voor elk type motor dus in het einde we 2 verschillende codes voor pwm voor eenvoud hebben.
Beheersing van een DC-Motor
De DC-Motor wordt gecontroleerd door de H-brug. In H brug gegevensblad zien we dat de invoer inschakelen pin moet worden aangesloten op een PWM-signaal en de periode van 2 KHz. Omdat de Arty interne klok 100MHz frequentie heeft, om de gewenste klok periode van 2 KHz zal verdelen we 100 MHz / 2 KHz = 50000. Dus gebruikte ik een teller van 0 tot 49999 die verfrist zich wanneer 50000 is bereikt en krachten de output PWM signaal '1' en een vlag '1'. Ik heb een andere teller die volgens de vulling factor tellen begint als de vlag ' 1 is 'en wanneer het eindigt het krachten die de vlag terug naar ' 0' gebruikt voor de taakcyclus. De vulling factoren worden opgeslagen in een array als een constante in de PWMs architectuur.
Want we de gelijkstroommotor om te stoppen moeten nadat deze bepaalde stappen hebt verplaatst, moet het PWM-signaal 0 in dit geval dus ik een andere ingangssignaal die vertelt ons dat voegde als de motor moet worden verplaatst of niet. Als dat niet het geval is, we uitvoer PWM op 0 ingesteld.
In deze stap van het project is de PWM op de DC een beetje irrelevant. Het belang ervan zal blijken in de komende weken wanneer de DC motor encoder en de PID-controle zal worden uitgevoerd.
Voor nu, worden de richting van de motor automatisch ingesteld volgens de ingedrukte knop.
Wij controle beide gelijkstroommotoren op dezelfde manier.
Beheersing van een RC-Servo
In deze uitvoering van het project slechts 1 servo nodig is - de servo omhoog / omlaag. De pen selector servo wordt getoond in de volgende week.
De servo's input PWM moeten een 2ms periode. Dit betekent dat een 50 Hz frequentie. Net voordat we de wiskunde en wij krijgen 2000000 tellen. Het principe is hetzelfde als voorheen, behalve dat deze keer we niet schelen als het PWM-signaal blijft hetzelfde (eigenlijk we doen, maar niet op de manier waarop we de DC-Motor verzorgd), omdat een bepaalde factor vullen ons een zekere voor de Servo geeft.
De servo gaat volgens een input vanuit de schakelaar van de planken. Het zal ofwel omhoog of omlaag gaan (in deze positie de pen zal worden op het papier en trekken).
Een component die alle bovenstaande onderdelen met elkaar verbindt is geïmplementeerd en CNC wordt genoemd.
=== De CNC-Code ===
---------------DC motor pwm-----------------------
type ROM is matrix (0 tot en met 4) van integer;
constant my_nums:
ROM: =
(0 = > 0,--0 DC
1 = > 12500,--25 DC
2 = > 25000,--50DC
3 = > 37500,--75 DC
4 = > 50000--100 DC);
signaal-pwm_temp: std_logic: = "0";
signaal pwm_temp_cnt: integer: = 0;
signaal duty_temp: integer: = 0;
signaal veld Markering2: std_logic: = "0";
signaal selector: integer: = 0;
beginnen
proces (clk)
beginnen
IF(RISING_EDGE(CLK)) vervolgens
als selector = 0 then
pwm_temp < = "0";
elsif pwm_temp_cnt = 50000 then
pwm_temp < = '1';
pwm_temp_cnt < = 0;
veld Markering2 < = '1';
anders
pwm_temp_cnt < = pwm_temp_cnt + 1;
einde als;
als veld Markering2 = '1' then
Als duty_temp = my_nums(selector) then
pwm_temp < = "0";
duty_temp < = 0;
veld Markering2 < = "0";
anders
duty_temp < = duty_temp + 1;
einde als;
einde als;
einde als;
proces beëindigen;
proces (move_DC)
beginnen
IF(RISING_EDGE(CLK)) vervolgens
geval move_DC is
Wanneer '1' = > selector < = 3;
Wanneer "0" = > selector < = 0;
Wanneer anderen = > selector < = selector;
einde geval;
einde als;
proces beëindigen;
pwm_clk < = pwm_temp;
---DC motor primair onderdeel---
onderdeel PWM_DC
Poort (clk: in STD_LOGIC;
pwm_clk: uit STD_LOGIC;
move_DC: in STD_LOGIC);
einde component;
signaal-moveDC: std_logic: = "0";
beginnen
PWM: pwm_dc poort kaart (clk, en_out, moveDC);
---RICHTING SCHAKELAAR---
Process(btn)
beginnen
IF(RISING_EDGE(CLK)) vervolgens
zaak btn is
Wanneer "10" = > dir_out < = '1';
moveDC < = '1';
Wanneer "01" = > dir_out < = "0";
moveDC < = '1';
Wanneer anderen = > dir_out < = "0";
moveDC < = "0";
einde geval;
einde als;
proces beëindigen;
---RC Servo primair onderdeel---
constant my_nums: ROM: = ()
0 = > 80000,--0-1 = > 145000,--45 2 = > 165000,--90 3 = > 175000,--135 DC 4 = > 200000--180 DC);
signaal-pwm_temp: std_logic: = "0";
signaal pwm_temp_cnt: integer: = 0;
signaal duty_temp: integer: = 0;
signaal veld Markering2: std_logic: = "0";
signaal-nl: std_logic_vector (3 downto 0): = (anderen = > '0');
signaal knop: integer: = 0;
beginnen
proces (clk)
beginnen
IF(RISING_EDGE(CLK)) vervolgens
Als pwm_temp_cnt = 2000000 then
pwm_temp < = '1';
pwm_temp_cnt < = 0;
veld Markering2 < = '1';
anders
pwm_temp_cnt < = pwm_temp_cnt + 1;
einde als;
als veld Markering2 = '1' then
Als duty_temp = my_nums(button) then
pwm_temp < = "0";
duty_temp < = 0;
veld Markering2 < = "0";
anders
duty_temp < = duty_temp + 1;
einde als;
einde als;
einde als;
proces beëindigen;
proces (sw) beginnen
IF(RISING_EDGE(CLK)) vervolgens
zaak sw is
Wanneer '1' = > knop < = 4;
Wanneer "0" = > knop < = 3;
Wanneer anderen = > knop < = knop;
einde geval;
einde als;
proces beëindigen;
pwm_clk < = pwm_temp;
Een hoofdbestanddeel die kaart zal poort de DC motor primaire domeincontroller 2 keer maakt, één voor de X-as en één voor de Y-as en 1 keer de belangrijkste component van RC servo.