StepMaster - FPGA baserad stegmotorstyrare - nu film!

Berätta om dina pågående projekt.
Användarvisningsbild
Andax
Inlägg: 4379
Blev medlem: 4 juli 2005, 23:27:38
Ort: Jönköping

StepMaster - FPGA baserad stegmotorstyrare - nu film!

Inlägg av Andax »

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.
topview.JPG
backview.JPG
frontview.JPG
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.
frontpanel.PNG
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.
X-IL
EF Sponsor
Inlägg: 8475
Blev medlem: 3 december 2008, 07:47:20
Ort: Hallstahammar

Re: StepMaster - FPGA baserad stegmotorstyrare

Inlägg av X-IL »

Spännande grejer! Du har parallell både in och ut, är den passiv i vissa lägen eller hur har du tänkt?
Jonas L
Inlägg: 432
Blev medlem: 14 juli 2009, 14:28:41
Ort: Karlshamn

Re: StepMaster - FPGA baserad stegmotorstyrare

Inlägg av Jonas L »

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.
Användarvisningsbild
Andax
Inlägg: 4379
Blev medlem: 4 juli 2005, 23:27:38
Ort: Jönköping

Re: StepMaster - FPGA baserad stegmotorstyrare

Inlägg av Andax »

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?
Ja, tanken är att man ska kunna köra MACH3 rakt av när man inte vill använda StepMasterns specialfunktioner.

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.
Användarvisningsbild
l2t
Inlägg: 2363
Blev medlem: 14 september 2010, 22:14:53
Ort: Skåne/Lund

Re: StepMaster - FPGA baserad stegmotorstyrare

Inlägg av l2t »

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 :cry:
Användarvisningsbild
Andax
Inlägg: 4379
Blev medlem: 4 juli 2005, 23:27:38
Ort: Jönköping

Re: StepMaster - FPGA baserad stegmotorstyrare

Inlägg av Andax »

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.

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>
blueint
Inlägg: 23238
Blev medlem: 4 juli 2006, 19:26:11
Kontakt:

Re: StepMaster - FPGA baserad stegmotorstyrare

Inlägg av blueint »

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.
Användarvisningsbild
Andax
Inlägg: 4379
Blev medlem: 4 juli 2005, 23:27:38
Ort: Jönköping

Re: StepMaster - FPGA baserad stegmotorstyrare

Inlägg av Andax »

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!
frontpanelv2.PNG
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
Andax
Inlägg: 4379
Blev medlem: 4 juli 2005, 23:27:38
Ort: Jönköping

Re: StepMaster - FPGA baserad stegmotorstyrare

Inlägg av Andax »

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;
blueint
Inlägg: 23238
Blev medlem: 4 juli 2006, 19:26:11
Kontakt:

Re: StepMaster - FPGA baserad stegmotorstyrare

Inlägg av blueint »

Vilke FPGA krets använder du?
Användarvisningsbild
Andax
Inlägg: 4379
Blev medlem: 4 juli 2005, 23:27:38
Ort: Jönköping

Re: StepMaster - FPGA baserad stegmotorstyrare

Inlägg av Andax »

Det är en modul baserat på spartan-3, närmare bestämt XC3S400-4PQ208C.
Användarvisningsbild
Andax
Inlägg: 4379
Blev medlem: 4 juli 2005, 23:27:38
Ort: Jönköping

Re: StepMaster - FPGA baserad stegmotorstyrare

Inlägg av Andax »

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...

Bild

Bild

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.
Användarvisningsbild
Andax
Inlägg: 4379
Blev medlem: 4 juli 2005, 23:27:38
Ort: Jönköping

Re: StepMaster - FPGA baserad stegmotorstyrare - nu film!

Inlägg av Andax »

Här är en liten film jag la upp på tuben som visar hur slavningen funkar.
Jonas L
Inlägg: 432
Blev medlem: 14 juli 2009, 14:28:41
Ort: Karlshamn

Re: StepMaster - FPGA baserad stegmotorstyrare - nu film!

Inlägg av Jonas L »

Ser ju ut att fungera bra! Har du provat motordrivet med högre hastigheter också?
Rick81
Inlägg: 755
Blev medlem: 30 december 2005, 13:07:09

Re: StepMaster - FPGA baserad stegmotorstyrare - nu film!

Inlägg av Rick81 »

Snyggt, ser ut att fungera som det ska! Väntar på nästa film när du fräser ett kugghjul! :)
Skriv svar