求大神看一下,为什么我插上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)
{
}
}
|