打印
[DSP编程]

串口控制步进电机切换运动模式,第一次有效,之后无效

[复制链接]
1123|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
mrliu121|  楼主 | 2016-10-15 23:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一、主函数:如下,利用串口助手给DSP2812发送1,2,3,4,5,6;SCIA接收,发送中断函数中对步进电机模式进行切换,有六种模式,单步(正/反),双步(正/反),八拍(正/反),同时数码管显示当前模式数字。编译显示无错误,第一次发送任意数字时电机能正确切换到设定模式,第二次发送其他数不能接收,无反应。也不知道为啥?恳请高手指点

#include "DSP28_Device.h"
unsigned int Sci_VarRx[100];  //用于存放接收到的数据,"hellodsp"一共8个字符
unsigned int i;
unsigned int j;              
//unsigned int Send_Flag;       //发送标志位。1:有数据需要发送 0:无数据需要发送
#define led_7seg (*((unsigned int *)0x002400))
unsigned int aa;

/****************************************************************************/
const Uint16 Forward_direction1[]={0x20,0x30,0x10,0x18,0x08,0x0A,0x04,0x21};/*逆时针  四相,八拍*/
const Uint16 Forward_direction2[]={0x20,0x10,0x08,0x04};/*逆时针  单四拍*/
const Uint16 Forward_direction3[]={0x30,0x18,0x0A,0x21};/*逆时针  单四拍*/
const Uint16 aLED[10]={0x0024,0x00af,0x0094,0x8c,0x00f,0x4c,0x044,0x0ae,0x004,0x0c};
/****************************************************************************/
int ii=0;
long tt=1300;
void delay(Uint16 data)//步进电机延时
        {
                Uint16 jj=0;
                int kk=0;
                for(jj=0;jj<data;jj++)
                {
                        for(kk=0;kk<20;kk++);
                }
        }

/****************************************************************************
*
*名    称:main()
*
*功    能:完成初始化工作,并采用查询方式实现SCIA的发送和接收功能,同时切换电机运动模式电机

****************************************************************************/

void main(void)
{
        InitSysCtrl();  //初始化系统函数

        DINT;
        IER = 0x0000;   //禁止CPU中断
        IFR = 0x0000;   //清除CPU中断标志
       
        InitPieCtrl();  //初始化PIE控制寄存器
        PieCtrl.PIEIER9.bit.INTx1=1;
        PieCtrl.PIEIER9.bit.INTx2=1;

        InitPieVectTable();  //初始化PIE中断向量表         
       
        InitGpio();  //初始化Gpio口
       
        InitPeripherals(); //初始化SCIA
        InitSci();
       
    for(i = 0; i < 100; i++)  //初始化数据变量
    {
            Sci_VarRx = 0;
    }

        i = 0;
   /*         j = 1;

    Send_Flag = 0;*/

    IER|=M_INT9;  //开CPU中断

    EINT;  //开全局中断
    ERTM;  //开全局实时中断
           
        for(;;)
        {

        }

}

/****************************************************************************
*步进电机模式,正向四相四拍,四相八拍,半步;反向。。。。
****************************************************************************/
void Forward1(void)
{
        for(;;)
        {
        for(ii=0;ii<8;ii++)
     {
        GpioDataRegs.GPADAT.all=Forward_direction1[ii];
        delay(tt);
     } //等待中断
        }
}
void Backward1(void)
{
        for(;;)
        {
        for(ii=7;ii>=0;ii--)
     {
        GpioDataRegs.GPADAT.all=Forward_direction1[ii];
        delay(tt);
     } //等待中断
        }
}
/********************************************/
void Forward2(void)
{
        for(;;)
        {
                for(ii=0;ii<4;ii++)
     {
        GpioDataRegs.GPADAT.all=Forward_direction2[ii];
        delay(tt);
     } //等待中断
        }
}
void Backward2(void)
{
        for(;;)
        {
                for(ii=3;ii>=0;ii--)
     {
        GpioDataRegs.GPADAT.all=Forward_direction2[ii];
        delay(tt);
     } //等待中断
        }
}
/**************************************************/
void Forward3(void)
{
        for(;;)
        {
        for(ii=0;ii<4;ii++)
     {
        GpioDataRegs.GPADAT.all=Forward_direction3[ii];
        delay(tt);
     } //等待中断
        }
}
void Backward3(void)
{
        for(;;)
        {
        for(ii=3;ii>=0;ii--)
     {
        GpioDataRegs.GPADAT.all=Forward_direction3[ii];
        delay(tt);
     } //等待中断
        }
}
//===========================================================================
// No more.
//===========================================================================       
二.中断函数
interrupt void SCIRXINTA_ISR(void)     // SCI-A接收中断函数
{

          Sci_VarRx= SciaRegs.SCIRXBUF.all; //接收数据
          SciaRegs.SCITXBUF=Sci_VarRx; //启动第一次发送,然后才能使用发送中断
          aa=Sci_VarRx;
          led_7seg=aLED[aa];
          if(Sci_VarRx==1)
          {
                  Forward1();
          }
          if(Sci_VarRx==2)
          {
                  Backward1();
           }
          if(Sci_VarRx==3)
           {
                  Forward2();
           }
          if(Sci_VarRx==4)
           {
                  Backward2();
           }
          if(Sci_VarRx==5)
           {
                  Forward3();
           }
          if(Sci_VarRx==6)
           {
                  Backward3();
           }
    PieCtrl.PIEACK.all=0x0100;  //使得同组其他中断能够得到响应
    EINT;  //开全局中断vcc

}

/****************************************************************************
*
*名    称:SCITXINTA_ISR()
*
*功    能:发送中断函数
*
*入口参数:无
*
*出口参数:无
*
****************************************************************************/

interrupt void SCITXINTA_ISR(void)     // SCI-A发送中断函数
{

        i++;
        if(i>100)
        {i=0;}
    PieCtrl.PIEACK.all=0x0100;  //使得同组其他中断能够得到响应
    EINT;  //开全局中断

    //SCITXBUF中的数据移入TXSHF寄存器,将数据发送出去,TXRDY标志位置1
}


三。初始化函数

系统初始化
void InitSysCtrl(void)
{
   Uint16 i;
   EALLOW;

// 对于TMX产品,为了能够使得片内RAM模块M0/M1/L0/L1LH0能够获得最好的性能,控制寄存器的位
// 必须使能,这些位在设备硬件仿真寄存器内。TMX是TI的试验型产品
   DevEmuRegs.M0RAMDFT = 0x0300;
   DevEmuRegs.M1RAMDFT = 0x0300;
   DevEmuRegs.L0RAMDFT = 0x0300;
   DevEmuRegs.L1RAMDFT = 0x0300;
   DevEmuRegs.H0RAMDFT = 0x0300;


// 禁止看门狗模块
   SysCtrlRegs.WDCR= 0x0068;

// 初始化PLL模块
   SysCtrlRegs.PLLCR = 0xA;  //如果外部晶振为30M,则SYSCLKOUT=30*10/2=150MHz
// 延时,使得PLL模块能够完成初始化操作
   for(i= 0; i< 5000; i++){}

// 高速时钟预定标器和低速时钟预定标器,产生高速外设时钟HSPCLK和低速外设时钟LSPCLK
   SysCtrlRegs.HISPCP.all = 0x0001; // HSPCLK=150/2=75MHz
   SysCtrlRegs.LOSPCP.all = 0x0002;        // LSPCLK=150/4=37.5MHz

// 对工程中使用到的外设进行时钟使能
// SysCtrlRegs.PCLKCR.bit.EVAENCLK=1;
// SysCtrlRegs.PCLKCR.bit.EVBENCLK=1;
   SysCtrlRegs.PCLKCR.bit.SCIENCLKA=1;  // SCIA模块时钟使能
// SysCtrlRegs.PCLKCR.bit.SCIENCLKB=1;
                               
   EDIS;
       
}

GPIO初始化
void InitGpio(void)
{

     EALLOW;

     GpioMuxRegs.GPFMUX.bit.SCITXDA_GPIOF4=1;  //设置SCIA的发送引脚
     GpioMuxRegs.GPFMUX.bit.SCIRXDA_GPIOF5=1;  //设置SCIA的接收引脚
     GpioMuxRegs.GPAMUX.all=0;
     GpioMuxRegs.GPADIR.all=0xffff;

     EDIS;

}
SCI        初始化

void InitSci(void)
{
        SciaRegs.SCICCR.bit.STOPBITS=0;        //1位停止位
        SciaRegs.SCICCR.bit.PARITYENA=0;       //禁止极性功能
        SciaRegs.SCICCR.bit.LOOPBKENA=0;       //禁止回送测试模式功能
        SciaRegs.SCICCR.bit.ADDRIDLE_MODE=0;   //空闲线模式
        SciaRegs.SCICCR.bit.SCICHAR=7;         //8位数据位
       
        SciaRegs.SCICTL1.bit.TXENA=1;          //SCIA模块的发送使能
        SciaRegs.SCICTL1.bit.RXENA=1;          //SCIA模块的接收使能
       
        SciaRegs.SCIHBAUD=0;
        SciaRegs.SCILBAUD=0xF3;                //波特率为19200       
       
        SciaRegs.SCICTL2.bit.RXBKINTENA=1;     //SCIA模块接收中断使能
        SciaRegs.SCICTL2.bit.TXINTENA=1;       //SCIA模块发送中断使能
       
        SciaRegs.SCICTL1.bit.SWRESET=1;        //重启SCI
}

中断控制初始化
void InitPieCtrl(void)
{
        // 禁止PIE模块
        PieCtrl.PIECRTL.bit.ENPIE = 0;

        // 禁止PIE所有中断
        PieCtrl.PIEIER1.all = 0;
        PieCtrl.PIEIER2.all = 0;
        PieCtrl.PIEIER3.all = 0;       
        PieCtrl.PIEIER4.all = 0;
        PieCtrl.PIEIER5.all = 0;
        PieCtrl.PIEIER6.all = 0;
        PieCtrl.PIEIER7.all = 0;
        PieCtrl.PIEIER8.all = 0;
        PieCtrl.PIEIER9.all = 0;
        PieCtrl.PIEIER10.all = 0;
        PieCtrl.PIEIER11.all = 0;
        PieCtrl.PIEIER12.all = 0;

        // 清除所有PIEIFR的中断标志位
        PieCtrl.PIEIFR1.all = 0;
        PieCtrl.PIEIFR2.all = 0;
        PieCtrl.PIEIFR3.all = 0;       
        PieCtrl.PIEIFR4.all = 0;
        PieCtrl.PIEIFR5.all = 0;
        PieCtrl.PIEIFR6.all = 0;
        PieCtrl.PIEIFR7.all = 0;
        PieCtrl.PIEIFR8.all = 0;
        PieCtrl.PIEIFR9.all = 0;
        PieCtrl.PIEIFR10.all = 0;
        PieCtrl.PIEIFR11.all = 0;
        PieCtrl.PIEIFR12.all = 0;

        // 使能PIE模块
        PieCtrl.PIECRTL.bit.ENPIE = 1;
        PieCtrl.PIEACK.all = 0xFFFF;
}       




相关帖子

沙发
mrliu121|  楼主 | 2016-10-16 10:36 | 只看该作者
采用的中断方式,注释里写错了

使用特权

评论回复
板凳
mrliu121|  楼主 | 2016-10-24 12:20 | 只看该作者
好心酸,没有解决,帖子快要沉了。。。

使用特权

评论回复
地板
blue_lj| | 2016-10-25 00:32 | 只看该作者
    有可能是ESD没有做好(步进电机功率多大,带光耦么),电机启动后,造成强干扰,程序跑飞了。不接电机的情况下,通过串口发送数据,看显示屏能否正常切换。
    编程序最好遵循“小步快跑”的原则,一小步调试成功后,再调试下一步,出了问题,可以马上回到前一步。一下子写太多,可能就是少了一个符号,你也得查半天。

使用特权

评论回复
5
mrliu121|  楼主 | 2016-10-30 16:08 | 只看该作者
blue_lj 发表于 2016-10-25 00:32
有可能是ESD没有做好(步进电机功率多大,带光耦么),电机启动后,造成强干扰,程序跑飞了。不接电机的 ...

谢谢您的解答

使用特权

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

本版积分规则

1

主题

4

帖子

0

粉丝