部件号:LAUNCHXL-F2.8377万S
工具/软件:Code Composer Studio
大家好,我尝试做一个类似的程序(C2000 F2.8379万D双核LaunchPad技术概述,演示了处理器间通信,以阅读 launchxL-F2.8377万s上的正弦波)。 我使用ePWP-DAC1 (PIN32)制作正弦波,它通过ADCINA0的电线连接。 程序工作正常,但在CCS上的调试部分,我尝试绘制AdcaResults。 问题在于,正弦曲线图与视频中的一样,不正弦曲线图正常,并且图形更新时会出现变形。 我尝试更改图形属性和缓冲区的大小。我不知道这是CCS配置问题还是代码问题。
如果有任何建议或帮助,我将不胜感激。 我把密码留给您尝试。
#include "F28x_Project.h"
//
//函数原型
//
//defines del seno ====================================================================================================================================
#define EPWM11_TIMER_TBPRD 200 //期间寄存器
#define EPWM11_MAX_CMPA 195
#define EPWM11_MIN_CMPA 5.
#define EPWM11_MAX_CMBB 195
#define EPWM11_MIN_CMBB 5.
#define ePWM_CMP_UP 1.
#define ePWM_CMP_DOWN 0
#define sine_PTS 80
/*SENO 80 PTS mas y menos con offset 100 */int QuadratureTable4[Sence_PTS]={1001.07115123亿 ,1301.38145152亿 ,1581.64170176亿 ,1801.85189192亿 ,1951.97198199亿 ,
1991.99198197亿 ,1951.92189185亿 ,1801.76170164亿 ,1581.52145138亿 ,1301.23115107亿 ,
100,92,84,76,69,61,54,47,41,35,29,24,19,14,10,7,4,3,2,1,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,
2,3,4,5,6,7,10,14,19,24,29,35,41,47,54,61,69,76,84,92,};
//全局
//
typedef结构
{
易失性结构ePWM_regs *EPwmRegHandle;
UINT16 ePWM_CMPA_方向;
UINT16 ePWM_CMPB_方向;
UINT16 EPwmTimerIntCount;
UINT16 EPwmMaxCMPA;
UINT16 EPwmMinCMPA;
UINT16 EPwmMaxCMBB;
UINT16 EPwmMinCMBB;
} ePWM_INFO;
ePWM_INFO epwm11_info;
//FIN定义seno===================================================================================================================================================================================================
//函数原型SENO===========================================================================
void InitEPwm11示例(void);
__interrupt void epwm11_isr (void);
void update_compare(ePWM_info*);
void update_seno(ePWM_info*);
//========= fin funciones PROTOTPO SENO===========================================
void ConfigureADC (void);
void ConfigureEPWM (void);
void SetupADCEpwm (UINT16通道);
中断无效adca1_isr(void);
//
//定义
//
#define results_buffer_size 512
//
//全局
//
UINT16 AdcaResults[results_buffer_size];
UINT16结果索引;
易失性UINT16缓冲器全;
Void主(void)
{
//
//步骤1. 初始化系统控制:
// PLL,看门狗,启用外设时钟
//此示例函数可在F2837xS_sysctrl.c文件中找到。
//
InitSysCtrl();
//
//步骤2. 初始化GPIO:
//此示例函数可在F2837xS_GPIO.c文件和中找到
//说明了如何将GPIO设置为其默认状态。
//
此示例跳过InitGpio();//
CpuSysRegs.PCLKCR2.bit.EPWM11=1;
//
Initepwm11gpio();
//
//步骤3. 清除所有中断并初始化PIE矢量表:
//禁用CPU中断
//
色调;
//
//将PIE控件寄存器初始化为其默认状态。
//默认状态是禁用所有PIE中断和标志
//被清除。
//此函数位于F2837xS_PIECTRL.c文件中。
//
InitPieCtrl();
//
//禁用CPU中断并清除所有CPU中断标志:
//
IER = 0x0000;
IFR = 0x0000;
//
//使用指向外壳中断的指针初始化PIE矢量表
//服务例程(ISR)。
//这将填充整个表,即使中断也是如此
//在本例中不使用。 这对于调试非常有用。
// shell ISR例程位于F2837xS_DefaultIsr.C.中
//此函数位于F2837xS_PieVect.C.中
//
InitPieVectorTable();
EALLOW;//这是写入EALLOW保护寄存器所必需的
PieVectorTable.EPWM11_INT =&epwm11_ISR;
EDIS;//这是禁用写入EALLOW保护寄存器所必需的
EALLOW;
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 0;
EDIS;
InitEPwm11Expample();
EALLOW;
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1;
EDIS;
//映射ISR功能
//
IER |= M_INT3;
EALLOW;
PieVectorTable.ADCA1_INT =&adca1_ISR;// ADCA中断1的函数
EDIS;
PieCtrlRegs.PIEIER3.bit.INTx11 = 1;
//
//配置ADC并将其打开
配置ADC();
//配置ePWM
配置EPWM();
//在通道0上设置ePWM触发转换的ADC
SetupADCEpwm(0);
//启用全局中断和更高优先级的实时调试事件:
IER || M_INT1;//启用组1中断
EINT;//启用全局中断INTM
ERTM;//启用全局实时中断DBGM
//初始化结果缓冲区
for (resultsIndex = 0;resultsIndex < results_buffer_size;resultsIndex++)
{
AdcaResults[resultsIndex]=0;
}
结果索引=0;
缓冲器全轮= 0;
//启用PIE中断
PieCtrlRegs.PIEIER1.bit.INTx1 = 1;
//同步ePWM
EALLOW;
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1;
//
//无限循环转换
//
做
{
//启动ePWM
EPwm1Regs.ETSEL.bit.SOCAEN = 1;//启用SOCA
EPwm1Regs.TBCTL.bit.CTRMODE = 0;//unfreeze,并进入UP计数模式
//等待ePWM导致ADC转换,然后导致中断,
//填充结果缓冲区,最终设置bufferFull
//标志
//
while (!bufferFull);
bufferFull = 0;//清除缓冲区已满标志
//停止ePWM
//
EPwm1Regs.ETSEL.bit.SOCAEN = 0;//禁用SOCA
EPwm1Regs.TBCTL.bit.CTRMODE = 3;//冻结计数器
//此时,AdcaResults[]包含一个转换序列
//从所选频道
}同时(1);
}
//
// ConfigureADC -写入ADC配置并为两者加电
// ADC A和ADC B
//
void配置ADC(void)
{
EALLOW;
//写入配置
AdcaRegs.ADCCTL2.bit.prescale =6;//将ADCCLK除法器设置为/4
AdcSetMode (ADC_ADCA,ADC_Resolution _12位,ADC_SIGNALMODE_SINGLE);
//将脉冲位置设置为延迟
AdcaRegs.ADCCTL1.bit.INTPULSEPOS = 1;
//打开ADC的电源
AdcaRegs.ADCCTL1.bit.ADCPWDNZ = 1;
//延迟1毫秒,以使ADC有时间开机
DELAY _US (1000);
EDIS;
}
// ConfigureEPWM -配置ePWM SOC并比较值
//
void配置EPWM (void)
{
EALLOW;
//假定ePWM时钟已启用
EPwm1Regs.ETSEL.bit.SOCAEN = 0;//禁用组上的SOC
EPwm1Regs.ETSEL.bit.SOCASEL = 4;//在加电计数时选择SOC
EPwm1Regs.ETPS.bit.SOCAPRD = 1;//在第一个事件上生成脉冲
EPwm1Regs.CMPA.bit.CMPA = 0x0800;// set将值与2048个计数进行比较
EPwm1Regs.TBPRD = 0x1000;//将周期设置为4096个计数
EPwm1Regs.TBCTL.bit.CTRMODE = 3;//冻结计数器
EDIS;
}
// SetupADCEpwm -设置ADC ePWM采集窗口
//
void SetupADCEpwm (UINT16通道)
{
UINT16 acqps;
//根据分辨率确定最小采集窗口(在SYSCLKS中)
//
IF (ADC_Resolution _12位== AdcaRegs.ADCCTL2.bit.Resolution)
{
acqps = 14;//75ns
}
ELSE //分辨率为16位
{
acqps = 63;//320ns
}
//
//选择要转换的通道和转换结束标志
//
EALLOW;
AdcaRegs.ADCSOC0CTL.bit.CHSEL =通道;//SOC0将转换针A0
AdcaRegs.ADCSOC0CTL.bit.ACQPS = acqps;//样例窗口为100 SYSCLK周期
AdcaRegs.ADCSOC0CTL.bit.TRIGSEL = 5;// ePWM1 SOCA/C上的触发器
AdcaRegs.ADCINTSEL1N2.bit.INT1SEL = 0;//SOC0的结尾将设置INT1标志
AdcaRegs.ADCINTSEL1N2.bit.INT1E = 1;//启用INT1标志
AdcaRegs.ADCINTFLGCLL.bit.ADCINT1 =1;//确保INT1标志已清除
EDIS;
}
// adca1_ISR -读取ISR中的ADC缓冲器
//
中断无效适配器1_ISR(void)
{
AdcaResults[resultsIndex+]= AdcaResultRegs.ADCRESULT0;
IF (results_buffer_size <= resultsIndex)
{
结果索引=0;
缓冲器全轮= 1;
}
ADcaRegs.ADCINTFLGCLL.bit.ADCINT1 = 1;//清除INT1标志
PieCtrlRegs.PIEACG.ALL = PIEACK_GROUP1;
}
//funciones SENO ===========================================================================================================
__interrupt void epwm11_isr (void)
{
//
//更新CMPA和CMBB值
//
update_seno (&epwm11_info);
//
//清除此计时器的INT标志
//
EPwm11Regs.ETCLR.bit.INT = 1;
//
//确认此中断以接收来自组3的更多中断
//
PieCtrlRegs.PIEACG.ALL = PIEACK_Group3;
}
// InitEPwm1示例-初始化EPWM1配置===========================================
//
void InitEPwm11示例()
{
//
//设置TBCLK
//
EPwm11Regs.TBPRD = EPWM11_TIMER_TBPRD;//设置计时器周期801 TBCLK
EPwm11Regs.TBPHS.bit.TBPHS = 0x0000;//相位为0
EPwm11Regs.TBCTR = 0x0000;//清除计数器
//
//设置比较值
//
EPwm11Regs.CMPA.bit.CMPA = EPWM11_MIN_CMPA;// SET比较值
EPwm11Regs.CMPB.bit.CMBB = EPWM11_MAX_CMPB;//设置比较B值
//
//设置计数器模式
//
EPwm11Regs.TBCTL.bit.CTRMODE = TB_COUNT_UDOWN;//向上和向下计数
EPwm11Regs.TBCTL.bit.PHSEN = TB_DISABLE;//禁用相加载
EPwm11Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;//与SYSCLKOUT的时钟比率
EPwm11Regs.TBCTL.bit.CLKDIV = TB_DIV1;
//
//设置阴影
//
EPwm11Regs.CMPCTL.bit.SHDWAMODE = CC_SHAME;
EPwm11Regs.CMPCTL.bit.SHDWBMODE = CC_SHADO;
EPwm11Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZE;//零加载
EPwm11Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;
//
//设置操作
//
EPwm11Regs.AQCTLA.bit.CAD = AQ_set;//在事件A上设置PWM1A,启动
//计数
EPwm11Regs.AQCTLA.bit.CAU = AQ_CLEAR;//清除事件A上的PWM1A,
//向下计数
EPwm11Regs.AQCTLB.bit.CBU = AQ_set;//在事件B上设置PWM1B,up
//计数
EPwm11Regs.AQCTLB.bit.CBD = AQ_Clear;//在事件B上清除PWM1B,
//向下计数
//
//中断我们将更改比较值的位置
//
EPwm11Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO;//在零事件上选择INT
EPwm11Regs.ETSEL.bit.inten = 1;//启用INT
EPwm11Regs.ETPS.bit.INTPRD = ET_1ST;//在第三个事件上生成INT
//
//此示例用于跟踪的信息
// CMPA/CMPB值的方向
//移动,最小和最大允许值和
//指向正确ePWM寄存器的指针
//
epwm11_info.ePWM_CMPA_direction = ePWM_CMP_up;//通过增加CMPA开始
epwm11_info.ePWM_CMPB_direction = ePWM_CMP_down;//和降低CMPB
epwm11_info.epwmTimerIntCount =0;//将中断计数器归零
epwm11_info.epwmRegHandle =&EPwm11Regs;//将指针设置到
// ePWM模块
epwm11_info.epwmMaxCMPA = EPWM11_MAX_CMPA;//设置最小值/最大值CMPA/CMPB
//值
epwm11_info.epwmMinCMPA = EPWM11_MIN_CMPA;
epwm11_info.epwmMaxCMBB = EPWM11_MAX_CMBB;
epwm11_info.epwmMinCMBB = EPWM11_MIN_CMBB;
}
//
// InitEPwm2Example -初始化EPWM2配置
//
//============================================================================================================================================================================================================================================================================================================================
void update_seno (ePWM_info *ePWM_info)
{
静态UINT16 iQuadratureTable =0;
//
//每隔10秒中断,更改CMPA/CMPB值
//
IF (ePWM_INFO->EPwmTimerIntCount == 61)
{
ePWM_INFO->EPwmTimerIntCount =0;
ePWM_INFO->EPwmRegHandle->CMPA.bit.CMPA =(QuadratureTable4[iQuadratureTable+])*1);
IF (iQuadratureTable >(Sin弦_PTS)- 1)//将索引打包
{
iQuadratureTable =0;
}
// else if (iQuadratureTable >((sine_PTS/2)- 1))
//{
//ePWM_INFO->EPwmRegHandle->CMPA.bit.CMPA =(QuadratureTable2[iQuadratureTable++])*1);
//}
//else IF (iQuadratureTable >((sine_PTS)- 1))
//{
//}
}
否则
{
ePWM_INFO->EPwmTimerIntCount++;
}
返回;
}