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

编程入门 行业动态 更新时间:2024-10-19 01:19:17

DSP CCS12.00 芯片:TMS320F28335 结课设计 频率<a href=https://www.elefans.com/category/jswz/34/1770786.html style=测量系统设计"/>

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();    //初始化PIEIER = 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个小中断,即eCap1EINT;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);
#endifwhile(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,以满足2KHzdyy(Freq1);dyyy(Duty1*100);break;case 4:TBPRD = 18750;  //时基周期寄存器设为18750,以满足4KHzdyy(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-CAP4ECap1Regs.ECCTL2.bit.TSCTRSTOP = 0;  //TSCTR停止计数//配置外设寄存器 ECap1Regs.ECCTL2.bit.CONT_ONESHT = 1; //运行于单次模式ECap1Regs.ECCTL2.bit.STOP_WRAP = 3;   //单次模式下捕获事件4之后停止ECap1Regs.ECCTL1.bit.CAP1POL = 1;     //上升沿触发捕获事件1ECap1Regs.ECCTL1.bit.CAP2POL = 0;     //下降沿触发捕获事件2ECap1Regs.ECCTL1.bit.CAP3POL = 1;     //上升沿触发捕获事件3ECap1Regs.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_OUTECap1Regs.ECCTL1.bit.CAPLDEN = 1;   //使能在捕获事件发生时装载CAP1-CAP4ECap1Regs.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模块同步使用时基时钟TBCLKSysCtrlRegs.PCLKCR1.bit.EPWM3ENCLK = 1; //使能ePWM3时钟EDIS;InitEPwm3Gpio();//初始化时基模块TBEPwm3Regs.TBCTL.bit.SYNCOSEL = 3;           //禁用EPWMxSYNCO信号EPwm3Regs.TBCTL.bit.PHSEN = 0;              //禁止TBCTR加载相位EPwm3Regs.TBPHS.half.TBPHS = 0;             //ePWM时基计数器的相位设为0EPwm3Regs.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//初始化比较模块CCEPwm3Regs.CMPCTL.bit.SHDWAMODE = 1;         //CMPA寄存器选择直接模式EPwm3Regs.CMPA.half.CMPA = 3750;            //CMPA值设置为3750,初始化占空比为10%//初始化动作限定模块AQEPwm3Regs.AQCTLA.bit.ZRO = AQ_SET;          //当ePWMA计数器计数到0时输出高电平EPwm3Regs.AQCTLA.bit.CAU = AQ_CLEAR;        //当ePWMA计数器向上计数到CMPA时输出低电平//初始化事件触发模块ETEPwm3Regs.ETSEL.bit.INTEN = 1;             //使能产生中断信号EPWMx_INTEPwm3Regs.ETSEL.bit.INTSEL = 1;            //CTR=0时产生EPWM1_INTEPwm3Regs.ETPS.bit.INTPRD = 1;             //每发生一次事件,产生一次中断EALLOW;SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;     //被使能的ePWM模块同步使用时基时钟TBCLKEDIS;
}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);}
}

资源已经上传!!

更多推荐

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

本文发布于:2023-06-28 04:03:40,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/921476.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:测量   频率   芯片   系统   DSP

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!