1. Intro
The dmc41.h/.c and testdmc code was initially developed in /home/s2/src/dmc41-mt/
for a lab test motor setup as a prototype for spex, ishell.
So some of the notes refer to his dmc41-mt/ setup.
Copied where then given to spex, and ishell.
The motor tower hardware is a lab test system consisting of:
Galil DMC-4183...(the upgraded and repurposed TCS DMC-4153 for the chopper upgrade).
M-2222-6.0D - IMS Stepper (size 23 frame).
IM483-34P1 - IMS Microstepping Drivers.
Phytron ZSS 32.200.1.2 - warm motor, ishell will use a cryo version of the motor.
Old IRTF Geneva Drive.
2. Hardware Notes
2.1 Controller DMC-41x3
DMC-4153-BOX8(-16BIT)D3020-DIN purchased on 2010-11 for servo chopper
secondary upgrade. Project was abandon about 2012-05 for lack to
manpower/interest.
The DMC-4183 was RMA in july 2012 to be reused as the hilo lab controller.
8 axis were added, plus 2 axis were configured with stepper amps.
It's current configuration is:
DMC-4183
A1-AMP-43020(-D3020) - two axis amplifiers 500 watts. These servo amplifiers
are installed on axis A and B.
A7-SDM-44140(-D4140) - micro stepper moudules drivers with 1/64 microstep
resolution. Selectable current options of 0.5, 1.0, 2.0 and 3.0 amps per axis.
The stepper driver are on Axis E and F.
ID command says:
:ID
DMC4103 rev 1
Servo Amplifier Board AMP-43020 500 watt rev 1
Stepper Amplifier Board AMP-44140 rev 1
Spex uses a DMC-4183-BOX8(-16BITS) pruchased in 2012-11 for controlling it's stepper motors.
2.2 IMS Motor
M-2222-6.0D - IMS Stepper (size 23 frame).
IM483-34P1 - IMS Microstepping Drivers.
System is setup as 1/64 micro steps, priving 12800 steps per revolution.
2.3 Phytron Motor
Phytron ZSS 32.200.1.2
200 steps per revolution.
First connected to axis_e, DMC4183+SMD-44140 provide 200*64 = 12800 steps revolution.
2.4 Motor Tower Notes
Est. Motor staft to cam shaft geaing: 3.20:1
CAM take 1/2 trun to move from Detent to Detent.
Wheel has 48 cam positions
Motor: 1 RPM=12800 steps/rev
To rotate CAM staft 1 RPM = 12800 * 3.20 = 40960 steps.
To rotate To CAM Detent = 12800 * 3.20 * 0.5 = 20480 steps.
To rotate entire Wheel = 12800 * 3.20 * 0.5 * 48 = 983040 steps.
Measured sized is about 983022.
3. Software Files
testdmc.c - stand alone test application for the DMC41.
src/spex/lib/dmc41.c, dmc41.h - lower level DMC-41x3 code to be linked into applications.
These routines are linked into the spex ldog applications.
4. Configuration/Setup - updated 2025/01 when setting new spare
4.1 Galil Tool Method
Used USB port to talked to dmc4183 from PC and GDK (Galil Design Kit, v1.36.6.
USB driver is CDM20824_Setup.exe from http://www.ftdichip.com/Drivers/VCP.htm
archived in ~s2/public_html/vendor_info/galilmc)
This is a USB-to-serial interface.
4.2 Hilo Ethernet setup: 128.171.110.157 hosthname: dmc41-mt (hilo motor tower)
DH0
IA 128,171,110,157
BN 'to burn these paramters
TH - command is 'Tell Ethernet Handler'
4.3 Hilo Ethernet setup: 192.168.1.13 hosthname: spex-dmc41
DH0
IA 192,168,1,13
BN 'to burn these paramters
TH - command is 'Tell Ethernet Handler'
response was:
CONTROLLER IP ADDRESS 192,168,1,13 ETHERNET ADDRESS 00-50-4C-38-07-A7
4.4 IO Channel setup:
4.5 #AUTO:
#AUTO defines code to run a power up, something like this:
(note ' comment are not part of the program)
#AUTO
CN 1,1 'active high for limit and home
MO 'turn off all motors
OE 'Off-on-error'
#A_SE
ha=_HMA
#A_SE_1;JP #A_SE_1,ha=_HMA
ST A
EN
....
The spex-dmc41.dmc is located in ~s2/src/spex/ldog
How to download program to controller.
Use Galil tool to write/download a program.
The BP to Burn Program.
Cold Boot the controller.
Telnet in, and do a UL to view the program.
The spex-dmc41.dmc using used for the spex
(Felix is similar but CN values is different)
(ishell DMC have no program loaded).
5. Simple Digial and Analog IO
Analog Inputs
analog input configuration.
AQn,m default is +/- 10 V. We have 8 ADC.
_AQn display configureation, ie MG_AQ1
41x3 has no general purpose analog outputs.
MG _AQ1,_AQ2,_AQ3,_AQ4,_AQ5,_AQ6,_AQ7,_AQ8
MG @AN[1],@AN[2],@AN[3],@AN[4],@AN[5],@AN[6],@AN[7],@AN[8]
Analog Output
AOm,n ie: AO1,2.5
Digital Inputs
TI0
TI1 - tell input bank 0 and 1, return 0 to 255, state of 8 bits
_@IN[n] - controller variable, where n is 1 to 16.
ie, MG @IN[1]
+5v is logical 0
+0v is logical 1
Digital Output
OB n,v
n is bit# 1 to 17
v is value( 0 or 1 ). Can be logical expression.
OP$FFFF - to set all bits.
6. Stepper Motor Commands
limit switch
Could use AEN (Amp Enable) output on drivers. MO, OE3 command disable AMPs.
limit switch
Default is active low, use CN comamnd to change polarity of the switch (CN is controller wide).
CN 1,1
To disable 'LD'
Stop in direction of input; Motor left ON.
To turn off motor, use #LIMSWI subroutine. Or use OE to turn off on limit switch.
SD - set deceleration
OE - On Error - so you can turn off on ERROR.
read state: LFx, LRx, to print MG _LRE _LFE or MG_LFE, MG_LRE
Homing
FE - find edge
FI - find index
HM - standard Home.
Define Position
DPA=0
Turn on motor; find egde (toward positive); begin
SHE; FEE; BGE;
stop
ST
examples
MTA=-2.0;ACA=50000;DCA=100000;SPA=12800;KSA=1;LDA=3;
MOA; // motor off
SHA; // motor on (servo here).
PRA=500000;BGA
PRA=100;BGA;
PRA=-100;BGA;
PAA=0;BGA;
PAA=12850;BGA;
PAA=12850;BGA;
MOA; // motor off
SHA; // motor on (servo here).
7. Slide vs Continuous_Wheel vs Detented_Wheel
CN is a global setting on the DMC41. A single setting applies to all axis.
Sets limit switches active high or low for all axis. Active Low is desired.
Sets "InHome" to active low or hi for all axis. Active Low is desired.
Sets the Latch input active high or low for all axis.
Linear Slides
Reverse and Forward limits switch are used with the DMC41's Rev/Fwd Limit inputs.
Reverse and Forward limit can be used to home.
Drive the stage to one extreme, and set the postion.
Mechanical safety are required to prevent damage from run aways.
Mechicanism need to be stronger that the motor torque.
If the range of travel is small, and a sensor can absolutely encode the position,
then we can home by reading the sensor and calculating it's position.
The Array Focus mechanism is an example, is uses 2 magnets at the end, one flipped.
The sensor in the middle read a unique volt anywhere between the 2 magnets.
End of travel safety is built into the mechanism.
Continous_Wheel
A home swich on the wheel is used to initialize the wheel using the
HOME input on the DMC41.
Homing is done by using the home input. FE (Find Edge) is used.
if not "InHome", the wheel move in reverse until home is found.
If "InHome", the wheel moves foward, until home turn off.
The home position is define at this On-to-Off change of state.
If high accuracy is need, then the voltage of the hall-effect sensor can
been sampled, then home is defined as the peak voltage value from a curve fit.
Detent_Wheel
2 outputs are needed. 1 for Home, and 1 for InDetent. A single HE sensor
is used, with multiple magnets. All "InDetent" magnent in one orientation to
indicate the mechanism in a detented position. A single "Home" magnet can be put
between the detent to provide a homing location.
For homing, the DMC-41's Forward (or Reverse) Input are used. We will used forward
for this explanition.
Enable the forward limit, and HOME the mechanism by driving the wheel into the
limit (see the dmc41_st_home_onlimits() function).
Once homed, the limits are disabled on the DMC41.
The DMC-41 home input is used as an InDetent signal in order. This provide
better flexible to stop when the indent signal (HOME) is enabled.
Spex used 2 method for detent wheel moves:
1. dmc41_st_detent_moveto():
1. Moves in front of the detent (using step counts).
2. Find the Beg Edget of the detent using dmc41_st_pr_SE()
3. Move a fixed step counts to "center into the detent".
2. dmc41_st_detent_center(): Move to the center of the detent by:
1. Move to front of detent using step counts.
2. Drving forward the detent until InDetent turns ON. Save it's position.
3. Continue driving forward, until the IndDtent turns OFF. Save it position.
4. Goto the Center of the 2 saved positioned.
dmc41_st_pr_SE() - HOME Problem and Stop Edge (SE) code
The DMC-41 home routine FE is not very flexible. It chooses the direction
and speed based on the state of the HOME input.
(find edge)
if(Home high) then move forward at AC, SP. DC until Home==low
if(Home low) them move reverse at AC, SP, DC until Home=high
Another issue, the the logic state of the limit and home input, are
set by the CN command. The command sets the logic across all axis, so
for example we can not have axis A be home HIGH, and B be HOME low.
The all must be the same.
To overcome this issue, we burn the following code into the DMC-41x8 for each axis.
REM -----------------------------------------------
REM Axis A Stop Edge - ST at HOME change of state
REM
#A_SE
ha=_HMA
#A_SE_1;JP #A_SE_1,ha=_HMA
ST A
EN
The host can then do the follow to allow the axis to move, then stop when
the HOME input changes state, the "SE" means Stop Edge.
HX 0;XQ #A_SE,0; // halt, then start SE thread.
PRA=wheel_size;BGA; // move to find an edge
// wait until motor stops.
HX 0; // Halt Execute.
//read postion, and state of home input
The code for each axis was written.
There are 8 threads available, so each axis take a thread.
This has been implement in the dmc41.c and testdmc.c code.