打印

28335控制28BYJ48步进电机转速的c语言程序

[复制链接]
3190|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
沙发
你一笑,粉直掉|  楼主 | 2014-2-24 20:50 | 只看该作者
这就是那个步进电机的程序,用的是delay延时函数控制转速,但是不是很直观,所以想用cputimer来产生脉冲从而得到步进电机转速,求大神指点
#include "DSP2833x_Device.h"     // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h"   // DSP2833x Examples Include File
#define PHA_ON                GpioDataRegs.GPASET.bit.GPIO8 = 1                                                        //A相输出高电平
#define PHA_OFF                GpioDataRegs.GPACLEAR.bit.GPIO8 = 1                                                    //A相输出低电平
#define PHB_ON                GpioDataRegs.GPASET.bit.GPIO13 = 1                                                        //B相输出高电平
#define PHB_OFF                GpioDataRegs.GPACLEAR.bit.GPIO13 = 1                                                //B相输出低电平
#define PHC_ON                GpioDataRegs.GPASET.bit.GPIO10 = 1                                                        //C相输出高电平
#define PHC_OFF                GpioDataRegs.GPACLEAR.bit.GPIO10 = 1                                                //C相输出低电平
#define PHD_ON                GpioDataRegs.GPASET.bit.GPIO14 = 1                                                        //D相输出高电平
#define PHD_OFF                GpioDataRegs.GPACLEAR.bit.GPIO14 = 1                                                //D相输出低电平
                                                                                                       
#define STEP_TIME        15000                                                                                                       

const Uint16 StepMode1[8] = {0x0D0A,0x0D0A,0x0A0B,0x0A0B,0x0B0C,0x0B0C,0x0C0D,0x0C0D};                //单四拍时序A-B-C-D-A
void delay(Uint32 t);
void MotionControl1(void);
void PhaseOff(Uint16 i);
void PhaseOn(Uint16 i);
void Init_StepMotorGpio(void)
{

        EALLOW;   
        //Phase A
        GpioCtrlRegs.GPAPUD.bit.GPIO8 = 0;                                                                           // Enable pullup on GPIO11
    GpioDataRegs.GPASET.bit.GPIO8 = 1;                                                                           // Load output latch
    GpioCtrlRegs.GPAMUX1.bit.GPIO8 = 0;                                                                          // GPIO11 = GPIO
    GpioCtrlRegs.GPADIR.bit.GPIO8 = 1;                                                                           // GPIO11 = output   
        //Phase B
        GpioCtrlRegs.GPAPUD.bit.GPIO13 = 0;                                                                           // Enable pullup on GPIO11
    GpioDataRegs.GPASET.bit.GPIO13 = 1;                                                                           // Load output latch
    GpioCtrlRegs.GPAMUX1.bit.GPIO13 = 0;                                                                          // GPIO11 = GPIO
    GpioCtrlRegs.GPADIR.bit.GPIO13 = 1;                                                                           // GPIO11 = output   
        //Phase C
        GpioCtrlRegs.GPAPUD.bit.GPIO10 = 0;                                                                           // Enable pullup on GPIO11
    GpioDataRegs.GPASET.bit.GPIO10 = 1;                                                                           // Load output latch
    GpioCtrlRegs.GPAMUX1.bit.GPIO10 = 0;                                                                          // GPIO11 = GPIO
    GpioCtrlRegs.GPADIR.bit.GPIO10 = 1;                                                                           // GPIO11 = output   
        //Phase D   
    GpioCtrlRegs.GPAPUD.bit.GPIO14 = 0;                                                                           // Enable pullup on GPIO11
    GpioDataRegs.GPASET.bit.GPIO14 = 1;                                                                           // Load output latch
    GpioCtrlRegs.GPAMUX1.bit.GPIO14 = 0;                                                                          // GPIO11 = GPIO
    GpioCtrlRegs.GPADIR.bit.GPIO14 = 1;                                                                           // GPIO11 = output   

    EDIS;  
        PHA_OFF;
        PHB_OFF;
        PHC_OFF;
        PHD_OFF;

}

void delay(Uint32 t)
{
        Uint32 i = 0;
        for (i = 0; i < t; i++);
}
void PhaseOn(Uint16 i)
{
        switch(i)
        {
                case 0xA:
                                PHA_ON;
                        break;

                case 0xB:
                                PHB_ON;
                        break;

                case 0xC:
                                PHC_ON;
                        break;

                case 0xD:
                                PHD_ON;                       
                        break;
                case 0x0:               
                        break;
                default:
                        break;
        }
}

void PhaseOff(Uint16 i)
{
        switch(i)
        {
                case 0xA:
                                PHA_OFF;
                        break;

                case 0xB:
                                PHB_OFF;
                        break;

                case 0xC:
                                PHC_OFF;
                        break;

                case 0xD:
                                PHD_OFF;                       
                        break;
                case 0x0:               
                        break;
                default:
                        break;
        }
}
void MotionControl1(void)
{
        Uint16 loop = 0;
        for(loop = 0;loop<=7;loop++)
        {
                PhaseOn (StepMode1[loop] & 0x000F);                                                                //第一位:控制信号高电平判断
                PhaseOn ((StepMode1[loop] & 0x00F0)>>4);                                                        //第二位:控制信号高电平判断
                PhaseOff((StepMode1[loop] & 0x0F00)>>8);                                                        //第三位:控制信号低电平判断
                PhaseOff((StepMode1[loop] & 0xF000)>>12);                                                        //第四位:控制信号低电平判断
                delay(STEP_TIME);
        }       
}


void main(void)
{

   InitSysCtrl();
   Init_StepMotorGpio();                                                               
   DINT;
   InitPieCtrl();
   IER = 0x0000;
   IFR = 0x0000;
   InitPieVectTable();

        while(1)                                                                                               
        {
                MotionControl1();
        }

}        

使用特权

评论回复
板凳
airwill| | 2014-2-24 21:15 | 只看该作者
不知道是怎么个控制方案?
如果是控制驱动器, 就是调节脉冲输出罢了

使用特权

评论回复
地板
airwill| | 2014-2-24 21:15 | 只看该作者
不知道是怎么个控制方案?
如果是控制驱动器, 就是调节脉冲输出罢了

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
你一笑,粉直掉 + 1 很给力!
5
你一笑,粉直掉|  楼主 | 2014-2-25 19:09 | 只看该作者
就是我想用cputimer中断来代替delay延时来控制步进电机转速,但我不知道怎么修改这个程序,改了也有好多错误,上面就是步进电机转动单四拍的程序,刚学dsp,好多地方不懂

使用特权

评论回复
6
zhangmangui| | 2014-2-25 19:41 | 只看该作者
你一笑,粉直掉 发表于 2014-2-25 19:09
就是我想用cputimer中断来代替delay延时来控制步进电机转速,但我不知道怎么修改这个程序,改了也有好多错 ...

你先用delay的方式   让电机转起来  确保修改delay的大小改变转速
然后调一下CPU定时器中断   在中断中去送下一个脉冲就可以啦

使用特权

评论回复
7
你一笑,粉直掉|  楼主 | 2014-2-25 19:51 | 只看该作者
zhangmangui 发表于 2014-2-25 19:41
你先用delay的方式   让电机转起来  确保修改delay的大小改变转速
然后调一下CPU定时器中断   在中断中去 ...

谢谢你的回答,但我还不是很理解,我想得到一个确切的转速值,有个公式计算转速:n=f*60/T,不知道如何来正确编写这样符合要求的程序

使用特权

评论回复
8
zhangmangui| | 2014-2-26 09:53 | 只看该作者
你一笑,粉直掉 发表于 2014-2-25 19:51
谢谢你的回答,但我还不是很理解,我想得到一个确切的转速值,有个公式计算转速:n=f*60/T,不知道如何来 ...

步进电机的速度应该是好测的啊
也就是你多长时间送了一次脉冲   多少个脉冲转了一周
速度就出来了

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
你一笑,粉直掉 + 1 很给力!
9
你一笑,粉直掉|  楼主 | 2014-3-8 15:35 | 只看该作者
那怎么来控制这个输入脉冲的数目与大小呢?

使用特权

评论回复
10
你一笑,粉直掉|  楼主 | 2014-3-8 15:36 | 只看该作者
zhangmangui 发表于 2014-2-26 09:53
步进电机的速度应该是好测的啊
也就是你多长时间送了一次脉冲   多少个脉冲转了一周
速度就出来了 ...

这个步进电机一个脉冲转动5.625度的

使用特权

评论回复
11
你一笑,粉直掉|  楼主 | 2014-3-9 21:10 | 只看该作者
我又对这个程序作了修改,但是步进电机不会转动,原因是我没有把步进电机的操作部分写进定时器中断里面,但我又想不出来,求版主指点@zhangmangui
#include "DSP2833x_Device.h"     // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h"   // DSP2833x Examples Include File
#define PHA_ON                GpioDataRegs.GPASET.bit.GPIO8 = 1                                                        //A相输出高电平
#define PHA_OFF                GpioDataRegs.GPACLEAR.bit.GPIO8 = 1                                                    //A相输出低电平
#define PHB_ON                GpioDataRegs.GPASET.bit.GPIO9 = 1                                                        //B相输出高电平
#define PHB_OFF                GpioDataRegs.GPACLEAR.bit.GPIO9 = 1                                                //B相输出低电平
#define PHC_ON                GpioDataRegs.GPASET.bit.GPIO10 = 1                                                        //C相输出高电平
#define PHC_OFF                GpioDataRegs.GPACLEAR.bit.GPIO10 = 1                                                //C相输出低电平
#define PHD_ON                GpioDataRegs.GPASET.bit.GPIO11 = 1                                                        //D相输出高电平
#define PHD_OFF                GpioDataRegs.GPACLEAR.bit.GPIO11 = 1                                                //D相输出低电平
const Uint16 StepMode1[8] = {0x0D0A,0x0D0A,0x0A0B,0x0A0B,0x0B0C,0x0B0C,0x0C0D,0x0C0D};                //单四拍时序A-B-C-D-A
void MotionControl1(void);
void delay(Uint32 t);
void PhaseOff(Uint16 i);
void PhaseOn(Uint16 i);
interrupt void cpu_timer0_isr(void);
void Init_StepMotorGpio(void)
{

        EALLOW;   
        //Phase A
        GpioCtrlRegs.GPAPUD.bit.GPIO8 = 0;                                                                           // Enable pullup on GPIO11
    GpioDataRegs.GPASET.bit.GPIO8 = 1;                                                                           // Load output latch
    GpioCtrlRegs.GPAMUX1.bit.GPIO8 = 0;                                                                          // GPIO11 = GPIO
    GpioCtrlRegs.GPADIR.bit.GPIO8 = 1;                                                                           // GPIO11 = output   
        //Phase B
        GpioCtrlRegs.GPAPUD.bit.GPIO9 = 0;                                                                           // Enable pullup on GPIO11
    GpioDataRegs.GPASET.bit.GPIO9 = 1;                                                                           // Load output latch
    GpioCtrlRegs.GPAMUX1.bit.GPIO9 = 0;                                                                          // GPIO11 = GPIO
    GpioCtrlRegs.GPADIR.bit.GPIO9 = 1;                                                                           // GPIO11 = output   
        //Phase C
        GpioCtrlRegs.GPAPUD.bit.GPIO10 = 0;                                                                           // Enable pullup on GPIO11
    GpioDataRegs.GPASET.bit.GPIO10 = 1;                                                                           // Load output latch
    GpioCtrlRegs.GPAMUX1.bit.GPIO10 = 0;                                                                          // GPIO11 = GPIO
    GpioCtrlRegs.GPADIR.bit.GPIO10 = 1;                                                                           // GPIO11 = output   
        //Phase D   
    GpioCtrlRegs.GPAPUD.bit.GPIO11= 0;                                                                           // Enable pullup on GPIO11
    GpioDataRegs.GPASET.bit.GPIO11 = 1;                                                                           // Load output latch
    GpioCtrlRegs.GPAMUX1.bit.GPIO11 = 0;                                                                          // GPIO11 = GPIO
    GpioCtrlRegs.GPADIR.bit.GPIO11= 1;                                                                           // GPIO11 = output   

    EDIS;  
        PHA_OFF;
        PHB_OFF;
        PHC_OFF;
        PHD_OFF;

}

void delay(Uint32 t)
{
        Uint32 i = 0;
        for (i = 0; i < t; i++);
}
void PhaseOn(Uint16 i)
{
        switch(i)
        {
                case 0xA:
                                PHA_ON;
                        break;

                case 0xB:
                                PHB_ON;
                        break;

                case 0xC:
                                PHC_ON;
                        break;

                case 0xD:
                                PHD_ON;                       
                        break;
                case 0x0:               
                        break;
                default:
                        break;
        }
}

void PhaseOff(Uint16 i)
{
        switch(i)
        {
                case 0xA:
                                PHA_OFF;
                        break;

                case 0xB:
                                PHB_OFF;
                        break;

                case 0xC:
                                PHC_OFF;
                        break;

                case 0xD:
                                PHD_OFF;                       
                        break;
                case 0x0:               
                        break;
                default:
                        break;
        }
}
                                                               
void MotionControl1(void)
{Uint16 loop = 0;
  while(1)
  {
          if(loop==8)
          {
                  loop=0;
          }
          else
          {
          
        PhaseOn (StepMode1[loop] & 0x000F);                                                                //第一位:控制信号高电平判断
                PhaseOn ((StepMode1[loop] & 0x00F0)>>4);                                                        //第二位:控制信号高电平判断
               
                PhaseOff((StepMode1[loop] & 0x0F00)>>8);                                                        //第三位:控制信号低电平判断
                PhaseOff((StepMode1[loop] & 0xF000)>>12);                                                        //第四位:控制信号低电平判断
               
                loop++;
          }
  }       
}

void main(void)
{

   InitSysCtrl();
   Init_StepMotorGpio();                                                               
   DINT;
   InitPieCtrl();
   IER = 0x0000;
   IFR = 0x0000;
   InitPieVectTable();
   EALLOW;
   PieVectTable.TINT0 = &cpu_timer0_isr;
   EDIS;   
   InitCpuTimers();
   ConfigCpuTimer(&CpuTimer0,0,0);
   IER |= M_INT1;
   PieCtrlRegs.PIEIER1.bit.INTx7 = 1;
   EINT;   
   ERTM;
   StartCpuTimer0();
   while(1)                                                                                               
        {
                MotionControl1();
        }

}        




interrupt void cpu_timer0_isr(void)
{
   CpuTimer0.InterruptCount++;

   PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
}

使用特权

评论回复
12
dcs123| | 2020-8-5 18:16 | 只看该作者
大神现在有调试好的程序吗

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

10

帖子

0

粉丝