打印

请教DSP问题

[复制链接]
2709|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yeluokongcheng|  楼主 | 2015-4-14 20:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
DSP, ev, pi, IO, gp
#include "DSP28_Device.h"
#include "DSP28_Ev.h"
#include "stdlib.h"  //库函数,求绝对值函数
#define P          3  //比例系数
#define I          0.35  //积分系数
unsigned int t1=0;
unsigned int pwm=18750;
unsigned int count=0;
int pwmout=0;
int expect_speed=2400;  //期望速度
int current_speed=0;     //当前速度
int CMPR1=0;
int current_position=0;   //当前采样周期位置
int adjacent_T2CNT=0;
int adjacent=0;
int T1CNT=0;
int now_position=0;
int last_position=0;      //上一次采样周期位置
int speed_error=0;        //当前速度偏差
int last_speed_error=0;    //上一次速度偏差

void InitSysCtrl()
{
   Uint16 i;
  EALLOW;            
   SysCtrlRegs.WDCR= 0x0068; // 禁止看门狗模块
   SysCtrlRegs.PLLCR = 0xA;  // 初始化PLL模块
   for(i= 0; i< 5000; i++){};// 延时,使得PLL模块能够完成初始化操作
   SysCtrlRegs.HISPCP.all = 0x0001; // HSPCLK=150/2=75MHz
   SysCtrlRegs.LOSPCP.all = 0x0002;        // LSPCLK=150/4=37.5MHz
   SysCtrlRegs.PCLKCR.bit.EVAENCLK=1;
EDIS;       
  }

void InitGpio(void)
  {

      EALLOW;
       // 将GPIO中和PWM相关的引脚设置为PWM功能
     GpioMuxRegs.GPAMUX.bit.PWM1_GPIOA0=1;     //设置PWM1引脚
     GpioMuxRegs.GPAMUX.bit.PWM2_GPIOA1=1;    //设置PWM2引脚
     GpioMuxRegs.GPAMUX.bit.PWM3_GPIOA2=1;     //设置PWM3引脚
     GpioMuxRegs.GPAMUX.bit.PWM4_GPIOA3=1;     //设置PWM4引脚
    GpioMuxRegs.GPAMUX.bit.QEP1_GPIOA8=1;        //设置光电编码QEP1引脚
    GpioMuxRegs.GPAMUX.bit.QEP2_GPIOA9=1;       //设置光电编码QEP2引脚
         EDIS;
  
  }

void InitEv(void)
  {   
   //此段是用来设置引脚为复用功能
        EvaRegs.T2CON.bit.TMODE=2;        //连续增计数模式
        EvaRegs.T2CON.bit.TPS=5;             //进行64分频
        EvaRegs.T2CON.bit.TENABLE=0;      //暂时禁止T2的计数操作
        EvaRegs.T2CON.bit.TCLKS10=0;      //使用内部时钟
        EvaRegs.T2PR=0xFFFF;                   //给T2定时器设终值
        EvaRegs.T2CNT=0x0000;                        //设置计数初值为0
         EvaRegs.CAPCONA.all=0x0000;                  //初始化捕获控制寄存器
        EvaRegs.CAP1FIFO=0x0000;          //CAP1FIFO为空
                                
         EvaRegs.CAPCONA.bit.CAP12EN=1;     //使能捕获1、2功能
        EvaRegs.CAPCONA.bit.CAP12TSEL=0;   //设置捕获单元1的定时器
        EvaRegs.CAPCONA.bit.CAP1EDGE=1;    //检测上升沿
        EvaRegs.CAPCONA.bit.CAP2EDGE=1;         
        
         EvaRegs.EVAIFRC.bit.CAP1INT=1;      //清除捕获单元1的捕获中断标志位
        EvaRegs.EVAIMRC.bit.CAP1INT=1;     //使能捕获单元1的捕获中断
                EvaRegs.EVAIFRC.bit.CAP2INT=1;      //清除捕获单元2的捕获中断标志位
       EvaRegs.EVAIMRC.bit.CAP2INT=1;     //使能捕获单元2的捕获中断
        EvaRegs.T2CON.bit.TENABLE=1; //enable  timer1
             EvaRegs.CAPCONA.bit.CAP12EN=1; //enable  cap1 cap2

         EvaRegs.CAPFIFOA.all=0x0200;
      
}

#include "DSP28_Device.h"
void main(void)
  {
   
    InitSysCtrl();  //初始化系统函数
    DINT;
    IER=0x0000;  //禁止CPU中断
    IFR=0x0000;  //清除CPU中断标志
    InitPieCtrl();  //初始化PIE控制寄存器
    InitPieVectTable();  //初始化PIE中断向量表
    InitGpio();       //初始化GPIO口
    InitEv();         //初始化EV
    PieCtrl.PIEIER2.bit.INTx4=1;  //使能PIE中断,T1定时器中断位于INT2.4
    PieCtrl.PIEIER3.bit.INTx1=1;  //使能PIE中断,T2定时器中断位于INT3.1
    IER|=M_INT2;     //开CPU中断
    EINT;             //开全局中断
    ERTM;             //开实时中断
  while(1)
    {   
    }
  }
  void T1PINT_ISR(void)    // 通用定时器T1的周期中断
  {
    T1CNT=0;
    t1++;
    if(t1==5 )    //采样周期=5ms
  {
   t1=0;
   last_position=current_position;
   current_position=EvaRegs.T2CNT;
   adjacent_T2CNT=abs(now_position-last_position);
   current_speed=(adjacent*60)/(0.003*4096);    //求当前的电机转速
   last_speed_error=speed_error;
   speed_error = expect_speed- current_speed;
   pwmout=pwmout+P*( speed_error -last_speed_error)+ speed_error*I;  //电机转速位置PI调节
   if(pwmout>18750)
      pwmout=18750;
   else if(pwmout<0)
      pwmout=0;
   else{};
   CMPR1=pwm+pwmout;     //电机正转
   PieCtrl.PIEACK.bit.ACK2=1;   //响应同组中断
   EvaRegs.EVAIFRA.bit.T1PINT=1;//清除T1同期中断标志位
   IER|=M_INT2;     //开CPU中断
   EINT;                        //开全局中断
   ERTM;                      //开实时中断                  
       }
}
   void T2PINT_ISR(void)     //通用定时器2的周期中断
  {
   count++;
   if(count==200)        //当电机正转10秒时
  {
   CMPR1=pwm;  //PWM1与PWM2的占空比都为50%,此时电机停转
   count=0;

  }
   PieCtrl.PIEACK.bit.ACK2=1;   //响应同组中断
   EvaRegs.EVAIFRB.bit.T2PINT=1;//清除T2周期中断标志位
   EINT; //开全局中断
}
DSP2812编程调试时出现这个错误error: struct "EVA_REGS" has no field "CAPCONA",请问这是什么原因







相关帖子

沙发
海中水| | 2015-4-15 09:30 | 只看该作者
仔细看一下头文件有没有问题吧!我这里查看一下我的头文件,按照你写的应该是没有问题的。你仔细的查看一下你的相关头文件。

使用特权

评论回复
板凳
WYT440| | 2015-4-15 11:12 | 只看该作者
查一下你的 struct "EVA_REGS"里面有没有定义union CAPCONA_REG  CAPCONA;

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
海中水 + 1 赞一个!
地板
海中水| | 2015-4-15 15:39 | 只看该作者
楼上说的不错。

使用特权

评论回复
5
yeluokongcheng|  楼主 | 2015-4-15 19:09 | 只看该作者
海中水 发表于 2015-4-15 09:30
仔细看一下头文件有没有问题吧!我这里查看一下我的头文件,按照你写的应该是没有问题的。你仔细的查看一下 ...

查看了,是没有问题的,因为都是直接引用别人定义好的头文件

使用特权

评论回复
6
yeluokongcheng|  楼主 | 2015-4-15 19:21 | 只看该作者
上面的问题解决了,但是现在出现这个问题 (已经把rts2800n.lib添加到程序里了)
undefined         first referenced                                          
  symbol               in file                                                
---------         ----------------                                          
_EvaRegs          C:\\CCStudio_v3.3PLA\\MyProjects\\bishe8\\Debug\\bishe1.obj
_GpioMuxRegs      C:\\CCStudio_v3.3PLA\\MyProjects\\bishe8\\Debug\\bishe1.obj
_InitPieCtrl      C:\\CCStudio_v3.3PLA\\MyProjects\\bishe8\\Debug\\bishe1.obj
_InitPieVectTable C:\\CCStudio_v3.3PLA\\MyProjects\\bishe8\\Debug\\bishe1.obj
_PieCtrl          C:\\CCStudio_v3.3PLA\\MyProjects\\bishe8\\Debug\\bishe1.obj
_SysCtrlRegs      C:\\CCStudio_v3.3PLA\\MyProjects\\bishe8\\Debug\\bishe1.obj

error: unresolved symbols remain
error: errors encountered during linking; "./Debug/bishe8.out" not built

>> Compilation failure

使用特权

评论回复
7
WYT440| | 2015-4-16 09:41 | 只看该作者
yeluokongcheng 发表于 2015-4-15 19:21
上面的问题解决了,但是现在出现这个问题 (已经把rts2800n.lib添加到程序里了)
undefined         first  ...

这些个symbol你没有定义吧。。。要不就是你定义了,相应的头文件没有包含进来,查一下从哪里定义的,把源
文件加进来

使用特权

评论回复
8
海中水| | 2015-4-16 10:08 | 只看该作者
你用的是什么版本的编译器,你好像是自定义的头文件路径,但是都文件路径又没有加进来。

使用特权

评论回复
9
海中水| | 2015-4-16 10:08 | 只看该作者
yeluokongcheng 发表于 2015-4-15 19:21
上面的问题解决了,但是现在出现这个问题 (已经把rts2800n.lib添加到程序里了)
undefined         first  ...

怎么解决的可否分享一下。

使用特权

评论回复
10
yeluokongcheng|  楼主 | 2015-4-16 21:28 | 只看该作者
海中水 发表于 2015-4-16 10:08
你用的是什么版本的编译器,你好像是自定义的头文件路径,但是都文件路径又没有加进来。 ...

3.3的

使用特权

评论回复
11
yeluokongcheng|  楼主 | 2015-4-16 21:28 | 只看该作者
海中水 发表于 2015-4-16 10:08
怎么解决的可否分享一下。

还没有解决

使用特权

评论回复
12
海中水| | 2015-4-16 21:32 | 只看该作者
添加CMD文件了吗?还有有一个全局变量的文件,仔细查看一下。

使用特权

评论回复
13
SilentLove| | 2015-4-18 13:00 | 只看该作者
这种问题只有两种情况   一个是你 .h文件没有添加完全   一个就是你的 .Lib文件不对

使用特权

评论回复
14
小晴空| | 2016-6-8 10:15 | 只看该作者
亲,能把程序共享一下吗

使用特权

评论回复
15
小晴空| | 2016-6-8 10:44 | 只看该作者
为什么我用这个测插上CAP1 CAP2 引脚采不到速度呢

使用特权

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

本版积分规则

1

主题

5

帖子

0

粉丝