Onishi Itsuki / Mbed 2 deprecated mbed_PWM_control

Dependencies:   mbed

Committer:
onishiitsuki
Date:
Thu Jul 16 05:17:44 2020 +0000
Revision:
1:ccc6ed1e4cd8
Parent:
0:762583fdd0de
Child:
2:3c335fcdd7f4
share2

Who changed what in which revision?

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