1st:2812
/*------------------------------------------------------------------------------------
功能:利用eva产生8路PWM输出波形,分别是:
【1】2个定时器T1(A6产生不对称波形).T2(A7产生对称波形)产生2路,
【2】以T1为基准(默认),3个全比较单元产生3对独立的输出(A0-A5),其中每对近似互补,便于控制电机。
-------------------------------------------------------------------------------------*/
/*------------------------------------------------
GP定时器输出包括:
【1】GP定时器比较输出波形TxCMP(x=1.2)
【2】为ADC模块提供触发转换信号
【3】提供上溢.下溢.比较匹配和周期匹配信号,可产生中断
【4】计数方向标志位
设置步骤:T1PR.T1CNT.T1CMPR.T1CON(定时器和定时器输出使能)
和GPTCON(定时器输出极性)
-------------------------------------------------*/
/*-------------------------------------------------
利用比较单元产生PWM步骤:
【1】ACTR设置比较器输出极性
【2】DBTCON设置无作用控制区
【3】设置定时器T1或者T3,初始化自己的CMPR
【4】COMCON比较器和比较器输出使能
-------------------------------------------------*/
#include "DSP281x_Device.h"
#include"DSP281x_Examples.h"
Uint16 m;
void delay();
void init_eva();
void main(void)
{
InitSysCtrl();
EALLOW;
GpioMuxRegs.GPAMUX.all=0xff;
EDIS;
DINT;
InitPieCtrl();
IER|=0x0000;
IFR|=0x0000;
InitPieVectTable();
init_eva();
for(;m<0xffff;m++)
{
delay();
}
}
void delay()
{
Uint16 i;
for(i=0;i<0xffff;i++)
;
}
void init_eva()
{
EvaRegs.T1PR=0xffff; //定时器1周期寄存器
EvaRegs.T1CMPR=0x1fff; //定时器1比较寄存器
EvaRegs.T1CNT=0x1; //写初值进定时器1计数器
EvaRegs.T1CON.all=0x0842; //时钟源为内部时钟HSPCLK/1,计数模式为连续增减(产生对称波形)
//使能定时器和定时器比较操作,
EvaRegs.T2CMPR=0x7fff;
EvaRegs.T2CNT=0;
EvaRegs.T2CON.all=0x1042; //计数模式为连续递增(产生不对称波形)
EvaRegs.GPTCONA.bit.TCMPOE=1; //定时器比较输出使能,可输出逻辑波形
EvaRegs.GPTCONA.bit.T1PIN=1; //定义两者输出波形极性,定时器1低有效
EvaRegs.GPTCONA.bit.T2PIN=2; //定时器2高有效
EvaRegs.CMPR1=0xafff;
EvaRegs.CMPR2=0x6fff;
EvaRegs.CMPR3=m; //这个是变化波形
EvaRegs.ACTRA.all=0x0666; //引脚1-6比较输出极性设置
EvaRegs.DBTCONA.all=0; //禁止无作用控制区
EvaRegs.COMCONA.all=0xa600; //比较器和全比较器输出使能,
}
//-----------------ADD FILES:利用EVA周期中断启动AD转换
void main
{
EALLOW;
PieVectTable.T1PINT=&eva_timer1_isr;
EDIS;
init_eva_timer1();
EvaTimer1InterruptCount=0;
IER|=M_INT2;
PieCtrlRegs.PIEIER2.all=M_INT4;
EINT;
ETRM;
for(;;);
}
void init_eva_timer1()
{
EvaRegs.T1PR=0x0200;
EvaRegs.T1CMPR=0;
EvaRegs.T1CNT=0;
EvaRegs.GPTCONA.all=0;
EvaRegs.T1CON=0x1742;
EvaRegs.EVAIMRA.bit.T1PINT=1;
EvaRegs.EVAIFRA.bit.T1PINT=1; //这两个要对应,一定要有
EvaRegs.GPTCONA.bit.T1TOADC=2; //选择周期事件产生中断启动ADC
}
interrupt void eva_timer1_isr()
{
//初始化AD之后,现在可添加AD转换程序,并可读取
EvaTimer1InterruptCount++;
/*EvaRegs.EVAIMRA.bit.T1PINT=1;
EvaRegs.EVAIFRA.bit.T1PINT=1;*/ //这两行怎么搞?难道不应该清除中断标志吗?为什么书上又把这两个重新赋值为1,多此一举?
PieCtrlRegs.PIEACK.all=PIEACK_GROUP2; //继续响应中断,也可设置PIEACK的某一位
}
2nd:28335,同样是周期中断触发adc,与2812略有不同。
// Configure ADC(单通道转换)
AdcRegs.ADCMAXCONV.all = 0x0000; // Setup 1 conv's on SEQ1
AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0; // Setup ADCINA0 as 1st SEQ1 conv.
AdcRegs.ADCTRL2.bit.EPWM_SOCA_SEQ1 = 1;
AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1; //8和11位连用,使能SEQ1中断,且允许ePWM触发信号启动SEQ1
// Configure ePWM
/*基本设置,略*/
ePwm1Regs.ETSEL.bit.SOCAEN = 1; // Enable SOC on A group
ePwm1Regs.ETSEL.bit.SOCASEL = 2; // TBCTR=TBPRD
ePwm1Regs.ETPS.bit.SOCAPRD = 1; // Generate pulse on 1st event
进入中断后别忘了
AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1; // Clear SEQ1 INT bit
AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1; // Reset SEQ1
注:以上2nd有待补充