Preliminary mbed encoder interface IC class
Dependents: mbed_QUAD_ENCLIB_TEST Axis Axis_20181108 Axis_version2
include the mbed library with this snippet
#include "mbed.h" #include "LS7366.h" SPI spi(p5, p6, p7); LS7366 enc1(spi, p19); LS7366 enc2(spi, p20); Serial pc(USBTX, USBRX); // tx, rx for serial USB interface to pc //------------------- MAIN -------------------------------- int main() { while(1){ pc.printf("enc1 = %ld enc2 = %ld\r\n",enc1.read(), enc2.read()); wait(.02); }//while(1) }//main
LS7366.cpp@0:c2458154721b, 2014-12-09 (annotated)
- Committer:
- jebradshaw
- Date:
- Tue Dec 09 19:08:46 2014 +0000
- Revision:
- 0:c2458154721b
- Child:
- 1:c627734cf04c
LS7366 preliminary class for mbed
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
jebradshaw | 0:c2458154721b | 1 | // LS7366.cpp for Encoder Class Library |
jebradshaw | 0:c2458154721b | 2 | // J. Bradshaw 20141030 |
jebradshaw | 0:c2458154721b | 3 | /* Copyright (c) 2014, jbradshaw (http://mbed.org) |
jebradshaw | 0:c2458154721b | 4 | * |
jebradshaw | 0:c2458154721b | 5 | * Permission is hereby granted, free of charge, to any person obtaining a copy |
jebradshaw | 0:c2458154721b | 6 | * of this software and associated documentation files (the "Software"), to deal |
jebradshaw | 0:c2458154721b | 7 | * in the Software without restriction, including without limitation the rights |
jebradshaw | 0:c2458154721b | 8 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
jebradshaw | 0:c2458154721b | 9 | * copies of the Software, and to permit persons to whom the Software is |
jebradshaw | 0:c2458154721b | 10 | * furnished to do so, subject to the following conditions: |
jebradshaw | 0:c2458154721b | 11 | * |
jebradshaw | 0:c2458154721b | 12 | * The above copyright notice and this permission notice shall be included in |
jebradshaw | 0:c2458154721b | 13 | * all copies or substantial portions of the Software. |
jebradshaw | 0:c2458154721b | 14 | * |
jebradshaw | 0:c2458154721b | 15 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
jebradshaw | 0:c2458154721b | 16 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
jebradshaw | 0:c2458154721b | 17 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
jebradshaw | 0:c2458154721b | 18 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
jebradshaw | 0:c2458154721b | 19 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
jebradshaw | 0:c2458154721b | 20 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
jebradshaw | 0:c2458154721b | 21 | * THE SOFTWARE. |
jebradshaw | 0:c2458154721b | 22 | * |
jebradshaw | 0:c2458154721b | 23 | */ |
jebradshaw | 0:c2458154721b | 24 | #include "LS7366.h" |
jebradshaw | 0:c2458154721b | 25 | |
jebradshaw | 0:c2458154721b | 26 | //----- LS7366 Encoder/Counter Routines -------------------- |
jebradshaw | 0:c2458154721b | 27 | |
jebradshaw | 0:c2458154721b | 28 | //Constructor |
jebradshaw | 0:c2458154721b | 29 | LS7366::LS7366(SPI& spi, PinName cs) : _spi(spi), _cs(cs) { |
jebradshaw | 0:c2458154721b | 30 | _cs = 1; // Initialize chip select as off (high) |
jebradshaw | 0:c2458154721b | 31 | _init(); |
jebradshaw | 0:c2458154721b | 32 | } |
jebradshaw | 0:c2458154721b | 33 | |
jebradshaw | 0:c2458154721b | 34 | void LS7366::LS7366_cmd(int inst, int reg){ |
jebradshaw | 0:c2458154721b | 35 | char cmd; |
jebradshaw | 0:c2458154721b | 36 | |
jebradshaw | 0:c2458154721b | 37 | _spi.format(8, 0); |
jebradshaw | 0:c2458154721b | 38 | _spi.frequency(2000000); |
jebradshaw | 0:c2458154721b | 39 | cmd = (inst << 6) | (reg << 3); |
jebradshaw | 0:c2458154721b | 40 | // printf("\r\ncmd=0X%2X", cmd); |
jebradshaw | 0:c2458154721b | 41 | _spi.write(cmd); |
jebradshaw | 0:c2458154721b | 42 | } |
jebradshaw | 0:c2458154721b | 43 | |
jebradshaw | 0:c2458154721b | 44 | long LS7366::LS7366_read_counter(){ |
jebradshaw | 0:c2458154721b | 45 | union bytes{ |
jebradshaw | 0:c2458154721b | 46 | char byte_enc[4]; |
jebradshaw | 0:c2458154721b | 47 | long long_enc; |
jebradshaw | 0:c2458154721b | 48 | }counter; |
jebradshaw | 0:c2458154721b | 49 | |
jebradshaw | 0:c2458154721b | 50 | _spi.format(8, 0); |
jebradshaw | 0:c2458154721b | 51 | _spi.frequency(2000000); |
jebradshaw | 0:c2458154721b | 52 | |
jebradshaw | 0:c2458154721b | 53 | _cs = 0; |
jebradshaw | 0:c2458154721b | 54 | wait_us(1); |
jebradshaw | 0:c2458154721b | 55 | LS7366_cmd(LOAD,OTR);//cmd = 0xe8, LOAD to OTR |
jebradshaw | 0:c2458154721b | 56 | _cs = 1; |
jebradshaw | 0:c2458154721b | 57 | wait_us(1); |
jebradshaw | 0:c2458154721b | 58 | |
jebradshaw | 0:c2458154721b | 59 | _cs = 0; |
jebradshaw | 0:c2458154721b | 60 | |
jebradshaw | 0:c2458154721b | 61 | wait_us(1); |
jebradshaw | 0:c2458154721b | 62 | LS7366_cmd(RD,CNTR); //cmd = 0x60, READ from CNTR |
jebradshaw | 0:c2458154721b | 63 | counter.byte_enc[3] = _spi.write(0x00); |
jebradshaw | 0:c2458154721b | 64 | counter.byte_enc[2] = _spi.write(0x00); |
jebradshaw | 0:c2458154721b | 65 | counter.byte_enc[1] = _spi.write(0x00); |
jebradshaw | 0:c2458154721b | 66 | counter.byte_enc[0] = _spi.write(0x00); |
jebradshaw | 0:c2458154721b | 67 | |
jebradshaw | 0:c2458154721b | 68 | _cs = 1; |
jebradshaw | 0:c2458154721b | 69 | |
jebradshaw | 0:c2458154721b | 70 | count = counter.long_enc; |
jebradshaw | 0:c2458154721b | 71 | return counter.long_enc; //return count |
jebradshaw | 0:c2458154721b | 72 | } |
jebradshaw | 0:c2458154721b | 73 | |
jebradshaw | 0:c2458154721b | 74 | void LS7366::LS7366_quad_mode_x4(){ |
jebradshaw | 0:c2458154721b | 75 | |
jebradshaw | 0:c2458154721b | 76 | _spi.format(8, 0); |
jebradshaw | 0:c2458154721b | 77 | _spi.frequency(2000000); |
jebradshaw | 0:c2458154721b | 78 | |
jebradshaw | 0:c2458154721b | 79 | _cs = 0; |
jebradshaw | 0:c2458154721b | 80 | |
jebradshaw | 0:c2458154721b | 81 | wait_us(1); |
jebradshaw | 0:c2458154721b | 82 | LS7366_cmd(WR,MDR0);// Write to the MDR0 register |
jebradshaw | 0:c2458154721b | 83 | _spi.write(0x03); // X4 quadrature count mode |
jebradshaw | 0:c2458154721b | 84 | |
jebradshaw | 0:c2458154721b | 85 | _cs = 1; |
jebradshaw | 0:c2458154721b | 86 | } |
jebradshaw | 0:c2458154721b | 87 | |
jebradshaw | 0:c2458154721b | 88 | void LS7366::LS7366_reset_counter(){ |
jebradshaw | 0:c2458154721b | 89 | |
jebradshaw | 0:c2458154721b | 90 | _spi.format(8, 0); |
jebradshaw | 0:c2458154721b | 91 | _spi.frequency(2000000); |
jebradshaw | 0:c2458154721b | 92 | |
jebradshaw | 0:c2458154721b | 93 | _cs = 0; |
jebradshaw | 0:c2458154721b | 94 | |
jebradshaw | 0:c2458154721b | 95 | wait_us(1); |
jebradshaw | 0:c2458154721b | 96 | LS7366_cmd(CLR,CNTR);//Clear the counter register |
jebradshaw | 0:c2458154721b | 97 | |
jebradshaw | 0:c2458154721b | 98 | _cs = 1; |
jebradshaw | 0:c2458154721b | 99 | |
jebradshaw | 0:c2458154721b | 100 | wait_us(1); |
jebradshaw | 0:c2458154721b | 101 | |
jebradshaw | 0:c2458154721b | 102 | _cs = 0; |
jebradshaw | 0:c2458154721b | 103 | |
jebradshaw | 0:c2458154721b | 104 | wait_us(1); |
jebradshaw | 0:c2458154721b | 105 | LS7366_cmd(LOAD,CNTR);// |
jebradshaw | 0:c2458154721b | 106 | |
jebradshaw | 0:c2458154721b | 107 | _cs = 1; |
jebradshaw | 0:c2458154721b | 108 | } |
jebradshaw | 0:c2458154721b | 109 | |
jebradshaw | 0:c2458154721b | 110 | void LS7366::LS7366_write_DTR(long enc_value) |
jebradshaw | 0:c2458154721b | 111 | { |
jebradshaw | 0:c2458154721b | 112 | union bytes |
jebradshaw | 0:c2458154721b | 113 | { |
jebradshaw | 0:c2458154721b | 114 | char byte_enc[4]; |
jebradshaw | 0:c2458154721b | 115 | long long_enc; |
jebradshaw | 0:c2458154721b | 116 | }counter; |
jebradshaw | 0:c2458154721b | 117 | |
jebradshaw | 0:c2458154721b | 118 | _spi.format(8, 0); |
jebradshaw | 0:c2458154721b | 119 | _spi.frequency(2000000); |
jebradshaw | 0:c2458154721b | 120 | |
jebradshaw | 0:c2458154721b | 121 | counter.long_enc = enc_value; |
jebradshaw | 0:c2458154721b | 122 | |
jebradshaw | 0:c2458154721b | 123 | _cs = 0; |
jebradshaw | 0:c2458154721b | 124 | |
jebradshaw | 0:c2458154721b | 125 | wait_us(1); |
jebradshaw | 0:c2458154721b | 126 | LS7366_cmd(WR,DTR);// |
jebradshaw | 0:c2458154721b | 127 | _spi.write(counter.byte_enc[3]); |
jebradshaw | 0:c2458154721b | 128 | _spi.write(counter.byte_enc[2]); |
jebradshaw | 0:c2458154721b | 129 | _spi.write(counter.byte_enc[1]); |
jebradshaw | 0:c2458154721b | 130 | _spi.write(counter.byte_enc[0]); |
jebradshaw | 0:c2458154721b | 131 | |
jebradshaw | 0:c2458154721b | 132 | _cs = 1; |
jebradshaw | 0:c2458154721b | 133 | |
jebradshaw | 0:c2458154721b | 134 | wait_us(1); |
jebradshaw | 0:c2458154721b | 135 | |
jebradshaw | 0:c2458154721b | 136 | _cs = 0; |
jebradshaw | 0:c2458154721b | 137 | |
jebradshaw | 0:c2458154721b | 138 | wait_us(1); |
jebradshaw | 0:c2458154721b | 139 | LS7366_cmd(LOAD,CNTR);// |
jebradshaw | 0:c2458154721b | 140 | |
jebradshaw | 0:c2458154721b | 141 | _cs = 1; |
jebradshaw | 0:c2458154721b | 142 | } |
jebradshaw | 0:c2458154721b | 143 | |
jebradshaw | 0:c2458154721b | 144 | void LS7366::_init(){ |
jebradshaw | 0:c2458154721b | 145 | _spi.frequency(2000000); |
jebradshaw | 0:c2458154721b | 146 | LS7366_reset_counter(); |
jebradshaw | 0:c2458154721b | 147 | LS7366_quad_mode_x4(); |
jebradshaw | 0:c2458154721b | 148 | LS7366_write_DTR(0); |
jebradshaw | 0:c2458154721b | 149 | } |
jebradshaw | 0:c2458154721b | 150 | |
jebradshaw | 0:c2458154721b | 151 | void LS7366::write(long wcount){ |
jebradshaw | 0:c2458154721b | 152 | LS7366_write_DTR(wcount); |
jebradshaw | 0:c2458154721b | 153 | } |
jebradshaw | 0:c2458154721b | 154 | |
jebradshaw | 0:c2458154721b | 155 | long LS7366::read(){ |
jebradshaw | 0:c2458154721b | 156 | return LS7366_read_counter(); |
jebradshaw | 0:c2458154721b | 157 | } |
jebradshaw | 0:c2458154721b | 158 | |
jebradshaw | 0:c2458154721b | 159 | LS7366& LS7366::operator= (long wcount) { |
jebradshaw | 0:c2458154721b | 160 | write(wcount); |
jebradshaw | 0:c2458154721b | 161 | return *this; |
jebradshaw | 0:c2458154721b | 162 | } |
jebradshaw | 0:c2458154721b | 163 | |
jebradshaw | 0:c2458154721b | 164 | LS7366& LS7366::operator= (LS7366& rhs) { |
jebradshaw | 0:c2458154721b | 165 | write(rhs.read()); |
jebradshaw | 0:c2458154721b | 166 | return *this; |
jebradshaw | 0:c2458154721b | 167 | } |
jebradshaw | 0:c2458154721b | 168 | |
jebradshaw | 0:c2458154721b | 169 | LS7366::operator long() { |
jebradshaw | 0:c2458154721b | 170 | return read(); |
jebradshaw | 0:c2458154721b | 171 | } |