software implementing neural network trained on actual motor data

Dependencies:   mbed-dsp mbed NN_lib

Fork of NN_FG_final by Curtis Mattull

Committer:
cpm219
Date:
Mon Nov 07 22:07:31 2016 +0000
Revision:
1:4f5beb9858e7
Parent:
0:34aeffc5e6f0
latest version

Who changed what in which revision?

UserRevisionLine numberNew contents of line
cpm219 0:34aeffc5e6f0 1 //
cpm219 1:4f5beb9858e7 2 // File: main.cpp
cpm219 0:34aeffc5e6f0 3 //
cpm219 0:34aeffc5e6f0 4 // Code generated for Simulink model 'neural_network3'.
cpm219 0:34aeffc5e6f0 5 //
cpm219 0:34aeffc5e6f0 6 // Model version : 1.7
cpm219 0:34aeffc5e6f0 7 // Simulink Coder version : 8.10 (R2016a) 10-Feb-2016
cpm219 0:34aeffc5e6f0 8 // C/C++ source code generated on : Tue Oct 04 18:06:54 2016
cpm219 0:34aeffc5e6f0 9 //
cpm219 0:34aeffc5e6f0 10 // Target selection: ert.tlc
cpm219 0:34aeffc5e6f0 11 // Embedded hardware selection: ARM Compatible->ARM Cortex
cpm219 0:34aeffc5e6f0 12 // Code generation objectives: Unspecified
cpm219 0:34aeffc5e6f0 13 // Validation result: Not run
cpm219 1:4f5beb9858e7 14
cpm219 1:4f5beb9858e7 15 //#include <stddef.h>
cpm219 1:4f5beb9858e7 16 //#include <stdio.h> // This ert_main.c example uses printf/fflush
cpm219 1:4f5beb9858e7 17 #include "neural_network_3ph.h" // Model's header file
cpm219 0:34aeffc5e6f0 18 #include "rtwtypes.h"
cpm219 0:34aeffc5e6f0 19 #include "mbed.h"
cpm219 1:4f5beb9858e7 20 #include "arm_math.h"
cpm219 1:4f5beb9858e7 21 #include "arm_const_structs.h"
cpm219 0:34aeffc5e6f0 22
cpm219 1:4f5beb9858e7 23 #define led_on 0x00
cpm219 1:4f5beb9858e7 24 #define led_off 0x01
cpm219 1:4f5beb9858e7 25
cpm219 1:4f5beb9858e7 26 DigitalOut led_r(PTB22);
cpm219 1:4f5beb9858e7 27 DigitalOut led_g(PTE26);
cpm219 1:4f5beb9858e7 28 DigitalOut led_b(PTB21);
cpm219 1:4f5beb9858e7 29
cpm219 1:4f5beb9858e7 30 const int FFT_LEN = 1024;
cpm219 1:4f5beb9858e7 31 const static arm_cfft_instance_f32 *S;
cpm219 1:4f5beb9858e7 32 float samples[FFT_LEN*2];
cpm219 1:4f5beb9858e7 33 float samples_normalized[FFT_LEN*2];
cpm219 1:4f5beb9858e7 34 real_T samples_trimmed[61];
cpm219 1:4f5beb9858e7 35 float magnitudes[FFT_LEN];
cpm219 1:4f5beb9858e7 36 const float dt = 0.001; // sample rate of 1kHz, letting us analyze signals up to 500Hz
cpm219 1:4f5beb9858e7 37 const float acquire_delay = 0.00004;
cpm219 1:4f5beb9858e7 38 const float sample_delay = dt-acquire_delay;
cpm219 1:4f5beb9858e7 39
cpm219 1:4f5beb9858e7 40 AnalogIn adc_in(PTB2);
cpm219 1:4f5beb9858e7 41
cpm219 1:4f5beb9858e7 42 void init_fft(int FFT_LEN);
cpm219 1:4f5beb9858e7 43
cpm219 0:34aeffc5e6f0 44 void rt_OneStep(void);
cpm219 0:34aeffc5e6f0 45 void rt_OneStep(void)
cpm219 0:34aeffc5e6f0 46 {
cpm219 1:4f5beb9858e7 47 static int32_t i = 0;
cpm219 1:4f5beb9858e7 48
cpm219 1:4f5beb9858e7 49 // '<Root>/Out1'
cpm219 1:4f5beb9858e7 50 static real_T arg_Out1[2];
cpm219 0:34aeffc5e6f0 51
cpm219 1:4f5beb9858e7 52 static real_T max = 0;
cpm219 1:4f5beb9858e7 53 static real_T min = 0;
cpm219 1:4f5beb9858e7 54 const float running_thresh = 0.76;
cpm219 1:4f5beb9858e7 55
cpm219 1:4f5beb9858e7 56 //collect imag data in complex form
cpm219 1:4f5beb9858e7 57 for(i = 0; i< (FFT_LEN*2)+1; i+=2)
cpm219 1:4f5beb9858e7 58 {
cpm219 1:4f5beb9858e7 59 samples[i+1] = 0.0; // imaginary data
cpm219 1:4f5beb9858e7 60 }
cpm219 1:4f5beb9858e7 61
cpm219 1:4f5beb9858e7 62 //collect real data in complex form
cpm219 1:4f5beb9858e7 63 for(i = 0; i< (FFT_LEN*2)+1; i+=2)
cpm219 1:4f5beb9858e7 64 {
cpm219 1:4f5beb9858e7 65 samples[i] = adc_in.read(); // real data
cpm219 1:4f5beb9858e7 66 wait(sample_delay); //timestep -40us for reading and storing value
cpm219 1:4f5beb9858e7 67 // wait(dt);
cpm219 1:4f5beb9858e7 68 }
cpm219 1:4f5beb9858e7 69
cpm219 1:4f5beb9858e7 70 //find max
cpm219 1:4f5beb9858e7 71 for(i = 0; i< (FFT_LEN*2)+1; i+=2)
cpm219 1:4f5beb9858e7 72 {
cpm219 1:4f5beb9858e7 73 if (samples[i] > max)
cpm219 1:4f5beb9858e7 74 {
cpm219 1:4f5beb9858e7 75 max = samples[i];
cpm219 1:4f5beb9858e7 76 }
cpm219 1:4f5beb9858e7 77 }
cpm219 1:4f5beb9858e7 78
cpm219 1:4f5beb9858e7 79 //find min
cpm219 1:4f5beb9858e7 80 for(i = 0; i< (FFT_LEN*2)+1; i+=2)
cpm219 1:4f5beb9858e7 81 {
cpm219 1:4f5beb9858e7 82 if (samples[i] < min)
cpm219 1:4f5beb9858e7 83 {
cpm219 1:4f5beb9858e7 84 min = samples[i];
cpm219 1:4f5beb9858e7 85 }
cpm219 1:4f5beb9858e7 86 }
cpm219 1:4f5beb9858e7 87
cpm219 1:4f5beb9858e7 88 //normalize data
cpm219 1:4f5beb9858e7 89 for(i = 0; i< (FFT_LEN*2)+1; i+=2)
cpm219 1:4f5beb9858e7 90 {
cpm219 1:4f5beb9858e7 91 samples_normalized[i] = (samples[i]-min) / (max - min); // real data
cpm219 1:4f5beb9858e7 92 samples_normalized[i+1] = 0.0; // imaginary data
cpm219 1:4f5beb9858e7 93 }
cpm219 1:4f5beb9858e7 94
cpm219 1:4f5beb9858e7 95 // Calculate complex FFT
cpm219 1:4f5beb9858e7 96 arm_cfft_f32(S, samples_normalized, 0, 1);
cpm219 1:4f5beb9858e7 97
cpm219 1:4f5beb9858e7 98 // Calculate magnitude of complex numbers output by the FFT.
cpm219 1:4f5beb9858e7 99 arm_cmplx_mag_f32(samples_normalized, magnitudes, FFT_LEN);
cpm219 0:34aeffc5e6f0 100
cpm219 1:4f5beb9858e7 101 // /*20 - 80 Hz */
cpm219 1:4f5beb9858e7 102 for(i = 0; i< 61; i++)
cpm219 1:4f5beb9858e7 103 {
cpm219 1:4f5beb9858e7 104 samples_trimmed[i] = magnitudes[i+20];
cpm219 1:4f5beb9858e7 105 }
cpm219 1:4f5beb9858e7 106
cpm219 1:4f5beb9858e7 107 // /* gain, tweaking lead to 17.5 */
cpm219 1:4f5beb9858e7 108 for(i = 0; i< 61; i++)
cpm219 1:4f5beb9858e7 109 {
cpm219 1:4f5beb9858e7 110 samples_trimmed[i] = samples_trimmed[i]*17.5;
cpm219 1:4f5beb9858e7 111 }
cpm219 1:4f5beb9858e7 112
cpm219 1:4f5beb9858e7 113 // Step the model
cpm219 1:4f5beb9858e7 114 neural_network_custom(samples_trimmed, arg_Out1);
cpm219 1:4f5beb9858e7 115
cpm219 1:4f5beb9858e7 116 // for debugging, print the input to the neural network
cpm219 1:4f5beb9858e7 117 for(i =0;i<61;i++)
cpm219 1:4f5beb9858e7 118 {
cpm219 1:4f5beb9858e7 119 printf("%i \t %f\r\n",i+20, samples_trimmed[i]);
cpm219 1:4f5beb9858e7 120 }
cpm219 1:4f5beb9858e7 121
cpm219 1:4f5beb9858e7 122 //print the output of the neural network
cpm219 1:4f5beb9858e7 123 for(i =0;i<2;i++)
cpm219 1:4f5beb9858e7 124 {
cpm219 1:4f5beb9858e7 125 printf("output[%i]: %i",i,(int)arg_Out1[i]);
cpm219 1:4f5beb9858e7 126 printf("\t");
cpm219 1:4f5beb9858e7 127 }
cpm219 1:4f5beb9858e7 128
cpm219 1:4f5beb9858e7 129 // this was used to determine when the motor was running or not
cpm219 1:4f5beb9858e7 130 printf("\r\n\r\nsample[0]: %f \r\n",samples[0]);
cpm219 0:34aeffc5e6f0 131
cpm219 1:4f5beb9858e7 132 // output logic controlling leds
cpm219 1:4f5beb9858e7 133 if(arg_Out1[0] == 0)
cpm219 1:4f5beb9858e7 134 {
cpm219 1:4f5beb9858e7 135 if (arg_Out1[1] == 0) // 00 normal mode
cpm219 1:4f5beb9858e7 136 { // green
cpm219 1:4f5beb9858e7 137 led_r.write(led_off);
cpm219 1:4f5beb9858e7 138 led_g.write(led_on);
cpm219 1:4f5beb9858e7 139 led_b.write(led_off);
cpm219 1:4f5beb9858e7 140 }
cpm219 1:4f5beb9858e7 141 else if(arg_Out1[1] == 1) // 01 short circuit fault
cpm219 1:4f5beb9858e7 142 { // red
cpm219 1:4f5beb9858e7 143 led_r.write(led_on);
cpm219 1:4f5beb9858e7 144 led_g.write(led_off);
cpm219 1:4f5beb9858e7 145 led_b.write(led_off);
cpm219 1:4f5beb9858e7 146 }
cpm219 1:4f5beb9858e7 147 }
cpm219 1:4f5beb9858e7 148 if(arg_Out1[0] == 1)
cpm219 1:4f5beb9858e7 149 {
cpm219 1:4f5beb9858e7 150 if (arg_Out1[1] == 1) // 11 open circuit fault
cpm219 1:4f5beb9858e7 151 { // yellow
cpm219 1:4f5beb9858e7 152 led_r.write(led_on);
cpm219 1:4f5beb9858e7 153 led_g.write(led_on);
cpm219 1:4f5beb9858e7 154 led_b.write(led_off);
cpm219 1:4f5beb9858e7 155 }
cpm219 1:4f5beb9858e7 156 }
cpm219 1:4f5beb9858e7 157
cpm219 1:4f5beb9858e7 158 if(samples[0] < running_thresh) // essentially not running
cpm219 1:4f5beb9858e7 159 { // led off
cpm219 1:4f5beb9858e7 160 led_r.write(led_off);
cpm219 1:4f5beb9858e7 161 led_g.write(led_off);
cpm219 1:4f5beb9858e7 162 led_b.write(led_off);
cpm219 1:4f5beb9858e7 163 }
cpm219 1:4f5beb9858e7 164 //end of function
cpm219 0:34aeffc5e6f0 165 }
cpm219 0:34aeffc5e6f0 166
cpm219 1:4f5beb9858e7 167 void init_fft(int FFT_LEN)
cpm219 0:34aeffc5e6f0 168 {
cpm219 1:4f5beb9858e7 169 switch (FFT_LEN)
cpm219 1:4f5beb9858e7 170 {
cpm219 1:4f5beb9858e7 171 case 16:
cpm219 1:4f5beb9858e7 172 S = & arm_cfft_sR_f32_len16;
cpm219 1:4f5beb9858e7 173 break;
cpm219 1:4f5beb9858e7 174 case 32:
cpm219 1:4f5beb9858e7 175 S = & arm_cfft_sR_f32_len32;
cpm219 1:4f5beb9858e7 176 break;
cpm219 1:4f5beb9858e7 177 case 64:
cpm219 1:4f5beb9858e7 178 S = & arm_cfft_sR_f32_len64;
cpm219 1:4f5beb9858e7 179 break;
cpm219 1:4f5beb9858e7 180 case 128:
cpm219 1:4f5beb9858e7 181 S = & arm_cfft_sR_f32_len128;
cpm219 1:4f5beb9858e7 182 break;
cpm219 1:4f5beb9858e7 183 case 256:
cpm219 1:4f5beb9858e7 184 S = & arm_cfft_sR_f32_len256;
cpm219 1:4f5beb9858e7 185 break;
cpm219 1:4f5beb9858e7 186 case 512:
cpm219 1:4f5beb9858e7 187 S = & arm_cfft_sR_f32_len512;
cpm219 1:4f5beb9858e7 188 break;
cpm219 1:4f5beb9858e7 189 case 1024:
cpm219 1:4f5beb9858e7 190 S = & arm_cfft_sR_f32_len1024;
cpm219 1:4f5beb9858e7 191 break;
cpm219 1:4f5beb9858e7 192 case 2048:
cpm219 1:4f5beb9858e7 193 S = & arm_cfft_sR_f32_len2048;
cpm219 1:4f5beb9858e7 194 break;
cpm219 1:4f5beb9858e7 195 case 4096:
cpm219 1:4f5beb9858e7 196 S = & arm_cfft_sR_f32_len4096;
cpm219 1:4f5beb9858e7 197 break;
cpm219 1:4f5beb9858e7 198 }
cpm219 1:4f5beb9858e7 199 }
cpm219 0:34aeffc5e6f0 200
cpm219 1:4f5beb9858e7 201 int main(void)
cpm219 1:4f5beb9858e7 202 {
cpm219 1:4f5beb9858e7 203 //initialize leds
cpm219 1:4f5beb9858e7 204 led_r.write(led_off);
cpm219 1:4f5beb9858e7 205 led_g.write(led_off);
cpm219 1:4f5beb9858e7 206 led_b.write(led_off);
cpm219 1:4f5beb9858e7 207
cpm219 1:4f5beb9858e7 208 init_fft(FFT_LEN);
cpm219 1:4f5beb9858e7 209
cpm219 1:4f5beb9858e7 210 //software process defined within rt_onestep()
cpm219 0:34aeffc5e6f0 211 for(;;)
cpm219 0:34aeffc5e6f0 212 {
cpm219 0:34aeffc5e6f0 213 rt_OneStep();
cpm219 1:4f5beb9858e7 214 printf("run success!!\r\n");
cpm219 1:4f5beb9858e7 215 wait(1);
cpm219 0:34aeffc5e6f0 216 }
cpm219 0:34aeffc5e6f0 217
cpm219 1:4f5beb9858e7 218 return 0;
cpm219 1:4f5beb9858e7 219 }