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.
main.cpp@4:9c39770e13e6, 2020-07-30 (annotated)
- Committer:
- onishiitsuki
- Date:
- Thu Jul 30 05:57:12 2020 +0000
- Revision:
- 4:9c39770e13e6
- Parent:
- 3:e877a237c329
finish making PWM controller.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
onishiitsuki | 0:762583fdd0de | 1 | // Construction macine controler for MBET |
onishiitsuki | 0:762583fdd0de | 2 | // Onishi Itsuki |
onishiitsuki | 0:762583fdd0de | 3 | // July 2020 |
onishiitsuki | 0:762583fdd0de | 4 | |
onishiitsuki | 0:762583fdd0de | 5 | #include "mbed.h" |
onishiitsuki | 0:762583fdd0de | 6 | |
onishiitsuki | 0:762583fdd0de | 7 | #define START_BYTE 0x0f |
onishiitsuki | 4:9c39770e13e6 | 8 | #define SAMPLING_PERIOD 5000.0f // scale is us |
onishiitsuki | 0:762583fdd0de | 9 | #define BYTE_A 2*i |
onishiitsuki | 0:762583fdd0de | 10 | #define BYTE_B 2*i+1 |
onishiitsuki | 0:762583fdd0de | 11 | |
onishiitsuki | 0:762583fdd0de | 12 | uint8_t buffer[8]; |
onishiitsuki | 4:9c39770e13e6 | 13 | |
onishiitsuki | 4:9c39770e13e6 | 14 | int outputBuffer[12]; // for setting output 0 or 1 to each Digital |
onishiitsuki | 0:762583fdd0de | 15 | int bufferIndex = 0; |
onishiitsuki | 0:762583fdd0de | 16 | int outProcCounter = 0; |
onishiitsuki | 0:762583fdd0de | 17 | int outProcFlag = 0; |
onishiitsuki | 0:762583fdd0de | 18 | |
onishiitsuki | 0:762583fdd0de | 19 | Ticker ticker; |
onishiitsuki | 4:9c39770e13e6 | 20 | Ticker input_test_data; |
onishiitsuki | 0:762583fdd0de | 21 | Serial pc(USBTX, USBRX); |
onishiitsuki | 0:762583fdd0de | 22 | DigitalOut stateChecker(LED1); |
onishiitsuki | 0:762583fdd0de | 23 | DigitalOut startByteError(LED3); |
onishiitsuki | 0:762583fdd0de | 24 | DigitalOut parityByteError(LED4); |
onishiitsuki | 0:762583fdd0de | 25 | |
onishiitsuki | 0:762583fdd0de | 26 | // set output pins |
onishiitsuki | 0:762583fdd0de | 27 | DigitalOut boomOutA(p21); |
onishiitsuki | 0:762583fdd0de | 28 | DigitalOut boomOutB(p22); |
onishiitsuki | 0:762583fdd0de | 29 | DigitalOut armOutA(p23); |
onishiitsuki | 0:762583fdd0de | 30 | DigitalOut armOutB(p24); |
onishiitsuki | 0:762583fdd0de | 31 | DigitalOut bucketOutA(p25); |
onishiitsuki | 0:762583fdd0de | 32 | DigitalOut bucketOutB(p26); |
onishiitsuki | 0:762583fdd0de | 33 | DigitalOut slewingOutA(p20); |
onishiitsuki | 0:762583fdd0de | 34 | DigitalOut slewingOutB(p19); |
onishiitsuki | 0:762583fdd0de | 35 | DigitalOut rightWheelOutA(p18); |
onishiitsuki | 0:762583fdd0de | 36 | DigitalOut rightWheelOutB(p17); |
onishiitsuki | 0:762583fdd0de | 37 | DigitalOut leftWheelOutA(p16); |
onishiitsuki | 0:762583fdd0de | 38 | DigitalOut leftWheelOutB(p15); |
onishiitsuki | 0:762583fdd0de | 39 | |
onishiitsuki | 0:762583fdd0de | 40 | |
onishiitsuki | 0:762583fdd0de | 41 | void set_test_buffer(void) |
onishiitsuki | 0:762583fdd0de | 42 | { |
onishiitsuki | 0:762583fdd0de | 43 | buffer[0] = 31; |
onishiitsuki | 4:9c39770e13e6 | 44 | buffer[1] = 100; |
onishiitsuki | 4:9c39770e13e6 | 45 | buffer[2] = 50; |
onishiitsuki | 4:9c39770e13e6 | 46 | buffer[3] = 10; |
onishiitsuki | 4:9c39770e13e6 | 47 | buffer[4] = 228; |
onishiitsuki | 4:9c39770e13e6 | 48 | buffer[5] = 178; |
onishiitsuki | 4:9c39770e13e6 | 49 | buffer[6] = 138; |
onishiitsuki | 0:762583fdd0de | 50 | buffer[7] = 248; |
onishiitsuki | 0:762583fdd0de | 51 | } |
onishiitsuki | 0:762583fdd0de | 52 | |
onishiitsuki | 0:762583fdd0de | 53 | |
onishiitsuki | 0:762583fdd0de | 54 | void set_output(void) |
onishiitsuki | 0:762583fdd0de | 55 | { |
onishiitsuki | 0:762583fdd0de | 56 | boomOutA = outputBuffer[0]; |
onishiitsuki | 0:762583fdd0de | 57 | boomOutB = outputBuffer[1]; |
onishiitsuki | 0:762583fdd0de | 58 | armOutA = outputBuffer[2]; |
onishiitsuki | 0:762583fdd0de | 59 | armOutB = outputBuffer[3]; |
onishiitsuki | 0:762583fdd0de | 60 | bucketOutA = outputBuffer[4]; |
onishiitsuki | 0:762583fdd0de | 61 | bucketOutB = outputBuffer[5]; |
onishiitsuki | 0:762583fdd0de | 62 | slewingOutA = outputBuffer[6]; |
onishiitsuki | 0:762583fdd0de | 63 | slewingOutB = outputBuffer[7]; |
onishiitsuki | 0:762583fdd0de | 64 | rightWheelOutA = outputBuffer[8]; |
onishiitsuki | 0:762583fdd0de | 65 | rightWheelOutB = outputBuffer[9]; |
onishiitsuki | 0:762583fdd0de | 66 | leftWheelOutA = outputBuffer[10]; |
onishiitsuki | 0:762583fdd0de | 67 | leftWheelOutB = outputBuffer[11]; |
onishiitsuki | 0:762583fdd0de | 68 | } |
onishiitsuki | 0:762583fdd0de | 69 | |
onishiitsuki | 0:762583fdd0de | 70 | |
onishiitsuki | 0:762583fdd0de | 71 | void init_state(void) |
onishiitsuki | 0:762583fdd0de | 72 | { |
onishiitsuki | 1:ccc6ed1e4cd8 | 73 | for(int i=0; i<8; i++){ |
onishiitsuki | 2:3c335fcdd7f4 | 74 | buffer[i] = 0; |
onishiitsuki | 1:ccc6ed1e4cd8 | 75 | } |
onishiitsuki | 0:762583fdd0de | 76 | for(int i=0; i<6; i++) { |
onishiitsuki | 0:762583fdd0de | 77 | outputBuffer[BYTE_A] = 0; |
onishiitsuki | 2:3c335fcdd7f4 | 78 | outputBuffer[BYTE_B] = 1; |
onishiitsuki | 0:762583fdd0de | 79 | } |
onishiitsuki | 0:762583fdd0de | 80 | set_output(); |
onishiitsuki | 0:762583fdd0de | 81 | } |
onishiitsuki | 0:762583fdd0de | 82 | |
onishiitsuki | 0:762583fdd0de | 83 | |
onishiitsuki | 0:762583fdd0de | 84 | void PWM_processor(void) |
onishiitsuki | 0:762583fdd0de | 85 | { |
onishiitsuki | 4:9c39770e13e6 | 86 | for(int i=0; i<6; i++) { |
onishiitsuki | 4:9c39770e13e6 | 87 | if((buffer[i+1]==0) || (buffer[i+1]==128)) { |
onishiitsuki | 4:9c39770e13e6 | 88 | outputBuffer[BYTE_A] = 0; |
onishiitsuki | 4:9c39770e13e6 | 89 | outputBuffer[BYTE_B] = 0; |
onishiitsuki | 4:9c39770e13e6 | 90 | continue; |
onishiitsuki | 4:9c39770e13e6 | 91 | } |
onishiitsuki | 4:9c39770e13e6 | 92 | |
onishiitsuki | 4:9c39770e13e6 | 93 | if(buffer[i+1]>128) { |
onishiitsuki | 4:9c39770e13e6 | 94 | outputBuffer[BYTE_A] = 0; |
onishiitsuki | 4:9c39770e13e6 | 95 | outputBuffer[BYTE_B] = 1; |
onishiitsuki | 4:9c39770e13e6 | 96 | } else { |
onishiitsuki | 4:9c39770e13e6 | 97 | outputBuffer[BYTE_A] = 1; |
onishiitsuki | 4:9c39770e13e6 | 98 | outputBuffer[BYTE_B] = 0; |
onishiitsuki | 4:9c39770e13e6 | 99 | } |
onishiitsuki | 4:9c39770e13e6 | 100 | |
onishiitsuki | 4:9c39770e13e6 | 101 | // decrement |
onishiitsuki | 4:9c39770e13e6 | 102 | if (buffer[i+1] > 0) |
onishiitsuki | 4:9c39770e13e6 | 103 | buffer[i+1]--; |
onishiitsuki | 4:9c39770e13e6 | 104 | } |
onishiitsuki | 4:9c39770e13e6 | 105 | set_output(); |
onishiitsuki | 0:762583fdd0de | 106 | } |
onishiitsuki | 0:762583fdd0de | 107 | |
onishiitsuki | 0:762583fdd0de | 108 | |
onishiitsuki | 0:762583fdd0de | 109 | void event_func(void) |
onishiitsuki | 0:762583fdd0de | 110 | { |
onishiitsuki | 0:762583fdd0de | 111 | stateChecker = 1; |
onishiitsuki | 0:762583fdd0de | 112 | |
onishiitsuki | 0:762583fdd0de | 113 | // For test |
onishiitsuki | 0:762583fdd0de | 114 | bufferIndex = 8; |
onishiitsuki | 0:762583fdd0de | 115 | // for(int i=0; i<8; i++){ |
onishiitsuki | 0:762583fdd0de | 116 | // pc.printf("%d:%d ", i, buffer[i]); |
onishiitsuki | 0:762583fdd0de | 117 | // } |
onishiitsuki | 0:762583fdd0de | 118 | uint8_t rx = buffer[0]; |
onishiitsuki | 0:762583fdd0de | 119 | // end of code for test |
onishiitsuki | 0:762583fdd0de | 120 | |
onishiitsuki | 0:762583fdd0de | 121 | // uint8_t rx = pc.getc(); |
onishiitsuki | 0:762583fdd0de | 122 | // |
onishiitsuki | 0:762583fdd0de | 123 | // wait start byte |
onishiitsuki | 0:762583fdd0de | 124 | if(bufferIndex == 0 && rx != START_BYTE) { |
onishiitsuki | 0:762583fdd0de | 125 | startByteError = 1; |
onishiitsuki | 0:762583fdd0de | 126 | pc.printf("start byte ERROR"); |
onishiitsuki | 0:762583fdd0de | 127 | return; |
onishiitsuki | 0:762583fdd0de | 128 | } else { |
onishiitsuki | 0:762583fdd0de | 129 | startByteError = 0; |
onishiitsuki | 0:762583fdd0de | 130 | } |
onishiitsuki | 0:762583fdd0de | 131 | |
onishiitsuki | 0:762583fdd0de | 132 | // // push serial to buffer |
onishiitsuki | 0:762583fdd0de | 133 | // buffer[bufferIndex++] = rx; |
onishiitsuki | 0:762583fdd0de | 134 | |
onishiitsuki | 0:762583fdd0de | 135 | // when buffer is full |
onishiitsuki | 0:762583fdd0de | 136 | if(bufferIndex == 8) { |
onishiitsuki | 0:762583fdd0de | 137 | bufferIndex = 0; |
onishiitsuki | 0:762583fdd0de | 138 | |
onishiitsuki | 0:762583fdd0de | 139 | // check parity |
onishiitsuki | 0:762583fdd0de | 140 | // uint8_t serialXOR = buffer[1]; |
onishiitsuki | 0:762583fdd0de | 141 | // for (int i=2; i<=6; i++) { |
onishiitsuki | 0:762583fdd0de | 142 | // serialXOR ^= buffer[i]; |
onishiitsuki | 0:762583fdd0de | 143 | // } |
onishiitsuki | 0:762583fdd0de | 144 | // if (serialXOR != buffer[7]) { |
onishiitsuki | 0:762583fdd0de | 145 | // parityByteError = 1; |
onishiitsuki | 0:762583fdd0de | 146 | // pc.printf("parity byte ERROR: XOR is %d, buffer byte is %d ", serialXOR, buffer[7]); |
onishiitsuki | 0:762583fdd0de | 147 | // return; |
onishiitsuki | 0:762583fdd0de | 148 | // } else { |
onishiitsuki | 0:762583fdd0de | 149 | // outProcFlag = 1; |
onishiitsuki | 0:762583fdd0de | 150 | // parityByteError = 0; |
onishiitsuki | 0:762583fdd0de | 151 | // } |
onishiitsuki | 0:762583fdd0de | 152 | } |
onishiitsuki | 0:762583fdd0de | 153 | } |
onishiitsuki | 0:762583fdd0de | 154 | |
onishiitsuki | 0:762583fdd0de | 155 | int main(void) |
onishiitsuki | 0:762583fdd0de | 156 | { |
onishiitsuki | 0:762583fdd0de | 157 | pc.baud(921600); |
onishiitsuki | 0:762583fdd0de | 158 | startByteError = 0; |
onishiitsuki | 0:762583fdd0de | 159 | parityByteError = 0; |
onishiitsuki | 0:762583fdd0de | 160 | int test_count = 0; |
onishiitsuki | 0:762583fdd0de | 161 | |
onishiitsuki | 0:762583fdd0de | 162 | // initial state is free run |
onishiitsuki | 0:762583fdd0de | 163 | init_state(); |
onishiitsuki | 0:762583fdd0de | 164 | wait(1); |
onishiitsuki | 2:3c335fcdd7f4 | 165 | pc.printf("+"); |
onishiitsuki | 4:9c39770e13e6 | 166 | ticker.attach_us(&PWM_processor, SAMPLING_PERIOD/128.0f); |
onishiitsuki | 4:9c39770e13e6 | 167 | input_test_data.attach_us(&set_test_buffer, SAMPLING_PERIOD); |
onishiitsuki | 0:762583fdd0de | 168 | pc.printf("+"); |
onishiitsuki | 0:762583fdd0de | 169 | |
onishiitsuki | 0:762583fdd0de | 170 | while(1) { |
onishiitsuki | 2:3c335fcdd7f4 | 171 | stateChecker = 1; |
onishiitsuki | 0:762583fdd0de | 172 | // if(pc.readable(){ |
onishiitsuki | 0:762583fdd0de | 173 | event_func(); |
onishiitsuki | 0:762583fdd0de | 174 | test_count++; |
onishiitsuki | 0:762583fdd0de | 175 | // } |
onishiitsuki | 0:762583fdd0de | 176 | |
onishiitsuki | 0:762583fdd0de | 177 | // code for test |
onishiitsuki | 4:9c39770e13e6 | 178 | if(test_count%1000 == 0) { |
onishiitsuki | 3:e877a237c329 | 179 | pc.printf("+"); |
onishiitsuki | 4:9c39770e13e6 | 180 | test_count = 0; |
onishiitsuki | 4:9c39770e13e6 | 181 | } |
onishiitsuki | 0:762583fdd0de | 182 | // end of code for test |
onishiitsuki | 0:762583fdd0de | 183 | |
onishiitsuki | 0:762583fdd0de | 184 | } |
onishiitsuki | 0:762583fdd0de | 185 | } |