EV:GP定时器和PWM输出

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有待补充

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值