324 Real Time Motor Controller

324 : Real Time Motor Controller

Design render
  • Author: J. R. Petrus
  • Description: Controls a stepper motor with precise timing between steps.
  • GitHub repository
  • Clock: 50000000 Hz

Introduction

The Real Time Motor Controller (RTMC) is designed to control a stepper motor such as the SEQ_28BYJ_48. The step_table is programmed with the coil positions for the motor, and each step advances the table_idx to the next coil position. The size of the step is programmable via step_size. The step_size may be positive or negative. The example motor supports step_size in [-2, -1, 1, 2]. The table_last set the limit for the table_idx before resetting to 0. It would be set to 7 for the example motor if abs(step_size) == 1 or 6 if abs(step_size) == 2.

The step control increments the table_idx + step_size. The run control continously increments table_idx, with a pause of step_delay cycles between increments.

SPI Peripheral Protocol

Control of the RTMC is accomplished via its SPI peripheral interface and simple read/write protocol.

SPI must be byte-oriented and send most significant bit first.

SPI mode must be CPOL=0, CPHA=0.

1-byte OPCODE: NOP=0, RD=1, WR=2.

1-byte ADDRESS: Select the register

2-byte DATA: Transfer in two bytes, MSB first.

1-byte RESULT: BUSY=0, ACK=1, ACK_DATA=2

The SPI peripheral should operate at up to 1/2 the core clock frequency. My target is 50 MHz core and 25 MHz SCK.

Write Operation

Tx: WR, ADDR, DATA0, DATA1

Rx: Loop reading 1-byte RESULT until ACK seen.

Read Operation

Tx: RD, ADDR

Rx: Loop reading 1-byte RESULT until ACK_DATA seen.

Rx: DATA0, DATA1

Memory Map

16-bit Register Offset Access Description
id 0x00 R ID: {version, idcode}
gpio 0x01 RW GPIO: {mc_oe[7:0], gpo[3:0], gpi[3:0]}
step_ctrl 0x02 RW Step Control: {run, step, reserved[4:0], table_last[3:0], step_size[4:0]}
step_stat 0x03 R Step Status: {reserved[7"0], state[3:0], table_idx[3:0]}
step_delay0 0x04 RW Step Delay: Most significant 16 bits, unsigned.
step_delay1 0x05 RW Step Delay: Least significant 16 bits, unsigned.
step_count0 0x06 R, WC Step Count: Most significant 16 bits, signed. WC = write-to-clear
step_count1 0x07 R, WC Step Count: Least significant 16 bits, signed.
delay_count0 0x08 R, WC Delay Count: Most significant 16 bits, unsigned.
delay_count1 0x09 R, WC Delay Count: Least significant 16 bits, unsigned.
step_table[0] 0x10 RW Motor State 0: 8-bits mapped to uio[7:0].
... ...
step_table[15] 0x1F RW Motor State 15: 8-bits mapped to uio[7:0].

Pinout

Inputs

ui[0]: General Purpose Input gpi[0]

ui[1]: General Purpose Input gpi[1]

ui[2]: General Purpose Input gpi[2]

ui[3]: General Purpose Input gpi[3]

ui[4]: SPI0.cs

ui[5]: SPI0.sck

ui[6]: SPI0.tx

ui[7]: Connected to uo[6]

Outputs

uo[0]: General Purpose Output gpo[0]

uo[1]: General Purpose Output gpo[1]

uo[2]: General Purpose Output gpo[2]

uo[3]: General Purpose Output gpo[3]

uo[4]: Connected to ^uio_in

uo[5]: Connected to ui[7]

uo[6]: Connected to ena

uo[7]: SPI0.rx

Bidirectional pins

uio[0]: Motor Control mc[0]

uio[1]: Motor Control mc[1]

uio[2]: Motor Control mc[2]

uio[3]: Motor Control mc[3]

uio[4]: Motor Control mc[4]

uio[5]: Motor Control mc[5]

uio[6]: Motor Control mc[6]

uio[7]: Motor Control mc[7]

How to test

Connect up the external hardware, program the registers, and write a 1 to the run bit. MicroPython code in the works, but not until the chips come back.

External hardware

Assuming use of the TT Demo board.

Utilize the RP2040 SPI0 in controller mode to communicate with the RTMC.

Connect uio[3:0] to a SEQ_28BYJ_48 motor + ULN2003 Driver.

uio[7:4] could optionally be connected to a second motor driven in tandem.

IO

#InputOutputBidirectional
0General Purpose Input gpi[0]General Purpose Output gpo[0]Motor Control mc[0]
1General Purpose Input gpi[1]General Purpose Output gpo[1]Motor Control mc[1]
2General Purpose Input gpi[2]General Purpose Output gpo[2]Motor Control mc[2]
3General Purpose Input gpi[3]General Purpose Output gpo[3]Motor Control mc[3]
4SPI0.csConnected to ^uio_inMotor Control mc[4]
5SPI0.sckConnected to ui[7]Motor Control mc[5]
6SPI0.txConnected to enaMotor Control mc[6]
7Connected to uo[6]SPI0.rxMotor Control mc[7]

Chip location

Controller Mux Mux Mux Mux Mux Mux Mux Mux Mux Mux Mux Analog Mux Mux Mux Mux Mux Mux Mux Mux Mux Mux Mux Analog Mux Mux Mux Mux Mux Mux Mux Mux Mux Mux tt_um_chip_rom (Chip ROM) tt_um_factory_test (TinyTapeout 7 Factory Test) tt_um_analog_factory_test (TT07 Analog Factory Test) tt_um_urish_charge_pump (Dickson Charge Pump) tt_um_adennen_inverter (Aron's analog buffer test) tt_um_rejunity_z80 (Zilog Z80) tt_um_kianv_bare_metal (KianV RISC-V RV32E Baremetal SoC) tt_um_macros77_subneg (SUBNEG CPU) tt_um_eater_8bit (Tiny Eater 8 Bit) tt_um_ender_clock (clock) tt_um_wokwi_397140982440144897 (7-Seg 'Tiny Tapeout' Display) tt_um_wokwi_397142450561071105 (Padlock) tt_um_Burrows_Katie (QIF Neuron) tt_um_vga_clock (VGA clock) tt_um_aidenfoxivey (CRC-8 CCITT) tt_um_PUF (Reversible logic based Ring-Oscillator Physically Unclonable Function (RO-PUF)) tt_um_devinatkin_dual_oscillator (dual oscillator) tt_um_urish_simon (Simon Says memory game) tt_um_ajstein_stopwatch (Stopwatch Project) tt_um_rnunes2311_12bit_sar_adc (12 bit SAR ADC) tt_um_DanielZhu123 (calculator) tt_um_wokwi_397268065185737729 (Mini Light Up Game) tt_um_toivoh_basilisc_2816 (Basilisc-2816) tt_um_MichaelBell_rle_vga (RLE Video Player) tt_um_wokwi_397774697322214401 (secret L) tt_um_ccattuto_charmatrix (Serial Character LED Matrix) tt_um_The_Chairman_send_receive (Send Receive) tt_um_mini_aie_2x2 (mini-aie-cgra) tt_um_twin_tee_opamp_osc (Twin Tee Sine Wave Generator) tt_um_brucemack_sb_mixer (Single Balanced Mixer) tt_um_revenantx86_tinytpu (TinyTPU) tt_um_chess (Chess) tt_um_vga_perlin (VGA Perlin Noise) tt_um_calonso88_74181 (ALU 74181) tt_um_tinytapeout_dvd_screensaver (DVD Screensaver with Tiny Tapeout Logo (Tiny VGA)) tt_um_TD4_Assy_KosugiSubaru (4bit_CPU_td4) tt_um_drburke3_top (FastMagnitudeComparator) tt_um_pongsagon_tiniest_gpu (Tiniest GPU) tt_um_jorga20j_prng (8 bit PRNG) tt_um_ejfogleman_smsdac8 (8-bit DEM R2R DAC) tt_um_ccattuto_conway (Conway's Terminal) tt_um_fp_mac (FP-8 MAC Module) tt_um_router (router) tt_um_serdes (SerDes) tt_um_rejunity_analog_dac_ay8913 (AY-8193 single channel DAC) tt_um_riscv_spi_wrapper (RISCV32I with spi wrapper) tt_um_mos_bandgap (MOS Bandgap) tt_um_shadow1229_vga_player (VGA player) tt_um_explorer (Explorer) tt_um_rtmc_top_jrpetrus (Real Time Motor Controller) tt_um_28add11_QOAdecode (QOA Decoder) tt_um_toivoh_basilisc_2816_cpu_OL2 (Basilisc-2816) tt_um_afasolino (integer to posit converter and adder ) tt_um_8bit_vector_compute_in_SRAM (8-bit Vector Compute-in-SRAM) tt_um_lfsr (LFSR) tt_um_tnt_diff_rx (TT07 Differential Receiver test) tt_um_urish_spell (SPELL) tt_um_underserved (underserved) tt_um_dpetrisko_ttdll (TTDLL) tt_um_mitssdd (co processor for precision farming) tt_um_wokwi_399192124046955521 (ECC_test1) tt_um_dusterthefirst_project (Communicate 433) tt_um_xeniarose_sha256 (tiny sha256) tt_um_njp_micro (MicroCode Multiplier) tt_um_VishalBingi_r2r_4b (4-bit R2R DAC) tt_um_lisa (LISA Microcontroller with TTLC) tt_um_template (TT7 Simple Clock) tt_um_seanyen0_SIMON (SIMON) tt_um_agurrier_mastermind (Mastermind) tt_um_KolosKoblasz_mixer (Gilbert Mixer) tt_um_Saitama225_comp (Analog comparator) tt_um_tt7_meonwara (TBD) tt_um_multiplier_mbm (Modified Booth Multiplier) tt_um_delay_line_tmng (Delay Line Time Multiplexed NAND Gate) tt_um_mandelbrot_accel (Mandelbrot Set Accelerator (32-bit IEEE 754)) tt_um_dvxf_dj8v_dac (DJ8 8-bit CPU w/ DAC) tt_um_obriensp_pll (PLL Playground) tt_um_unisnano (unisnano) tt_um_alfiero88_CurrentTrigger (Current Mode Trigger) tt_um_CktA_InstAmp (Instrumentation Amplifier for Electrocardiogram Signal Adquisition) tt_um_lcasimon_tdc (Analog TDC) tt_um_neural_network (Neural Network dinamic) tt_um_PS_PWM (Phase Shifted PWM Modulator) tt_um_litneet64_ro_puf (RO-based Physically Unclonable Function (PUF)) tt_um_wokwi_399163158804194305 (Digital Timer) tt_um_algofoogle_raybox_zero (raybox-zero TT07 edition) tt_um_wokwi_399336892246401025 (UART) tt_um_wokwi_399169514887574529 (Gaussian Blur) tt_um_maheredia (GPS signal generator) tt_um_pwm_elded (UACJ_PWM) tt_um_wokwi_399447152724198401 (8-Bit Register) tt_um_adonairc_dda (DDA solver for van der Pol oscillator) tt_um_6bitaddr (6 bit addr) tt_um_btflv_subleq (Subleq CPU with FRAM and UART) tt_um_emern_top (badGPU) tt_um_wokwi_399469995038350337 (dEFAULt 2hAC) tt_um_mixed_signal_pulse_gen (mixed_signal_pulse_gen) tt_um_maxluppe_digital_analog (All Digital DAC and Analog Comparators) tt_um_pyamnihc_dummy_counter (Dummy Counter) tt_um_wokwi_399488550855755777 (My 9-year-old son made an 8-bit counter chip) tt_um_toivoh_basilisc_2816_cpu_exp (Basilisc-2816 Experimental) tt_um_htfab_fprn (Field Programmable Resistor Network) tt_um_rejunity_ay8913 (Classic 8-bit era Programmable Sound Generator AY-3-8913) tt_um_maxluppe_NIST (Four NIST SP 800-22 tests implementation) tt_um_vga_snake (VGA Snake Game) tt_um_cm_1 (GDS counter-measures experiment 1) tt_um_nurirfansyah_alits02 (Analog Test Circuit ITS 2) tt_um_analog_rf_readout_circuit (RF_peripheral_circuits) tt_um_jleightcap (fractran-tt) tt_um_wokwi_399518371950068737 (Full-adder out of a kmap) tt_um_davidparent_hdl (PRBS Generator) tt_um_adia_psu_seq_test (Adiabatic PSU sequencer test) tt_um_spacecat_chan_john_pong_the_second (John Pong The Second) tt_um_rajum_iterativeMAC (Iterative MAC) tt_um_asinghani_tinywspr (TinyWSPR) tt_um_thatoddmailbox (DuckCPU) tt_um_rejunity_vga (VGA Checkers) tt_um_8bitadder (Ripple Carry Adder 8 bit) tt_um_vzayakov_top (Pong-VGA) tt_um_pa1mantri_cdc_fifo (Clock Domain Crossing FIFO) Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available