Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
qei_api.c@6:f4c910df1172, 2020-01-25 (annotated)
- Committer:
- YutaTogashi
- Date:
- Sat Jan 25 01:18:05 2020 +0000
- Revision:
- 6:f4c910df1172
- Parent:
- 0:26f0e94f01e0
20200125 getPositionFunction
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
YutaTogashi | 6:f4c910df1172 | 1 | #include "mbed_assert.h" |
YutaTogashi | 6:f4c910df1172 | 2 | #include <math.h> |
YutaTogashi | 6:f4c910df1172 | 3 | #include <string.h> |
YutaTogashi | 6:f4c910df1172 | 4 | |
YutaTogashi | 6:f4c910df1172 | 5 | #ifdef TARGET_LPC1549 |
YutaTogashi | 6:f4c910df1172 | 6 | |
YutaTogashi | 6:f4c910df1172 | 7 | #include "qei_api.h" |
YutaTogashi | 6:f4c910df1172 | 8 | #include "cmsis.h" |
YutaTogashi | 6:f4c910df1172 | 9 | #include "pinmap.h" |
YutaTogashi | 6:f4c910df1172 | 10 | #include "mbed_error.h" |
YutaTogashi | 6:f4c910df1172 | 11 | |
YutaTogashi | 6:f4c910df1172 | 12 | static int qei_used = 0; |
YutaTogashi | 6:f4c910df1172 | 13 | static int get_available_qei(void) { |
YutaTogashi | 6:f4c910df1172 | 14 | int i; |
YutaTogashi | 6:f4c910df1172 | 15 | for (i = 0; i < 1; i++) { |
YutaTogashi | 6:f4c910df1172 | 16 | if ((qei_used & (1 << i)) == 0) |
YutaTogashi | 6:f4c910df1172 | 17 | return i; |
YutaTogashi | 6:f4c910df1172 | 18 | } |
YutaTogashi | 6:f4c910df1172 | 19 | return -1; |
YutaTogashi | 6:f4c910df1172 | 20 | } |
YutaTogashi | 6:f4c910df1172 | 21 | |
YutaTogashi | 6:f4c910df1172 | 22 | static void switch_pin(PinName phA, PinName phB, PinName Idx) |
YutaTogashi | 6:f4c910df1172 | 23 | { |
YutaTogashi | 6:f4c910df1172 | 24 | // Set PHA |
YutaTogashi | 6:f4c910df1172 | 25 | if(phA != NC) |
YutaTogashi | 6:f4c910df1172 | 26 | { |
YutaTogashi | 6:f4c910df1172 | 27 | LPC_SWM->PINASSIGN14 &= 0xFFFF00FF; |
YutaTogashi | 6:f4c910df1172 | 28 | LPC_SWM->PINASSIGN14 |= ((int)phA << 8); |
YutaTogashi | 6:f4c910df1172 | 29 | } |
YutaTogashi | 6:f4c910df1172 | 30 | if(phB != NC) |
YutaTogashi | 6:f4c910df1172 | 31 | { |
YutaTogashi | 6:f4c910df1172 | 32 | LPC_SWM->PINASSIGN14 &= 0xFF00FFFF; |
YutaTogashi | 6:f4c910df1172 | 33 | LPC_SWM->PINASSIGN14 |= ((int)phB << 16); |
YutaTogashi | 6:f4c910df1172 | 34 | } |
YutaTogashi | 6:f4c910df1172 | 35 | if(Idx != NC) |
YutaTogashi | 6:f4c910df1172 | 36 | { |
YutaTogashi | 6:f4c910df1172 | 37 | LPC_SWM->PINASSIGN14 &= 0x00FFFFFF; |
YutaTogashi | 6:f4c910df1172 | 38 | LPC_SWM->PINASSIGN14 |= ((int)Idx << 24); |
YutaTogashi | 6:f4c910df1172 | 39 | } |
YutaTogashi | 6:f4c910df1172 | 40 | } |
YutaTogashi | 6:f4c910df1172 | 41 | |
YutaTogashi | 6:f4c910df1172 | 42 | void qei_init(qei_t *obj, PinName phA, PinName phB, PinName Idx) |
YutaTogashi | 6:f4c910df1172 | 43 | { |
YutaTogashi | 6:f4c910df1172 | 44 | int qei_n = get_available_qei(); |
YutaTogashi | 6:f4c910df1172 | 45 | if(qei_n == -1) |
YutaTogashi | 6:f4c910df1172 | 46 | { |
YutaTogashi | 6:f4c910df1172 | 47 | error("No available QEI"); |
YutaTogashi | 6:f4c910df1172 | 48 | } |
YutaTogashi | 6:f4c910df1172 | 49 | |
YutaTogashi | 6:f4c910df1172 | 50 | switch_pin(phA, phB, Idx); |
YutaTogashi | 6:f4c910df1172 | 51 | |
YutaTogashi | 6:f4c910df1172 | 52 | // Enable QEI clock |
YutaTogashi | 6:f4c910df1172 | 53 | LPC_SYSCON->SYSAHBCLKCTRL1 |= (1 << 21); |
YutaTogashi | 6:f4c910df1172 | 54 | |
YutaTogashi | 6:f4c910df1172 | 55 | // Peripheral reset |
YutaTogashi | 6:f4c910df1172 | 56 | LPC_SYSCON->PRESETCTRL1 |= (1 << 21); |
YutaTogashi | 6:f4c910df1172 | 57 | LPC_SYSCON->PRESETCTRL1 &= ~(1 << 21); |
YutaTogashi | 6:f4c910df1172 | 58 | |
YutaTogashi | 6:f4c910df1172 | 59 | // store QEI control clock |
YutaTogashi | 6:f4c910df1172 | 60 | #warning |
YutaTogashi | 6:f4c910df1172 | 61 | obj->PCLK = SystemCoreClock / LPC_SYSCON->SYSAHBCLKDIV; |
YutaTogashi | 6:f4c910df1172 | 62 | //PCLK = 12000000 / LPC_SYSCON->SYSAHBCLKDIV; |
YutaTogashi | 6:f4c910df1172 | 63 | |
YutaTogashi | 6:f4c910df1172 | 64 | } |
YutaTogashi | 6:f4c910df1172 | 65 | |
YutaTogashi | 6:f4c910df1172 | 66 | void qei_free() |
YutaTogashi | 6:f4c910df1172 | 67 | { |
YutaTogashi | 6:f4c910df1172 | 68 | // ToDo |
YutaTogashi | 6:f4c910df1172 | 69 | } |
YutaTogashi | 6:f4c910df1172 | 70 | |
YutaTogashi | 6:f4c910df1172 | 71 | void qei_reset() |
YutaTogashi | 6:f4c910df1172 | 72 | { |
YutaTogashi | 6:f4c910df1172 | 73 | /* |
YutaTogashi | 6:f4c910df1172 | 74 | Reset position counter (Bit 0), |
YutaTogashi | 6:f4c910df1172 | 75 | position counter on index (Bit 1), |
YutaTogashi | 6:f4c910df1172 | 76 | velocity (Bit 2), |
YutaTogashi | 6:f4c910df1172 | 77 | index counter (Bit 3) |
YutaTogashi | 6:f4c910df1172 | 78 | */ |
YutaTogashi | 6:f4c910df1172 | 79 | LPC_QEI->CON = 0xF; |
YutaTogashi | 6:f4c910df1172 | 80 | } |
YutaTogashi | 6:f4c910df1172 | 81 | |
YutaTogashi | 6:f4c910df1172 | 82 | //////////////////////// set ////////////////////////// |
YutaTogashi | 6:f4c910df1172 | 83 | void qei_set_maxpos(qei_t *obj, uint32_t num) |
YutaTogashi | 6:f4c910df1172 | 84 | { |
YutaTogashi | 6:f4c910df1172 | 85 | LPC_QEI->MAXPOS = num; |
YutaTogashi | 6:f4c910df1172 | 86 | obj->maxPos = num; |
YutaTogashi | 6:f4c910df1172 | 87 | } |
YutaTogashi | 6:f4c910df1172 | 88 | |
YutaTogashi | 6:f4c910df1172 | 89 | void qei_set_invert_direction(bool is_invert) |
YutaTogashi | 6:f4c910df1172 | 90 | { |
YutaTogashi | 6:f4c910df1172 | 91 | LPC_QEI->CONF &= ~(1 << 0); |
YutaTogashi | 6:f4c910df1172 | 92 | LPC_QEI->CONF |= is_invert; |
YutaTogashi | 6:f4c910df1172 | 93 | } |
YutaTogashi | 6:f4c910df1172 | 94 | |
YutaTogashi | 6:f4c910df1172 | 95 | void qei_set_invert_index(bool is_invert) |
YutaTogashi | 6:f4c910df1172 | 96 | { |
YutaTogashi | 6:f4c910df1172 | 97 | LPC_QEI->CONF &= ~(1 << 3); |
YutaTogashi | 6:f4c910df1172 | 98 | LPC_QEI->CONF |= is_invert; |
YutaTogashi | 6:f4c910df1172 | 99 | } |
YutaTogashi | 6:f4c910df1172 | 100 | |
YutaTogashi | 6:f4c910df1172 | 101 | void qei_set_signal_mode(QEISignalMode mode) |
YutaTogashi | 6:f4c910df1172 | 102 | { |
YutaTogashi | 6:f4c910df1172 | 103 | switch(mode) |
YutaTogashi | 6:f4c910df1172 | 104 | { |
YutaTogashi | 6:f4c910df1172 | 105 | case QUADRATURE_ENCODER: LPC_QEI->CONF &= ~(1 << 1); break; |
YutaTogashi | 6:f4c910df1172 | 106 | case DIRECTION_CLOCK_ENCODER: LPC_QEI->CONF |= (1 << 1); break; |
YutaTogashi | 6:f4c910df1172 | 107 | } |
YutaTogashi | 6:f4c910df1172 | 108 | } |
YutaTogashi | 6:f4c910df1172 | 109 | |
YutaTogashi | 6:f4c910df1172 | 110 | void qei_set_encoding(qei_t *obj, QEIEncoding encoding) |
YutaTogashi | 6:f4c910df1172 | 111 | { |
YutaTogashi | 6:f4c910df1172 | 112 | switch(encoding) |
YutaTogashi | 6:f4c910df1172 | 113 | { |
YutaTogashi | 6:f4c910df1172 | 114 | case X2_ENCODING: |
YutaTogashi | 6:f4c910df1172 | 115 | LPC_QEI->CONF &= ~(1 << 2); |
YutaTogashi | 6:f4c910df1172 | 116 | obj->encoding = 2; |
YutaTogashi | 6:f4c910df1172 | 117 | break; |
YutaTogashi | 6:f4c910df1172 | 118 | case X4_ENCODING: |
YutaTogashi | 6:f4c910df1172 | 119 | LPC_QEI->CONF |= (1 << 2); |
YutaTogashi | 6:f4c910df1172 | 120 | obj->encoding = 4; |
YutaTogashi | 6:f4c910df1172 | 121 | break; |
YutaTogashi | 6:f4c910df1172 | 122 | } |
YutaTogashi | 6:f4c910df1172 | 123 | } |
YutaTogashi | 6:f4c910df1172 | 124 | |
YutaTogashi | 6:f4c910df1172 | 125 | void qei_set_timer_load(qei_t *obj, uint32_t val) |
YutaTogashi | 6:f4c910df1172 | 126 | { |
YutaTogashi | 6:f4c910df1172 | 127 | LPC_QEI->LOAD = val; |
YutaTogashi | 6:f4c910df1172 | 128 | obj->load = val; |
YutaTogashi | 6:f4c910df1172 | 129 | } |
YutaTogashi | 6:f4c910df1172 | 130 | |
YutaTogashi | 6:f4c910df1172 | 131 | //////////////////////// get ////////////////////////// |
YutaTogashi | 6:f4c910df1172 | 132 | bool qei_get_direction() |
YutaTogashi | 6:f4c910df1172 | 133 | { |
YutaTogashi | 6:f4c910df1172 | 134 | #warning false : true? |
YutaTogashi | 6:f4c910df1172 | 135 | bool val = (LPC_QEI->STAT & 0x00000001) ? true : false; // false : true? |
YutaTogashi | 6:f4c910df1172 | 136 | return val; |
YutaTogashi | 6:f4c910df1172 | 137 | } |
YutaTogashi | 6:f4c910df1172 | 138 | |
YutaTogashi | 6:f4c910df1172 | 139 | uint32_t qei_get_position() |
YutaTogashi | 6:f4c910df1172 | 140 | { |
YutaTogashi | 6:f4c910df1172 | 141 | return LPC_QEI->POS; |
YutaTogashi | 6:f4c910df1172 | 142 | } |
YutaTogashi | 6:f4c910df1172 | 143 | |
YutaTogashi | 6:f4c910df1172 | 144 | uint32_t qei_get_index() |
YutaTogashi | 6:f4c910df1172 | 145 | { |
YutaTogashi | 6:f4c910df1172 | 146 | return LPC_QEI->INXCNT; |
YutaTogashi | 6:f4c910df1172 | 147 | } |
YutaTogashi | 6:f4c910df1172 | 148 | |
YutaTogashi | 6:f4c910df1172 | 149 | uint32_t qei_get_velocity() |
YutaTogashi | 6:f4c910df1172 | 150 | { |
YutaTogashi | 6:f4c910df1172 | 151 | return LPC_QEI->CAP; |
YutaTogashi | 6:f4c910df1172 | 152 | } |
YutaTogashi | 6:f4c910df1172 | 153 | |
YutaTogashi | 6:f4c910df1172 | 154 | bool qei_get_invert_direction_status() |
YutaTogashi | 6:f4c910df1172 | 155 | { |
YutaTogashi | 6:f4c910df1172 | 156 | return (LPC_QEI->CONF & (1 << 0)); |
YutaTogashi | 6:f4c910df1172 | 157 | } |
YutaTogashi | 6:f4c910df1172 | 158 | |
YutaTogashi | 6:f4c910df1172 | 159 | bool qei_get_invert_index_status() |
YutaTogashi | 6:f4c910df1172 | 160 | { |
YutaTogashi | 6:f4c910df1172 | 161 | return (LPC_QEI->CONF & (1 << 3)); |
YutaTogashi | 6:f4c910df1172 | 162 | } |
YutaTogashi | 6:f4c910df1172 | 163 | |
kotakku | 0:26f0e94f01e0 | 164 | #endif //TARGET_LPC1549 |