(这篇文章我不负责 !!! , 我没搞懂)
永辉电子 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);
}
}
资源已经上传!!