Skip to content

Commit

Permalink
MBD FOC code optimized with CMSIS-DSP (#184)
Browse files Browse the repository at this point in the history
* added cmsis/dsp version 1.6.0

* added matlab-generated code for foc algorithm
details: use of single precision, CMSIS-DSP, efficient Park Transform algorithm
the tick function takes 2.5 usec on the amcbldc w/ -Ofast optimization

* amcbldc-application01: added test duration of the foc algorithm
  • Loading branch information
marcoaccame authored May 19, 2021
1 parent a4f3b56 commit 7456346
Show file tree
Hide file tree
Showing 48 changed files with 16,133 additions and 42 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -135,7 +135,7 @@
<SetRegEntry>
<Number>0</Number>
<Key>ARMRTXEVENTFLAGS</Key>
<Name>-L175 -Z23 -C0 -M1 -T1</Name>
<Name>-L175 -Z6 -C0 -M1 -T1</Name>
</SetRegEntry>
<SetRegEntry>
<Number>0</Number>
Expand All @@ -153,40 +153,7 @@
<Name></Name>
</SetRegEntry>
</TargetDriverDllRegistry>
<Breakpoint>
<Bp>
<Number>0</Number>
<Type>0</Type>
<LineNumber>119</LineNumber>
<EnabledFlag>1</EnabledFlag>
<Address>134387956</Address>
<ByteObject>0</ByteObject>
<HtxType>0</HtxType>
<ManyObjects>0</ManyObjects>
<SizeOfObject>0</SizeOfObject>
<BreakByAccess>0</BreakByAccess>
<BreakIfRCount>1</BreakIfRCount>
<Filename>..\..\..\..\embot\app\embot_app_scope.cpp</Filename>
<ExecCommand></ExecCommand>
<Expression>\\amcbldc\../../../../embot/app/embot_app_scope.cpp\119</Expression>
</Bp>
<Bp>
<Number>1</Number>
<Type>0</Type>
<LineNumber>112</LineNumber>
<EnabledFlag>1</EnabledFlag>
<Address>134401450</Address>
<ByteObject>0</ByteObject>
<HtxType>0</HtxType>
<ManyObjects>0</ManyObjects>
<SizeOfObject>0</SizeOfObject>
<BreakByAccess>0</BreakByAccess>
<BreakIfRCount>1</BreakIfRCount>
<Filename>..\..\..\..\..\..\eBcode\arch-arm\libs\midware\eventviewer\src\eventviewer.c</Filename>
<ExecCommand></ExecCommand>
<Expression>\\amcbldc\../../../../../../eBcode/arch-arm/libs/midware/eventviewer/src/eventviewer.c\112</Expression>
</Bp>
</Breakpoint>
<Breakpoint/>
<WatchWindow1>
<Ww>
<count>0</count>
Expand Down Expand Up @@ -1073,7 +1040,7 @@

<Group>
<GroupName>embot::os</GroupName>
<tvExp>1</tvExp>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel>
<RteFlg>0</RteFlg>
Expand Down Expand Up @@ -1459,6 +1426,38 @@
</File>
</Group>

<Group>
<GroupName>others::foc</GroupName>
<tvExp>1</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel>
<RteFlg>0</RteFlg>
<File>
<GroupNumber>13</GroupNumber>
<FileNumber>54</FileNumber>
<FileType>8</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\src\FOCode\BLDC_FOC_Code\Current_FOC_ert_rtw\Current_FOC.cpp</PathWithFileName>
<FilenameWithoutPath>Current_FOC.cpp</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>13</GroupNumber>
<FileNumber>55</FileNumber>
<FileType>4</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\..\..\..\libs\lowlevel\cmsis\dsp\v160\Lib\ARM\arm_cortexM4lf_math.lib</PathWithFileName>
<FilenameWithoutPath>arm_cortexM4lf_math.lib</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
</Group>

<Group>
<GroupName>::CMSIS</GroupName>
<tvExp>0</tvExp>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -313,7 +313,7 @@
</ArmAdsMisc>
<Cads>
<interw>1</interw>
<Optim>2</Optim>
<Optim>5</Optim>
<oTime>0</oTime>
<SplitLS>0</SplitLS>
<OneElfS>1</OneElfS>
Expand All @@ -339,7 +339,7 @@
<MiscControls>-Wno-pragma-pack -Wno-deprecated-register -DEMBOT_USE_rtos_osal</MiscControls>
<Define>USE_STM32HAL STM32HAL_BOARD_AMCBLDC STM32HAL_DRIVER_V120</Define>
<Undefine></Undefine>
<IncludePath>..\..\..\..\..\..\eBcode\arch-arm\libs\highlevel\abslayer\osal\api;..\..\..\..\..\..\eBcode\arch-arm\libs\midware\eventviewer\api;..\..\..\..\..\..\eBcode\arch-arm\libs\lowlevel\stm32hal\api;..\..\..\..\..\..\..\..\icub-firmware-shared\embot\core;..\..\..\..\..\..\eBcode\arch-arm\embot\app;..\..\..\..\..\..\eBcode\arch-arm\embot\i2h;..\..\..\..\..\..\eBcode\arch-arm\embot\hw;..\..\..\..\..\..\eBcode\arch-arm\embot\os;..\..\..\..\..\..\eBcode\arch-arm\embot;..\..\..\..\..\..\..\..\icub-firmware-shared\embot\core;..\..\..\..\embot\app\dsp;..\..\..\..\..\..\..\..\icub-firmware-shared\can\canProtocolLib;..\..\..\..\embot\app\skeleton;..\..\..\..\embot\prot\can;..\..\bsp</IncludePath>
<IncludePath>..\..\..\..\..\..\eBcode\arch-arm\libs\highlevel\abslayer\osal\api;..\..\..\..\..\..\eBcode\arch-arm\libs\midware\eventviewer\api;..\..\..\..\..\..\eBcode\arch-arm\libs\lowlevel\stm32hal\api;..\..\..\..\..\..\..\..\icub-firmware-shared\embot\core;..\..\..\..\..\..\eBcode\arch-arm\embot\app;..\..\..\..\..\..\eBcode\arch-arm\embot\i2h;..\..\..\..\..\..\eBcode\arch-arm\embot\hw;..\..\..\..\..\..\eBcode\arch-arm\embot\os;..\..\..\..\..\..\eBcode\arch-arm\embot;..\..\..\..\..\..\..\..\icub-firmware-shared\embot\core;..\..\..\..\embot\app\dsp;..\..\..\..\..\..\..\..\icub-firmware-shared\can\canProtocolLib;..\..\..\..\embot\app\skeleton;..\..\..\..\embot\prot\can;..\..\bsp;..\src\FOCode\BLDC_FOC_Code\Current_FOC_ert_rtw;..\..\..\..\libs\lowlevel\cmsis\dsp\v160\Include</IncludePath>
</VariousControls>
</Cads>
<Aads>
Expand Down Expand Up @@ -775,6 +775,21 @@
</File>
</Files>
</Group>
<Group>
<GroupName>others::foc</GroupName>
<Files>
<File>
<FileName>Current_FOC.cpp</FileName>
<FileType>8</FileType>
<FilePath>..\src\FOCode\BLDC_FOC_Code\Current_FOC_ert_rtw\Current_FOC.cpp</FilePath>
</File>
<File>
<FileName>arm_cortexM4lf_math.lib</FileName>
<FileType>4</FileType>
<FilePath>..\..\..\..\libs\lowlevel\cmsis\dsp\v160\Lib\ARM\arm_cortexM4lf_math.lib</FilePath>
</File>
</Files>
</Group>
<Group>
<GroupName>::CMSIS</GroupName>
<GroupOption>
Expand Down Expand Up @@ -1618,6 +1633,21 @@
</File>
</Files>
</Group>
<Group>
<GroupName>others::foc</GroupName>
<Files>
<File>
<FileName>Current_FOC.cpp</FileName>
<FileType>8</FileType>
<FilePath>..\src\FOCode\BLDC_FOC_Code\Current_FOC_ert_rtw\Current_FOC.cpp</FilePath>
</File>
<File>
<FileName>arm_cortexM4lf_math.lib</FileName>
<FileType>4</FileType>
<FilePath>..\..\..\..\libs\lowlevel\cmsis\dsp\v160\Lib\ARM\arm_cortexM4lf_math.lib</FilePath>
</File>
</Files>
</Group>
<Group>
<GroupName>::CMSIS</GroupName>
<GroupOption>
Expand Down Expand Up @@ -2461,6 +2491,21 @@
</File>
</Files>
</Group>
<Group>
<GroupName>others::foc</GroupName>
<Files>
<File>
<FileName>Current_FOC.cpp</FileName>
<FileType>8</FileType>
<FilePath>..\src\FOCode\BLDC_FOC_Code\Current_FOC_ert_rtw\Current_FOC.cpp</FilePath>
</File>
<File>
<FileName>arm_cortexM4lf_math.lib</FileName>
<FileType>4</FileType>
<FilePath>..\..\..\..\libs\lowlevel\cmsis\dsp\v160\Lib\ARM\arm_cortexM4lf_math.lib</FilePath>
</File>
</Files>
</Group>
<Group>
<GroupName>::CMSIS</GroupName>
<GroupOption>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,196 @@
//
// Non-Degree Granting Education License -- for use at non-degree
// granting, nonprofit, educational organizations only. Not for
// government, commercial, or other organizational use.
//
// File: Current_FOC.cpp
//
// Code generated for Simulink model 'Current_FOC'.
//
// Model version : 2.15
// Simulink Coder version : 9.5 (R2021a) 14-Nov-2020
// C/C++ source code generated on : Sun May 16 18:18:18 2021
//
// Target selection: ert.tlc
// Embedded hardware selection: ARM Compatible->ARM Cortex-M
// Code generation objectives: Unspecified
// Validation result: Not run
//
#include "Current_FOC.h"
#include "Current_FOC_private.h"

// Model step function
void Current_FOCModelClass::step()
{
real32_T rtb_Cos;
real32_T rtb_Gain1;
real32_T rtb_Sin;
real32_T rtb_algDD_o1;
real32_T rtb_algDD_o2;
real32_T rtb_algDD_o2_o;
real32_T u0;
real32_T u0_0;

// Outputs for Atomic SubSystem: '<Root>/Current_FOC'
// Product: '<S1>/Product' incorporates:
// Constant: '<S1>/Constant'
// Inport: '<Root>/Angle_fbk'

rtb_Gain1 = Current_FOC_U.Angle_fbk * 7.0F;

// Trigonometry: '<S1>/Cos'
rtb_Cos = arm_cos_f32(rtb_Gain1);

// Trigonometry: '<S1>/Sin'
rtb_Sin = arm_sin_f32(rtb_Gain1);

// Outputs for Atomic SubSystem: '<S1>/Clarke Transform'
// AlgorithmDescriptorDelegate generated from: '<S2>/a16' incorporates:
// Inport: '<Root>/Iabc_fbk'

arm_clarke_f32(Current_FOC_U.Iabc_fbk[0], Current_FOC_U.Iabc_fbk[1],
&rtb_Gain1, &rtb_algDD_o2_o);

// End of Outputs for SubSystem: '<S1>/Clarke Transform'

// Outputs for Atomic SubSystem: '<S1>/Park Transform'
// AlgorithmDescriptorDelegate generated from: '<S7>/a16'
arm_park_f32(rtb_Gain1, rtb_algDD_o2_o, &rtb_algDD_o1, &rtb_algDD_o2, rtb_Sin,
rtb_Cos);

// End of Outputs for SubSystem: '<S1>/Park Transform'

// Gain: '<S1>/Gain1'
rtb_Gain1 = -rtb_algDD_o1;

// Sum: '<S1>/Subtract' incorporates:
// Inport: '<Root>/I_ref'

rtb_algDD_o2 = Current_FOC_U.I_ref - rtb_algDD_o2;

// Sum: '<S48>/Sum' incorporates:
// Constant: '<S1>/P'
// DiscreteIntegrator: '<S39>/Integrator'
// Gain: '<S1>/Gain1'
// Product: '<S44>/PProd Out'

u0 = -rtb_algDD_o1 * 20.0F + Current_FOC_DW.Integrator_DSTATE;

// Sum: '<S97>/Sum' incorporates:
// Constant: '<S1>/P'
// DiscreteIntegrator: '<S88>/Integrator'
// Product: '<S93>/PProd Out'

u0_0 = rtb_algDD_o2 * 20.0F + Current_FOC_DW.Integrator_DSTATE_o;

// Saturate: '<S95>/Saturation'
if (u0_0 > 12.0F) {
u0_0 = 12.0F;
} else if (u0_0 < -12.0F) {
u0_0 = -12.0F;
}

// End of Saturate: '<S95>/Saturation'

// Sum: '<S1>/Sum' incorporates:
// Gain: '<S1>/Gain2'
// Gain: '<S1>/Gain3'
// Inport: '<Root>/I_ref'
// Inport: '<Root>/Speed_fbk'
// Sum: '<S1>/Add'

u0_0 += 12.95F * Current_FOC_U.I_ref + 0.0022466667F * Current_FOC_U.Speed_fbk;

// Saturate: '<S46>/Saturation'
if (u0 > 12.0F) {
u0 = 12.0F;
} else if (u0 < -12.0F) {
u0 = -12.0F;
}

// End of Saturate: '<S46>/Saturation'

// Saturate: '<S1>/Saturation'
if (u0_0 > 12.0F) {
u0_0 = 12.0F;
} else if (u0_0 < -12.0F) {
u0_0 = -12.0F;
}

// End of Saturate: '<S1>/Saturation'

// Outputs for Atomic SubSystem: '<S1>/Inverse Park Transform'
// AlgorithmDescriptorDelegate generated from: '<S5>/a16'
arm_inv_park_f32(u0, u0_0, &rtb_algDD_o2_o, &rtb_algDD_o1, rtb_Sin, rtb_Cos);

// End of Outputs for SubSystem: '<S1>/Inverse Park Transform'

// Gain: '<S4>/one_by_two'
rtb_Cos = 0.5F * rtb_algDD_o2_o;

// Gain: '<S4>/sqrt3_by_two'
rtb_Sin = 0.866025388F * rtb_algDD_o1;

// Update for DiscreteIntegrator: '<S39>/Integrator' incorporates:
// Constant: '<S1>/I'
// Product: '<S36>/IProd Out'

Current_FOC_DW.Integrator_DSTATE += rtb_Gain1 * 10000.0F * 3.75E-5F;

// Update for DiscreteIntegrator: '<S88>/Integrator' incorporates:
// Constant: '<S1>/I'
// Product: '<S85>/IProd Out'

Current_FOC_DW.Integrator_DSTATE_o += rtb_algDD_o2 * 10000.0F * 3.75E-5F;

// Outport: '<Root>/PWMabc_out' incorporates:
// Gain: '<S1>/Gain5'
// Sum: '<S4>/add_b'
// Sum: '<S4>/add_c'

Current_FOC_Y.PWMabc_out[0] = 0.0416666679F * rtb_algDD_o2_o;
Current_FOC_Y.PWMabc_out[1] = (rtb_Sin - rtb_Cos) * 0.0416666679F;
Current_FOC_Y.PWMabc_out[2] = ((0.0F - rtb_Cos) - rtb_Sin) * 0.0416666679F;

// End of Outputs for SubSystem: '<Root>/Current_FOC'
}

// Model initialize function
void Current_FOCModelClass::initialize()
{
// (no initialization code required)
}

// Model terminate function
void Current_FOCModelClass::terminate()
{
// (no terminate code required)
}

// Constructor
Current_FOCModelClass::Current_FOCModelClass() :
Current_FOC_DW(),
Current_FOC_U(),
Current_FOC_Y(),
Current_FOC_M()
{
// Currently there is no constructor body generated.
}

// Destructor
Current_FOCModelClass::~Current_FOCModelClass()
{
// Currently there is no destructor body generated.
}

// Real-Time Model get method
Current_FOCModelClass::RT_MODEL_Current_FOC_T * Current_FOCModelClass::getRTM()
{
return (&Current_FOC_M);
}

//
// File trailer for generated code.
//
// [EOF]
//
Loading

0 comments on commit 7456346

Please sign in to comment.