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

[Infineon] 18. Aurix (TC23x)를 이용한 무선 통신 자동차 구현 (초기버전)

by 방구석 임베디드 2021. 6. 19.
반응형

이제 모든 준비가 되었습니다.

먼저 오늘 무선으로 동작시킨 자동차 동영상을 올립니다.

그러면 전체적으로 자동차가 어떻게 구성이 되어 있는지를 살펴 보도록 하겠습니다.

아래 사진의 모터를 모터 드라이브와 연결시키고, 2개의 모터드라이브를 연결하였습니다.

전체적인 라인 구성은 아래와 같습니다. 우선 뒷바퀴 2개에 대한 라인은 아래와 같습니다.

앞바퀴도 동일한 구성입니다. 따라서 앞바퀴 구성은 생략하겠습니다.

자동차 모습은 아래와 같습니다. (우선 돌아가도록만 만들었습니다.)

기본적은 코드는 아래와 같습니다.

void Unit_WirelessControl(void)
{
    uint8_t ucWirelessCmd = 0u;
    
    ucWirelessCmd = (uint8_t)gu32nuAscRxData;
    
    if(ucWirelessCmd == 'w')    /*Forward*/
    {
        Unit_MotorFrontDirectionCtl(MOTOR_FWD);
        Unit_MotorRearDirectionCtl(MOTOR_FWD);
    }
    else if(ucWirelessCmd == 'd') /*TurnRight*/
    {
        Unit_MotorFrontDirectionCtl(MOTOR_TURN_RIGHT);    
        Unit_MotorRearDirectionCtl(MOTOR_TURN_RIGHT);
    }
    else if(ucWirelessCmd == 'a') /*TurnLeft*/
    {
        Unit_MotorFrontDirectionCtl(MOTOR_TURN_LEFT);    
        Unit_MotorRearDirectionCtl(MOTOR_TURN_LEFT);
    }
    else if(ucWirelessCmd == 'x') /*Reverse*/
    {
        Unit_MotorFrontDirectionCtl(MOTOR_REVERSE);    
        Unit_MotorRearDirectionCtl(MOTOR_REVERSE);
    }    
    else if(ucWirelessCmd == 's') /*Stop*/
    {
        Unit_MotorFrontDirectionCtl(MOTOR_STOP);    
        Unit_MotorRearDirectionCtl(MOTOR_STOP);
    }
    else
    {
        /*No Code*/
    }  
}

우선 간단하게 무선으로 위의 키보드 정보를 받으면 전진/후진/우회전/좌회전/정지 를 수행하도록 설정하였습니다.

void Unit_MotorFrontDirectionCtl(MOTOR_CMD_TYPE param_DirectionType)
{
    switch(param_DirectionType)
    {
        case MOTOR_STOP: /*Stop*/
        {
            MidDio_SetFrontIn1(0u);
            MidDio_SetFrontIn2(0u);
            MidDio_SetFrontIn3(0u);
            MidDio_SetFrontIn4(0u);    
            break;
        }
        case MOTOR_FWD: /*Forward*/
        {
            MidDio_SetFrontIn1(1u);
            MidDio_SetFrontIn2(0u);
            MidDio_SetFrontIn3(1u);
            MidDio_SetFrontIn4(0u);            
            break;           
        }
        case MOTOR_TURN_RIGHT: /*TurnRight*/
        {
            MidDio_SetFrontIn1(1u);
            MidDio_SetFrontIn2(0u);
            MidDio_SetFrontIn3(0u);
            MidDio_SetFrontIn4(1u);    
            break;            
        }
        case MOTOR_TURN_LEFT: /*TurnLeft*/
        {
            MidDio_SetFrontIn1(0u);
            MidDio_SetFrontIn2(1u);
            MidDio_SetFrontIn3(1u);
            MidDio_SetFrontIn4(0u);            
            break;            
        }
        case MOTOR_REVERSE: /*Reverse*/
        {
            MidDio_SetFrontIn1(0u);
            MidDio_SetFrontIn2(1u);
            MidDio_SetFrontIn3(0u);
            MidDio_SetFrontIn4(1u);            
            break;            
        }
        default:
        break;
    }
}

그리고 MidDio_Set 함수는 아래와 같이 설계가 되었습니다.

void MidDio_SetFrontIn1(uint8_t param_SetIn1)
{
    if(param_SetIn1 == 0u)
    {
        DrvDio_SetPinLow(IfxPort_P33_5);
    }
    else
    {
        DrvDio_SetPinHigh(IfxPort_P33_5);
    }
}

void MidDio_SetFrontIn2(uint8_t param_SetIn2)
{
    if(param_SetIn2 == 0u)
    {
        DrvDio_SetPinLow(IfxPort_P33_3);
    }
    else
    {
        DrvDio_SetPinHigh(IfxPort_P33_3);
    }
}

void MidDio_SetFrontIn3(uint8_t param_SetIn3)
{
    if(param_SetIn3 == 0u)
    {
        DrvDio_SetPinLow(IfxPort_P33_1);
    }
    else
    {
        DrvDio_SetPinHigh(IfxPort_P33_1);
    }
}

void MidDio_SetFrontIn4(uint8_t param_SetIn4)
{
    if(param_SetIn4 == 0u)
    {
        DrvDio_SetPinLow(IfxPort_P33_4);
    }
    else
    {
        DrvDio_SetPinHigh(IfxPort_P33_4);
    }
}

현재 PWM은 Duty : 50%, Period : 10ms (100Hz) 로 나가고 있는 상태입니다.

 

이제 동작하는것은 확인을 했으니!

이제 각각의 모터를 PID Control을 수행하여 정확하게 제어를 해보도록 하겠습니다.

 

 

반응형

댓글