📄 example_281xevpwm.c
字号:
#include "DSP281x_Device.h" // DSP281x Headerfile Include File
#include "DSP281x_Examples.h" // DSP281x Examples Include File
// Prototype statements for functions found within this file.
interrupt void eva_timer1_isr(void);
interrupt void eva_timer2_isr(void);
void init_eva(void);
Uint32 EvaTimer1InterruptCount;
Uint32 EvaTimer2InterruptCount;
//延时30度
void delay(void)
{
//EvaRegs.T2CON.bit.TENABLE = 1;
EvaRegs.T2CON.all = 0x0a42;
//EvaRegs.T2CON.bit.TECMPR = 1;
while(EvaTimer2InterruptCount != 10);
EvaTimer2InterruptCount = 0;
//EvaRegs.T2CON.bit.TENABLE = 0;
EvaRegs.T2CON.all = 0x0a00;
//EvaRegs.T2CON.bit.TECMPR = 0;
}
/*
void InitCAP(void)
{
EvaRegs.CAP1FIFO=0x0000;
EvaRegs.CAPFIFOA.all = 0x0000;
EvaRegs.CAPCONA.all = 0x0280; //捕获单元1为检测上升沿,选择Timer1为时钟,禁止捕捉单元1和2
EvaRegs.EVAIMRC.bit.CAP1INT = 0;//屏蔽CAP1的外设中断请求
// EvaRegs.T1CON.all = 0x0a42;
}
*/
//发10个小脉冲总长为30度
void purpose1(void)
{
EvaRegs.ACTRA.all = 0x0401;
EvaRegs.T1CON.bit.TECMPR = 1;
EvaRegs.T1CON.bit.TENABLE = 1;
while(EvaTimer1InterruptCount !=10);
EvaTimer1InterruptCount = 0;
EvaRegs.T1CON.bit.TECMPR = 0;
EvaRegs.T1CON.bit.TENABLE = 0;
}
void purpose2(void)
{
EvaRegs.ACTRA.all = 0x0005;
EvaRegs.T1CON.bit.TECMPR = 1;
EvaRegs.T1CON.bit.TENABLE = 1;
while(EvaTimer1InterruptCount !=10);
EvaTimer1InterruptCount = 0;
EvaRegs.T1CON.bit.TECMPR = 0;
EvaRegs.T1CON.bit.TENABLE = 0;
}
void purpose3(void)
{
EvaRegs.ACTRA.all = 0x0014;
EvaRegs.T1CON.bit.TECMPR = 1;
EvaRegs.T1CON.bit.TENABLE = 1;
while(EvaTimer1InterruptCount !=10);
EvaTimer1InterruptCount = 0;
EvaRegs.T1CON.bit.TECMPR = 0;
EvaRegs.T1CON.bit.TENABLE = 0;
}
void purpose4(void)
{
EvaRegs.ACTRA.all = 0x0050;
EvaRegs.T1CON.bit.TECMPR = 1;
EvaRegs.T1CON.bit.TENABLE = 1;
while(EvaTimer1InterruptCount !=10);
EvaTimer1InterruptCount = 0;
EvaRegs.T1CON.bit.TECMPR = 0;
EvaRegs.T1CON.bit.TENABLE = 0;
}
void purpose5(void)
{
EvaRegs.ACTRA.all = 0x0140;
EvaRegs.T1CON.bit.TECMPR = 1;
EvaRegs.T1CON.bit.TENABLE = 1;
while(EvaTimer1InterruptCount !=10);
EvaTimer1InterruptCount = 0;
EvaRegs.T1CON.bit.TECMPR = 0;
EvaRegs.T1CON.bit.TENABLE = 0;
}
void purpose6(void)
{
EvaRegs.ACTRA.all = 0x0500;
EvaRegs.T1CON.bit.TECMPR = 1;
EvaRegs.T1CON.bit.TENABLE = 1;
while(EvaTimer1InterruptCount !=10);
EvaTimer1InterruptCount = 0;
EvaRegs.T1CON.bit.TECMPR = 0;
EvaRegs.T1CON.bit.TENABLE = 0;
}
void main(void)
{
// This example function is found in the DSP281x_SysCtrl.c file.
InitSysCtrl();
// Disable CPU interrupts
DINT;
InitPieCtrl();
// Disable CPU interrupts and clear all CPU interrupt flags:
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
// Initialize only GPAMUX and GPBMUX for this test
EALLOW;
// Enable PWM pins
GpioMuxRegs.GPAMUX.all = 0x013f; // EVA PWM 1-6 pins,使能CAP1
// GpioMuxRegs.GPBMUX.all = 0x00FF; // EVB PWM 7-12 pins
PieVectTable.T1PINT = &eva_timer1_isr;
PieVectTable.T2PINT = &eva_timer2_isr;
EDIS;
EvaTimer1InterruptCount = 0;
EvaTimer2InterruptCount = 0;
init_eva();
PieCtrlRegs.PIEIER2.all = M_INT4;
PieCtrlRegs.PIEIER3.all = M_INT1;
IER |= (M_INT2 | M_INT3);
EINT;
ERTM;
// InitCAP();
// EvaRegs.T1CNT = 0x0000;
// EvaRegs.CAPCONA.bit.CAP12EN = 1; //捕获到一个值
for(;;)
{
// EvaRegs.CAPCONA.bit.CAP12EN = 1; //使能CAP1
// while((EvaRegs.EVAIFRC.bit.CAP1INT) ==1) //捕获到上升沿跳变
// {
EvaRegs.EVAIFRC.bit.CAP1INT = 1; //复位CAP1中断标志位
delay();
purpose1();
delay();
purpose2();
delay();
purpose3();
delay();
purpose4();
delay();
purpose5();
delay();
purpose6();
// }
}
}
void init_eva(void)
{
// Initalize the timers
// Initalize EVA Timer1
EvaRegs.T1PR = 0x0823; // Timer1 period
EvaRegs.T1CMPR = 0x0411; // Timer1 compare
EvaRegs.EVAIMRA.bit.T1PINT = 1;
EvaRegs.EVAIFRA.bit.T1PINT = 1;
EvaRegs.T1CNT = 0x0000; // Timer1 counter
// TMODE = continuous up/down
// Timer enable
// Timer compare enable
EvaRegs.T1CON.all = 0x0a00; //连续增减模式,4分频,禁止定时器比较使能
// Enable compare for PWM1-PWM4
EvaRegs.CMPR1 = 0x0411;
EvaRegs.CMPR2 = 0x0411;
EvaRegs.CMPR3 = 0x0411;
// EvaRegs.ACTRA.all = 0x0555;
EvaRegs.DBTCONA.all = 0x0000; // Disable deadband
EvaRegs.COMCONA.all = 0xA600;
EvaRegs.T2PR = 0x0823; // Timer2 period
EvaRegs.T2CMPR = 0x0411; // Timer2 compare
EvaRegs.EVAIMRB.bit.T2PINT = 1;
EvaRegs.EVAIFRB.bit.T2PINT = 1;
EvaRegs.T2CNT = 0x0000; // Timer2 counter
// TMODE = continuous up/down
// Timer enable
// Timer compare enable
EvaRegs.T2CON.all = 0x0a00;
/*
while(EvaTimer1InterruptCount != 10);
//EvaRegs.EVAIMRA.bit.T1PINT = 0;
EvaTimer1InterruptCount = 0;
//EvaRegs.EVAIMRA.bit.T1PINT = 0;
PieCtrlRegs.PIEIER2.all = M_INT4;
// PieCtrlRegs.PIEIER3.all = M_INT1;
IER |= (M_INT2 );//| M_INT1);
EINT;
ERTM;
*/
}
interrupt void eva_timer1_isr(void)
{
EvaTimer1InterruptCount++;
// EvaRegs.EVAIMRA.bit.T1PINT = 1;
EvaRegs.EVAIFRA.all = BIT7;
PieCtrlRegs.PIEACK.all = PIEACK_GROUP2;
// while(EvaTimer1InterruptCount != 10);
// EvaTimer1InterruptCount = 0;
}
interrupt void eva_timer2_isr(void)
{
EvaTimer2InterruptCount++;
//EvaRegs.EVAIMRB.bit.T2PINT = 1;
EvaRegs.EVAIFRB.all = BIT0;
PieCtrlRegs.PIEACK.all = PIEACK_GROUP3;
}
// No ISR's used in this example
//===========================================================================
// No more.
//===========================================================================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -