Inverted Pendulum / Mbed 2 deprecated IP-Interface

Dependencies:   mbed QEI

Committer:
enderceylan
Date:
Fri Nov 11 00:54:37 2016 +0000
Revision:
2:67cf01beacc1
Child:
3:1b3354f31db4
MagneticEncoder.cpp

Who changed what in which revision?

UserRevisionLine numberNew contents of line
enderceylan 2:67cf01beacc1 1 #include "mbed.h"
enderceylan 2:67cf01beacc1 2
enderceylan 2:67cf01beacc1 3 PwmOut mypwm(PWM_OUT);
enderceylan 2:67cf01beacc1 4 Serial serial(USBTX, USBRX);
enderceylan 2:67cf01beacc1 5 DigitalOut myled(LED1);
enderceylan 2:67cf01beacc1 6
enderceylan 2:67cf01beacc1 7 int main() {
enderceylan 2:67cf01beacc1 8
enderceylan 2:67cf01beacc1 9 mypwm.period_ms(10);
enderceylan 2:67cf01beacc1 10 mypwm.pulsewidth_ms(1);
enderceylan 2:67cf01beacc1 11
enderceylan 2:67cf01beacc1 12 serial.printf("pwm set to %.2f %%\n", mypwm.read() * 100);
enderceylan 2:67cf01beacc1 13
enderceylan 2:67cf01beacc1 14 while(1) {
enderceylan 2:67cf01beacc1 15 myled = !myled;
enderceylan 2:67cf01beacc1 16 wait(1);
enderceylan 2:67cf01beacc1 17 }
enderceylan 2:67cf01beacc1 18 }
enderceylan 2:67cf01beacc1 19
enderceylan 2:67cf01beacc1 20 /*
enderceylan 2:67cf01beacc1 21
enderceylan 2:67cf01beacc1 22 #define
enderceylan 2:67cf01beacc1 23 SPI_CMD_READ 0x4000
enderceylan 2:67cf01beacc1 24 /*!< flag indicating read attempt when using SPI in
enderceylan 2:67cf01beacc1 25 terfac*//*
enderceylan 2:67cf01beacc1 26 #define
enderceylan 2:67cf01beacc1 27 SPI_REG_AGC 0x3ffd
enderceylan 2:67cf01beacc1 28 /*!< agc register when using SPI */ /*
enderceylan 2:67cf01beacc1 29 #define
enderceylan 2:67cf01beacc1 30 SPI_REG_MAG 0x3ffe
enderceylan 2:67cf01beacc1 31 /*!< magnitude register when using SPI */ /*
enderceylan 2:67cf01beacc1 32 #define
enderceylan 2:67cf01beacc1 33 SPI_REG_DATA 0x3fff
enderceylan 2:67cf01beacc1 34 /*!< data register when using SPI */ /*
enderceylan 2:67cf01beacc1 35 #define
enderceylan 2:67cf01beacc1 36 SPI_REG_CLRERR 0x1
enderceylan 2:67cf01beacc1 37 /*!< clear error register when using SPI */
enderceylan 2:67cf01beacc1 38
enderceylan 2:67cf01beacc1 39 /*!
enderceylan 2:67cf01beacc1 40 **************************************************
enderceylan 2:67cf01beacc1 41 ***************************
enderceylan 2:67cf01beacc1 42 * Reads out chip data via SPI interface
enderceylan 2:67cf01beacc1 43 *
enderceylan 2:67cf01beacc1 44 * This function is used to read out cordic value
enderceylan 2:67cf01beacc1 45 from chips supporting SPI
enderceylan 2:67cf01beacc1 46 * interface.
enderceylan 2:67cf01beacc1 47 **************************************************
enderceylan 2:67cf01beacc1 48 ***************************
enderceylan 2:67cf01beacc1 49 *//*
enderceylan 2:67cf01beacc1 50
enderceylan 2:67cf01beacc1 51 void
enderceylan 2:67cf01beacc1 52 spiReadData()
enderceylan 2:67cf01beacc1 53 {
enderceylan 2:67cf01beacc1 54 u16 dat;
enderceylan 2:67cf01beacc1 55 // 16-bit data buffer for SPI communication
enderceylan 2:67cf01beacc1 56 ushort angle, agcreg;
enderceylan 2:67cf01beacc1 57 ubyte agc;
enderceylan 2:67cf01beacc1 58 ushort value;
enderceylan 2:67cf01beacc1 59 bit alarmHi, alarmLo;
enderceylan 2:67cf01beacc1 60 /* Send READ AGC command. Received data is thrown a
enderceylan 2:67cf01beacc1 61 way: this data comes from the precedent
enderceylan 2:67cf01beacc1 62 command (unknown)*/ /*
enderceylan 2:67cf01beacc1 63 dat = SPI_CMD_READ | SPI_REG_AGC;
enderceylan 2:67cf01beacc1 64 dat |= spiCalcEvenParity(dat) << 15;
enderceylan 2:67cf01beacc1 65 spiTransfer((u8*)&dat,
enderceylan 2:67cf01beacc1 66 sizeof
enderceylan 2:67cf01beacc1 67 (u16));
enderceylan 2:67cf01beacc1 68 / /* Send READ MAG command. Received data is the AG
enderceylan 2:67cf01beacc1 69 C value: this data comes from the
enderceylan 2:67cf01beacc1 70 precedent command (unknown)*/ /*
enderceylan 2:67cf01beacc1 71 dat = SPI_CMD_READ | SPI_REG_MAG;
enderceylan 2:67cf01beacc1 72 dat |= spiCalcEvenParity(dat) << 15;
enderceylan 2:67cf01beacc1 73 spiTransfer((u8*)&dat,
enderceylan 2:67cf01beacc1 74 sizeof
enderceylan 2:67cf01beacc1 75 (u16));
enderceylan 2:67cf01beacc1 76 magreg = dat;
enderceylan 2:67cf01beacc1 77 /* Send READ ANGLE command. Received data is the MA
enderceylan 2:67cf01beacc1 78 G value, from the precedent command */ /*
enderceylan 2:67cf01beacc1 79 dat = SPI_CMD_READ | SPI_REG_DATA;
enderceylan 2:67cf01beacc1 80 dat |= spiCalcEvenParity(dat) << 15;
enderceylan 2:67cf01beacc1 81 spiTransfer((u8*)&dat,
enderceylan 2:67cf01beacc1 82 sizeof
enderceylan 2:67cf01beacc1 83 (u16));
enderceylan 2:67cf01beacc1 84 agcreg = dat;
enderceylan 2:67cf01beacc1 85 /* Send NOP command. Received data is the ANGLE
enderceylan 2:67cf01beacc1 86 value, from the precedent command *//*
enderceylan 2:67cf01beacc1 87 dat = 0x0000;
enderceylan 2:67cf01beacc1 88 // NOP command.
enderceylan 2:67cf01beacc1 89 spiTransfer((u8*)&dat,
enderceylan 2:67cf01beacc1 90 sizeof
enderceylan 2:67cf01beacc1 91 (u16));
enderceylan 2:67cf01beacc1 92 angle = dat >> 2;
enderceylan 2:67cf01beacc1 93 }
enderceylan 2:67cf01beacc1 94 if
enderceylan 2:67cf01beacc1 95 ((dat & 0x4000) || (agcreg & 0x4000) || (magreg &
enderceylan 2:67cf01beacc1 96 0x4000))
enderceylan 2:67cf01beacc1 97 {
enderceylan 2:67cf01beacc1 98 /* error flag set - need to reset it */ /*
enderceylan 2:67cf01beacc1 99 dat = SPI_CMD_READ | SPI_REG_CLRERR;
enderceylan 2:67cf01beacc1 100 dat |= spiCalcEvenParity(dat)<<15;
enderceylan 2:67cf01beacc1 101 spiTransfer((u8*)&dat,
enderceylan 2:67cf01beacc1 102 sizeof(u16));
enderceylan 2:67cf01beacc1 103 }
enderceylan 2:67cf01beacc1 104 else
enderceylan 2:67cf01beacc1 105 {
enderceylan 2:67cf01beacc1 106 agc = agcreg & 0xff
enderceylan 2:67cf01beacc1 107 value = dat & (currentChipDescription->positions - 31 - 1);
enderceylan 2:67cf01beacc1 108 angle = (dd->value * 360) / currentChipDescription->positions;
enderceylan 2:67cf01beacc1 109 magnitude = magreg & (currentChipDescription->positions - 31 - 1);
enderceylan 2:67cf01beacc1 110 alarmLo = (agcreg >> 10) & 0x1;
enderceylan 2:67cf01beacc1 111 alarmHi = (agcreg >> 11) & 0x1;
enderceylan 2:67cf01beacc1 112 }
enderceylan 2:67cf01beacc1 113 }
enderceylan 2:67cf01beacc1 114 /*!
enderceylan 2:67cf01beacc1 115 ***************************************************
enderceylan 2:67cf01beacc1 116 **************************
enderceylan 2:67cf01beacc1 117 * Calculate even parity of a 16 bit unsigned integ
enderceylan 2:67cf01beacc1 118 er
enderceylan 2:67cf01beacc1 119 *
enderceylan 2:67cf01beacc1 120 * This function is used by the SPI interface to ca
enderceylan 2:67cf01beacc1 121 lculate the even parity
enderceylan 2:67cf01beacc1 122 * of the data which will be sent via SPI to the en
enderceylan 2:67cf01beacc1 123 coder.
enderceylan 2:67cf01beacc1 124 *
enderceylan 2:67cf01beacc1 125 * \param[in] value : 16 bit unsigned integer whose
enderceylan 2:67cf01beacc1 126 parity shall be calculated
enderceylan 2:67cf01beacc1 127 *
enderceylan 2:67cf01beacc1 128 * \return : Even parity
enderceylan 2:67cf01beacc1 129 *
enderceylan 2:67cf01beacc1 130 ***************************************************
enderceylan 2:67cf01beacc1 131 **************************
enderceylan 2:67cf01beacc1 132 */ /*
enderceylan 2:67cf01beacc1 133 static
enderceylan 2:67cf01beacc1 134 u8 spiCalcEvenParity(ushort value)
enderceylan 2:67cf01beacc1 135 {
enderceylan 2:67cf01beacc1 136 u8 cnt = 0;
enderceylan 2:67cf01beacc1 137 u8 i;
enderceylan 2:67cf01beacc1 138 for
enderceylan 2:67cf01beacc1 139 (i = 0; i < 16; i++)
enderceylan 2:67cf01beacc1 140 {
enderceylan 2:67cf01beacc1 141 if
enderceylan 2:67cf01beacc1 142 (value & 0x1)
enderceylan 2:67cf01beacc1 143 {
enderceylan 2:67cf01beacc1 144 cnt++;
enderceylan 2:67cf01beacc1 145 }
enderceylan 2:67cf01beacc1 146 value >>= 1;
enderceylan 2:67cf01beacc1 147 }
enderceylan 2:67cf01beacc1 148 return
enderceylan 2:67cf01beacc1 149 cnt & 0x1;
enderceylan 2:67cf01beacc1 150 }
enderceylan 2:67cf01beacc1 151 /*!
enderceylan 2:67cf01beacc1 152 **************************************************
enderceylan 2:67cf01beacc1 153 ***************************
enderceylan 2:67cf01beacc1 154 * Calculate even parity of a 16 bit unsigned inte
enderceylan 2:67cf01beacc1 155 ger
enderceylan 2:67cf01beacc1 156 *
enderceylan 2:67cf01beacc1 157 * This function is used by the SPI interface to c
enderceylan 2:67cf01beacc1 158 alculate the even parity
enderceylan 2:67cf01beacc1 159 * of the data which will be sent via SPI to the e
enderceylan 2:67cf01beacc1 160 ncoder.
enderceylan 2:67cf01beacc1 161 *
enderceylan 2:67cf01beacc1 162 * \param[in] value : 16 bit unsigned integer whos
enderceylan 2:67cf01beacc1 163 e parity shall be calculated
enderceylan 2:67cf01beacc1 164 *
enderceylan 2:67cf01beacc1 165 * \return : Even parity
enderceylan 2:67cf01beacc1 166 *
enderceylan 2:67cf01beacc1 167 **************************************************
enderceylan 2:67cf01beacc1 168 ***************************
enderceylan 2:67cf01beacc1 169 */ /*
enderceylan 2:67cf01beacc1 170 static
enderceylan 2:67cf01beacc1 171 u8 spiCalcEvenParity(ushort value)
enderceylan 2:67cf01beacc1 172 {
enderceylan 2:67cf01beacc1 173 u8 cnt = 0;
enderceylan 2:67cf01beacc1 174 u8 i;
enderceylan 2:67cf01beacc1 175 for
enderceylan 2:67cf01beacc1 176 (i = 0; i < 16; i++)
enderceylan 2:67cf01beacc1 177 {
enderceylan 2:67cf01beacc1 178 if
enderceylan 2:67cf01beacc1 179 (value & 0x1)
enderceylan 2:67cf01beacc1 180 {
enderceylan 2:67cf01beacc1 181 cnt++;
enderceylan 2:67cf01beacc1 182 }
enderceylan 2:67cf01beacc1 183 value >>= 1;
enderceylan 2:67cf01beacc1 184 }
enderceylan 2:67cf01beacc1 185 return
enderceylan 2:67cf01beacc1 186 cnt & 0x1;
enderceylan 2:67cf01beacc1 187 }
enderceylan 2:67cf01beacc1 188
enderceylan 2:67cf01beacc1 189
enderceylan 2:67cf01beacc1 190
enderceylan 2:67cf01beacc1 191
enderceylan 2:67cf01beacc1 192
enderceylan 2:67cf01beacc1 193 */