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