encoder and tachometer class for EW3XX single board computer

Committer:
lddevrie
Date:
Mon Aug 16 11:12:19 2021 +0000
Revision:
5:58b13292286e
Parent:
3:b05d231c9549
update for digital pot motor control

Who changed what in which revision?

UserRevisionLine numberNew contents of line
lddevrie 0:1d5bf13d7dbb 1 /* C Library for the WRC-305-SBC
lddevrie 0:1d5bf13d7dbb 2 J Bradshaw
lddevrie 0:1d5bf13d7dbb 3 L DeVries
lddevrie 0:1d5bf13d7dbb 4 20140912
lddevrie 0:1d5bf13d7dbb 5 20140918 J Bradshaw - Found CS mistake in Encoder routines
lddevrie 0:1d5bf13d7dbb 6 Added comments in Init function, encoder functions
lddevrie 0:1d5bf13d7dbb 7 20150210 J Bradshaw - Initialized DigitalOuts with pre-defined logic
lddevrie 0:1d5bf13d7dbb 8 levels (CS's high, etc)
lddevrie 0:1d5bf13d7dbb 9 20161011 J Bradshaw - Changed MAX1270 ADC SCLK to 5MHz and format(12, 0)
lddevrie 0:1d5bf13d7dbb 10 for conversion mode to match datasheet (200ns SCLK max PW high and low)
lddevrie 0:1d5bf13d7dbb 11 20190814 L DeVries - revised mbedWSEsbc to create EW305-specific library
lddevrie 0:1d5bf13d7dbb 12 */
lddevrie 0:1d5bf13d7dbb 13 #ifndef TACH_H
lddevrie 0:1d5bf13d7dbb 14 #define TACH_H
lddevrie 0:1d5bf13d7dbb 15
lddevrie 0:1d5bf13d7dbb 16
lddevrie 0:1d5bf13d7dbb 17
lddevrie 0:1d5bf13d7dbb 18
lddevrie 0:1d5bf13d7dbb 19 /**
lddevrie 0:1d5bf13d7dbb 20 * Includes
lddevrie 0:1d5bf13d7dbb 21 */
lddevrie 0:1d5bf13d7dbb 22 #include "mbed.h"
lddevrie 0:1d5bf13d7dbb 23
lddevrie 0:1d5bf13d7dbb 24 // LS7366 ENCODER IC DEFINITIONS
lddevrie 0:1d5bf13d7dbb 25 //=============================================================================
lddevrie 0:1d5bf13d7dbb 26 // Four commands for the Instruction Register (B7,B6) - LS7366
lddevrie 0:1d5bf13d7dbb 27 //=============================================================================
lddevrie 0:1d5bf13d7dbb 28 #define CLR 0x00 //Clear Instruction
lddevrie 0:1d5bf13d7dbb 29 #define RD 0x01 //Read Instruction
lddevrie 0:1d5bf13d7dbb 30 #define WR 0x02 //Write Instruction
lddevrie 0:1d5bf13d7dbb 31 #define LOAD 0x03 //Load Instruction
lddevrie 0:1d5bf13d7dbb 32
lddevrie 0:1d5bf13d7dbb 33 //=============================================================================
lddevrie 0:1d5bf13d7dbb 34 // Register to Select from the Instruction Register (B5,B4,B3) - LS7366
lddevrie 0:1d5bf13d7dbb 35 //=============================================================================
lddevrie 0:1d5bf13d7dbb 36 #define NONE 0x00 //No Register Selected
lddevrie 0:1d5bf13d7dbb 37 #define MDR0 0x01 //Mode Register 0
lddevrie 0:1d5bf13d7dbb 38 #define MDR1 0x02 //Mode Register 1
lddevrie 0:1d5bf13d7dbb 39 #define DTR 0x03 //Data Transfer Register
lddevrie 0:1d5bf13d7dbb 40 #define CNTR 0x04 //Software Configurable Counter Register
lddevrie 0:1d5bf13d7dbb 41 #define OTR 0x05 //Output Transfer Register
lddevrie 0:1d5bf13d7dbb 42 #define STR 0x06 //Status Register
lddevrie 0:1d5bf13d7dbb 43 #define NONE_REG 0x07 //No Register Selected
lddevrie 0:1d5bf13d7dbb 44
lddevrie 0:1d5bf13d7dbb 45
lddevrie 5:58b13292286e 46 //=============================================================================
lddevrie 5:58b13292286e 47 // AD5293 Command Set - Table 11 of Datasheet Command Operation Truth Table
lddevrie 5:58b13292286e 48 //=============================================================================
lddevrie 5:58b13292286e 49 #define MAX_SCALE 0.9f
lddevrie 5:58b13292286e 50 #define NOP 0x0 // Do nothing
lddevrie 5:58b13292286e 51 #define WRDAC 0x1 // Write the contects of the serial register to the RDAC (D9 - D0)
lddevrie 5:58b13292286e 52 #define RRDAC 0x2 // Read the RDAC wiper setting from SDO in the next frame
lddevrie 5:58b13292286e 53 #define RESET 0x4 // Refresh the RDAC with midscale code
lddevrie 5:58b13292286e 54 #define WCON 0x6 // Write contents of serial reg to control reg (D2, D1)
lddevrie 5:58b13292286e 55 #define RCON 0x7 // Read control register from SDO output in the next frame
lddevrie 5:58b13292286e 56 #define PWDN 0x8 // Software power down (D0=0 normal mode, D0=1 shutdown mode)
lddevrie 5:58b13292286e 57
lddevrie 0:1d5bf13d7dbb 58
lddevrie 0:1d5bf13d7dbb 59 /**
lddevrie 5:58b13292286e 60 * Tach and motor control Interface.
lddevrie 0:1d5bf13d7dbb 61 */
lddevrie 0:1d5bf13d7dbb 62 class EW305sbc
lddevrie 0:1d5bf13d7dbb 63 {
lddevrie 0:1d5bf13d7dbb 64
lddevrie 0:1d5bf13d7dbb 65 public:
lddevrie 0:1d5bf13d7dbb 66
lddevrie 0:1d5bf13d7dbb 67 /**
lddevrie 0:1d5bf13d7dbb 68 * Constructor.
lddevrie 0:1d5bf13d7dbb 69 *
lddevrie 0:1d5bf13d7dbb 70 * Tracks encoder position and speed, provides
lddevrie 0:1d5bf13d7dbb 71 * rotations per second (Hz) output
lddevrie 0:1d5bf13d7dbb 72 *
lddevrie 0:1d5bf13d7dbb 73 * @param Channel input channel from SPI chip.
lddevrie 0:1d5bf13d7dbb 74 * @param pulsesPerRev Number of pulses in one revolution (quadrature encoder).
lddevrie 0:1d5bf13d7dbb 75 */
lddevrie 0:1d5bf13d7dbb 76 EW305sbc(int ch, int pulsesPerRev);
lddevrie 0:1d5bf13d7dbb 77
lddevrie 0:1d5bf13d7dbb 78 /**
lddevrie 0:1d5bf13d7dbb 79 * Read the speed of the motor shaft
lddevrie 0:1d5bf13d7dbb 80 */
lddevrie 0:1d5bf13d7dbb 81 float getSpeed(void);
lddevrie 0:1d5bf13d7dbb 82
lddevrie 0:1d5bf13d7dbb 83 /**
lddevrie 0:1d5bf13d7dbb 84 * Read the speed of the motor shaft
lddevrie 0:1d5bf13d7dbb 85 */
lddevrie 0:1d5bf13d7dbb 86 int getCount(void);
lddevrie 0:1d5bf13d7dbb 87
lddevrie 2:6cf351721d86 88 /**
lddevrie 2:6cf351721d86 89 * Read angle of the motor shaft
lddevrie 2:6cf351721d86 90 */
lddevrie 2:6cf351721d86 91 float getAngle(void);
lddevrie 2:6cf351721d86 92
lddevrie 0:1d5bf13d7dbb 93 /**
lddevrie 0:1d5bf13d7dbb 94 * Read the state of the motor shaft
lddevrie 0:1d5bf13d7dbb 95 */
lddevrie 0:1d5bf13d7dbb 96 long LS7366_read_counter(int chan_num);
lddevrie 0:1d5bf13d7dbb 97
lddevrie 0:1d5bf13d7dbb 98 /**
lddevrie 0:1d5bf13d7dbb 99 * Read the state of the motor shaft, quadrature??
lddevrie 0:1d5bf13d7dbb 100 */
lddevrie 0:1d5bf13d7dbb 101 void LS7366_quad_mode_x4(int chan_num);
lddevrie 0:1d5bf13d7dbb 102
lddevrie 0:1d5bf13d7dbb 103 /**
lddevrie 0:1d5bf13d7dbb 104 * Reset the encoder counts
lddevrie 0:1d5bf13d7dbb 105 */
lddevrie 0:1d5bf13d7dbb 106 void LS7366_reset_counter(int chan_num);
lddevrie 0:1d5bf13d7dbb 107
lddevrie 5:58b13292286e 108 /**
lddevrie 5:58b13292286e 109 * set input voltage to motor
lddevrie 5:58b13292286e 110 */
lddevrie 5:58b13292286e 111 void analog_input(float inp);
lddevrie 0:1d5bf13d7dbb 112
lddevrie 5:58b13292286e 113 /**
lddevrie 5:58b13292286e 114 * initialize digital potentiometer
lddevrie 5:58b13292286e 115 */
lddevrie 5:58b13292286e 116 void init_ad5293(void);
lddevrie 5:58b13292286e 117 void reset_ad5293(void);
lddevrie 0:1d5bf13d7dbb 118
lddevrie 0:1d5bf13d7dbb 119 private:
lddevrie 0:1d5bf13d7dbb 120
lddevrie 0:1d5bf13d7dbb 121 // Set-up hardwired IO
lddevrie 0:1d5bf13d7dbb 122 Ticker updater;
lddevrie 0:1d5bf13d7dbb 123
lddevrie 0:1d5bf13d7dbb 124 int ch_;
lddevrie 0:1d5bf13d7dbb 125 int pulsesPerRev_;
lddevrie 0:1d5bf13d7dbb 126
lddevrie 0:1d5bf13d7dbb 127
lddevrie 0:1d5bf13d7dbb 128 //SPI spi_max1270(PinName p5,PinName p6,PinName p7);
lddevrie 0:1d5bf13d7dbb 129 SPI spi;//(PinName p5,PinName p6,PinName p7);
lddevrie 0:1d5bf13d7dbb 130 DigitalOut ls7166_cs1;//(PinName p19,int tmp=1); //CS for LS7366-1 (U8)
lddevrie 0:1d5bf13d7dbb 131 DigitalOut ls7166_cs2;//(PinName p20, int tmp=1); //CS for LS7366-2 (U9)
lddevrie 5:58b13292286e 132 DigitalOut ad5293_sync; // (p12,1); //CS for Digital potentiometer AD5293
lddevrie 5:58b13292286e 133 DigitalIn ad5293_rdy; // (p27); // data ready input pin from AD5293 digital pot
lddevrie 0:1d5bf13d7dbb 134
lddevrie 0:1d5bf13d7dbb 135 long count_;
lddevrie 0:1d5bf13d7dbb 136 float speed_;
lddevrie 3:b05d231c9549 137 float angle_;
lddevrie 0:1d5bf13d7dbb 138 long countp_;
lddevrie 0:1d5bf13d7dbb 139 int dt_;
lddevrie 0:1d5bf13d7dbb 140
lddevrie 0:1d5bf13d7dbb 141 /**
lddevrie 0:1d5bf13d7dbb 142 * internal encoder cmd
lddevrie 0:1d5bf13d7dbb 143 */
lddevrie 0:1d5bf13d7dbb 144 void LS7366_cmd(int inst, int reg);
lddevrie 0:1d5bf13d7dbb 145
lddevrie 0:1d5bf13d7dbb 146 /**
lddevrie 0:1d5bf13d7dbb 147 * write to DTR pin?
lddevrie 0:1d5bf13d7dbb 148 */
lddevrie 0:1d5bf13d7dbb 149 void LS7366_write_DTR(int chan_num,long enc_value);
lddevrie 0:1d5bf13d7dbb 150
lddevrie 0:1d5bf13d7dbb 151 /**
lddevrie 0:1d5bf13d7dbb 152 * initialization
lddevrie 0:1d5bf13d7dbb 153 */
lddevrie 0:1d5bf13d7dbb 154 void init();
lddevrie 0:1d5bf13d7dbb 155
lddevrie 0:1d5bf13d7dbb 156
lddevrie 0:1d5bf13d7dbb 157 /**
lddevrie 0:1d5bf13d7dbb 158 * update current speed estimate
lddevrie 0:1d5bf13d7dbb 159 */
lddevrie 0:1d5bf13d7dbb 160 void recalc(void);
lddevrie 5:58b13292286e 161
lddevrie 5:58b13292286e 162 /**
lddevrie 5:58b13292286e 163 * write data to digital potentiometer
lddevrie 5:58b13292286e 164 */
lddevrie 5:58b13292286e 165 void write_ad5293(int cmd, int data);
lddevrie 5:58b13292286e 166
lddevrie 5:58b13292286e 167
lddevrie 0:1d5bf13d7dbb 168 };
lddevrie 0:1d5bf13d7dbb 169
lddevrie 0:1d5bf13d7dbb 170 #endif /* TACH_H */