<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>http://3dpfs.sensille.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Sensille</id>
		<title>3D printer from scratch - User contributions [en]</title>
		<link rel="self" type="application/atom+xml" href="http://3dpfs.sensille.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Sensille"/>
		<link rel="alternate" type="text/html" href="http://3dpfs.sensille.com/index.php?title=Special:Contributions/Sensille"/>
		<updated>2026-04-22T12:10:48Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://3dpfs.sensille.com/index.php?title=Mathematics&amp;diff=112</id>
		<title>Mathematics</title>
		<link rel="alternate" type="text/html" href="http://3dpfs.sensille.com/index.php?title=Mathematics&amp;diff=112"/>
				<updated>2018-09-03T07:49:47Z</updated>
		
		<summary type="html">&lt;p&gt;Sensille: /* Current (lacking) Solution */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Requirements for the Controller ==&lt;br /&gt;
&lt;br /&gt;
* The head has to be moved along a given curve. Currently the curve consists of segments of lines, clothoids and arcs. Later on they may also be described by Bezier-Splines/B-Splines/NURBS.&lt;br /&gt;
* The movement speed is independent from the parameterization of the curve. Most of the time the head is required to move at constant |v|, but it also accelerates/decelerates.&lt;br /&gt;
* Head movement has to be continuous in position, speed and acceleration and bounded in jerk. The source curves are at least &amp;lt;math&amp;gt;C^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
* The path the head is moved along should not deviate from the given curve by more than 0.01mm, total range is 300mm. So an accuracy of &amp;lt;math&amp;gt;10^{-5}&amp;lt;/math&amp;gt; is striven for.&lt;br /&gt;
* The velocity of the head should not deviate by more than &amp;lt;math&amp;gt;10^{-4}&amp;lt;/math&amp;gt;, the acceleration has to be continuous and bounded, the jerk only has to be bounded.&lt;br /&gt;
* The motor controller is implemented in an FPGA and communicates with the host via UART.&lt;br /&gt;
* Required step frequency up to 6 MHz, FPGA running at 20MHz.&lt;br /&gt;
* The solution should accommodate multiple kinematics, like cartesian, corexy, delta and polar.&lt;br /&gt;
&lt;br /&gt;
== Current (lacking) Solution ==&lt;br /&gt;
&lt;br /&gt;
Currently the controller accepts commands of tuples of jerk values for each axis along with a duration. Velocity and acceleration initially start at zero and are maintained between commands. This is good for straight lines with s-curve motion profiles, but to follow a curve tightly many control commands would be necessary, overwhelming the host and the communication interface.&lt;br /&gt;
&lt;br /&gt;
Commands are queued so that they can be executed back-to-back.&lt;br /&gt;
&lt;br /&gt;
== Possible Solution ==&lt;br /&gt;
&lt;br /&gt;
If the controller would implement a 5th order polynomial, each control command would consist of a tuple of (jerk, snap, crackle) per axis and a duration, while again velocity and acceleration start at zero and are maintained between commands. This would allow the controller to control the movement of the head up to jerk, while approximating the curve with a 2nd order path. The resulting motion would be continuous up to acceleration, while between segment jerk, snap and crackle can jump.&lt;br /&gt;
&lt;br /&gt;
To derive the parameters one would partition the curve into segments, calculating position, velocity and acceleration on start and end point. These 6 values determine exactly all parameters and ensure that the resulting path is &amp;lt;math&amp;gt;C^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The segments could be evenly spaced in terms of arc length or varied depending on the sharpness (change of curvature) of the curve. This is very easy for lines, arcs and clothoids as they are already parameterized in arc length, whereas for splines it would be necessary to approximate the arc length numerically.&lt;br /&gt;
&lt;br /&gt;
Note that the source curve is two dimensional, while the controller commands are per axis. Velocity and acceleration information are provided seperatly.&lt;br /&gt;
&lt;br /&gt;
One advantage of this solution is that there is no curve fitting necessary, because at the end of each segments the exact values of position, direction, velocity and acceleration are met.&lt;/div&gt;</summary>
		<author><name>Sensille</name></author>	</entry>

	<entry>
		<id>http://3dpfs.sensille.com/index.php?title=Mathematics&amp;diff=111</id>
		<title>Mathematics</title>
		<link rel="alternate" type="text/html" href="http://3dpfs.sensille.com/index.php?title=Mathematics&amp;diff=111"/>
				<updated>2018-09-03T07:49:13Z</updated>
		
		<summary type="html">&lt;p&gt;Sensille: /* Current (lacking) Solution */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Requirements for the Controller ==&lt;br /&gt;
&lt;br /&gt;
* The head has to be moved along a given curve. Currently the curve consists of segments of lines, clothoids and arcs. Later on they may also be described by Bezier-Splines/B-Splines/NURBS.&lt;br /&gt;
* The movement speed is independent from the parameterization of the curve. Most of the time the head is required to move at constant |v|, but it also accelerates/decelerates.&lt;br /&gt;
* Head movement has to be continuous in position, speed and acceleration and bounded in jerk. The source curves are at least &amp;lt;math&amp;gt;C^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
* The path the head is moved along should not deviate from the given curve by more than 0.01mm, total range is 300mm. So an accuracy of &amp;lt;math&amp;gt;10^{-5}&amp;lt;/math&amp;gt; is striven for.&lt;br /&gt;
* The velocity of the head should not deviate by more than &amp;lt;math&amp;gt;10^{-4}&amp;lt;/math&amp;gt;, the acceleration has to be continuous and bounded, the jerk only has to be bounded.&lt;br /&gt;
* The motor controller is implemented in an FPGA and communicates with the host via UART.&lt;br /&gt;
* Required step frequency up to 6 MHz, FPGA running at 20MHz.&lt;br /&gt;
* The solution should accommodate multiple kinematics, like cartesian, corexy, delta and polar.&lt;br /&gt;
&lt;br /&gt;
== Current (lacking) Solution ==&lt;br /&gt;
&lt;br /&gt;
Currently the controller accepts commands of tuples of jerk values for each axis along with a duration. Velocity and acceleration initially start at zero and are maintained between commands. This is good for straight lines with s-curve motion profiles, but to follow a curve tightly many control commands would be necessary, overwhelming the host and the communication interface.&lt;br /&gt;
&lt;br /&gt;
Commands are queued to avoid pauses between commands.&lt;br /&gt;
&lt;br /&gt;
== Possible Solution ==&lt;br /&gt;
&lt;br /&gt;
If the controller would implement a 5th order polynomial, each control command would consist of a tuple of (jerk, snap, crackle) per axis and a duration, while again velocity and acceleration start at zero and are maintained between commands. This would allow the controller to control the movement of the head up to jerk, while approximating the curve with a 2nd order path. The resulting motion would be continuous up to acceleration, while between segment jerk, snap and crackle can jump.&lt;br /&gt;
&lt;br /&gt;
To derive the parameters one would partition the curve into segments, calculating position, velocity and acceleration on start and end point. These 6 values determine exactly all parameters and ensure that the resulting path is &amp;lt;math&amp;gt;C^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The segments could be evenly spaced in terms of arc length or varied depending on the sharpness (change of curvature) of the curve. This is very easy for lines, arcs and clothoids as they are already parameterized in arc length, whereas for splines it would be necessary to approximate the arc length numerically.&lt;br /&gt;
&lt;br /&gt;
Note that the source curve is two dimensional, while the controller commands are per axis. Velocity and acceleration information are provided seperatly.&lt;br /&gt;
&lt;br /&gt;
One advantage of this solution is that there is no curve fitting necessary, because at the end of each segments the exact values of position, direction, velocity and acceleration are met.&lt;/div&gt;</summary>
		<author><name>Sensille</name></author>	</entry>

	<entry>
		<id>http://3dpfs.sensille.com/index.php?title=Mathematics&amp;diff=110</id>
		<title>Mathematics</title>
		<link rel="alternate" type="text/html" href="http://3dpfs.sensille.com/index.php?title=Mathematics&amp;diff=110"/>
				<updated>2018-09-03T07:12:08Z</updated>
		
		<summary type="html">&lt;p&gt;Sensille: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Requirements for the Controller ==&lt;br /&gt;
&lt;br /&gt;
* The head has to be moved along a given curve. Currently the curve consists of segments of lines, clothoids and arcs. Later on they may also be described by Bezier-Splines/B-Splines/NURBS.&lt;br /&gt;
* The movement speed is independent from the parameterization of the curve. Most of the time the head is required to move at constant |v|, but it also accelerates/decelerates.&lt;br /&gt;
* Head movement has to be continuous in position, speed and acceleration and bounded in jerk. The source curves are at least &amp;lt;math&amp;gt;C^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
* The path the head is moved along should not deviate from the given curve by more than 0.01mm, total range is 300mm. So an accuracy of &amp;lt;math&amp;gt;10^{-5}&amp;lt;/math&amp;gt; is striven for.&lt;br /&gt;
* The velocity of the head should not deviate by more than &amp;lt;math&amp;gt;10^{-4}&amp;lt;/math&amp;gt;, the acceleration has to be continuous and bounded, the jerk only has to be bounded.&lt;br /&gt;
* The motor controller is implemented in an FPGA and communicates with the host via UART.&lt;br /&gt;
* Required step frequency up to 6 MHz, FPGA running at 20MHz.&lt;br /&gt;
* The solution should accommodate multiple kinematics, like cartesian, corexy, delta and polar.&lt;br /&gt;
&lt;br /&gt;
== Current (lacking) Solution ==&lt;br /&gt;
&lt;br /&gt;
Currently the controller accepts commands of tuples of jerk values for each axis along with a duration. Velocity and acceleration initially start at zero and are maintained between commands. This is good for straight lines with s-curve motion profiles, but to follow a curve tightly many control commands would be necessary, overwhelming the host and the communication interface.&lt;br /&gt;
&lt;br /&gt;
== Possible Solution ==&lt;br /&gt;
&lt;br /&gt;
If the controller would implement a 5th order polynomial, each control command would consist of a tuple of (jerk, snap, crackle) per axis and a duration, while again velocity and acceleration start at zero and are maintained between commands. This would allow the controller to control the movement of the head up to jerk, while approximating the curve with a 2nd order path. The resulting motion would be continuous up to acceleration, while between segment jerk, snap and crackle can jump.&lt;br /&gt;
&lt;br /&gt;
To derive the parameters one would partition the curve into segments, calculating position, velocity and acceleration on start and end point. These 6 values determine exactly all parameters and ensure that the resulting path is &amp;lt;math&amp;gt;C^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The segments could be evenly spaced in terms of arc length or varied depending on the sharpness (change of curvature) of the curve. This is very easy for lines, arcs and clothoids as they are already parameterized in arc length, whereas for splines it would be necessary to approximate the arc length numerically.&lt;br /&gt;
&lt;br /&gt;
Note that the source curve is two dimensional, while the controller commands are per axis. Velocity and acceleration information are provided seperatly.&lt;br /&gt;
&lt;br /&gt;
One advantage of this solution is that there is no curve fitting necessary, because at the end of each segments the exact values of position, direction, velocity and acceleration are met.&lt;/div&gt;</summary>
		<author><name>Sensille</name></author>	</entry>

	<entry>
		<id>http://3dpfs.sensille.com/index.php?title=Mathematics&amp;diff=109</id>
		<title>Mathematics</title>
		<link rel="alternate" type="text/html" href="http://3dpfs.sensille.com/index.php?title=Mathematics&amp;diff=109"/>
				<updated>2018-09-03T07:10:15Z</updated>
		
		<summary type="html">&lt;p&gt;Sensille: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Requirements for the Controller ==&lt;br /&gt;
&lt;br /&gt;
* The head has to be moved along a given curve. Currently the curve consists of segments of lines, clothoids and arcs. Later on they may also be described by Bezier-Splines/B-Splines/NURBS.&lt;br /&gt;
* The movement speed is independent from the parameterization of the curve. Most of the time the head is required to move at constant |v|, but it also accelerates/decelerates.&lt;br /&gt;
* Head movement has to be continuous in position, speed and acceleration and bounded in jerk. The source curves are at least &amp;lt;math&amp;gt;C^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
* The path the head is moved along should not deviate from the given curve by more than 0.01mm, total range is 300mm. So an accuracy of &amp;lt;math&amp;gt;10^{-5}&amp;lt;/math&amp;gt; is striven for.&lt;br /&gt;
* The velocity of the head should not deviate by more than &amp;lt;math&amp;gt;10{^-4}&amp;lt;/math&amp;gt;, the acceleration has to be continuous and bounded, the jerk only has to be bounded.&lt;br /&gt;
* The motor controller is implemented in an FPGA and communicates with the host via UART.&lt;br /&gt;
* Required step frequency up to 6 MHz, FPGA running at 20MHz.&lt;br /&gt;
* The solution should accommodate multiple kinematics, like cartesian, corexy, delta and polar.&lt;br /&gt;
&lt;br /&gt;
== Current (lacking) Solution ==&lt;br /&gt;
&lt;br /&gt;
Currently the controller accepts commands of tuples of jerk values for each axis along with a duration. Velocity and acceleration initially start at zero and are maintained between commands. This is good for straight lines with s-curve motion profiles, but to follow a curve tightly many control commands would be necessary, overwhelming the host and the communication interface.&lt;br /&gt;
&lt;br /&gt;
== Possible Solution ==&lt;br /&gt;
&lt;br /&gt;
If the controller would implement a 5th order polynomial, each control command would consist of a tuple of (jerk, snap, crackle) per axis and a duration, while again velocity and acceleration start at zero and are maintained between commands. This would allow the controller to control the movement of the head up to jerk, while approximating the curve with a 2nd order path. The resulting motion would be continuous up to acceleration, while between segment jerk, snap and crackle can jump.&lt;br /&gt;
&lt;br /&gt;
To derive the parameters one would partition the curve into segments, calculating position, velocity and acceleration on start and end point. These 6 values determine exactly all parameters and ensure that the resulting path is &amp;lt;math&amp;gt;C^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The segments could be evenly spaced in terms of arc length or varied depending on the sharpness (change of curvature) of the curve. This is very easy for lines, arcs and clothoids as they are already parameterized in arc length, whereas for splines it would be necessary to approximate the arc length numerically.&lt;br /&gt;
&lt;br /&gt;
Note that the source curve is two dimensional, while the controller commands are per axis. Velocity and acceleration information are provided seperatly.&lt;br /&gt;
&lt;br /&gt;
One advantage of this solution is that there is no curve fitting necessary, because at the end of each segments the exact values of position, direction, velocity and acceleration are met.&lt;/div&gt;</summary>
		<author><name>Sensille</name></author>	</entry>

	<entry>
		<id>http://3dpfs.sensille.com/index.php?title=File:Railcore.png&amp;diff=108</id>
		<title>File:Railcore.png</title>
		<link rel="alternate" type="text/html" href="http://3dpfs.sensille.com/index.php?title=File:Railcore.png&amp;diff=108"/>
				<updated>2018-09-03T06:31:34Z</updated>
		
		<summary type="html">&lt;p&gt;Sensille: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Sensille</name></author>	</entry>

	<entry>
		<id>http://3dpfs.sensille.com/index.php?title=Mathematics&amp;diff=107</id>
		<title>Mathematics</title>
		<link rel="alternate" type="text/html" href="http://3dpfs.sensille.com/index.php?title=Mathematics&amp;diff=107"/>
				<updated>2018-09-03T06:11:27Z</updated>
		
		<summary type="html">&lt;p&gt;Sensille: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Requirements for the Controller ==&lt;br /&gt;
&lt;br /&gt;
* The head has to be moved along a given curve. Currently the curve consists of segments of lines, clothoids and arcs. Later on they may also be described by Bezier-Splines/B-Splines/NURBS.&lt;br /&gt;
* The movement speed is independent from the parameterization of the curve. Most of the time the head is required to move at constant |v|, but it also accelerates/decelerates.&lt;br /&gt;
* Head movement has to be continuous in position, speed and acceleration and bounded in jerk. The source curves are at least C2.&lt;br /&gt;
* The path the head is moved along should not deviate from the given curve by more than 0.01mm, total range is 300mm. So an accuracy of 10^-5 is striven for.&lt;br /&gt;
* The velocity of the head should not deviate by more than 10^-4, the acceleration has to be continuous and bounded, the jerk only has to be bounded.&lt;br /&gt;
* The motor controller is implemented in an FPGA and communicates with the host via UART.&lt;br /&gt;
* Required step frequency up to 6 MHz, FPGA running at 20MHz.&lt;br /&gt;
* The solution should accommodate multiple kinematics, like cartesian, corexy, delta and polar.&lt;br /&gt;
&lt;br /&gt;
== Current (lacking) Solution ==&lt;br /&gt;
&lt;br /&gt;
Currently the controller accepts commands of tuples of jerk values for each axis along with a duration. Velocity and acceleration initially start at zero and are maintained between commands. This is good for straight lines with s-curve motion profiles, but to follow a curve tightly many control commands would be necessary, overwhelming the host and the communication interface.&lt;br /&gt;
&lt;br /&gt;
== Possible Solution ==&lt;br /&gt;
&lt;br /&gt;
If the controller would implement a 5th order polynomial, each control command would consist of a tuple of (jerk, snap, crackle) per axis and a duration, while again velocity and acceleration start at zero and are maintained between commands. This would allow the controller to control the movement of the head up to jerk, while approximating the curve with a 2nd order path. The resulting motion would be continuous up to acceleration, while between segment jerk, snap and crackle can jump.&lt;br /&gt;
&lt;br /&gt;
To derive the parameters one would partition the curve into segments, calculating position, velocity and acceleration on start and end point. These 6 values determine exactly all parameters and ensure that the resulting path is C2.&lt;br /&gt;
&lt;br /&gt;
The segments could be evenly spaced in terms of arc length or varied depending on the sharpness (change of curvature) of the curve. This is very easy for lines, arcs and clothoids as they are already parameterized in arc length, whereas for splines it would be necessary to approximate the arc length numerically.&lt;br /&gt;
&lt;br /&gt;
Note that the source curve is two dimensional, while the controller commands are per axis. Velocity and acceleration information are provided seperatly.&lt;br /&gt;
&lt;br /&gt;
One advantage of this solution is that there is no curve fitting necessary, because at the end of each segments the exact values of position, direction, velocity and acceleration are met.&lt;/div&gt;</summary>
		<author><name>Sensille</name></author>	</entry>

	<entry>
		<id>http://3dpfs.sensille.com/index.php?title=Mathematics&amp;diff=106</id>
		<title>Mathematics</title>
		<link rel="alternate" type="text/html" href="http://3dpfs.sensille.com/index.php?title=Mathematics&amp;diff=106"/>
				<updated>2018-09-03T06:08:27Z</updated>
		
		<summary type="html">&lt;p&gt;Sensille: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Requirements for the Controller ==&lt;br /&gt;
&lt;br /&gt;
* The head has to be moved along a given curve. Currently the curve consists of segments of lines, clothoids and arcs. Later on they may also be described by Bezier-Splines/B-Splines/NURBS.&lt;br /&gt;
* The movement speed is independent from the parameterization of the curve. Most of the time the head is required to move at constant |v|, but it also accelerates/decelerates.&lt;br /&gt;
* Head movement has to be continuous in position, speed and acceleration and bounded in jerk. The source curves are at least C2.&lt;br /&gt;
* The path the head is moved along should not deviate from the given curve by more than 0.01mm, total range is 300mm. So an accuracy of 10^-5 is striven for.&lt;br /&gt;
* The velocity of the head should not deviate by more than 10^-4, the acceleration has to be continuous and bounded, the jerk only has to be bounded.&lt;br /&gt;
* The motor controller is implemented in an FPGA and communicates with the host via UART.&lt;br /&gt;
* Required step frequency up to 6 MHz, FPGA running at 20MHz.&lt;br /&gt;
* The solution should accommodate multiple kinematics, like cartesian, corexy, delta and polar.&lt;br /&gt;
&lt;br /&gt;
== Current (lacking) Solution ==&lt;br /&gt;
&lt;br /&gt;
Currently the controller accepts commands of tuples of jerk values for each axis along with a duration. Velocity and acceleration initially start at zero and are maintained between commands. This is good for straight lines with s-curve motion profiles, but to follow a curve tightly many control commands would be necessary, overwhelming the host and the communication interface.&lt;br /&gt;
&lt;br /&gt;
== Possible Solution ==&lt;br /&gt;
&lt;br /&gt;
If the controller would implement a 5th order polynomial, each control command would consist of a tuple of (jerk, snap, crackle) per axis and a duration, while again velocity and acceleration start at zero and are maintained between commands. This would allow the controller to control the movement of the head up to jerk, while approximating the curve with a 2nd order path. The resulting motion would be continuous up to acceleration, while between segment jerk, snap and crackle can jump.&lt;br /&gt;
&lt;br /&gt;
To derive the parameters one would partition the curve into segments, calculating position, velocity and acceleration on start and end point. These 6 values determine exactly all parameters and ensure that the resulting path is C2.&lt;br /&gt;
&lt;br /&gt;
The segments could be evenly spaced in terms of arc length or varied depending on the sharpness (change of curvature) of the curve. This is very easy for lines, arcs and clothoids as they are already parameterized in arc length, whereas for splines it would be necessary to approximate the arc length numerically.&lt;br /&gt;
&lt;br /&gt;
Note that the source curve is two dimensional, while the controller commands are per axis. Velocity and acceleration information are provided seperatly.&lt;/div&gt;</summary>
		<author><name>Sensille</name></author>	</entry>

	<entry>
		<id>http://3dpfs.sensille.com/index.php?title=Mathematics&amp;diff=105</id>
		<title>Mathematics</title>
		<link rel="alternate" type="text/html" href="http://3dpfs.sensille.com/index.php?title=Mathematics&amp;diff=105"/>
				<updated>2018-09-03T05:56:57Z</updated>
		
		<summary type="html">&lt;p&gt;Sensille: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Requirements for the Controller ==&lt;br /&gt;
&lt;br /&gt;
* The head has to be moved along a given curve. Currently the curve consists of segments of lines, clothoids and arcs. Later on they may also be described by Bezier-Splines/B-Splines/NURBS.&lt;br /&gt;
* The movement speed is independent from the parameterization of the curve. Most of the time the head is required to move at constant |v|, but it also accelerates/decelerates.&lt;br /&gt;
* Head movement has to be continuous in position, speed and acceleration and bounded in jerk. The source curves are at least C2.&lt;br /&gt;
* The path the head is moved along should not deviate from the given curve more than, 0.01mm, total range of motion is 300mm. So a accuracy of 10^-5 is striven for.&lt;br /&gt;
* The velocity of the head should not deviate by more than 10^-4, the acceleration has to be continuous and bounded, the jerk has only to be bounded.&lt;br /&gt;
* The motor controller is implemented in an FPGA and communicates with the host via UART.&lt;br /&gt;
* Required step frequency up to 6 MHz, FPGA running at 20MHz&lt;br /&gt;
* The solution should accommodate multiple kinematics, like cartesian, corexy, delta and polar&lt;br /&gt;
&lt;br /&gt;
== Current (lacking) Solution ==&lt;br /&gt;
&lt;br /&gt;
Currently the controller accepts commands of tuples of jerk values for each axis along with a duration. Velocity and acceleration initially start at zero and are maintained between commands. This is good for straight lines with s-curve motion profiles, but to follow a curve tightly many control commands would be necessary, overwhelming the host and the communication interface.&lt;br /&gt;
&lt;br /&gt;
== Possible Solution ==&lt;br /&gt;
&lt;br /&gt;
If the controller would implement a 5th order polynomial, each control command would consist of a tuple of (jerk, snap, crackle) per axis and a duration, while again velocity and acceleration start at zero and are maintained between command. This would allow the controller to control the movement of the head up to jerk, while approximating the curve with a 2nd order path. The resulting motion would bei continuous up to acceleration, while between segment jerk, snap and crackle can jump.&lt;br /&gt;
&lt;br /&gt;
To derive the parameters one would partition the curve into segments, calculating position, velocity and acceleration on start and end point. These 6 values determine exactly all parameters and ensure that the resulting path is C2.&lt;br /&gt;
&lt;br /&gt;
The segments could be evenly spaced in terms of arc length or varied depending on the sharpness (change of curvature) of the curve. This is very easy for lines, arcs and clothoids as they are already parametrized in arc length, whereas for splines it would be necessary to approximate the arc length.&lt;/div&gt;</summary>
		<author><name>Sensille</name></author>	</entry>

	<entry>
		<id>http://3dpfs.sensille.com/index.php?title=Mathematics&amp;diff=104</id>
		<title>Mathematics</title>
		<link rel="alternate" type="text/html" href="http://3dpfs.sensille.com/index.php?title=Mathematics&amp;diff=104"/>
				<updated>2018-09-03T05:28:51Z</updated>
		
		<summary type="html">&lt;p&gt;Sensille: Created page with &amp;quot;== Requirements for the Controller ==  * The head has to be moved along a given curve. Currently the curve consists of segments of lines, clothoids and arcs. Later on they may...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Requirements for the Controller ==&lt;br /&gt;
&lt;br /&gt;
* The head has to be moved along a given curve. Currently the curve consists of segments of lines, clothoids and arcs. Later on they may also be described by Bezier-Splines/B-Splines/NURBS.&lt;br /&gt;
* The movement speed is independent from the parameterization of the curve. Most of the time the head is required to move at constant |v|, but it also accelerates/decelerates.&lt;br /&gt;
* Head movement has to be continuous in position, speed and acceleration and bounded in jerk. The source curves are at least C2.&lt;br /&gt;
* The path the head is moved along should not deviate from the given curve more than, 0.01mm, total range of motion is 300mm. So a accuracy of 10^-5 is striven for.&lt;br /&gt;
* The velocity of the head should not deviate by more than 10^-4, the acceleration has to be continuous and bounded, the jerk has only to be bounded.&lt;br /&gt;
* The motor controller is implemented in an FPGA and communicates with the host via UART.&lt;br /&gt;
* Required step frequency up to 6 MHz, FPGA running at 20MHz&lt;/div&gt;</summary>
		<author><name>Sensille</name></author>	</entry>

	<entry>
		<id>http://3dpfs.sensille.com/index.php?title=Main_Page&amp;diff=103</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="http://3dpfs.sensille.com/index.php?title=Main_Page&amp;diff=103"/>
				<updated>2018-09-03T05:09:02Z</updated>
		
		<summary type="html">&lt;p&gt;Sensille: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Stepper]]&lt;br /&gt;
&lt;br /&gt;
[[Controller]]&lt;br /&gt;
&lt;br /&gt;
[[Controller v2]]&lt;br /&gt;
&lt;br /&gt;
[[Mathematics]]&lt;br /&gt;
&lt;br /&gt;
[[Slicing]]&lt;/div&gt;</summary>
		<author><name>Sensille</name></author>	</entry>

	<entry>
		<id>http://3dpfs.sensille.com/index.php?title=Slicing&amp;diff=102</id>
		<title>Slicing</title>
		<link rel="alternate" type="text/html" href="http://3dpfs.sensille.com/index.php?title=Slicing&amp;diff=102"/>
				<updated>2018-09-03T05:08:31Z</updated>
		
		<summary type="html">&lt;p&gt;Sensille: Sensille moved page Mathematics to Slicing without leaving a redirect&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Transformation Chain =&lt;br /&gt;
&lt;br /&gt;
== Input ==&lt;br /&gt;
* STL&lt;br /&gt;
* STEP&lt;br /&gt;
&lt;br /&gt;
== Slicing output ==&lt;br /&gt;
* lines&lt;br /&gt;
* arcs&lt;br /&gt;
* b-splines&lt;br /&gt;
&lt;br /&gt;
=== Options ===&lt;br /&gt;
* approximate everything with lines (gcode)&lt;br /&gt;
* approximate everything with bezier splines&lt;br /&gt;
&lt;br /&gt;
== Adding velocity profile ==&lt;br /&gt;
* trapezoidal&lt;br /&gt;
* s-curve&lt;br /&gt;
* higher order&lt;br /&gt;
&lt;br /&gt;
== Transform into target kinematics ==&lt;br /&gt;
* cartesian&lt;br /&gt;
* corexy&lt;br /&gt;
* delta&lt;br /&gt;
* polar&lt;br /&gt;
&lt;br /&gt;
=== Options ===&lt;br /&gt;
* transform mathematically&lt;br /&gt;
* quantize into oversampled steps before transformation and translate only points Oversampling may depend on the target kinematics and must be high enough that after transformation the resolution still exceeds the microstepping resolution&lt;br /&gt;
   &lt;br /&gt;
== Generate per-axis motion data ==&lt;br /&gt;
* either mathematically&lt;br /&gt;
* or step data&lt;br /&gt;
&lt;br /&gt;
== Transfer per-axis motion data ==&lt;br /&gt;
* transfer mathematically&lt;br /&gt;
* transfer ((lossily) compressed) step data&lt;br /&gt;
&lt;br /&gt;
== Generate steps ==&lt;br /&gt;
&lt;br /&gt;
= Potential Solutions =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Most complex solution: Transport mathematically correct data up to the fpga ==&lt;br /&gt;
* transformations for lines, arcs and splines needed into target kinematics&lt;br /&gt;
* projections into single axis and combination with velocity profiles for each transformation needed&lt;br /&gt;
* fpga needs to know all projected profiles&lt;br /&gt;
&lt;br /&gt;
== Intermediate solution: Approximate at or after slicing and transport mathematically ==&lt;br /&gt;
* only one motion (lines or splines) need to be translated into all target kinematics&lt;br /&gt;
* fpga need to know one profile for each kinematics&lt;br /&gt;
&lt;br /&gt;
== Simplest solution: Approximate at or after slicing ==&lt;br /&gt;
* only points need to be translated to target kinematics&lt;br /&gt;
* computationally intensive because each point needs to be translated individually, plus needed oversampling for some kinematics&lt;br /&gt;
* steps need to be compressed for transmission. If the compression is lossy, it degrades the precision slightly&lt;/div&gt;</summary>
		<author><name>Sensille</name></author>	</entry>

	<entry>
		<id>http://3dpfs.sensille.com/index.php?title=Controller_v2&amp;diff=101</id>
		<title>Controller v2</title>
		<link rel="alternate" type="text/html" href="http://3dpfs.sensille.com/index.php?title=Controller_v2&amp;diff=101"/>
				<updated>2018-07-29T15:29:12Z</updated>
		
		<summary type="html">&lt;p&gt;Sensille: /* SET_ROUTING */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= UART-based Controller =&lt;br /&gt;
&lt;br /&gt;
The controller has two UARTs, one for control and one for motion data. The motion-UART can use hardware flow control.&lt;br /&gt;
&lt;br /&gt;
== Framing ==&lt;br /&gt;
&lt;br /&gt;
The framing is self synchronizing. Each frame ends with an EOF marker. Everywhere else the EOF marker is escaped.&lt;br /&gt;
&lt;br /&gt;
=== Frame Format ===&lt;br /&gt;
&lt;br /&gt;
* 1 byte sequence number&lt;br /&gt;
* n byte frame data&lt;br /&gt;
* 2 byte crc16 (CCITT) of frame data&lt;br /&gt;
* 0x7e as EOF marker&lt;br /&gt;
&lt;br /&gt;
=== Escaping ===&lt;br /&gt;
&lt;br /&gt;
Escaping is done by byte stuffing. Escape character is 0x7d. Bytes to be escaped are 0x7d and 0x7e. The escape character is following by the byte to by escaped XOR 0x20.&lt;br /&gt;
&lt;br /&gt;
=== Sequence Number ===&lt;br /&gt;
&lt;br /&gt;
The sequence number is echoed by the controller. The controller expects sequence numbers in ascending order. The sequence number has 7 bits. The special sequence nuber 0x80 resets the expected number in the controller to 0, so that the next frame has to be sent with the number 0x01. This is needed to achieve a resynchronization.&lt;br /&gt;
The controller signals a receive error by setting the MSB in the response sequence number, echoing the received number.&lt;br /&gt;
&lt;br /&gt;
== Control Commands ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;vardata&amp;gt; is an 8-120 bit unsigned integer. If less than 120 bit are sent, the date is 0-extended to 120 bit.&lt;br /&gt;
&lt;br /&gt;
=== SPI ===&lt;br /&gt;
&lt;br /&gt;
Format: 0x8X &amp;lt;vardata&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sends &amp;lt;vardata&amp;gt; to SPI, asserting CS X. The read data are sent in a response packet of full length.&lt;br /&gt;
&lt;br /&gt;
=== GPOUT_HI ===&lt;br /&gt;
&lt;br /&gt;
Format: 0x70 &amp;lt;X&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sets GPIO X to HI.&lt;br /&gt;
&lt;br /&gt;
=== GPOUT_LO ===&lt;br /&gt;
&lt;br /&gt;
Format: 0x71 &amp;lt;X&amp;gt;&lt;br /&gt;
&lt;br /&gt;
sets GPIO X to LO.&lt;br /&gt;
&lt;br /&gt;
=== GPIN ===&lt;br /&gt;
&lt;br /&gt;
Format: 0x78&lt;br /&gt;
&lt;br /&gt;
Sends the value of all GPIN-pins as a bitmask in a response packet.&lt;br /&gt;
&lt;br /&gt;
== Motion Commands ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;vardata&amp;gt; is an 8-64 bit signed integer. If less than 64 bit are sent, the date is sign extended to 64 bit.&lt;br /&gt;
 &lt;br /&gt;
=== SET_ROUTING ===&lt;br /&gt;
&lt;br /&gt;
Format: 0x60 &amp;lt;output channel&amp;gt; &amp;lt;controller source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Controllers are numbered here starting from 1. Setting the controller to 0 means disabling the output.&lt;br /&gt;
&lt;br /&gt;
=== NOTIFY ===&lt;br /&gt;
&lt;br /&gt;
Format: 0x61 &amp;lt;vardata&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Echoes &amp;lt;vardata&amp;gt; to host as full 64 bit value.&lt;br /&gt;
&lt;br /&gt;
=== LOADALLREGS ===&lt;br /&gt;
&lt;br /&gt;
Format: 0x70 &amp;lt;vardata&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Load all preload registers to vardata.&lt;br /&gt;
&lt;br /&gt;
=== LOADCNT ===&lt;br /&gt;
&lt;br /&gt;
Format: 0x71 &amp;lt;vardata&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Load the count register to vardata and latch all registers with the preload registers.&lt;br /&gt;
&lt;br /&gt;
=== LOADREG ===&lt;br /&gt;
&lt;br /&gt;
Format: 0x8X &amp;lt;vardata&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Load the preload register belonging to controller X with vardata.&lt;/div&gt;</summary>
		<author><name>Sensille</name></author>	</entry>

	<entry>
		<id>http://3dpfs.sensille.com/index.php?title=Controller_v2&amp;diff=100</id>
		<title>Controller v2</title>
		<link rel="alternate" type="text/html" href="http://3dpfs.sensille.com/index.php?title=Controller_v2&amp;diff=100"/>
				<updated>2018-07-29T15:26:33Z</updated>
		
		<summary type="html">&lt;p&gt;Sensille: /* UART-based Controller */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= UART-based Controller =&lt;br /&gt;
&lt;br /&gt;
The controller has two UARTs, one for control and one for motion data. The motion-UART can use hardware flow control.&lt;br /&gt;
&lt;br /&gt;
== Framing ==&lt;br /&gt;
&lt;br /&gt;
The framing is self synchronizing. Each frame ends with an EOF marker. Everywhere else the EOF marker is escaped.&lt;br /&gt;
&lt;br /&gt;
=== Frame Format ===&lt;br /&gt;
&lt;br /&gt;
* 1 byte sequence number&lt;br /&gt;
* n byte frame data&lt;br /&gt;
* 2 byte crc16 (CCITT) of frame data&lt;br /&gt;
* 0x7e as EOF marker&lt;br /&gt;
&lt;br /&gt;
=== Escaping ===&lt;br /&gt;
&lt;br /&gt;
Escaping is done by byte stuffing. Escape character is 0x7d. Bytes to be escaped are 0x7d and 0x7e. The escape character is following by the byte to by escaped XOR 0x20.&lt;br /&gt;
&lt;br /&gt;
=== Sequence Number ===&lt;br /&gt;
&lt;br /&gt;
The sequence number is echoed by the controller. The controller expects sequence numbers in ascending order. The sequence number has 7 bits. The special sequence nuber 0x80 resets the expected number in the controller to 0, so that the next frame has to be sent with the number 0x01. This is needed to achieve a resynchronization.&lt;br /&gt;
The controller signals a receive error by setting the MSB in the response sequence number, echoing the received number.&lt;br /&gt;
&lt;br /&gt;
== Control Commands ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;vardata&amp;gt; is an 8-120 bit unsigned integer. If less than 120 bit are sent, the date is 0-extended to 120 bit.&lt;br /&gt;
&lt;br /&gt;
=== SPI ===&lt;br /&gt;
&lt;br /&gt;
Format: 0x8X &amp;lt;vardata&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sends &amp;lt;vardata&amp;gt; to SPI, asserting CS X. The read data are sent in a response packet of full length.&lt;br /&gt;
&lt;br /&gt;
=== GPOUT_HI ===&lt;br /&gt;
&lt;br /&gt;
Format: 0x70 &amp;lt;X&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sets GPIO X to HI.&lt;br /&gt;
&lt;br /&gt;
=== GPOUT_LO ===&lt;br /&gt;
&lt;br /&gt;
Format: 0x71 &amp;lt;X&amp;gt;&lt;br /&gt;
&lt;br /&gt;
sets GPIO X to LO.&lt;br /&gt;
&lt;br /&gt;
=== GPIN ===&lt;br /&gt;
&lt;br /&gt;
Format: 0x78&lt;br /&gt;
&lt;br /&gt;
Sends the value of all GPIN-pins as a bitmask in a response packet.&lt;br /&gt;
&lt;br /&gt;
== Motion Commands ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;vardata&amp;gt; is an 8-64 bit signed integer. If less than 64 bit are sent, the date is sign extended to 64 bit.&lt;br /&gt;
 &lt;br /&gt;
=== SET_ROUTING ===&lt;br /&gt;
&lt;br /&gt;
Format: 0x60 &amp;lt;output channel&amp;gt; &amp;lt;controller source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== NOTIFY ===&lt;br /&gt;
&lt;br /&gt;
Format: 0x61 &amp;lt;vardata&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Echoes &amp;lt;vardata&amp;gt; to host as full 64 bit value.&lt;br /&gt;
&lt;br /&gt;
=== LOADALLREGS ===&lt;br /&gt;
&lt;br /&gt;
Format: 0x70 &amp;lt;vardata&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Load all preload registers to vardata.&lt;br /&gt;
&lt;br /&gt;
=== LOADCNT ===&lt;br /&gt;
&lt;br /&gt;
Format: 0x71 &amp;lt;vardata&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Load the count register to vardata and latch all registers with the preload registers.&lt;br /&gt;
&lt;br /&gt;
=== LOADREG ===&lt;br /&gt;
&lt;br /&gt;
Format: 0x8X &amp;lt;vardata&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Load the preload register belonging to controller X with vardata.&lt;/div&gt;</summary>
		<author><name>Sensille</name></author>	</entry>

	<entry>
		<id>http://3dpfs.sensille.com/index.php?title=Controller_v2&amp;diff=99</id>
		<title>Controller v2</title>
		<link rel="alternate" type="text/html" href="http://3dpfs.sensille.com/index.php?title=Controller_v2&amp;diff=99"/>
				<updated>2018-07-29T15:18:09Z</updated>
		
		<summary type="html">&lt;p&gt;Sensille: /* UART-based Controller */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= UART-based Controller =&lt;br /&gt;
&lt;br /&gt;
The controller has two UARTs, one for control and one for motion data. The motion-UART can use hardware flow control.&lt;br /&gt;
&lt;br /&gt;
== Framing ==&lt;br /&gt;
&lt;br /&gt;
The framing is self synchronizing. Each frame ends with an EOF marker. Everywhere else the EOF marker is escaped.&lt;br /&gt;
&lt;br /&gt;
=== Frame Format ===&lt;br /&gt;
&lt;br /&gt;
* 1 byte sequence number&lt;br /&gt;
* n byte frame data&lt;br /&gt;
* 2 byte crc16 (CCITT) of frame data&lt;br /&gt;
* 0x7e as EOF marker&lt;br /&gt;
&lt;br /&gt;
=== Escaping ===&lt;br /&gt;
&lt;br /&gt;
Escaping is done by byte stuffing. Escape character is 0x7d. Bytes to be escaped are 0x7d and 0x7e. The escape character is following by the byte to by escaped XOR 0x20.&lt;br /&gt;
&lt;br /&gt;
=== Sequence Number ===&lt;br /&gt;
&lt;br /&gt;
The sequence number is echoed by the controller. The controller expects sequence numbers in ascending order. The sequence number has 7 bits. The special sequence nuber 0x80 resets the expected number in the controller to 0, so that the next frame has to be sent with the number 0x01. This is needed to achieve a resynchronization.&lt;br /&gt;
The controller signals a receive error by setting the MSB in the response sequence number, echoing the received number.&lt;br /&gt;
&lt;br /&gt;
== Control Commands ==&lt;br /&gt;
&lt;br /&gt;
== Motion Commands ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;vardata&amp;gt; is an 8-64 bit signed integer. If less than 64 bit are sent, the date is sign extended to 64 bit.&lt;br /&gt;
 &lt;br /&gt;
=== SET_ROUTING ===&lt;br /&gt;
&lt;br /&gt;
Format: 0x60 &amp;lt;output channel&amp;gt; &amp;lt;controller source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== NOTIFY ===&lt;br /&gt;
&lt;br /&gt;
Format: 0x61&lt;br /&gt;
&lt;br /&gt;
=== LOADALLREGS ===&lt;br /&gt;
&lt;br /&gt;
Format: 0x70 &amp;lt;vardata&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Load all preload registers to vardata.&lt;br /&gt;
&lt;br /&gt;
=== LOADCNT ===&lt;br /&gt;
&lt;br /&gt;
Format: 0x71 &amp;lt;vardata&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Load the count register to vardata and latch all registers with the preload registers.&lt;br /&gt;
&lt;br /&gt;
=== LOADREG ===&lt;br /&gt;
&lt;br /&gt;
Format: 0x8X &amp;lt;vardata&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Load the preload register belonging to controller X with vardata.&lt;/div&gt;</summary>
		<author><name>Sensille</name></author>	</entry>

	<entry>
		<id>http://3dpfs.sensille.com/index.php?title=Controller_v2&amp;diff=98</id>
		<title>Controller v2</title>
		<link rel="alternate" type="text/html" href="http://3dpfs.sensille.com/index.php?title=Controller_v2&amp;diff=98"/>
				<updated>2018-07-29T15:03:45Z</updated>
		
		<summary type="html">&lt;p&gt;Sensille: /* UART-based Controller */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= UART-based Controller =&lt;br /&gt;
&lt;br /&gt;
Command Format&lt;br /&gt;
&lt;br /&gt;
== Framing ==&lt;br /&gt;
&lt;br /&gt;
The framing is self synchronizing. Each frame ends with an EOF marker. Everywhere else the EOF marker is escaped.&lt;br /&gt;
&lt;br /&gt;
=== Frame Format ===&lt;br /&gt;
&lt;br /&gt;
* 1 byte sequence number&lt;br /&gt;
* n byte frame data&lt;br /&gt;
* 2 byte crc16 (CCITT) of frame data&lt;br /&gt;
* 0x7e as EOF marker&lt;br /&gt;
&lt;br /&gt;
=== Escaping ===&lt;br /&gt;
&lt;br /&gt;
Escaping is done by byte stuffing. Escape character is 0x7d. Bytes to be escaped are 0x7d and 0x7e. The escape character is following by the byte to by escaped XOR 0x20.&lt;br /&gt;
&lt;br /&gt;
=== Sequence Number ===&lt;br /&gt;
&lt;br /&gt;
The sequence number is echoed by the controller. The controller expects sequence numbers in ascending order. The sequence number has 7 bits. The special sequence nuber 0x80 resets the expected number in the controller to 0, so that the next frame has to be sent with the number 0x01. This is needed to achieve a resynchronization.&lt;br /&gt;
The controller signals a receive error by setting the MSB in the response sequence number, echoing the received number.&lt;/div&gt;</summary>
		<author><name>Sensille</name></author>	</entry>

	<entry>
		<id>http://3dpfs.sensille.com/index.php?title=Controller_v2&amp;diff=97</id>
		<title>Controller v2</title>
		<link rel="alternate" type="text/html" href="http://3dpfs.sensille.com/index.php?title=Controller_v2&amp;diff=97"/>
				<updated>2018-07-29T14:55:58Z</updated>
		
		<summary type="html">&lt;p&gt;Sensille: /* UART-based Controller */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= UART-based Controller =&lt;br /&gt;
&lt;br /&gt;
Command Format&lt;br /&gt;
&lt;br /&gt;
== Framing ==&lt;br /&gt;
&lt;br /&gt;
The framing is self synchronizing. Each frame ends with an EOF marker. Everywhere else the EOF marker is escaped.&lt;br /&gt;
&lt;br /&gt;
=== Frame Format ===&lt;br /&gt;
&lt;br /&gt;
* 1 byte sequence number&lt;br /&gt;
* n byte frame data&lt;br /&gt;
* 2 byte crc16 (CCITT) of frame data&lt;br /&gt;
* 0x7e as EOF marker&lt;br /&gt;
&lt;br /&gt;
=== Escaping ===&lt;br /&gt;
&lt;br /&gt;
Escaping is done by byte stuffing. Escape character is 0x7d. Bytes to be escaped are 0x7d and 0x7e. The escape character is following by the byte to by escaped XOR 0x20.&lt;/div&gt;</summary>
		<author><name>Sensille</name></author>	</entry>

	<entry>
		<id>http://3dpfs.sensille.com/index.php?title=Controller_v2&amp;diff=96</id>
		<title>Controller v2</title>
		<link rel="alternate" type="text/html" href="http://3dpfs.sensille.com/index.php?title=Controller_v2&amp;diff=96"/>
				<updated>2018-06-10T18:38:40Z</updated>
		
		<summary type="html">&lt;p&gt;Sensille: Created page with &amp;quot;= UART-based Controller =  Command Format  Framing  * 1 byte frame length * n byte frame data * 2 byte crc16 (CCITT) of frame data&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= UART-based Controller =&lt;br /&gt;
&lt;br /&gt;
Command Format&lt;br /&gt;
&lt;br /&gt;
Framing&lt;br /&gt;
&lt;br /&gt;
* 1 byte frame length&lt;br /&gt;
* n byte frame data&lt;br /&gt;
* 2 byte crc16 (CCITT) of frame data&lt;/div&gt;</summary>
		<author><name>Sensille</name></author>	</entry>

	<entry>
		<id>http://3dpfs.sensille.com/index.php?title=Main_Page&amp;diff=95</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="http://3dpfs.sensille.com/index.php?title=Main_Page&amp;diff=95"/>
				<updated>2018-06-10T18:36:14Z</updated>
		
		<summary type="html">&lt;p&gt;Sensille: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Stepper]]&lt;br /&gt;
&lt;br /&gt;
[[Controller]]&lt;br /&gt;
&lt;br /&gt;
[[Controller v2]]&lt;br /&gt;
&lt;br /&gt;
[[Mathematics]]&lt;/div&gt;</summary>
		<author><name>Sensille</name></author>	</entry>

	<entry>
		<id>http://3dpfs.sensille.com/index.php?title=Slicing&amp;diff=94</id>
		<title>Slicing</title>
		<link rel="alternate" type="text/html" href="http://3dpfs.sensille.com/index.php?title=Slicing&amp;diff=94"/>
				<updated>2018-06-03T10:11:23Z</updated>
		
		<summary type="html">&lt;p&gt;Sensille: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Transformation Chain =&lt;br /&gt;
&lt;br /&gt;
== Input ==&lt;br /&gt;
* STL&lt;br /&gt;
* STEP&lt;br /&gt;
&lt;br /&gt;
== Slicing output ==&lt;br /&gt;
* lines&lt;br /&gt;
* arcs&lt;br /&gt;
* b-splines&lt;br /&gt;
&lt;br /&gt;
=== Options ===&lt;br /&gt;
* approximate everything with lines (gcode)&lt;br /&gt;
* approximate everything with bezier splines&lt;br /&gt;
&lt;br /&gt;
== Adding velocity profile ==&lt;br /&gt;
* trapezoidal&lt;br /&gt;
* s-curve&lt;br /&gt;
* higher order&lt;br /&gt;
&lt;br /&gt;
== Transform into target kinematics ==&lt;br /&gt;
* cartesian&lt;br /&gt;
* corexy&lt;br /&gt;
* delta&lt;br /&gt;
* polar&lt;br /&gt;
&lt;br /&gt;
=== Options ===&lt;br /&gt;
* transform mathematically&lt;br /&gt;
* quantize into oversampled steps before transformation and translate only points Oversampling may depend on the target kinematics and must be high enough that after transformation the resolution still exceeds the microstepping resolution&lt;br /&gt;
   &lt;br /&gt;
== Generate per-axis motion data ==&lt;br /&gt;
* either mathematically&lt;br /&gt;
* or step data&lt;br /&gt;
&lt;br /&gt;
== Transfer per-axis motion data ==&lt;br /&gt;
* transfer mathematically&lt;br /&gt;
* transfer ((lossily) compressed) step data&lt;br /&gt;
&lt;br /&gt;
== Generate steps ==&lt;br /&gt;
&lt;br /&gt;
= Potential Solutions =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Most complex solution: Transport mathematically correct data up to the fpga ==&lt;br /&gt;
* transformations for lines, arcs and splines needed into target kinematics&lt;br /&gt;
* projections into single axis and combination with velocity profiles for each transformation needed&lt;br /&gt;
* fpga needs to know all projected profiles&lt;br /&gt;
&lt;br /&gt;
== Intermediate solution: Approximate at or after slicing and transport mathematically ==&lt;br /&gt;
* only one motion (lines or splines) need to be translated into all target kinematics&lt;br /&gt;
* fpga need to know one profile for each kinematics&lt;br /&gt;
&lt;br /&gt;
== Simplest solution: Approximate at or after slicing ==&lt;br /&gt;
* only points need to be translated to target kinematics&lt;br /&gt;
* computationally intensive because each point needs to be translated individually, plus needed oversampling for some kinematics&lt;br /&gt;
* steps need to be compressed for transmission. If the compression is lossy, it degrades the precision slightly&lt;/div&gt;</summary>
		<author><name>Sensille</name></author>	</entry>

	<entry>
		<id>http://3dpfs.sensille.com/index.php?title=Slicing&amp;diff=93</id>
		<title>Slicing</title>
		<link rel="alternate" type="text/html" href="http://3dpfs.sensille.com/index.php?title=Slicing&amp;diff=93"/>
				<updated>2018-06-03T10:00:20Z</updated>
		
		<summary type="html">&lt;p&gt;Sensille: Created page with &amp;quot;Input =====  - STL  - STEP  Slicing output ==============  - lines  - arcs  - b-splines    Options:    - approximate everything with lines (gcode)    - approximate everything...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Input&lt;br /&gt;
=====&lt;br /&gt;
 - STL&lt;br /&gt;
 - STEP&lt;br /&gt;
&lt;br /&gt;
Slicing output&lt;br /&gt;
==============&lt;br /&gt;
 - lines&lt;br /&gt;
 - arcs&lt;br /&gt;
 - b-splines&lt;br /&gt;
&lt;br /&gt;
  Options:&lt;br /&gt;
   - approximate everything with lines (gcode)&lt;br /&gt;
   - approximate everything with bezier splines&lt;br /&gt;
&lt;br /&gt;
Adding velocity profile&lt;br /&gt;
=======================&lt;br /&gt;
 - trapezoidal&lt;br /&gt;
 - s-curve&lt;br /&gt;
 - higher order&lt;br /&gt;
&lt;br /&gt;
Transform into target kinematics&lt;br /&gt;
================================&lt;br /&gt;
 - cartesian&lt;br /&gt;
 - corexy&lt;br /&gt;
 - delta&lt;br /&gt;
 - polar&lt;br /&gt;
&lt;br /&gt;
  Options:&lt;br /&gt;
  - transform mathematically&lt;br /&gt;
  - quantize into oversampled steps before transformation and translate only points&lt;br /&gt;
    Oversampling may depend on the target kinematics and must be high enough that&lt;br /&gt;
    after transformation the resolution still exceeds the microstepping resolution&lt;br /&gt;
   &lt;br /&gt;
Generate per-axis motion data&lt;br /&gt;
=============================&lt;br /&gt;
 - either mathematically&lt;br /&gt;
 - or step data&lt;br /&gt;
&lt;br /&gt;
Transfer per-axis motion data&lt;br /&gt;
=============================&lt;br /&gt;
 - transfer mathematically&lt;br /&gt;
 - transfer ((lossily) compressed) step data&lt;br /&gt;
&lt;br /&gt;
Generate steps&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Most complex solution: Transport mathematically correct data up to the fpga&lt;br /&gt;
 - transformations for lines, arcs and splines needed into target kinematics&lt;br /&gt;
 - projections into single axis and combination with velocity profiles for each&lt;br /&gt;
   transformatino needed&lt;br /&gt;
 - fpga needs to know all projected profiles&lt;br /&gt;
&lt;br /&gt;
Intermediate solution: Approximate at or after slicing and transport mathematically&lt;br /&gt;
 - only one motion (lines or splines) need to be translated into all target kinematics&lt;br /&gt;
 - fpga need to know one profile for each kinematics&lt;br /&gt;
&lt;br /&gt;
Simplest solution: Approximate at or after slicing&lt;br /&gt;
 - only points need to be translated to target kinematics&lt;br /&gt;
 - computationally intensive because each point needs to be translated individually,&lt;br /&gt;
   plus needed oversampling for some kinematics&lt;br /&gt;
 - steps need to be compressed for transmission. If the compression is lossy, it degrades&lt;br /&gt;
   the precision slightly&lt;/div&gt;</summary>
		<author><name>Sensille</name></author>	</entry>

	<entry>
		<id>http://3dpfs.sensille.com/index.php?title=Main_Page&amp;diff=92</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="http://3dpfs.sensille.com/index.php?title=Main_Page&amp;diff=92"/>
				<updated>2018-06-03T09:49:46Z</updated>
		
		<summary type="html">&lt;p&gt;Sensille: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Stepper]]&lt;br /&gt;
&lt;br /&gt;
[[Controller]]&lt;br /&gt;
&lt;br /&gt;
[[Mathematics]]&lt;/div&gt;</summary>
		<author><name>Sensille</name></author>	</entry>

	<entry>
		<id>http://3dpfs.sensille.com/index.php?title=Stepper&amp;diff=91</id>
		<title>Stepper</title>
		<link rel="alternate" type="text/html" href="http://3dpfs.sensille.com/index.php?title=Stepper&amp;diff=91"/>
				<updated>2018-05-13T13:27:04Z</updated>
		
		<summary type="html">&lt;p&gt;Sensille: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== General Setup ==&lt;br /&gt;
&lt;br /&gt;
Used Stepper: 17HM19-2004S&lt;br /&gt;
&lt;br /&gt;
Driver Voltage: 37V&lt;br /&gt;
&lt;br /&gt;
Driver: TMC2130&lt;br /&gt;
&lt;br /&gt;
Max RPM reached with the motor, unloaded: 3600RPM&lt;br /&gt;
This is the limit of the driver. It runs from the internal oscillator at 12.1MHz. Measure by giving a 9.765kHz pulse and read out register TSTEP as 0x277 (DEDGE=true).&lt;br /&gt;
&lt;br /&gt;
== Take One, Lifting Weights ==&lt;br /&gt;
&lt;br /&gt;
Driver Configuration is basically the recommended default from the datasheet for a coil current of about 2A:&lt;br /&gt;
 reg 0x6c -&amp;gt; 0x200100c3&lt;br /&gt;
 reg 0x10 -&amp;gt; 0x00061c02&lt;br /&gt;
 reg 0x91 -&amp;gt; 0x0000000a&lt;br /&gt;
 reg 0x80 -&amp;gt; 0x00003144&lt;br /&gt;
 reg 0x93 -&amp;gt; 0x000001f4&lt;br /&gt;
 reg 0xf0 -&amp;gt; 0x000401c8&lt;br /&gt;
&lt;br /&gt;
For very slow step rates stealthChop was disabled&lt;br /&gt;
&lt;br /&gt;
Load Testing at 1/256 microstepping. Testing done lifting a weight by winding a rope on a cylinder with effective radius of 16.5mm.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Weightlifting.jpeg|Weight Lifting Setup&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 9.5kHz 2250g&lt;br /&gt;
 19.5kHz 2150g &lt;br /&gt;
 39kHz 2240g&lt;br /&gt;
 58.5kHz 2220g&lt;br /&gt;
 78kHz 2240g&lt;br /&gt;
 97.5kHz 2230g&lt;br /&gt;
 117kHz 2230g&lt;br /&gt;
 137kHz 2130g&lt;br /&gt;
 156kHz 2150g&lt;br /&gt;
 195kHz 2030g &lt;br /&gt;
 234kHz 2050g&lt;br /&gt;
 312kHz 2030g&lt;br /&gt;
 468kHz 1700g&lt;br /&gt;
 624kHz 1300g&lt;br /&gt;
 936kHz 740g&lt;br /&gt;
 1092kHz 556g&lt;br /&gt;
 1400kHz 250g&lt;br /&gt;
 1700kHz 150g&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=Torque in Ncm|&lt;br /&gt;
legend=Legend|&lt;br /&gt;
type=line|&lt;br /&gt;
x=11.13,22.85,45.70,68.55,91.41,114.26,137.11,160.55,182.81,228.52,274.22,365.62,548.44,731.25,1096.88,1279.69,1640.62,1992.19|&lt;br /&gt;
y1=37.12,35.48,36.96,36.63,36.96,36.80,36.80,35.14,35.48,33.49,33.82,33.49,28.05,21.45,12.21,9.17,4.12,2.47|&lt;br /&gt;
y1Title=Measured|&lt;br /&gt;
y2=,,,,24,26,32,34,34,34.5,36,35.5,34,16|&lt;br /&gt;
y2Title=From Datasheet (rough estimate)|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid|&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Source for torque curve from datasheet: https://www.omc-stepperonline.com/download/17HM19-2004S_Torque_Curve.pdf&lt;br /&gt;
&lt;br /&gt;
Full data sheet of the motor: https://www.omc-stepperonline.com/download/17HM19-2004S.pdf&lt;br /&gt;
&lt;br /&gt;
== Take Two, Weight Spinning ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Gallery&amp;gt;&lt;br /&gt;
Weightspinning.jpeg|Setup for torque measurement by a spinning weight&lt;br /&gt;
&amp;lt;/Gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The idea here is to measure the torque at a given RPM by testing how fast the stepper can accelerate to a higher RPM. This way the measurement is not limit to the length of a linear motion as in the previous chapter.&lt;br /&gt;
&lt;br /&gt;
=== Lost step detection ===&lt;br /&gt;
&lt;br /&gt;
With each round the rotor goes through a photo interruptor. The controller has an internal counter to keep track of the current angle with respect to an arbitrary reference. The home command puts the controller into a mode where it resets the counter if the rotor goes through the interruptor. After that, with each round it checks if the interruptor signal asserts during a given window around the reference. The window can be programmed and is currently set to +/- 4 full steps.&lt;br /&gt;
&lt;br /&gt;
=== Measurement ===&lt;br /&gt;
&lt;br /&gt;
We spin the motor to the RPM under test and try to accelerate it to the next higher RPM level. We use the interruptor signal to detect lost steps.&lt;br /&gt;
The acceleration directly corresponds to the torque the motor can generate at the given RPM.&lt;br /&gt;
&lt;br /&gt;
We now have a detailed torque curve RPM vs. Ncm.&lt;br /&gt;
&lt;br /&gt;
Do the same for deceleration&lt;br /&gt;
&lt;br /&gt;
Repeat everything with the other set of weights.&lt;br /&gt;
&lt;br /&gt;
The following series are all done with two 50g weights. The full setup corresponds roughly to a moving mass of 11kg when using a 16T pulley.&lt;br /&gt;
&lt;br /&gt;
=== 1st Series ===&lt;br /&gt;
&lt;br /&gt;
The following graph shows the max acceleration in RPM/s in steps of 200 RPM.&lt;br /&gt;
&lt;br /&gt;
Driver config (just pasted here for reference):&lt;br /&gt;
&lt;br /&gt;
        reg 0x04 -&amp;gt; 0x00000000&lt;br /&gt;
        reg 0xec -&amp;gt; 0x200100c3&lt;br /&gt;
        reg 0x90 -&amp;gt; 0x00061802&lt;br /&gt;
        reg 0x91 -&amp;gt; 0x0000000a&lt;br /&gt;
        reg 0x80 -&amp;gt; 0x00003144&lt;br /&gt;
        reg 0x93 -&amp;gt; 0x000001f4&lt;br /&gt;
        reg 0xf0 -&amp;gt; 0x000401c8&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=RPM/s|&lt;br /&gt;
type=line|&lt;br /&gt;
x=0.00,200.00,400.00,600.00,800.00,1000.00,1200.00,1400.00,1600.00,1800.00,2000.00,2200.00,2400.00,2600.00,2800.00,3000.00,3200.00|&lt;br /&gt;
y=7101.94,7611.49,6377.73,5601.97,3675.27,2408.02,1860.57,1763.62,1583.96,1071.46,935.91,891.38,776.37,751.01,664.83,612.14,581.51|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid|&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== StealthChop ===&lt;br /&gt;
&lt;br /&gt;
4 Series with StealthChop&lt;br /&gt;
&lt;br /&gt;
        tmcw(TMCR_CHOPCONF,&lt;br /&gt;
                TMC_CHOPCONF_DEDGE |&lt;br /&gt;
                (2 &amp;lt;&amp;lt; TMC_CHOPCONF_TBL_SHIFT) |&lt;br /&gt;
                (7 &amp;lt;&amp;lt; TMC_CHOPCONF_HEND_SHIFT) |&lt;br /&gt;
                (2 &amp;lt;&amp;lt; TMC_CHOPCONF_HSTRT_SHIFT) |&lt;br /&gt;
                (5 &amp;lt;&amp;lt; TMC_CHOPCONF_TOFF_SHIFT));&lt;br /&gt;
        tmcw(TMCR_IHOLD_IRUN,&lt;br /&gt;
                ( 6 &amp;lt;&amp;lt; TMC_IHOLD_IRUN_IHOLDDELAY_SHIFT) |&lt;br /&gt;
                (24 &amp;lt;&amp;lt; TMC_IHOLD_IRUN_IRUN_SHIFT) |&lt;br /&gt;
                ( 3 &amp;lt;&amp;lt; TMC_IHOLD_IRUN_IHOLD_SHIFT));&lt;br /&gt;
        tmcw(TMCR_TPOWER_DOWN, 0x0a);&lt;br /&gt;
        tmcw(TMCR_GCONF,&lt;br /&gt;
                TMC_GCONF_DIAG0_INT_PUSHPULL |&lt;br /&gt;
                TMC_GCONF_DIAG1_PUSHPULL |&lt;br /&gt;
                TMC_GCONF_DIAG1_STALL |&lt;br /&gt;
                TMC_GCONF_DIAG0_OTPW |&lt;br /&gt;
                TMC_GCONF_EN_PWM_MODE&lt;br /&gt;
        );&lt;br /&gt;
        tmcw(TMCR_TPWMTHRS, 0);&lt;br /&gt;
        tmcw(TMCR_PWMCONF,&lt;br /&gt;
                TMC_PWMCONF_PWM_AUTOSCALE |&lt;br /&gt;
                (  1 &amp;lt;&amp;lt; TMC_PWMCONF_PWM_GRAD_SHIFT) |&lt;br /&gt;
                (200 &amp;lt;&amp;lt; TMC_PWMCONF_PWM_AMPL_SHIFT));&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=RPM/s|&lt;br /&gt;
type=line|&lt;br /&gt;
x=0,200.00, 400.00, 600.00, 800.00, 1000.00, 1200.00, 1400.00,1600,1800,2000,2200,2400,2600,2800,3000|&lt;br /&gt;
y1=4652.11,8270.53,6688.88,4508.25,2932.28,2138.08,1581.30,1271.33,1328.75,1022.06|&lt;br /&gt;
y2=4771.72, 7918.49, 6734.86, 5036.72, 3401.45, 2294.83, 1554.91, 1694.32, 1295.62, 1284.12, 723.39, 704.20, 564.93, 578.95, 699.80, 502.95|&lt;br /&gt;
y3=4701.81, 7671.34, 6738.24, 5021.65, 3757.66, 2462.01, 1405.32, 1644.94, 1242.94, 1150.06, 902.61|&lt;br /&gt;
y4=4378.76, 7908.38, 6726.26, 5059.55, 3786.02, 2977.99, 1582.61, 1773.34, 1360.92, 1319.06, 700.13, 593.96, 497.86, 611.02, 609.19, 492.01|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid|&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== SpreadCycle vs. StealthChop at 37V ===&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=RPM/s|&lt;br /&gt;
type=line|&lt;br /&gt;
x=0,200.00, 400.00, 600.00, 800.00, 1000.00, 1200.00, 1400.00,1600,1800,2000,2200,2400,2600,2800,3000,3200|&lt;br /&gt;
y1=7101.94,7611.49,6377.73,5601.97,3675.27,2408.02,1860.57,1763.62,1583.96,1071.46,935.91,891.38,776.37,751.01,664.83,612.14,581.51|&lt;br /&gt;
y2=4771.72, 7918.49, 6734.86, 5036.72, 3401.45, 2294.83, 1554.91, 1694.32, 1295.62, 1284.12, 723.39, 704.20, 564.93, 578.95, 699.80, 502.95|&lt;br /&gt;
y1Title=SpreadCycle|y2Title=StealthChop|legend=Legend|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid|&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== SpreadCycle vs. StealthChop at 24V ===&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=RPM/s|&lt;br /&gt;
type=line|&lt;br /&gt;
x=0,200.00, 400.00, 600.00, 800.00, 1000.00, 1200.00, 1400.00,1600,1800,2000,2200,2400,2600,2800,3000,3200|&lt;br /&gt;
y1=7542.89,7479.90,6916.74,5115.56,3970.36,2537.81,1991.76,1270.71,974.54,1100.13,654.58,493.23,526.57,475.44|&lt;br /&gt;
y2=5023.15,6511.14,4549.33,2146.70,1382.23,1040.71,890.69,754.43,372.66,406.07|&lt;br /&gt;
y1Title=SpreadCycle|y2Title=StealthChop|legend=Legend|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid|&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== SpreadCycle vs. StealthChop at 45V ===&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=RPM/s|&lt;br /&gt;
type=line|&lt;br /&gt;
x=0,200.00, 400.00, 600.00, 800.00, 1000.00, 1200.00, 1400.00,1600,1800,2000,2200,2400,2600,2800,3000,3200|&lt;br /&gt;
y1=6833.09,6936.92,6967.79,5795.93,5090.94,4218.19,4093.83,2910.22,3110.80,2005.70,1814.99,1182.57,1083.50|&lt;br /&gt;
y2=4627.26,6868.87,6580.90,5164.92,3780.01,2877.61,2168.31,1452.74,1413.20,1641.69,865.66|&lt;br /&gt;
y1Title=SpreadCycle|y2Title=StealthChop|legend=Legend|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid|&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== SpreadCycle at different Voltages ===&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=RPM/s|&lt;br /&gt;
type=line|&lt;br /&gt;
x=0,200.00, 400.00, 600.00, 800.00, 1000.00, 1200.00, 1400.00,1600,1800,2000,2200,2400,2600,2800,3000,3200|&lt;br /&gt;
y1=7542.89,7479.90,6916.74,5115.56,3970.36,2537.81,1991.76,1270.71,974.54,1100.13,654.58,493.23,526.57,475.44|&lt;br /&gt;
y2=7101.94,7611.49,6377.73,5601.97,3675.27,2408.02,1860.57,1763.62,1583.96,1071.46,935.91,891.38,776.37,751.01,664.83,612.14,581.51|&lt;br /&gt;
y3=6833.09,6936.92,6967.79,5795.93,5090.94,4218.19,4093.83,2910.22,3110.80,2005.70,1814.99,1182.57,1083.50|&lt;br /&gt;
y1Title=24V|y2Title=37V|y3Title=45V|legend=Legend|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid,blue|&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== StealthChop at different Voltages ===&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=RPM/s|&lt;br /&gt;
type=line|&lt;br /&gt;
x=0,200.00, 400.00, 600.00, 800.00, 1000.00, 1200.00, 1400.00,1600,1800,2000,2200,2400,2600,2800,3000,3200|&lt;br /&gt;
y1=5023.15,6511.14,4549.33,2146.70,1382.23,1040.71,890.69,754.43,372.66,406.07|&lt;br /&gt;
y2=4771.72, 7918.49, 6734.86, 5036.72, 3401.45, 2294.83, 1554.91, 1694.32, 1295.62, 1284.12, 723.39, 704.20, 564.93, 578.95, 699.80, 502.95|&lt;br /&gt;
y3=4627.26,6868.87,6580.90,5164.92,3780.01,2877.61,2168.31,1452.74,1413.20,1641.69,865.66|&lt;br /&gt;
y1Title=24V|y2Title=37V|y3Title=45V|legend=Legend|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid,blue|&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Series without weights, corresponds to ~1.4kg ==&lt;br /&gt;
&lt;br /&gt;
=== StealthChop at 40V ===&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=RPM/s|&lt;br /&gt;
type=line|&lt;br /&gt;
x=0,200.00, 400.00, 600.00, 800.00, 1000.00, 1200.00, 1400.00,1600,1800,2000,2200,2400,2600,2800,3000,3200,3400,3600|&lt;br /&gt;
y1=20918.88,31064.29,49822.66,30495.68,19954.14,16975.80,15092.86,12889.57,7374.21,6677.21,6548.32,6316.87,5661.69,5542.80,3859.08,3112.40|&lt;br /&gt;
y2=30349.05,52366.55,59085.26,38463.68,23076.22,16421.99,16383.62,12566.21,12533.29,7263.07,6329.07,5970.43,6619.73,4893.02,3537.95,3102.99,4084.08,2583.17| &lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid,blue|&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Series with light carriage, corresponds to ~1.0kg ==&lt;br /&gt;
&lt;br /&gt;
=== StealthChop vs. SpreadCycle at 40V ===&lt;br /&gt;
&lt;br /&gt;
The maximum acceleration is limited by the test at around 115kRPM/s.&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=RPM/s|&lt;br /&gt;
type=line|&lt;br /&gt;
x=0,200,400,600,800,1000,1200,1400,1600,1800,2000,2200,2400,2600,2800,3000,3200,3400,3600|&lt;br /&gt;
y1=23137.12,45351.95,73983.21,42162.44,29957.53,21268.41,19982.27,13800.77,9733.59,7626.85,8532.23,6685.51,7317.66,8956.42|&lt;br /&gt;
y2=23137.12,59027.42,82641.29,49993.23,30113.92,26132.31,21437.48,17065.80,12562.94,10972.92,10575.51,7747.58,7276.92|&lt;br /&gt;
y3=88892.94,115697.80,115697.80,71927.42,42162.44,40650.53,27954.04,26407.05,21147.65,20060.77,15362.09,10972.92,10566.26,10187.33|&lt;br /&gt;
y4=88892.94,115697.80,115697.80,115567.90,53737.80,41659.46,29454.54,25967.47,21488.81,20673.65,15362.09,13912.91,12951.11,9789.92|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
legend=Legend|&lt;br /&gt;
y1Title=StealthChop run 1|&lt;br /&gt;
y2Title=StealthChop run 2|&lt;br /&gt;
y3Title=SpreadCycle run 1|&lt;br /&gt;
y4Title=SpreadCycle run 2|&lt;br /&gt;
colors=seagreen,seagreen,orchid,orchid|&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== StealthChop vs. SpreadCycle at 24V ===&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=RPM/s|&lt;br /&gt;
type=line|&lt;br /&gt;
x=0,200,400,600,800,1000,1200,1400,1600,1800,2000,2200,2400,2600,2800,3000,3200,3400,3600|&lt;br /&gt;
y1=32391.97, 115697.80, 42156.53, 29577.12, 19773.95, 14572.80, 13153.82, 7835.60, 6139.66, 5751.55, 4382.65, 4462.05, 3427.55,2647.98|&lt;br /&gt;
y2=32391.97, 112596.44, 41973.08, 29238.98, 19834.33, 14628.87, 13848.22, 7835.60, 6139.66, 4378.46, 3977.58, 4204.04, 3292.27,3025.32|&lt;br /&gt;
y3=88892.94, 115697.80, 71602.67, 35348.48, 21509.94, 19674.32, 15362.09, 14395.97, 9789.92, 7670.99, 6010.68, 6052.91,4742.82,3714.20|&lt;br /&gt;
y4=88892.94, 115697.80, 73736.75, 34591.05, 24944.59, 19568.65, 15362.09, 14395.97, 10778.83, 10193.49, 6776.97, 5310.16,5406.36,5434.36|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
legend=Legend|&lt;br /&gt;
y1Title=StealthChop run 1|&lt;br /&gt;
y2Title=StealthChop run 2|&lt;br /&gt;
y3Title=SpreadCycle run 1|&lt;br /&gt;
y4Title=SpreadCycle run 2|&lt;br /&gt;
colors=seagreen,seagreen,orchid,orchid|&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Sensille</name></author>	</entry>

	<entry>
		<id>http://3dpfs.sensille.com/index.php?title=Stepper&amp;diff=90</id>
		<title>Stepper</title>
		<link rel="alternate" type="text/html" href="http://3dpfs.sensille.com/index.php?title=Stepper&amp;diff=90"/>
				<updated>2018-05-13T10:48:00Z</updated>
		
		<summary type="html">&lt;p&gt;Sensille: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== General Setup ==&lt;br /&gt;
&lt;br /&gt;
Used Stepper: 17HM19-2004S&lt;br /&gt;
&lt;br /&gt;
Driver Voltage: 37V&lt;br /&gt;
&lt;br /&gt;
Driver: TMC2130&lt;br /&gt;
&lt;br /&gt;
Max RPM reached with the motor, unloaded: 3600RPM&lt;br /&gt;
This is the limit of the driver. It runs from the internal oscillator at 12.1MHz. Measure by giving a 9.765kHz pulse and read out register TSTEP as 0x277 (DEDGE=true).&lt;br /&gt;
&lt;br /&gt;
== Take One, Lifting Weights ==&lt;br /&gt;
&lt;br /&gt;
Driver Configuration is basically the recommended default from the datasheet for a coil current of about 2A:&lt;br /&gt;
 reg 0x6c -&amp;gt; 0x200100c3&lt;br /&gt;
 reg 0x10 -&amp;gt; 0x00061c02&lt;br /&gt;
 reg 0x91 -&amp;gt; 0x0000000a&lt;br /&gt;
 reg 0x80 -&amp;gt; 0x00003144&lt;br /&gt;
 reg 0x93 -&amp;gt; 0x000001f4&lt;br /&gt;
 reg 0xf0 -&amp;gt; 0x000401c8&lt;br /&gt;
&lt;br /&gt;
For very slow step rates stealthChop was disabled&lt;br /&gt;
&lt;br /&gt;
Load Testing at 1/256 microstepping. Testing done lifting a weight by winding a rope on a cylinder with effective radius of 16.5mm.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Weightlifting.jpeg|Weight Lifting Setup&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 9.5kHz 2250g&lt;br /&gt;
 19.5kHz 2150g &lt;br /&gt;
 39kHz 2240g&lt;br /&gt;
 58.5kHz 2220g&lt;br /&gt;
 78kHz 2240g&lt;br /&gt;
 97.5kHz 2230g&lt;br /&gt;
 117kHz 2230g&lt;br /&gt;
 137kHz 2130g&lt;br /&gt;
 156kHz 2150g&lt;br /&gt;
 195kHz 2030g &lt;br /&gt;
 234kHz 2050g&lt;br /&gt;
 312kHz 2030g&lt;br /&gt;
 468kHz 1700g&lt;br /&gt;
 624kHz 1300g&lt;br /&gt;
 936kHz 740g&lt;br /&gt;
 1092kHz 556g&lt;br /&gt;
 1400kHz 250g&lt;br /&gt;
 1700kHz 150g&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=Torque in Ncm|&lt;br /&gt;
legend=Legend|&lt;br /&gt;
type=line|&lt;br /&gt;
x=11.13,22.85,45.70,68.55,91.41,114.26,137.11,160.55,182.81,228.52,274.22,365.62,548.44,731.25,1096.88,1279.69,1640.62,1992.19|&lt;br /&gt;
y1=37.12,35.48,36.96,36.63,36.96,36.80,36.80,35.14,35.48,33.49,33.82,33.49,28.05,21.45,12.21,9.17,4.12,2.47|&lt;br /&gt;
y1Title=Measured|&lt;br /&gt;
y2=,,,,24,26,32,34,34,34.5,36,35.5,34,16|&lt;br /&gt;
y2Title=From Datasheet (rough estimate)|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid|&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Source for torque curve from datasheet: https://www.omc-stepperonline.com/download/17HM19-2004S_Torque_Curve.pdf&lt;br /&gt;
&lt;br /&gt;
Full data sheet of the motor: https://www.omc-stepperonline.com/download/17HM19-2004S.pdf&lt;br /&gt;
&lt;br /&gt;
== Take Two, Weight Spinning ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Gallery&amp;gt;&lt;br /&gt;
Weightspinning.jpeg|Setup for torque measurement by a spinning weight&lt;br /&gt;
&amp;lt;/Gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The idea here is to measure the torque at a given RPM by testing how fast the stepper can accelerate to a higher RPM. This way the measurement is not limit to the length of a linear motion as in the previous chapter.&lt;br /&gt;
&lt;br /&gt;
=== Lost step detection ===&lt;br /&gt;
&lt;br /&gt;
With each round the rotor goes through a photo interruptor. The controller has an internal counter to keep track of the current angle with respect to an arbitrary reference. The home command puts the controller into a mode where it resets the counter if the rotor goes through the interruptor. After that, with each round it checks if the interruptor signal asserts during a given window around the reference. The window can be programmed and is currently set to +/- 4 full steps.&lt;br /&gt;
&lt;br /&gt;
=== Measurement ===&lt;br /&gt;
&lt;br /&gt;
We spin the motor to the RPM under test and try to accelerate it to the next higher RPM level. We use the interruptor signal to detect lost steps.&lt;br /&gt;
The acceleration directly corresponds to the torque the motor can generate at the given RPM.&lt;br /&gt;
&lt;br /&gt;
We now have a detailed torque curve RPM vs. Ncm.&lt;br /&gt;
&lt;br /&gt;
Do the same for deceleration&lt;br /&gt;
&lt;br /&gt;
Repeat everything with the other set of weights.&lt;br /&gt;
&lt;br /&gt;
The following series are all done with two 50g weights. The full setup corresponds roughly to a moving mass of 11kg when using a 16T pulley.&lt;br /&gt;
&lt;br /&gt;
=== 1st Series ===&lt;br /&gt;
&lt;br /&gt;
The following graph shows the max acceleration in RPM/s in steps of 200 RPM.&lt;br /&gt;
&lt;br /&gt;
Driver config (just pasted here for reference):&lt;br /&gt;
&lt;br /&gt;
        reg 0x04 -&amp;gt; 0x00000000&lt;br /&gt;
        reg 0xec -&amp;gt; 0x200100c3&lt;br /&gt;
        reg 0x90 -&amp;gt; 0x00061802&lt;br /&gt;
        reg 0x91 -&amp;gt; 0x0000000a&lt;br /&gt;
        reg 0x80 -&amp;gt; 0x00003144&lt;br /&gt;
        reg 0x93 -&amp;gt; 0x000001f4&lt;br /&gt;
        reg 0xf0 -&amp;gt; 0x000401c8&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=RPM/s|&lt;br /&gt;
type=line|&lt;br /&gt;
x=0.00,200.00,400.00,600.00,800.00,1000.00,1200.00,1400.00,1600.00,1800.00,2000.00,2200.00,2400.00,2600.00,2800.00,3000.00,3200.00|&lt;br /&gt;
y=7101.94,7611.49,6377.73,5601.97,3675.27,2408.02,1860.57,1763.62,1583.96,1071.46,935.91,891.38,776.37,751.01,664.83,612.14,581.51|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid|&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== StealthChop ===&lt;br /&gt;
&lt;br /&gt;
4 Series with StealthChop&lt;br /&gt;
&lt;br /&gt;
        tmcw(TMCR_CHOPCONF,&lt;br /&gt;
                TMC_CHOPCONF_DEDGE |&lt;br /&gt;
                (2 &amp;lt;&amp;lt; TMC_CHOPCONF_TBL_SHIFT) |&lt;br /&gt;
                (7 &amp;lt;&amp;lt; TMC_CHOPCONF_HEND_SHIFT) |&lt;br /&gt;
                (2 &amp;lt;&amp;lt; TMC_CHOPCONF_HSTRT_SHIFT) |&lt;br /&gt;
                (5 &amp;lt;&amp;lt; TMC_CHOPCONF_TOFF_SHIFT));&lt;br /&gt;
        tmcw(TMCR_IHOLD_IRUN,&lt;br /&gt;
                ( 6 &amp;lt;&amp;lt; TMC_IHOLD_IRUN_IHOLDDELAY_SHIFT) |&lt;br /&gt;
                (24 &amp;lt;&amp;lt; TMC_IHOLD_IRUN_IRUN_SHIFT) |&lt;br /&gt;
                ( 3 &amp;lt;&amp;lt; TMC_IHOLD_IRUN_IHOLD_SHIFT));&lt;br /&gt;
        tmcw(TMCR_TPOWER_DOWN, 0x0a);&lt;br /&gt;
        tmcw(TMCR_GCONF,&lt;br /&gt;
                TMC_GCONF_DIAG0_INT_PUSHPULL |&lt;br /&gt;
                TMC_GCONF_DIAG1_PUSHPULL |&lt;br /&gt;
                TMC_GCONF_DIAG1_STALL |&lt;br /&gt;
                TMC_GCONF_DIAG0_OTPW |&lt;br /&gt;
                TMC_GCONF_EN_PWM_MODE&lt;br /&gt;
        );&lt;br /&gt;
        tmcw(TMCR_TPWMTHRS, 0);&lt;br /&gt;
        tmcw(TMCR_PWMCONF,&lt;br /&gt;
                TMC_PWMCONF_PWM_AUTOSCALE |&lt;br /&gt;
                (  1 &amp;lt;&amp;lt; TMC_PWMCONF_PWM_GRAD_SHIFT) |&lt;br /&gt;
                (200 &amp;lt;&amp;lt; TMC_PWMCONF_PWM_AMPL_SHIFT));&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=RPM/s|&lt;br /&gt;
type=line|&lt;br /&gt;
x=0,200.00, 400.00, 600.00, 800.00, 1000.00, 1200.00, 1400.00,1600,1800,2000,2200,2400,2600,2800,3000|&lt;br /&gt;
y1=4652.11,8270.53,6688.88,4508.25,2932.28,2138.08,1581.30,1271.33,1328.75,1022.06|&lt;br /&gt;
y2=4771.72, 7918.49, 6734.86, 5036.72, 3401.45, 2294.83, 1554.91, 1694.32, 1295.62, 1284.12, 723.39, 704.20, 564.93, 578.95, 699.80, 502.95|&lt;br /&gt;
y3=4701.81, 7671.34, 6738.24, 5021.65, 3757.66, 2462.01, 1405.32, 1644.94, 1242.94, 1150.06, 902.61|&lt;br /&gt;
y4=4378.76, 7908.38, 6726.26, 5059.55, 3786.02, 2977.99, 1582.61, 1773.34, 1360.92, 1319.06, 700.13, 593.96, 497.86, 611.02, 609.19, 492.01|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid|&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== SpreadCycle vs. StealthChop at 37V ===&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=RPM/s|&lt;br /&gt;
type=line|&lt;br /&gt;
x=0,200.00, 400.00, 600.00, 800.00, 1000.00, 1200.00, 1400.00,1600,1800,2000,2200,2400,2600,2800,3000,3200|&lt;br /&gt;
y1=7101.94,7611.49,6377.73,5601.97,3675.27,2408.02,1860.57,1763.62,1583.96,1071.46,935.91,891.38,776.37,751.01,664.83,612.14,581.51|&lt;br /&gt;
y2=4771.72, 7918.49, 6734.86, 5036.72, 3401.45, 2294.83, 1554.91, 1694.32, 1295.62, 1284.12, 723.39, 704.20, 564.93, 578.95, 699.80, 502.95|&lt;br /&gt;
y1Title=SpreadCycle|y2Title=StealthChop|legend=Legend|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid|&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== SpreadCycle vs. StealthChop at 24V ===&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=RPM/s|&lt;br /&gt;
type=line|&lt;br /&gt;
x=0,200.00, 400.00, 600.00, 800.00, 1000.00, 1200.00, 1400.00,1600,1800,2000,2200,2400,2600,2800,3000,3200|&lt;br /&gt;
y1=7542.89,7479.90,6916.74,5115.56,3970.36,2537.81,1991.76,1270.71,974.54,1100.13,654.58,493.23,526.57,475.44|&lt;br /&gt;
y2=5023.15,6511.14,4549.33,2146.70,1382.23,1040.71,890.69,754.43,372.66,406.07|&lt;br /&gt;
y1Title=SpreadCycle|y2Title=StealthChop|legend=Legend|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid|&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== SpreadCycle vs. StealthChop at 45V ===&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=RPM/s|&lt;br /&gt;
type=line|&lt;br /&gt;
x=0,200.00, 400.00, 600.00, 800.00, 1000.00, 1200.00, 1400.00,1600,1800,2000,2200,2400,2600,2800,3000,3200|&lt;br /&gt;
y1=6833.09,6936.92,6967.79,5795.93,5090.94,4218.19,4093.83,2910.22,3110.80,2005.70,1814.99,1182.57,1083.50|&lt;br /&gt;
y2=4627.26,6868.87,6580.90,5164.92,3780.01,2877.61,2168.31,1452.74,1413.20,1641.69,865.66|&lt;br /&gt;
y1Title=SpreadCycle|y2Title=StealthChop|legend=Legend|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid|&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== SpreadCycle at different Voltages ===&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=RPM/s|&lt;br /&gt;
type=line|&lt;br /&gt;
x=0,200.00, 400.00, 600.00, 800.00, 1000.00, 1200.00, 1400.00,1600,1800,2000,2200,2400,2600,2800,3000,3200|&lt;br /&gt;
y1=7542.89,7479.90,6916.74,5115.56,3970.36,2537.81,1991.76,1270.71,974.54,1100.13,654.58,493.23,526.57,475.44|&lt;br /&gt;
y2=7101.94,7611.49,6377.73,5601.97,3675.27,2408.02,1860.57,1763.62,1583.96,1071.46,935.91,891.38,776.37,751.01,664.83,612.14,581.51|&lt;br /&gt;
y3=6833.09,6936.92,6967.79,5795.93,5090.94,4218.19,4093.83,2910.22,3110.80,2005.70,1814.99,1182.57,1083.50|&lt;br /&gt;
y1Title=24V|y2Title=37V|y3Title=45V|legend=Legend|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid,blue|&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== StealthChop at different Voltages ===&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=RPM/s|&lt;br /&gt;
type=line|&lt;br /&gt;
x=0,200.00, 400.00, 600.00, 800.00, 1000.00, 1200.00, 1400.00,1600,1800,2000,2200,2400,2600,2800,3000,3200|&lt;br /&gt;
y1=5023.15,6511.14,4549.33,2146.70,1382.23,1040.71,890.69,754.43,372.66,406.07|&lt;br /&gt;
y2=4771.72, 7918.49, 6734.86, 5036.72, 3401.45, 2294.83, 1554.91, 1694.32, 1295.62, 1284.12, 723.39, 704.20, 564.93, 578.95, 699.80, 502.95|&lt;br /&gt;
y3=4627.26,6868.87,6580.90,5164.92,3780.01,2877.61,2168.31,1452.74,1413.20,1641.69,865.66|&lt;br /&gt;
y1Title=24V|y2Title=37V|y3Title=45V|legend=Legend|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid,blue|&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Series without weights, corresponds to ~1.4kg ==&lt;br /&gt;
&lt;br /&gt;
=== StealthChop at 40V ===&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=RPM/s|&lt;br /&gt;
type=line|&lt;br /&gt;
x=0,200.00, 400.00, 600.00, 800.00, 1000.00, 1200.00, 1400.00,1600,1800,2000,2200,2400,2600,2800,3000,3200,3400,3600|&lt;br /&gt;
y1=20918.88,31064.29,49822.66,30495.68,19954.14,16975.80,15092.86,12889.57,7374.21,6677.21,6548.32,6316.87,5661.69,5542.80,3859.08,3112.40|&lt;br /&gt;
y2=30349.05,52366.55,59085.26,38463.68,23076.22,16421.99,16383.62,12566.21,12533.29,7263.07,6329.07,5970.43,6619.73,4893.02,3537.95,3102.99,4084.08,2583.17| &lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid,blue|&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Series with light carriage, corresponds to ~1.0kg ==&lt;br /&gt;
&lt;br /&gt;
=== StealthChop vs. SpreadCycle at 40V ===&lt;br /&gt;
&lt;br /&gt;
The maximum acceleration is limited by the test at around 115kRPM/s.&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=RPM/s|&lt;br /&gt;
type=line|&lt;br /&gt;
x=0,200,400,600,800,1000,1200,1400,1600,1800,2000,2200,2400,2600,2800,3000,3200,3400,3600|&lt;br /&gt;
y1=23137.12,45351.95,73983.21,42162.44,29957.53,21268.41,19982.27,13800.77,9733.59,7626.85,8532.23,6685.51,7317.66,8956.42|&lt;br /&gt;
y2=23137.12,59027.42,82641.29,49993.23,30113.92,26132.31,21437.48,17065.80,12562.94,10972.92,10575.51,7747.58,7276.92|&lt;br /&gt;
y3=88892.94,115697.80,115697.80,71927.42,42162.44,40650.53,27954.04,26407.05,21147.65,20060.77,15362.09,10972.92,10566.26,10187.33|&lt;br /&gt;
y4=88892.94,115697.80,115697.80,115567.90,53737.80,41659.46,29454.54,25967.47,21488.81,20673.65,15362.09,13912.91,12951.11,9789.92|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
legend=Legend|&lt;br /&gt;
y1Title=StealthChop run 1|&lt;br /&gt;
y2Title=StealthChop run 2|&lt;br /&gt;
y3Title=SpreadCycle run 1|&lt;br /&gt;
y4Title=SpreadCycle run 2|&lt;br /&gt;
colors=seagreen,seagreen,orchid,orchid|&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Sensille</name></author>	</entry>

	<entry>
		<id>http://3dpfs.sensille.com/index.php?title=Stepper&amp;diff=89</id>
		<title>Stepper</title>
		<link rel="alternate" type="text/html" href="http://3dpfs.sensille.com/index.php?title=Stepper&amp;diff=89"/>
				<updated>2018-05-06T18:45:19Z</updated>
		
		<summary type="html">&lt;p&gt;Sensille: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== General Setup ==&lt;br /&gt;
&lt;br /&gt;
Used Stepper: 17HM19-2004S&lt;br /&gt;
&lt;br /&gt;
Driver Voltage: 37V&lt;br /&gt;
&lt;br /&gt;
Driver: TMC2130&lt;br /&gt;
&lt;br /&gt;
Max RPM reached with the motor, unloaded: 3600RPM&lt;br /&gt;
This is the limit of the driver. It runs from the internal oscillator at 12.1MHz. Measure by giving a 9.765kHz pulse and read out register TSTEP as 0x277 (DEDGE=true).&lt;br /&gt;
&lt;br /&gt;
== Take One, Lifting Weights ==&lt;br /&gt;
&lt;br /&gt;
Driver Configuration is basically the recommended default from the datasheet for a coil current of about 2A:&lt;br /&gt;
 reg 0x6c -&amp;gt; 0x200100c3&lt;br /&gt;
 reg 0x10 -&amp;gt; 0x00061c02&lt;br /&gt;
 reg 0x91 -&amp;gt; 0x0000000a&lt;br /&gt;
 reg 0x80 -&amp;gt; 0x00003144&lt;br /&gt;
 reg 0x93 -&amp;gt; 0x000001f4&lt;br /&gt;
 reg 0xf0 -&amp;gt; 0x000401c8&lt;br /&gt;
&lt;br /&gt;
For very slow step rates stealthChop was disabled&lt;br /&gt;
&lt;br /&gt;
Load Testing at 1/256 microstepping. Testing done lifting a weight by winding a rope on a cylinder with effective radius of 16.5mm.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Weightlifting.jpeg|Weight Lifting Setup&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 9.5kHz 2250g&lt;br /&gt;
 19.5kHz 2150g &lt;br /&gt;
 39kHz 2240g&lt;br /&gt;
 58.5kHz 2220g&lt;br /&gt;
 78kHz 2240g&lt;br /&gt;
 97.5kHz 2230g&lt;br /&gt;
 117kHz 2230g&lt;br /&gt;
 137kHz 2130g&lt;br /&gt;
 156kHz 2150g&lt;br /&gt;
 195kHz 2030g &lt;br /&gt;
 234kHz 2050g&lt;br /&gt;
 312kHz 2030g&lt;br /&gt;
 468kHz 1700g&lt;br /&gt;
 624kHz 1300g&lt;br /&gt;
 936kHz 740g&lt;br /&gt;
 1092kHz 556g&lt;br /&gt;
 1400kHz 250g&lt;br /&gt;
 1700kHz 150g&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=Torque in Ncm|&lt;br /&gt;
legend=Legend|&lt;br /&gt;
type=line|&lt;br /&gt;
x=11.13,22.85,45.70,68.55,91.41,114.26,137.11,160.55,182.81,228.52,274.22,365.62,548.44,731.25,1096.88,1279.69,1640.62,1992.19|&lt;br /&gt;
y1=37.12,35.48,36.96,36.63,36.96,36.80,36.80,35.14,35.48,33.49,33.82,33.49,28.05,21.45,12.21,9.17,4.12,2.47|&lt;br /&gt;
y1Title=Measured|&lt;br /&gt;
y2=,,,,24,26,32,34,34,34.5,36,35.5,34,16|&lt;br /&gt;
y2Title=From Datasheet (rough estimate)|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid|&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Source for torque curve from datasheet: https://www.omc-stepperonline.com/download/17HM19-2004S_Torque_Curve.pdf&lt;br /&gt;
&lt;br /&gt;
Full data sheet of the motor: https://www.omc-stepperonline.com/download/17HM19-2004S.pdf&lt;br /&gt;
&lt;br /&gt;
== Take Two, Weight Spinning ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Gallery&amp;gt;&lt;br /&gt;
Weightspinning.jpeg|Setup for torque measurement by a spinning weight&lt;br /&gt;
&amp;lt;/Gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The idea here is to measure the torque at a given RPM by testing how fast the stepper can accelerate to a higher RPM. This way the measurement is not limit to the length of a linear motion as in the previous chapter.&lt;br /&gt;
&lt;br /&gt;
=== Lost step detection ===&lt;br /&gt;
&lt;br /&gt;
With each round the rotor goes through a photo interruptor. The controller has an internal counter to keep track of the current angle with respect to an arbitrary reference. The home command puts the controller into a mode where it resets the counter if the rotor goes through the interruptor. After that, with each round it checks if the interruptor signal asserts during a given window around the reference. The window can be programmed and is currently set to +/- 4 full steps.&lt;br /&gt;
&lt;br /&gt;
=== Measurement ===&lt;br /&gt;
&lt;br /&gt;
We spin the motor to the RPM under test and try to accelerate it to the next higher RPM level. We use the interruptor signal to detect lost steps.&lt;br /&gt;
The acceleration directly corresponds to the torque the motor can generate at the given RPM.&lt;br /&gt;
&lt;br /&gt;
We now have a detailed torque curve RPM vs. Ncm.&lt;br /&gt;
&lt;br /&gt;
Do the same for deceleration&lt;br /&gt;
&lt;br /&gt;
Repeat everything with the other set of weights.&lt;br /&gt;
&lt;br /&gt;
The following series are all done with two 50g weights. The full setup corresponds roughly to a moving mass of 11kg when using a 16T pulley.&lt;br /&gt;
&lt;br /&gt;
=== 1st Series ===&lt;br /&gt;
&lt;br /&gt;
The following graph shows the max acceleration in RPM/s in steps of 200 RPM.&lt;br /&gt;
&lt;br /&gt;
Driver config (just pasted here for reference):&lt;br /&gt;
&lt;br /&gt;
        reg 0x04 -&amp;gt; 0x00000000&lt;br /&gt;
        reg 0xec -&amp;gt; 0x200100c3&lt;br /&gt;
        reg 0x90 -&amp;gt; 0x00061802&lt;br /&gt;
        reg 0x91 -&amp;gt; 0x0000000a&lt;br /&gt;
        reg 0x80 -&amp;gt; 0x00003144&lt;br /&gt;
        reg 0x93 -&amp;gt; 0x000001f4&lt;br /&gt;
        reg 0xf0 -&amp;gt; 0x000401c8&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=RPM/s|&lt;br /&gt;
type=line|&lt;br /&gt;
x=0.00,200.00,400.00,600.00,800.00,1000.00,1200.00,1400.00,1600.00,1800.00,2000.00,2200.00,2400.00,2600.00,2800.00,3000.00,3200.00|&lt;br /&gt;
y=7101.94,7611.49,6377.73,5601.97,3675.27,2408.02,1860.57,1763.62,1583.96,1071.46,935.91,891.38,776.37,751.01,664.83,612.14,581.51|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid|&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== StealthChop ===&lt;br /&gt;
&lt;br /&gt;
4 Series with StealthChop&lt;br /&gt;
&lt;br /&gt;
        tmcw(TMCR_CHOPCONF,&lt;br /&gt;
                TMC_CHOPCONF_DEDGE |&lt;br /&gt;
                (2 &amp;lt;&amp;lt; TMC_CHOPCONF_TBL_SHIFT) |&lt;br /&gt;
                (7 &amp;lt;&amp;lt; TMC_CHOPCONF_HEND_SHIFT) |&lt;br /&gt;
                (2 &amp;lt;&amp;lt; TMC_CHOPCONF_HSTRT_SHIFT) |&lt;br /&gt;
                (5 &amp;lt;&amp;lt; TMC_CHOPCONF_TOFF_SHIFT));&lt;br /&gt;
        tmcw(TMCR_IHOLD_IRUN,&lt;br /&gt;
                ( 6 &amp;lt;&amp;lt; TMC_IHOLD_IRUN_IHOLDDELAY_SHIFT) |&lt;br /&gt;
                (24 &amp;lt;&amp;lt; TMC_IHOLD_IRUN_IRUN_SHIFT) |&lt;br /&gt;
                ( 3 &amp;lt;&amp;lt; TMC_IHOLD_IRUN_IHOLD_SHIFT));&lt;br /&gt;
        tmcw(TMCR_TPOWER_DOWN, 0x0a);&lt;br /&gt;
        tmcw(TMCR_GCONF,&lt;br /&gt;
                TMC_GCONF_DIAG0_INT_PUSHPULL |&lt;br /&gt;
                TMC_GCONF_DIAG1_PUSHPULL |&lt;br /&gt;
                TMC_GCONF_DIAG1_STALL |&lt;br /&gt;
                TMC_GCONF_DIAG0_OTPW |&lt;br /&gt;
                TMC_GCONF_EN_PWM_MODE&lt;br /&gt;
        );&lt;br /&gt;
        tmcw(TMCR_TPWMTHRS, 0);&lt;br /&gt;
        tmcw(TMCR_PWMCONF,&lt;br /&gt;
                TMC_PWMCONF_PWM_AUTOSCALE |&lt;br /&gt;
                (  1 &amp;lt;&amp;lt; TMC_PWMCONF_PWM_GRAD_SHIFT) |&lt;br /&gt;
                (200 &amp;lt;&amp;lt; TMC_PWMCONF_PWM_AMPL_SHIFT));&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=RPM/s|&lt;br /&gt;
type=line|&lt;br /&gt;
x=0,200.00, 400.00, 600.00, 800.00, 1000.00, 1200.00, 1400.00,1600,1800,2000,2200,2400,2600,2800,3000|&lt;br /&gt;
y1=4652.11,8270.53,6688.88,4508.25,2932.28,2138.08,1581.30,1271.33,1328.75,1022.06|&lt;br /&gt;
y2=4771.72, 7918.49, 6734.86, 5036.72, 3401.45, 2294.83, 1554.91, 1694.32, 1295.62, 1284.12, 723.39, 704.20, 564.93, 578.95, 699.80, 502.95|&lt;br /&gt;
y3=4701.81, 7671.34, 6738.24, 5021.65, 3757.66, 2462.01, 1405.32, 1644.94, 1242.94, 1150.06, 902.61|&lt;br /&gt;
y4=4378.76, 7908.38, 6726.26, 5059.55, 3786.02, 2977.99, 1582.61, 1773.34, 1360.92, 1319.06, 700.13, 593.96, 497.86, 611.02, 609.19, 492.01|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid|&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== SpreadCycle vs. StealthChop at 37V ===&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=RPM/s|&lt;br /&gt;
type=line|&lt;br /&gt;
x=0,200.00, 400.00, 600.00, 800.00, 1000.00, 1200.00, 1400.00,1600,1800,2000,2200,2400,2600,2800,3000,3200|&lt;br /&gt;
y1=7101.94,7611.49,6377.73,5601.97,3675.27,2408.02,1860.57,1763.62,1583.96,1071.46,935.91,891.38,776.37,751.01,664.83,612.14,581.51|&lt;br /&gt;
y2=4771.72, 7918.49, 6734.86, 5036.72, 3401.45, 2294.83, 1554.91, 1694.32, 1295.62, 1284.12, 723.39, 704.20, 564.93, 578.95, 699.80, 502.95|&lt;br /&gt;
y1Title=SpreadCycle|y2Title=StealthChop|legend=Legend|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid|&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== SpreadCycle vs. StealthChop at 24V ===&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=RPM/s|&lt;br /&gt;
type=line|&lt;br /&gt;
x=0,200.00, 400.00, 600.00, 800.00, 1000.00, 1200.00, 1400.00,1600,1800,2000,2200,2400,2600,2800,3000,3200|&lt;br /&gt;
y1=7542.89,7479.90,6916.74,5115.56,3970.36,2537.81,1991.76,1270.71,974.54,1100.13,654.58,493.23,526.57,475.44|&lt;br /&gt;
y2=5023.15,6511.14,4549.33,2146.70,1382.23,1040.71,890.69,754.43,372.66,406.07|&lt;br /&gt;
y1Title=SpreadCycle|y2Title=StealthChop|legend=Legend|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid|&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== SpreadCycle vs. StealthChop at 45V ===&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=RPM/s|&lt;br /&gt;
type=line|&lt;br /&gt;
x=0,200.00, 400.00, 600.00, 800.00, 1000.00, 1200.00, 1400.00,1600,1800,2000,2200,2400,2600,2800,3000,3200|&lt;br /&gt;
y1=6833.09,6936.92,6967.79,5795.93,5090.94,4218.19,4093.83,2910.22,3110.80,2005.70,1814.99,1182.57,1083.50|&lt;br /&gt;
y2=4627.26,6868.87,6580.90,5164.92,3780.01,2877.61,2168.31,1452.74,1413.20,1641.69,865.66|&lt;br /&gt;
y1Title=SpreadCycle|y2Title=StealthChop|legend=Legend|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid|&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== SpreadCycle at different Voltages ===&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=RPM/s|&lt;br /&gt;
type=line|&lt;br /&gt;
x=0,200.00, 400.00, 600.00, 800.00, 1000.00, 1200.00, 1400.00,1600,1800,2000,2200,2400,2600,2800,3000,3200|&lt;br /&gt;
y1=7542.89,7479.90,6916.74,5115.56,3970.36,2537.81,1991.76,1270.71,974.54,1100.13,654.58,493.23,526.57,475.44|&lt;br /&gt;
y2=7101.94,7611.49,6377.73,5601.97,3675.27,2408.02,1860.57,1763.62,1583.96,1071.46,935.91,891.38,776.37,751.01,664.83,612.14,581.51|&lt;br /&gt;
y3=6833.09,6936.92,6967.79,5795.93,5090.94,4218.19,4093.83,2910.22,3110.80,2005.70,1814.99,1182.57,1083.50|&lt;br /&gt;
y1Title=24V|y2Title=37V|y3Title=45V|legend=Legend|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid,blue|&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== StealthChop at different Voltages ===&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=RPM/s|&lt;br /&gt;
type=line|&lt;br /&gt;
x=0,200.00, 400.00, 600.00, 800.00, 1000.00, 1200.00, 1400.00,1600,1800,2000,2200,2400,2600,2800,3000,3200|&lt;br /&gt;
y1=5023.15,6511.14,4549.33,2146.70,1382.23,1040.71,890.69,754.43,372.66,406.07|&lt;br /&gt;
y2=4771.72, 7918.49, 6734.86, 5036.72, 3401.45, 2294.83, 1554.91, 1694.32, 1295.62, 1284.12, 723.39, 704.20, 564.93, 578.95, 699.80, 502.95|&lt;br /&gt;
y3=4627.26,6868.87,6580.90,5164.92,3780.01,2877.61,2168.31,1452.74,1413.20,1641.69,865.66|&lt;br /&gt;
y1Title=24V|y2Title=37V|y3Title=45V|legend=Legend|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid,blue|&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Series without weights, corresponds to ~1.4kg ==&lt;br /&gt;
&lt;br /&gt;
=== StealthChop at 40V ===&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=RPM/s|&lt;br /&gt;
type=line|&lt;br /&gt;
x=0,200.00, 400.00, 600.00, 800.00, 1000.00, 1200.00, 1400.00,1600,1800,2000,2200,2400,2600,2800,3000,3200,3400,3600|&lt;br /&gt;
y1=20918.88,31064.29,49822.66,30495.68,19954.14,16975.80,15092.86,12889.57,7374.21,6677.21,6548.32,6316.87,5661.69,5542.80,3859.08,3112.40|&lt;br /&gt;
y2=30349.05,52366.55,59085.26,38463.68,23076.22,16421.99,16383.62,12566.21,12533.29,7263.07,6329.07,5970.43,6619.73,4893.02,3537.95,3102.99,4084.08,2583.17| &lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid,blue|&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Series with light carriage, corresponds to ~1.0kg ==&lt;br /&gt;
&lt;br /&gt;
=== StealthChop at 40V ===&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=RPM/s|&lt;br /&gt;
type=line|&lt;br /&gt;
x=0,200.00, 400.00, 600.00, 800.00, 1000.00, 1200.00, 1400.00,1600,1800,2000,2200,2400,2600,2800,3000,3200,3400,3600|&lt;br /&gt;
y1=55316.57,21992.95,18022.20,12759.15,13058.61,11814.60,17029.31,11135.32,9198.56,10195.55,8955.41,9256.09,9221.37,9739.58,9716.82,8534.92,7496.77,6519.68|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid,blue|&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Sensille</name></author>	</entry>

	<entry>
		<id>http://3dpfs.sensille.com/index.php?title=Stepper&amp;diff=88</id>
		<title>Stepper</title>
		<link rel="alternate" type="text/html" href="http://3dpfs.sensille.com/index.php?title=Stepper&amp;diff=88"/>
				<updated>2018-05-06T16:09:40Z</updated>
		
		<summary type="html">&lt;p&gt;Sensille: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== General Setup ==&lt;br /&gt;
&lt;br /&gt;
Used Stepper: 17HM19-2004S&lt;br /&gt;
&lt;br /&gt;
Driver Voltage: 37V&lt;br /&gt;
&lt;br /&gt;
Driver: TMC2130&lt;br /&gt;
&lt;br /&gt;
Max RPM reached with the motor, unloaded: 3600RPM&lt;br /&gt;
This is the limit of the driver. It runs from the internal oscillator at 12.1MHz. Measure by giving a 9.765kHz pulse and read out register TSTEP as 0x277 (DEDGE=true).&lt;br /&gt;
&lt;br /&gt;
== Take One, Lifting Weights ==&lt;br /&gt;
&lt;br /&gt;
Driver Configuration is basically the recommended default from the datasheet for a coil current of about 2A:&lt;br /&gt;
 reg 0x6c -&amp;gt; 0x200100c3&lt;br /&gt;
 reg 0x10 -&amp;gt; 0x00061c02&lt;br /&gt;
 reg 0x91 -&amp;gt; 0x0000000a&lt;br /&gt;
 reg 0x80 -&amp;gt; 0x00003144&lt;br /&gt;
 reg 0x93 -&amp;gt; 0x000001f4&lt;br /&gt;
 reg 0xf0 -&amp;gt; 0x000401c8&lt;br /&gt;
&lt;br /&gt;
For very slow step rates stealthChop was disabled&lt;br /&gt;
&lt;br /&gt;
Load Testing at 1/256 microstepping. Testing done lifting a weight by winding a rope on a cylinder with effective radius of 16.5mm.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Weightlifting.jpeg|Weight Lifting Setup&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 9.5kHz 2250g&lt;br /&gt;
 19.5kHz 2150g &lt;br /&gt;
 39kHz 2240g&lt;br /&gt;
 58.5kHz 2220g&lt;br /&gt;
 78kHz 2240g&lt;br /&gt;
 97.5kHz 2230g&lt;br /&gt;
 117kHz 2230g&lt;br /&gt;
 137kHz 2130g&lt;br /&gt;
 156kHz 2150g&lt;br /&gt;
 195kHz 2030g &lt;br /&gt;
 234kHz 2050g&lt;br /&gt;
 312kHz 2030g&lt;br /&gt;
 468kHz 1700g&lt;br /&gt;
 624kHz 1300g&lt;br /&gt;
 936kHz 740g&lt;br /&gt;
 1092kHz 556g&lt;br /&gt;
 1400kHz 250g&lt;br /&gt;
 1700kHz 150g&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=Torque in Ncm|&lt;br /&gt;
legend=Legend|&lt;br /&gt;
type=line|&lt;br /&gt;
x=11.13,22.85,45.70,68.55,91.41,114.26,137.11,160.55,182.81,228.52,274.22,365.62,548.44,731.25,1096.88,1279.69,1640.62,1992.19|&lt;br /&gt;
y1=37.12,35.48,36.96,36.63,36.96,36.80,36.80,35.14,35.48,33.49,33.82,33.49,28.05,21.45,12.21,9.17,4.12,2.47|&lt;br /&gt;
y1Title=Measured|&lt;br /&gt;
y2=,,,,24,26,32,34,34,34.5,36,35.5,34,16|&lt;br /&gt;
y2Title=From Datasheet (rough estimate)|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid|&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Source for torque curve from datasheet: https://www.omc-stepperonline.com/download/17HM19-2004S_Torque_Curve.pdf&lt;br /&gt;
&lt;br /&gt;
Full data sheet of the motor: https://www.omc-stepperonline.com/download/17HM19-2004S.pdf&lt;br /&gt;
&lt;br /&gt;
== Take Two, Weight Spinning ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Gallery&amp;gt;&lt;br /&gt;
Weightspinning.jpeg|Setup for torque measurement by a spinning weight&lt;br /&gt;
&amp;lt;/Gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The idea here is to measure the torque at a given RPM by testing how fast the stepper can accelerate to a higher RPM. This way the measurement is not limit to the length of a linear motion as in the previous chapter.&lt;br /&gt;
&lt;br /&gt;
=== Lost step detection ===&lt;br /&gt;
&lt;br /&gt;
With each round the rotor goes through a photo interruptor. The controller has an internal counter to keep track of the current angle with respect to an arbitrary reference. The home command puts the controller into a mode where it resets the counter if the rotor goes through the interruptor. After that, with each round it checks if the interruptor signal asserts during a given window around the reference. The window can be programmed and is currently set to +/- 4 full steps.&lt;br /&gt;
&lt;br /&gt;
=== Measurement ===&lt;br /&gt;
&lt;br /&gt;
We spin the motor to the RPM under test and try to accelerate it to the next higher RPM level. We use the interruptor signal to detect lost steps.&lt;br /&gt;
The acceleration directly corresponds to the torque the motor can generate at the given RPM.&lt;br /&gt;
&lt;br /&gt;
We now have a detailed torque curve RPM vs. Ncm.&lt;br /&gt;
&lt;br /&gt;
Do the same for deceleration&lt;br /&gt;
&lt;br /&gt;
Repeat everything with the other set of weights.&lt;br /&gt;
&lt;br /&gt;
The following series are all done with two 50g weights. The full setup corresponds roughly to a moving mass of 11kg when using a 16T pulley.&lt;br /&gt;
&lt;br /&gt;
=== 1st Series ===&lt;br /&gt;
&lt;br /&gt;
The following graph shows the max acceleration in RPM/s in steps of 200 RPM.&lt;br /&gt;
&lt;br /&gt;
Driver config (just pasted here for reference):&lt;br /&gt;
&lt;br /&gt;
        reg 0x04 -&amp;gt; 0x00000000&lt;br /&gt;
        reg 0xec -&amp;gt; 0x200100c3&lt;br /&gt;
        reg 0x90 -&amp;gt; 0x00061802&lt;br /&gt;
        reg 0x91 -&amp;gt; 0x0000000a&lt;br /&gt;
        reg 0x80 -&amp;gt; 0x00003144&lt;br /&gt;
        reg 0x93 -&amp;gt; 0x000001f4&lt;br /&gt;
        reg 0xf0 -&amp;gt; 0x000401c8&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=RPM/s|&lt;br /&gt;
type=line|&lt;br /&gt;
x=0.00,200.00,400.00,600.00,800.00,1000.00,1200.00,1400.00,1600.00,1800.00,2000.00,2200.00,2400.00,2600.00,2800.00,3000.00,3200.00|&lt;br /&gt;
y=7101.94,7611.49,6377.73,5601.97,3675.27,2408.02,1860.57,1763.62,1583.96,1071.46,935.91,891.38,776.37,751.01,664.83,612.14,581.51|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid|&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== StealthChop ===&lt;br /&gt;
&lt;br /&gt;
4 Series with StealthChop&lt;br /&gt;
&lt;br /&gt;
        tmcw(TMCR_CHOPCONF,&lt;br /&gt;
                TMC_CHOPCONF_DEDGE |&lt;br /&gt;
                (2 &amp;lt;&amp;lt; TMC_CHOPCONF_TBL_SHIFT) |&lt;br /&gt;
                (7 &amp;lt;&amp;lt; TMC_CHOPCONF_HEND_SHIFT) |&lt;br /&gt;
                (2 &amp;lt;&amp;lt; TMC_CHOPCONF_HSTRT_SHIFT) |&lt;br /&gt;
                (5 &amp;lt;&amp;lt; TMC_CHOPCONF_TOFF_SHIFT));&lt;br /&gt;
        tmcw(TMCR_IHOLD_IRUN,&lt;br /&gt;
                ( 6 &amp;lt;&amp;lt; TMC_IHOLD_IRUN_IHOLDDELAY_SHIFT) |&lt;br /&gt;
                (24 &amp;lt;&amp;lt; TMC_IHOLD_IRUN_IRUN_SHIFT) |&lt;br /&gt;
                ( 3 &amp;lt;&amp;lt; TMC_IHOLD_IRUN_IHOLD_SHIFT));&lt;br /&gt;
        tmcw(TMCR_TPOWER_DOWN, 0x0a);&lt;br /&gt;
        tmcw(TMCR_GCONF,&lt;br /&gt;
                TMC_GCONF_DIAG0_INT_PUSHPULL |&lt;br /&gt;
                TMC_GCONF_DIAG1_PUSHPULL |&lt;br /&gt;
                TMC_GCONF_DIAG1_STALL |&lt;br /&gt;
                TMC_GCONF_DIAG0_OTPW |&lt;br /&gt;
                TMC_GCONF_EN_PWM_MODE&lt;br /&gt;
        );&lt;br /&gt;
        tmcw(TMCR_TPWMTHRS, 0);&lt;br /&gt;
        tmcw(TMCR_PWMCONF,&lt;br /&gt;
                TMC_PWMCONF_PWM_AUTOSCALE |&lt;br /&gt;
                (  1 &amp;lt;&amp;lt; TMC_PWMCONF_PWM_GRAD_SHIFT) |&lt;br /&gt;
                (200 &amp;lt;&amp;lt; TMC_PWMCONF_PWM_AMPL_SHIFT));&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=RPM/s|&lt;br /&gt;
type=line|&lt;br /&gt;
x=0,200.00, 400.00, 600.00, 800.00, 1000.00, 1200.00, 1400.00,1600,1800,2000,2200,2400,2600,2800,3000|&lt;br /&gt;
y1=4652.11,8270.53,6688.88,4508.25,2932.28,2138.08,1581.30,1271.33,1328.75,1022.06|&lt;br /&gt;
y2=4771.72, 7918.49, 6734.86, 5036.72, 3401.45, 2294.83, 1554.91, 1694.32, 1295.62, 1284.12, 723.39, 704.20, 564.93, 578.95, 699.80, 502.95|&lt;br /&gt;
y3=4701.81, 7671.34, 6738.24, 5021.65, 3757.66, 2462.01, 1405.32, 1644.94, 1242.94, 1150.06, 902.61|&lt;br /&gt;
y4=4378.76, 7908.38, 6726.26, 5059.55, 3786.02, 2977.99, 1582.61, 1773.34, 1360.92, 1319.06, 700.13, 593.96, 497.86, 611.02, 609.19, 492.01|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid|&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== SpreadCycle vs. StealthChop at 37V ===&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=RPM/s|&lt;br /&gt;
type=line|&lt;br /&gt;
x=0,200.00, 400.00, 600.00, 800.00, 1000.00, 1200.00, 1400.00,1600,1800,2000,2200,2400,2600,2800,3000,3200|&lt;br /&gt;
y1=7101.94,7611.49,6377.73,5601.97,3675.27,2408.02,1860.57,1763.62,1583.96,1071.46,935.91,891.38,776.37,751.01,664.83,612.14,581.51|&lt;br /&gt;
y2=4771.72, 7918.49, 6734.86, 5036.72, 3401.45, 2294.83, 1554.91, 1694.32, 1295.62, 1284.12, 723.39, 704.20, 564.93, 578.95, 699.80, 502.95|&lt;br /&gt;
y1Title=SpreadCycle|y2Title=StealthChop|legend=Legend|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid|&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== SpreadCycle vs. StealthChop at 24V ===&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=RPM/s|&lt;br /&gt;
type=line|&lt;br /&gt;
x=0,200.00, 400.00, 600.00, 800.00, 1000.00, 1200.00, 1400.00,1600,1800,2000,2200,2400,2600,2800,3000,3200|&lt;br /&gt;
y1=7542.89,7479.90,6916.74,5115.56,3970.36,2537.81,1991.76,1270.71,974.54,1100.13,654.58,493.23,526.57,475.44|&lt;br /&gt;
y2=5023.15,6511.14,4549.33,2146.70,1382.23,1040.71,890.69,754.43,372.66,406.07|&lt;br /&gt;
y1Title=SpreadCycle|y2Title=StealthChop|legend=Legend|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid|&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== SpreadCycle vs. StealthChop at 45V ===&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=RPM/s|&lt;br /&gt;
type=line|&lt;br /&gt;
x=0,200.00, 400.00, 600.00, 800.00, 1000.00, 1200.00, 1400.00,1600,1800,2000,2200,2400,2600,2800,3000,3200|&lt;br /&gt;
y1=6833.09,6936.92,6967.79,5795.93,5090.94,4218.19,4093.83,2910.22,3110.80,2005.70,1814.99,1182.57,1083.50|&lt;br /&gt;
y2=4627.26,6868.87,6580.90,5164.92,3780.01,2877.61,2168.31,1452.74,1413.20,1641.69,865.66|&lt;br /&gt;
y1Title=SpreadCycle|y2Title=StealthChop|legend=Legend|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid|&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== SpreadCycle at different Voltages ===&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=RPM/s|&lt;br /&gt;
type=line|&lt;br /&gt;
x=0,200.00, 400.00, 600.00, 800.00, 1000.00, 1200.00, 1400.00,1600,1800,2000,2200,2400,2600,2800,3000,3200|&lt;br /&gt;
y1=7542.89,7479.90,6916.74,5115.56,3970.36,2537.81,1991.76,1270.71,974.54,1100.13,654.58,493.23,526.57,475.44|&lt;br /&gt;
y2=7101.94,7611.49,6377.73,5601.97,3675.27,2408.02,1860.57,1763.62,1583.96,1071.46,935.91,891.38,776.37,751.01,664.83,612.14,581.51|&lt;br /&gt;
y3=6833.09,6936.92,6967.79,5795.93,5090.94,4218.19,4093.83,2910.22,3110.80,2005.70,1814.99,1182.57,1083.50|&lt;br /&gt;
y1Title=24V|y2Title=37V|y3Title=45V|legend=Legend|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid,blue|&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== StealthChop at different Voltages ===&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=RPM/s|&lt;br /&gt;
type=line|&lt;br /&gt;
x=0,200.00, 400.00, 600.00, 800.00, 1000.00, 1200.00, 1400.00,1600,1800,2000,2200,2400,2600,2800,3000,3200|&lt;br /&gt;
y1=5023.15,6511.14,4549.33,2146.70,1382.23,1040.71,890.69,754.43,372.66,406.07|&lt;br /&gt;
y2=4771.72, 7918.49, 6734.86, 5036.72, 3401.45, 2294.83, 1554.91, 1694.32, 1295.62, 1284.12, 723.39, 704.20, 564.93, 578.95, 699.80, 502.95|&lt;br /&gt;
y3=4627.26,6868.87,6580.90,5164.92,3780.01,2877.61,2168.31,1452.74,1413.20,1641.69,865.66|&lt;br /&gt;
y1Title=24V|y2Title=37V|y3Title=45V|legend=Legend|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid,blue|&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Series without weights, corresponds to ~1.4kg ==&lt;br /&gt;
&lt;br /&gt;
== StealthChop at 40V ==&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=RPM/s|&lt;br /&gt;
type=line|&lt;br /&gt;
x=0,200.00, 400.00, 600.00, 800.00, 1000.00, 1200.00, 1400.00,1600,1800,2000,2200,2400,2600,2800,3000,3200,3400,3600|&lt;br /&gt;
y1=20918.88,31064.29,49822.66,30495.68,19954.14,16975.80,15092.86,12889.57,7374.21,6677.21,6548.32,6316.87,5661.69,5542.80,3859.08,3112.40|&lt;br /&gt;
y2=30349.05,52366.55,59085.26,38463.68,23076.22,16421.99,16383.62,12566.21,12533.29,7263.07,6329.07,5970.43,6619.73,4893.02,3537.95,3102.99,4084.08,2583.17| &lt;br /&gt;
4.92,3780.01,2877.61,2168.31,1452.74,1413.20,1641.69,865.66|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid,blue|&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Sensille</name></author>	</entry>

	<entry>
		<id>http://3dpfs.sensille.com/index.php?title=Stepper&amp;diff=87</id>
		<title>Stepper</title>
		<link rel="alternate" type="text/html" href="http://3dpfs.sensille.com/index.php?title=Stepper&amp;diff=87"/>
				<updated>2018-05-06T16:09:07Z</updated>
		
		<summary type="html">&lt;p&gt;Sensille: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== General Setup ==&lt;br /&gt;
&lt;br /&gt;
Used Stepper: 17HM19-2004S&lt;br /&gt;
&lt;br /&gt;
Driver Voltage: 37V&lt;br /&gt;
&lt;br /&gt;
Driver: TMC2130&lt;br /&gt;
&lt;br /&gt;
Max RPM reached with the motor, unloaded: 3600RPM&lt;br /&gt;
This is the limit of the driver. It runs from the internal oscillator at 12.1MHz. Measure by giving a 9.765kHz pulse and read out register TSTEP as 0x277 (DEDGE=true).&lt;br /&gt;
&lt;br /&gt;
== Take One, Lifting Weights ==&lt;br /&gt;
&lt;br /&gt;
Driver Configuration is basically the recommended default from the datasheet for a coil current of about 2A:&lt;br /&gt;
 reg 0x6c -&amp;gt; 0x200100c3&lt;br /&gt;
 reg 0x10 -&amp;gt; 0x00061c02&lt;br /&gt;
 reg 0x91 -&amp;gt; 0x0000000a&lt;br /&gt;
 reg 0x80 -&amp;gt; 0x00003144&lt;br /&gt;
 reg 0x93 -&amp;gt; 0x000001f4&lt;br /&gt;
 reg 0xf0 -&amp;gt; 0x000401c8&lt;br /&gt;
&lt;br /&gt;
For very slow step rates stealthChop was disabled&lt;br /&gt;
&lt;br /&gt;
Load Testing at 1/256 microstepping. Testing done lifting a weight by winding a rope on a cylinder with effective radius of 16.5mm.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Weightlifting.jpeg|Weight Lifting Setup&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 9.5kHz 2250g&lt;br /&gt;
 19.5kHz 2150g &lt;br /&gt;
 39kHz 2240g&lt;br /&gt;
 58.5kHz 2220g&lt;br /&gt;
 78kHz 2240g&lt;br /&gt;
 97.5kHz 2230g&lt;br /&gt;
 117kHz 2230g&lt;br /&gt;
 137kHz 2130g&lt;br /&gt;
 156kHz 2150g&lt;br /&gt;
 195kHz 2030g &lt;br /&gt;
 234kHz 2050g&lt;br /&gt;
 312kHz 2030g&lt;br /&gt;
 468kHz 1700g&lt;br /&gt;
 624kHz 1300g&lt;br /&gt;
 936kHz 740g&lt;br /&gt;
 1092kHz 556g&lt;br /&gt;
 1400kHz 250g&lt;br /&gt;
 1700kHz 150g&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=Torque in Ncm|&lt;br /&gt;
legend=Legend|&lt;br /&gt;
type=line|&lt;br /&gt;
x=11.13,22.85,45.70,68.55,91.41,114.26,137.11,160.55,182.81,228.52,274.22,365.62,548.44,731.25,1096.88,1279.69,1640.62,1992.19|&lt;br /&gt;
y1=37.12,35.48,36.96,36.63,36.96,36.80,36.80,35.14,35.48,33.49,33.82,33.49,28.05,21.45,12.21,9.17,4.12,2.47|&lt;br /&gt;
y1Title=Measured|&lt;br /&gt;
y2=,,,,24,26,32,34,34,34.5,36,35.5,34,16|&lt;br /&gt;
y2Title=From Datasheet (rough estimate)|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid|&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Source for torque curve from datasheet: https://www.omc-stepperonline.com/download/17HM19-2004S_Torque_Curve.pdf&lt;br /&gt;
&lt;br /&gt;
Full data sheet of the motor: https://www.omc-stepperonline.com/download/17HM19-2004S.pdf&lt;br /&gt;
&lt;br /&gt;
== Take Two, Weight Spinning ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Gallery&amp;gt;&lt;br /&gt;
Weightspinning.jpeg|Setup for torque measurement by a spinning weight&lt;br /&gt;
&amp;lt;/Gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The idea here is to measure the torque at a given RPM by testing how fast the stepper can accelerate to a higher RPM. This way the measurement is not limit to the length of a linear motion as in the previous chapter.&lt;br /&gt;
&lt;br /&gt;
=== Lost step detection ===&lt;br /&gt;
&lt;br /&gt;
With each round the rotor goes through a photo interruptor. The controller has an internal counter to keep track of the current angle with respect to an arbitrary reference. The home command puts the controller into a mode where it resets the counter if the rotor goes through the interruptor. After that, with each round it checks if the interruptor signal asserts during a given window around the reference. The window can be programmed and is currently set to +/- 4 full steps.&lt;br /&gt;
&lt;br /&gt;
=== Measurement ===&lt;br /&gt;
&lt;br /&gt;
We spin the motor to the RPM under test and try to accelerate it to the next higher RPM level. We use the interruptor signal to detect lost steps.&lt;br /&gt;
The acceleration directly corresponds to the torque the motor can generate at the given RPM.&lt;br /&gt;
&lt;br /&gt;
We now have a detailed torque curve RPM vs. Ncm.&lt;br /&gt;
&lt;br /&gt;
Do the same for deceleration&lt;br /&gt;
&lt;br /&gt;
Repeat everything with the other set of weights.&lt;br /&gt;
&lt;br /&gt;
The following series are all done with two 50g weights. The full setup corresponds roughly to a moving mass of 11kg when using a 16T pulley.&lt;br /&gt;
&lt;br /&gt;
=== 1st Series ===&lt;br /&gt;
&lt;br /&gt;
The following graph shows the max acceleration in RPM/s in steps of 200 RPM.&lt;br /&gt;
&lt;br /&gt;
Driver config (just pasted here for reference):&lt;br /&gt;
&lt;br /&gt;
        reg 0x04 -&amp;gt; 0x00000000&lt;br /&gt;
        reg 0xec -&amp;gt; 0x200100c3&lt;br /&gt;
        reg 0x90 -&amp;gt; 0x00061802&lt;br /&gt;
        reg 0x91 -&amp;gt; 0x0000000a&lt;br /&gt;
        reg 0x80 -&amp;gt; 0x00003144&lt;br /&gt;
        reg 0x93 -&amp;gt; 0x000001f4&lt;br /&gt;
        reg 0xf0 -&amp;gt; 0x000401c8&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=RPM/s|&lt;br /&gt;
type=line|&lt;br /&gt;
x=0.00,200.00,400.00,600.00,800.00,1000.00,1200.00,1400.00,1600.00,1800.00,2000.00,2200.00,2400.00,2600.00,2800.00,3000.00,3200.00|&lt;br /&gt;
y=7101.94,7611.49,6377.73,5601.97,3675.27,2408.02,1860.57,1763.62,1583.96,1071.46,935.91,891.38,776.37,751.01,664.83,612.14,581.51|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid|&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== StealthChop ===&lt;br /&gt;
&lt;br /&gt;
4 Series with StealthChop&lt;br /&gt;
&lt;br /&gt;
        tmcw(TMCR_CHOPCONF,&lt;br /&gt;
                TMC_CHOPCONF_DEDGE |&lt;br /&gt;
                (2 &amp;lt;&amp;lt; TMC_CHOPCONF_TBL_SHIFT) |&lt;br /&gt;
                (7 &amp;lt;&amp;lt; TMC_CHOPCONF_HEND_SHIFT) |&lt;br /&gt;
                (2 &amp;lt;&amp;lt; TMC_CHOPCONF_HSTRT_SHIFT) |&lt;br /&gt;
                (5 &amp;lt;&amp;lt; TMC_CHOPCONF_TOFF_SHIFT));&lt;br /&gt;
        tmcw(TMCR_IHOLD_IRUN,&lt;br /&gt;
                ( 6 &amp;lt;&amp;lt; TMC_IHOLD_IRUN_IHOLDDELAY_SHIFT) |&lt;br /&gt;
                (24 &amp;lt;&amp;lt; TMC_IHOLD_IRUN_IRUN_SHIFT) |&lt;br /&gt;
                ( 3 &amp;lt;&amp;lt; TMC_IHOLD_IRUN_IHOLD_SHIFT));&lt;br /&gt;
        tmcw(TMCR_TPOWER_DOWN, 0x0a);&lt;br /&gt;
        tmcw(TMCR_GCONF,&lt;br /&gt;
                TMC_GCONF_DIAG0_INT_PUSHPULL |&lt;br /&gt;
                TMC_GCONF_DIAG1_PUSHPULL |&lt;br /&gt;
                TMC_GCONF_DIAG1_STALL |&lt;br /&gt;
                TMC_GCONF_DIAG0_OTPW |&lt;br /&gt;
                TMC_GCONF_EN_PWM_MODE&lt;br /&gt;
        );&lt;br /&gt;
        tmcw(TMCR_TPWMTHRS, 0);&lt;br /&gt;
        tmcw(TMCR_PWMCONF,&lt;br /&gt;
                TMC_PWMCONF_PWM_AUTOSCALE |&lt;br /&gt;
                (  1 &amp;lt;&amp;lt; TMC_PWMCONF_PWM_GRAD_SHIFT) |&lt;br /&gt;
                (200 &amp;lt;&amp;lt; TMC_PWMCONF_PWM_AMPL_SHIFT));&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=RPM/s|&lt;br /&gt;
type=line|&lt;br /&gt;
x=0,200.00, 400.00, 600.00, 800.00, 1000.00, 1200.00, 1400.00,1600,1800,2000,2200,2400,2600,2800,3000|&lt;br /&gt;
y1=4652.11,8270.53,6688.88,4508.25,2932.28,2138.08,1581.30,1271.33,1328.75,1022.06|&lt;br /&gt;
y2=4771.72, 7918.49, 6734.86, 5036.72, 3401.45, 2294.83, 1554.91, 1694.32, 1295.62, 1284.12, 723.39, 704.20, 564.93, 578.95, 699.80, 502.95|&lt;br /&gt;
y3=4701.81, 7671.34, 6738.24, 5021.65, 3757.66, 2462.01, 1405.32, 1644.94, 1242.94, 1150.06, 902.61|&lt;br /&gt;
y4=4378.76, 7908.38, 6726.26, 5059.55, 3786.02, 2977.99, 1582.61, 1773.34, 1360.92, 1319.06, 700.13, 593.96, 497.86, 611.02, 609.19, 492.01|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid|&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== SpreadCycle vs. StealthChop at 37V ===&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=RPM/s|&lt;br /&gt;
type=line|&lt;br /&gt;
x=0,200.00, 400.00, 600.00, 800.00, 1000.00, 1200.00, 1400.00,1600,1800,2000,2200,2400,2600,2800,3000,3200|&lt;br /&gt;
y1=7101.94,7611.49,6377.73,5601.97,3675.27,2408.02,1860.57,1763.62,1583.96,1071.46,935.91,891.38,776.37,751.01,664.83,612.14,581.51|&lt;br /&gt;
y2=4771.72, 7918.49, 6734.86, 5036.72, 3401.45, 2294.83, 1554.91, 1694.32, 1295.62, 1284.12, 723.39, 704.20, 564.93, 578.95, 699.80, 502.95|&lt;br /&gt;
y1Title=SpreadCycle|y2Title=StealthChop|legend=Legend|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid|&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== SpreadCycle vs. StealthChop at 24V ===&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=RPM/s|&lt;br /&gt;
type=line|&lt;br /&gt;
x=0,200.00, 400.00, 600.00, 800.00, 1000.00, 1200.00, 1400.00,1600,1800,2000,2200,2400,2600,2800,3000,3200|&lt;br /&gt;
y1=7542.89,7479.90,6916.74,5115.56,3970.36,2537.81,1991.76,1270.71,974.54,1100.13,654.58,493.23,526.57,475.44|&lt;br /&gt;
y2=5023.15,6511.14,4549.33,2146.70,1382.23,1040.71,890.69,754.43,372.66,406.07|&lt;br /&gt;
y1Title=SpreadCycle|y2Title=StealthChop|legend=Legend|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid|&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== SpreadCycle vs. StealthChop at 45V ===&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=RPM/s|&lt;br /&gt;
type=line|&lt;br /&gt;
x=0,200.00, 400.00, 600.00, 800.00, 1000.00, 1200.00, 1400.00,1600,1800,2000,2200,2400,2600,2800,3000,3200|&lt;br /&gt;
y1=6833.09,6936.92,6967.79,5795.93,5090.94,4218.19,4093.83,2910.22,3110.80,2005.70,1814.99,1182.57,1083.50|&lt;br /&gt;
y2=4627.26,6868.87,6580.90,5164.92,3780.01,2877.61,2168.31,1452.74,1413.20,1641.69,865.66|&lt;br /&gt;
y1Title=SpreadCycle|y2Title=StealthChop|legend=Legend|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid|&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== SpreadCycle at different Voltages ===&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=RPM/s|&lt;br /&gt;
type=line|&lt;br /&gt;
x=0,200.00, 400.00, 600.00, 800.00, 1000.00, 1200.00, 1400.00,1600,1800,2000,2200,2400,2600,2800,3000,3200|&lt;br /&gt;
y1=7542.89,7479.90,6916.74,5115.56,3970.36,2537.81,1991.76,1270.71,974.54,1100.13,654.58,493.23,526.57,475.44|&lt;br /&gt;
y2=7101.94,7611.49,6377.73,5601.97,3675.27,2408.02,1860.57,1763.62,1583.96,1071.46,935.91,891.38,776.37,751.01,664.83,612.14,581.51|&lt;br /&gt;
y3=6833.09,6936.92,6967.79,5795.93,5090.94,4218.19,4093.83,2910.22,3110.80,2005.70,1814.99,1182.57,1083.50|&lt;br /&gt;
y1Title=24V|y2Title=37V|y3Title=45V|legend=Legend|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid,blue|&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== StealthChop at different Voltages ===&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=RPM/s|&lt;br /&gt;
type=line|&lt;br /&gt;
x=0,200.00, 400.00, 600.00, 800.00, 1000.00, 1200.00, 1400.00,1600,1800,2000,2200,2400,2600,2800,3000,3200|&lt;br /&gt;
y1=5023.15,6511.14,4549.33,2146.70,1382.23,1040.71,890.69,754.43,372.66,406.07|&lt;br /&gt;
y2=4771.72, 7918.49, 6734.86, 5036.72, 3401.45, 2294.83, 1554.91, 1694.32, 1295.62, 1284.12, 723.39, 704.20, 564.93, 578.95, 699.80, 502.95|&lt;br /&gt;
y3=4627.26,6868.87,6580.90,5164.92,3780.01,2877.61,2168.31,1452.74,1413.20,1641.69,865.66|&lt;br /&gt;
y1Title=24V|y2Title=37V|y3Title=45V|legend=Legend|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid,blue|&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Series without weights, corresponds to ~1.4kg ==&lt;br /&gt;
&lt;br /&gt;
== StealthChop at 40V ==&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=RPM/s|&lt;br /&gt;
type=line|&lt;br /&gt;
x=0,200.00, 400.00, 600.00, 800.00, 1000.00, 1200.00, 1400.00,1600,1800,2000,2200,2400,2600,2800,3000,3200|&lt;br /&gt;
y1=20918.88,31064.29,49822.66,30495.68,19954.14,16975.80,15092.86,12889.57,7374.21,6677.21,6548.32,6316.87,5661.69,5542.80,3859.08,3112.40&lt;br /&gt;
y2=30349.05,52366.55,59085.26,38463.68,23076.22,16421.99,16383.62,12566.21,12533.29,7263.07,6329.07,5970.43,6619.73,4893.02,3537.95,3102.99,4084.08,2583.17 &lt;br /&gt;
4.92,3780.01,2877.61,2168.31,1452.74,1413.20,1641.69,865.66|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid,blue|&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Sensille</name></author>	</entry>

	<entry>
		<id>http://3dpfs.sensille.com/index.php?title=Stepper&amp;diff=86</id>
		<title>Stepper</title>
		<link rel="alternate" type="text/html" href="http://3dpfs.sensille.com/index.php?title=Stepper&amp;diff=86"/>
				<updated>2018-05-06T16:05:16Z</updated>
		
		<summary type="html">&lt;p&gt;Sensille: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== General Setup ==&lt;br /&gt;
&lt;br /&gt;
Used Stepper: 17HM19-2004S&lt;br /&gt;
&lt;br /&gt;
Driver Voltage: 37V&lt;br /&gt;
&lt;br /&gt;
Driver: TMC2130&lt;br /&gt;
&lt;br /&gt;
Max RPM reached with the motor, unloaded: 3600RPM&lt;br /&gt;
This is the limit of the driver. It runs from the internal oscillator at 12.1MHz. Measure by giving a 9.765kHz pulse and read out register TSTEP as 0x277 (DEDGE=true).&lt;br /&gt;
&lt;br /&gt;
== Take One, Lifting Weights ==&lt;br /&gt;
&lt;br /&gt;
Driver Configuration is basically the recommended default from the datasheet for a coil current of about 2A:&lt;br /&gt;
 reg 0x6c -&amp;gt; 0x200100c3&lt;br /&gt;
 reg 0x10 -&amp;gt; 0x00061c02&lt;br /&gt;
 reg 0x91 -&amp;gt; 0x0000000a&lt;br /&gt;
 reg 0x80 -&amp;gt; 0x00003144&lt;br /&gt;
 reg 0x93 -&amp;gt; 0x000001f4&lt;br /&gt;
 reg 0xf0 -&amp;gt; 0x000401c8&lt;br /&gt;
&lt;br /&gt;
For very slow step rates stealthChop was disabled&lt;br /&gt;
&lt;br /&gt;
Load Testing at 1/256 microstepping. Testing done lifting a weight by winding a rope on a cylinder with effective radius of 16.5mm.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Weightlifting.jpeg|Weight Lifting Setup&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 9.5kHz 2250g&lt;br /&gt;
 19.5kHz 2150g &lt;br /&gt;
 39kHz 2240g&lt;br /&gt;
 58.5kHz 2220g&lt;br /&gt;
 78kHz 2240g&lt;br /&gt;
 97.5kHz 2230g&lt;br /&gt;
 117kHz 2230g&lt;br /&gt;
 137kHz 2130g&lt;br /&gt;
 156kHz 2150g&lt;br /&gt;
 195kHz 2030g &lt;br /&gt;
 234kHz 2050g&lt;br /&gt;
 312kHz 2030g&lt;br /&gt;
 468kHz 1700g&lt;br /&gt;
 624kHz 1300g&lt;br /&gt;
 936kHz 740g&lt;br /&gt;
 1092kHz 556g&lt;br /&gt;
 1400kHz 250g&lt;br /&gt;
 1700kHz 150g&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=Torque in Ncm|&lt;br /&gt;
legend=Legend|&lt;br /&gt;
type=line|&lt;br /&gt;
x=11.13,22.85,45.70,68.55,91.41,114.26,137.11,160.55,182.81,228.52,274.22,365.62,548.44,731.25,1096.88,1279.69,1640.62,1992.19|&lt;br /&gt;
y1=37.12,35.48,36.96,36.63,36.96,36.80,36.80,35.14,35.48,33.49,33.82,33.49,28.05,21.45,12.21,9.17,4.12,2.47|&lt;br /&gt;
y1Title=Measured|&lt;br /&gt;
y2=,,,,24,26,32,34,34,34.5,36,35.5,34,16|&lt;br /&gt;
y2Title=From Datasheet (rough estimate)|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid|&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Source for torque curve from datasheet: https://www.omc-stepperonline.com/download/17HM19-2004S_Torque_Curve.pdf&lt;br /&gt;
&lt;br /&gt;
Full data sheet of the motor: https://www.omc-stepperonline.com/download/17HM19-2004S.pdf&lt;br /&gt;
&lt;br /&gt;
== Take Two, Weight Spinning ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Gallery&amp;gt;&lt;br /&gt;
Weightspinning.jpeg|Setup for torque measurement by a spinning weight&lt;br /&gt;
&amp;lt;/Gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The idea here is to measure the torque at a given RPM by testing how fast the stepper can accelerate to a higher RPM. This way the measurement is not limit to the length of a linear motion as in the previous chapter.&lt;br /&gt;
&lt;br /&gt;
=== Lost step detection ===&lt;br /&gt;
&lt;br /&gt;
With each round the rotor goes through a photo interruptor. The controller has an internal counter to keep track of the current angle with respect to an arbitrary reference. The home command puts the controller into a mode where it resets the counter if the rotor goes through the interruptor. After that, with each round it checks if the interruptor signal asserts during a given window around the reference. The window can be programmed and is currently set to +/- 4 full steps.&lt;br /&gt;
&lt;br /&gt;
=== Measurement ===&lt;br /&gt;
&lt;br /&gt;
We spin the motor to the RPM under test and try to accelerate it to the next higher RPM level. We use the interruptor signal to detect lost steps.&lt;br /&gt;
The acceleration directly corresponds to the torque the motor can generate at the given RPM.&lt;br /&gt;
&lt;br /&gt;
We now have a detailed torque curve RPM vs. Ncm.&lt;br /&gt;
&lt;br /&gt;
Do the same for deceleration&lt;br /&gt;
&lt;br /&gt;
Repeat everything with the other set of weights.&lt;br /&gt;
&lt;br /&gt;
The following series are all done with two 50g weights. The full setup corresponds roughly to a moving mass of 11kg when using a 16T pulley.&lt;br /&gt;
&lt;br /&gt;
=== 1st Series ===&lt;br /&gt;
&lt;br /&gt;
The following graph shows the max acceleration in RPM/s in steps of 200 RPM.&lt;br /&gt;
&lt;br /&gt;
Driver config (just pasted here for reference):&lt;br /&gt;
&lt;br /&gt;
        reg 0x04 -&amp;gt; 0x00000000&lt;br /&gt;
        reg 0xec -&amp;gt; 0x200100c3&lt;br /&gt;
        reg 0x90 -&amp;gt; 0x00061802&lt;br /&gt;
        reg 0x91 -&amp;gt; 0x0000000a&lt;br /&gt;
        reg 0x80 -&amp;gt; 0x00003144&lt;br /&gt;
        reg 0x93 -&amp;gt; 0x000001f4&lt;br /&gt;
        reg 0xf0 -&amp;gt; 0x000401c8&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=RPM/s|&lt;br /&gt;
type=line|&lt;br /&gt;
x=0.00,200.00,400.00,600.00,800.00,1000.00,1200.00,1400.00,1600.00,1800.00,2000.00,2200.00,2400.00,2600.00,2800.00,3000.00,3200.00|&lt;br /&gt;
y=7101.94,7611.49,6377.73,5601.97,3675.27,2408.02,1860.57,1763.62,1583.96,1071.46,935.91,891.38,776.37,751.01,664.83,612.14,581.51|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid|&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== StealthChop ===&lt;br /&gt;
&lt;br /&gt;
4 Series with StealthChop&lt;br /&gt;
&lt;br /&gt;
        tmcw(TMCR_CHOPCONF,&lt;br /&gt;
                TMC_CHOPCONF_DEDGE |&lt;br /&gt;
                (2 &amp;lt;&amp;lt; TMC_CHOPCONF_TBL_SHIFT) |&lt;br /&gt;
                (7 &amp;lt;&amp;lt; TMC_CHOPCONF_HEND_SHIFT) |&lt;br /&gt;
                (2 &amp;lt;&amp;lt; TMC_CHOPCONF_HSTRT_SHIFT) |&lt;br /&gt;
                (5 &amp;lt;&amp;lt; TMC_CHOPCONF_TOFF_SHIFT));&lt;br /&gt;
        tmcw(TMCR_IHOLD_IRUN,&lt;br /&gt;
                ( 6 &amp;lt;&amp;lt; TMC_IHOLD_IRUN_IHOLDDELAY_SHIFT) |&lt;br /&gt;
                (24 &amp;lt;&amp;lt; TMC_IHOLD_IRUN_IRUN_SHIFT) |&lt;br /&gt;
                ( 3 &amp;lt;&amp;lt; TMC_IHOLD_IRUN_IHOLD_SHIFT));&lt;br /&gt;
        tmcw(TMCR_TPOWER_DOWN, 0x0a);&lt;br /&gt;
        tmcw(TMCR_GCONF,&lt;br /&gt;
                TMC_GCONF_DIAG0_INT_PUSHPULL |&lt;br /&gt;
                TMC_GCONF_DIAG1_PUSHPULL |&lt;br /&gt;
                TMC_GCONF_DIAG1_STALL |&lt;br /&gt;
                TMC_GCONF_DIAG0_OTPW |&lt;br /&gt;
                TMC_GCONF_EN_PWM_MODE&lt;br /&gt;
        );&lt;br /&gt;
        tmcw(TMCR_TPWMTHRS, 0);&lt;br /&gt;
        tmcw(TMCR_PWMCONF,&lt;br /&gt;
                TMC_PWMCONF_PWM_AUTOSCALE |&lt;br /&gt;
                (  1 &amp;lt;&amp;lt; TMC_PWMCONF_PWM_GRAD_SHIFT) |&lt;br /&gt;
                (200 &amp;lt;&amp;lt; TMC_PWMCONF_PWM_AMPL_SHIFT));&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=RPM/s|&lt;br /&gt;
type=line|&lt;br /&gt;
x=0,200.00, 400.00, 600.00, 800.00, 1000.00, 1200.00, 1400.00,1600,1800,2000,2200,2400,2600,2800,3000|&lt;br /&gt;
y1=4652.11,8270.53,6688.88,4508.25,2932.28,2138.08,1581.30,1271.33,1328.75,1022.06|&lt;br /&gt;
y2=4771.72, 7918.49, 6734.86, 5036.72, 3401.45, 2294.83, 1554.91, 1694.32, 1295.62, 1284.12, 723.39, 704.20, 564.93, 578.95, 699.80, 502.95|&lt;br /&gt;
y3=4701.81, 7671.34, 6738.24, 5021.65, 3757.66, 2462.01, 1405.32, 1644.94, 1242.94, 1150.06, 902.61|&lt;br /&gt;
y4=4378.76, 7908.38, 6726.26, 5059.55, 3786.02, 2977.99, 1582.61, 1773.34, 1360.92, 1319.06, 700.13, 593.96, 497.86, 611.02, 609.19, 492.01|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid|&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== SpreadCycle vs. StealthChop at 37V ===&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=RPM/s|&lt;br /&gt;
type=line|&lt;br /&gt;
x=0,200.00, 400.00, 600.00, 800.00, 1000.00, 1200.00, 1400.00,1600,1800,2000,2200,2400,2600,2800,3000,3200|&lt;br /&gt;
y1=7101.94,7611.49,6377.73,5601.97,3675.27,2408.02,1860.57,1763.62,1583.96,1071.46,935.91,891.38,776.37,751.01,664.83,612.14,581.51|&lt;br /&gt;
y2=4771.72, 7918.49, 6734.86, 5036.72, 3401.45, 2294.83, 1554.91, 1694.32, 1295.62, 1284.12, 723.39, 704.20, 564.93, 578.95, 699.80, 502.95|&lt;br /&gt;
y1Title=SpreadCycle|y2Title=StealthChop|legend=Legend|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid|&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== SpreadCycle vs. StealthChop at 24V ===&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=RPM/s|&lt;br /&gt;
type=line|&lt;br /&gt;
x=0,200.00, 400.00, 600.00, 800.00, 1000.00, 1200.00, 1400.00,1600,1800,2000,2200,2400,2600,2800,3000,3200|&lt;br /&gt;
y1=7542.89,7479.90,6916.74,5115.56,3970.36,2537.81,1991.76,1270.71,974.54,1100.13,654.58,493.23,526.57,475.44|&lt;br /&gt;
y2=5023.15,6511.14,4549.33,2146.70,1382.23,1040.71,890.69,754.43,372.66,406.07|&lt;br /&gt;
y1Title=SpreadCycle|y2Title=StealthChop|legend=Legend|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid|&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== SpreadCycle vs. StealthChop at 45V ===&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=RPM/s|&lt;br /&gt;
type=line|&lt;br /&gt;
x=0,200.00, 400.00, 600.00, 800.00, 1000.00, 1200.00, 1400.00,1600,1800,2000,2200,2400,2600,2800,3000,3200|&lt;br /&gt;
y1=6833.09,6936.92,6967.79,5795.93,5090.94,4218.19,4093.83,2910.22,3110.80,2005.70,1814.99,1182.57,1083.50|&lt;br /&gt;
y2=4627.26,6868.87,6580.90,5164.92,3780.01,2877.61,2168.31,1452.74,1413.20,1641.69,865.66|&lt;br /&gt;
y1Title=SpreadCycle|y2Title=StealthChop|legend=Legend|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid|&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== SpreadCycle at different Voltages ===&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=RPM/s|&lt;br /&gt;
type=line|&lt;br /&gt;
x=0,200.00, 400.00, 600.00, 800.00, 1000.00, 1200.00, 1400.00,1600,1800,2000,2200,2400,2600,2800,3000,3200|&lt;br /&gt;
y1=7542.89,7479.90,6916.74,5115.56,3970.36,2537.81,1991.76,1270.71,974.54,1100.13,654.58,493.23,526.57,475.44|&lt;br /&gt;
y2=7101.94,7611.49,6377.73,5601.97,3675.27,2408.02,1860.57,1763.62,1583.96,1071.46,935.91,891.38,776.37,751.01,664.83,612.14,581.51|&lt;br /&gt;
y3=6833.09,6936.92,6967.79,5795.93,5090.94,4218.19,4093.83,2910.22,3110.80,2005.70,1814.99,1182.57,1083.50|&lt;br /&gt;
y1Title=24V|y2Title=37V|y3Title=45V|legend=Legend|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid,blue|&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== StealthChop at different Voltages ===&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=RPM/s|&lt;br /&gt;
type=line|&lt;br /&gt;
x=0,200.00, 400.00, 600.00, 800.00, 1000.00, 1200.00, 1400.00,1600,1800,2000,2200,2400,2600,2800,3000,3200|&lt;br /&gt;
y1=5023.15,6511.14,4549.33,2146.70,1382.23,1040.71,890.69,754.43,372.66,406.07|&lt;br /&gt;
y2=4771.72, 7918.49, 6734.86, 5036.72, 3401.45, 2294.83, 1554.91, 1694.32, 1295.62, 1284.12, 723.39, 704.20, 564.93, 578.95, 699.80, 502.95|&lt;br /&gt;
y3=4627.26,6868.87,6580.90,5164.92,3780.01,2877.61,2168.31,1452.74,1413.20,1641.69,865.66|&lt;br /&gt;
y1Title=24V|y2Title=37V|y3Title=45V|legend=Legend|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid,blue|&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Sensille</name></author>	</entry>

	<entry>
		<id>http://3dpfs.sensille.com/index.php?title=Stepper&amp;diff=85</id>
		<title>Stepper</title>
		<link rel="alternate" type="text/html" href="http://3dpfs.sensille.com/index.php?title=Stepper&amp;diff=85"/>
				<updated>2018-05-06T16:02:35Z</updated>
		
		<summary type="html">&lt;p&gt;Sensille: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== General Setup ==&lt;br /&gt;
&lt;br /&gt;
Used Stepper: 17HM19-2004S&lt;br /&gt;
&lt;br /&gt;
Driver Voltage: 37V&lt;br /&gt;
&lt;br /&gt;
Driver: TMC2130&lt;br /&gt;
&lt;br /&gt;
Max RPM reached with the motor, unloaded: 3600RPM&lt;br /&gt;
This is the limit of the driver. It runs from the internal oscillator at 12.1MHz. Measure by giving a 9.765kHz pulse and read out register TSTEP as 0x277 (DEDGE=true).&lt;br /&gt;
&lt;br /&gt;
== Take One, Lifting Weights ==&lt;br /&gt;
&lt;br /&gt;
Driver Configuration is basically the recommended default from the datasheet for a coil current of about 2A:&lt;br /&gt;
 reg 0x6c -&amp;gt; 0x200100c3&lt;br /&gt;
 reg 0x10 -&amp;gt; 0x00061c02&lt;br /&gt;
 reg 0x91 -&amp;gt; 0x0000000a&lt;br /&gt;
 reg 0x80 -&amp;gt; 0x00003144&lt;br /&gt;
 reg 0x93 -&amp;gt; 0x000001f4&lt;br /&gt;
 reg 0xf0 -&amp;gt; 0x000401c8&lt;br /&gt;
&lt;br /&gt;
For very slow step rates stealthChop was disabled&lt;br /&gt;
&lt;br /&gt;
Load Testing at 1/256 microstepping. Testing done lifting a weight by winding a rope on a cylinder with effective radius of 16.5mm.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Weightlifting.jpeg|Weight Lifting Setup&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 9.5kHz 2250g&lt;br /&gt;
 19.5kHz 2150g &lt;br /&gt;
 39kHz 2240g&lt;br /&gt;
 58.5kHz 2220g&lt;br /&gt;
 78kHz 2240g&lt;br /&gt;
 97.5kHz 2230g&lt;br /&gt;
 117kHz 2230g&lt;br /&gt;
 137kHz 2130g&lt;br /&gt;
 156kHz 2150g&lt;br /&gt;
 195kHz 2030g &lt;br /&gt;
 234kHz 2050g&lt;br /&gt;
 312kHz 2030g&lt;br /&gt;
 468kHz 1700g&lt;br /&gt;
 624kHz 1300g&lt;br /&gt;
 936kHz 740g&lt;br /&gt;
 1092kHz 556g&lt;br /&gt;
 1400kHz 250g&lt;br /&gt;
 1700kHz 150g&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=Torque in Ncm|&lt;br /&gt;
legend=Legend|&lt;br /&gt;
type=line|&lt;br /&gt;
x=11.13,22.85,45.70,68.55,91.41,114.26,137.11,160.55,182.81,228.52,274.22,365.62,548.44,731.25,1096.88,1279.69,1640.62,1992.19|&lt;br /&gt;
y1=37.12,35.48,36.96,36.63,36.96,36.80,36.80,35.14,35.48,33.49,33.82,33.49,28.05,21.45,12.21,9.17,4.12,2.47|&lt;br /&gt;
y1Title=Measured|&lt;br /&gt;
y2=,,,,24,26,32,34,34,34.5,36,35.5,34,16|&lt;br /&gt;
y2Title=From Datasheet (rough estimate)|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid|&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Source for torque curve from datasheet: https://www.omc-stepperonline.com/download/17HM19-2004S_Torque_Curve.pdf&lt;br /&gt;
&lt;br /&gt;
Full data sheet of the motor: https://www.omc-stepperonline.com/download/17HM19-2004S.pdf&lt;br /&gt;
&lt;br /&gt;
== Take Two, Weight Spinning ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Gallery&amp;gt;&lt;br /&gt;
Weightspinning.jpeg|Setup for torque measurement by a spinning weight&lt;br /&gt;
&amp;lt;/Gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The idea here is to measure the torque at a given RPM by testing how fast the stepper can accelerate to a higher RPM. This way the measurement is not limit to the length of a linear motion as in the previous chapter.&lt;br /&gt;
&lt;br /&gt;
=== Lost step detection ===&lt;br /&gt;
&lt;br /&gt;
With each round the rotor goes through a photo interruptor. The controller has an internal counter to keep track of the current angle with respect to an arbitrary reference. The home command puts the controller into a mode where it resets the counter if the rotor goes through the interruptor. After that, with each round it checks if the interruptor signal asserts during a given window around the reference. The window can be programmed and is currently set to +/- 4 full steps.&lt;br /&gt;
&lt;br /&gt;
=== Measurement ===&lt;br /&gt;
&lt;br /&gt;
We spin the motor to the RPM under test and try to accelerate it to the next higher RPM level. We use the interruptor signal to detect lost steps.&lt;br /&gt;
The acceleration directly corresponds to the torque the motor can generate at the given RPM.&lt;br /&gt;
&lt;br /&gt;
We now have a detailed torque curve RPM vs. Ncm.&lt;br /&gt;
&lt;br /&gt;
Do the same for deceleration&lt;br /&gt;
&lt;br /&gt;
Repeat everything with the other set of weights.&lt;br /&gt;
&lt;br /&gt;
The following series are all done with two 50g weights. The full setup corresponds roughly to a moving mass of 11kg when using a 16T pulley.&lt;br /&gt;
&lt;br /&gt;
=== 1st Series ===&lt;br /&gt;
&lt;br /&gt;
The following graph shows the max acceleration in RPM/s in steps of 200 RPM.&lt;br /&gt;
&lt;br /&gt;
Driver config (just pasted here for reference):&lt;br /&gt;
&lt;br /&gt;
        reg 0x04 -&amp;gt; 0x00000000&lt;br /&gt;
        reg 0xec -&amp;gt; 0x200100c3&lt;br /&gt;
        reg 0x90 -&amp;gt; 0x00061802&lt;br /&gt;
        reg 0x91 -&amp;gt; 0x0000000a&lt;br /&gt;
        reg 0x80 -&amp;gt; 0x00003144&lt;br /&gt;
        reg 0x93 -&amp;gt; 0x000001f4&lt;br /&gt;
        reg 0xf0 -&amp;gt; 0x000401c8&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=RPM/s|&lt;br /&gt;
type=line|&lt;br /&gt;
x=0.00,200.00,400.00,600.00,800.00,1000.00,1200.00,1400.00,1600.00,1800.00,2000.00,2200.00,2400.00,2600.00,2800.00,3000.00,3200.00|&lt;br /&gt;
y=7101.94,7611.49,6377.73,5601.97,3675.27,2408.02,1860.57,1763.62,1583.96,1071.46,935.91,891.38,776.37,751.01,664.83,612.14,581.51|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid|&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== StealthChop ===&lt;br /&gt;
&lt;br /&gt;
4 Series with StealthChop&lt;br /&gt;
&lt;br /&gt;
        tmcw(TMCR_CHOPCONF,&lt;br /&gt;
                TMC_CHOPCONF_DEDGE |&lt;br /&gt;
                (2 &amp;lt;&amp;lt; TMC_CHOPCONF_TBL_SHIFT) |&lt;br /&gt;
                (7 &amp;lt;&amp;lt; TMC_CHOPCONF_HEND_SHIFT) |&lt;br /&gt;
                (2 &amp;lt;&amp;lt; TMC_CHOPCONF_HSTRT_SHIFT) |&lt;br /&gt;
                (5 &amp;lt;&amp;lt; TMC_CHOPCONF_TOFF_SHIFT));&lt;br /&gt;
        tmcw(TMCR_IHOLD_IRUN,&lt;br /&gt;
                ( 6 &amp;lt;&amp;lt; TMC_IHOLD_IRUN_IHOLDDELAY_SHIFT) |&lt;br /&gt;
                (24 &amp;lt;&amp;lt; TMC_IHOLD_IRUN_IRUN_SHIFT) |&lt;br /&gt;
                ( 3 &amp;lt;&amp;lt; TMC_IHOLD_IRUN_IHOLD_SHIFT));&lt;br /&gt;
        tmcw(TMCR_TPOWER_DOWN, 0x0a);&lt;br /&gt;
        tmcw(TMCR_GCONF,&lt;br /&gt;
                TMC_GCONF_DIAG0_INT_PUSHPULL |&lt;br /&gt;
                TMC_GCONF_DIAG1_PUSHPULL |&lt;br /&gt;
                TMC_GCONF_DIAG1_STALL |&lt;br /&gt;
                TMC_GCONF_DIAG0_OTPW |&lt;br /&gt;
                TMC_GCONF_EN_PWM_MODE&lt;br /&gt;
        );&lt;br /&gt;
        tmcw(TMCR_TPWMTHRS, 0);&lt;br /&gt;
        tmcw(TMCR_PWMCONF,&lt;br /&gt;
                TMC_PWMCONF_PWM_AUTOSCALE |&lt;br /&gt;
                (  1 &amp;lt;&amp;lt; TMC_PWMCONF_PWM_GRAD_SHIFT) |&lt;br /&gt;
                (200 &amp;lt;&amp;lt; TMC_PWMCONF_PWM_AMPL_SHIFT));&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=RPM/s|&lt;br /&gt;
type=line|&lt;br /&gt;
x=0,200.00, 400.00, 600.00, 800.00, 1000.00, 1200.00, 1400.00,1600,1800,2000,2200,2400,2600,2800,3000|&lt;br /&gt;
y1=4652.11,8270.53,6688.88,4508.25,2932.28,2138.08,1581.30,1271.33,1328.75,1022.06|&lt;br /&gt;
y2=4771.72, 7918.49, 6734.86, 5036.72, 3401.45, 2294.83, 1554.91, 1694.32, 1295.62, 1284.12, 723.39, 704.20, 564.93, 578.95, 699.80, 502.95|&lt;br /&gt;
y3=4701.81, 7671.34, 6738.24, 5021.65, 3757.66, 2462.01, 1405.32, 1644.94, 1242.94, 1150.06, 902.61|&lt;br /&gt;
y4=4378.76, 7908.38, 6726.26, 5059.55, 3786.02, 2977.99, 1582.61, 1773.34, 1360.92, 1319.06, 700.13, 593.96, 497.86, 611.02, 609.19, 492.01|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid|&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== SpreadCycle vs. StealthChop at 37V ===&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=RPM/s|&lt;br /&gt;
type=line|&lt;br /&gt;
x=0,200.00, 400.00, 600.00, 800.00, 1000.00, 1200.00, 1400.00,1600,1800,2000,2200,2400,2600,2800,3000,3200|&lt;br /&gt;
y1=7101.94,7611.49,6377.73,5601.97,3675.27,2408.02,1860.57,1763.62,1583.96,1071.46,935.91,891.38,776.37,751.01,664.83,612.14,581.51|&lt;br /&gt;
y2=4771.72, 7918.49, 6734.86, 5036.72, 3401.45, 2294.83, 1554.91, 1694.32, 1295.62, 1284.12, 723.39, 704.20, 564.93, 578.95, 699.80, 502.95|&lt;br /&gt;
y1Title=SpreadCycle|y2Title=StealthChop|legend=Legend|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid|&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== SpreadCycle vs. StealthChop at 24V ===&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=RPM/s|&lt;br /&gt;
type=line|&lt;br /&gt;
x=0,200.00, 400.00, 600.00, 800.00, 1000.00, 1200.00, 1400.00,1600,1800,2000,2200,2400,2600,2800,3000,3200|&lt;br /&gt;
y1=7542.89,7479.90,6916.74,5115.56,3970.36,2537.81,1991.76,1270.71,974.54,1100.13,654.58,493.23,526.57,475.44|&lt;br /&gt;
y2=5023.15,6511.14,4549.33,2146.70,1382.23,1040.71,890.69,754.43,372.66,406.07|&lt;br /&gt;
y1Title=SpreadCycle|y2Title=StealthChop|legend=Legend|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid|&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== SpreadCycle vs. StealthChop at 45V ===&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=RPM/s|&lt;br /&gt;
type=line|&lt;br /&gt;
x=0,200.00, 400.00, 600.00, 800.00, 1000.00, 1200.00, 1400.00,1600,1800,2000,2200,2400,2600,2800,3000,3200|&lt;br /&gt;
y1=6833.09,6936.92,6967.79,5795.93,5090.94,4218.19,4093.83,2910.22,3110.80,2005.70,1814.99,1182.57,1083.50|&lt;br /&gt;
y2=4627.26,6868.87,6580.90,5164.92,3780.01,2877.61,2168.31,1452.74,1413.20,1641.69,865.66|&lt;br /&gt;
y1Title=SpreadCycle|y2Title=StealthChop|legend=Legend|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid|&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== SpreadCycle at different Voltages ===&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=RPM/s|&lt;br /&gt;
type=line|&lt;br /&gt;
x=0,200.00, 400.00, 600.00, 800.00, 1000.00, 1200.00, 1400.00,1600,1800,2000,2200,2400,2600,2800,3000,3200|&lt;br /&gt;
y1=7542.89,7479.90,6916.74,5115.56,3970.36,2537.81,1991.76,1270.71,974.54,1100.13,654.58,493.23,526.57,475.44|&lt;br /&gt;
y2=7101.94,7611.49,6377.73,5601.97,3675.27,2408.02,1860.57,1763.62,1583.96,1071.46,935.91,891.38,776.37,751.01,664.83,612.14,581.51|&lt;br /&gt;
y3=6833.09,6936.92,6967.79,5795.93,5090.94,4218.19,4093.83,2910.22,3110.80,2005.70,1814.99,1182.57,1083.50|&lt;br /&gt;
y1Title=24V|y2Title=37V|y3Title=45V|legend=Legend|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid|&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Sensille</name></author>	</entry>

	<entry>
		<id>http://3dpfs.sensille.com/index.php?title=Stepper&amp;diff=84</id>
		<title>Stepper</title>
		<link rel="alternate" type="text/html" href="http://3dpfs.sensille.com/index.php?title=Stepper&amp;diff=84"/>
				<updated>2018-05-06T16:00:25Z</updated>
		
		<summary type="html">&lt;p&gt;Sensille: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== General Setup ==&lt;br /&gt;
&lt;br /&gt;
Used Stepper: 17HM19-2004S&lt;br /&gt;
&lt;br /&gt;
Driver Voltage: 37V&lt;br /&gt;
&lt;br /&gt;
Driver: TMC2130&lt;br /&gt;
&lt;br /&gt;
Max RPM reached with the motor, unloaded: 3600RPM&lt;br /&gt;
This is the limit of the driver. It runs from the internal oscillator at 12.1MHz. Measure by giving a 9.765kHz pulse and read out register TSTEP as 0x277 (DEDGE=true).&lt;br /&gt;
&lt;br /&gt;
== Take One, Lifting Weights ==&lt;br /&gt;
&lt;br /&gt;
Driver Configuration is basically the recommended default from the datasheet for a coil current of about 2A:&lt;br /&gt;
 reg 0x6c -&amp;gt; 0x200100c3&lt;br /&gt;
 reg 0x10 -&amp;gt; 0x00061c02&lt;br /&gt;
 reg 0x91 -&amp;gt; 0x0000000a&lt;br /&gt;
 reg 0x80 -&amp;gt; 0x00003144&lt;br /&gt;
 reg 0x93 -&amp;gt; 0x000001f4&lt;br /&gt;
 reg 0xf0 -&amp;gt; 0x000401c8&lt;br /&gt;
&lt;br /&gt;
For very slow step rates stealthChop was disabled&lt;br /&gt;
&lt;br /&gt;
Load Testing at 1/256 microstepping. Testing done lifting a weight by winding a rope on a cylinder with effective radius of 16.5mm.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Weightlifting.jpeg|Weight Lifting Setup&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 9.5kHz 2250g&lt;br /&gt;
 19.5kHz 2150g &lt;br /&gt;
 39kHz 2240g&lt;br /&gt;
 58.5kHz 2220g&lt;br /&gt;
 78kHz 2240g&lt;br /&gt;
 97.5kHz 2230g&lt;br /&gt;
 117kHz 2230g&lt;br /&gt;
 137kHz 2130g&lt;br /&gt;
 156kHz 2150g&lt;br /&gt;
 195kHz 2030g &lt;br /&gt;
 234kHz 2050g&lt;br /&gt;
 312kHz 2030g&lt;br /&gt;
 468kHz 1700g&lt;br /&gt;
 624kHz 1300g&lt;br /&gt;
 936kHz 740g&lt;br /&gt;
 1092kHz 556g&lt;br /&gt;
 1400kHz 250g&lt;br /&gt;
 1700kHz 150g&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=Torque in Ncm|&lt;br /&gt;
legend=Legend|&lt;br /&gt;
type=line|&lt;br /&gt;
x=11.13,22.85,45.70,68.55,91.41,114.26,137.11,160.55,182.81,228.52,274.22,365.62,548.44,731.25,1096.88,1279.69,1640.62,1992.19|&lt;br /&gt;
y1=37.12,35.48,36.96,36.63,36.96,36.80,36.80,35.14,35.48,33.49,33.82,33.49,28.05,21.45,12.21,9.17,4.12,2.47|&lt;br /&gt;
y1Title=Measured|&lt;br /&gt;
y2=,,,,24,26,32,34,34,34.5,36,35.5,34,16|&lt;br /&gt;
y2Title=From Datasheet (rough estimate)|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid|&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Source for torque curve from datasheet: https://www.omc-stepperonline.com/download/17HM19-2004S_Torque_Curve.pdf&lt;br /&gt;
&lt;br /&gt;
Full data sheet of the motor: https://www.omc-stepperonline.com/download/17HM19-2004S.pdf&lt;br /&gt;
&lt;br /&gt;
== Take Two, Weight Spinning ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Gallery&amp;gt;&lt;br /&gt;
Weightspinning.jpeg|Setup for torque measurement by a spinning weight&lt;br /&gt;
&amp;lt;/Gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The idea here is to measure the torque at a given RPM by testing how fast the stepper can accelerate to a higher RPM. This way the measurement is not limit to the length of a linear motion as in the previous chapter.&lt;br /&gt;
&lt;br /&gt;
=== Lost step detection ===&lt;br /&gt;
&lt;br /&gt;
With each round the rotor goes through a photo interruptor. The controller has an internal counter to keep track of the current angle with respect to an arbitrary reference. The home command puts the controller into a mode where it resets the counter if the rotor goes through the interruptor. After that, with each round it checks if the interruptor signal asserts during a given window around the reference. The window can be programmed and is currently set to +/- 4 full steps.&lt;br /&gt;
&lt;br /&gt;
=== Measurement ===&lt;br /&gt;
&lt;br /&gt;
We spin the motor to the RPM under test and try to accelerate it to the next higher RPM level. We use the interruptor signal to detect lost steps.&lt;br /&gt;
The acceleration directly corresponds to the torque the motor can generate at the given RPM.&lt;br /&gt;
&lt;br /&gt;
We now have a detailed torque curve RPM vs. Ncm.&lt;br /&gt;
&lt;br /&gt;
Do the same for deceleration&lt;br /&gt;
&lt;br /&gt;
Repeat everything with the other set of weights.&lt;br /&gt;
&lt;br /&gt;
The following series are all done with two 50g weights. The full setup corresponds roughly to a moving mass of 11kg when using a 16T pulley.&lt;br /&gt;
&lt;br /&gt;
=== 1st Series ===&lt;br /&gt;
&lt;br /&gt;
The following graph shows the max acceleration in RPM/s in steps of 200 RPM.&lt;br /&gt;
&lt;br /&gt;
Driver config (just pasted here for reference):&lt;br /&gt;
&lt;br /&gt;
        reg 0x04 -&amp;gt; 0x00000000&lt;br /&gt;
        reg 0xec -&amp;gt; 0x200100c3&lt;br /&gt;
        reg 0x90 -&amp;gt; 0x00061802&lt;br /&gt;
        reg 0x91 -&amp;gt; 0x0000000a&lt;br /&gt;
        reg 0x80 -&amp;gt; 0x00003144&lt;br /&gt;
        reg 0x93 -&amp;gt; 0x000001f4&lt;br /&gt;
        reg 0xf0 -&amp;gt; 0x000401c8&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=RPM/s|&lt;br /&gt;
type=line|&lt;br /&gt;
x=0.00,200.00,400.00,600.00,800.00,1000.00,1200.00,1400.00,1600.00,1800.00,2000.00,2200.00,2400.00,2600.00,2800.00,3000.00,3200.00|&lt;br /&gt;
y=7101.94,7611.49,6377.73,5601.97,3675.27,2408.02,1860.57,1763.62,1583.96,1071.46,935.91,891.38,776.37,751.01,664.83,612.14,581.51|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid|&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== StealthChop ===&lt;br /&gt;
&lt;br /&gt;
4 Series with StealthChop&lt;br /&gt;
&lt;br /&gt;
        tmcw(TMCR_CHOPCONF,&lt;br /&gt;
                TMC_CHOPCONF_DEDGE |&lt;br /&gt;
                (2 &amp;lt;&amp;lt; TMC_CHOPCONF_TBL_SHIFT) |&lt;br /&gt;
                (7 &amp;lt;&amp;lt; TMC_CHOPCONF_HEND_SHIFT) |&lt;br /&gt;
                (2 &amp;lt;&amp;lt; TMC_CHOPCONF_HSTRT_SHIFT) |&lt;br /&gt;
                (5 &amp;lt;&amp;lt; TMC_CHOPCONF_TOFF_SHIFT));&lt;br /&gt;
        tmcw(TMCR_IHOLD_IRUN,&lt;br /&gt;
                ( 6 &amp;lt;&amp;lt; TMC_IHOLD_IRUN_IHOLDDELAY_SHIFT) |&lt;br /&gt;
                (24 &amp;lt;&amp;lt; TMC_IHOLD_IRUN_IRUN_SHIFT) |&lt;br /&gt;
                ( 3 &amp;lt;&amp;lt; TMC_IHOLD_IRUN_IHOLD_SHIFT));&lt;br /&gt;
        tmcw(TMCR_TPOWER_DOWN, 0x0a);&lt;br /&gt;
        tmcw(TMCR_GCONF,&lt;br /&gt;
                TMC_GCONF_DIAG0_INT_PUSHPULL |&lt;br /&gt;
                TMC_GCONF_DIAG1_PUSHPULL |&lt;br /&gt;
                TMC_GCONF_DIAG1_STALL |&lt;br /&gt;
                TMC_GCONF_DIAG0_OTPW |&lt;br /&gt;
                TMC_GCONF_EN_PWM_MODE&lt;br /&gt;
        );&lt;br /&gt;
        tmcw(TMCR_TPWMTHRS, 0);&lt;br /&gt;
        tmcw(TMCR_PWMCONF,&lt;br /&gt;
                TMC_PWMCONF_PWM_AUTOSCALE |&lt;br /&gt;
                (  1 &amp;lt;&amp;lt; TMC_PWMCONF_PWM_GRAD_SHIFT) |&lt;br /&gt;
                (200 &amp;lt;&amp;lt; TMC_PWMCONF_PWM_AMPL_SHIFT));&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=RPM/s|&lt;br /&gt;
type=line|&lt;br /&gt;
x=0,200.00, 400.00, 600.00, 800.00, 1000.00, 1200.00, 1400.00,1600,1800,2000,2200,2400,2600,2800,3000|&lt;br /&gt;
y1=4652.11,8270.53,6688.88,4508.25,2932.28,2138.08,1581.30,1271.33,1328.75,1022.06|&lt;br /&gt;
y2=4771.72, 7918.49, 6734.86, 5036.72, 3401.45, 2294.83, 1554.91, 1694.32, 1295.62, 1284.12, 723.39, 704.20, 564.93, 578.95, 699.80, 502.95|&lt;br /&gt;
y3=4701.81, 7671.34, 6738.24, 5021.65, 3757.66, 2462.01, 1405.32, 1644.94, 1242.94, 1150.06, 902.61|&lt;br /&gt;
y4=4378.76, 7908.38, 6726.26, 5059.55, 3786.02, 2977.99, 1582.61, 1773.34, 1360.92, 1319.06, 700.13, 593.96, 497.86, 611.02, 609.19, 492.01|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid|&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== SpreadCycle vs. StealthChop at 37V ===&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=RPM/s|&lt;br /&gt;
type=line|&lt;br /&gt;
x=0,200.00, 400.00, 600.00, 800.00, 1000.00, 1200.00, 1400.00,1600,1800,2000,2200,2400,2600,2800,3000,3200|&lt;br /&gt;
y1=7101.94,7611.49,6377.73,5601.97,3675.27,2408.02,1860.57,1763.62,1583.96,1071.46,935.91,891.38,776.37,751.01,664.83,612.14,581.51|&lt;br /&gt;
y2=4771.72, 7918.49, 6734.86, 5036.72, 3401.45, 2294.83, 1554.91, 1694.32, 1295.62, 1284.12, 723.39, 704.20, 564.93, 578.95, 699.80, 502.95|&lt;br /&gt;
y1Title=SpreadCycle|y2Title=StealthChop|legend=Legend|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid|&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== SpreadCycle vs. StealthChop at 24V ===&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=RPM/s|&lt;br /&gt;
type=line|&lt;br /&gt;
x=0,200.00, 400.00, 600.00, 800.00, 1000.00, 1200.00, 1400.00,1600,1800,2000,2200,2400,2600,2800,3000,3200|&lt;br /&gt;
y1=7542.89,7479.90,6916.74,5115.56,3970.36,2537.81,1991.76,1270.71,974.54,1100.13,654.58,493.23,526.57,475.44|&lt;br /&gt;
y2=5023.15,6511.14,4549.33,2146.70,1382.23,1040.71,890.69,754.43,372.66,406.07|&lt;br /&gt;
y1Title=SpreadCycle|y2Title=StealthChop|legend=Legend|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid|&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== SpreadCycle vs. StealthChop at 45V ===&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=RPM/s|&lt;br /&gt;
type=line|&lt;br /&gt;
x=0,200.00, 400.00, 600.00, 800.00, 1000.00, 1200.00, 1400.00,1600,1800,2000,2200,2400,2600,2800,3000,3200|&lt;br /&gt;
y1=6833.09,6936.92,6967.79,5795.93,5090.94,4218.19,4093.83,2910.22,3110.80,2005.70,1814.99,1182.57,1083.50|&lt;br /&gt;
y2=4627.26,6868.87,6580.90,5164.92,3780.01,2877.61,2168.31,1452.74,1413.20,1641.69,865.66|&lt;br /&gt;
y1Title=SpreadCycle|y2Title=StealthChop|legend=Legend|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid|&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Sensille</name></author>	</entry>

	<entry>
		<id>http://3dpfs.sensille.com/index.php?title=Stepper&amp;diff=83</id>
		<title>Stepper</title>
		<link rel="alternate" type="text/html" href="http://3dpfs.sensille.com/index.php?title=Stepper&amp;diff=83"/>
				<updated>2018-05-06T15:58:18Z</updated>
		
		<summary type="html">&lt;p&gt;Sensille: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== General Setup ==&lt;br /&gt;
&lt;br /&gt;
Used Stepper: 17HM19-2004S&lt;br /&gt;
&lt;br /&gt;
Driver Voltage: 37V&lt;br /&gt;
&lt;br /&gt;
Driver: TMC2130&lt;br /&gt;
&lt;br /&gt;
Max RPM reached with the motor, unloaded: 3600RPM&lt;br /&gt;
This is the limit of the driver. It runs from the internal oscillator at 12.1MHz. Measure by giving a 9.765kHz pulse and read out register TSTEP as 0x277 (DEDGE=true).&lt;br /&gt;
&lt;br /&gt;
== Take One, Lifting Weights ==&lt;br /&gt;
&lt;br /&gt;
Driver Configuration is basically the recommended default from the datasheet for a coil current of about 2A:&lt;br /&gt;
 reg 0x6c -&amp;gt; 0x200100c3&lt;br /&gt;
 reg 0x10 -&amp;gt; 0x00061c02&lt;br /&gt;
 reg 0x91 -&amp;gt; 0x0000000a&lt;br /&gt;
 reg 0x80 -&amp;gt; 0x00003144&lt;br /&gt;
 reg 0x93 -&amp;gt; 0x000001f4&lt;br /&gt;
 reg 0xf0 -&amp;gt; 0x000401c8&lt;br /&gt;
&lt;br /&gt;
For very slow step rates stealthChop was disabled&lt;br /&gt;
&lt;br /&gt;
Load Testing at 1/256 microstepping. Testing done lifting a weight by winding a rope on a cylinder with effective radius of 16.5mm.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Weightlifting.jpeg|Weight Lifting Setup&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 9.5kHz 2250g&lt;br /&gt;
 19.5kHz 2150g &lt;br /&gt;
 39kHz 2240g&lt;br /&gt;
 58.5kHz 2220g&lt;br /&gt;
 78kHz 2240g&lt;br /&gt;
 97.5kHz 2230g&lt;br /&gt;
 117kHz 2230g&lt;br /&gt;
 137kHz 2130g&lt;br /&gt;
 156kHz 2150g&lt;br /&gt;
 195kHz 2030g &lt;br /&gt;
 234kHz 2050g&lt;br /&gt;
 312kHz 2030g&lt;br /&gt;
 468kHz 1700g&lt;br /&gt;
 624kHz 1300g&lt;br /&gt;
 936kHz 740g&lt;br /&gt;
 1092kHz 556g&lt;br /&gt;
 1400kHz 250g&lt;br /&gt;
 1700kHz 150g&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=Torque in Ncm|&lt;br /&gt;
legend=Legend|&lt;br /&gt;
type=line|&lt;br /&gt;
x=11.13,22.85,45.70,68.55,91.41,114.26,137.11,160.55,182.81,228.52,274.22,365.62,548.44,731.25,1096.88,1279.69,1640.62,1992.19|&lt;br /&gt;
y1=37.12,35.48,36.96,36.63,36.96,36.80,36.80,35.14,35.48,33.49,33.82,33.49,28.05,21.45,12.21,9.17,4.12,2.47|&lt;br /&gt;
y1Title=Measured|&lt;br /&gt;
y2=,,,,24,26,32,34,34,34.5,36,35.5,34,16|&lt;br /&gt;
y2Title=From Datasheet (rough estimate)|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid|&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Source for torque curve from datasheet: https://www.omc-stepperonline.com/download/17HM19-2004S_Torque_Curve.pdf&lt;br /&gt;
&lt;br /&gt;
Full data sheet of the motor: https://www.omc-stepperonline.com/download/17HM19-2004S.pdf&lt;br /&gt;
&lt;br /&gt;
== Take Two, Weight Spinning ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Gallery&amp;gt;&lt;br /&gt;
Weightspinning.jpeg|Setup for torque measurement by a spinning weight&lt;br /&gt;
&amp;lt;/Gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The idea here is to measure the torque at a given RPM by testing how fast the stepper can accelerate to a higher RPM. This way the measurement is not limit to the length of a linear motion as in the previous chapter.&lt;br /&gt;
&lt;br /&gt;
=== Lost step detection ===&lt;br /&gt;
&lt;br /&gt;
With each round the rotor goes through a photo interruptor. The controller has an internal counter to keep track of the current angle with respect to an arbitrary reference. The home command puts the controller into a mode where it resets the counter if the rotor goes through the interruptor. After that, with each round it checks if the interruptor signal asserts during a given window around the reference. The window can be programmed and is currently set to +/- 4 full steps.&lt;br /&gt;
&lt;br /&gt;
=== Measurement ===&lt;br /&gt;
&lt;br /&gt;
We spin the motor to the RPM under test and try to accelerate it to the next higher RPM level. We use the interruptor signal to detect lost steps.&lt;br /&gt;
The acceleration directly corresponds to the torque the motor can generate at the given RPM.&lt;br /&gt;
&lt;br /&gt;
We now have a detailed torque curve RPM vs. Ncm.&lt;br /&gt;
&lt;br /&gt;
Do the same for deceleration&lt;br /&gt;
&lt;br /&gt;
Repeat everything with the other set of weights.&lt;br /&gt;
&lt;br /&gt;
The following series are all done with two 50g weights. The full setup corresponds roughly to a moving mass of 11kg when using a 16T pulley.&lt;br /&gt;
&lt;br /&gt;
=== 1st Series ===&lt;br /&gt;
&lt;br /&gt;
The following graph shows the max acceleration in RPM/s in steps of 200 RPM.&lt;br /&gt;
&lt;br /&gt;
Driver config (just pasted here for reference):&lt;br /&gt;
&lt;br /&gt;
        reg 0x04 -&amp;gt; 0x00000000&lt;br /&gt;
        reg 0xec -&amp;gt; 0x200100c3&lt;br /&gt;
        reg 0x90 -&amp;gt; 0x00061802&lt;br /&gt;
        reg 0x91 -&amp;gt; 0x0000000a&lt;br /&gt;
        reg 0x80 -&amp;gt; 0x00003144&lt;br /&gt;
        reg 0x93 -&amp;gt; 0x000001f4&lt;br /&gt;
        reg 0xf0 -&amp;gt; 0x000401c8&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=RPM/s|&lt;br /&gt;
type=line|&lt;br /&gt;
x=0.00,200.00,400.00,600.00,800.00,1000.00,1200.00,1400.00,1600.00,1800.00,2000.00,2200.00,2400.00,2600.00,2800.00,3000.00,3200.00|&lt;br /&gt;
y=7101.94,7611.49,6377.73,5601.97,3675.27,2408.02,1860.57,1763.62,1583.96,1071.46,935.91,891.38,776.37,751.01,664.83,612.14,581.51|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid|&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== StealthChop ===&lt;br /&gt;
&lt;br /&gt;
4 Series with StealthChop&lt;br /&gt;
&lt;br /&gt;
        tmcw(TMCR_CHOPCONF,&lt;br /&gt;
                TMC_CHOPCONF_DEDGE |&lt;br /&gt;
                (2 &amp;lt;&amp;lt; TMC_CHOPCONF_TBL_SHIFT) |&lt;br /&gt;
                (7 &amp;lt;&amp;lt; TMC_CHOPCONF_HEND_SHIFT) |&lt;br /&gt;
                (2 &amp;lt;&amp;lt; TMC_CHOPCONF_HSTRT_SHIFT) |&lt;br /&gt;
                (5 &amp;lt;&amp;lt; TMC_CHOPCONF_TOFF_SHIFT));&lt;br /&gt;
        tmcw(TMCR_IHOLD_IRUN,&lt;br /&gt;
                ( 6 &amp;lt;&amp;lt; TMC_IHOLD_IRUN_IHOLDDELAY_SHIFT) |&lt;br /&gt;
                (24 &amp;lt;&amp;lt; TMC_IHOLD_IRUN_IRUN_SHIFT) |&lt;br /&gt;
                ( 3 &amp;lt;&amp;lt; TMC_IHOLD_IRUN_IHOLD_SHIFT));&lt;br /&gt;
        tmcw(TMCR_TPOWER_DOWN, 0x0a);&lt;br /&gt;
        tmcw(TMCR_GCONF,&lt;br /&gt;
                TMC_GCONF_DIAG0_INT_PUSHPULL |&lt;br /&gt;
                TMC_GCONF_DIAG1_PUSHPULL |&lt;br /&gt;
                TMC_GCONF_DIAG1_STALL |&lt;br /&gt;
                TMC_GCONF_DIAG0_OTPW |&lt;br /&gt;
                TMC_GCONF_EN_PWM_MODE&lt;br /&gt;
        );&lt;br /&gt;
        tmcw(TMCR_TPWMTHRS, 0);&lt;br /&gt;
        tmcw(TMCR_PWMCONF,&lt;br /&gt;
                TMC_PWMCONF_PWM_AUTOSCALE |&lt;br /&gt;
                (  1 &amp;lt;&amp;lt; TMC_PWMCONF_PWM_GRAD_SHIFT) |&lt;br /&gt;
                (200 &amp;lt;&amp;lt; TMC_PWMCONF_PWM_AMPL_SHIFT));&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=RPM/s|&lt;br /&gt;
type=line|&lt;br /&gt;
x=0,200.00, 400.00, 600.00, 800.00, 1000.00, 1200.00, 1400.00,1600,1800,2000,2200,2400,2600,2800,3000|&lt;br /&gt;
y1=4652.11,8270.53,6688.88,4508.25,2932.28,2138.08,1581.30,1271.33,1328.75,1022.06|&lt;br /&gt;
y2=4771.72, 7918.49, 6734.86, 5036.72, 3401.45, 2294.83, 1554.91, 1694.32, 1295.62, 1284.12, 723.39, 704.20, 564.93, 578.95, 699.80, 502.95|&lt;br /&gt;
y3=4701.81, 7671.34, 6738.24, 5021.65, 3757.66, 2462.01, 1405.32, 1644.94, 1242.94, 1150.06, 902.61|&lt;br /&gt;
y4=4378.76, 7908.38, 6726.26, 5059.55, 3786.02, 2977.99, 1582.61, 1773.34, 1360.92, 1319.06, 700.13, 593.96, 497.86, 611.02, 609.19, 492.01|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid|&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== SpreadCycle vs. StealthChop at 37V ===&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=RPM/s|&lt;br /&gt;
type=line|&lt;br /&gt;
x=0,200.00, 400.00, 600.00, 800.00, 1000.00, 1200.00, 1400.00,1600,1800,2000,2200,2400,2600,2800,3000,3200|&lt;br /&gt;
y1=7101.94,7611.49,6377.73,5601.97,3675.27,2408.02,1860.57,1763.62,1583.96,1071.46,935.91,891.38,776.37,751.01,664.83,612.14,581.51|&lt;br /&gt;
y2=4771.72, 7918.49, 6734.86, 5036.72, 3401.45, 2294.83, 1554.91, 1694.32, 1295.62, 1284.12, 723.39, 704.20, 564.93, 578.95, 699.80, 502.95|&lt;br /&gt;
y1Title=SpreadCycle|y2Title=StealthChop|legend=Legend|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid|&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== SpreadCycle vs. StealthChop at 24V ===&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=RPM/s|&lt;br /&gt;
type=line|&lt;br /&gt;
x=0,200.00, 400.00, 600.00, 800.00, 1000.00, 1200.00, 1400.00,1600,1800,2000,2200,2400,2600,2800,3000,3200|&lt;br /&gt;
y1=7542.89,7479.90,6916.74,5115.56,3970.36,2537.81,1991.76,1270.71,974.54,1100.13,654.58,493.23,526.57,475.44|&lt;br /&gt;
y2=5023.15,6511.14,4549.33,2146.70,1382.23,1040.71,890.69,754.43,372.66,406.07|&lt;br /&gt;
y1Title=SpreadCycle|y2Title=StealthChop|legend=Legend|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid|&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== SpreadCycle vs. StealthChop at 45V ===&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=RPM/s|&lt;br /&gt;
type=line|&lt;br /&gt;
x=0,200.00, 400.00, 600.00, 800.00, 1000.00, 1200.00, 1400.00,1600,1800,2000,2200,2400,2600,2800,3000,3200|&lt;br /&gt;
y1=6833.09,6936.92,6967.79,5795.93,5090.94,4218.19,4093.83,2910.22,3110.80,2005.70,1814.99,1182.57,1083.50|&lt;br /&gt;
y2=4711.75,6994.29,6629.86,4193.89,2580.76,1736.97,2175.65,1666.88,1087.78,1676.03,951.75|&lt;br /&gt;
y1Title=SpreadCycle|y2Title=StealthChop|legend=Legend|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid|&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Sensille</name></author>	</entry>

	<entry>
		<id>http://3dpfs.sensille.com/index.php?title=Stepper&amp;diff=82</id>
		<title>Stepper</title>
		<link rel="alternate" type="text/html" href="http://3dpfs.sensille.com/index.php?title=Stepper&amp;diff=82"/>
				<updated>2018-05-06T15:51:20Z</updated>
		
		<summary type="html">&lt;p&gt;Sensille: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== General Setup ==&lt;br /&gt;
&lt;br /&gt;
Used Stepper: 17HM19-2004S&lt;br /&gt;
&lt;br /&gt;
Driver Voltage: 37V&lt;br /&gt;
&lt;br /&gt;
Driver: TMC2130&lt;br /&gt;
&lt;br /&gt;
Max RPM reached with the motor, unloaded: 3600RPM&lt;br /&gt;
This is the limit of the driver. It runs from the internal oscillator at 12.1MHz. Measure by giving a 9.765kHz pulse and read out register TSTEP as 0x277 (DEDGE=true).&lt;br /&gt;
&lt;br /&gt;
== Take One, Lifting Weights ==&lt;br /&gt;
&lt;br /&gt;
Driver Configuration is basically the recommended default from the datasheet for a coil current of about 2A:&lt;br /&gt;
 reg 0x6c -&amp;gt; 0x200100c3&lt;br /&gt;
 reg 0x10 -&amp;gt; 0x00061c02&lt;br /&gt;
 reg 0x91 -&amp;gt; 0x0000000a&lt;br /&gt;
 reg 0x80 -&amp;gt; 0x00003144&lt;br /&gt;
 reg 0x93 -&amp;gt; 0x000001f4&lt;br /&gt;
 reg 0xf0 -&amp;gt; 0x000401c8&lt;br /&gt;
&lt;br /&gt;
For very slow step rates stealthChop was disabled&lt;br /&gt;
&lt;br /&gt;
Load Testing at 1/256 microstepping. Testing done lifting a weight by winding a rope on a cylinder with effective radius of 16.5mm.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Weightlifting.jpeg|Weight Lifting Setup&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 9.5kHz 2250g&lt;br /&gt;
 19.5kHz 2150g &lt;br /&gt;
 39kHz 2240g&lt;br /&gt;
 58.5kHz 2220g&lt;br /&gt;
 78kHz 2240g&lt;br /&gt;
 97.5kHz 2230g&lt;br /&gt;
 117kHz 2230g&lt;br /&gt;
 137kHz 2130g&lt;br /&gt;
 156kHz 2150g&lt;br /&gt;
 195kHz 2030g &lt;br /&gt;
 234kHz 2050g&lt;br /&gt;
 312kHz 2030g&lt;br /&gt;
 468kHz 1700g&lt;br /&gt;
 624kHz 1300g&lt;br /&gt;
 936kHz 740g&lt;br /&gt;
 1092kHz 556g&lt;br /&gt;
 1400kHz 250g&lt;br /&gt;
 1700kHz 150g&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=Torque in Ncm|&lt;br /&gt;
legend=Legend|&lt;br /&gt;
type=line|&lt;br /&gt;
x=11.13,22.85,45.70,68.55,91.41,114.26,137.11,160.55,182.81,228.52,274.22,365.62,548.44,731.25,1096.88,1279.69,1640.62,1992.19|&lt;br /&gt;
y1=37.12,35.48,36.96,36.63,36.96,36.80,36.80,35.14,35.48,33.49,33.82,33.49,28.05,21.45,12.21,9.17,4.12,2.47|&lt;br /&gt;
y1Title=Measured|&lt;br /&gt;
y2=,,,,24,26,32,34,34,34.5,36,35.5,34,16|&lt;br /&gt;
y2Title=From Datasheet (rough estimate)|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid|&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Source for torque curve from datasheet: https://www.omc-stepperonline.com/download/17HM19-2004S_Torque_Curve.pdf&lt;br /&gt;
&lt;br /&gt;
Full data sheet of the motor: https://www.omc-stepperonline.com/download/17HM19-2004S.pdf&lt;br /&gt;
&lt;br /&gt;
== Take Two, Weight Spinning ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Gallery&amp;gt;&lt;br /&gt;
Weightspinning.jpeg|Setup for torque measurement by a spinning weight&lt;br /&gt;
&amp;lt;/Gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The idea here is to measure the torque at a given RPM by testing how fast the stepper can accelerate to a higher RPM. This way the measurement is not limit to the length of a linear motion as in the previous chapter.&lt;br /&gt;
&lt;br /&gt;
=== Lost step detection ===&lt;br /&gt;
&lt;br /&gt;
With each round the rotor goes through a photo interruptor. The controller has an internal counter to keep track of the current angle with respect to an arbitrary reference. The home command puts the controller into a mode where it resets the counter if the rotor goes through the interruptor. After that, with each round it checks if the interruptor signal asserts during a given window around the reference. The window can be programmed and is currently set to +/- 4 full steps.&lt;br /&gt;
&lt;br /&gt;
=== Measurement ===&lt;br /&gt;
&lt;br /&gt;
We spin the motor to the RPM under test and try to accelerate it to the next higher RPM level. We use the interruptor signal to detect lost steps.&lt;br /&gt;
The acceleration directly corresponds to the torque the motor can generate at the given RPM.&lt;br /&gt;
&lt;br /&gt;
We now have a detailed torque curve RPM vs. Ncm.&lt;br /&gt;
&lt;br /&gt;
Do the same for deceleration&lt;br /&gt;
&lt;br /&gt;
Repeat everything with the other set of weights.&lt;br /&gt;
&lt;br /&gt;
The following series are all done with two 50g weights. The full setup corresponds roughly to a moving mass of 11kg when using a 16T pulley.&lt;br /&gt;
&lt;br /&gt;
=== 1st Series ===&lt;br /&gt;
&lt;br /&gt;
The following graph shows the max acceleration in RPM/s in steps of 200 RPM.&lt;br /&gt;
&lt;br /&gt;
Driver config (just pasted here for reference):&lt;br /&gt;
&lt;br /&gt;
        reg 0x04 -&amp;gt; 0x00000000&lt;br /&gt;
        reg 0xec -&amp;gt; 0x200100c3&lt;br /&gt;
        reg 0x90 -&amp;gt; 0x00061802&lt;br /&gt;
        reg 0x91 -&amp;gt; 0x0000000a&lt;br /&gt;
        reg 0x80 -&amp;gt; 0x00003144&lt;br /&gt;
        reg 0x93 -&amp;gt; 0x000001f4&lt;br /&gt;
        reg 0xf0 -&amp;gt; 0x000401c8&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=RPM/s|&lt;br /&gt;
type=line|&lt;br /&gt;
x=0.00,200.00,400.00,600.00,800.00,1000.00,1200.00,1400.00,1600.00,1800.00,2000.00,2200.00,2400.00,2600.00,2800.00,3000.00,3200.00|&lt;br /&gt;
y=7101.94,7611.49,6377.73,5601.97,3675.27,2408.02,1860.57,1763.62,1583.96,1071.46,935.91,891.38,776.37,751.01,664.83,612.14,581.51|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid|&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== StealthChop ===&lt;br /&gt;
&lt;br /&gt;
4 Series with StealthChop&lt;br /&gt;
&lt;br /&gt;
        tmcw(TMCR_CHOPCONF,&lt;br /&gt;
                TMC_CHOPCONF_DEDGE |&lt;br /&gt;
                (2 &amp;lt;&amp;lt; TMC_CHOPCONF_TBL_SHIFT) |&lt;br /&gt;
                (7 &amp;lt;&amp;lt; TMC_CHOPCONF_HEND_SHIFT) |&lt;br /&gt;
                (2 &amp;lt;&amp;lt; TMC_CHOPCONF_HSTRT_SHIFT) |&lt;br /&gt;
                (5 &amp;lt;&amp;lt; TMC_CHOPCONF_TOFF_SHIFT));&lt;br /&gt;
        tmcw(TMCR_IHOLD_IRUN,&lt;br /&gt;
                ( 6 &amp;lt;&amp;lt; TMC_IHOLD_IRUN_IHOLDDELAY_SHIFT) |&lt;br /&gt;
                (24 &amp;lt;&amp;lt; TMC_IHOLD_IRUN_IRUN_SHIFT) |&lt;br /&gt;
                ( 3 &amp;lt;&amp;lt; TMC_IHOLD_IRUN_IHOLD_SHIFT));&lt;br /&gt;
        tmcw(TMCR_TPOWER_DOWN, 0x0a);&lt;br /&gt;
        tmcw(TMCR_GCONF,&lt;br /&gt;
                TMC_GCONF_DIAG0_INT_PUSHPULL |&lt;br /&gt;
                TMC_GCONF_DIAG1_PUSHPULL |&lt;br /&gt;
                TMC_GCONF_DIAG1_STALL |&lt;br /&gt;
                TMC_GCONF_DIAG0_OTPW |&lt;br /&gt;
                TMC_GCONF_EN_PWM_MODE&lt;br /&gt;
        );&lt;br /&gt;
        tmcw(TMCR_TPWMTHRS, 0);&lt;br /&gt;
        tmcw(TMCR_PWMCONF,&lt;br /&gt;
                TMC_PWMCONF_PWM_AUTOSCALE |&lt;br /&gt;
                (  1 &amp;lt;&amp;lt; TMC_PWMCONF_PWM_GRAD_SHIFT) |&lt;br /&gt;
                (200 &amp;lt;&amp;lt; TMC_PWMCONF_PWM_AMPL_SHIFT));&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=RPM/s|&lt;br /&gt;
type=line|&lt;br /&gt;
x=0,200.00, 400.00, 600.00, 800.00, 1000.00, 1200.00, 1400.00,1600,1800,2000,2200,2400,2600,2800,3000|&lt;br /&gt;
y1=4652.11,8270.53,6688.88,4508.25,2932.28,2138.08,1581.30,1271.33,1328.75,1022.06|&lt;br /&gt;
y2=4771.72, 7918.49, 6734.86, 5036.72, 3401.45, 2294.83, 1554.91, 1694.32, 1295.62, 1284.12, 723.39, 704.20, 564.93, 578.95, 699.80, 502.95|&lt;br /&gt;
y3=4701.81, 7671.34, 6738.24, 5021.65, 3757.66, 2462.01, 1405.32, 1644.94, 1242.94, 1150.06, 902.61|&lt;br /&gt;
y4=4378.76, 7908.38, 6726.26, 5059.55, 3786.02, 2977.99, 1582.61, 1773.34, 1360.92, 1319.06, 700.13, 593.96, 497.86, 611.02, 609.19, 492.01|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid|&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== SpreadCycle vs. StealthChop at 37V ===&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=RPM/s|&lt;br /&gt;
type=line|&lt;br /&gt;
x=0,200.00, 400.00, 600.00, 800.00, 1000.00, 1200.00, 1400.00,1600,1800,2000,2200,2400,2600,2800,3000,3200|&lt;br /&gt;
y1=7101.94,7611.49,6377.73,5601.97,3675.27,2408.02,1860.57,1763.62,1583.96,1071.46,935.91,891.38,776.37,751.01,664.83,612.14,581.51|&lt;br /&gt;
y2=4771.72, 7918.49, 6734.86, 5036.72, 3401.45, 2294.83, 1554.91, 1694.32, 1295.62, 1284.12, 723.39, 704.20, 564.93, 578.95, 699.80, 502.95|&lt;br /&gt;
y1Title=SpreadCycle|y2Title=StealthChop|legend=Legend|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid|&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Sensille</name></author>	</entry>

	<entry>
		<id>http://3dpfs.sensille.com/index.php?title=Stepper&amp;diff=81</id>
		<title>Stepper</title>
		<link rel="alternate" type="text/html" href="http://3dpfs.sensille.com/index.php?title=Stepper&amp;diff=81"/>
				<updated>2018-05-06T15:16:06Z</updated>
		
		<summary type="html">&lt;p&gt;Sensille: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== General Setup ==&lt;br /&gt;
&lt;br /&gt;
Used Stepper: 17HM19-2004S&lt;br /&gt;
&lt;br /&gt;
Driver Voltage: 37V&lt;br /&gt;
&lt;br /&gt;
Driver: TMC2130&lt;br /&gt;
&lt;br /&gt;
Max RPM reached with the motor, unloaded: 3600RPM&lt;br /&gt;
This is the limit of the driver. It runs from the internal oscillator at 12.1MHz. Measure by giving a 9.765kHz pulse and read out register TSTEP as 0x277 (DEDGE=true).&lt;br /&gt;
&lt;br /&gt;
== Take One, Lifting Weights ==&lt;br /&gt;
&lt;br /&gt;
Driver Configuration is basically the recommended default from the datasheet for a coil current of about 2A:&lt;br /&gt;
 reg 0x6c -&amp;gt; 0x200100c3&lt;br /&gt;
 reg 0x10 -&amp;gt; 0x00061c02&lt;br /&gt;
 reg 0x91 -&amp;gt; 0x0000000a&lt;br /&gt;
 reg 0x80 -&amp;gt; 0x00003144&lt;br /&gt;
 reg 0x93 -&amp;gt; 0x000001f4&lt;br /&gt;
 reg 0xf0 -&amp;gt; 0x000401c8&lt;br /&gt;
&lt;br /&gt;
For very slow step rates stealthChop was disabled&lt;br /&gt;
&lt;br /&gt;
Load Testing at 1/256 microstepping. Testing done lifting a weight by winding a rope on a cylinder with effective radius of 16.5mm.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Weightlifting.jpeg|Weight Lifting Setup&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 9.5kHz 2250g&lt;br /&gt;
 19.5kHz 2150g &lt;br /&gt;
 39kHz 2240g&lt;br /&gt;
 58.5kHz 2220g&lt;br /&gt;
 78kHz 2240g&lt;br /&gt;
 97.5kHz 2230g&lt;br /&gt;
 117kHz 2230g&lt;br /&gt;
 137kHz 2130g&lt;br /&gt;
 156kHz 2150g&lt;br /&gt;
 195kHz 2030g &lt;br /&gt;
 234kHz 2050g&lt;br /&gt;
 312kHz 2030g&lt;br /&gt;
 468kHz 1700g&lt;br /&gt;
 624kHz 1300g&lt;br /&gt;
 936kHz 740g&lt;br /&gt;
 1092kHz 556g&lt;br /&gt;
 1400kHz 250g&lt;br /&gt;
 1700kHz 150g&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=Torque in Ncm|&lt;br /&gt;
legend=Legend|&lt;br /&gt;
type=line|&lt;br /&gt;
x=11.13,22.85,45.70,68.55,91.41,114.26,137.11,160.55,182.81,228.52,274.22,365.62,548.44,731.25,1096.88,1279.69,1640.62,1992.19|&lt;br /&gt;
y1=37.12,35.48,36.96,36.63,36.96,36.80,36.80,35.14,35.48,33.49,33.82,33.49,28.05,21.45,12.21,9.17,4.12,2.47|&lt;br /&gt;
y1Title=Measured|&lt;br /&gt;
y2=,,,,24,26,32,34,34,34.5,36,35.5,34,16|&lt;br /&gt;
y2Title=From Datasheet (rough estimate)|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid|&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Source for torque curve from datasheet: https://www.omc-stepperonline.com/download/17HM19-2004S_Torque_Curve.pdf&lt;br /&gt;
&lt;br /&gt;
Full data sheet of the motor: https://www.omc-stepperonline.com/download/17HM19-2004S.pdf&lt;br /&gt;
&lt;br /&gt;
== Take Two, Weight Spinning ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Gallery&amp;gt;&lt;br /&gt;
Weightspinning.jpeg|Setup for torque measurement by a spinning weight&lt;br /&gt;
&amp;lt;/Gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The idea here is to measure the torque at a given RPM by testing how fast the stepper can accelerate to a higher RPM. This way the measurement is not limit to the length of a linear motion as in the previous chapter.&lt;br /&gt;
&lt;br /&gt;
=== Lost step detection ===&lt;br /&gt;
&lt;br /&gt;
With each round the rotor goes through a photo interruptor. The controller has an internal counter to keep track of the current angle with respect to an arbitrary reference. The home command puts the controller into a mode where it resets the counter if the rotor goes through the interruptor. After that, with each round it checks if the interruptor signal asserts during a given window around the reference. The window can be programmed and is currently set to +/- 4 full steps.&lt;br /&gt;
&lt;br /&gt;
=== Measurement ===&lt;br /&gt;
&lt;br /&gt;
We spin the motor to the RPM under test and try to accelerate it to the next higher RPM level. We use the interruptor signal to detect lost steps.&lt;br /&gt;
The acceleration directly corresponds to the torque the motor can generate at the given RPM.&lt;br /&gt;
&lt;br /&gt;
We now have a detailed torque curve RPM vs. Ncm.&lt;br /&gt;
&lt;br /&gt;
Do the same for deceleration&lt;br /&gt;
&lt;br /&gt;
Repeat everything with the other set of weights.&lt;br /&gt;
&lt;br /&gt;
=== 1st Series ===&lt;br /&gt;
&lt;br /&gt;
The following graph shows the max acceleration in RPM/s in steps of 200 RPM.&lt;br /&gt;
&lt;br /&gt;
Driver config (just pasted here for reference):&lt;br /&gt;
&lt;br /&gt;
        reg 0x04 -&amp;gt; 0x00000000&lt;br /&gt;
        reg 0xec -&amp;gt; 0x200100c3&lt;br /&gt;
        reg 0x90 -&amp;gt; 0x00061802&lt;br /&gt;
        reg 0x91 -&amp;gt; 0x0000000a&lt;br /&gt;
        reg 0x80 -&amp;gt; 0x00003144&lt;br /&gt;
        reg 0x93 -&amp;gt; 0x000001f4&lt;br /&gt;
        reg 0xf0 -&amp;gt; 0x000401c8&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=RPM/s|&lt;br /&gt;
type=line|&lt;br /&gt;
x=0.00,200.00,400.00,600.00,800.00,1000.00,1200.00,1400.00,1600.00,1800.00,2000.00,2200.00,2400.00,2600.00,2800.00,3000.00,3200.00|&lt;br /&gt;
y=7101.94,7611.49,6377.73,5601.97,3675.27,2408.02,1860.57,1763.62,1583.96,1071.46,935.91,891.38,776.37,751.01,664.83,612.14,581.51|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid|&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== StealthChop ===&lt;br /&gt;
&lt;br /&gt;
4 Series with StealthChop&lt;br /&gt;
&lt;br /&gt;
        tmcw(TMCR_CHOPCONF,&lt;br /&gt;
                TMC_CHOPCONF_DEDGE |&lt;br /&gt;
                (2 &amp;lt;&amp;lt; TMC_CHOPCONF_TBL_SHIFT) |&lt;br /&gt;
                (7 &amp;lt;&amp;lt; TMC_CHOPCONF_HEND_SHIFT) |&lt;br /&gt;
                (2 &amp;lt;&amp;lt; TMC_CHOPCONF_HSTRT_SHIFT) |&lt;br /&gt;
                (5 &amp;lt;&amp;lt; TMC_CHOPCONF_TOFF_SHIFT));&lt;br /&gt;
        tmcw(TMCR_IHOLD_IRUN,&lt;br /&gt;
                ( 6 &amp;lt;&amp;lt; TMC_IHOLD_IRUN_IHOLDDELAY_SHIFT) |&lt;br /&gt;
                (24 &amp;lt;&amp;lt; TMC_IHOLD_IRUN_IRUN_SHIFT) |&lt;br /&gt;
                ( 3 &amp;lt;&amp;lt; TMC_IHOLD_IRUN_IHOLD_SHIFT));&lt;br /&gt;
        tmcw(TMCR_TPOWER_DOWN, 0x0a);&lt;br /&gt;
        tmcw(TMCR_GCONF,&lt;br /&gt;
                TMC_GCONF_DIAG0_INT_PUSHPULL |&lt;br /&gt;
                TMC_GCONF_DIAG1_PUSHPULL |&lt;br /&gt;
                TMC_GCONF_DIAG1_STALL |&lt;br /&gt;
                TMC_GCONF_DIAG0_OTPW |&lt;br /&gt;
                TMC_GCONF_EN_PWM_MODE&lt;br /&gt;
        );&lt;br /&gt;
        tmcw(TMCR_TPWMTHRS, 0);&lt;br /&gt;
        tmcw(TMCR_PWMCONF,&lt;br /&gt;
                TMC_PWMCONF_PWM_AUTOSCALE |&lt;br /&gt;
                (  1 &amp;lt;&amp;lt; TMC_PWMCONF_PWM_GRAD_SHIFT) |&lt;br /&gt;
                (200 &amp;lt;&amp;lt; TMC_PWMCONF_PWM_AMPL_SHIFT));&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=RPM/s|&lt;br /&gt;
type=line|&lt;br /&gt;
x=0,200.00, 400.00, 600.00, 800.00, 1000.00, 1200.00, 1400.00,1600,1800,2000,2200,2400,2600,2800,3000|&lt;br /&gt;
y1=4652.11,8270.53,6688.88,4508.25,2932.28,2138.08,1581.30,1271.33,1328.75,1022.06|&lt;br /&gt;
y2=4771.72, 7918.49, 6734.86, 5036.72, 3401.45, 2294.83, 1554.91, 1694.32, 1295.62, 1284.12, 723.39, 704.20, 564.93, 578.95, 699.80, 502.95|&lt;br /&gt;
y3=4701.81, 7671.34, 6738.24, 5021.65, 3757.66, 2462.01, 1405.32, 1644.94, 1242.94, 1150.06, 902.61|&lt;br /&gt;
y4=4378.76, 7908.38, 6726.26, 5059.55, 3786.02, 2977.99, 1582.61, 1773.34, 1360.92, 1319.06, 700.13, 593.96, 497.86, 611.02, 609.19, 492.01|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid|&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Sensille</name></author>	</entry>

	<entry>
		<id>http://3dpfs.sensille.com/index.php?title=Stepper&amp;diff=80</id>
		<title>Stepper</title>
		<link rel="alternate" type="text/html" href="http://3dpfs.sensille.com/index.php?title=Stepper&amp;diff=80"/>
				<updated>2018-05-05T20:27:55Z</updated>
		
		<summary type="html">&lt;p&gt;Sensille: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== General Setup ==&lt;br /&gt;
&lt;br /&gt;
Used Stepper: 17HM19-2004S&lt;br /&gt;
&lt;br /&gt;
Driver Voltage: 37V&lt;br /&gt;
&lt;br /&gt;
Driver: TMC2130&lt;br /&gt;
&lt;br /&gt;
Max RPM reached with the motor, unloaded: 3600RPM&lt;br /&gt;
This is the limit of the driver. It runs from the internal oscillator at 12.1MHz. Measure by giving a 9.765kHz pulse and read out register TSTEP as 0x277 (DEDGE=true).&lt;br /&gt;
&lt;br /&gt;
== Take One, Lifting Weights ==&lt;br /&gt;
&lt;br /&gt;
Driver Configuration is basically the recommended default from the datasheet for a coil current of about 2A:&lt;br /&gt;
 reg 0x6c -&amp;gt; 0x200100c3&lt;br /&gt;
 reg 0x10 -&amp;gt; 0x00061c02&lt;br /&gt;
 reg 0x91 -&amp;gt; 0x0000000a&lt;br /&gt;
 reg 0x80 -&amp;gt; 0x00003144&lt;br /&gt;
 reg 0x93 -&amp;gt; 0x000001f4&lt;br /&gt;
 reg 0xf0 -&amp;gt; 0x000401c8&lt;br /&gt;
&lt;br /&gt;
For very slow step rates stealthChop was disabled&lt;br /&gt;
&lt;br /&gt;
Load Testing at 1/256 microstepping. Testing done lifting a weight by winding a rope on a cylinder with effective radius of 16.5mm.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Weightlifting.jpeg|Weight Lifting Setup&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 9.5kHz 2250g&lt;br /&gt;
 19.5kHz 2150g &lt;br /&gt;
 39kHz 2240g&lt;br /&gt;
 58.5kHz 2220g&lt;br /&gt;
 78kHz 2240g&lt;br /&gt;
 97.5kHz 2230g&lt;br /&gt;
 117kHz 2230g&lt;br /&gt;
 137kHz 2130g&lt;br /&gt;
 156kHz 2150g&lt;br /&gt;
 195kHz 2030g &lt;br /&gt;
 234kHz 2050g&lt;br /&gt;
 312kHz 2030g&lt;br /&gt;
 468kHz 1700g&lt;br /&gt;
 624kHz 1300g&lt;br /&gt;
 936kHz 740g&lt;br /&gt;
 1092kHz 556g&lt;br /&gt;
 1400kHz 250g&lt;br /&gt;
 1700kHz 150g&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=Torque in Ncm|&lt;br /&gt;
legend=Legend|&lt;br /&gt;
type=line|&lt;br /&gt;
x=11.13,22.85,45.70,68.55,91.41,114.26,137.11,160.55,182.81,228.52,274.22,365.62,548.44,731.25,1096.88,1279.69,1640.62,1992.19|&lt;br /&gt;
y1=37.12,35.48,36.96,36.63,36.96,36.80,36.80,35.14,35.48,33.49,33.82,33.49,28.05,21.45,12.21,9.17,4.12,2.47|&lt;br /&gt;
y1Title=Measured|&lt;br /&gt;
y2=,,,,24,26,32,34,34,34.5,36,35.5,34,16|&lt;br /&gt;
y2Title=From Datasheet (rough estimate)|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid|&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Source for torque curve from datasheet: https://www.omc-stepperonline.com/download/17HM19-2004S_Torque_Curve.pdf&lt;br /&gt;
&lt;br /&gt;
Full data sheet of the motor: https://www.omc-stepperonline.com/download/17HM19-2004S.pdf&lt;br /&gt;
&lt;br /&gt;
== Take Two, Weight Spinning ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Gallery&amp;gt;&lt;br /&gt;
Weightspinning.jpeg|Setup for torque measurement by a spinning weight&lt;br /&gt;
&amp;lt;/Gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The idea here is to measure the torque at a given RPM by testing how fast the stepper can accelerate to a higher RPM. This way the measurement is not limit to the length of a linear motion as in the previous chapter.&lt;br /&gt;
&lt;br /&gt;
=== Lost step detection ===&lt;br /&gt;
&lt;br /&gt;
With each round the rotor goes through a photo interruptor. The controller has an internal counter to keep track of the current angle with respect to an arbitrary reference. The home command puts the controller into a mode where it resets the counter if the rotor goes through the interruptor. After that, with each round it checks if the interruptor signal asserts during a given window around the reference. The window can be programmed and is currently set to +/- 4 full steps.&lt;br /&gt;
&lt;br /&gt;
=== Measurement ===&lt;br /&gt;
&lt;br /&gt;
We spin the motor to the RPM under test and try to accelerate it to the next higher RPM level. We use the interruptor signal to detect lost steps.&lt;br /&gt;
The acceleration directly corresponds to the torque the motor can generate at the given RPM.&lt;br /&gt;
&lt;br /&gt;
We now have a detailed torque curve RPM vs. Ncm.&lt;br /&gt;
&lt;br /&gt;
Do the same for deceleration&lt;br /&gt;
&lt;br /&gt;
Repeat everything with the other set of weights.&lt;br /&gt;
&lt;br /&gt;
=== 1st Series ===&lt;br /&gt;
&lt;br /&gt;
The following graph shows the max acceleration in RPM/s in steps of 200 RPM.&lt;br /&gt;
&lt;br /&gt;
Driver config (just pasted here for reference):&lt;br /&gt;
&lt;br /&gt;
        reg 0x04 -&amp;gt; 0x00000000&lt;br /&gt;
        reg 0xec -&amp;gt; 0x200100c3&lt;br /&gt;
        reg 0x90 -&amp;gt; 0x00061802&lt;br /&gt;
        reg 0x91 -&amp;gt; 0x0000000a&lt;br /&gt;
        reg 0x80 -&amp;gt; 0x00003144&lt;br /&gt;
        reg 0x93 -&amp;gt; 0x000001f4&lt;br /&gt;
        reg 0xf0 -&amp;gt; 0x000401c8&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=RPM/s|&lt;br /&gt;
type=line|&lt;br /&gt;
x=0.00,200.00,400.00,600.00,800.00,1000.00,1200.00,1400.00,1600.00,1800.00,2000.00,2200.00,2400.00,2600.00,2800.00,3000.00,3200.00|&lt;br /&gt;
y=7101.94,7611.49,6377.73,5601.97,3675.27,2408.02,1860.57,1763.62,1583.96,1071.46,935.91,891.38,776.37,751.01,664.83,612.14,581.51|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid|&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== StealthChop&lt;br /&gt;
&lt;br /&gt;
4 Series with StealthChop&lt;br /&gt;
&lt;br /&gt;
        tmcw(TMCR_CHOPCONF,&lt;br /&gt;
                TMC_CHOPCONF_DEDGE |&lt;br /&gt;
                (2 &amp;lt;&amp;lt; TMC_CHOPCONF_TBL_SHIFT) |&lt;br /&gt;
                (7 &amp;lt;&amp;lt; TMC_CHOPCONF_HEND_SHIFT) |&lt;br /&gt;
                (2 &amp;lt;&amp;lt; TMC_CHOPCONF_HSTRT_SHIFT) |&lt;br /&gt;
                (5 &amp;lt;&amp;lt; TMC_CHOPCONF_TOFF_SHIFT));&lt;br /&gt;
        tmcw(TMCR_IHOLD_IRUN,&lt;br /&gt;
                ( 6 &amp;lt;&amp;lt; TMC_IHOLD_IRUN_IHOLDDELAY_SHIFT) |&lt;br /&gt;
                (24 &amp;lt;&amp;lt; TMC_IHOLD_IRUN_IRUN_SHIFT) |&lt;br /&gt;
                ( 3 &amp;lt;&amp;lt; TMC_IHOLD_IRUN_IHOLD_SHIFT));&lt;br /&gt;
        tmcw(TMCR_TPOWER_DOWN, 0x0a);&lt;br /&gt;
        tmcw(TMCR_GCONF,&lt;br /&gt;
                TMC_GCONF_DIAG0_INT_PUSHPULL |&lt;br /&gt;
                TMC_GCONF_DIAG1_PUSHPULL |&lt;br /&gt;
                TMC_GCONF_DIAG1_STALL |&lt;br /&gt;
                TMC_GCONF_DIAG0_OTPW |&lt;br /&gt;
                TMC_GCONF_EN_PWM_MODE&lt;br /&gt;
        );&lt;br /&gt;
        tmcw(TMCR_TPWMTHRS, 0);&lt;br /&gt;
        tmcw(TMCR_PWMCONF,&lt;br /&gt;
                TMC_PWMCONF_PWM_AUTOSCALE |&lt;br /&gt;
                (  1 &amp;lt;&amp;lt; TMC_PWMCONF_PWM_GRAD_SHIFT) |&lt;br /&gt;
                (200 &amp;lt;&amp;lt; TMC_PWMCONF_PWM_AMPL_SHIFT));&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=RPM/s|&lt;br /&gt;
type=line|&lt;br /&gt;
x=0,200.00, 400.00, 600.00, 800.00, 1000.00, 1200.00, 1400.00,1600,1800,2000,2200,2400,2600,2800,3000|&lt;br /&gt;
y1=4652.11,8270.53,6688.88,4508.25,2932.28,2138.08,1581.30,1271.33,1328.75,1022.06|&lt;br /&gt;
y2=4771.72, 7918.49, 6734.86, 5036.72, 3401.45, 2294.83, 1554.91, 1694.32, 1295.62, 1284.12, 723.39, 704.20, 564.93, 578.95, 699.80, 502.95|&lt;br /&gt;
y3=4701.81, 7671.34, 6738.24, 5021.65, 3757.66, 2462.01, 1405.32, 1644.94, 1242.94, 1150.06, 902.61|&lt;br /&gt;
y4=4378.76, 7908.38, 6726.26, 5059.55, 3786.02, 2977.99, 1582.61, 1773.34, 1360.92, 1319.06, 700.13, 593.96, 497.86, 611.02, 609.19, 492.01|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid|&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Sensille</name></author>	</entry>

	<entry>
		<id>http://3dpfs.sensille.com/index.php?title=Stepper&amp;diff=79</id>
		<title>Stepper</title>
		<link rel="alternate" type="text/html" href="http://3dpfs.sensille.com/index.php?title=Stepper&amp;diff=79"/>
				<updated>2018-05-05T20:27:28Z</updated>
		
		<summary type="html">&lt;p&gt;Sensille: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== General Setup ==&lt;br /&gt;
&lt;br /&gt;
Used Stepper: 17HM19-2004S&lt;br /&gt;
&lt;br /&gt;
Driver Voltage: 37V&lt;br /&gt;
&lt;br /&gt;
Driver: TMC2130&lt;br /&gt;
&lt;br /&gt;
Max RPM reached with the motor, unloaded: 3600RPM&lt;br /&gt;
This is the limit of the driver. It runs from the internal oscillator at 12.1MHz. Measure by giving a 9.765kHz pulse and read out register TSTEP as 0x277 (DEDGE=true).&lt;br /&gt;
&lt;br /&gt;
== Take One, Lifting Weights ==&lt;br /&gt;
&lt;br /&gt;
Driver Configuration is basically the recommended default from the datasheet for a coil current of about 2A:&lt;br /&gt;
 reg 0x6c -&amp;gt; 0x200100c3&lt;br /&gt;
 reg 0x10 -&amp;gt; 0x00061c02&lt;br /&gt;
 reg 0x91 -&amp;gt; 0x0000000a&lt;br /&gt;
 reg 0x80 -&amp;gt; 0x00003144&lt;br /&gt;
 reg 0x93 -&amp;gt; 0x000001f4&lt;br /&gt;
 reg 0xf0 -&amp;gt; 0x000401c8&lt;br /&gt;
&lt;br /&gt;
For very slow step rates stealthChop was disabled&lt;br /&gt;
&lt;br /&gt;
Load Testing at 1/256 microstepping. Testing done lifting a weight by winding a rope on a cylinder with effective radius of 16.5mm.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Weightlifting.jpeg|Weight Lifting Setup&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 9.5kHz 2250g&lt;br /&gt;
 19.5kHz 2150g &lt;br /&gt;
 39kHz 2240g&lt;br /&gt;
 58.5kHz 2220g&lt;br /&gt;
 78kHz 2240g&lt;br /&gt;
 97.5kHz 2230g&lt;br /&gt;
 117kHz 2230g&lt;br /&gt;
 137kHz 2130g&lt;br /&gt;
 156kHz 2150g&lt;br /&gt;
 195kHz 2030g &lt;br /&gt;
 234kHz 2050g&lt;br /&gt;
 312kHz 2030g&lt;br /&gt;
 468kHz 1700g&lt;br /&gt;
 624kHz 1300g&lt;br /&gt;
 936kHz 740g&lt;br /&gt;
 1092kHz 556g&lt;br /&gt;
 1400kHz 250g&lt;br /&gt;
 1700kHz 150g&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=Torque in Ncm|&lt;br /&gt;
legend=Legend|&lt;br /&gt;
type=line|&lt;br /&gt;
x=11.13,22.85,45.70,68.55,91.41,114.26,137.11,160.55,182.81,228.52,274.22,365.62,548.44,731.25,1096.88,1279.69,1640.62,1992.19|&lt;br /&gt;
y1=37.12,35.48,36.96,36.63,36.96,36.80,36.80,35.14,35.48,33.49,33.82,33.49,28.05,21.45,12.21,9.17,4.12,2.47|&lt;br /&gt;
y1Title=Measured|&lt;br /&gt;
y2=,,,,24,26,32,34,34,34.5,36,35.5,34,16|&lt;br /&gt;
y2Title=From Datasheet (rough estimate)|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid|&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Source for torque curve from datasheet: https://www.omc-stepperonline.com/download/17HM19-2004S_Torque_Curve.pdf&lt;br /&gt;
&lt;br /&gt;
Full data sheet of the motor: https://www.omc-stepperonline.com/download/17HM19-2004S.pdf&lt;br /&gt;
&lt;br /&gt;
== Take Two, Weight Spinning ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Gallery&amp;gt;&lt;br /&gt;
Weightspinning.jpeg|Setup for torque measurement by a spinning weight&lt;br /&gt;
&amp;lt;/Gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The idea here is to measure the torque at a given RPM by testing how fast the stepper can accelerate to a higher RPM. This way the measurement is not limit to the length of a linear motion as in the previous chapter.&lt;br /&gt;
&lt;br /&gt;
=== Lost step detection ===&lt;br /&gt;
&lt;br /&gt;
With each round the rotor goes through a photo interruptor. The controller has an internal counter to keep track of the current angle with respect to an arbitrary reference. The home command puts the controller into a mode where it resets the counter if the rotor goes through the interruptor. After that, with each round it checks if the interruptor signal asserts during a given window around the reference. The window can be programmed and is currently set to +/- 4 full steps.&lt;br /&gt;
&lt;br /&gt;
=== Measurement ===&lt;br /&gt;
&lt;br /&gt;
We spin the motor to the RPM under test and try to accelerate it to the next higher RPM level. We use the interruptor signal to detect lost steps.&lt;br /&gt;
The acceleration directly corresponds to the torque the motor can generate at the given RPM.&lt;br /&gt;
&lt;br /&gt;
We now have a detailed torque curve RPM vs. Ncm.&lt;br /&gt;
&lt;br /&gt;
Do the same for deceleration&lt;br /&gt;
&lt;br /&gt;
Repeat everything with the other set of weights.&lt;br /&gt;
&lt;br /&gt;
=== 1st Series ===&lt;br /&gt;
&lt;br /&gt;
The following graph shows the max acceleration in RPM/s in steps of 200 RPM.&lt;br /&gt;
&lt;br /&gt;
Driver config (just pasted here for reference):&lt;br /&gt;
&lt;br /&gt;
        reg 0x04 -&amp;gt; 0x00000000&lt;br /&gt;
        reg 0xec -&amp;gt; 0x200100c3&lt;br /&gt;
        reg 0x90 -&amp;gt; 0x00061802&lt;br /&gt;
        reg 0x91 -&amp;gt; 0x0000000a&lt;br /&gt;
        reg 0x80 -&amp;gt; 0x00003144&lt;br /&gt;
        reg 0x93 -&amp;gt; 0x000001f4&lt;br /&gt;
        reg 0xf0 -&amp;gt; 0x000401c8&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=RPM/s|&lt;br /&gt;
type=line|&lt;br /&gt;
x=0.00,200.00,400.00,600.00,800.00,1000.00,1200.00,1400.00,1600.00,1800.00,2000.00,2200.00,2400.00,2600.00,2800.00,3000.00,3200.00|&lt;br /&gt;
y=7101.94,7611.49,6377.73,5601.97,3675.27,2408.02,1860.57,1763.62,1583.96,1071.46,935.91,891.38,776.37,751.01,664.83,612.14,581.51|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid|&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== StealthChop&lt;br /&gt;
&lt;br /&gt;
4 Series with StealthChop&lt;br /&gt;
&lt;br /&gt;
        tmcw(TMCR_CHOPCONF,&lt;br /&gt;
                TMC_CHOPCONF_DEDGE |&lt;br /&gt;
                (2 &amp;lt;&amp;lt; TMC_CHOPCONF_TBL_SHIFT) |&lt;br /&gt;
                (7 &amp;lt;&amp;lt; TMC_CHOPCONF_HEND_SHIFT) |&lt;br /&gt;
                (2 &amp;lt;&amp;lt; TMC_CHOPCONF_HSTRT_SHIFT) |&lt;br /&gt;
                (5 &amp;lt;&amp;lt; TMC_CHOPCONF_TOFF_SHIFT));&lt;br /&gt;
        tmcw(TMCR_IHOLD_IRUN,&lt;br /&gt;
                ( 6 &amp;lt;&amp;lt; TMC_IHOLD_IRUN_IHOLDDELAY_SHIFT) |&lt;br /&gt;
                (24 &amp;lt;&amp;lt; TMC_IHOLD_IRUN_IRUN_SHIFT) |&lt;br /&gt;
                ( 3 &amp;lt;&amp;lt; TMC_IHOLD_IRUN_IHOLD_SHIFT));&lt;br /&gt;
        tmcw(TMCR_TPOWER_DOWN, 0x0a);&lt;br /&gt;
        tmcw(TMCR_GCONF,&lt;br /&gt;
                TMC_GCONF_DIAG0_INT_PUSHPULL |&lt;br /&gt;
                TMC_GCONF_DIAG1_PUSHPULL |&lt;br /&gt;
                TMC_GCONF_DIAG1_STALL |&lt;br /&gt;
                TMC_GCONF_DIAG0_OTPW |&lt;br /&gt;
                TMC_GCONF_EN_PWM_MODE&lt;br /&gt;
        );&lt;br /&gt;
        tmcw(TMCR_TPWMTHRS, 0);&lt;br /&gt;
        tmcw(TMCR_PWMCONF,&lt;br /&gt;
                TMC_PWMCONF_PWM_AUTOSCALE |&lt;br /&gt;
                (  1 &amp;lt;&amp;lt; TMC_PWMCONF_PWM_GRAD_SHIFT) |&lt;br /&gt;
                (200 &amp;lt;&amp;lt; TMC_PWMCONF_PWM_AMPL_SHIFT));&lt;br /&gt;
  tmc write to 6C data 200103A5&lt;br /&gt;
  tmc write to 10 data 61803&lt;br /&gt;
  tmc write to 11 data A&lt;br /&gt;
  tmc write to 0 data 3144&lt;br /&gt;
  tmc write to 13 data 0&lt;br /&gt;
  tmc write to 70 data 401C8&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=RPM/s|&lt;br /&gt;
type=line|&lt;br /&gt;
x=0,200.00, 400.00, 600.00, 800.00, 1000.00, 1200.00, 1400.00,1600,1800,2000,2200,2400,2600,2800,3000|&lt;br /&gt;
y1=4652.11,8270.53,6688.88,4508.25,2932.28,2138.08,1581.30,1271.33,1328.75,1022.06|&lt;br /&gt;
y2=4771.72, 7918.49, 6734.86, 5036.72, 3401.45, 2294.83, 1554.91, 1694.32, 1295.62, 1284.12, 723.39, 704.20, 564.93, 578.95, 699.80, 502.95|&lt;br /&gt;
y3=4701.81, 7671.34, 6738.24, 5021.65, 3757.66, 2462.01, 1405.32, 1644.94, 1242.94, 1150.06, 902.61|&lt;br /&gt;
y4=4378.76, 7908.38, 6726.26, 5059.55, 3786.02, 2977.99, 1582.61, 1773.34, 1360.92, 1319.06, 700.13, 593.96, 497.86, 611.02, 609.19, 492.01|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid|&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Sensille</name></author>	</entry>

	<entry>
		<id>http://3dpfs.sensille.com/index.php?title=Stepper&amp;diff=78</id>
		<title>Stepper</title>
		<link rel="alternate" type="text/html" href="http://3dpfs.sensille.com/index.php?title=Stepper&amp;diff=78"/>
				<updated>2018-05-01T08:34:48Z</updated>
		
		<summary type="html">&lt;p&gt;Sensille: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== General Setup ==&lt;br /&gt;
&lt;br /&gt;
Used Stepper: 17HM19-2004S&lt;br /&gt;
&lt;br /&gt;
Driver Voltage: 37V&lt;br /&gt;
&lt;br /&gt;
Driver: TMC2130&lt;br /&gt;
&lt;br /&gt;
Max RPM reached with the motor, unloaded: 3600RPM&lt;br /&gt;
This is the limit of the driver. It runs from the internal oscillator at 12.1MHz. Measure by giving a 9.765kHz pulse and read out register TSTEP as 0x277 (DEDGE=true).&lt;br /&gt;
&lt;br /&gt;
== Take One, Lifting Weights ==&lt;br /&gt;
&lt;br /&gt;
Driver Configuration is basically the recommended default from the datasheet for a coil current of about 2A:&lt;br /&gt;
 reg 0x6c -&amp;gt; 0x200100c3&lt;br /&gt;
 reg 0x10 -&amp;gt; 0x00061c02&lt;br /&gt;
 reg 0x91 -&amp;gt; 0x0000000a&lt;br /&gt;
 reg 0x80 -&amp;gt; 0x00003144&lt;br /&gt;
 reg 0x93 -&amp;gt; 0x000001f4&lt;br /&gt;
 reg 0xf0 -&amp;gt; 0x000401c8&lt;br /&gt;
&lt;br /&gt;
For very slow step rates stealthChop was disabled&lt;br /&gt;
&lt;br /&gt;
Load Testing at 1/256 microstepping. Testing done lifting a weight by winding a rope on a cylinder with effective radius of 16.5mm.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Weightlifting.jpeg|Weight Lifting Setup&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 9.5kHz 2250g&lt;br /&gt;
 19.5kHz 2150g &lt;br /&gt;
 39kHz 2240g&lt;br /&gt;
 58.5kHz 2220g&lt;br /&gt;
 78kHz 2240g&lt;br /&gt;
 97.5kHz 2230g&lt;br /&gt;
 117kHz 2230g&lt;br /&gt;
 137kHz 2130g&lt;br /&gt;
 156kHz 2150g&lt;br /&gt;
 195kHz 2030g &lt;br /&gt;
 234kHz 2050g&lt;br /&gt;
 312kHz 2030g&lt;br /&gt;
 468kHz 1700g&lt;br /&gt;
 624kHz 1300g&lt;br /&gt;
 936kHz 740g&lt;br /&gt;
 1092kHz 556g&lt;br /&gt;
 1400kHz 250g&lt;br /&gt;
 1700kHz 150g&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=Torque in Ncm|&lt;br /&gt;
legend=Legend|&lt;br /&gt;
type=line|&lt;br /&gt;
x=11.13,22.85,45.70,68.55,91.41,114.26,137.11,160.55,182.81,228.52,274.22,365.62,548.44,731.25,1096.88,1279.69,1640.62,1992.19|&lt;br /&gt;
y1=37.12,35.48,36.96,36.63,36.96,36.80,36.80,35.14,35.48,33.49,33.82,33.49,28.05,21.45,12.21,9.17,4.12,2.47|&lt;br /&gt;
y1Title=Measured|&lt;br /&gt;
y2=,,,,24,26,32,34,34,34.5,36,35.5,34,16|&lt;br /&gt;
y2Title=From Datasheet (rough estimate)|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid|&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Source for torque curve from datasheet: https://www.omc-stepperonline.com/download/17HM19-2004S_Torque_Curve.pdf&lt;br /&gt;
&lt;br /&gt;
Full data sheet of the motor: https://www.omc-stepperonline.com/download/17HM19-2004S.pdf&lt;br /&gt;
&lt;br /&gt;
== Take Two, Weight Spinning ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Gallery&amp;gt;&lt;br /&gt;
Weightspinning.jpeg|Setup for torque measurement by a spinning weight&lt;br /&gt;
&amp;lt;/Gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The idea here is to measure the torque at a given RPM by testing how fast the stepper can accelerate to a higher RPM. This way the measurement is not limit to the length of a linear motion as in the previous chapter.&lt;br /&gt;
&lt;br /&gt;
=== Lost step detection ===&lt;br /&gt;
&lt;br /&gt;
With each round the rotor goes through a photo interruptor. The controller has an internal counter to keep track of the current angle with respect to an arbitrary reference. The home command puts the controller into a mode where it resets the counter if the rotor goes through the interruptor. After that, with each round it checks if the interruptor signal asserts during a given window around the reference. The window can be programmed and is currently set to +/- 4 full steps.&lt;br /&gt;
&lt;br /&gt;
=== Measurement ===&lt;br /&gt;
&lt;br /&gt;
We spin the motor to the RPM under test and try to accelerate it to the next higher RPM level. We use the interruptor signal to detect lost steps.&lt;br /&gt;
The acceleration directly corresponds to the torque the motor can generate at the given RPM.&lt;br /&gt;
&lt;br /&gt;
We now have a detailed torque curve RPM vs. Ncm.&lt;br /&gt;
&lt;br /&gt;
Do the same for deceleration&lt;br /&gt;
&lt;br /&gt;
Repeat everything with the other set of weights.&lt;br /&gt;
&lt;br /&gt;
=== 1st Series ===&lt;br /&gt;
&lt;br /&gt;
The following graph shows the max acceleration in RPM/s in steps of 200 RPM.&lt;br /&gt;
&lt;br /&gt;
Driver config (just pasted here for reference):&lt;br /&gt;
&lt;br /&gt;
        reg 0x04 -&amp;gt; 0x00000000&lt;br /&gt;
        reg 0xec -&amp;gt; 0x200100c3&lt;br /&gt;
        reg 0x90 -&amp;gt; 0x00061802&lt;br /&gt;
        reg 0x91 -&amp;gt; 0x0000000a&lt;br /&gt;
        reg 0x80 -&amp;gt; 0x00003144&lt;br /&gt;
        reg 0x93 -&amp;gt; 0x000001f4&lt;br /&gt;
        reg 0xf0 -&amp;gt; 0x000401c8&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=RPM/s|&lt;br /&gt;
type=line|&lt;br /&gt;
x=0.00,200.00,400.00,600.00,800.00,1000.00,1200.00,1400.00,1600.00,1800.00,2000.00,2200.00,2400.00,2600.00,2800.00,3000.00,3200.00|&lt;br /&gt;
y=7101.94,7611.49,6377.73,5601.97,3675.27,2408.02,1860.57,1763.62,1583.96,1071.46,935.91,891.38,776.37,751.01,664.83,612.14,581.51|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid|&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Sensille</name></author>	</entry>

	<entry>
		<id>http://3dpfs.sensille.com/index.php?title=Stepper&amp;diff=77</id>
		<title>Stepper</title>
		<link rel="alternate" type="text/html" href="http://3dpfs.sensille.com/index.php?title=Stepper&amp;diff=77"/>
				<updated>2018-05-01T08:32:20Z</updated>
		
		<summary type="html">&lt;p&gt;Sensille: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== General Setup ==&lt;br /&gt;
&lt;br /&gt;
Used Stepper: 17HM19-2004S&lt;br /&gt;
&lt;br /&gt;
Driver Voltage: 37V&lt;br /&gt;
&lt;br /&gt;
Driver: TMC2130&lt;br /&gt;
&lt;br /&gt;
Max RPM reached with the motor, unloaded: 3600RPM&lt;br /&gt;
This is the limit of the driver. It runs from the internal oscillator at 12.1MHz. Measure by giving a 9.765kHz pulse and read out register TSTEP as 0x277 (DEDGE=true).&lt;br /&gt;
&lt;br /&gt;
== Take One, Lifting Weights ==&lt;br /&gt;
&lt;br /&gt;
Driver Configuration is basically the recommended default from the datasheet for a coil current of about 2A:&lt;br /&gt;
 reg 0x6c -&amp;gt; 0x200100c3&lt;br /&gt;
 reg 0x10 -&amp;gt; 0x00061c02&lt;br /&gt;
 reg 0x91 -&amp;gt; 0x0000000a&lt;br /&gt;
 reg 0x80 -&amp;gt; 0x00003144&lt;br /&gt;
 reg 0x93 -&amp;gt; 0x000001f4&lt;br /&gt;
 reg 0xf0 -&amp;gt; 0x000401c8&lt;br /&gt;
&lt;br /&gt;
For very slow step rates stealthChop was disabled&lt;br /&gt;
&lt;br /&gt;
Load Testing at 1/256 microstepping. Testing done lifting a weight by winding a rope on a cylinder with effective radius of 16.5mm.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Weightlifting.jpeg|Weight Lifting Setup&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 9.5kHz 2250g&lt;br /&gt;
 19.5kHz 2150g &lt;br /&gt;
 39kHz 2240g&lt;br /&gt;
 58.5kHz 2220g&lt;br /&gt;
 78kHz 2240g&lt;br /&gt;
 97.5kHz 2230g&lt;br /&gt;
 117kHz 2230g&lt;br /&gt;
 137kHz 2130g&lt;br /&gt;
 156kHz 2150g&lt;br /&gt;
 195kHz 2030g &lt;br /&gt;
 234kHz 2050g&lt;br /&gt;
 312kHz 2030g&lt;br /&gt;
 468kHz 1700g&lt;br /&gt;
 624kHz 1300g&lt;br /&gt;
 936kHz 740g&lt;br /&gt;
 1092kHz 556g&lt;br /&gt;
 1400kHz 250g&lt;br /&gt;
 1700kHz 150g&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=Torque in Ncm|&lt;br /&gt;
legend=Legend|&lt;br /&gt;
type=line|&lt;br /&gt;
x=11.13,22.85,45.70,68.55,91.41,114.26,137.11,160.55,182.81,228.52,274.22,365.62,548.44,731.25,1096.88,1279.69,1640.62,1992.19|&lt;br /&gt;
y1=37.12,35.48,36.96,36.63,36.96,36.80,36.80,35.14,35.48,33.49,33.82,33.49,28.05,21.45,12.21,9.17,4.12,2.47|&lt;br /&gt;
y1Title=Measured|&lt;br /&gt;
y2=,,,,24,26,32,34,34,34.5,36,35.5,34,16|&lt;br /&gt;
y2Title=From Datasheet (rough estimate)|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid|&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Source for torque curve from datasheet: https://www.omc-stepperonline.com/download/17HM19-2004S_Torque_Curve.pdf&lt;br /&gt;
&lt;br /&gt;
Full data sheet of the motor: https://www.omc-stepperonline.com/download/17HM19-2004S.pdf&lt;br /&gt;
&lt;br /&gt;
== Take Two, Weight Spinning ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Gallery&amp;gt;&lt;br /&gt;
Weightspinning.jpeg|Setup for torque measurement by a spinning weight&lt;br /&gt;
&amp;lt;/Gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The idea here is to measure the torque at a given RPM by testing how fast the stepper can accelerate to a higher RPM. This way the measurement is not limit to the length of a linear motion as in the previous chapter.&lt;br /&gt;
&lt;br /&gt;
=== Lost step detection ===&lt;br /&gt;
&lt;br /&gt;
With each round the rotor goes through a photo interruptor. The controller has an internal counter to keep track of the current angle with respect to an arbitrary reference. The home command puts the controller into a mode where it resets the counter if the rotor goes through the interruptor. After that, with each round it checks if the interruptor signal asserts during a given window around the reference. The window can be programmed and is currently set to +/- 4 full steps.&lt;br /&gt;
&lt;br /&gt;
=== Measurement ===&lt;br /&gt;
&lt;br /&gt;
We spin the motor to the RPM under test and try to accelerate it to the next higher RPM level. We use the interruptor signal to detect lost steps.&lt;br /&gt;
The acceleration directly corresponds to the torque the motor can generate at the given RPM.&lt;br /&gt;
&lt;br /&gt;
We now have a detailed torque curve RPM vs. Ncm.&lt;br /&gt;
&lt;br /&gt;
Do the same for deceleration&lt;br /&gt;
&lt;br /&gt;
Repeat everything with the other set of weights.&lt;br /&gt;
&lt;br /&gt;
=== 1st Measurement ===&lt;br /&gt;
&lt;br /&gt;
The following graph shows the max acceleration in RPM/s in steps of 200 RPM.&lt;br /&gt;
&lt;br /&gt;
Driver config (just pasted here for reference):&lt;br /&gt;
&lt;br /&gt;
        reg 0x04 -&amp;gt; 0x00000000&lt;br /&gt;
        reg 0xec -&amp;gt; 0x200100c3&lt;br /&gt;
        reg 0x90 -&amp;gt; 0x00061802&lt;br /&gt;
        reg 0x91 -&amp;gt; 0x0000000a&lt;br /&gt;
        reg 0x80 -&amp;gt; 0x00003144&lt;br /&gt;
        reg 0x93 -&amp;gt; 0x000001f4&lt;br /&gt;
        reg 0xf0 -&amp;gt; 0x000401c8&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=RPM/s|&lt;br /&gt;
type=line|&lt;br /&gt;
x=0.00,200.00,400.00,600.00,800.00,1000.00,1200.00,1400.00,1600.00,1800.00,2000.00,2200.00,2400.00,2600.00,2800.00,3000.00,3200.00|&lt;br /&gt;
y=7101.94,7611.49,6377.73,5601.97,3675.27,2408.02,1860.57,1763.62,1583.96,1071.46,935.91,891.38,776.37,751.01,664.83,612.14,581.51|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid|&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Sensille</name></author>	</entry>

	<entry>
		<id>http://3dpfs.sensille.com/index.php?title=Stepper&amp;diff=76</id>
		<title>Stepper</title>
		<link rel="alternate" type="text/html" href="http://3dpfs.sensille.com/index.php?title=Stepper&amp;diff=76"/>
				<updated>2018-04-30T19:39:49Z</updated>
		
		<summary type="html">&lt;p&gt;Sensille: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== General Setup ==&lt;br /&gt;
&lt;br /&gt;
Used Stepper: 17HM19-2004S&lt;br /&gt;
&lt;br /&gt;
Driver Voltage: 37V&lt;br /&gt;
&lt;br /&gt;
Driver: TMC2130&lt;br /&gt;
&lt;br /&gt;
Max RPM reached with the motor, unloaded: 3600RPM&lt;br /&gt;
This is the limit of the driver. It runs from the internal oscillator at 12.1MHz. Measure by giving a 9.765kHz pulse and read out register TSTEP as 0x277 (DEDGE=true).&lt;br /&gt;
&lt;br /&gt;
== Take One, Lifting Weights ==&lt;br /&gt;
&lt;br /&gt;
Driver Configuration is basically the recommended default from the datasheet for a coil current of about 2A:&lt;br /&gt;
 reg 0x6c -&amp;gt; 0x200100c3&lt;br /&gt;
 reg 0x10 -&amp;gt; 0x00061c02&lt;br /&gt;
 reg 0x91 -&amp;gt; 0x0000000a&lt;br /&gt;
 reg 0x80 -&amp;gt; 0x00003144&lt;br /&gt;
 reg 0x93 -&amp;gt; 0x000001f4&lt;br /&gt;
 reg 0xf0 -&amp;gt; 0x000401c8&lt;br /&gt;
&lt;br /&gt;
For very slow step rates stealthChop was disabled&lt;br /&gt;
&lt;br /&gt;
Load Testing at 1/256 microstepping. Testing done lifting a weight by winding a rope on a cylinder with effective radius of 16.5mm.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Weightlifting.jpeg|Weight Lifting Setup&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 9.5kHz 2250g&lt;br /&gt;
 19.5kHz 2150g &lt;br /&gt;
 39kHz 2240g&lt;br /&gt;
 58.5kHz 2220g&lt;br /&gt;
 78kHz 2240g&lt;br /&gt;
 97.5kHz 2230g&lt;br /&gt;
 117kHz 2230g&lt;br /&gt;
 137kHz 2130g&lt;br /&gt;
 156kHz 2150g&lt;br /&gt;
 195kHz 2030g &lt;br /&gt;
 234kHz 2050g&lt;br /&gt;
 312kHz 2030g&lt;br /&gt;
 468kHz 1700g&lt;br /&gt;
 624kHz 1300g&lt;br /&gt;
 936kHz 740g&lt;br /&gt;
 1092kHz 556g&lt;br /&gt;
 1400kHz 250g&lt;br /&gt;
 1700kHz 150g&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=Torque in Ncm|&lt;br /&gt;
legend=Legend|&lt;br /&gt;
type=line|&lt;br /&gt;
x=11.13,22.85,45.70,68.55,91.41,114.26,137.11,160.55,182.81,228.52,274.22,365.62,548.44,731.25,1096.88,1279.69,1640.62,1992.19|&lt;br /&gt;
y1=37.12,35.48,36.96,36.63,36.96,36.80,36.80,35.14,35.48,33.49,33.82,33.49,28.05,21.45,12.21,9.17,4.12,2.47|&lt;br /&gt;
y1Title=Measured|&lt;br /&gt;
y2=,,,,24,26,32,34,34,34.5,36,35.5,34,16|&lt;br /&gt;
y2Title=From Datasheet (rough estimate)|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid|&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Source for torque curve from datasheet: https://www.omc-stepperonline.com/download/17HM19-2004S_Torque_Curve.pdf&lt;br /&gt;
&lt;br /&gt;
Full data sheet of the motor: https://www.omc-stepperonline.com/download/17HM19-2004S.pdf&lt;br /&gt;
&lt;br /&gt;
== Take Two, Weight Spinning ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Gallery&amp;gt;&lt;br /&gt;
Weightspinning.jpeg|Setup for torque measurement by a spinning weight&lt;br /&gt;
&amp;lt;/Gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The idea here is to measure the torque at a given RPM by testing how fast the stepper can accelerate to a higher RPM. This way the measurement is not limit to the length of a linear motion as in the previous chapter.&lt;br /&gt;
&lt;br /&gt;
=== Lost step detection ===&lt;br /&gt;
&lt;br /&gt;
With each round the rotor goes through a photo interruptor. The controller has an internal counter to keep track of the current angle with respect to an arbitrary reference. The home command puts the controller into a mode where it resets the counter if the rotor goes through the interruptor. After that, with each round it checks if the interruptor signal asserts during a given window around the reference. The window can be programmed and is currently set to +/- 4 full steps.&lt;br /&gt;
&lt;br /&gt;
=== Measurement ===&lt;br /&gt;
&lt;br /&gt;
We spin the motor to the RPM under test and try to accelerate it to the next higher RPM level. We use the interruptor signal to detect lost steps.&lt;br /&gt;
The acceleration directly corresponds to the torque the motor can generate at the given RPM.&lt;br /&gt;
&lt;br /&gt;
We now have a detailed torque curve RPM vs. Ncm.&lt;br /&gt;
&lt;br /&gt;
Do the same for deceleration&lt;br /&gt;
&lt;br /&gt;
Repeat everything with the other set of weights.&lt;br /&gt;
&lt;br /&gt;
The following graph shows the max acceleration in RPM/s in steps of 200 RPM.&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=RPM/s|&lt;br /&gt;
type=line|&lt;br /&gt;
x=0.00,200.00,400.00,600.00,800.00,1000.00,1200.00,1400.00,1600.00,1800.00,2000.00,2200.00,2400.00,2600.00,2800.00,3000.00,3200.00|&lt;br /&gt;
y=7101.94,7611.49,6377.73,5601.97,3675.27,2408.02,1860.57,1763.62,1583.96,1071.46,935.91,891.38,776.37,751.01,664.83,612.14,581.51|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid|&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Sensille</name></author>	</entry>

	<entry>
		<id>http://3dpfs.sensille.com/index.php?title=Stepper&amp;diff=75</id>
		<title>Stepper</title>
		<link rel="alternate" type="text/html" href="http://3dpfs.sensille.com/index.php?title=Stepper&amp;diff=75"/>
				<updated>2018-04-30T19:30:07Z</updated>
		
		<summary type="html">&lt;p&gt;Sensille: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== General Setup ==&lt;br /&gt;
&lt;br /&gt;
Used Stepper: 17HM19-2004S&lt;br /&gt;
&lt;br /&gt;
Driver Voltage: 37V&lt;br /&gt;
&lt;br /&gt;
Driver: TMC2130&lt;br /&gt;
&lt;br /&gt;
Max RPM reached with the motor, unloaded: 3600RPM&lt;br /&gt;
This is the limit of the driver. It runs from the internal oscillator at 12.1MHz. Measure by giving a 9.765kHz pulse and read out register TSTEP as 0x277 (DEDGE=true).&lt;br /&gt;
&lt;br /&gt;
== Take One, Lifting Weights ==&lt;br /&gt;
&lt;br /&gt;
Driver Configuration is basically the recommended default from the datasheet for a coil current of about 2A:&lt;br /&gt;
 reg 0x6c -&amp;gt; 0x200100c3&lt;br /&gt;
 reg 0x10 -&amp;gt; 0x00061c02&lt;br /&gt;
 reg 0x91 -&amp;gt; 0x0000000a&lt;br /&gt;
 reg 0x80 -&amp;gt; 0x00003144&lt;br /&gt;
 reg 0x93 -&amp;gt; 0x000001f4&lt;br /&gt;
 reg 0xf0 -&amp;gt; 0x000401c8&lt;br /&gt;
&lt;br /&gt;
For very slow step rates stealthChop was disabled&lt;br /&gt;
&lt;br /&gt;
Load Testing at 1/256 microstepping. Testing done lifting a weight by winding a rope on a cylinder with effective radius of 16.5mm.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Weightlifting.jpeg|Weight Lifting Setup&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 9.5kHz 2250g&lt;br /&gt;
 19.5kHz 2150g &lt;br /&gt;
 39kHz 2240g&lt;br /&gt;
 58.5kHz 2220g&lt;br /&gt;
 78kHz 2240g&lt;br /&gt;
 97.5kHz 2230g&lt;br /&gt;
 117kHz 2230g&lt;br /&gt;
 137kHz 2130g&lt;br /&gt;
 156kHz 2150g&lt;br /&gt;
 195kHz 2030g &lt;br /&gt;
 234kHz 2050g&lt;br /&gt;
 312kHz 2030g&lt;br /&gt;
 468kHz 1700g&lt;br /&gt;
 624kHz 1300g&lt;br /&gt;
 936kHz 740g&lt;br /&gt;
 1092kHz 556g&lt;br /&gt;
 1400kHz 250g&lt;br /&gt;
 1700kHz 150g&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=Torque in Ncm|&lt;br /&gt;
legend=Legend|&lt;br /&gt;
type=line|&lt;br /&gt;
x=11.13,22.85,45.70,68.55,91.41,114.26,137.11,160.55,182.81,228.52,274.22,365.62,548.44,731.25,1096.88,1279.69,1640.62,1992.19|&lt;br /&gt;
y1=37.12,35.48,36.96,36.63,36.96,36.80,36.80,35.14,35.48,33.49,33.82,33.49,28.05,21.45,12.21,9.17,4.12,2.47|&lt;br /&gt;
y1Title=Measured|&lt;br /&gt;
y2=,,,,24,26,32,34,34,34.5,36,35.5,34,16|&lt;br /&gt;
y2Title=From Datasheet (rough estimate)|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid|&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Source for torque curve from datasheet: https://www.omc-stepperonline.com/download/17HM19-2004S_Torque_Curve.pdf&lt;br /&gt;
&lt;br /&gt;
Full data sheet of the motor: https://www.omc-stepperonline.com/download/17HM19-2004S.pdf&lt;br /&gt;
&lt;br /&gt;
== Take Two, Weight Spinning ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Gallery&amp;gt;&lt;br /&gt;
Weightspinning.jpeg|Setup for torque measurement by a spinning weight&lt;br /&gt;
&amp;lt;/Gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The idea here is to measure the torque at a given RPM by testing how fast the stepper can accelerate to a higher RPM. This way the measurement is not limit to the length of a linear motion as in the previous chapter.&lt;br /&gt;
&lt;br /&gt;
=== Lost step detection ===&lt;br /&gt;
&lt;br /&gt;
With each round the rotor goes through a photo interruptor. Before the start of the measurement, the controller homes the rotor so that it is interrupted. It then checks at each turn if the rotor is still in the expected position.&lt;br /&gt;
&lt;br /&gt;
=== Measurement ===&lt;br /&gt;
&lt;br /&gt;
1. Homing&lt;br /&gt;
2. Accelerate from standstill to 10 RPM very slowly&lt;br /&gt;
3. check for lost steps&lt;br /&gt;
4. if no steps are lost, slow down again (to the standstill)&lt;br /&gt;
5. choose a higher acceleration&lt;br /&gt;
6. repeat with 2 until lost steps are detected&lt;br /&gt;
7. repeat the same cycle going from 10RPM to 20RPM&lt;br /&gt;
8. repeat until max speed of 3600 RPM is reached&lt;br /&gt;
&lt;br /&gt;
We now have a detailed torque curve RPM vs. Ncm.&lt;br /&gt;
&lt;br /&gt;
Do the same for deceleration&lt;br /&gt;
&lt;br /&gt;
Repeat everything with the other set of weights.&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=RPM/s|&lt;br /&gt;
type=line|&lt;br /&gt;
x=0.00,200.00,400.00,600.00,800.00,1000.00,1200.00,1400.00,1600.00,1800.00,2000.00,2200.00,2400.00,2600.00,2800.00,3000.00,3200.00|&lt;br /&gt;
y=7101.94,7611.49,6377.73,5601.97,3675.27,2408.02,1860.57,1763.62,1583.96,1071.46,935.91,891.38,776.37,751.01,664.83,612.14,581.51|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid|&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Sensille</name></author>	</entry>

	<entry>
		<id>http://3dpfs.sensille.com/index.php?title=Stepper&amp;diff=74</id>
		<title>Stepper</title>
		<link rel="alternate" type="text/html" href="http://3dpfs.sensille.com/index.php?title=Stepper&amp;diff=74"/>
				<updated>2018-04-30T19:24:16Z</updated>
		
		<summary type="html">&lt;p&gt;Sensille: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== General Setup ==&lt;br /&gt;
&lt;br /&gt;
Used Stepper: 17HM19-2004S&lt;br /&gt;
&lt;br /&gt;
Driver Voltage: 37V&lt;br /&gt;
&lt;br /&gt;
Driver: TMC2130&lt;br /&gt;
&lt;br /&gt;
Max RPM reached with the motor, unloaded: 3600RPM&lt;br /&gt;
This is the limit of the driver. It runs from the internal oscillator at 12.1MHz. Measure by giving a 9.765kHz pulse and read out register TSTEP as 0x277 (DEDGE=true).&lt;br /&gt;
&lt;br /&gt;
== Take One, Lifting Weights ==&lt;br /&gt;
&lt;br /&gt;
Driver Configuration is basically the recommended default from the datasheet for a coil current of about 2A:&lt;br /&gt;
 reg 0x6c -&amp;gt; 0x200100c3&lt;br /&gt;
 reg 0x10 -&amp;gt; 0x00061c02&lt;br /&gt;
 reg 0x91 -&amp;gt; 0x0000000a&lt;br /&gt;
 reg 0x80 -&amp;gt; 0x00003144&lt;br /&gt;
 reg 0x93 -&amp;gt; 0x000001f4&lt;br /&gt;
 reg 0xf0 -&amp;gt; 0x000401c8&lt;br /&gt;
&lt;br /&gt;
For very slow step rates stealthChop was disabled&lt;br /&gt;
&lt;br /&gt;
Load Testing at 1/256 microstepping. Testing done lifting a weight by winding a rope on a cylinder with effective radius of 16.5mm.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Weightlifting.jpeg|Weight Lifting Setup&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 9.5kHz 2250g&lt;br /&gt;
 19.5kHz 2150g &lt;br /&gt;
 39kHz 2240g&lt;br /&gt;
 58.5kHz 2220g&lt;br /&gt;
 78kHz 2240g&lt;br /&gt;
 97.5kHz 2230g&lt;br /&gt;
 117kHz 2230g&lt;br /&gt;
 137kHz 2130g&lt;br /&gt;
 156kHz 2150g&lt;br /&gt;
 195kHz 2030g &lt;br /&gt;
 234kHz 2050g&lt;br /&gt;
 312kHz 2030g&lt;br /&gt;
 468kHz 1700g&lt;br /&gt;
 624kHz 1300g&lt;br /&gt;
 936kHz 740g&lt;br /&gt;
 1092kHz 556g&lt;br /&gt;
 1400kHz 250g&lt;br /&gt;
 1700kHz 150g&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=Torque in Ncm|&lt;br /&gt;
legend=Legend|&lt;br /&gt;
type=line|&lt;br /&gt;
x=11.13,22.85,45.70,68.55,91.41,114.26,137.11,160.55,182.81,228.52,274.22,365.62,548.44,731.25,1096.88,1279.69,1640.62,1992.19|&lt;br /&gt;
y1=37.12,35.48,36.96,36.63,36.96,36.80,36.80,35.14,35.48,33.49,33.82,33.49,28.05,21.45,12.21,9.17,4.12,2.47|&lt;br /&gt;
y1Title=Measured|&lt;br /&gt;
y2=,,,,24,26,32,34,34,34.5,36,35.5,34,16|&lt;br /&gt;
y2Title=From Datasheet (rough estimate)|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid|&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Source for torque curve from datasheet: https://www.omc-stepperonline.com/download/17HM19-2004S_Torque_Curve.pdf&lt;br /&gt;
&lt;br /&gt;
Full data sheet of the motor: https://www.omc-stepperonline.com/download/17HM19-2004S.pdf&lt;br /&gt;
&lt;br /&gt;
== Take Two, Weight Spinning ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Gallery&amp;gt;&lt;br /&gt;
Weightspinning.jpeg|Setup for torque measurement by a spinning weight&lt;br /&gt;
&amp;lt;/Gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The idea here is to measure the torque at a given RPM by testing how fast the stepper can accelerate to a higher RPM. This way the measurement is not limit to the length of a linear motion as in the previous chapter.&lt;br /&gt;
&lt;br /&gt;
=== Lost step detection ===&lt;br /&gt;
&lt;br /&gt;
With each round the rotor goes through a photo interruptor. Before the start of the measurement, the controller homes the rotor so that it is interrupted. It then checks at each turn if the rotor is still in the expected position.&lt;br /&gt;
&lt;br /&gt;
=== Measurement ===&lt;br /&gt;
&lt;br /&gt;
1. Homing&lt;br /&gt;
2. Accelerate from standstill to 10 RPM very slowly&lt;br /&gt;
3. check for lost steps&lt;br /&gt;
4. if no steps are lost, slow down again (to the standstill)&lt;br /&gt;
5. choose a higher acceleration&lt;br /&gt;
6. repeat with 2 until lost steps are detected&lt;br /&gt;
7. repeat the same cycle going from 10RPM to 20RPM&lt;br /&gt;
8. repeat until max speed of 3600 RPM is reached&lt;br /&gt;
&lt;br /&gt;
We now have a detailed torque curve RPM vs. Ncm.&lt;br /&gt;
&lt;br /&gt;
Do the same for deceleration&lt;br /&gt;
&lt;br /&gt;
Repeat everything with the other set of weights.&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=RPM/s|&lt;br /&gt;
legend=Legend|&lt;br /&gt;
type=line|&lt;br /&gt;
x=0.00,200.00,400.00,600.00,800.00,1000.00,1200.00,1400.00,1600.00,1800.00,2000.00,2200.00,2400.00,2600.00,2800.00,3000.00,3200.00|&lt;br /&gt;
y1=7101.94,7611.49,6377.73,5601.97,3675.27,2408.02,1860.57,1763.62,1583.96,1071.46,935.91,891.38,776.37,751.01,664.83,612.14,581.51|&lt;br /&gt;
y1Title=Measured|&lt;br /&gt;
y2=,,,,24,26,32,34,34,34.5,36,35.5,34,16|&lt;br /&gt;
y2Title=From Datasheet (rough estimate)|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid|&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Sensille</name></author>	</entry>

	<entry>
		<id>http://3dpfs.sensille.com/index.php?title=Controller&amp;diff=73</id>
		<title>Controller</title>
		<link rel="alternate" type="text/html" href="http://3dpfs.sensille.com/index.php?title=Controller&amp;diff=73"/>
				<updated>2018-03-21T21:12:47Z</updated>
		
		<summary type="html">&lt;p&gt;Sensille: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Currently an Artix-7 FPGA is used as the controller. It has a serial interface with a command width of 80 bytes.&lt;br /&gt;
&lt;br /&gt;
The first byte gives the command. The command has a variable width, with a maximum length of 80 bits. Most commands just get enqueued into an internal FIFO with 64 entries. The bits are clocked in right to left, so the lowest bit of the command comes last.&lt;br /&gt;
&lt;br /&gt;
The internal clock frequency is 20MHz.&lt;br /&gt;
&lt;br /&gt;
Commands:&lt;br /&gt;
&lt;br /&gt;
=== Ramp ===&lt;br /&gt;
 - ramp(8&amp;#039;h9a,36&amp;#039;&amp;lt;acceleration&amp;gt;, 36&amp;#039;&amp;lt;clock count&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
For the given number of clocks increment the internal acceleration register by the value given in the command.&lt;br /&gt;
Acceleration can also be negative.&lt;br /&gt;
&lt;br /&gt;
=== Start ===&lt;br /&gt;
 - start(8&amp;#039;hb5)&lt;br /&gt;
&lt;br /&gt;
Start the engine. All commands in the fifo will be executed.&lt;br /&gt;
&lt;br /&gt;
=== Configure Rev ===&lt;br /&gt;
 - configure clocks/rev (8&amp;#039;ha3, 24&amp;#039;&amp;lt;step per revolution&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Set number of steps for one revolution. With a 0.9deg stepper and 256 microstepping set it to 1024000.&lt;br /&gt;
If the internal position counter reaches this value, it is reset to zero and a pulse on the REV pin is generated.&lt;br /&gt;
&lt;br /&gt;
=== Sync Revcounter ===&lt;br /&gt;
 - sync(8&amp;#039;h3d)&lt;br /&gt;
&lt;br /&gt;
Run until the next rising edge of the home sensor. If reached, reset the internal position to 0.&lt;/div&gt;</summary>
		<author><name>Sensille</name></author>	</entry>

	<entry>
		<id>http://3dpfs.sensille.com/index.php?title=Controller&amp;diff=72</id>
		<title>Controller</title>
		<link rel="alternate" type="text/html" href="http://3dpfs.sensille.com/index.php?title=Controller&amp;diff=72"/>
				<updated>2018-03-21T21:10:45Z</updated>
		
		<summary type="html">&lt;p&gt;Sensille: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Currently an Artix-7 FPGA is used as the controller. It has a serial interface with a command width of 80 bytes.&lt;br /&gt;
&lt;br /&gt;
The first byte gives the command. The command has a variable width, with a maximum length of 80 bits. Most commands just get enqueued into an internal FIFO with 64 entries.&lt;br /&gt;
&lt;br /&gt;
The internal clock frequency is 20MHz.&lt;br /&gt;
&lt;br /&gt;
Commands:&lt;br /&gt;
&lt;br /&gt;
=== Ramp ===&lt;br /&gt;
 - ramp(8&amp;#039;h9a,36&amp;#039;&amp;lt;acceleration&amp;gt;, 36&amp;#039;&amp;lt;clock count&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
For the given number of clocks increment the internal acceleration register by the value given in the command.&lt;br /&gt;
Acceleration can also be negative.&lt;br /&gt;
&lt;br /&gt;
=== Start ===&lt;br /&gt;
 - start(8&amp;#039;hb5)&lt;br /&gt;
&lt;br /&gt;
Start the engine. All commands in the fifo will be executed.&lt;br /&gt;
&lt;br /&gt;
=== Configure Rev ===&lt;br /&gt;
 - configure clocks/rev (8&amp;#039;ha3, 24&amp;#039;&amp;lt;step per revolution&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Set number of steps for one revolution. With a 0.9deg stepper and 256 microstepping set it to 1024000.&lt;br /&gt;
If the internal position counter reaches this value, it is reset to zero and a pulse on the REV pin is generated.&lt;br /&gt;
&lt;br /&gt;
=== Sync Revcounter ===&lt;br /&gt;
 - sync(8&amp;#039;h3d)&lt;br /&gt;
&lt;br /&gt;
Run until the next rising edge of the home sensor. If reached, reset the internal position to 0.&lt;/div&gt;</summary>
		<author><name>Sensille</name></author>	</entry>

	<entry>
		<id>http://3dpfs.sensille.com/index.php?title=Controller&amp;diff=71</id>
		<title>Controller</title>
		<link rel="alternate" type="text/html" href="http://3dpfs.sensille.com/index.php?title=Controller&amp;diff=71"/>
				<updated>2018-03-21T21:05:31Z</updated>
		
		<summary type="html">&lt;p&gt;Sensille: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Currently an Artix-7 FPGA is used as the controller. It has a serial interface with a command width of 80 bytes.&lt;br /&gt;
&lt;br /&gt;
The first byte gives the command. The command has a variable width, with a maximum length of 80 bits. Most commands just get enqueued into an internal FIFO with 64 entries.&lt;br /&gt;
&lt;br /&gt;
The internal clock frequency is 20MHz.&lt;br /&gt;
&lt;br /&gt;
Commands:&lt;br /&gt;
&lt;br /&gt;
=== Ramp ===&lt;br /&gt;
 - ramp(&amp;#039;8h9a,&amp;#039;36h&amp;lt;acceleration&amp;gt;, &amp;#039;36h&amp;lt;clock count&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
For the given number of clocks increment the internal acceleration register by the value given in the command.&lt;br /&gt;
Acceleration can also be negative.&lt;br /&gt;
&lt;br /&gt;
=== Start ===&lt;br /&gt;
 - start(&amp;#039;8hb5)&lt;br /&gt;
&lt;br /&gt;
Start the engine. All commands in the fifo will be executed.&lt;br /&gt;
&lt;br /&gt;
=== Configure Rev ===&lt;br /&gt;
 - configure clocks/rev (&amp;#039;8ha3, &amp;#039;24h&amp;lt;step per revolution&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Set number of steps for one revolution. With a 0.9deg stepper and 256 microstepping set it to 1024000.&lt;br /&gt;
If the internal position counter reaches this value, it is reset to zero and a pulse on the REV pin is generated.&lt;br /&gt;
&lt;br /&gt;
=== Sync Revcounter ===&lt;br /&gt;
 - sync(&amp;#039;8h3d)&lt;br /&gt;
&lt;br /&gt;
Run until the next rising edge of the home sensor. If reached, reset the internal position to 0.&lt;/div&gt;</summary>
		<author><name>Sensille</name></author>	</entry>

	<entry>
		<id>http://3dpfs.sensille.com/index.php?title=Controller&amp;diff=70</id>
		<title>Controller</title>
		<link rel="alternate" type="text/html" href="http://3dpfs.sensille.com/index.php?title=Controller&amp;diff=70"/>
				<updated>2018-03-21T20:50:08Z</updated>
		
		<summary type="html">&lt;p&gt;Sensille: Created page with &amp;quot;Currently an Artix-7 FPGA is used as the controller. It has a serial interface with a command width of 80 bytes.&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Currently an Artix-7 FPGA is used as the controller. It has a serial interface with a command width of 80 bytes.&lt;/div&gt;</summary>
		<author><name>Sensille</name></author>	</entry>

	<entry>
		<id>http://3dpfs.sensille.com/index.php?title=Main_Page&amp;diff=69</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="http://3dpfs.sensille.com/index.php?title=Main_Page&amp;diff=69"/>
				<updated>2018-03-21T20:49:10Z</updated>
		
		<summary type="html">&lt;p&gt;Sensille: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Stepper]]&lt;br /&gt;
&lt;br /&gt;
[[Controller]]&lt;/div&gt;</summary>
		<author><name>Sensille</name></author>	</entry>

	<entry>
		<id>http://3dpfs.sensille.com/index.php?title=Stepper&amp;diff=68</id>
		<title>Stepper</title>
		<link rel="alternate" type="text/html" href="http://3dpfs.sensille.com/index.php?title=Stepper&amp;diff=68"/>
				<updated>2018-03-21T20:45:45Z</updated>
		
		<summary type="html">&lt;p&gt;Sensille: /* Take Two, Weight Spinning */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== General Setup ==&lt;br /&gt;
&lt;br /&gt;
Used Stepper: 17HM19-2004S&lt;br /&gt;
&lt;br /&gt;
Driver Voltage: 37V&lt;br /&gt;
&lt;br /&gt;
Driver: TMC2130&lt;br /&gt;
&lt;br /&gt;
Max RPM reached with the motor, unloaded: 3600RPM&lt;br /&gt;
This is the limit of the driver. It runs from the internal oscillator at 12.1MHz. Measure by giving a 9.765kHz pulse and read out register TSTEP as 0x277 (DEDGE=true).&lt;br /&gt;
&lt;br /&gt;
== Take One, Lifting Weights ==&lt;br /&gt;
&lt;br /&gt;
Driver Configuration is basically the recommended default from the datasheet for a coil current of about 2A:&lt;br /&gt;
 reg 0x6c -&amp;gt; 0x200100c3&lt;br /&gt;
 reg 0x10 -&amp;gt; 0x00061c02&lt;br /&gt;
 reg 0x91 -&amp;gt; 0x0000000a&lt;br /&gt;
 reg 0x80 -&amp;gt; 0x00003144&lt;br /&gt;
 reg 0x93 -&amp;gt; 0x000001f4&lt;br /&gt;
 reg 0xf0 -&amp;gt; 0x000401c8&lt;br /&gt;
&lt;br /&gt;
For very slow step rates stealthChop was disabled&lt;br /&gt;
&lt;br /&gt;
Load Testing at 1/256 microstepping. Testing done lifting a weight by winding a rope on a cylinder with effective radius of 16.5mm.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Weightlifting.jpeg|Weight Lifting Setup&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 9.5kHz 2250g&lt;br /&gt;
 19.5kHz 2150g &lt;br /&gt;
 39kHz 2240g&lt;br /&gt;
 58.5kHz 2220g&lt;br /&gt;
 78kHz 2240g&lt;br /&gt;
 97.5kHz 2230g&lt;br /&gt;
 117kHz 2230g&lt;br /&gt;
 137kHz 2130g&lt;br /&gt;
 156kHz 2150g&lt;br /&gt;
 195kHz 2030g &lt;br /&gt;
 234kHz 2050g&lt;br /&gt;
 312kHz 2030g&lt;br /&gt;
 468kHz 1700g&lt;br /&gt;
 624kHz 1300g&lt;br /&gt;
 936kHz 740g&lt;br /&gt;
 1092kHz 556g&lt;br /&gt;
 1400kHz 250g&lt;br /&gt;
 1700kHz 150g&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=Torque in Ncm|&lt;br /&gt;
legend=Legend|&lt;br /&gt;
type=line|&lt;br /&gt;
x=11.13,22.85,45.70,68.55,91.41,114.26,137.11,160.55,182.81,228.52,274.22,365.62,548.44,731.25,1096.88,1279.69,1640.62,1992.19|&lt;br /&gt;
y1=37.12,35.48,36.96,36.63,36.96,36.80,36.80,35.14,35.48,33.49,33.82,33.49,28.05,21.45,12.21,9.17,4.12,2.47|&lt;br /&gt;
y1Title=Measured|&lt;br /&gt;
y2=,,,,24,26,32,34,34,34.5,36,35.5,34,16|&lt;br /&gt;
y2Title=From Datasheet (rough estimate)|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid|&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Source for torque curve from datasheet: https://www.omc-stepperonline.com/download/17HM19-2004S_Torque_Curve.pdf&lt;br /&gt;
&lt;br /&gt;
Full data sheet of the motor: https://www.omc-stepperonline.com/download/17HM19-2004S.pdf&lt;br /&gt;
&lt;br /&gt;
== Take Two, Weight Spinning ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Gallery&amp;gt;&lt;br /&gt;
Weightspinning.jpeg|Setup for torque measurement by a spinning weight&lt;br /&gt;
&amp;lt;/Gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The idea here is to measure the torque at a given RPM by testing how fast the stepper can accelerate to a higher RPM. This way the measurement is not limit to the length of a linear motion as in the previous chapter.&lt;br /&gt;
&lt;br /&gt;
=== Lost step detection ===&lt;br /&gt;
&lt;br /&gt;
With each round the rotor goes through a photo interruptor. Before the start of the measurement, the controller homes the rotor so that it is interrupted. It then checks at each turn if the rotor is still in the expected position.&lt;br /&gt;
&lt;br /&gt;
=== Measurement ===&lt;br /&gt;
&lt;br /&gt;
1. Homing&lt;br /&gt;
2. Accelerate from standstill to 10 RPM very slowly&lt;br /&gt;
3. check for lost steps&lt;br /&gt;
4. if no steps are lost, slow down again (to the standstill)&lt;br /&gt;
5. choose a higher acceleration&lt;br /&gt;
6. repeat with 2 until lost steps are detected&lt;br /&gt;
7. repeat the same cycle going from 10RPM to 20RPM&lt;br /&gt;
8. repeat until max speed of 3600 RPM is reached&lt;br /&gt;
&lt;br /&gt;
We now have a detailed torque curve RPM vs. Ncm.&lt;br /&gt;
&lt;br /&gt;
Do the same for deceleration&lt;br /&gt;
&lt;br /&gt;
Repeat everything with the other set of weights.&lt;/div&gt;</summary>
		<author><name>Sensille</name></author>	</entry>

	<entry>
		<id>http://3dpfs.sensille.com/index.php?title=Stepper&amp;diff=67</id>
		<title>Stepper</title>
		<link rel="alternate" type="text/html" href="http://3dpfs.sensille.com/index.php?title=Stepper&amp;diff=67"/>
				<updated>2018-03-21T20:14:13Z</updated>
		
		<summary type="html">&lt;p&gt;Sensille: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== General Setup ==&lt;br /&gt;
&lt;br /&gt;
Used Stepper: 17HM19-2004S&lt;br /&gt;
&lt;br /&gt;
Driver Voltage: 37V&lt;br /&gt;
&lt;br /&gt;
Driver: TMC2130&lt;br /&gt;
&lt;br /&gt;
Max RPM reached with the motor, unloaded: 3600RPM&lt;br /&gt;
This is the limit of the driver. It runs from the internal oscillator at 12.1MHz. Measure by giving a 9.765kHz pulse and read out register TSTEP as 0x277 (DEDGE=true).&lt;br /&gt;
&lt;br /&gt;
== Take One, Lifting Weights ==&lt;br /&gt;
&lt;br /&gt;
Driver Configuration is basically the recommended default from the datasheet for a coil current of about 2A:&lt;br /&gt;
 reg 0x6c -&amp;gt; 0x200100c3&lt;br /&gt;
 reg 0x10 -&amp;gt; 0x00061c02&lt;br /&gt;
 reg 0x91 -&amp;gt; 0x0000000a&lt;br /&gt;
 reg 0x80 -&amp;gt; 0x00003144&lt;br /&gt;
 reg 0x93 -&amp;gt; 0x000001f4&lt;br /&gt;
 reg 0xf0 -&amp;gt; 0x000401c8&lt;br /&gt;
&lt;br /&gt;
For very slow step rates stealthChop was disabled&lt;br /&gt;
&lt;br /&gt;
Load Testing at 1/256 microstepping. Testing done lifting a weight by winding a rope on a cylinder with effective radius of 16.5mm.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Weightlifting.jpeg|Weight Lifting Setup&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 9.5kHz 2250g&lt;br /&gt;
 19.5kHz 2150g &lt;br /&gt;
 39kHz 2240g&lt;br /&gt;
 58.5kHz 2220g&lt;br /&gt;
 78kHz 2240g&lt;br /&gt;
 97.5kHz 2230g&lt;br /&gt;
 117kHz 2230g&lt;br /&gt;
 137kHz 2130g&lt;br /&gt;
 156kHz 2150g&lt;br /&gt;
 195kHz 2030g &lt;br /&gt;
 234kHz 2050g&lt;br /&gt;
 312kHz 2030g&lt;br /&gt;
 468kHz 1700g&lt;br /&gt;
 624kHz 1300g&lt;br /&gt;
 936kHz 740g&lt;br /&gt;
 1092kHz 556g&lt;br /&gt;
 1400kHz 250g&lt;br /&gt;
 1700kHz 150g&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=Torque in Ncm|&lt;br /&gt;
legend=Legend|&lt;br /&gt;
type=line|&lt;br /&gt;
x=11.13,22.85,45.70,68.55,91.41,114.26,137.11,160.55,182.81,228.52,274.22,365.62,548.44,731.25,1096.88,1279.69,1640.62,1992.19|&lt;br /&gt;
y1=37.12,35.48,36.96,36.63,36.96,36.80,36.80,35.14,35.48,33.49,33.82,33.49,28.05,21.45,12.21,9.17,4.12,2.47|&lt;br /&gt;
y1Title=Measured|&lt;br /&gt;
y2=,,,,24,26,32,34,34,34.5,36,35.5,34,16|&lt;br /&gt;
y2Title=From Datasheet (rough estimate)|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid|&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Source for torque curve from datasheet: https://www.omc-stepperonline.com/download/17HM19-2004S_Torque_Curve.pdf&lt;br /&gt;
&lt;br /&gt;
Full data sheet of the motor: https://www.omc-stepperonline.com/download/17HM19-2004S.pdf&lt;br /&gt;
&lt;br /&gt;
== Take Two, Weight Spinning ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Gallery&amp;gt;&lt;br /&gt;
Weightspinning.jpeg|Setup for torque measurement by a spinning weight&lt;br /&gt;
&amp;lt;/Gallery&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sensille</name></author>	</entry>

	<entry>
		<id>http://3dpfs.sensille.com/index.php?title=Stepper&amp;diff=66</id>
		<title>Stepper</title>
		<link rel="alternate" type="text/html" href="http://3dpfs.sensille.com/index.php?title=Stepper&amp;diff=66"/>
				<updated>2018-03-21T20:10:02Z</updated>
		
		<summary type="html">&lt;p&gt;Sensille: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== General Setup ==&lt;br /&gt;
&lt;br /&gt;
Used Stepper: 17HM19-2004S&lt;br /&gt;
&lt;br /&gt;
Driver Voltage: 37V&lt;br /&gt;
&lt;br /&gt;
Driver: TMC2130&lt;br /&gt;
&lt;br /&gt;
Max RPM reached with the motor, unloaded: 3600RPM&lt;br /&gt;
This is the limit of the driver. It runs from the internal oscillator at 12.1MHz. Measure by giving a 9.765kHz pulse and read out register TSTEP as 0x277 (DEDGE=true).&lt;br /&gt;
&lt;br /&gt;
== Take One, Lifting Weights ==&lt;br /&gt;
&lt;br /&gt;
Driver Configuration is basically the recommended default from the datasheet for a coil current of about 2A:&lt;br /&gt;
 reg 0x6c -&amp;gt; 0x200100c3&lt;br /&gt;
 reg 0x10 -&amp;gt; 0x00061c02&lt;br /&gt;
 reg 0x91 -&amp;gt; 0x0000000a&lt;br /&gt;
 reg 0x80 -&amp;gt; 0x00003144&lt;br /&gt;
 reg 0x93 -&amp;gt; 0x000001f4&lt;br /&gt;
 reg 0xf0 -&amp;gt; 0x000401c8&lt;br /&gt;
&lt;br /&gt;
For very slow step rates stealthChop was disabled&lt;br /&gt;
&lt;br /&gt;
Load Testing at 1/256 microstepping. Testing done lifting a weight by winding a rope on a cylinder with effective radius of 16.5mm.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Weightlifting.jpeg|Weight Lifting Setup&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 9.5kHz 2250g&lt;br /&gt;
 19.5kHz 2150g &lt;br /&gt;
 39kHz 2240g&lt;br /&gt;
 58.5kHz 2220g&lt;br /&gt;
 78kHz 2240g&lt;br /&gt;
 97.5kHz 2230g&lt;br /&gt;
 117kHz 2230g&lt;br /&gt;
 137kHz 2130g&lt;br /&gt;
 156kHz 2150g&lt;br /&gt;
 195kHz 2030g &lt;br /&gt;
 234kHz 2050g&lt;br /&gt;
 312kHz 2030g&lt;br /&gt;
 468kHz 1700g&lt;br /&gt;
 624kHz 1300g&lt;br /&gt;
 936kHz 740g&lt;br /&gt;
 1092kHz 556g&lt;br /&gt;
 1400kHz 250g&lt;br /&gt;
 1700kHz 150g&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=Torque in Ncm|&lt;br /&gt;
legend=Legend|&lt;br /&gt;
type=line|&lt;br /&gt;
x=11.13,22.85,45.70,68.55,91.41,114.26,137.11,160.55,182.81,228.52,274.22,365.62,548.44,731.25,1096.88,1279.69,1640.62,1992.19|&lt;br /&gt;
y1=37.12,35.48,36.96,36.63,36.96,36.80,36.80,35.14,35.48,33.49,33.82,33.49,28.05,21.45,12.21,9.17,4.12,2.47|&lt;br /&gt;
y1Title=Measured|&lt;br /&gt;
y2=,,,,24,26,32,34,34,34.5,36,35.5,34,16|&lt;br /&gt;
y2Title=From Datasheet (rough estimate)|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid|&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Source for torque curve from datasheet: https://www.omc-stepperonline.com/download/17HM19-2004S_Torque_Curve.pdf&lt;br /&gt;
&lt;br /&gt;
Full data sheet of the motor: https://www.omc-stepperonline.com/download/17HM19-2004S.pdf&lt;/div&gt;</summary>
		<author><name>Sensille</name></author>	</entry>

	<entry>
		<id>http://3dpfs.sensille.com/index.php?title=Stepper&amp;diff=65</id>
		<title>Stepper</title>
		<link rel="alternate" type="text/html" href="http://3dpfs.sensille.com/index.php?title=Stepper&amp;diff=65"/>
				<updated>2018-03-21T20:09:17Z</updated>
		
		<summary type="html">&lt;p&gt;Sensille: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Used Stepper: 17HM19-2004S&lt;br /&gt;
&lt;br /&gt;
Driver Voltage: 37V&lt;br /&gt;
&lt;br /&gt;
Driver: TMC2130&lt;br /&gt;
&lt;br /&gt;
Max RPM reached with the motor, unloaded: 3600RPM&lt;br /&gt;
This is the limit of the driver. It runs from the internal oscillator at 12.1MHz. Measure by giving a 9.765kHz pulse and read out register TSTEP as 0x277 (DEDGE=true).&lt;br /&gt;
&lt;br /&gt;
Take One, Lifting Weights&lt;br /&gt;
&lt;br /&gt;
Driver Configuration is basically the recommended default from the datasheet for a coil current of about 2A:&lt;br /&gt;
 reg 0x6c -&amp;gt; 0x200100c3&lt;br /&gt;
 reg 0x10 -&amp;gt; 0x00061c02&lt;br /&gt;
 reg 0x91 -&amp;gt; 0x0000000a&lt;br /&gt;
 reg 0x80 -&amp;gt; 0x00003144&lt;br /&gt;
 reg 0x93 -&amp;gt; 0x000001f4&lt;br /&gt;
 reg 0xf0 -&amp;gt; 0x000401c8&lt;br /&gt;
&lt;br /&gt;
For very slow step rates stealthChop was disabled&lt;br /&gt;
&lt;br /&gt;
Load Testing at 1/256 microstepping. Testing done lifting a weight by winding a rope on a cylinder with effective radius of 16.5mm.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Weightlifting.jpeg|Weight Lifting Setup&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 9.5kHz 2250g&lt;br /&gt;
 19.5kHz 2150g &lt;br /&gt;
 39kHz 2240g&lt;br /&gt;
 58.5kHz 2220g&lt;br /&gt;
 78kHz 2240g&lt;br /&gt;
 97.5kHz 2230g&lt;br /&gt;
 117kHz 2230g&lt;br /&gt;
 137kHz 2130g&lt;br /&gt;
 156kHz 2150g&lt;br /&gt;
 195kHz 2030g &lt;br /&gt;
 234kHz 2050g&lt;br /&gt;
 312kHz 2030g&lt;br /&gt;
 468kHz 1700g&lt;br /&gt;
 624kHz 1300g&lt;br /&gt;
 936kHz 740g&lt;br /&gt;
 1092kHz 556g&lt;br /&gt;
 1400kHz 250g&lt;br /&gt;
 1700kHz 150g&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=Torque in Ncm|&lt;br /&gt;
legend=Legend|&lt;br /&gt;
type=line|&lt;br /&gt;
x=11.13,22.85,45.70,68.55,91.41,114.26,137.11,160.55,182.81,228.52,274.22,365.62,548.44,731.25,1096.88,1279.69,1640.62,1992.19|&lt;br /&gt;
y1=37.12,35.48,36.96,36.63,36.96,36.80,36.80,35.14,35.48,33.49,33.82,33.49,28.05,21.45,12.21,9.17,4.12,2.47|&lt;br /&gt;
y1Title=Measured|&lt;br /&gt;
y2=,,,,24,26,32,34,34,34.5,36,35.5,34,16|&lt;br /&gt;
y2Title=From Datasheet (rough estimate)|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid|&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Source for torque curve from datasheet: https://www.omc-stepperonline.com/download/17HM19-2004S_Torque_Curve.pdf&lt;br /&gt;
&lt;br /&gt;
Full data sheet of the motor: https://www.omc-stepperonline.com/download/17HM19-2004S.pdf&lt;/div&gt;</summary>
		<author><name>Sensille</name></author>	</entry>

	<entry>
		<id>http://3dpfs.sensille.com/index.php?title=Stepper&amp;diff=64</id>
		<title>Stepper</title>
		<link rel="alternate" type="text/html" href="http://3dpfs.sensille.com/index.php?title=Stepper&amp;diff=64"/>
				<updated>2018-03-21T19:56:07Z</updated>
		
		<summary type="html">&lt;p&gt;Sensille: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Used Stepper: 17HM19-2004S&lt;br /&gt;
&lt;br /&gt;
Driver Voltage: 37V&lt;br /&gt;
&lt;br /&gt;
Driver: TMC2130&lt;br /&gt;
&lt;br /&gt;
Max RPM reached with the motor, unloaded: 3600RPM&lt;br /&gt;
This is the limit of the driver. It runs from the internal oscillator at 12.1MHz. Measure by giving a 9.765kHz pulse and read out register TSTEP as 0x277 (DEDGE=true).&lt;br /&gt;
&lt;br /&gt;
Take One, Lifting Weights&lt;br /&gt;
&lt;br /&gt;
Driver Configuration is basically the recommended default from the datasheet for a coil current of about 2A:&lt;br /&gt;
 reg 0x6c -&amp;gt; 0x200100c3&lt;br /&gt;
 reg 0x10 -&amp;gt; 0x00061c02&lt;br /&gt;
 reg 0x91 -&amp;gt; 0x0000000a&lt;br /&gt;
 reg 0x80 -&amp;gt; 0x00003144&lt;br /&gt;
 reg 0x93 -&amp;gt; 0x000001f4&lt;br /&gt;
 reg 0xf0 -&amp;gt; 0x000401c8&lt;br /&gt;
&lt;br /&gt;
For very slow step rates stealthChop was disabled&lt;br /&gt;
&lt;br /&gt;
Load Testing at 1/256 microstepping. Testing done lifting a weight by winding a rope on a cylinder with effective radius of 16.5mm.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Weightlifting.jpeg|Caption1&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 9.5kHz 2250g&lt;br /&gt;
 19.5kHz 2150g &lt;br /&gt;
 39kHz 2240g&lt;br /&gt;
 58.5kHz 2220g&lt;br /&gt;
 78kHz 2240g&lt;br /&gt;
 97.5kHz 2230g&lt;br /&gt;
 117kHz 2230g&lt;br /&gt;
 137kHz 2130g&lt;br /&gt;
 156kHz 2150g&lt;br /&gt;
 195kHz 2030g &lt;br /&gt;
 234kHz 2050g&lt;br /&gt;
 312kHz 2030g&lt;br /&gt;
 468kHz 1700g&lt;br /&gt;
 624kHz 1300g&lt;br /&gt;
 936kHz 740g&lt;br /&gt;
 1092kHz 556g&lt;br /&gt;
 1400kHz 250g&lt;br /&gt;
 1700kHz 150g&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Graph:Chart|width=600|height=200|&lt;br /&gt;
xAxisTitle=RPM|&lt;br /&gt;
yAxisTitle=Torque in Ncm|&lt;br /&gt;
legend=Legend|&lt;br /&gt;
type=line|&lt;br /&gt;
x=11.13,22.85,45.70,68.55,91.41,114.26,137.11,160.55,182.81,228.52,274.22,365.62,548.44,731.25,1096.88,1279.69,1640.62,1992.19|&lt;br /&gt;
y1=37.12,35.48,36.96,36.63,36.96,36.80,36.80,35.14,35.48,33.49,33.82,33.49,28.05,21.45,12.21,9.17,4.12,2.47|&lt;br /&gt;
y1Title=Measured|&lt;br /&gt;
y2=,,,,24,26,32,34,34,34.5,36,35.5,34,16|&lt;br /&gt;
y2Title=From Datasheet (rough estimate)|&lt;br /&gt;
interpolate=monotone|&lt;br /&gt;
colors=seagreen,orchid|&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Source for torque curve from datasheet: https://www.omc-stepperonline.com/download/17HM19-2004S_Torque_Curve.pdf&lt;br /&gt;
&lt;br /&gt;
Full data sheet of the motor: https://www.omc-stepperonline.com/download/17HM19-2004S.pdf&lt;/div&gt;</summary>
		<author><name>Sensille</name></author>	</entry>

	<entry>
		<id>http://3dpfs.sensille.com/index.php?title=File:Weightspinning.jpeg&amp;diff=63</id>
		<title>File:Weightspinning.jpeg</title>
		<link rel="alternate" type="text/html" href="http://3dpfs.sensille.com/index.php?title=File:Weightspinning.jpeg&amp;diff=63"/>
				<updated>2018-03-21T19:54:54Z</updated>
		
		<summary type="html">&lt;p&gt;Sensille: Setup to measure torque by spinning known weights.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Setup to measure torque by spinning known weights.&lt;/div&gt;</summary>
		<author><name>Sensille</name></author>	</entry>

	</feed>