Skip to main content
Associate III
February 10, 2024
Solved

How to change the PID Kp value

  • February 10, 2024
  • 6 replies
  • 4364 views

I am trying to tune a 28 pole 50V 20 Amp  motor 6 step  with hall sensors. Motor Pilot does not work for me. To get over this I am using STM32CubeMonitor to plot the speed response. I have also tried to change the values through Cube Monitor by writing to PID_SpeedHandle_M1.hdDefkpgain and even though the values change it has no effect on the performance. Changing values (#define PID_SPEED_KP_DEFAULT) in the drive_parameters.h file and recompiling does not work either.

 

I am only able to change the Kp values by going back to workbench and  completely regenerating the project, which is a time-consuming operation.

 

I would appreciate some advice - thanks.

    This topic has been closed for replies.
    Best answer by ADAVE.1

    Hi @RoyStevens ,

    to change the Kp on the fly, you have to update the parameters hKpDivisor and hKpDivisorPOW2 in the structure PIDSpeedHandle_M1.

    For instance, to write 1024 (hKpDivisor=1024 and hKpDivisorPOW2=10)

    However, you can easily do that with the Motor Pilot clicking on "advanced parameters" button

    Alessio

    6 replies

    Tinnagit
    Senior II
    February 10, 2024

    you can use a regular variable instead of define and you can change value of that variable.

    Associate III
    February 11, 2024

    Thanks for the reply Tinnagit and yes it would be best for this to be a simple variable. I have just spent the last 3 hours trying to change the code to do exactly that, and even with Chat GPT looking over my shoulder I have not been successful. I would be the first to admit that I am not an experienced programmer, but I am trying hard to learn. 

    Associate III
    February 12, 2024

    Could someone please explain to me why changing the value of  #define PID_SPEED_KP_DEFAULT) in the drive_parameters.h and recompiling (even using the clean option) has no effect on the Kp used by the controller. I know it does not have any effect as I am measuring the motor phase currents with an oscilloscope. 

    I thought that when I changed the Kp value in work bench and then run STM32Cubemx that the header file drive_parameters.h was created and this was solely the information that STM32CubeIde was using.

    Clearly it is not that simple. Can someone explain what is going on please.

     

    Thanks

    Tinnagit
    Senior II
    February 12, 2024

    Do you ever try Motor Control SDK (MCSDK) on ST.
    Is it work fine?

    Associate III
    February 12, 2024

    Yes I am using Workbench 6.2. Motorpilot 6.2 does not seem to be useful for a motor with Hall effect device feedback. 

    cedric H
    Technical Moderator
    February 13, 2024

    Hello @RoyStevens ,

    The modification you did is correct. Changing PID_SPEED_KP_DEFAULT is what you have to do. But be careful, this is only the numerator part of the KP, there is also the divider stored int #define SP_KPDIV .

    If the divider is huge, then your modification is perhaps too small to make any difference. 

    Could you elaborate a bit more about "Motorpilot 6.2 does not seem to be useful for a motor with Hall effect device feedback. " what is the issue you are facing ?

    Regards

    Cedric

    Associate III
    February 14, 2024

    Thanks for the reply, Cedric.

    I will revisit Motor Pilot later and give you a careful description of the difficulties I had. 

    With regard to Changing the Kp the following is the process I have followed.

    I am using 6 step. control.

    I am running a PMSM motor on 20 V and have added a 1.0 Ohm resistor in each of the phases so that i can do experiments without accidental excessive current demand. Phase to phase resistance is about 2.8 Ohm.

    I am using a Nucleo-G431RB and a X-Nucleo-IHM08M1.

    I monitor the current by measuring the voltage across the 1.0 Ohm resistor with an oscilloscope. I have physically locked the rotor. 

    in main.c  I use the instruction MC_ProgramSpeedRampMotor1(30/6,0) which is run for  1 second .

     

    In workbench in drive settings, I set  Kp = 32766/8. I set Ki to 0 and Kd =0

    After going through the process of cube Mx and cubeIDE I run the motor and measure the current which is about 8.0 Amp peak.

    The second test I do is back to workbench  and set Kp = 32766/512  recompile and measure the current which is about 3.0A peak.

    Now when I change from        #define SP_KPDIV  512     back to       #define SP_KPDIV 8 in the drive_parameters.h file  and recompile the code there is no change in current. The current peak remains at 3.0 Amp.

    I also tried doing a clean build but there is no difference. 

    What am I doing wrong? 

    Regards

    Roy

     

     

     

    Associate III
    February 14, 2024

    Ok after writing that and going back to the code I see that for changing the denominator  KPDIV I need to change

    SP_KPDIV_LOG(()) also and now it all works. It now makes sense to me.

    I expect that in the future I may wish to change Kp and KpDiv in the future on the fly in the main.c while loop, for high torque low speed situations.

    I have struggled trying to do   this for hours. Please give me some advice on this.

    Thanks

    Regards

    Roy 

    ADAVE.1
    ADAVE.1Best answer
    ST Employee
    February 15, 2024

    Hi @RoyStevens ,

    to change the Kp on the fly, you have to update the parameters hKpDivisor and hKpDivisorPOW2 in the structure PIDSpeedHandle_M1.

    For instance, to write 1024 (hKpDivisor=1024 and hKpDivisorPOW2=10)

    However, you can easily do that with the Motor Pilot clicking on "advanced parameters" button

    Alessio

    Associate III
    February 17, 2024

    Thank you @ADAVE.1 

    It works

     

    Regards

     

    Roy