CNC-ritning maskin (4 / 5 steg)
Steg 4: Att göra CNC flytta ordentligt
Programmering del av detta projekt har gjorts helt i VHDL och jag föredragit att skriva min egen komponent implementeringar, men du hittar olika kodexempel för att kontrollera RC servon / DC-motorer.
Vi kommer att behöva genomföra en PWM (Pulse bredd modulering) för att kontrollera båda typer av motorer. Om du inte är bekant med det. prova att söka på internet för mer information. Du kan också läsa om hur servon och DC motorer arbete, om du vill veta mer.
PWM perioden kommer att vara olika för varje typ av motor så i slutändan får vi 2 olika koder för pwm för enkelhet.
Kontrollera en DC-Motor
DC-Motor styrs genom H bron. I H Bridge databladet ser vi att input aktivera PIN-koden ska anslutas till en PWM-signal och dess period bör vara 2 kHz. Eftersom den Arty intern klockan har 100MHz frekvens, för att få önskad clock löptid 2 KHz delar vi 100 MHz / 2 KHz = 50000. Så jag använde en räknare från 0 till 49999 som fräschar uppdaterar sig när 50000 nås och styrkor PWM utgången signal 1 och en flagga '1'. För intermittensen har jag använt en annan räknare som börjar räkna enligt den fyllning faktorn när flaggan är "1"och när den är klar det styrkor flaggan tillbaka till "0". Faktorerna som fyllning lagras i en array som en konstant i PWMs arkitekturen.
Eftersom vi behöver DC-motor att stoppa efter det flyttade vissa steg, ska PWM signalen vara 0 i detta fall så har jag lagt en annan insignalen som berättar om motorn ska gå eller inte. Om inte, vi satt utdata PWM till 0.
I detta steg i projektet är PWM på DC lite irrelevant. Dess betydelse kommer att ses under de närmaste veckorna när DC motor kodare och PID kontroll kommer att genomföras.
För nu, kommer riktningen av motorn automatiskt ställas in enligt knappen intryckt.
Vi kontrollerar både DC-motorer på samma sätt.
Kontrollera ett RC-Servo
I den här implementeringen av projektet krävs endast 1 servo - upp-ner servo. Pen selector servo visas i följande vecka.
Servon ingång PWM bör ha en 2ms period. Detta innebär en frekvens på 50 Hz. Precis som innan vi får matten och vi 2000000 räkning. Principen är densamma som tidigare förutom att denna gång inte bryr vi oss om PWM signalen förblir densamma (faktiskt vi gör, men inte på det sättet vi vårdas DC Motor), eftersom en viss faktor fyllning ger oss en viss grad för Servo.
Servo flyttas enligt indata från växeln styrelser. Det går antingen upp eller ned (i denna position ska pennan på papperet och rita).
En del som förenar alla ovanstående komponenter implementeras och kallas CNC.
=== CNC koden ===
---------------DC motor pwm-----------------------
ROM är array (0 till 4) heltal;
konstant my_nums:
ROM: =
(0 = > 0,--0 DC
1 = > 12500,--25 DC
2 = > 25000,--50DC
3 = > 37500,--75 DC
4 = > 50000--100 DC);
signal pwm_temp: std_logic: = "0";
signal pwm_temp_cnt: heltal: = 0;
signal duty_temp: heltal: = 0;
signal flag2: std_logic: = "0";
signal selector: heltal: = 0;
börja
processen (clk)
börja
IF(RISING_EDGE(CLK)) sedan
om väljaren = 0 då
pwm_temp < = "0";
elsif pwm_temp_cnt = 50000 då
pwm_temp < = '1';
pwm_temp_cnt < = 0;
flag2 < = '1';
annat
pwm_temp_cnt < = pwm_temp_cnt + 1.
slutet om;
om flag2 = '1' då
om duty_temp = my_nums(selector) sedan
pwm_temp < = "0";
duty_temp < = 0;
flag2 < = "0";
annat
duty_temp < = duty_temp + 1;
slutet om;
slutet om;
slutet om;
Avsluta process;
processen (move_DC)
börja
IF(RISING_EDGE(CLK)) sedan
fall move_DC är
När '1' = > selector < = 3;
När "0" = > selector < = 0;
När andra = > selector < = selector;
avsluta fallet;
slutet om;
Avsluta process;
pwm_clk < = pwm_temp;
---DC motor huvudkomponenten---
komponent PWM_DC är
Port (clk: i STD_LOGIC;
pwm_clk: ut STD_LOGIC;
move_DC: i STD_LOGIC);
slutet komponent;
signal moveDC: std_logic: = "0";
börja
PWM: pwm_dc port karta (clk, en_out, moveDC);
---RIKTNING SWITCH---
process(BTN)
börja
IF(RISING_EDGE(CLK)) sedan
fall btn är
När "10" = > dir_out < = '1';
moveDC < = '1';
När "01" = > dir_out < = "0";
moveDC < = '1';
När andra = > dir_out < = "0";
moveDC < = "0";
avsluta fallet;
slutet om;
Avsluta process;
---RC Servo huvudkomponenten---
konstant my_nums: ROM: = ()
0 = > 80000,--0 1 = > 145000,--45 2 = > 165000,--90 3 = > 175000,--135 DC 4 = > 200000--180 DC);
signal pwm_temp: std_logic: = "0";
signal pwm_temp_cnt: heltal: = 0;
signal duty_temp: heltal: = 0;
signal flag2: std_logic: = "0";
signal sv: std_logic_vector (3 b 0): = (andra = > '0');
signal knappen: heltal: = 0;
börja
processen (clk)
börja
IF(RISING_EDGE(CLK)) sedan
om pwm_temp_cnt = 2000000 då
pwm_temp < = '1';
pwm_temp_cnt < = 0;
flag2 < = '1';
annat
pwm_temp_cnt < = pwm_temp_cnt + 1.
slutet om;
om flag2 = '1' då
om duty_temp = my_nums(button) sedan
pwm_temp < = "0";
duty_temp < = 0;
flag2 < = "0";
annat
duty_temp < = duty_temp + 1;
slutet om;
slutet om;
slutet om;
Avsluta process;
processen (sw) påbörjas
IF(RISING_EDGE(CLK)) sedan
fall sw är
När '1' = > knappen < = 4;
När "0" = > knappen < = 3;
När andra = > knappen < = knappen;
avsluta fallet;
slutet om;
Avsluta process;
pwm_clk < = pwm_temp;
Skapa en huvudkomponent som kommer port karta den DC motor primära styrenheten 2 gånger, en för X-axeln och en för Y-axeln och 1 gången huvudkomponenten RC servo.