|Fig. 1: Application Mapping - HW & SW modules used for V/F Scalar Control are highlighted in green|
If you recall the picture from Fig. 3, the 3-Phase PMSM Control Workshop with NXP's Model-Based Design Toolbox article, then you know that V/F Scalar Control is the term used to describe a very basic form of motor control that is using a non-vector approach scheme. A PMSM can be led to steady state regime by one of the following control techniques:
To explain how this technique works lets recall first the Module 2: PMSM and FOC Theory . It that module we have discussed various reference frames used to describe the PMSM theory of operation and we have obtained the main equations of the motor in the shown here as (eq. 1 and eq. 2)
|voltages and current in d-axis and q-axis respectively|
|d and q-axis inductances and stator winding resistance|
|d and q-axis flux linkage and permanent magnet flux linkage|
|electrical rotor speed|
In steady state regime, the flux linkage variation is zero, and for further simplification we are going to assume the stator winding resistance is neglectable. Taking into consideration these simplifications and the flux linkage equation (eq. 2) then the equations (eq. 3) becomes:
|Fig. 2: V/F profile practical aspects|
In case of PMSM, both open and closed-loop control of the speed can be implemented based on the V/F scalar control. Open-loop control is used in applications where system dynamic response is not a concern. For such use cases, the frequency is determined based on the desired speed and the assumption that the rotor will ultimately follow the synchronous speed.
|Fig. 3: V/F scalar control block diagram|
|Fig. 4: Simulink model for the entire plant: MCU-DC2AC INVERTER-PMSM|
|Fig. 5: FAST and SLOW control loop model|
The SLOW Loop Subsystem Fig. 6, updates the commands for the FAST Loop Subsystem shown in Fig. 7. Based on the SPEED_CMD set by the user as motor target speed, a trapezoidal speed profile is generated using a dedicated Simulink block exposed by the AMMCLIB Add-on. Based on this SPEED_REF the electrical angle used for Inverse Park transformation is going to be derived.
|Fig. 6: SLOW control loop model|
The quadrature voltages alpha-beta are computed based on the electrical angle and the (dq) reference voltages obtained in SLOW Loop. In case of UD_REF the value is set to 0 just to emulate the theory behind FOC and in case of UQ_REF the value is obtained from a Look-Up-Table (LUT) that implement the concept of V/F scalar control.
|Fig. 7: FAST control loop model|
At each 0.1ms the PWM commands are computed and updated based on AMMCLIB specialized Simulink block that implements and optimized Space Vector Modulation with 3rd harmonic injection. These PWM commands are then passed to the next subsystem that emulates the operations for power inverter.
|Fig. 8: Simplified Power Inverter model|
|Fig. 9: 3-phase PMSM model|
Note 1: we are not going into details about PMSM modelling since this is not the purpose of this module. Feel free to follow the link indicated in the model to get more details. As usual, if you have any questions about it, feel free to ask.
Note 2: I've choose to implement this simplified model to avoid the usage of other MATLAB toolboxes. If you have access to Simscape Power System you could use one of the motors from there.
Fig. 10: V/F scalar control commands in case of start-up ramp:
(1) Speed Profile, (2) Electric Angle, (3) quadrature voltage references and (4) 3-phase stator voltages references
|Fig. 11: Space Vector Modulation verification: Inputs & Outputs|
Fig. 12: PMSM Model Responses in case of start-up sequence:
(1) Command vs. Actual Motor Speed, (2) Rotor angle vs. Rotor position, (3) Stator Currents and (4) Back EMF voltages
|Fig. 13: Simulink model for S32K embedded target code generation|
|Video training: Open Loop V/F Scalar Control Model for PMSM|
The pre-driver can be configured over SPI communication to enable various features. Please check the MC34GD3000 for details. In this module we are not going to use this feature.
|Fig. 14: MC34GD Pre-driver pins|
|Fig. 15: MotorGD subsystem: on the left - simplified inverter Simulink block diagram, on the right - S32K GPIO peripherals that set EN1/EN2 and RST pins to high|
|Fig. 16: GPIO Configuration for Enable and RST signals|
|Fig. 17: PWM generation in Simulink modelling vs. PWM generation used for code generation on S32K|
The FTM Simulink block is configured to initialize the FTM3 module since the output signals from that specific module are routed on the PCB to control the actual power inverter MOSFETs. The schematic for the MotorGD DevKit Fig. 18, shows the actual signal routing.
The MotorGD DevKit was designed to be compatible with Arduino shields, therefore only some specific signals are available on the pin-headers. In case you design your own power inverter you might need to reconfigure the actual pins that controls the MOSFETs.
|Fig. 18: MC34GD3000 and MotorGD DevKit Power Inverter signal routing|
|Fig. 19: MotorGD DevKit Pin Assignment|
|Fig. 20: S32K144 Evaluation Board Pin Assignment|
|Fig. 21: FTM Peripheral Block Configuration for controlling the power inverter from MotorGD DevKit|
NXP's Model-Based Design Toolbox lets you configure and call the FreeMASTER anywhere in your model. For this application, since the goal is to check the real hardware data against the ones obtained from Simulink simulation we are going to configure the FreeMASTER as shown in Fig. 22.
|Fig. 22: FreeMASTER configuration|
Please note that we have configured the FreeMASTER to work in Short Interrupt mode, with a relative high priority - less than the ones needed for actual motor control loops and we have enabled the Recorder option for a timebase of 0.1ms. All these settings and the actual function call for the FreeMASTER Recorder (Fig. 23) are needed to make sure you capture the data in the FAST loop - otherwise we might read wrong data.
|Fig. 23: Place the FreeMASTER Recorder Call Simulink Block in the FAST Loop Sybsystem|
Fig. 24: SIMULATION vs. REAL Start-up Sequence
(1) Speed Reference Profile, (2)Electric Angle Transformation, (3) Fixed Frame Quadrature Voltages,
(4) 3-phase PWM duty-cycles for each PMSM phase
Fig. 25: SIMULATION vs. REAL Space Vector Modulation in Steady State Regime
Inputs: (1) DQ Frame Voltages, (2) Fixed Frame Quadrature voltages, (3) Electric Angle for 500[rpm] equivalent
Output: (4) SVM Sector Identification
Fig. 26: SIMULATION vs. REAL PMSM Steady State Zoom
(1) Electric angle variation for 500[rpm] motor speed and equivalent (2) SVM 3-phase voltage references
|Fig. 27: PWM High (yellow) and Low (cyan) Commands|
Note PWM HIGH and LOW are configured to be complementary but due to HW restrictions the low side PWM signals are active LOW.
|Fig. 28: Phase A &B terminal voltages and Line A-B resulting voltage. Check Module 4: Space Vector Modulation for details|
Update January 28th 2019 - This Simulink model is now available on MATLAB 2018b and MBDT for S32K14x 2018.R1 release
Before using the new models make sure you apply all the hot-patches from here: HotFix: MBD Toolbox 2018.R1 for S32K
Regarding your questions:
Seems about right!
Okay ! So I have one more question about this...
In the FNB41560 Subsystem I read the Fault1 and Fault2 signals.
I want to use them in the PWM Commands Subsystem for deactivating the pwm if one fault Signal occurs.
With GoTo / From Blocks this isn't possible, but I don't want to have additional Input / Output ports.
Goto/From connections cannot cross nonvirtual subsystem boundaries. The only exception is when a goto is connected to a state output port
Component:Simulink | Category:Model error
Invalid connection starts with 'V_f_Scalar_Control_KV4x/FNB41560/Goto'
Component:Simulink | Category:Model error
Invalid connection ends with 'V_f_Scalar_Control_KV4x/HVP-MC3PH/Fast Loop Control/PWM Commands/From'
How could I realize it to use the fault signals in the HVP-MC3PH/Fast Loop Control/PWM Commands Subsystem without having additional Input / Output ports ?
Also I'm not sure if this is the correct way to implement this safety function ?
Maybe there should be triggered a Interrupt if one fault Signal occurs ?
You could use the Data Store blocks to write and read the values.
In general the protection routine is called on ADC interrupt immediately after current measurements and prior to the next PWM duty cycle update in order to stop the inverter ASAP.
Could you have a look over it ?
now my model for the embedded target looks like this:
The data store Memory blocks have to be on the same Level like the both Subsystems "HVP-MC3PH" and "FNB41560", so that it is possible to write data in the FNB41560 Subsystem and read them in the HVP-MC3PH/Fast Loop Control/PWM Commands Subsystem, correct ?
the content of "FNB41560" Subsystem:
is it correct to place the ADC_Config, ADC_Start and ADC_Samples here or should they be on the same Level like MCD_MKV4xF_Config ?
In the adc samples Subsystem only the sample of ipm temp is configured:
The HVP-MC3PH / Fast Loop Control / PWM Commands Subsystem:
If Fault1, Fault2 or IPM_Temp is Logical 1 the Switch passes Input 1 which I configured "0".
For the IPM_Temp signal I have one question.
The block diagram of the driver and layout of mc3ph main board:
In the mc3ph user guide documentation I found this R-T curve of the ntc Thermistor for temperature sensing:
For example I want to stop the PWM if temperature is higher than 100°C.
By the way: What is your temperature recommendation for shutting down ?
At 100°C the Thermistor should have R = 3000 Ohm
So the voltage Level at the "IPM_Temp" should be calculated like this:
Because of the 12-bit adc the Maximum value is 2^12=4096
So as threshold I configured (2,357/3,3)*4096 = 2925.
From this value the output of the "compare to constant" block is logical 1.
Is that correct so far or have I made any mistakes?
Again I attached the model.
For simulating the PWM_3PH signals in SVM scope I have to comment through the not Operator in FNB41560 Subsystem.
At the Moment of downloading the code to the target this must be undone.
Any further recommendations ?
I want to build your model into C code and download it to the control board. We have the same hardware HVP-KV46 and HVP-MC3PH. I have done this. The power I chose was powered by the control board KV46 to the HVP-MC3PH, so the 5V and 15V parts were not available. What I want to ask you is whether you have successfully communicated the model with FREEmaster. I can't connect them to a successful communication. How did you solve it? I hope you can tell me, thank you very much.
I think the UART configuration is wrong. This option depends on the Jumper Setting you have Chosen on the main board.
In the User Guide in 3.2.1 you can find the Jumper Settings.
In default you have this configuration:
My FreeMASTER configuration:
Hi Leon Thürnau
Thank you for your help.
yes I did several times. My PWM signals looks fine. Here is a picture of all three Low Side IGBT A B and C
dumitru-daniel.popa maybe you could help ?
Seems that there are some bugs with FreeMASTER and PWM ?
Hi Leon Thürnau
I also want to ask you:
Are you using the same model generated code? What is the power supply mode of the motherboard? Is it with a real motor? Can you get the PWM waveform from your diagram if you only use the control board to supply power? Thank you.
Thank you for your model and help, this time my FreeMaster communication with the motherboard is normal, but I do not understand how to set up additional switches in the PTE21, and just like you suggested when I comment out the fault1 in PWM_COMMANDS subsystem signal, PWM generated The duty cycle is still 50%. Can you give me some suggestions and tips, thank you.
I had connected the Switch between J2 pins 1 and 4.
In Standard Jumper configuration "RxD_EXT" is equal to "RxD1".
RxD1 is connected to "PTE21" on the Controller Card.
You should check the Input signals of the "OR" with freemaster.
If any of this signals is Logical true then the Switch block passes Input 1.
I'm not sure if this was exatly the same model. I've attached my actual one, maybe you could try this.
The download to the target is succesful and the model starts.
Please connect the additional Switch to "pte21" so that the PWM dowsn't start immediatly after download the code.
Because I'm using a real Motor the power supply of the main board is 325V DC.
I also can measure the PWM signals at J1 if the main board is powered from the Controller Card. But then of course you have to comment out the fault1 in PWM_COMMANDS subsystem signal, because it is undervoltage fault.
did you have time to have a look over this ?
If the Simulation result is good enough after I found a proper LUT for my Motor I want to download the code to the target and check the results there, just like the way you did in "
I have reviewed your comment, which is of great help to me and in many places I did not think of it. I use HVP-MC3PH and HVP-KV46 just like you, but I have not purchased PMSM motor. I think my first step is to do simulation in MATLAB environment. The motor is also virtual, so it is only the verification control algorithm. I feel like we are teammates, our ultimate goal is to make our motor run safely and smoothly.
Seeing your modified model and problem bothering me as well, I also know that FreeMaster_Data_Recorder was found in the library with the following path:
If possible, I hope to have more help with KV4.
Seems we have the same goal !
But I want to see the motor running, so both Models are required for me.
the „freemaster_data_recorder“ Block in the kv4x Library i also have seen.
But in S32K it is called „freemaster_recorder_call“... Maybe there are some differences ?
in a previous Model the Communication with freemaster was Fine only with activate this Option in the Processor Config Block.
I didn’t implement a additional freemaster Block.
Only have chose the correct uart interface, which depends on the Jumpers.
Because I want to implement the workshop also based on HVP-MC3PH i've replaced the S32K blocks with the KV4x blocks and I've attached my model.
But unfortunately the KV4x library doesn't have single type precison (only 16 Bit). Because of that there are some data type conversation required. In the fast Loop control Subsystem this leads to some trouble with Cos, Sin and ParkInv Block:
In the KV4x library I didn't found a SinCos Block, so I've used one Sin Block and one Cos Block. The entry of them is the blue signal from picture above.
The Output from the Sin Block is always 0, the Output from Cos is always 3,25*10^4.
The conversation of UQ_Ref leads to 0 instead of values between 0.4...0.5
So all entrys of the ParkInv Block are wrong and it can't work correctly.
Alpha and Beta are always 0.
I this case you need to design the entire algoritm to work on 16bit values.
I would suggest to start with the input values and compute them as fixed-point 16-bit fractional and avoid the Simulink Data Type Conversion.
If you need to do that conversion - then you have to do it by multiplication and shifting rather than casting. Simulink Data Type Conversion will not help you in this case.
Hope this helps!
Through the reply you gave me I understand the principle of GFLIB_Ramp_FLT, I found a similar module GFLIB_Ramp_F16 in the KV4 library, I think their role is the same, but require different types of data. We got an error in Simulink Data Type Conversion, and we should count them as fixed-point 16-bit fractional starting from the input value. Could you give us an example of how to convert, for example, starting from speed command value 1000 . Because after I find the relevant information still need help, thank you！
the "MLIB_Div_F16" block doesn't exist in the KV4x library...
So we can't use it.
How could we implement your algorithm ?
The description og the S32K "MLIB_Div_F16" block Shows:
Bit accurate model of multiplication of two Input values."