m0_66498354 2022-09-23 22:08 采纳率: 63.6%
浏览 53

stm32驱动步进电机的玄学

使用stm32f103野火指南者开发板驱动一个两相闭环步进电机的问题,单片机连接步进电机驱动器,共阳极连接。程序正常,但是上电后步进电机不是每次都能正常运转,经常无反应,但是没有修改程序也没有修改线路,偶尔电机又可以受控制的运转。经测试:当电机能正常控制时,关掉开发板电源,在打开开发板电源,电机受控;但是关掉驱动器的电源,再启动,电机不受控制。而且下一次电机能否受控制是随机的,经常都是单片机发出脉冲后无反应,太玄学了,有知道的朋友可以解答吗

用代码块功能插入
void USUALL_TIM_GPIO_Config(void) 
{
     GPIO_InitTypeDef GPIO_InitStructure;
  // 输出比较通道1-4初始化
    RCC_APB2PeriphClockCmd( 
                                                    USUALL_TIM_CH2_GPIO_CLK |
                                                    USUALL_TIM_CH3_GPIO_CLK |
                                                    USUALL_TIM_CH4_GPIO_CLK, ENABLE);
  GPIO_InitStructure.GPIO_Pin =     //通道1-4
                                                                 USUALL_TIM_CH2_PIN |
                                                                 USUALL_TIM_CH3_PIN |
                                                                 USUALL_TIM_CH4_PIN;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
    
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    GPIO_SetBits(GPIOA,GPIO_Pin_5);
}
void USUALL_TIM_Mode_Config(uint16_t CCR1_Val,uint16_t CCR2_Val,uint16_t CCR3_Val,uint16_t CCR4_Val)
{
    // 开启定时器时钟,即内部时钟CK_INT=72M
    USUALL_TIM_APBxClock_FUN(USUALL_TIM_CLK,ENABLE);
    /*--------------------时基结构体初始化-------------------------*/
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

    // 自动重装载寄存器的值,累计TIM_Period+1个频率后产生一个更新或者中断
    TIM_TimeBaseStructure.TIM_Period=USUALL_TIM_PERIOD;    //100
    // 驱动CNT计数器的时钟 = Fck_int/(psc+1)
    TIM_TimeBaseStructure.TIM_Prescaler= USUALL_TIM_PSC;    //19
    // 时钟分频因子 ,配置死区时间时需要用到
//    TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;        
    // 计数器计数模式,设置为向上计数
    TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;        
    // 重复计数器的值,没用到不用管
    TIM_TimeBaseStructure.TIM_RepetitionCounter=0;    
    // 初始化定时器
    TIM_TimeBaseInit(USUALL_TIM, &TIM_TimeBaseStructure);
    
     
    /*--------------------输出比较结构体初始化-------------------*/    
// 占空比配置
        
    TIM_OCInitTypeDef  TIM_OCInitStructure;
    // 配置为PWM模式1
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
    // 输出使能
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    // 互补输出不使能
    TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable; 
    // 输出通道电平极性配置
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
        
        
// 设置通道1占空比大小        
    TIM_OCInitStructure.TIM_Pulse = CCR1_Val;    
    TIM_OC1Init(USUALL_TIM, &TIM_OCInitStructure);
    TIM_OC1PreloadConfig(USUALL_TIM, TIM_OCPreload_Enable);

    // 设置通道2占空比大小        
    TIM_OCInitStructure.TIM_Pulse = CCR2_Val;    
    TIM_OC2Init(USUALL_TIM, &TIM_OCInitStructure);
    TIM_OC2PreloadConfig(USUALL_TIM, TIM_OCPreload_Enable);
    
    // 设置通道3占空比大小        
    TIM_OCInitStructure.TIM_Pulse = CCR3_Val;    
    TIM_OC3Init(USUALL_TIM, &TIM_OCInitStructure);
    TIM_OC3PreloadConfig(USUALL_TIM, TIM_OCPreload_Enable);
    
    // 设置通道4占空比大小        
    TIM_OCInitStructure.TIM_Pulse = CCR4_Val;    
    TIM_OC4Init(USUALL_TIM, &TIM_OCInitStructure);
    TIM_OC4PreloadConfig(USUALL_TIM, TIM_OCPreload_Enable);
    TIM_ITConfig(USUALL_TIM,TIM_IT_Update,ENABLE);
    // 使能计数器
    TIM_Cmd(USUALL_TIM, ENABLE);    
//    TIM_CtrlPWMOutputs();启动或暂停输出PWM,
    
}
static void USUALL_TIM_NVIC_Config(void)
{
    NVIC_InitTypeDef NVIC_InitStructure; 
    // 设置中断组为0
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);        
        // 设置中断来源
    NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn ;    
        // 设置主优先级为 0
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;     
      // 设置抢占优先级为3
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;    
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
}

void TIM5_IRQHandler (void)
{
if ( TIM_GetITStatus( USUALL_TIM, TIM_IT_Update) != RESET ) 
    {
        count_pwm++;
        
        TIM_ClearITPendingBit(USUALL_TIM , TIM_FLAG_Update);
    }
}
void BUJIN_MOTer(void)
{
    count_pwm=0;
    USUALL_TIM_GPIO_Config();
    USUALL_TIM_Mode_Config(50,50,50,50);
    USUALL_TIM_NVIC_Config();

}

extern uint16_t count_pwm;
    
int main(void)
{
    LED_config();
    USART_Config();
    key_config();
    
    while ( 1 )
    {

        if (1)    //按键调速
        {
                if(key_san(key2_port,key2_pin)==key_on)
                    {
                        LED_RED;
                        BUJIN_MOTer();        
                        GPIO_SetBits(GPIOA,GPIO_Pin_5);
                    }
                    if ( (count_pwm==6400) &(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_5)))
                        {
                            count_pwm=0;
                            TIM_Cmd(USUALL_TIM, DISABLE); 
                        
                            LED_WHITE;
                        }
                        if ( (count_pwm==3200 )&(~GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_5)))
                        {
                            count_pwm=0;
                            TIM_Cmd(USUALL_TIM, DISABLE); 
                            
                            LED_WHITE;
                        }
                if(key_san(key1_port,key1_pin)==key_on)
                {
                    LED_BLUE;
                    BUJIN_MOTer();
                    GPIO_ResetBits(GPIOA,GPIO_Pin_5);
                }
        }
    }
}
```代码,请勿粘贴截图 

连接图如下:
![img](https://img-mid.csdnimg.cn/release/static/image/mid/ask/295969149366123.JPG "#left")
  • 写回答

3条回答 默认 最新

  • 梧桐树✯ 2022-09-24 11:21
    关注

    1.关闭开发板电源,再打开开发板电源,这个时候程序已经重新开始跑了。
    2.关闭驱动器电源,这个时候开发板还有电,如果程序不能够很好的处理电机掉线问题,估计程序就跑飞出bug了。
    3.建议看一下闭环控制是不是有问题,包括电机数据采集等涉及电机控制部分的变量和数据。

    评论

报告相同问题?

问题事件

  • 创建了问题 9月23日

悬赏问题

  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog