encoder and tachometer class for EW3XX single board computer
EW305sbc.h@5:58b13292286e, 2021-08-16 (annotated)
- 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?
User | Revision | Line number | New 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 */ |