Inverted Pendulum / Mbed 2 deprecated IP-Interface

Dependencies:   mbed QEI

Committer:
Snay22
Date:
Fri Nov 11 01:11:46 2016 +0000
Revision:
3:1b3354f31db4
Parent:
2:67cf01beacc1
mag encoder, interfacing

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