打印

stm32来按键控制步进电机,发现电机一得电就一直转

[复制链接]
98|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
我使用stm32来按键控制步进电机,本意是想按一次键,电机就整步n次,但是一按键,这个角度就一直转,变化幅度挺慢的,观察角度变化,有种在零点几反复跳的感觉,但是整体是增加的。
以下是主函数和步进电机的封装函数
###NextPage[title=主函数]###
u8 KeyNum;
int main()
{
        KEY_Init();
        KEY_GetNum();
        Motor_Init();
       
        while(1)
        {
                KeyNum = KEY_GetNum();
                if(KEY_GetNum()==8)
                {
                        Motor_RotateByStep(Foreward ,1000,5);
                        Motor_Stop ();
                }
        }



###NextPage[title=步进电机]###
uint8_t STEP;        // 用于存储电机正在走过的整步编号
void Motor_Init(void)
{
        // 选择PB7,PB6,PB5,PB4分别为相A,B,C,D的输出
       
        GPIO_InitTypeDef GPIO_InitStruct;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
       
        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_InitStruct.GPIO_Pin = Motor_A1|Motor_B1|Motor_C1|Motor_D1;
        GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB,&GPIO_InitStruct);
       
        GPIO_ResetBits(GPIOB,Motor_A1|Motor_B1|Motor_C1|Motor_D1);
}

void Motor_SingleStep(uint8_t StepNum, uint16_t Delay_Time_xms)
{
        switch(StepNum)
        {
                case 0:                // A
                        GPIO_WriteBit(GPIOB, Motor_A1, Bit_SET);
                        GPIO_WriteBit(GPIOB, Motor_B1 | Motor_C1 | Motor_D1, Bit_RESET);
               
                break;
                case 1:                // B
                        GPIO_WriteBit(GPIOB, Motor_B1, Bit_SET);       
                        GPIO_WriteBit(GPIOB, Motor_A1 | Motor_C1 | Motor_D1, Bit_RESET);
                break;                       
                case 2:                // C
                        GPIO_WriteBit(GPIOB, Motor_C1, Bit_SET);       
                        GPIO_WriteBit(GPIOB, Motor_A1 | Motor_B1 | Motor_D1, Bit_RESET);
                break;
                case 3:                // D
                        GPIO_WriteBit(GPIOB, Motor_D1, Bit_SET);
                        GPIO_WriteBit(GPIOB, Motor_A1 | Motor_B1 | Motor_C1, Bit_RESET);
                break;
                default: break;
        }
        delay_ms(Delay_Time_xms);        // 延时,控制电机速度
        //Motor_Stop();                                // 断电,防止电机过热
}


void Motor_RotateByStep(RotDirection direction, uint32_t step, uint16_t Delay_Time_xms)
{

        for (uint32_t i = 0; i < step; i ++)
        {
                if (direction == Foreward)        // 电机正传
                {
                        STEP ++;
                        if (STEP > 3)
                        {
                                STEP = 0;
                        }
                }
                else if (direction == Reversal)        // 电机反转
                {
                        if (STEP < 1)
                        {
                                STEP = 4;
                        }
                        STEP --;
                }
                Motor_SingleStep(STEP, Delay_Time_xms);
                led(1);
        }
       
}
###NextPage[title=仿真原理图]###

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

6

帖子

0

粉丝