做stm32f103VE+THB7128控制步进电机运动,我写了个程序,但是步进电机完全不动

2019-10-16 03:47发布

求大神帮忙看看为什么电机动不起来呢?



#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_usart.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_flash.h"
#include "stm32f10x_systick.h"


#define XCP  GPIO_Pin_1           //PA1
#define XDIR GPIO_Pin_6           //PE6
#define XEN  GPIO_Pin_7           //PE7
#define XCPH()        GPIO_ResetBits(GPIOA,XCP)
#define XCPL()        GPIO_SetBits(GPIOA,XCP)
#define XDIRFORWARD() GPIO_ResetBits(GPIOE,XDIR)
#define XDIRBACK()    GPIO_SetBits(GPIOE,XDIR)
#define XENENABLE()   GPIO_ResetBits(GPIOE,XEN)
#define XENDISABLE()  GPIO_SetBits(GPIOE,XEN)
#define ledon() GPIO_ResetBits(GPIOA,GPIO_Pin_7)
#define ledoff() GPIO_SetBits(GPIOA,GPIO_Pin_7)




u16 steps=0;

//u32 max;

void RCC_Configuration(void);
void GPIO_Configuration(void);
void USART1_Configuration(void);
void Lock(void);
void UnLock(void);
//void MOVE(void);
void delay_nms(u16 i);
void SysTick_Configuration(void);



GPIO_InitTypeDef GPIO_InitStructure;



/****主函数*****/
int main(void)
{
  RCC_Configuration();
  GPIO_Configuration();
  USART1_Configuration();

//  Lock();
//  delay_nus(5);
//  UnLock();
//  delay_nus(5);
        XENENABLE();
        XDIRBACK();
        while(1)
//  if(steps<=60000)
        {
//        XENENABLE();
        ledon();
                delay_nms(10);
        ledoff();
                delay_nms(10);
        XCPH();
        delay_nms(5);
        XCPL();
        delay_nms(5);
//        steps++;
       
        }               
//        else
//        {XCPH();}
       
       
//  MOVE();
////  delay();
//while(i<5000)
//{i++;}
//  Lock();
       
//                ledon();

  }


void Lock(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;                                                      
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                                                //输出模式为推挽输出
          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;                                                //IO口最大输出速率
          GPIO_Init(GPIOE, &GPIO_InitStructure);                                                                      //完成初始化
//        GPIO_SetBits(GPIOE,XCP);
//        GPIO_SetBits(GPIOE,YCP);
//        GPIO_SetBits(GPIOA,XCP);
        GPIO_SetBits(GPIOE,XEN);
}  




void UnLock(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;                                                      
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                                                  // 复用推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;                                                //IO口最大输出速率
  GPIO_Init(GPIOE, &GPIO_InitStructure);        //完成初始化
//        GPIO_ResetBits(GPIOA,XCP);
        GPIO_ResetBits(GPIOE,XEN);
}


void RCC_Configuration()                                    //配置STM32的时钟 & 打开IO口时钟
{
   ErrorStatus HSEStartUpStatus;                            //定义外部高速晶体启动状态枚举变量
   RCC_DeInit();                                            //复位RCC外部设备寄存器到默认值
   RCC_HSEConfig(RCC_HSE_ON);                               //打开外部高速晶振
   HSEStartUpStatus=RCC_WaitForHSEStartUp();                //等待外部高速时钟准备好
   if(HSEStartUpStatus==SUCCESS)                            //外部高速时钟已经准备好
   {
   FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);    //选择FLASH预取指缓存的模,预取指缓存使能
   FLASH_SetLatency(FLASH_Latency_2);                       //设置FLASH存储器延时时钟周期数  FLASH_Latency_2  2延时周期
   RCC_HCLKConfig(RCC_SYSCLK_Div1);                         //配置AHB(HCLK)时钟=SYSCLK
   RCC_PCLK2Config(RCC_HCLK_Div1);                          //配置APB2(PCLK2)时钟=AHB时钟
   RCC_PCLK1Config(RCC_HCLK_Div2);                          //配置APB1(PCLK1)时钟=AHB 1/2时钟
   RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);      //配置PLL时钟=外部高速晶体时钟*9
   RCC_PLLCmd(ENABLE);                                      //使能PLL时钟
   while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET)         //等待PLL时钟就绪
   {}
   RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);               //配置系统时钟=PLL时钟
   while(RCC_GetSYSCLKSource()!=0x08)                       //检查PLL时钟是否作为系统时钟
   {}
   }
}


void GPIO_Configuration()
{
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOE,ENABLE);                    //打开电机控制的所有时钟,PA、PE
       
       
          
          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;                                                 //所有电机方向与使能端         
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                                                  //推挽输出
          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;                                                //IO口最大输出速率
          GPIO_Init(GPIOE, &GPIO_InitStructure);                                                                    //完成初始化

          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;       
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                                                                                    //所有电机频率,PWM输出
//        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//为了测试电机,测试设置                                                                           
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
       
          
          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;       
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                                                                                    //所有电机频率,PWM输出
//        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//为了测试电机,测试设置                                                                           
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
          

//          CLRCCR();                                                          //2016.02.23
//        GPIO_SetBits(GPIOE,YEN);                                                            //关闭所有电机
//        GPIO_SetBits(GPIOE,XEN);
       
        }
       
       

void USART1_Configuration(void)
{
          USART_InitTypeDef USART_InitStructure;

          RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
          /*
          *  USART1_TX -> PA9 , USART1_RX ->        PA10
          */
//    GPIO_InitTypeDef GPIO_InitStructure;       
          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;                
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  
          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
          GPIO_Init(GPIOA, &GPIO_InitStructure);                  

          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;                
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;  
          GPIO_Init(GPIOA, &GPIO_InitStructure);

          USART_InitStructure.USART_BaudRate = 9600;
          USART_InitStructure.USART_WordLength = USART_WordLength_8b;
          USART_InitStructure.USART_StopBits = USART_StopBits_1;
          USART_InitStructure.USART_Parity = USART_Parity_No;
          USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
          USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

          USART_Init(USART1, &USART_InitStructure);
          USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
          //USART_ITConfig(USART1, USART_IT_TXE, ENABLE);
          USART_Cmd(USART1, ENABLE);
}


///*****延时函数*******/
//void delay(u16 i)//延时函数
//{
//        u16 j,k;
//        for(j=0;j<i;j++)
//        for(k=0;k<5;k++);
//       
//}


void SysTick_Configuration(void)
{
        SysTick_CounterCmd(SysTick_Counter_Disable);
        SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
        SysTick_CounterCmd(SysTick_Counter_Clear);
       
       
        SysTick_SetReload(9000);
}



void delay_nms(u16 i)
{
        SysTick_CounterCmd(SysTick_Counter_Enable);
        while(SysTick_GetFlagStatus(SysTick_FLAG_COUNT)==0);
        SysTick_CounterCmd(SysTick_Counter_Disable);
        SysTick_CounterCmd(SysTick_Counter_Clear);
}


//void MOVE(u8 n)
//{
//  steps = 0;
//  max = steps;
//  GPIO_SetBits(GPIOA,XCP);           //PA1口置1,光耦隔离,接口CLK置0,X轴电机控制程序
//  GPIO_SetBits(GPIOE,XEN);
//        while(steps >=1)
//        {
//        if(steps < 15000)
//        {
//        GPIO_SetBits(GPIOE,XDIR);}

//        else{GPIO_ResetBits(GPIOE,XDIR);;}

//  
//  GPIO_ResetBits(GPIOE,XEN);
//        GPIO_ResetBits(GPIOE,XDIR);
//       
//        while(steps <= 30000)
//        {
//  GPIO_SetBits(GPIOA,XCP);              //PA1置1==》CLK置0,脉冲低电平?
//  delay(50);                      //延时
//  GPIO_ResetBits(GPIOA,XCP);     //脉冲高电平
//  delay(50);                      //延时
//  steps++;                     //步数减1
//   }
//  
//        GPIO_ResetBits(GPIOA,XCP);
// }


//void MOVE(void)
//{   
//   steps=32000;
//   max=steps;
//   GPIO_SetBits(GPIOA,XCP);           //PA1口置1,光耦隔离,接口CLK置0,X轴电机控制程序
//   GPIO_SetBits(GPIOE,XEN);           //PE7口置1,光耦隔离,接口ENABLE置0
//   
//   GPIO_ResetBits(GPIOE,XEN);         //stm32使能端置0,THB7128使能端置1,启动电机?
//   while(steps>=1)                    //
//   {
//           if(steps<3200)                   //判断步数是否小于3200?
//           {GPIO_SetBits(GPIOE,XDIR);}      //PE6置1,控制电机方向为正转(CW=0正转)?
//           else
//           {
//                   if(steps==3200){delay(60000);};         //判断steps是否等于3200,若等于则启动延时程序
//                   GPIO_ResetBits(GPIOE,XDIR);             //stm32 PE6口置0==》XDIR置1,控制电机反转
//           }
//                          GPIO_SetBits(GPIOA,XCP);              //PA1置1==》CLK置0,脉冲低电平?
//                         delay(50);                      //延时
//                         GPIO_ResetBits(GPIOA,XCP);     //脉冲高电平
//                         delay(50);                      //延时
//                     steps--;                     //步数减1
//   }
//   GPIO_SetBits(GPIOE,XEN);  //停止
//}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
黑眼圈红了
1楼-- · 2019-10-16 06:31
正点原子 发表于 2016-8-17 20:59
监控下你的输出时序是否正常吧。

这个问题已经解决了,之前是stm32的IO口输出模式设置不对,改了之后就可以了。现在我遇到了另外的问题,用stc15单片机控制LV8729V驱动步进电机,做加减速的时候电机进不了加减速的程序,之前的时候是可以加减速,但是现在不知道为什么不行了。好烦啊
正点原子
2楼-- · 2019-10-16 07:15
 精彩回答 2  元偷偷看……
正点原子
3楼-- · 2019-10-16 09:08
黑眼圈红了 发表于 2016-12-7 13:41
这个问题已经解决了,之前是stm32的IO口输出模式设置不对,改了之后就可以了。现在我遇到了另外的问题 ...

加速太快了吧,降低速度试试

一周热门 更多>