智能家居电机控制

发布于:2025-02-10 ⋅ 阅读:(26) ⋅ 点赞:(0)

sMotorHandle gs_MotorHandle =
{
    0,
};

void Moto_Init( void )
{
    GPIO_InitTypeDef GPIO_InitStructure;

    RCC_APB2PeriphClockCmd(ULN2003_SYSCTL_PERIPH_CLK, ENABLE);

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_InitStructure.GPIO_Pin = A_PHASE_PIN;
    GPIO_Init(A_PHASE_PORT, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = B_PHASE_PIN;
    GPIO_Init(B_PHASE_PORT, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = C_PHASE_PIN;
    GPIO_Init(C_PHASE_PORT, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = D_PHASE_PIN;
    GPIO_Init(D_PHASE_PORT, &GPIO_InitStructure);

    ULN2003_ResetAllPhase( );

}

/**
  * @name        ULN2003_ResetAllPhase
  * @brief      复位A、B、C、D(相位)
  * @param[in]  void
  * @return      void
  */
void ULN2003_ResetAllPhase ( void )
{
    A_PHASE_RESET;
    B_PHASE_RESET;
    C_PHASE_RESET;
    D_PHASE_RESET;
}

static u8 i = 0;  

/**
  * @name        Motorcw
  * @brief      电机正转
  * @param[in]  void
  * @return      void
  */
void Motorcw( void )  
{  
  
    switch ( i++ )
    {
        case 0: //A
            A_PHASE_SET;B_PHASE_RESET;C_PHASE_RESET;D_PHASE_RESET;
        
            break;
        case 1: //AB
            A_PHASE_SET;B_PHASE_SET;C_PHASE_RESET;D_PHASE_RESET;
            break;
        
        case 2: //
            A_PHASE_RESET;B_PHASE_SET;C_PHASE_RESET;D_PHASE_RESET;
            break;
        case 3: //B
            A_PHASE_RESET;B_PHASE_SET;C_PHASE_SET;D_PHASE_RESET;
            break;
        case 4: //C
            A_PHASE_RESET;B_PHASE_RESET;C_PHASE_SET;D_PHASE_RESET;
            break;
        case 5: //CD
            A_PHASE_RESET;B_PHASE_RESET;C_PHASE_SET;D_PHASE_SET;
            break;
        case 6: //
            A_PHASE_RESET;B_PHASE_RESET;C_PHASE_RESET;D_PHASE_SET;
            break;
        case 7: //D
        i=0;
            A_PHASE_SET;B_PHASE_RESET;C_PHASE_RESET;D_PHASE_SET;
            break;
        default:
            break;
    }
    delay_ms(2);
}


void Motorccw( void )  
{  
    switch ( i-- )
    {
        case 0: //A
            i=7;
            A_PHASE_SET;B_PHASE_RESET;C_PHASE_RESET;D_PHASE_RESET;
            break;
        case 1: //AB
            A_PHASE_SET;B_PHASE_SET;C_PHASE_RESET;D_PHASE_RESET;
            break;
        
        case 2: //
            A_PHASE_RESET;B_PHASE_SET;C_PHASE_RESET;D_PHASE_RESET;
            break;
        case 3: //B
            A_PHASE_RESET;B_PHASE_SET;C_PHASE_SET;D_PHASE_RESET;
            break;
        case 4: //C
            A_PHASE_RESET;B_PHASE_RESET;C_PHASE_SET;D_PHASE_RESET;
            break;
        case 5: //CD
            A_PHASE_RESET;B_PHASE_RESET;C_PHASE_SET;D_PHASE_SET;
            break;
        case 6: //
            A_PHASE_RESET;B_PHASE_RESET;C_PHASE_RESET;D_PHASE_SET;
            break;
        case 7: //D
            A_PHASE_SET;B_PHASE_RESET;C_PHASE_RESET;D_PHASE_SET;
            break;
        default:
            break;
    }
}


void MotorStop( void )  
{  
    ULN2003_ResetAllPhase( );
}

//由于   *一个脉冲*   *输出轴*  转0.08789度(电机实转0.08789*64=5.625度),即步进角为5.625度。则转完A-B-C-D为  *8个脉冲*  ,即0.08789*8=0.70312度。若称A-B-C-D为一个周期,则j为需要的转完angle角度所需的周期数。

void Motor_PreSet(eMotorDutyCycle eM, u32 tim, u32 speed)
{
    gs_MotorHandle.eStatus = eM;
    gs_MotorHandle.u32Time = tim;
    gs_MotorHandle.u32Speed = speed;
}


void Motor_Millisecond( void )
{
    if (gs_MotorHandle.u32Time > 0)
    {
        gs_MotorHandle.u32Time--;
        if (gs_MotorHandle.u32Time == 0)
        {
            gs_MotorHandle.eStatus = Staus_None;
            MotorStop( );
        }
    }
    
    gs_MotorHandle.u32Cnt++;

    if (gs_MotorHandle.u32Cnt % gs_MotorHandle.u32Speed == 0)
    {
        switch (gs_MotorHandle.eStatus)
        {
            case Status_CW:
                Motorcw( );
                break;

            case Status_CCW:
                Motorccw( );
                break;
                
            case Staus_None:
            default:
                break;
        }
    }
    if (gs_MotorHandle.u32Cnt % 1000 == 0)
    {
        gs_MotorHandle.u32Cnt = 0;
    }
}


网站公告

今日签到

点亮在社区的每一天
去签到