DSP CCS12.00 芯片:TMS320F28335 结课设计 频率测量系统设计

(这篇文章我不负责 !!! , 我没搞懂)

永辉电子 DSP 板子 

1.功能:

PWM3B   PWM3A 输出 :

ECAP 模块测量  : 

线的连接  

第一种方法

ECAP 1A 模块  J7  44 

EPWM 3A 模块 J6  47 

连接

第二种方法

EPWM 3A 模块 J6  47   连 J6 48


首先在配置上面  我们需要更新文件 ,不能用之前的文件了 , 新的文件在资源包里。

代码也在,


 

#include "DSP2833x_Device.h"     // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h"   // DSP2833x Examples Include File
#include <bsp_includes.h>

#define KEY *((unsigned int*)0x4700)//按键模块的映射
#define KEYVALUE ((KEY)&0x0f)
unsigned int KeyNo;
unsigned int CMPA = 3750; //输出高电屏的 占空比部分
unsigned int TBPRD = 37500;//开始的频率
const unsigned int KeyCode[4]={0x0E, 0x0D, 0x0B, 0x07};//按键的编码


//显示频率
void dyy(Uint16 data);
//显示占空比
void dyyy(Uint16 data);
/********************************************************************************************
 * 在做TFTLCD时,找到对用的头文件,改变宏定义即可,
 * */
#if (TFTLCD_TEST == 1)
uchar Name[] = {"电子  "};
uchar Name1[]= {" 电子"};
uchar Name2[]= {"电班: "};

uchar Str1[] = {"频  率: "};
uchar Str2[] = {"占空比: "};
uchar Str3[] = {"时  间:2022/11/01"};
//uchar Str4[]={"1KHZ"};
//uchar Str5[]={"0.5"};
#endif


// 周期、占空比声明
Uint32  TSt1 = 0;
Uint32  TSt2 = 0;
Uint32  TSt3 = 0;
Uint32  TSt4 = 0;
float32 Period1 = 0;
float32 Period2 = 0;
float32 Duty1 = 0;
float32 Duty2 = 0;
float32 Freq1 = 0;
float32 Freq2 = 0;


unsigned int KeyScan(void);
void InitECapture(void);//ECAP 初始化函数
interrupt void ecap1_isr(void);//中断函数控制 ECAP 捕捉信号
void EPWM3_Init(void);//PWM 输出模块




void main(void)
{
    InitSysCtrl();    //系统初始化
    InitECap1Gpio();  //eCap引脚初始化
    DINT;
    InitPieCtrl();    //初始化PIE
    IER = 0x0000;
    IFR = 0x0000;
    InitPieVectTable();  //初始化PIE中断向量
    EALLOW;
    PieVectTable.ECAP1_INT = &ecap1_isr;  //设置eCap1的中断入口地址
    EDIS;
    EPWM3_Init();    //ePWM3初始化
    InitECapture();  //eCap1初始化
    IER |= M_INT4;  //使能CPU级INT4中断
    PieCtrlRegs.PIEIER4.bit.INTx1 = 1;  //开启CPU第4组中断并使能第4组中断的第1个小中断,即eCap1
    EINT;
    ERTM;
    InitXintf();

#if(TFTLCD_TEST == 1)
            ILI9325_Init();           //TFT初始化
            //显示字符
            LCD_PutString(37, 24,Name1,WHITE,RED);
            LCD_PutString(37, 48,Name2,WHITE,BLUE);
            LCD_PutString(37, 24,Name, WHITE,BLUE);
            LCD_PutString(37,92,Str1, WHITE,RED);
            //LCD_PutString(100,92,Str4, WHITE,BLUE);

           LCD_PutString(37,116,Str2, WHITE,RED);
            //LCD_PutString(100,116,Str5, WHITE,BLUE);

            LCD_PutString(37,140,Str3, WHITE,BLUE);
            dyy(Freq1);
            dyyy(Duty1*100);
#endif
            while(1)
               {
                   KeyNo = KeyScan();
                   switch(KeyNo)
                   {
                       case 1:
                           CMPA += 3750;

                           dyyy(Duty1*100);
                           break;
                       case 2:
                           CMPA -= 3750;
                           dyyy(Duty1*100);
                           break;
                       case 3:
                           TBPRD = 37500;  //时基周期寄存器设为37500,以满足2KHz
                           dyy(Freq1);
                           dyyy(Duty1*100);
                           break;
                       case 4:
                           TBPRD = 18750;  //时基周期寄存器设为18750,以满足4KHz
                           dyy(Freq1);
                           dyyy(Duty1*100);
                           break;
                       default: break;
                   }

                   EPwm3Regs.TBPRD = TBPRD;          //设置时基周期寄存器
                   EPwm3Regs.CMPA.half.CMPA = CMPA;  //CMPA值,设置占空比
               }}


void InitECapture(void)
{
   ECap1Regs.ECEINT.all = 0x0000;       //失能eCAP1所有中断
   ECap1Regs.ECCLR.all = 0xFFFF;        //清除eCAP1所有中断标志位
   ECap1Regs.ECCTL1.bit.CAPLDEN = 0;    //禁止在捕获事件发生时装载CAP1-CAP4
   ECap1Regs.ECCTL2.bit.TSCTRSTOP = 0;  //TSCTR停止计数

   //配置外设寄存器 
   ECap1Regs.ECCTL2.bit.CONT_ONESHT = 1; //运行于单次模式
   ECap1Regs.ECCTL2.bit.STOP_WRAP = 3;   //单次模式下捕获事件4之后停止

   ECap1Regs.ECCTL1.bit.CAP1POL = 1;     //上升沿触发捕获事件1
   ECap1Regs.ECCTL1.bit.CAP2POL = 0;     //下降沿触发捕获事件2
   ECap1Regs.ECCTL1.bit.CAP3POL = 1;     //上升沿触发捕获事件3
   ECap1Regs.ECCTL1.bit.CAP4POL = 0;     //下降沿触发捕获事件4

   //差分模式
   ECap1Regs.ECCTL1.bit.CTRRST1 = 1;   //在捕获事件1发生时复位计数器
   ECap1Regs.ECCTL1.bit.CTRRST2 = 1;   //在捕获事件2发生时复位计数器
   ECap1Regs.ECCTL1.bit.CTRRST3 = 1;   //在捕获事件3发生时复位计数器
   ECap1Regs.ECCTL1.bit.CTRRST4 = 1;   //在捕获事件4发生时复位计数器

   ECap1Regs.ECCTL2.bit.SYNCI_EN = 1;  //使能计时器同步
   ECap1Regs.ECCTL2.bit.SYNCO_SEL = 0; //同步输入SYNC_IN将作为同步输出SYNC_OUT


   ECap1Regs.ECCTL1.bit.CAPLDEN = 1;   //使能在捕获事件发生时装载CAP1-CAP4
   ECap1Regs.ECCTL2.bit.TSCTRSTOP = 1; //TSCTR开始计数
   ECap1Regs.ECCTL2.bit.REARM = 1;     //Mod4重新装载
   ECap1Regs.ECEINT.bit.CEVT4 = 1;     //使能捕获事件4中断
}

interrupt void ecap1_isr(void)
{
   //提取CAP1-CAP4的值
   TSt1 = ECap1Regs.CAP1;
   TSt2 = ECap1Regs.CAP2;
   TSt3 = ECap1Regs.CAP3;
   TSt4 = ECap1Regs.CAP4;
   //计算周期
   Period1 = TSt1 + TSt2;
   Period2 = TSt3 + TSt4;

   //计算占空比
   Duty1 = TSt1 / Period1;
   Duty2 = TSt3 / Period2;

   //计算频率
   Freq1 = 150000000 / Period1;
   Freq2 = 150000000 / Period2;

   ECap1Regs.ECCLR.bit.CEVT4 = 1;  //清除捕获事件4中断标志位
   ECap1Regs.ECCLR.bit.INT = 1;    //清除全局中断标志位
   ECap1Regs.ECCTL2.bit.REARM = 1; //Mod4重新装载

   //允许响应同组中断
   PieCtrlRegs.PIEACK.all = PIEACK_GROUP4;
}



void EPWM3_Init(void)
{
    EALLOW;
    SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;  //禁止ePWM模块同步使用时基时钟TBCLK
    SysCtrlRegs.PCLKCR1.bit.EPWM3ENCLK = 1; //使能ePWM3时钟
    EDIS;

    InitEPwm3Gpio();

    //初始化时基模块TB
    EPwm3Regs.TBCTL.bit.SYNCOSEL = 3;           //禁用EPWMxSYNCO信号
    EPwm3Regs.TBCTL.bit.PHSEN = 0;              //禁止TBCTR加载相位
    EPwm3Regs.TBPHS.half.TBPHS = 0;             //ePWM时基计数器的相位设为0
    EPwm3Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;  //选择递增计数模式
    EPwm3Regs.TBCTL.bit.HSPCLKDIV = 1;          //高速基准时钟2分频
    EPwm3Regs.TBCTL.bit.CLKDIV = 0;             //基准时钟不分频
    EPwm3Regs.TBCTR = 0x0000;                   //清零时基计数寄存器
    EPwm3Regs.TBPRD = 37500;                    //时基周期寄存器设为37500,以满足2KHz

    //初始化比较模块CC
    EPwm3Regs.CMPCTL.bit.SHDWAMODE = 1;         //CMPA寄存器选择直接模式
    EPwm3Regs.CMPA.half.CMPA = 3750;            //CMPA值设置为3750,初始化占空比为10%

    //初始化动作限定模块AQ
    EPwm3Regs.AQCTLA.bit.ZRO = AQ_SET;          //当ePWMA计数器计数到0时输出高电平
    EPwm3Regs.AQCTLA.bit.CAU = AQ_CLEAR;        //当ePWMA计数器向上计数到CMPA时输出低电平

    //初始化事件触发模块ET
    EPwm3Regs.ETSEL.bit.INTEN = 1;             //使能产生中断信号EPWMx_INT
    EPwm3Regs.ETSEL.bit.INTSEL = 1;            //CTR=0时产生EPWM1_INT
    EPwm3Regs.ETPS.bit.INTPRD = 1;             //每发生一次事件,产生一次中断

    EALLOW;
    SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;     //被使能的ePWM模块同步使用时基时钟TBCLK
    EDIS;
}



unsigned int KeyScan(void)
{
    unsigned int key = 0;
    unsigned int i;

    for(i=0; i<10; i++);

    if(KEYVALUE == KeyCode[0])
        key = 1;
    else if(KEYVALUE == KeyCode[1])
        key = 2;
    else if(KEYVALUE == KeyCode[2])
        key = 3;
    else if(KEYVALUE == KeyCode[3])
        key = 4;
    for(i=0; i<10; i++);

    return key;
}


//显示频率
void dyy(Uint16 data)
{

    int k=(int)abs(data/1000);
    uchar str6[5];
    str6[0]=k+48;
    str6[1]='k';
    //str6[2]=0;
    str6[2]='H';
    str6[3]='Z';
    str6[4]=32;
    LCD_PutString(130,92,str6, WHITE,BLUE);
}


//显示占空比
void dyyy(Uint16 data)
{
    int k=(int)abs(data);
    if(k<10)
    {
        uchar str7[4];
        str7[0]=k/10+48;
        str7[1]=k%10+48;
        str7[2]='%';
        str7[3]=0;
        LCD_PutString(130,116,str7, WHITE,BLUE);
    }
    else if(k<100)
    {
        uchar str7[4];
        str7[0]=k/10+48;
        str7[1]=k%10+48;
        str7[2]='%';
        str7[3]=0;
        LCD_PutString(130,116,str7, WHITE,BLUE);
    }
    else if(k<1000)
    {
        uchar str7[5];
        str7[0]=k/100+48;
        str7[1]=k%100/10+48;
        str7[2]=k%10+48;
        str7[3]='%';
        str7[4]=0;
        LCD_PutString(130,116,str7, WHITE,BLUE);
    }
    else
       {
           uchar str7[5];
           str7[0]=k/1000+48;
           str7[1]=k%1000/100+48;
           str7[2]=k%100+48;
           str7[3]='%';
           str7[4]=0;
           LCD_PutString(130,116,str7, WHITE,BLUE);
       }
}

资源已经上传!!

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值