An example of importing Embedded Coder code into the mbed IDE. Currently doesn't connect IO to PWM, ADC, and Encoder, instead provides random inputs and measures execution time.
Dependencies: mbed-dsp mbed Nucleo_pmsmfoc
main.cpp@2:bbc155b0b886, 2014-11-25 (annotated)
- Committer:
- paulcox
- Date:
- Tue Nov 25 07:52:02 2014 +0000
- Revision:
- 2:bbc155b0b886
- Parent:
- 1:83374f658183
adding doc?
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
paulcox | 0:70d27fec6d71 | 1 | #include "mbed.h" |
paulcox | 0:70d27fec6d71 | 2 | #include "rtwdemo_pmsmfoc.h" /* Model's header file */ |
paulcox | 0:70d27fec6d71 | 3 | #include "rtwtypes.h" |
paulcox | 1:83374f658183 | 4 | #include "math_helper.h" |
paulcox | 0:70d27fec6d71 | 5 | |
paulcox | 0:70d27fec6d71 | 6 | Timer timer1; |
paulcox | 0:70d27fec6d71 | 7 | |
paulcox | 0:70d27fec6d71 | 8 | /* '<Root>/pwm_compare' */ |
paulcox | 0:70d27fec6d71 | 9 | static uint16_T pwm_compare[3]; |
paulcox | 0:70d27fec6d71 | 10 | |
paulcox | 0:70d27fec6d71 | 11 | /* '<Root>/sensors' */ |
paulcox | 0:70d27fec6d71 | 12 | static SENSORS_STRUCT sensors = { |
paulcox | 0:70d27fec6d71 | 13 | { |
paulcox | 0:70d27fec6d71 | 14 | 0U, 0U } |
paulcox | 0:70d27fec6d71 | 15 | , /* adc_phase_currents */ |
paulcox | 0:70d27fec6d71 | 16 | 0U, /* encoder_valid */ |
paulcox | 0:70d27fec6d71 | 17 | 0U /* encoder_counter */ |
paulcox | 0:70d27fec6d71 | 18 | } ; |
paulcox | 0:70d27fec6d71 | 19 | |
paulcox | 0:70d27fec6d71 | 20 | |
paulcox | 0:70d27fec6d71 | 21 | void rt_OneStep(void); |
paulcox | 0:70d27fec6d71 | 22 | void rt_OneStep(void) |
paulcox | 0:70d27fec6d71 | 23 | { |
paulcox | 0:70d27fec6d71 | 24 | static boolean_T OverrunFlag = false; |
paulcox | 0:70d27fec6d71 | 25 | |
paulcox | 0:70d27fec6d71 | 26 | /* '<Root>/motor_on' */ |
paulcox | 0:70d27fec6d71 | 27 | static uint16_T motor_on = 1U; |
paulcox | 0:70d27fec6d71 | 28 | |
paulcox | 0:70d27fec6d71 | 29 | /* '<Root>/command_type' */ |
paulcox | 0:70d27fec6d71 | 30 | static EnumCommandType command_type = Velocity; |
paulcox | 0:70d27fec6d71 | 31 | |
paulcox | 0:70d27fec6d71 | 32 | /* '<Root>/command_value' */ |
paulcox | 0:70d27fec6d71 | 33 | static real32_T current_request = 0.0F; |
paulcox | 0:70d27fec6d71 | 34 | |
paulcox | 0:70d27fec6d71 | 35 | /* '<Root>/error' */ |
paulcox | 0:70d27fec6d71 | 36 | static EnumErrorType error; |
paulcox | 0:70d27fec6d71 | 37 | |
paulcox | 0:70d27fec6d71 | 38 | /* Disable interrupts here */ |
paulcox | 0:70d27fec6d71 | 39 | |
paulcox | 0:70d27fec6d71 | 40 | /* Check for overrun */ |
paulcox | 0:70d27fec6d71 | 41 | if (OverrunFlag) { |
paulcox | 0:70d27fec6d71 | 42 | printf("------------------OVERRUN!!\r\n"); |
paulcox | 0:70d27fec6d71 | 43 | return; |
paulcox | 0:70d27fec6d71 | 44 | } |
paulcox | 0:70d27fec6d71 | 45 | |
paulcox | 0:70d27fec6d71 | 46 | OverrunFlag = true; |
paulcox | 0:70d27fec6d71 | 47 | |
paulcox | 0:70d27fec6d71 | 48 | /* Save FPU context here (if necessary) */ |
paulcox | 0:70d27fec6d71 | 49 | /* Re-enable timer or interrupt here */ |
paulcox | 0:70d27fec6d71 | 50 | /* Set model inputs here */ |
paulcox | 0:70d27fec6d71 | 51 | |
paulcox | 0:70d27fec6d71 | 52 | timer1.start(); |
paulcox | 0:70d27fec6d71 | 53 | |
paulcox | 0:70d27fec6d71 | 54 | /* Step the model for base rate */ |
paulcox | 0:70d27fec6d71 | 55 | error = Controller(motor_on, command_type, current_request, &sensors, |
paulcox | 0:70d27fec6d71 | 56 | pwm_compare); |
paulcox | 0:70d27fec6d71 | 57 | |
paulcox | 0:70d27fec6d71 | 58 | timer1.stop(); |
paulcox | 0:70d27fec6d71 | 59 | |
paulcox | 1:83374f658183 | 60 | printf("exec us: %d err: %d\r\n",timer1.read_us(),error); |
paulcox | 0:70d27fec6d71 | 61 | timer1.reset(); |
paulcox | 0:70d27fec6d71 | 62 | |
paulcox | 0:70d27fec6d71 | 63 | /* Get model outputs here */ |
paulcox | 0:70d27fec6d71 | 64 | |
paulcox | 0:70d27fec6d71 | 65 | /* Indicate task complete */ |
paulcox | 0:70d27fec6d71 | 66 | OverrunFlag = false; |
paulcox | 0:70d27fec6d71 | 67 | |
paulcox | 0:70d27fec6d71 | 68 | /* Disable interrupts here */ |
paulcox | 0:70d27fec6d71 | 69 | /* Restore FPU context here (if necessary) */ |
paulcox | 0:70d27fec6d71 | 70 | /* Enable interrupts here */ |
paulcox | 0:70d27fec6d71 | 71 | } |
paulcox | 0:70d27fec6d71 | 72 | |
paulcox | 0:70d27fec6d71 | 73 | |
paulcox | 0:70d27fec6d71 | 74 | Serial pc(SERIAL_TX, SERIAL_RX); |
paulcox | 0:70d27fec6d71 | 75 | |
paulcox | 0:70d27fec6d71 | 76 | DigitalOut myled(LED1); |
paulcox | 0:70d27fec6d71 | 77 | |
paulcox | 0:70d27fec6d71 | 78 | int main() { |
paulcox | 0:70d27fec6d71 | 79 | |
paulcox | 0:70d27fec6d71 | 80 | /* Initialize model */ |
paulcox | 0:70d27fec6d71 | 81 | Controller_Init(); |
paulcox | 0:70d27fec6d71 | 82 | srand(time(NULL)); |
paulcox | 0:70d27fec6d71 | 83 | int i = 1; |
paulcox | 0:70d27fec6d71 | 84 | pc.printf("PMSM Init done.\n"); |
paulcox | 0:70d27fec6d71 | 85 | |
paulcox | 0:70d27fec6d71 | 86 | while(1) { |
paulcox | 0:70d27fec6d71 | 87 | wait(0.5); |
paulcox | 0:70d27fec6d71 | 88 | sensors.adc_phase_currents[0] = rand()%MAX_uint16_T; |
paulcox | 0:70d27fec6d71 | 89 | sensors.adc_phase_currents[1] = rand()%MAX_uint16_T; |
paulcox | 0:70d27fec6d71 | 90 | printf("%d %d\r\n",sensors.adc_phase_currents[0],sensors.adc_phase_currents[1]); |
paulcox | 0:70d27fec6d71 | 91 | sensors.encoder_valid = 1; |
paulcox | 1:83374f658183 | 92 | sensors.encoder_counter = i*20; |
paulcox | 0:70d27fec6d71 | 93 | |
paulcox | 0:70d27fec6d71 | 94 | rt_OneStep(); |
paulcox | 0:70d27fec6d71 | 95 | |
paulcox | 1:83374f658183 | 96 | pc.printf("%d: pwm0: %d vel: %f mode: %d\r\n", i++, pwm_compare[0], velocity_measured, controller_mode); |
paulcox | 0:70d27fec6d71 | 97 | myled = !myled; |
paulcox | 1:83374f658183 | 98 | |
paulcox | 1:83374f658183 | 99 | printf("arm: %f\r\n",arm_sin_f32(3.14159F/3)); |
paulcox | 0:70d27fec6d71 | 100 | } |
paulcox | 0:70d27fec6d71 | 101 | } |
paulcox | 0:70d27fec6d71 | 102 |