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

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