找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1543|回复: 6
收起左侧

步进电机不能反转?附单片机程序电路

[复制链接]
ID:678280 发表于 2021-11-23 11:18 | 显示全部楼层 |阅读模式
用Proteus仿真没提示有问题,但步进电机只能顺时针旋转,请教各位了谢谢。仿真接线图如下:
未命名.jpg


完整代码如下:
#include<reg52.h>
sbit A1=P2^1;
sbit B1=P2^2;
sbit C1=P2^3;
sbit D1=P2^4;

#define C_AB1 {A1=1;B1=1;C1=0;D1=0;}//AB相通电,其他相断电。
#define C_BC1 {A1=0;B1=1;C1=1;D1=0;}//BC相通电,其他相断电。
#define C_CD1 {A1=0;B1=0;C1=1;D1=1;}//CD相通电,其他相断电。
#define C_DA1 {A1=1;B1=0;C1=0;D1=1;}//D相通电,其他相断电。
#define C_A1  {A1=1;B1=0;C1=0;D1=0;}//A相通电,其他相断电。
#define C_B1  {A1=0;B1=1;C1=0;D1=0;}//B相通电,其他相断电。
#define C_C1  {A1=0;B1=0;C1=1;D1=0;}//C相通电,其他相断电。
#define C_D1  {A1=0;B1=0;C1=0;D1=1;}//D相通电,其他相断电。
#define C_OFF {A1=0;B1=0;C1=0;D1=0;}//全部断电。

unsigned char speed;
bit Flag;

void delayus(unsigned char t)
{  while(--t); }

void delayms(unsigned char t)
{
  while(t--)
  {
    delayus(245);
    delayus(245);  }}

main()
{
  unsigned int i=512; //旋转一周时间。
  EA=1;
  EX0=1;
  IT0=1;
  speed=10;
  while(i--)
  {
    C_OFF
    while((i--)&&Flag) //正向。
    {
      C_A1
      delayms(speed);
      C_AB1
      delayms(speed);
      C_B1
      delayms(speed);
      C_BC1
      delayms(speed);
      C_C1
      delayms(speed);
      C_CD1
      delayms(speed);
      C_D1
      delayms(speed);
      C_DA1
      delayms(speed);
    }
    C_OFF
    i=512;
    while((i--)&&(!Flag)) //反向。
    {
      C_A1
      delayms(speed);
      C_DA1
      delayms(speed);
      C_D1
      delayms(speed);
      C_CD1
      delayms(speed);
      C_C1
      delayms(speed);
      C_BC1
      delayms(speed);
      C_B1
      delayms(speed);
      C_AB1
      delayms(speed);
    }
  }
}

void zhang0(void)interrupt 0
{
  if(!INT0)
  {
    delayms(10); //延时防抖。
    if(!INT0)
    {  Flag=!Flag; }
  }
}


回复

使用道具 举报

ID:235200 发表于 2021-11-23 13:55 | 显示全部楼层
正向相序是A AB B BC C CD D DA,而反向是A AD D DC C CB B BA,程序中未定义反向的相序
回复

使用道具 举报

ID:678280 发表于 2021-11-23 16:39 | 显示全部楼层
csmyldl 发表于 2021-11-23 13:55
正向相序是A AB B BC C CD D DA,而反向是A AD D DC C CB B BA,程序中未定义反向的相序

按你说的我修改了,应该是还有错误,仿真时仍旧只看到顺时针旋转。

#include<reg52.h>
sbit A1=P2^0;
sbit B1=P2^1;
sbit C1=P2^2;
sbit D1=P2^3;

#define C_AB1 {A1=1;B1=1;C1=0;D1=0;}//AB相通电,其他相断电。
#define C_AD1 {A1=1;B1=0;C1=0;D1=1;}//AD相通电,其他相断电。
#define C_BA1 {A1=1;B1=1;C1=0;D1=0;}//BA相通电,其他相断电。
#define C_BC1 {A1=0;B1=1;C1=1;D1=0;}//BC相通电,其他相断电。
#define C_CB1 {A1=0;B1=1;C1=1;D1=0;}//CB相通电,其他相断电。
#define C_CD1 {A1=0;B1=0;C1=1;D1=1;}//CD相通电,其他相断电。
#define C_DA1 {A1=1;B1=0;C1=0;D1=1;}//DA相通电,其他相断电。
#define C_DC1 {A1=0;B1=0;C1=1;D1=1;}//DC相通电,其他相断电。

#define C_A1  {A1=1;B1=0;C1=0;D1=0;}//A相通电,其他相断电。
#define C_B1  {A1=0;B1=1;C1=0;D1=0;}//B相通电,其他相断电。
#define C_C1  {A1=0;B1=0;C1=1;D1=0;}//C相通电,其他相断电。
#define C_D1  {A1=0;B1=0;C1=0;D1=1;}//D相通电,其他相断电。
#define C_OFF {A1=0;B1=0;C1=0;D1=0;}//全部断电。

unsigned char speed;
bit Flag;

void delayus(unsigned char t)
{  while(--t); }

void delayms(unsigned char t)
{
  while(t--)
  {
    delayus(245);
    delayus(245);  }}

main()
{
  unsigned int i=512; //旋转一周时间。
  EA=1;
  EX0=1;
  IT0=1;
  speed=10;
  while(i--)
  {
    C_OFF
    while((i--)&&Flag) //正向。
    {
      C_A1
      delayms(speed);
      C_AB1
      delayms(speed);
      C_B1
      delayms(speed);
      C_BC1
      delayms(speed);
      C_C1
      delayms(speed);
      C_CD1
      delayms(speed);
      C_D1
      delayms(speed);
      C_DA1
      delayms(speed);
    }
    C_OFF
    i=512;
    while((i--)&&(!Flag)) //反向。
    {
      C_A1
      delayms(speed);
      C_AD1
      delayms(speed);
      C_D1
      delayms(speed);
      C_DC1
      delayms(speed);
      C_C1
      delayms(speed);
      C_CB1
      delayms(speed);
      C_B1
      delayms(speed);
      C_BA1
      delayms(speed);
    }
  }
}

void zhang0(void)interrupt 0
{
  if(!INT0)
  {
    delayms(10); //延时防抖。
    if(!INT0)
    {  Flag=!Flag; }
  }
}
回复

使用道具 举报

ID:139866 发表于 2021-11-23 18:00 | 显示全部楼层
为什么不定义个数组用循环,一条一条写不觉得很麻烦吗
  1. char A[] = {1, 1, 0, 0, 0, 0, 0, 1, 0};
  2. char B[] = {0, 1, 1, 1, 0, 0, 0, 0, 0};
  3. char C[] = {0, 0, 0, 1, 1, 1, 0, 0, 0};
  4. char D[] = {0, 0, 0, 0, 0, 1, 1, 1, 0};

  5. for(char i = 0; i < 8; i++){
  6.     A1=A[i];
  7.     B1=B[i];
  8.     C1=C[i];
  9.     D1=D[i];
  10.     delayms(speed);
  11. }
复制代码
回复

使用道具 举报

ID:983939 发表于 2021-11-23 19:32 | 显示全部楼层
B B BC C CD D DA,而反向是A AD D DC C CB B BA,程序中未定义反向的相序
回复

使用道具 举报

ID:678280 发表于 2021-11-23 22:30 | 显示全部楼层
天ノ忆 发表于 2021-11-23 18:00
为什么不定义个数组用循环,一条一条写不觉得很麻烦吗

好主意,谢谢啦
回复

使用道具 举报

ID:678280 发表于 2021-11-24 17:29 | 显示全部楼层
我笨,两天了也没弄明白。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表