This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CCS/LUNCHXL-F2.8377万S:正弦波和图形

Guru**** 2348500 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/580896/ccs-launchxl-f28377s-sine-wave-and-graph

部件号: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++;
}
返回;
}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,

    您指的是哪个视频?

    此致,
    Adam Dunhoft
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    本视频。
    www.ti.com/.../watch.tsp
    此致,
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    d Elisei,

    为了制作视频,我使用了C2000 (F2837xD)多天研讨会的实验11,对LaunchPad (而不是实验板套件)进行了一些细微的修改。  研讨会材料和实验室代码可在以下网址找到:

    http://processors.wiki.ti.com/index.php/C2000_Multi-Day_Workshop

    使用LaunchPad在为期一天的C2000 (F2837xD)研讨会的实验4中也可以找到略有不同的版本。  研讨会材料和实验室代码可在以下网址找到:

    http://processors.wiki.ti.com/index.php/C2000_One-Day_Workshop

    我希望这能有所帮助。

    - Ken

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    d Elisei,

    只是为了澄清一下,在您的帖子中 ,文字 说您想复制处理器间通信演示,但您也说您正在使用F2.8377万S LaunchPad。  这是否准确?  F2.8377万S是单核器件,IPC需要F2837xD 双核器件。  请解释一下,以便我们可以更好 地帮助您?

    - Ken

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的,Ken,我想做的是使用ePWM生成正弦。 这种正弦捕捉广告. 然后将其绘制在CCS中。 工作正常。 问题在于,在图形中,正弦波形在更新时会移动。 视频中不会出现这种情况,我无法找出问题所在。 我不知道我能否解释清楚。 感谢你能抽出时间。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    d Elisei,

    要防止图形在CCS中移动,您需要选择缓冲区大小和显示大小 ,使其精确成为采样 缓冲区的倍数。  请记住,CCS中的图形没有像示波器那样的触发器。  对于视频,代码使用 50点圆形 缓冲存储样品。  图形 属性 设置 为“采集缓冲区”大小为50 (DSP数据类型 为16位无符号整数),“采样率”(Hz)为5万,“显示数据”大小为50。  如果 这有帮助,请告诉我。

    - Ken

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢KEN。 此致