主题中讨论的其他器件:C2000WARE
工具/软件:TI C/C++编译器
我 使用2个外部中断来查找编码器覆盖的距离,并使用40赫兹的计时器来运行 pid 以保持某种恒定速度。 如果 THR 输入超过某个速度、则不会响应。
CPU_enableInt (myCpu、CPU_IntNumber_1)由中断和计时器使用。 这会是个问题吗?
这是代码的大纲-
#include "DSP28x_Project.h"
#include "common/include/adc.h"
#include "common/include/clk.h"
#include "common/include/flash.h"
#include "common/include/gpio.h"
#include "common/include/pie.h"
#include "common/include/pll.h"
#include "common/include/cap。h"
#include "common/include/wdog.h"
#include "common/include/timer.h"
#include "IQmathLib.h"
#define RANGE_SPEED 2500
//
_interrupt void XINT1_ISR (void);
_interrupt void XINT2_ISR (void);
_interrupt void CPU_timer0_ISR (void);
//
//函数原型
//
void scia_echoback_init (void);
void scia_fifo_init (void);
void scia_xmit (int a);
void scia_msg (char * msg);
uint16_t 方向= 0;
无符号长整型 CMD;
浮动 ASD;
adc_handle myAdc;
clk_handle myClk;
Flash_handle myFlash;
GPIO_Handle myGpio;
PIE_Handle myPie;
Timer_handle myTimer;
//
//全局
//
uint16 ReceivedChar=0;
uint32_t pwmdata=0、pwm1=0;
6个采样时的#define delay (CPU_RAM/1000*6*510)//Qual 周期
易失性有符号短查找= 0;///<find encoder direction
带符号长 iAngle = 0、StartAngleTraveled=0、TotalAngle=0、PreviAngle=0、Speed=0、targetAngle=0;<curent position wrt initial position
int Acceleration = 2;
uint16_t gpiodata1、gpiodata2;
unsigned char AB = 0;///<read encoder pins
unsigned char pidflag=0、flag=1;
//float Kp、ki、Kd、PreviousValue;
//int MAX_SPE=100;
int32_t sumerror、differror、error、previouserror;
signed long MAX_SPE=0、PREV_MAX_SPE=0、savedangle、savedpreviangle、SpeedActual=0、up;
静态有符号长整型计数器=0;
float pidpwm;
typedef 结构体{_iq Cmd;//输入:基准输入
_IQ FBK;//输入:反馈输入
_IQ Err;//变量:错误
_IQ Kp;//参数:比例增益
_IQ 向上;//变量:比例输出
_IQ UI;//变量:积分输出
_iq UD;//变量:微分输出
_IQ OutPreSat;//变量:预饱和输出
_IQ OutMax;//参数:最大输出
_IQ OutMin;//参数:最小输出
_IQ out;//输出:PID 输出
_IQ SatErr;//变量:饱和差
_IQ Ki;//参数:积分增益
_IQ KC;//参数:积分校正增益
_IQ Kd;//参数:微分增益
_IQ UP1;//历史记录:之前的比例输出
} PIDREG3;
typedef PIDREG3 * PIDREG3_Handle;
#define PIDREG3_DEFAULTS{0、\
0、\
0、\
_IQ (0.2)、\
0、\
0、\
0、\
0、\
_iq (+1000)、\
_iq (-1000)、\
0、\
0、\
_IQ (0.0)、\
_IQ (0.0)、\
_IQ (0.0)、\
0、\
}
PIDREG3电机= PIDREG3_DEFAULTS;
//
//主函
//
CAP_Handle myCap;
void main (void)
{
char *msg;
cpu_handle myCpu;
pll_handle myPll;
WDOG_Handle myWDog;
//
//初始化此应用程序所需的所有句柄
//
myAdc = ADC_init ((void *) ADC_base_ADDR、sizeof (ADC_Obj));
myClk = CLK_init ((void *) CLK_base_ADDR、sizeof (CLK_Obj));
myCpu = cpu_init ((void *) NULL、sizeof (cpu_Obj));
myFlash = flash_init ((void *) flash_base_ADDR、sizeof (flash_Obj));
myGpio = GPIO_init ((void *) GPIO_base_ADDR、sizeof (GPIO_Obj));
myPie = PI_init ((void *) PIE_BASE_ADDR、sizeof (PIE_Obj));
myPll = PLL_init ((void *) PLL_base_ADDR、sizeof (PLL_Obj));
myCap = cap_init ((void *) CAPA_base_ADDR、sizeof (cap_Obj));
myWdDog = WDOG_INIT ((void *) WDOG_BASE_ADDR、sizeof (WDOG_Obj));
myTimer = TIMER_INIT ((void *) TIMER0_BASE_ADDR、sizeof (timer_Obj));
//
//执行基本系统初始化
//
WDOG_DISABLE (myWDog);
CLK_enableAdcClock (myClk);
(*Device_cal)();
// clk_disableAdcClock (myClk);
//
//选择内部振荡器1作为时钟源
////
CLK_setOscSrc (myClk、CLK_OscSrc_Internal);
//
//将 PLL 设置为 x10 /2、这将产生50MHz = 10MHz * 10/2
//
PLL_setup (myPll、PLL_Multiplier_10、PLL_DivideSelect_CLKIN_BY_2);
//
//禁用 PIE 和所有中断
//
PIE_DISABLE (myPie);
PI_DisableAllInts (myPie);
CPU_disableGlobalInts (myCpu);
CPU_clearIntFlags (myCpu);
//
#ifdef _flash
memcpy (&RamfuncsRunStart、&RamfuncsLoadStart、(size_t)&RamfuncsLoadSize);
#endif
//
//步骤1. 初始化系统控制:
// PLL、安全装置、启用外设时钟
//此示例函数位于 F2802x_sysctrl.c 文件中。
//
InitSysCtrl();
//
//步骤2. 初始化 GPIO:
//此示例函数位于 F2802x_GPIO.c 文件和中
//说明了如何将 GPIO 设置为其默认状态。
//
InitGpio();
//
//对于这个示例、只初始化针对 SCI-A 端口的引脚。
//此函数位于 F2802x_Sci.c 文件中。
//
InitSciaGpio();
//
//步骤3. 清除所有中断并初始化 PIE 矢量表:
//禁用 CPU 中断
//
Dint;
//
//将 PIE 控制寄存器初始化为默认状态。
//默认状态为禁用所有 PIE 中断和标志
//被清除。
//此函数位于 F2802x_PIECTRL.c 文件中。
//
InitPieCtrl();
//
//禁用 CPU 中断并清除所有 CPU 中断标志
//
IER = 0x0000;
IFR = 0x0000;
//
//使用指向 shell 中断的指针初始化 PIE 矢量表
//服务例程(ISR)。
//这将填充整个表,即使是中断也是如此
//在本例中未使用。 这对于调试很有用。
//可以在 F2802x_DefaultIsr.c 中找到 shell ISR 例程
//此函数可在 F2802x_PieVect.c 中找到
//
InitPieVectTable();
EnableInterrupts();
//
//步骤4. 初始化所有器件外设
//此示例不需要
//
//
//步骤5. 特定于用户的代码
//
InitCpuTimer();
GPIO_setPullUp (myGpio、GPIO_Number_19、GPIO_PULLUP_Enable);
GPIO_setQualification (myGpio、GPIO_Number_19、GPIO_QUAL_Sync);
GPIO_setMode (myGpio、GPIO_Number_19、GPIO_19_Mode_ECAP1);
GPIO_setMode (myGpio、GPIO_Number_34、GPIO_34_Mode_generalpurpose);
GPIO_setDirection (myGpio、GPIO_Number_34、GPIO_Direction_Output);
GPIO_setPullUp (myGpio、GPIO_Number_34、GPIO_PULLUP_Enable);
PI_setDebugIntVectorTable (myPie);
PIE_ENABLE (myPie);
CLK_enableEcap1Clk (myClk);
CAP_setModeApwm (myCap);//启用 APWM 模式
CAP_setApwmPeriod (myCap、0x9C4);//设置周期值
// cap_setAppwmCompare (myCap、0x4E2);//设置比较值
CAP_clearInt (myCap、CAP_Int_Type_All);//清除暂挂中断
CAP_enableInt (myCap、CAP_Int_Type_CTR_CMP);//启用比较等效整型
// scia_fifo_init();//初始化 SCI FIFO
// scia_echoback_init ();//初始化用于 echoback 的 SCI
//
//启动计数器
//
CAP_enableTimestampCounter (myCap);
PI_registerPieIntHandler (myPie、PI_GroupNumber_1、PI_SubGroupNumber_7、
(intvec_t)&cpu_timer0_isr);
//
//将 CPU 定时器0配置为每500毫秒中断一次:
// 60MHz CPU 频率,50毫秒周期(以 uSeconds 为单位)
//
//ConfigCpuTimer (&CpuTimer0、60、50000);
//
Timer_stop (myTimer);
Timer_setPeriod (myTimer、1250000);
Timer_setPrescaler (myTimer、0);
Timer_reload (myTimer);
Timer_setEmulationMode (myTimer、
Timer_EmulationMode_StopAfterNextDecrement);
Timer_enableInt (myTimer);
Timer_start (myTimer);
//
PI_registerPieIntHandler (myPie、PI_GroupNumber_1、PI_SubGroupNumber_4、
(intvec_t)&XINT1_ISR);
PI_registerPieIntHandler (myPie、PI_GroupNumber_1、PI_SubGroupNumber_5、
(intvec_t)&XINT2_ISR);
PI_enableInt (myPie、PI_GroupNumber_1、PI_InterruptSource_XINT_1);
PI_enableInt (myPie、PI_GroupNumber_1、PI_InterruptSource_XINT_2);
CPU_enableInt (myCpu、CPU_IntNumber_1);
//
PIE_enableTimer0Int (myPie);
//
//启用全局中断
//
cpu_enableGlobalInts (myCpu);
// cpu_enableDebugInt (myCpu);
//
// GPIO0和 GPIO1是输入
//
GPIO_setMode (myGpio、GPIO_Number_6、GPIO_6_Mode_generalpurpose);
GPIO_setDirection (myGpio、GPIO_Number_6、GPIO_Direction_Input);
GPIO_setQualification (myGpio、GPIO_Number_6、GPIO_QUAL_Sample_3);
GPIO_setMode (myGpio、GPIO_Number_7、GPIO_7_Mode_generalpurpose);
GPIO_setDirection (myGpio、GPIO_Number_7、GPIO_Direction_Input);
GPIO_setQualification (myGpio、GPIO_Number_7、GPIO_QUAL_Sample_3);
GPIO_setQualificationPeriod (myGpio、GPIO_Number_7、0x80);
GPIO_setQualificationPeriod (myGpio、GPIO_Number_6、0x80);
//
// GPIO0是 XINT1、GPIO1是 XINT2
//
GPIO_setExtInt (myGpio、GPIO_Number_6、CPU_ExtIntNumber_1);
GPIO_setExtInt (myGpio、GPIO_Number_7、CPU_ExtIntNumber_2);
//
//配置 XINT1
//
PI_setExtIntPolarity (myPie、CPU_ExtIntNumber_1、
PI_ExtIntPolarity_RisingAndFallingEdge);
PI_setExtIntPolarity (myPie、CPU_ExtIntNumber_2、
PI_ExtIntPolarity_RisingAndFallingEdge);
//
//启用 XINT1和 XINT2
//
PI_enableExtInt (myPie、CPU_ExtIntNumber_1);
PI_enableExtInt (myPie、CPU_ExtIntNumber_2);
MSG ="\r\n\n\nHello World!\0";
scia_msg (msg);
MSG ="\r\n 您将输入一个字符、DSP 将回显它!\n\n";
scia_msg (msg);
for (;;)
{
//
//等待 inc 字符
//
while (SciaRegs.SCIFFRX.bit.RXFFST!= 1)
{
//主计算
}
}
//
// scia_echoback_init -测试1、SCIA DLB、8位字、波特率0x000F、默认值
// 1个停止位,无奇偶校验
//
无效
scia_echoback_init ()
{
//
//注意:SCIA 外设的时钟被打开
//在 InitSysCtrl()函数中
//
//
// 1停止位,无回送,无奇偶校验,8个字符位,异步模式,
//空闲线协议
//
SciaRegs.SCICCR.all =0x0007;
//
//启用 TX、RX、内部 SCICLK、禁用 RX ERR、睡眠、 TXWAKE
//
SciaRegs.SCICTL1.all =0x0003;
SciaRegs.SCICTL2.all =0x0003;
SciaRegs.SCICTL2.bit.TXINTENA=1;
SciaRegs.SCICTL2.bit.RXBKINTENA=1;
//
// SCI BRR = LSPCLK/(SCI BAUDx8)- 1.
//
#IF (CPU_FRQ_60MHz)
SciaRegs.SCIHBAUD = 0x0000;// 9600 baud @LSPCLK = 15MHz (60MHz SYSCLK)
SciaRegs.SCILBAUD = 0x00C2;
#Elif (CPU_FRQ_50MHz)
SciaRegs.SCIHBAUD = 0x0000;// 9600 baud @LSPCLK = 12.5MHz (50MHz SYSCLK)
SciaRegs.SCILBAUD = 0x00A1;
#Elif (CPU_FRQ_40MHz)
SciaRegs.SCIHBAUD = 0x0000;// 9600 baud @LSPCLK = 10MHz (40MHz SYSCLK)
SciaRegs.SCILBAUD = 0x0081;
#endif
SciaRegs.SCICTL1.all =0x0023;//从复位中撤回 SCI
}
//
// scia_xmit -从 SCI 发送一个字符
//
无效
scia_xmit (int a)
{
while (SciaRegs.SCIFFTX.bit.TXFFST!= 0)
{
}
SciaRegs.SCITXBUF=A;
}
//
// scia_msg -
//
无效
scia_msg (char * msg)
{
int i;
I = 0;
while (msg[i]!='\0')
{
scia_xmit (msg[i]);
i++;
}
}
//
// scia_fifo_init -初始化 SCI FIFO
//
无效
scia_fifo_init()
{
SciaRegs.SCIFFTX.All=0xE040;
SciaRegs.SCIFFRX.All=0x2044;
SciaRegs.SCIFFCT.All=0x0;
}
//
// XINT1_ISR -
//
_interrupt void
XINT1_ISR (空)
{
}
//
// XINT2_ISR -
//
_interrupt void
XINT2_ISR (空)
{
}
_interrupt void
CPU_timer0_ISR (空)
{
}
//
//文件结束
//