五个按键实现正转,停止,反转,停止。说明:编程平台IAR,程序利用STM32CubeMX软件生成,单片机控制芯片STM32F407IGT6。 实现过程:根据电机驱动器,50%的pwm脉冲,电机停止,5

说明:编程平台IAR,程序利用STM32CubeMX软件生成,单片机控制芯片STM32F407IGT6。
实现过程:根据电机驱动器,50%的pwm脉冲,电机停止,50%-100%,正转速度越来越大,50%-0%,反转速度越来越大。此设计是%60是正转,40%是反转,只涉及速度模式,不考虑精确控制问题。

首先设计一个中断函数,因为在定时器中不能用系统滴答的HAL_Delay();否则系统会卡死

void Delay(void)
{
    uint16_t ii;
    for(ii=0;ii<500;ii++)
    {
    }
}

定义四个来变量,用于后面的判断使用,把正转,停止,反转,停止,当作四个事件,用所定义的变量÷4取余,即可

uint16_t i=0,j=0,k=0,q=0;

下面是TIM1的通道1控制第一个电机

if(GPIO_Pin == GPIO_PIN_0)
    {
        if(i % 4 == 0)
        { 
            Delay();/* 消抖,但是不能用HAL_Dealy(),系统滴答遇见定时器会死掉的 */
            if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_0) == 0)
            {
                TIM1->CCR1 = 60;
                HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);
            }    
            __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_0);
            i++;
        }
        else if(i%4 == 1)
        { 
            Delay();/* 消抖,但是不能用HAL_Dealy(),系统滴答遇见定时器会死掉的 */
            if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_0) == 0)
            {
                HAL_TIM_PWM_Stop(&htim1,TIM_CHANNEL_1);
            }    
            __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_0);
            i++;
        }
        else if(i%4 == 2)
        { 
            Delay();/* 消抖,但是不能用HAL_Dealy(),系统滴答遇见定时器会死掉的 */
            if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_0) == 0)
            {
                TIM1->CCR1 = 40;
                HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);
            }    
            __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_0);
            i++;
        }
        else
        { 
            Delay();/* 消抖,但是不能用HAL_Dealy(),系统滴答遇见定时器会死掉的 */
            if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_0) == 0)
            {
                HAL_TIM_PWM_Stop(&htim1,TIM_CHANNEL_1);
            }    
            __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_0);
            i++;
        }
    }

下面是利用TIM1的通道2控制第二个电机

//这个是利用TIM1的通道2,来控制第2个电机
    else if(GPIO_Pin == GPIO_PIN_1)
    {
        if(j % 4 == 0)
        { 
            Delay();/* 消抖,但是不能用HAL_Dealy(),系统滴答遇见定时器会死掉的 */
            if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_1) == 0)
            {
                TIM1->CCR2 = 60;
                HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_2);
            }    
            __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_1);
            j++;
        }
        else if(j % 4 == 1)
        { 
            Delay();/* 消抖,但是不能用HAL_Dealy(),系统滴答遇见定时器会死掉的 */
            if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_1) == 0)
            {
                HAL_TIM_PWM_Stop(&htim1,TIM_CHANNEL_2);
            }    
            __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_1);
            j++;
        }
        else if(j % 4 == 2)
        { 
            Delay();/* 消抖,但是不能用HAL_Dealy(),系统滴答遇见定时器会死掉的 */
            if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_1) == 0)
            {
                TIM1->CCR2 = 40;
                HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_2);
            }    
            __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_1);
            j++;
        }
        else
        { 
            Delay();/* 消抖,但是不能用HAL_Dealy(),系统滴答遇见定时器会死掉的 */
            if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_1) == 0)
            {
                HAL_TIM_PWM_Stop(&htim1,TIM_CHANNEL_2);
            }    
            __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_1);
            j++;
        }
    }

下面是TIM1的通道3控制第三个电机

//这个是利用TIM1的通道3,来控制第3个电机
    else if(GPIO_Pin == GPIO_PIN_2)
    {
        if(k % 4 == 0)
        { 
            Delay();/* 消抖,但是不能用HAL_Dealy(),系统滴答遇见定时器会死掉的 */
            if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_2) == 0)
            {
                TIM1->CCR3 = 60;
                HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_3);
            }    
            __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_2);
            k++;
        }
        else if(k % 4 == 1)
        { 
            Delay();/* 消抖,但是不能用HAL_Dealy(),系统滴答遇见定时器会死掉的 */
            if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_2) == 0)
            {
                HAL_TIM_PWM_Stop(&htim1,TIM_CHANNEL_3);
            }    
            __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_2);
            k++;
        }
        else if(k % 4 == 2)
        { 
            Delay();/* 消抖,但是不能用HAL_Dealy(),系统滴答遇见定时器会死掉的 */
            if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_2) == 0)
            {
                TIM1->CCR3 = 40;
                HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_3);
            }    
            __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_2);
            k++;
        }
        else
        {
            Delay();/* 消抖,但是不能用HAL_Dealy(),系统滴答遇见定时器会死掉的 */
            if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_2) == 0)
            {
                HAL_TIM_PWM_Stop(&htim1,TIM_CHANNEL_3);
            }    
            __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_2);
            k++;
        }
    }

下面是同时利用TIM1的123同时控制三个电机

//这个是利用TIM1的通道1,2,3,来控制3个电机
    else if(GPIO_Pin == GPIO_PIN_3)
    {
        if(q % 4 == 0)
        { 
            Delay();/* 消抖,但是不能用HAL_Dealy(),系统滴答遇见定时器会死掉的 */
            if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_3) == 0)
            {
                TIM1->CCR1 = 60;
                TIM1->CCR2 = 60;
                TIM1->CCR3 = 60;
                HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);
                HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_2);
                HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_3);
            }    
            __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_3);
            q++;
        }
        else if(q % 4 == 1)
        { 
            Delay();/* 消抖,但是不能用HAL_Dealy(),系统滴答遇见定时器会死掉的 */
            if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_3) == 0)
            {
                HAL_TIM_PWM_Stop(&htim1,TIM_CHANNEL_1);
                HAL_TIM_PWM_Stop(&htim1,TIM_CHANNEL_2);
                HAL_TIM_PWM_Stop(&htim1,TIM_CHANNEL_3);
            }    
            __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_3);
            q++;
        }
        else if(q % 4 == 2)
        { 
            Delay();/* 消抖,但是不能用HAL_Dealy(),系统滴答遇见定时器会死掉的 */
            if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_3) == 0)
            {
                TIM1->CCR1 = 40;
                TIM1->CCR2 = 40;
                TIM1->CCR3 = 40;
                HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);
                HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_2);
                HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_3);
            }    
            __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_3);
            q++;
        }
        else
        { 
            Delay();/* 消抖,但是不能用HAL_Dealy(),系统滴答遇见定时器会死掉的 */
            if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_3) == 0)
            {
                HAL_TIM_PWM_Stop(&htim1,TIM_CHANNEL_1);
                HAL_TIM_PWM_Stop(&htim1,TIM_CHANNEL_2);
                HAL_TIM_PWM_Stop(&htim1,TIM_CHANNEL_3);
            }    
            __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_3);
            q++;
        }
    }

停止,不管三个电机怎么运动,按下此键,均停止

else
    {
        HAL_TIM_PWM_Stop(&htim1,TIM_CHANNEL_1);
        HAL_TIM_PWM_Stop(&htim1,TIM_CHANNEL_2);
        HAL_TIM_PWM_Stop(&htim1,TIM_CHANNEL_3);
    }

所有操作均在中断回调函数里面,一上四个if判断全部在回调函数中,

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
}

你可能感兴趣的:(stm32,hal,电机控制)