diff --git a/README.md b/README.md
index a6b922b..4bb300f 100644
--- a/README.md
+++ b/README.md
@@ -9,6 +9,8 @@ motorDSM can also be built outside of motor by copying it's ``configure/EXAMPLE_
motorDSM contains an example IOC that is built if ``configure/CONFIG_SITE.local`` sets ``BUILD_IOCS = YES``. The example IOC can be built outside of the driver module. Copy ``iocs/dsmIOC/configure/EXAMPLE_RELEASE.local`` to ``RELEASE.local`` and uncomment and set the paths for the appropriate lines depending on whether motorDSM was built inside the motor module or independently.
+# Running an example IOC
+
To run the example IOC, in the ``iocs/dsmIOC/iocBoot/iocDsm`` directory, run
$ ../../bin/linux-x86_64/dsm st.cmd.md90
@@ -17,7 +19,60 @@ for one attached MD-90 controller, or
$ ../../bin/linux-x86_64/dsm st.cmd.md90.multi
-for eight attached MD-90 controllers. You may need to change the path(s) for the serial port(s) in ``st.cmd.md90`` or ``st.cmd.md90.multi`` if the MD-90 is not attached at ``/dev/ttyUSB0``.
+for eight attached MD-90 controllers.
+
+You will need to set the path(s) for the serial port(s) in ``st.cmd.md90`` (for a single unit) or ``st.cmd.md90.multi`` (for multiple units).
+You will also need to ensure they match the names used in ``motor.substitutions.md90`` (or ``motor.substitutions.md90.multi``).
+By default, ports are assumed to be at ``/dev/ttyUSB0``, ``/dev/ttyUSB1``, etc.
+You will also need to comment or uncomment lines depending on the number of drivers you have connected. For each driver, make sure you uncomment/call the following functions:
+
+**1. Define a new serial port named "serial0"**
+`drvAsynSerialPortConfigure([serial name], [device location], 0, 0, 0)`
+*e.g., `drvAsynSerialPortConfigure("serial0", "/dev/ttyUSB0", 0, 0, 0)`*
+
+**2. Configure the port**
+- Baud = 115200
+- Bits = 8
+- Parity = none
+- Stop bits = 1
+- Input end of message: "\r"
+- Output end of message: "\r"
+- Trace IO mask: 2
+```
+asynSetOption([serial name], 0, "baud", "115200")
+asynSetOption([serial name], 0, "bits", "8")
+asynSetOption([serial name], 0, "parity", "none")
+asynSetOption([serial name], 0, "stop", "1")
+asynOctetSetInputEos("serial0", 0, "\r")
+asynOctetSetOutputEos("serial0", 0, "\r")
+asynSetTraceIOMask("serial0", 0, 2)
+```
+where `[serial name]` is the name you assigned in step 1, surrounded by double quotes.
+
+**3. Set initial parameters**
+- Power supply enabled (`EPS` command)
+- Deadband = 10 nm (`SDB 10` command)
+```
+asynOctetConnect("initConnection", [serial name], 0)
+asynOctetWrite("initConnection", "EPS")
+asynOctetWrite("initConnection", "SDB 10")
+asynOctetDisconnect('initConnection')
+```
+
+**4. Create MD90 Controller object**
+`MD90CreateController([controller name], [serial name], 1, 100, 5000)`
+where `[controller name]` is the name of the motor to assign. Convention is to use "MD90n", starting with n=0.
+
+**5. Intialize the IOC**
+After calling `iocInit`, run the following lines for each motor. The example below uses `DSM:m0` but it should be run for each line described in motor.substitutions.md90 (or motor.substitutions.md90.multiple).
+````
+dbpf("DSM:m0.RTRY", "0") #sets retries to 0; this is automatic on the MD90
+dbpf("DSM:m0.TWV", "0.1") #Tweak distance
+dbpf("DSM:m0.VMAX", "1.0") #Sets max velocity to 1 mm/s
+dbpf("DSM:m0.HVEL", "1.0") #Sets max velocity to 1 mm/s
+````
+
+# Compiling motorDSM
------------------------
@@ -108,3 +163,26 @@ In ``motorDSM/iocs/dsmIOC/configure``, copy ``EXAMPLE_RELEASE.local`` to ``RELEA
$ cd $SUPPORT/motorDSM
$ make distclean
$ make
+
+------------------------
+# Example usage
+
+After building, run the example IOC described at the top of this section in one terminal window.
+Open another terminal window and navigate to [EPICS install directory]/epics-base/bin/linux-x86_64/ (or wherever you built EPICS base.
+Use the commands `caput` and `caget` to set and read process variables.
+
+For example, to get the current position, use `./caget DSM:m0.REP`. This reads the REP variable, which is the "Raw Encoder Position". Set m0 to m1, m2, etc. for multiple motors.
+
+Other examples
+-------------------------
+
+Homing the motor (must be done before you can issue position commands):
+`./caput DSM:m0.HOMF 1 #Begins homing sequence in the forward direction`
+`./caput DSM:m0.HOMR 1 #Begins homing sequence in the reverse direction`
+
+Moving to a position target:
+`./caput DSM:m0.VAL 2.345 #Moves to 2.345 mm
+
+Setting a velocity target:
+`./caput DSM:m0.VELO 0.5 #Sets velocity target to 0.5 mm/s`
+Note that velocity targets are appropriate only. They adjust the step rate of the motor, and are not guaranteed to be exact.
\ No newline at end of file