robocon_Bteam / LPC1549QEI
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?

UserRevisionLine numberNew 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