📄 example_281xevpwm.c
字号:
while(GpioDataRegs.GPADAT.all==0x8000);//busy
e =0;
/*do {
GpioDataRegs. GPBDAT.bit.GPIOB2=1;//E=1
Check=GpioDataRegs. GPADAT.all;
Delay1();//延时140ns以上
GpioDataRegs. GPBDAT.bit.GPIOB2=0;//E=0
check=0x80✓//当第7位,即BF为0时才可以操作
}while(!check= =0x00);
}*/
}
void delay (uint us) //delay time
{
while(us--);
//int i;
//for ( i=0;i<5;i++ );
}
void delay1 (uint ms)
{
int ii,jj,kk=0;
for ( ii=0;ii<ms;ii++ )
{
for ( jj=0;jj<215;jj++ )
{
kk++;
}
}
/*uint i,j;
for(i=0;i<ms;i++)
for(j=0;j<15;j++)
delay(1);*/
}
/*------------------主程序--------------------*/
void main ()
{
// SP=0x5f;//01011111
InitSysCtrl();
/* EALLOW;
SysCtrlRegs.HISPCP.all=0x0003;
EDIS;*/
DINT;//关总中断
IER=0x0000;//关闭外设中断
IFR=0x0000;//关闭外围中断
IOinit();
init_lcd ();
while (1)
{
lat_disp (0x00,0x00);
chn_disp (tab1);
con_disp (0xff,0xff,0x8c,0x80,2,16);
delay1 (500);
clrram();
lat_disp (0xcc,0xcc);
delay1 (500);
lat_disp (0x00,0x00);
chn_disp1 (tab31);
img_disp1 (tab32);
delay1 (500);
clrram();
lat_disp (0xff,0x00);
delay1 (500);
img_disp (tab5);
delay1 (500);
}
}
/*#include "DSP281x_Device.h"
void ADC(void)
{ AdcRegs.MAX_CONV.all = 0x0003; // Setup 2 conv's on SEQ1
AdcRegs.CHSELSEQ1.bit.CONV00 = 0x0; // Setup ADCINA0 as 1st SEQ1 conv.
AdcRegs.CHSELSEQ1.bit.CONV01 = 0x1; // Setup ADCINA1 as 2nd SEQ1 conv.
AdcRegs.CHSELSEQ1.bit.CONV02 = 0x2; // Setup ADCINA1 as 3ird SEQ1 conv.
AdcRegs.CHSELSEQ1.bit.CONV03 = 0x3; // Setup ADCINA1 as 3ird SEQ1 conv.
AdcRegs.ADCTRL2.bit.EVA_SOC_SEQ1 = 1; // Enable EVASOC to start SEQ1
AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1; // Enable SEQ1 interrupt (every EOS)
}
// DSP281x Examples Include File
//#include "DSP28_Globalprototypes.h"
//#pragma CODE_SECTION(T1PINT_isr,"RAMH0");
//#pragma CODE_SECTION(InitFlash,"ramfuncs");
//#pragma CODE_SECTION(T1PINT_isr,"ramfuncs");
//extern unsigned int Ramfuncs_LoadStart;
//extern unsigned int Ramfuncs_LoadEnd;
//extern unsigned int Ramfuncs_RunStart;
// Prototype statements for functions found within this file.
interrupt void T1PINT_isr(void);
//void SCIfunction(void);
//interrupt void T1UFINT_isr(void);
// Global variables used in this example:
Uint16 LoopCount;
Uint16 ConversionCount;
Uint16 Current1[10];
Uint16 Current2[10];
Uint16 Voltage1[10];
Uint16 Voltage2[10];
Uint16 switch_flag;
Uint16 Vref=0;
Uint16 sum1=0,Sum1=0;
Uint16 sum2=0,Sum2=0;
Uint16 sum3=0,Sum3=0;
int speed1=0,speed2=0;
void KEYControl(void);
int Speedcontrol(int speed1, int speed2);
//float M=0.8;
main()
{
InitSysCtrl();//系统初始化
switch_flag=1;//置关机标志
// while(GpioDataRegs.GPFDAT.bit.GPIOF13)//开关机拦截
//{ }
// Step 1. Initialize System Control:
// PLL, WatchDog, enable Peripheral Clocks
// This example function is found in the DSP281x_SysCtrl.c file.
// For this example, set HSPCLK to SYSCLKOUT / 6 (25Mhz assuming 150Mhz SYSCLKOUT)
// EALLOW;
// SysCtrlRegs.HISPCP.all = 0x3; // HSPCLK = SYSCLKOUT/6 频率保护设定
// EDIS;
// Step 2. Initialize GPIO:
// This example function is found in the DSP281x_Gpio.c file and
// illustrates how to set the GPIO to it's default state.
InitGpio(); // 输入输出端口初始化
EALLOW;
GpioMuxRegs.GPAMUX.all=0x00ff;//保护设定
EDIS;
// Step 3. Clear all interrupts and initialize PIE vector table:
// Disable CPU interrupts
DINT;//关中断
IER = 0x0000;//后加
IFR = 0x0000;//后加
// Initialize the PIE control registers to their default state.
// The default state is all PIE interrupts disabled and flags
// are cleared.
// This function is found in the DSP281x_PieCtrl.c file.
InitPieCtrl();//中断初始化
// Disable CPU interrupts and clear all CPU interrupt flags:
//IER = 0x0000;//
//IFR = 0x0000;//关闭CPU的中断使能和标志
// Initialize the PIE vector table with pointers to the shell Interrupt
// Service Routines (ISR).
// This will populate the entire table, even if the interrupt
// is not used in this example. This is useful for debug purposes.
// The shell ISR routines are found in DSP281x_DefaultIsr.c.
// This function is found in DSP281x_PieVect.c.
InitPieVectTable();//中断向量表的初始化
// Interrupts that are used in this example are re-mapped to
// ISR functions found within this file.
//EALLOW; // This is needed to write to EALLOW protected register
//PieVectTable.T1PINT = &T1PINT_isr;//向中断向量表写入T1周期中断地址
//PieVectTable.T1UFINT = &T1UFINT_isr;
//EDIS; // This is needed to disable write to EALLOW protected registers
// Step 4. Initialize all the Device Peripherals:
// This function is found in DSP281x_InitPeripherals.c
// InitPeripherals(); // Not required for this example
InitAdc(); //初始化ADC 上电
// Step 5. User specific code, enable interrupts:
// memcpy(&Ramfuncs_RunStart,&Ramfuncs_LoadStart,&Ramfuncs_LoadEnd-&Ramfuncs_LoadStart);
// InitFlash();
// Enable T1PINT T1UFINT in PIE
PieCtrl.PIEIER2.bit.INTx4 = 1;
PieCtrl.PIEIER2.bit.INTx6 = 1;
//IER |= M_INT2; // Enable CPU Interrupt 2
//EINT; // Enable Global interrupt INTM
//ERTM; // Enable Global realtime interrupt DBGM
//LoopCount = 0;
ConversionCount = 0;
// Configure ADC
InitADC();
// Configure EVA
// Assumes EVA Clock is already enabled in InitSysCtrl();
EvaRegs.EVAIMRA.all=0x0080;//中断屏蔽寄存器,T1周期中断使能,下溢中断使能,电机驱动保护。
EvaRegs.EVAIFRA.all=0xFFFF;//EVA中断标志寄存器清零
EvaRegs.T1CNT=0x00;//计数寄存器附初值
EvaRegs.ACTRA.all=0x0666;//比较方式控制寄存器PWM6\4\2低有效,5\3\1高有效
EvaRegs.COMCONA.all=0xA600;//比较控制寄存器T1CNT=0或T1CNT=T1PR时(周期或下溢)装载
EvaRegs.DBTCONA.all=0x0A10;//死区时间设为A*16*1/30000000=5.33us,使能死区定时器1\2\3(pwm123456)
EvaRegs.GPTCONA.all=0x441;//全局通用定时器控制寄存器,定时器1比较输出低有效,周期中断启动模数转换
EvaRegs.T1CMPR = 0x0A80; // Setup T1 compare value
EvaRegs.CMPR1 = 625;
EvaRegs.T1PR = 1250; // Setup period register
EvaRegs.GPTCONA.bit.T1TOADC = 1; // Enable EVASOC in EVA
//EvaRegs.T1CON.all = 0x1042; // Enable timer 1 compare (upcount mode)
EvaRegs.T1CON.all=0x0842;//定时器1控制寄存器,连续增减,内部时钟/128,定时器比较使?
while(1)
{
if(GpioDataRegs.GPFDAT.bit.GPIOF13==0&&switch_flag==1)
{
GpioDataRegs.GPEDAT.bit.GPIOE2=1;//
switch_flag=0;
for(Vref=0;Vref<=10;Vref++)
{
EvaRegs.CMPR1=Vref*4096/8;
EvaRegs.CMPR2=Vref*4096/8;
}
EvaRegs.CMPR1 = 625;
}
else if(GpioDataRegs.GPFDAT.bit.GPIOF13==1&&switch_flag==0)
{
GpioDataRegs.GPEDAT.bit.GPIOE2=0;//
switch_flag=1;
EvaRegs.CMPR1 = 0x0;
EvaRegs.CMPR2 = 0x0;
}
// LoopCount++;//
//SCIfunction();
//KEYControl();
}//while层
}//main层
interrupt void T1PINT_isr(void)//
{
Current1[ConversionCount] = AdcRegs.RESULT0 >>4;//
Current2[ConversionCount] = AdcRegs.RESULT1 >>4;//
Voltage1[ConversionCount] = AdcRegs.RESULT2 >>4;//
Voltage2[ConversionCount] = AdcRegs.RESULT3 >>4;//
// If 40 conversions have been logged, start over
if(ConversionCount == 9) //
{
ConversionCount = 0;//
for(ConversionCount=0;ConversionCount<=9;ConversionCount++)
{
sum1=sum1+Current1[ConversionCount];
if(ConversionCount==9)
{Sum1=sum1/10;}
}
for(ConversionCount=0;ConversionCount<=9;ConversionCount++)
{
sum2=sum2+Current2[ConversionCount];
if(ConversionCount==9)
{Sum2=sum2/10;}
}
for(ConversionCount=0;ConversionCount<=9;ConversionCount++)
{
sum3=sum3+Voltage1[ConversionCount];
if(ConversionCount==9)
{
Sum3= sum3/10;
}
}
//Speedcontrol(speed1,speed2);
}//
else //
ConversionCount++;//
// Reinitialize for next ADC sequence
AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1; // Reset SEQ1
AdcRegs.ADC_ST_FLAG.bit.INT_SEQ1_CLR = 1; // Clear INT SEQ1 bit
EvaRegs.EVAIFRA.bit.T1PINT=1;//Clear interrupt flag bit 7
PieCtrl.PIEACK.all = PIEACK_GROUP2; // Acknowledge interrupt to PIE
EINT;//
return;//
}//
void KEYControl(void)
{
switch(GpioDataRegs.GPBDAT.all)
{
case 0xfeff: Speedcontrol(500,600);
break;
case 0xfdff: Speedcontrol(1000,1500);
break;
case 0xfcff: Speedcontrol(2000,2500);
break;
case 0xfbff: Speedcontrol(3000,3500);
break;
case 0xfaff: Speedcontrol(4000,4500);
break;
case 0xf9ff: Speedcontrol(speed1,speed2);
break;
case 0xf8ff: Speedcontrol(speed1,speed2);
break;
case 0xf7ff: Speedcontrol(speed1,speed2);
break;
default: break;
}//switch层
}//KEY层
Speedcontrol(speed1,speed2)
{
for(Vref=0;Vref<=4094;Vref++)
{
EvaRegs.CMPR1=Vref;
EvaRegs.CMPR2=Vref;
}
EvaRegs.CMPR1 = speed1;
EvaRegs.CMPR2 = speed2;
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -