encoder and tachometer class for EW3XX single board computer
EW305sbc.h@0:1d5bf13d7dbb, 2019-08-15 (annotated)
- Committer:
- lddevrie
- Date:
- Thu Aug 15 19:21:44 2019 +0000
- Revision:
- 0:1d5bf13d7dbb
- Child:
- 2:6cf351721d86
Initial Commit of EW305-specific library for reading encoder from EW3XX sbc
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 | 0:1d5bf13d7dbb | 46 | |
lddevrie | 0:1d5bf13d7dbb | 47 | /** |
lddevrie | 0:1d5bf13d7dbb | 48 | * Tach Interface. |
lddevrie | 0:1d5bf13d7dbb | 49 | */ |
lddevrie | 0:1d5bf13d7dbb | 50 | class EW305sbc |
lddevrie | 0:1d5bf13d7dbb | 51 | { |
lddevrie | 0:1d5bf13d7dbb | 52 | |
lddevrie | 0:1d5bf13d7dbb | 53 | public: |
lddevrie | 0:1d5bf13d7dbb | 54 | |
lddevrie | 0:1d5bf13d7dbb | 55 | /** |
lddevrie | 0:1d5bf13d7dbb | 56 | * Constructor. |
lddevrie | 0:1d5bf13d7dbb | 57 | * |
lddevrie | 0:1d5bf13d7dbb | 58 | * Tracks encoder position and speed, provides |
lddevrie | 0:1d5bf13d7dbb | 59 | * rotations per second (Hz) output |
lddevrie | 0:1d5bf13d7dbb | 60 | * |
lddevrie | 0:1d5bf13d7dbb | 61 | * @param Channel input channel from SPI chip. |
lddevrie | 0:1d5bf13d7dbb | 62 | * @param pulsesPerRev Number of pulses in one revolution (quadrature encoder). |
lddevrie | 0:1d5bf13d7dbb | 63 | */ |
lddevrie | 0:1d5bf13d7dbb | 64 | EW305sbc(int ch, int pulsesPerRev); |
lddevrie | 0:1d5bf13d7dbb | 65 | |
lddevrie | 0:1d5bf13d7dbb | 66 | /** |
lddevrie | 0:1d5bf13d7dbb | 67 | * Read the speed of the motor shaft |
lddevrie | 0:1d5bf13d7dbb | 68 | */ |
lddevrie | 0:1d5bf13d7dbb | 69 | float getSpeed(void); |
lddevrie | 0:1d5bf13d7dbb | 70 | |
lddevrie | 0:1d5bf13d7dbb | 71 | /** |
lddevrie | 0:1d5bf13d7dbb | 72 | * Read the speed of the motor shaft |
lddevrie | 0:1d5bf13d7dbb | 73 | */ |
lddevrie | 0:1d5bf13d7dbb | 74 | int getCount(void); |
lddevrie | 0:1d5bf13d7dbb | 75 | |
lddevrie | 0:1d5bf13d7dbb | 76 | |
lddevrie | 0:1d5bf13d7dbb | 77 | /** |
lddevrie | 0:1d5bf13d7dbb | 78 | * Read the state of the motor shaft |
lddevrie | 0:1d5bf13d7dbb | 79 | */ |
lddevrie | 0:1d5bf13d7dbb | 80 | long LS7366_read_counter(int chan_num); |
lddevrie | 0:1d5bf13d7dbb | 81 | |
lddevrie | 0:1d5bf13d7dbb | 82 | /** |
lddevrie | 0:1d5bf13d7dbb | 83 | * Read the state of the motor shaft, quadrature?? |
lddevrie | 0:1d5bf13d7dbb | 84 | */ |
lddevrie | 0:1d5bf13d7dbb | 85 | void LS7366_quad_mode_x4(int chan_num); |
lddevrie | 0:1d5bf13d7dbb | 86 | |
lddevrie | 0:1d5bf13d7dbb | 87 | /** |
lddevrie | 0:1d5bf13d7dbb | 88 | * Reset the encoder counts |
lddevrie | 0:1d5bf13d7dbb | 89 | */ |
lddevrie | 0:1d5bf13d7dbb | 90 | void LS7366_reset_counter(int chan_num); |
lddevrie | 0:1d5bf13d7dbb | 91 | |
lddevrie | 0:1d5bf13d7dbb | 92 | |
lddevrie | 0:1d5bf13d7dbb | 93 | |
lddevrie | 0:1d5bf13d7dbb | 94 | private: |
lddevrie | 0:1d5bf13d7dbb | 95 | |
lddevrie | 0:1d5bf13d7dbb | 96 | // Set-up hardwired IO |
lddevrie | 0:1d5bf13d7dbb | 97 | Ticker updater; |
lddevrie | 0:1d5bf13d7dbb | 98 | |
lddevrie | 0:1d5bf13d7dbb | 99 | int ch_; |
lddevrie | 0:1d5bf13d7dbb | 100 | int pulsesPerRev_; |
lddevrie | 0:1d5bf13d7dbb | 101 | |
lddevrie | 0:1d5bf13d7dbb | 102 | |
lddevrie | 0:1d5bf13d7dbb | 103 | //SPI spi_max1270(PinName p5,PinName p6,PinName p7); |
lddevrie | 0:1d5bf13d7dbb | 104 | SPI spi;//(PinName p5,PinName p6,PinName p7); |
lddevrie | 0:1d5bf13d7dbb | 105 | DigitalOut ls7166_cs1;//(PinName p19,int tmp=1); //CS for LS7366-1 (U8) |
lddevrie | 0:1d5bf13d7dbb | 106 | DigitalOut ls7166_cs2;//(PinName p20, int tmp=1); //CS for LS7366-2 (U9) |
lddevrie | 0:1d5bf13d7dbb | 107 | |
lddevrie | 0:1d5bf13d7dbb | 108 | long count_; |
lddevrie | 0:1d5bf13d7dbb | 109 | float speed_; |
lddevrie | 0:1d5bf13d7dbb | 110 | long countp_; |
lddevrie | 0:1d5bf13d7dbb | 111 | int dt_; |
lddevrie | 0:1d5bf13d7dbb | 112 | |
lddevrie | 0:1d5bf13d7dbb | 113 | /** |
lddevrie | 0:1d5bf13d7dbb | 114 | * internal encoder cmd |
lddevrie | 0:1d5bf13d7dbb | 115 | */ |
lddevrie | 0:1d5bf13d7dbb | 116 | void LS7366_cmd(int inst, int reg); |
lddevrie | 0:1d5bf13d7dbb | 117 | |
lddevrie | 0:1d5bf13d7dbb | 118 | /** |
lddevrie | 0:1d5bf13d7dbb | 119 | * write to DTR pin? |
lddevrie | 0:1d5bf13d7dbb | 120 | */ |
lddevrie | 0:1d5bf13d7dbb | 121 | void LS7366_write_DTR(int chan_num,long enc_value); |
lddevrie | 0:1d5bf13d7dbb | 122 | |
lddevrie | 0:1d5bf13d7dbb | 123 | /** |
lddevrie | 0:1d5bf13d7dbb | 124 | * initialization |
lddevrie | 0:1d5bf13d7dbb | 125 | */ |
lddevrie | 0:1d5bf13d7dbb | 126 | void init(); |
lddevrie | 0:1d5bf13d7dbb | 127 | |
lddevrie | 0:1d5bf13d7dbb | 128 | |
lddevrie | 0:1d5bf13d7dbb | 129 | /** |
lddevrie | 0:1d5bf13d7dbb | 130 | * update current speed estimate |
lddevrie | 0:1d5bf13d7dbb | 131 | */ |
lddevrie | 0:1d5bf13d7dbb | 132 | void recalc(void); |
lddevrie | 0:1d5bf13d7dbb | 133 | }; |
lddevrie | 0:1d5bf13d7dbb | 134 | |
lddevrie | 0:1d5bf13d7dbb | 135 | #endif /* TACH_H */ |