打印

又来麻烦大家了,求大神看看这个步进电机代码有啥问题。

[复制链接]
3680|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jiangsai|  楼主 | 2013-5-3 09:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
编译没问题,按下key5后,在按左转或后转,电机运行后不停止。。。不知道是什么问题,求赐教。。万恶的代码。。/* Includes ------------------------------------------------------------------*/#include "stm32f10x.h"
#include "stm32_eval.h"
#include <stdio.h>
//#include "ARMJISHU_TouchScreen_ADS7843.h"
#include "sys.h"               
       
void USART_Configuration(void);
void RCC_Configuration(void);
void GPIO_Configuration(void);
void Delay(vu32 nCount);
void Delay1(vu32 nCount);
//static u8 M=0;

/* Values magic to the Board keys */
#define  NOKEY  0
#define  KEY1   1
#define  KEY2   2
#define  KEY3   3
#define  KEY4   4
#define  KEY5   5            
#define  KEY6   6            

/*按键相关定义*/
#define RCC_KEY1                                    RCC_APB2Periph_GPIOB
#define GPIO_KEY1_PORT                              GPIOB   
#define GPIO_KEY1                                   GPIO_Pin_0
#define RCC_KEY2                                    RCC_APB2Periph_GPIOB
#define GPIO_KEY2_PORT                              GPIOB
#define GPIO_KEY2                                   GPIO_Pin_1
#define RCC_KEY3                                    RCC_APB2Periph_GPIOB
#define GPIO_KEY3_PORT                              GPIOB
#define GPIO_KEY3                                   GPIO_Pin_2
#define RCC_KEY4                                    RCC_APB2Periph_GPIOB
#define GPIO_KEY4_PORT                              GPIOB
#define GPIO_KEY4                                   GPIO_Pin_8
#define RCC_KEY5                                    RCC_APB2Periph_GPIOB
#define GPIO_KEY5_PORT                              GPIOB
#define GPIO_KEY5                                   GPIO_Pin_7
//#define RCC_KEY6                                    RCC_APB2Periph_GPIOB
//#define GPIO_KEY6_PORT                              GPIOB
//#define GPIO_KEY6                                   GPIO_Pin_7                  

/* Private function prototypes -----------------------------------------------*/
#ifdef __GNUC__
/* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
                                             set to 'Yes') calls __io_putchar() */
  #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
  #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */

/*static void Delay_ARMJISHU(__IO uint32_t nCount)
{
  for (; nCount != 0; nCount--)
  {
      if(GPIO_ADS7843_INT_VALID)
      {
        ARMJISHU_TouchScreen_ADS7843();
      }       
  }
}                                                   */

void delay(void)
  {
      unsigned long ik ;
      for(ik=0;ik<0x05af8;ik++) ;
  }
void delay1(void)
  {
      unsigned long ik ;
      for(ik=0;ik<0x00af8;ik++) ;
  }

/* Private functions ---------------------------------------------------------*/

/*******************************************************************************
* Function Name  : GPIO_KEY_Config.
* Description    : Configures the Extension Button.
* Input          : None.
* Output         : None.
* Return         : None.
*******************************************************************************/
void GPIO_KEY_Config(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
   GPIO_AFIODeInit();
  /* Configure KEY1 Button */
  RCC_APB2PeriphClockCmd(RCC_KEY1, ENABLE);

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  GPIO_InitStructure.GPIO_Pin = GPIO_KEY1;
  GPIO_Init(GPIO_KEY1_PORT, &GPIO_InitStructure);
    /* Configure KEY2 Button */
  RCC_APB2PeriphClockCmd(RCC_KEY2, ENABLE);

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  GPIO_InitStructure.GPIO_Pin = GPIO_KEY2;
  GPIO_Init(GPIO_KEY2_PORT, &GPIO_InitStructure);
      /* Configure KEY3 Button */
  RCC_APB2PeriphClockCmd(RCC_KEY3, ENABLE);

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  GPIO_InitStructure.GPIO_Pin = GPIO_KEY3;
  GPIO_Init(GPIO_KEY3_PORT, &GPIO_InitStructure);
        /* Configure KEY4 Button */
  RCC_APB2PeriphClockCmd(RCC_KEY4, ENABLE);

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  GPIO_InitStructure.GPIO_Pin = GPIO_KEY4;
  GPIO_Init(GPIO_KEY4_PORT, &GPIO_InitStructure);
        /* Configure KEY5 Button */
  RCC_APB2PeriphClockCmd(RCC_KEY5, ENABLE);

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  GPIO_InitStructure.GPIO_Pin = GPIO_KEY5;
  GPIO_Init(GPIO_KEY5_PORT, &GPIO_InitStructure);
  /* Configure KEY6 Button */
  /* RCC_APB2PeriphClockCmd(RCC_KEY6, ENABLE);

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  GPIO_InitStructure.GPIO_Pin = GPIO_KEY6;
  GPIO_Init(GPIO_KEY6_PORT, &GPIO_InitStructure);        */
}
/*******************************************************************************
* Function Name  : ReadKey
* Description    : Reads key from demoboard.
* Input          : None
* Output         : None
* Return         : Return RIGHT, LEFT, SEL, UP, DOWN or NOKEY
*******************************************************************************/
u8 ReadKeyDown(void)
{
  /* 1 key is pressed */
  if(!GPIO_ReadInputDataBit(GPIO_KEY1_PORT, GPIO_KEY1))
  {
        delay1();
    return KEY1;
         
  }       
    /* 2 key is pressed */
else if(!GPIO_ReadInputDataBit(GPIO_KEY2_PORT, GPIO_KEY2))
  {       
    delay1();
    return KEY2;
       
  }
   /* 3 key is pressed */
else if(!GPIO_ReadInputDataBit(GPIO_KEY3_PORT, GPIO_KEY3))
  {       
    delay1();
    return KEY3;
         
  }

   /* 4 key is pressed */
else if(!GPIO_ReadInputDataBit(GPIO_KEY4_PORT, GPIO_KEY4))
  {       
    delay1();
    return KEY4;
         
  }                  
    /* 5 key is pressed */
else if(!GPIO_ReadInputDataBit(GPIO_KEY5_PORT, GPIO_KEY5))
  {       
    delay1();
    return KEY5;
         
  }
   /* 6 key is pressed */
/*else if(!GPIO_ReadInputDataBit(GPIO_KEY6_PORT, GPIO_KEY6))
  {
    return KEY6;
  }          */
  /* No key is pressed */
  else
  {       
    delay1();
    return NOKEY;
         
  }
}


/*  void motor_Turn_on_5(void)               
{
//int m=0;
//m=m+2        ;
M=2;

}          */
/*void num2(void)               
{
if(M<=0)
{
M=1  ;
}
  M=M-1;
}          */

int main(void)
{                       
        u8 M=1;
        u8 m=0;
    u8 KeyNum = 0;
        #ifdef DEBUG
        debug();
    #endif       

        USART_Configuration();         //必须放在前面
        RCC_Configuration();
        GPIO_Configuration();
    GPIO_KEY_Config();
//        ADS7843_Init();       

    while (1)
   {          
            KeyNum=ReadKeyDown();
                   /* Turn Off Select LED */

           switch(KeyNum-1)
      {
          case 0:           //正传
                 
                              GPIO_Write(GPIOA, 0x08);
                                                      delay();
                                                      GPIO_Write(GPIOA,0x0C);
                                                      delay();
                                                      GPIO_Write(GPIOA,0x04);
                                                      delay();
                                                      GPIO_Write(GPIOA,0x06);
                                                      delay();       
                                                          GPIO_Write(GPIOA, 0x02);
                                                      delay();
                                                          GPIO_Write(GPIOA, 0x03);
                                                      delay();
                                                          GPIO_Write(GPIOA, 0x01);
                                                      delay();
                                                           GPIO_Write(GPIOA, 0x09);
                                                      delay();

          break;

          case 1:                 //反转

                              GPIO_Write(GPIOA,0x09);
                                                      delay();
                                                          GPIO_Write(GPIOA,0x01);
                                                      delay();
                                                          GPIO_Write(GPIOA,0x03);
                                                      delay();
                                                      GPIO_Write(GPIOA,0x02);
                                                      delay();
                                                          GPIO_Write(GPIOA, 0x06);
                                                      delay();       
                                                          GPIO_Write(GPIOA, 0x04);
                                                      delay();
                                                          GPIO_Write(GPIOA, 0x0C);
                                                      delay();
                                                          GPIO_Write(GPIOA, 0x08);
                                                      delay();       

          break;

        case 2:                                        //反转n圈
{                           
  u8 j;
  u8 r;
  u8 N=16;
//  extern u8 M;
  for(r=0;r<N*M;r++)
  {
    for(j=0;j<8;j++)                 //电机外轴旋转一周,不是里里面面所看到的一周
    {
                              GPIO_Write(GPIOA, 0x08);
                                                      delay();
                                                      GPIO_Write(GPIOA,0x0c);
                                                      delay();
                                                      GPIO_Write(GPIOA,0x04);
                                                      delay();
                                                      GPIO_Write(GPIOA,0x06);
                                                      delay();       
                                                          GPIO_Write(GPIOA, 0x02);
                                                      delay();
                                                          GPIO_Write(GPIOA, 0x03);
                                                      delay();
                                                          GPIO_Write(GPIOA, 0x01);
                                                      delay();
                                                          GPIO_Write(GPIOA, 0x09);
                                                      delay();
    }
   }
}
          break;

        case 3:        //         反转n圈
{

  u8 j;
  u8 r;
  u8 N=16;

//  extern u8 M;
  for(r=0;r<N*M;r++)
  {

     for(j=0;j<8;j++)                 //电机外轴旋转一周,不是里里面面所看到的一周
  {
    GPIO_Write(GPIOA,0x09);
        delay();
        GPIO_Write(GPIOA,0x01);
        delay();
        GPIO_Write(GPIOA,0x03);
        delay();
        GPIO_Write(GPIOA,0x02);
        delay();
    GPIO_Write(GPIOA, 0x06);
        delay();       
        GPIO_Write(GPIOA, 0x04);
        delay();
        GPIO_Write(GPIOA, 0x0C);
        delay();
        GPIO_Write(GPIOA, 0x08);
        delay();       
   }
}
}
         break;
       case 4:
{          
           m=m+1;
           M=m;       
}
           break;
               
        /*         case 5:
                 num2();
                  motor_Turn_on_4();               
         break;                            */
        default:
          GPIO_ResetBits(GPIOA, GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3);
          break;
      }  
   }         
                  
}         


void USART_Configuration(void)
{
     USART_InitTypeDef USART_InitStructure;

     USART_InitStructure.USART_BaudRate = 115200;

         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;       

         STM_EVAL_COMInit(COM1, &USART_InitStructure);
}          

void RCC_Configuration()
{
         //定义错误状态变量
         ErrorStatus HSEStartUpStatus;
       
         //将RCC寄存器重新设置为默认值
         RCC_DeInit();

         //打开外部高速时钟晶振
         RCC_HSEConfig(RCC_HSE_ON);

         //等待外部高速时钟晶振工作
         HSEStartUpStatus = RCC_WaitForHSEStartUp();
         if(HSEStartUpStatus == SUCCESS)
         {
                 //设置AHB时钟(HCLK)为系统时钟
                 RCC_HCLKConfig(RCC_SYSCLK_Div1);

                 //设置高速AHB时钟(APB2)为HCLK时钟
                 RCC_PCLK2Config(RCC_HCLK_Div1);

                 //设置低速AHB时钟(APB1)为HCLK的2分频
                 RCC_PCLK1Config(RCC_HCLK_Div2);
               
                 //设置FLASH代码延时
                 FLASH_SetLatency(FLASH_Latency_2);

                 //使能预取指缓存
                 FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

                 //设置PLL时钟,为HSE的9倍频 8MHz * 9 = 72MHz
                 RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);

                  //使能PLL
                 RCC_PLLCmd(ENABLE);

                 //等待PLL准备就绪
                 while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);

                 //设置PLL为系统时钟源
                 RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

                 //判断PLL是否是系统时钟
                 while(RCC_GetSYSCLKSource() != 0x08);
         }

         //开启TIM3的时钟
         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
         //开启GPIOB的时钟和复用功能
         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,ENABLE);

}

void GPIO_Configuration()
{
         GPIO_InitTypeDef GPIO_InitStructure;
          GPIO_AFIODeInit();
         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//打开外设A,的时钟

         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;

         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//IO口的方向

         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

         GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化外设0,1,2,3,6的端口
}

/**
  * @brief  Retargets the C library printf function to the USART.
  * @param  None
  * @retval None
  */
PUTCHAR_PROTOTYPE
{
  /* Place your implementation of fputc here */
  /* e.g. write a character to the USART */
  USART_SendData(EVAL_COM1, (uint8_t) ch);

  /* Loop until the end of transmission */
  while (USART_GetFlagStatus(EVAL_COM1, USART_FLAG_TC) == RESET)
  {
  }

  return ch;
}

#ifdef  USE_FULL_ASSERT

/**
  * @brief  Reports the name of the source file and the source line number
  *         where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */

void assert_failed(uint8_t* file, uint32_t line)
{
  /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  /* Infinite loop */
  while (1)
  {
  }
}
#endif
/**
  * @}
  */

/**
  * @}
  */
/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/


沙发
video_vb| | 2013-5-3 10:48 | 只看该作者
按Key5后,并不知道运行了多少周期,下面M类似随机数
       case 4:
{         
           m=m+1;
           M=m;        
}
           break;
应该会停下来,只是转的圈数超出预期。没仔细看。

使用特权

评论回复
板凳
jiangsai|  楼主 | 2013-5-4 15:28 | 只看该作者
video_vb 发表于 2013-5-3 10:48
按Key5后,并不知道运行了多少周期,下面M类似随机数
       case 4:
{         

为啥会是随机数呢

使用特权

评论回复
地板
hawksabre| | 2013-5-4 17:46 | 只看该作者
不是很了解诶    楼主   不太懂   帮你顶一个

使用特权

评论回复
5
jiangsai|  楼主 | 2013-5-4 18:38 | 只看该作者
已经决解了,是按键延时太短了

使用特权

评论回复
6
liulutong| | 2013-11-6 16:05 | 只看该作者
是r的问题吧,定义的是U8,按键按的久了M比较大,N*M自然可以超出256啦, for(r=0;r<N*M;r++)一直会循环。

使用特权

评论回复
7
rocdove| | 2013-12-17 22:50 | 只看该作者
嗯,,正解

使用特权

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

本版积分规则

4

主题

49

帖子

0

粉丝