본문 바로가기
Embedded SW/[Infineon] Embedded SW Project

[Infineon] 23. Aurix (TC23x) DC모터 Feedback Control (PID)

by 방구석 임베디드 2021. 7. 3.
반응형

드디어 이제 Feedback Control을 해볼수 있는 환경이 되었다!

큰 그림은 아래와 같다.

내가 원하는 RPM을 입력으로 넣을 것이고

Controller에서는 PWM Duty값을 만들어 줄것이다.

그리고 이 Controller는 내가 원하는 RPM과 Encoder로부터 측정된 RPM을 0으로 만들어 줄것이다.

 

대표적인 Feedback Controller로 PID Controller가 있다.

추후 PID Controller에 대해서 더 이야기 해보도록 하겠다.

 

아래 코드는 Controller를 구현한 부분이다.

void MotorFeedbackController(void)
{            
    static int32_t lProportionalControlInput = 0;
    static int32_t lIntegralControlInput = 0;
    static int32_t lIntegralControlOld = 0;
    static uint32_t ulSamplingFrequency = 10u; /*100ms*/

    int32_t g_nError = 0;
    int32_t g_nControlInput = 0;

    fSenseMotorRpm = ((float32_t)ulPulseCnt*60.0f*10.0f)/(8.0f*120.0f);
    ulPulseCnt = 0u;

    /*PID Contorller*/
    g_nError =((int32_t)ulRpmRef- (int32_t)fSenseMotorRpm); 		    
    lProportionalControlInput = (int32_t)ulPGain*g_nError/10;	// Not to express the gain as float -> g_nPGain/10						

    lIntegralControlInput = lIntegralControlOld + ((int32_t)ulIGain*g_nError/(int32_t)ulSamplingFrequency/10);	
    g_nControlInput = (lProportionalControlInput + lIntegralControlInput);  //PID control input	 
    lIntegralControlOld = lIntegralControlInput;								

    if(lIntegralControlOld > 80u) 
    {
        lIntegralControlOld = 80u; //Limit accumulated value by I gain
    }     

    if(g_nControlInput >= 80u)
    {
        g_nControlInput =80u;  //Limit control input (0<=contorl input<100)  
    }    
    else if(g_nControlInput <= 0u)
    {
        g_nControlInput = 0u;    
    }
    else
    {
        /*No Code*/
    }

    /*Gtm PWM Test*/
    fPwmDuty = (float32_t)g_nControlInput/100.0f;
    DrvGtmPwmTest(fPwmDuty,fPwmDuty,fPwmDuty,fPwmDuty);  	    	  
}

우선 나중에 더 자세히 분석해서 설명해야 겠다.

오늘 너무 피곤...

 

우선 결과만 보면 내가 원하는 RPM으로 Controller이 되고 있는것을 볼수 있다.

나중에 더 좋은 엔코더가 달린 모터를 구매하자!

이제 속도 제어가 된다!

 

그 다음은 무엇일까?

자신의 위치를 분명히 아는 것이 필요할것 같다.

그러려면 어떻게 해야할까?

반응형

댓글