初级会员

- 积分
- 104
- 金钱
- 104
- 注册时间
- 2021-6-2
- 在线时间
- 25 小时
|
20金钱
本帖最后由 JYun 于 2021-9-25 11:13 编辑
在网上买了一个步进电机打算做毕业设计,需要转正转半圈之后再反转。但是经过调试之后只能正转却不能反转,驱动板是ULN2003。
正转时序:A-AB-B-BC-C-CD-D-DA
反转时许:D-DC-C-CB-B-BA-A-AD
以下是驱动代码:
/*************motor.h文件*****************/
#ifndef __MOTOR_H
#define __MOTOR_H
#include "stm32f10x.h"
/********************************************
/
/ 功能引脚定义
/
*********************************************/
#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))
#define MEM_ADDR(addr) *((volatile unsigned long *)(addr))
#define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum))
//IO口地址映射
#define GPIOA_ODR_Addr (GPIOA_BASE+12) //0x4001080C
#define GPIOB_ODR_Addr (GPIOB_BASE+12) //0x40010C0C
#define GPIOC_ODR_Addr (GPIOC_BASE+12) //0x4001100C
#define GPIOA_IDR_Addr (GPIOA_BASE+8) //0x40010808
#define GPIOB_IDR_Addr (GPIOB_BASE+8) //0x40010C08
#define GPIOC_IDR_Addr (GPIOC_BASE+8) //0x40011008
//IO口操作,只对单一的IO口!
//确保n的值小于16!
#define PAout(n) BIT_ADDR(GPIOA_ODR_Addr,n) //输出
#define PAin(n) BIT_ADDR(GPIOA_IDR_Addr,n) //输入
#define PBout(n) BIT_ADDR(GPIOB_ODR_Addr,n) //输出
#define PBin(n) BIT_ADDR(GPIOB_IDR_Addr,n) //输入
#define PCout(n) BIT_ADDR(GPIOC_ODR_Addr,n) //输出
#define PCin(n) BIT_ADDR(GPIOC_IDR_Addr,n) //输入
/********************步进电机************************/
//
// PB12、PB13、PB14、PB15
//
/****************************************************/
#define LA PBout(12) //A 相
#define LB PBout(13) //B 相
#define LC PBout(14) //C 相
#define LD PBout(15) //D 相
#define LA_GPIO_PORT GPIOB
#define LA_GPIO_PIN GPIO_Pin_12
#define LB_GPIO_PORT GPIOB
#define LB_GPIO_PIN GPIO_Pin_13
#define LC_GPIO_PORT GPIOB
#define LC_GPIO_PIN GPIO_Pin_14
#define LD_GPIO_PORT GPIOB
#define LD_GPIO_PIN GPIO_Pin_15
void Motor_Init(void);
void MotorCW(u32 time);
void MotorCCW(u32 time);
void MotorStop(void);
#endif
/*************motor.c文件*****************/
const u8 phasecw[8] = {0x01, 0x03, 0x02, 0x06, 0x04, 0x0c, 0x08, 0x09}; //正转 电机导通相序 A-AB-B-BC-C-CD-D-DA
const u8 phaseccw[8] = {0x08, 0x0c, 0x04, 0x06, 0x02, 0x03, 0x01, 0x09}; //反转 电机导通相序 D-DC-C-CB-B-BA-A-AD
void Motor_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = LA_GPIO_PIN | LB_GPIO_PIN | LC_GPIO_PIN | LD_GPIO_PIN ; //引脚按着INT1顺序接就行了
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(LA_GPIO_PORT, &GPIO_InitStructure);
GPIO_ResetBits(LA_GPIO_PORT, LA_GPIO_PIN | LB_GPIO_PIN | LC_GPIO_PIN | LD_GPIO_PIN);
}
void MotorCW(u32 time) //正转
{
u8 i;
u8 temp = 0;
for( i = 0; i < 8; i++ )
{
temp = phasecw;
LD = ( temp >> 3 ) & 0x01; //取bit4的值
LC = ( temp >> 2 ) & 0x01;
LB = ( temp >> 1 ) & 0x01;
LA = ( temp >> 0 ) & 0x01; //取bit0的值
Delay_Us(time);
}
MotorStop(); //一个周期转动结束后需要复位所有相,否则最后一项如果被设置为高电平后会持续维持高电平。
}
void MotorCCW(u32 time, u8 circle)
{
u8 i;
u8 temp = 0;
for( i = 0; i < 8; i++ )
{
temp = phaseccw;
LD = ( temp >> 3 ) & 0x01; //取bit4的值
LC = ( temp >> 2 ) & 0x01;
LB = ( temp >> 1 ) & 0x01;
LA = ( temp >> 0 ) & 0x01; //取bit0的值
Delay_Us(time);
}
MotorStop(); //一个周期转动结束后需要复位所有相,否则最后一项如果被设置为高电平后会持续维持高电平。
}
void MotorStop(void)
{
LA = 0;
LB = 0;
LC = 0;
LD = 0;
}
/*************main.c文件*****************/
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
Delay_Init();
Motor_Init();
while(1) //主循环
{
//MotorCCW(2000); //能反转
MotorCW(2000); //不能反转
}
}
程序运行正转一直抖动,调过延时也没用,求大佬分析下原因,感激不尽。
|
|