C 步进电机赢得';不要停止旋转

C 步进电机赢得';不要停止旋转,c,syntax,microcontroller,keil,stepper,C,Syntax,Microcontroller,Keil,Stepper,我试图让我的28BYJ-48步进电机旋转四分之一圈,然后停止,但我在代码中实现它时遇到了问题。我发现,无论我在代码中的数字有多小,或者甚至以让我认为它可以正常工作的方式对它进行修改,我都无法让它停止旋转。下面是代码的有用部分 #define STEPPER (*((volatile uint32_t *)0x4000703C)) // Move 1.8 degrees clockwise, delay is the time to wait after each step void Step

我试图让我的28BYJ-48步进电机旋转四分之一圈,然后停止,但我在代码中实现它时遇到了问题。我发现,无论我在代码中的数字有多小,或者甚至以让我认为它可以正常工作的方式对它进行修改,我都无法让它停止旋转。下面是代码的有用部分

#define STEPPER  (*((volatile uint32_t *)0x4000703C))

// Move 1.8 degrees clockwise, delay is the time to wait after each step
void Stepper_CW(uint32_t delay) {
  Pt = Pt->Next[clockwise];     // circular
  STEPPER = Pt->Out; // step motor

  if(Pos==199) {      // shaft angle
    Pos = 0;         // reset
  }
  else {
    Pos--; // CW
  }
 SysTick_Wait(delay);
}

// Move 1.8 degrees counterclockwise, delay is wait after each step
void Stepper_CCW(uint32_t delay) {
  Pt = Pt->Next[counterclockwise]; // circular
  STEPPER = Pt->Out; // step motor
  if(Pos==0) {        // shaft angle
    Pos = 199;         // reset
  }
  else {
    Pos++; // CCW
  }
 SysTick_Wait(delay); // blind-cycle wait
}

// Initialize Stepper interface
void Stepper_Init(void) {
  SYSCTL_RCGCGPIO_R |= 0x08; // 1) activate port D
  SysTick_Init();
  Pos = 0;                   
  Pt = &fsm[0]; 
                                // 2) no need to unlock PD3-0
  GPIO_PORTD_AMSEL_R &= ~0x0F;      // 3) disable analog functionality on PD3-0
  GPIO_PORTD_PCTL_R &= ~0x0000FFFF; // 4) GPIO configure PD3-0 as GPIO
  GPIO_PORTD_DIR_R |= 0x0F;             // 5) make PD3-0 out
  GPIO_PORTD_AFSEL_R &= ~0x0F;          // 6) disable alt funct on PD3-0
  GPIO_PORTD_DR8R_R |= 0x0F;            // enable 8 mA drive
  GPIO_PORTD_DEN_R |= 0x0F;         // 7) enable digital I/O on PD3-0 
}

// Turn stepper motor to desired position
// (0 <= desired <= 199)
// time is the number of bus cycles to wait after each step
void Stepper_Seek(uint8_t desired, uint32_t time) {
 short CWsteps;
  if((CWsteps = (desired-Pos))<0) {
   CWsteps+=200;
  } 

// CW steps is > 100
 if(CWsteps > 100) {
   while(desired != Pos) {
     Stepper_CCW(time);
   }
 }
 else {
   while(desired != Pos) {
    Stepper_CW(time);
   } 
 }
}
#定义步进器(*(易失性uint32_t*)0x4000703C))
//顺时针移动1.8度,延迟是每一步后等待的时间
无效步进器连续波(uint32延迟){
Pt=Pt->Next[顺时针];//圆形
步进电机=Pt->Out;//步进电机
如果(Pos==199){//轴角
Pos=0;//重置
}
否则{
Pos-->/CW
}
SysTick_等待(延迟);
}
//逆时针移动1.8度,延迟为每一步后等待
无效步进器逆时针(uint32延时){
Pt=Pt->Next[逆时针];//循环
步进电机=Pt->Out;//步进电机
如果(Pos==0){//轴角度
Pos=199;//重置
}
否则{
Pos++;//逆时针
}
SysTick_Wait(延迟);//盲循环等待
}
//初始化步进器接口
void步进器初始化(void){
SYSCTL_RCGCGPIO|u R |=0x08;//1)激活端口D
SysTick_Init();
Pos=0;
Pt=&fsm[0];
//2)无需解锁PD3-0
GPIO_PORTD_AMSEL_R&=~0x0F;//3)禁用PD3-0上的模拟功能
GPIO\U端口D\U PCTL\U R&=~0x0000FFFF;//4)GPIO将PD3-0配置为GPIO
GPIO_PORTD_DIR|=0x0F;//5)使PD3-0输出
GPIO_PORTD_AFSEL_R&=~0x0F;//6)禁用PD3-0上的alt函数
GPIO_端口D_DR8R|=0x0F;//启用8 mA驱动器
GPIO_端口d_DEN|R |=0x0F;//7)在PD3-0上启用数字I/O
}
//将步进电机转到所需位置

//(0您的环绕逻辑在
Stepper\u CW()
Stepper\u CCW()
中都是反向的。以前者为例。假设您试图达到198,并且
Pos
最初是1:

  • 在第一次调用时,
    Pos
    递减为0。这不等于198,因此再次调用该函数
  • 在第二次调用时,
    Pos
    递减为199。这不等于198,因此再次调用该函数
  • 在第三次呼叫时,将触发环绕案例,并将
    Pos
    设置为0。这不等于198

  • 步骤(3)后的状态与步骤(1)后的状态相同——无限循环。

    您能否发布代码,说明如何使用这些步进器功能(例如,在哪里调用
    stepper\u Seek
    等)?在更新
    Pos
    的位置添加输出/调试语句,并将其与
    所需的
    进行比较。还要注意,您有一条注释
    CW步骤为0到199
    ,下一行将
    CWsteps
    与100进行比较。只是一个红色标志……滚动逻辑是向后的。Pos--需要与达到0的检查相匹配,Pos++需要检查是否达到199。
    #include <stdint.h>
    #include "stepper.h"
    #define T1ms 16000    // assumes using 16 MHz PIOSC (default setting for clock source)
    int main(void) {
      Stepper_Init();
      Stepper_CW(T1ms);   // Pos=1; GPIO_PORTD_DATA_R=9
      Stepper_CW(T1ms);   // Pos=2; GPIO_PORTD_DATA_R=5
      Stepper_CW(T1ms);   // Pos=3; GPIO_PORTD_DATA_R=6
      Stepper_CW(T1ms);   // Pos=4; GPIO_PORTD_DATA_R=10
      Stepper_CW(T1ms);   // Pos=5; GPIO_PORTD_DATA_R=9
      Stepper_CW(T1ms);   // Pos=6; GPIO_PORTD_DATA_R=5
      Stepper_CW(T1ms);   // Pos=7; GPIO_PORTD_DATA_R=6
      Stepper_CW(T1ms);   // Pos=8; GPIO_PORTD_DATA_R=10
      Stepper_CW(T1ms);   // Pos=9; GPIO_PORTD_DATA_R=9
      Stepper_CCW(T1ms);  // Pos=8; GPIO_PORTD_DATA_R=10
      Stepper_CCW(T1ms);  // Pos=7; GPIO_PORTD_DATA_R=6
      Stepper_CCW(T1ms);  // Pos=6; GPIO_PORTD_DATA_R=5
      Stepper_CCW(T1ms);  // Pos=5; GPIO_PORTD_DATA_R=9
      Stepper_CCW(T1ms);  // Pos=4; GPIO_PORTD_DATA_R=10
      Stepper_Seek(8,T1ms);// Pos=8; GPIO_PORTD_DATA_R=10
      Stepper_Seek(0,T1ms);// Pos=0; GPIO_PORTD_DATA_R=10
      while(1) {
        Stepper_CW(10*T1ms);   // output every 10ms
      }
    }