StepMaster - FPGA baserad stegmotorstyrare - nu film!
StepMaster - FPGA baserad stegmotorstyrare - nu film!
Kör normalt med MACH3 för att styra min miniatyrfräs och svarv. Har länge funderat på att bygga ihop något som ger lite mer möjligheter att stega och styra motorerna lite mer avancerat.
Sagt och gjort så blev det en en FPGA baserad variant (bygger på en liten FPGA modul från Opal Kelly, deras enklaste modell) som jag kapslat in i en låda jag hade liggandes. FPGA styrs och konfigureras via USB. Mycket smidigt faktiskt.
Den har en enkoderingång. Tanken är att jag ska kunna sätta en enkoder på t.ex. spindeln och sedan kunna stega en kanal med en viss nerdelning. Det blir lite som en elektronisk version av en gängtillsats till en svarv. I bilderna ser man de frästa frontplåtarna jag gjort. Inte världens vackraste finish men får duga ändå...
Opal Kelly modulen är smidig för man kan göra enkla grafiska testinterface genom att knappa ihop ett xml liknande program som sätter upp knappar etc och knyter det till signaler inne i FPGAn som sedan kan monitoreras eller ändras via USB.
Nedan är en bild på ett test-gui jag knåpat ihop för att kunna läsa av aktuellt enkodervärde och se vad in och utgångar för stegmotorer är mm. Perfekt för debugging och utveckling.
Den stora pucken nu är att göra färdigt version 1 av vhdl-koden så att man kan ställa in en vis elektronisk "nerväxling" och sedan stega valbar motor med rätt hastighet när man vrider på enkodern. Mer uppdateringar kommer senare...
Sagt och gjort så blev det en en FPGA baserad variant (bygger på en liten FPGA modul från Opal Kelly, deras enklaste modell) som jag kapslat in i en låda jag hade liggandes. FPGA styrs och konfigureras via USB. Mycket smidigt faktiskt.
Den har en enkoderingång. Tanken är att jag ska kunna sätta en enkoder på t.ex. spindeln och sedan kunna stega en kanal med en viss nerdelning. Det blir lite som en elektronisk version av en gängtillsats till en svarv. I bilderna ser man de frästa frontplåtarna jag gjort. Inte världens vackraste finish men får duga ändå...
Opal Kelly modulen är smidig för man kan göra enkla grafiska testinterface genom att knappa ihop ett xml liknande program som sätter upp knappar etc och knyter det till signaler inne i FPGAn som sedan kan monitoreras eller ändras via USB.
Nedan är en bild på ett test-gui jag knåpat ihop för att kunna läsa av aktuellt enkodervärde och se vad in och utgångar för stegmotorer är mm. Perfekt för debugging och utveckling.
Den stora pucken nu är att göra färdigt version 1 av vhdl-koden så att man kan ställa in en vis elektronisk "nerväxling" och sedan stega valbar motor med rätt hastighet när man vrider på enkodern. Mer uppdateringar kommer senare...
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Senast redigerad av Andax 31 mars 2011, 00:14:09, redigerad totalt 1 gång.
Re: StepMaster - FPGA baserad stegmotorstyrare
Spännande grejer! Du har parallell både in och ut, är den passiv i vissa lägen eller hur har du tänkt?
Re: StepMaster - FPGA baserad stegmotorstyrare
Snyggt gjort! Det var väl inget fel på de plåtarna?
Kul att se att de här grejerna blir till i verkligheten. Ska bli spännande att se hur det funkar.
Kul att se att de här grejerna blir till i verkligheten. Ska bli spännande att se hur det funkar.
Re: StepMaster - FPGA baserad stegmotorstyrare
Ja, tanken är att man ska kunna köra MACH3 rakt av när man inte vill använda StepMasterns specialfunktioner.X-IL skrev:Spännande grejer! Du har parallell både in och ut, är den passiv i vissa lägen eller hur har du tänkt?
I gui-t ovan så ser du en check-box "Manual" och en combobox "No slave". När de står i detta läge är burken passiv "feed through mode", dvs parallel out = parallel in.
När "Manual" är ikryssad så bestäms parallel out av hur raden av toggle-buttons ovanför står. Det är mest för debugging som jag lagt till det.
I comboboxen kan man välja en av följande "No slave", "Slave X", "Slave Y", "Slave Z", "Slave A". Väljer man "Slave Z" etc ska stegningen av den kanalen drivas av hur enkodern ändrar sig. Tanken är sedan att de två andra boxarna som det står 0 i just nu ska bestämma hur mycket X ska stega när enkodern ändrar sig.
T.ex. om man vill gänga med 0.7 mm stigning så ska t.ex Z ändras 0.7 mm för varje helt varv som enkodern snurrar.
Jonas L, ena plåten lossnade under fräsningen av hålet för parallell-ports-dsub så det blev inte så snyggt. Syns inte så tydligt på bilderna... Fast det gör inte så mycket.
Re: StepMaster - FPGA baserad stegmotorstyrare
Nice! En liten sidofråga, vad använder du när du skriver Gui:et? skulle oxå försöka börja så smått med ett GUI till ett projekt. Verkar extremt svårt om man ska göra Windows program.
Vet inte riktigt i vilken ände man ska börja
Vet inte riktigt i vilken ände man ska börja

Re: StepMaster - FPGA baserad stegmotorstyrare
l2t, fpga-modulen jag kör med har ett program "Front Panel" som gör att man kan sätta ihop gui-t via en xml-fil. Gui-t är alltså inte skrivet i C++, VB eller så... Se nedan hur jag skrivit koden som genererar guit ovan som man sedan laddar in i Front Panel. Väldigt smidigt när man prototypar.
Sen finns det ett C++ mflr API så att jag kan styra FPGA modulen direkt från min egen applikation om jag vill göra en sådan senare. T.ex. om jag vill göra ett program som läser en g-kodsfil och skickar den till FPGA så att jag kan generera stegningen utan att köra via MACH3.
Sen finns det ett C++ mflr API så att jag kan styra FPGA modulen direkt från min egen applikation om jag vill göra en sådan senare. T.ex. om jag vill göra ett program som läser en g-kodsfil och skickar den till FPGA så att jag kan generera stegningen utan att köra via MACH3.
Kod: Markera allt
<?xml version="1.0" encoding="ISO-8859-1"?>
<!--
StepMaster
Copyright (c) 2011, Andax
-->
<resource version="2.3.0.1">
<object class="okPanel" name="panel1">
<title>StepMaster</title>
<size>380,325</size>
<!-- PLL22150 settings
These will only be visible when the attached device has
a 22150 PLL (XEM3001).
-->
<object class="okPLL22150">
<label>PLL1</label>
<position>20,5</position>
<size>40,15</size>
<p>400</p>
<q>48</q>
<divider1 source="vco">8</divider1>
<output0 source="div1byn">on</output0>
<output1 source="ref">on</output1>
</object>
<!-- StepMaster -->
<!-- Encoder controls -->
<object class="okStaticBox">
<label>Encoder</label>
<position>10,20</position>
<size>360,90</size>
</object>
<!-- HEX -->
<object class="okHex">
<label>[15:12]</label>
<position>22,36</position>
<size>36,50</size>
<endpoint>0x20</endpoint>
<bit>12</bit>
<tooltip>Count (nibble 3)</tooltip>
</object>
<object class="okHex">
<label>[11:8]</label>
<position>62,36</position>
<size>36,50</size>
<endpoint>0x20</endpoint>
<bit>8</bit>
<tooltip>Count (nibble 2)</tooltip>
</object>
<object class="okHex">
<label>[7:4]</label>
<position>102,36</position>
<size>36,50</size>
<endpoint>0x20</endpoint>
<bit>4</bit>
<tooltip>Count (nibble 1)</tooltip>
</object>
<object class="okHex">
<label>[3:0]</label>
<position>142,36</position>
<size>36,50</size>
<endpoint>0x20</endpoint>
<bit>0</bit>
<tooltip>Count (nibble 0)</tooltip>
</object>
<!-- HEX -->
<object class="okHex">
<label>[15:12]</label>
<position>202,36</position>
<size>36,50</size>
<endpoint>0x21</endpoint>
<bit>12</bit>
<tooltip>Count (nibble 3)</tooltip>
</object>
<object class="okHex">
<label>[11:8]</label>
<position>242,36</position>
<size>36,50</size>
<endpoint>0x21</endpoint>
<bit>8</bit>
<tooltip>Count (nibble 2)</tooltip>
</object>
<object class="okHex">
<label>[7:4]</label>
<position>282,36</position>
<size>36,50</size>
<endpoint>0x21</endpoint>
<bit>4</bit>
<tooltip>Count (nibble 1)</tooltip>
</object>
<object class="okHex">
<label>[3:0]</label>
<position>322,36</position>
<size>36,50</size>
<endpoint>0x21</endpoint>
<bit>0</bit>
<tooltip>Count (nibble 0)</tooltip>
</object>
<object class="okStaticText">
<label>Current Value</label>
<position>70,90</position>
</object>
<object class="okStaticText">
<label>Latched Value</label>
<position>250,90</position>
</object>
<!-- Parallel in -->
<object class="okStaticBox">
<label>Parallel In</label>
<position>10,115</position>
<size>360,60</size>
</object>
<!-- LEDs -->
<object class="okLED">
<position>23,140</position>
<size>35,25</size>
<label align="bottom">Step X</label>
<style>SQUARE</style>
<color>#00ff00</color>
<endpoint>0x22</endpoint>
<bit>0</bit>
</object>
<object class="okLED">
<position>65,140</position>
<size>35,25</size>
<label align="bottom">Dir X</label>
<style>SQUARE</style>
<color>#00ff00</color>
<endpoint>0x22</endpoint>
<bit>1</bit>
</object>
<object class="okLED">
<position>107,140</position>
<size>35,25</size>
<label align="bottom">Step Y</label>
<style>SQUARE</style>
<color>#00ff00</color>
<endpoint>0x22</endpoint>
<bit>2</bit>
</object>
<object class="okLED">
<position>149,140</position>
<size>35,25</size>
<label align="bottom">Dir Y</label>
<style>SQUARE</style>
<color>#00ff00</color>
<endpoint>0x22</endpoint>
<bit>3</bit>
</object>
<object class="okLED">
<position>191,140</position>
<size>35,25</size>
<label align="bottom">Step Z</label>
<style>SQUARE</style>
<color>#00ff00</color>
<endpoint>0x22</endpoint>
<bit>4</bit>
</object>
<object class="okLED">
<position>233,140</position>
<size>35,25</size>
<label align="bottom">Dir Z</label>
<style>SQUARE</style>
<color>#00ff00</color>
<endpoint>0x22</endpoint>
<bit>5</bit>
</object>
<object class="okLED">
<position>275,140</position>
<size>35,25</size>
<label align="bottom">Step A</label>
<style>SQUARE</style>
<color>#00ff00</color>
<endpoint>0x22</endpoint>
<bit>6</bit>
</object>
<object class="okLED">
<position>317,140</position>
<size>35,25</size>
<label align="bottom">Dir A</label>
<style>SQUARE</style>
<color>#00ff00</color>
<endpoint>0x22</endpoint>
<bit>7</bit>
</object>
<!-- Parallel out -->
<object class="okStaticBox">
<label>Parallel Out</label>
<position>10,180</position>
<size>360,130</size>
</object>
<!-- LEDs -->
<object class="okLED">
<position>23,205</position>
<size>35,25</size>
<label align="bottom">Step X</label>
<style>SQUARE</style>
<color>#00ff00</color>
<endpoint>0x22</endpoint>
<bit>8</bit>
</object>
<object class="okLED">
<position>65,205</position>
<size>35,25</size>
<label align="bottom">Dir X</label>
<style>SQUARE</style>
<color>#00ff00</color>
<endpoint>0x22</endpoint>
<bit>9</bit>
</object>
<object class="okLED">
<position>107,205</position>
<size>35,25</size>
<label align="bottom">Step Y</label>
<style>SQUARE</style>
<color>#00ff00</color>
<endpoint>0x22</endpoint>
<bit>10</bit>
</object>
<object class="okLED">
<position>149,205</position>
<size>35,25</size>
<label align="bottom">Dir Y</label>
<style>SQUARE</style>
<color>#00ff00</color>
<endpoint>0x22</endpoint>
<bit>11</bit>
</object>
<object class="okLED">
<position>191,205</position>
<size>35,25</size>
<label align="bottom">Step Z</label>
<style>SQUARE</style>
<color>#00ff00</color>
<endpoint>0x22</endpoint>
<bit>12</bit>
</object>
<object class="okLED">
<position>233,205</position>
<size>35,25</size>
<label align="bottom">Dir Z</label>
<style>SQUARE</style>
<color>#00ff00</color>
<endpoint>0x22</endpoint>
<bit>13</bit>
</object>
<object class="okLED">
<position>275,205</position>
<size>35,25</size>
<label align="bottom">Step A</label>
<style>SQUARE</style>
<color>#00ff00</color>
<endpoint>0x22</endpoint>
<bit>14</bit>
</object>
<object class="okLED">
<position>317,205</position>
<size>35,25</size>
<label align="bottom">Dir A</label>
<style>SQUARE</style>
<color>#00ff00</color>
<endpoint>0x22</endpoint>
<bit>15</bit>
</object>
<object class="okToggleButton">
<label>Step X</label>
<position>21,240</position>
<size>41,20</size>
<endpoint>0x00</endpoint>
<bit>8</bit>
</object>
<object class="okToggleButton">
<label>Dir X</label>
<position>63,240</position>
<size>41,20</size>
<endpoint>0x00</endpoint>
<bit>9</bit>
</object>
<object class="okToggleButton">
<label>Step Y</label>
<position>105,240</position>
<size>41,20</size>
<endpoint>0x00</endpoint>
<bit>10</bit>
</object>
<object class="okToggleButton">
<label>Dir Y</label>
<position>147,240</position>
<size>41,20</size>
<endpoint>0x00</endpoint>
<bit>11</bit>
</object>
<object class="okToggleButton">
<label>Step Z</label>
<position>189,240</position>
<size>41,20</size>
<endpoint>0x00</endpoint>
<bit>12</bit>
</object>
<object class="okToggleButton">
<label>Dir Z</label>
<position>231,240</position>
<size>41,20</size>
<endpoint>0x00</endpoint>
<bit>13</bit>
</object>
<object class="okToggleButton">
<label>Step A</label>
<position>273,240</position>
<size>41,20</size>
<endpoint>0x00</endpoint>
<bit>14</bit>
</object>
<object class="okToggleButton">
<label>Dir A</label>
<position>315,240</position>
<size>41,20</size>
<endpoint>0x00</endpoint>
<bit>15</bit>
</object>
<object class="okToggleCheck">
<label>Manual</label>
<position>30,275</position>
<endpoint>0x00</endpoint>
<bit>2</bit>
</object>
<object class="okCombobox">
<position>90,270</position>
<size>70,-1</size>
<options>
<item value="0">No slave</item>
<item value="1">Slave X</item>
<item value="2">Slave Y</item>
<item value="3">Slave Z</item>
<item value="4">Slave A</item>
</options>
<endpoint>0x00</endpoint>
<bit>3</bit>
</object>
<object class="okDigitEntry">
<position>200,270</position>
<size>50,20</size>
<tooltip>Sets the integer divider.</tooltip>
<minvalue>0</minvalue>
<maxvalue>65536</maxvalue>
<radix>10</radix>
<value>0</value>
<endpoint>0x04</endpoint>
<bit>0</bit>
</object>
<object class="okDigitEntry">
<position>280,270</position>
<size>50,20</size>
<tooltip>Sets the integer divider.</tooltip>
<minvalue>0</minvalue>
<maxvalue>65536</maxvalue>
<radix>10</radix>
<value>0</value>
<endpoint>0x04</endpoint>
<bit>0</bit>
</object>
</object>
</resource>
Re: StepMaster - FPGA baserad stegmotorstyrare
Du behöver en utvecklingsmiljö till att börja med.
Under unix kan du om du skippar widgets, sätta igång direkt. "man OpenDisplay" ger en start.
Under unix kan du om du skippar widgets, sätta igång direkt. "man OpenDisplay" ger en start.
Re: StepMaster - FPGA baserad stegmotorstyrare
Nu har jag fått iordning på en första versionen av vhdl-koden så att jag kan slavat stega en stegmotor som en funktion av att jag vrider enkodern. Ska försöka fixa någon film som visar hur det funkar.
Enkodern har 14400 steg på ett varv (3600 linjer och 4 flanker) medan jag har 1600 steg per varv på stegmotorn. (200 helsteg med 8 ggr mikrostegning). Sätter jag K = 1 och M = 9 snurrar motorn 1 varv per varv på enkodern. Sätter jag (K, M) = (1, 3) så snurrar den 3 ggr så snabbt och (K, M) = (1, 27) så snurrar motorn 1/3 så snabbt. Funkar finfint!
Enkodern har 14400 steg på ett varv (3600 linjer och 4 flanker) medan jag har 1600 steg per varv på stegmotorn. (200 helsteg med 8 ggr mikrostegning). Sätter jag K = 1 och M = 9 snurrar motorn 1 varv per varv på enkodern. Sätter jag (K, M) = (1, 3) så snurrar den 3 ggr så snabbt och (K, M) = (1, 27) så snurrar motorn 1/3 så snabbt. Funkar finfint!
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Re: StepMaster - FPGA baserad stegmotorstyrare
Här är vhdl-koden för att göra nerdelningen och generera steg pulser. Som ni ser är det ganska enkelt!
Kod: Markera allt
-- StepGenerator vhdl module.
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
use IEEE.std_logic_misc.all;
use IEEE.std_logic_unsigned.all;
entity StepGenerator is
port (
clk : in STD_LOGIC;
reset : in STD_LOGIC;
K_reg : in STD_LOGIC_VECTOR(15 downto 0);
M_reg : in STD_LOGIC_VECTOR(15 downto 0);
enc_pulse : in STD_LOGIC;
enc_dir : in STD_LOGIC;
step_pulse : out STD_LOGIC;
step_dir : out STD_LOGIC
);
end StepGenerator;
architecture arch of StepGenerator is
signal counter : STD_LOGIC_VECTOR(16 downto 0) := "00000000000000000";
begin
process (clk)
type state_type is (idle, check_overflow, check_underflow, step, end_step);
variable state : state_type := idle;
variable step_len : integer;
begin
if rising_edge(clk) then
step_pulse <= '0';
if reset = '1' then
counter <= (others => '0');
state := idle;
else
case state is
when idle =>
if enc_pulse = '1' then
step_dir <= enc_dir;
if enc_dir = '1' then
counter <= counter + K_reg;
state := check_overflow;
else
counter <= counter - K_reg;
state := check_underflow;
end if;
end if;
when check_overflow =>
if counter >= M_reg then
counter <= counter - M_reg;
step_len := 40;
state := step;
else
state := idle;
end if;
when check_underflow =>
if counter >= M_reg then
counter <= counter + M_reg;
step_len := 40;
state := step;
else
state := idle;
end if;
when step =>
step_pulse <= '1';
step_len := step_len - 1;
if step_len = 0 then
step_len := 20;
state := end_step;
end if;
when end_step =>
step_pulse <= '0';
step_len := step_len - 1;
if step_len = 0 then
state := idle;
end if;
when others =>
state := idle;
end case;
end if;
end if;
end process;
end arch;
Re: StepMaster - FPGA baserad stegmotorstyrare
Det är en modul baserat på spartan-3, närmare bestämt XC3S400-4PQ208C.
Re: StepMaster - FPGA baserad stegmotorstyrare
En sak jag vill kunna göra med StepMastern är det som görs i denna you-tube film, dvs fräsa kugghjul, med sk spiral gear hobbs (vad det nu kan heta på svenska).
Har sedan tidigare gjort en hållare för "spiral gear hobbs" som jag köpt på ebay. Bilderna nedan...


Ska bli intressant och se om jag får till det!! Man matar då ett rundmatningsbord som en funktion av spindelrotationen i precis rätt takt så att man fräser N kuggar på ett varv.
Har sedan tidigare gjort en hållare för "spiral gear hobbs" som jag köpt på ebay. Bilderna nedan...


Ska bli intressant och se om jag får till det!! Man matar då ett rundmatningsbord som en funktion av spindelrotationen i precis rätt takt så att man fräser N kuggar på ett varv.
Re: StepMaster - FPGA baserad stegmotorstyrare - nu film!
Här är en liten film jag la upp på tuben som visar hur slavningen funkar.
Re: StepMaster - FPGA baserad stegmotorstyrare - nu film!
Ser ju ut att fungera bra! Har du provat motordrivet med högre hastigheter också?
Re: StepMaster - FPGA baserad stegmotorstyrare - nu film!
Snyggt, ser ut att fungera som det ska! Väntar på nästa film när du fräser ett kugghjul! 
