2401_85308619 2024-10-11 20:00 采纳率: 44.4%
浏览 0
已结题

STM32按键控制电机

STM32按键控制不了电机
主函数:

#include "stm32f10x.h"
#include "exti.h"
#include "pwm.h"
#include "Motor.h"

uint8_t mode = 0;

int main(void)
{
    uint8_t a = 0;

    delay_init();                                    //延时函数初始化
    TIME_Init();       //初始化定时器
    PWM_Init();
    motor_configuration();
    EXTI_KEY_Init();

    while (1)
    {
        if (mode == 1)
        {
            for (int i = 0 ; i <= 10; i++ )
            {
                motor_Reverse(100);
            }
            Servo_SetAngle1(0);
        }
    }
}
// EXTI0 中断服务函数
void EXTI0_IRQHandler(void)
{
    if (EXTI_GetITStatus(EXTI_Line0))
    { // 按键按下

        mode++;
        if (mode > 1)
        {
            mode = 0;
        }

        EXTI_ClearITPendingBit(EXTI_Line0);
    }
}


exti.c

#include "exti.h"

// 将 GPIO A0 A1 配置为外部中断
// 按键按下时,触发外部中断
// 外部中断触发条件为 上升沿中断
void EXTI_KEY_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    EXTI_InitTypeDef EXTI_InitStructure; 
    NVIC_InitTypeDef NVIC_InitStructure;

    RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //选择对应的引脚
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
    GPIO_Init(GPIOA, &GPIO_InitStructure);  


    EXTI_InitStructure.EXTI_Line    = EXTI_Line0;
      EXTI_InitStructure.EXTI_Mode    = EXTI_Mode_Interrupt;    
      EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
      EXTI_InitStructure.EXTI_LineCmd = ENABLE;
      EXTI_Init(&EXTI_InitStructure);

    NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;        
      NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;    
      NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;        
      NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;            
      NVIC_Init(&NVIC_InitStructure);
}


Motor.c

#include "stm32f10x.h"
#include "delay.h"
#include "Motor.h"
#include <stm32f10x_conf.h>


void motor_configuration(void)//PB12,PB13,PB14,PB15    
{
    GPIO_InitTypeDef GPIO_InitStruct;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);

    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB,&GPIO_InitStruct);
    GPIO_ResetBits(GPIOB, GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);
}
// 正转
void motor_Forward(int n)
{
    IN1_H;
    delay_ms(n);
    IN4_L;
    delay_ms(n);
    IN2_H;
    delay_ms(n);
    IN1_L;
    delay_ms(n);
    IN3_H;
    delay_ms(n);
    IN2_L;
    delay_ms(n);
    IN4_H;
    delay_ms(n);
    IN3_L;
    delay_ms(n);
}
// 倒转
void motor_Reverse(int n)
{
    IN3_L;
    delay_ms(n);
    IN4_H;
    delay_ms(n);
    IN2_L;
    delay_ms(n);
    IN3_H;
    delay_ms(n);
    IN1_L;
    delay_ms(n);
    IN2_H;
    delay_ms(n);
    IN4_L;
    delay_ms(n);
    IN1_H;
    delay_ms(n);
}

void Motor_Ctrl_Off(void)
{
    GPIO_ResetBits(GPIOB, GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);
}


  • 写回答

1条回答 默认 最新

  • 香格里辣 2024-10-11 20:01
    关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    根据您提供的代码片段,我注意到可能存在一些问题和潜在的改进点。让我们逐一分析并给出解决方案。

    1. 主函数中的循环逻辑不完整:在主函数的while循环中,您使用了变量mode来控制电机的行为,但是循环内的逻辑不完整,只包含了一个简单的电机反转操作。您需要添加更多的逻辑来控制电机的行为,比如前进、后退、停止等。另外,对于不同的模式(例如模式0和模式1),您可能需要执行不同的操作。请根据您的实际需求完善这部分逻辑。
    2. 中断服务函数中的模式重置逻辑可能不正确:在EXTI0_IRQHandler中断服务函数中,当按键按下时,您增加了mode的值,并在超过一定值时将其重置为0。这种逻辑可能导致无法正确地切换到下一个模式或者逻辑混淆。您可以考虑重新设计模式切换的逻辑,确保在不同的按键按下时能够正确地切换到不同的模式。
    3. 电机控制函数缺少PWM控制:从您的代码中看,电机控制函数(如motor_Forwardmotor_Reverse)只是简单地通过GPIO控制电机的动作,而没有使用PWM(脉宽调制)来控制电机的速度或功率。如果您希望通过按键控制电机的速度和方向,您可能需要添加PWM控制的逻辑,并通过调节PWM占空比来控制电机的速度。

    针对上述问题,以下是一些可能的解决方案和改进建议:

    1. 完善主函数的循环逻辑,添加更多的电机控制操作,确保根据按键输入能够执行相应的动作。
    2. 重新设计模式切换的逻辑,确保按键按下时能够正确地切换到不同的模式。您可以考虑使用更清晰的标志位来表示不同的模式,而不是仅仅通过递增变量来判断模式。
    3. 如果需要控制电机的速度或功率,请考虑使用PWM控制。您可以配置定时器生成PWM信号,并通过调节PWM占空比来控制电机的速度或功率。具体实现方式可以参考STM32的PWM库函数和相关文档。

    请注意,以上只是一些可能的解决方案和改进建议,具体的实现方式还需要根据您的硬件和需求进行调整和完善。另外,代码中可能存在其他潜在问题或错误,建议在实际测试过程中进行调试和优化。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 11月14日
  • 已采纳回答 11月6日
  • 创建了问题 10月11日