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