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

Dependents:   Nucleo_pmsmfoc

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?

UserRevisionLine numberNew 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