打印

2812霍尔编码器测速

[复制链接]
1018|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
小晴空|  楼主 | 2016-6-8 10:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
求大神看一下,为什么我插上CAP1 CAP2引脚,速度就是不变呢

//###########################################################################
//
// FILE:   Example_281xEvPwm.c
//
// TITLE:  EV事件管理器产生PWM波实验
//
//*功  能:PWM1和PWM2输出频率为1KHz的PWM波形。波形的占空比每隔1s变化5%,范围在10%
//*        到90%之间。
//*
//*说  明:EVA下面的通用定时器T1工作于连续增/减计数模式,产生对称的PWM波形。通过
//*        T1的周期中断来计时,每隔1s钟改变1次占空比。死区时间为4.27us。
//         
//
//###########################################################################
// 释放日期: 20150206
//###########################################################################

#include "DSP281x_Device.h"     // DSP281x Headerfile Include File
#include "DSP281x_Examples.h"   // DSP281x Examples Include File


#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 T1PINT(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;     //电机正转
PieCtrlRegs.PIEACK.bit.ACK2=1;   //响应同组中断
EvaRegs.EVAIFRA.bit.T1PINT=1;//清除T1同期中断标志位
IER|=M_INT2;     //开CPU中断
EINT;                        //开全局中断
ERTM;                      //开实时中断
     }
}

void T2PINT(void)     //通用定时器2的周期中断
{
count++;
if(count==200)        //当电机正转10秒时
{
CMPR1=pwm;  //PWM1与PWM2的占空比都为50%,此时电机停转
count=0;

}
PieCtrlRegs.PIEACK.bit.ACK2=1;   //响应同组中断
EvaRegs.EVAIFRB.bit.T2PINT=1;//清除T2周期中断标志位
EINT; //开全局中断
}
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.CAP1Q1_GPIOA8=1;       //设置光电编码QEP1引脚
     GpioMuxRegs.GPAMUX.bit.CAP2Q2_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;

}
void main(void)
  {

    InitSysCtrl();  //初始化系统函数
    DINT;
    IER=0x0000;  //禁止CPU中断
    IFR=0x0000;  //清除CPU中断标志
    InitPieCtrl();  //初始化PIE控制寄存器
    InitPieVectTable();  //初始化PIE中断向量表
    InitGpio();       //初始化GPIO口
    InitEv();         //初始化EV
    PieCtrlRegs.PIEIER2.bit.INTx4=1;  //使能PIE中断,T1定时器中断位于INT2.4
    PieCtrlRegs.PIEIER3.bit.INTx1=1;  //使能PIE中断,T2定时器中断位于INT3.1
    IER|=M_INT2;     //开CPU中断
    IER|=M_INT3;
    EINT;             //开全局中断
    ERTM;             //开实时中断
  while(1)
    {
    }
  }

相关帖子

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

本版积分规则

4

主题

13

帖子

0

粉丝