linwei_063 发表于 2008-5-16 10:26:33

二相步进电机32细分驱动程序

这是我最近写的一个驱动程序,DA是7位的,不知道细分转换表对不对,我是按这个公式算的,细分值=128sin(90*n/32)n从1取到32.
高手们帮我看看这样写对不对
/*******************************************************************
程序实现功能:对二相步进电机进行32细分;采用定时器中断,每0.5ms电机
            走一步;
            暂时单片机外部控制部分只有控制正转、反转键
*******************************************************************/
#include <reg51.h>
#include <absacc.h>
#include <stdio.h>
#include <intrins.h>
#include <math.h>
#include <string.h>

//NJU39610端口定义

#define DA_PORT P1
sbit DA_WR=P3^4;      //NJU39610数据写入端;
sbit DA_A0=P3^7;      //NJU39610通道选择端;

//对外接口引脚定义
sbit ST_CLK =P3^2;      //外部脉冲信号输入;
sbit ST_STOP=P3^3;      //控制步进电机开关;
sbit ST_DIR =P2^7;      //控制步进电机转动方向;

//全局变量定义
unsigned char dataxf_step;                                           //细分步数(二相电机单二拍走一循环为64步)
unsigned char xdata xf32_sin={0,6,12,18,24,31,37,43,               //32细分后走一个循环的细分数据;
                                  48,54,60,65,71,76,81,85,
                                  90,94,98,102,106,109,112,115,
                                  118,120,122,124,125,126,127,127,
                                  128,127,127,126,125,124,122,120,
                                  118,115,112,109,106,102,98,94,
                                  90,85,81,76,71,65,60,54,
                                  48,43,37,31,24,18,12,6
                                 };
unsigned char xdata xf32_cos={128,127,127,126,125,124,122,120,
                                  118,115,112,109,106,102,98,94,
                                  90,85,81,76,71,65,60,54,
                                  48,43,37,31,24,18,12,6,
                                  0,6,12,18,24,31,37,43,
                                  48,54,60,65,71,76,81,85,
                                  90,94,98,102,106,109,112,115,
                                  118,120,122,124,125,126,127,127,
                                 };


StopMt()
{
       DA_A0=0;                         //选DA通道0;
       DA_PORT=0;
       DA_WR=0;                         //DA数据写入;
       _nop_();
       DA_WR=1;
       DA_A0=1;                         //选DA通道1;
       DA_PORT=0;
       DA_WR=0;                         //DA数据写入;
       _nop_();
       DA_WR=1;
}

void t0(void)interrupt 1 using 0
{
   TH0=(65536-500)/256;
   TL0=(65536-500)/256;            
   if(ST_DIR)                           //如果ST_DIR为1,则电机正转,D7位为低电平
   {
       DA_A0=0;                         //选DA通道0;
       DA_PORT=xf32_sin|0x80;
       DA_WR=0;                         //DA数据写入;
       _nop_();
       DA_WR=1;
       DA_A0=1;                         //选DA通道1;
       DA_PORT=xf32_cos|0x80;
       DA_WR=0;                         //DA数据写入;
       _nop_();
       DA_WR=1;
   }
   else                                 //如果ST_DIR为0,则电机反转,D7位为高电平
   {
       DA_A0=0;                         //选DA通道0;
       DA_PORT=xf32_sin;
       DA_WR=0;                         //DA数据写入;
       _nop_();
       DA_WR=1;
       DA_A0=1;                         //选DA通道1;
       DA_PORT=xf32_cos;
       DA_WR=0;                         //DA数据写入;
       _nop_();
       DA_WR=1;
   }
   xf_step++;                           //0.5ms进次中断,电机走一步,每走64步重新循环
   if(xf_step>=64) {xf_step=0;}
}
void main(void)
{         
   TMOD=0x01;
   TH0=(65536-500)/256;
   TL0=(65536-500)/256;
   TR0=1;
   ET0=1;
   EA=1;         //开放系统中断
   StopMt();
   while(1);
}
http://cache.amobbs.com/bbs_upload782111/files_10/ourdev_281962.jpg
(原文件名:驱动电路.jpg)

rifjft 发表于 2008-5-18 13:12:12

可惜我不懂单片机的细分

zhangjc0214 发表于 2008-6-13 17:33:53

我近来也在搞这个步进电机,是个新手,我现在在弄直流调速电机,但是对PWM不懂,兄弟会吗?我主要是用PWM实现基准电压的方法不会。

wfbaaa 发表于 2008-6-13 19:11:21

谢谢楼上的兄弟

yinhe 发表于 2009-1-16 22:48:44

ji

lzp315 发表于 2010-7-7 10:12:53

你这个程序根本就行不通!

xjmlfm1 发表于 2010-7-7 11:38:34

mark

xinjinglei1986 发表于 2010-7-7 16:29:50

好好学习一下!

wangwish 发表于 2010-8-5 13:36:20

mark

shdjdq 发表于 2010-8-7 09:11:10

我正在搞中低价位的,超高性能的驱动器。

mkzlovedamy 发表于 2010-8-29 11:24:51

tongyf 发表于 2010-11-19 11:26:48

mark

464839941xql 发表于 2012-11-4 21:06:34

学习一下细分表!
页: [1]
查看完整版本: 二相步进电机32细分驱动程序