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/TMS320F28335:ADC 和 ePWM 中断

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/790093/ccs-tms320f28335-adc-and-epwm-interrupts

器件型号:TMS320F28335
主题中讨论的其他器件:C2000WARE

工具/软件:Code Composer Studio

尊敬的先生:

当 ADC 中断 发生时、我已经编写了一个代码来使用 EPwm1转换开始来读取 ADC 样本、并且我想在 epwminterrupt ISR 中使用这些值。 但 ADC 未显示任何值、但两个 ISR 都在执行。 请建议对所附代码进行任何更正。

#include "DSP28x_Project.h" //器件头文件和示例包括文件
#include 
#include 


void InitEPwm1Example (void);
void GPIO_Setup1 (void);


float sum=0.0f;


float pi=2.0f*3.141592f;
float input1、 Sin_Out1、input2、Sin_Out2;
long GlobalQ=global_Q;
float A1、B1、C1、A2、B2、C2;float theta=0.0f;//float deltheta=0.31415926f;
//float deltheta=(float)(1.8f*ploat pi/180);//float deltheta=0.0400=0.40float
float d=0.40f
;dfloat float float d=0.0400=0.40float d=0.40f=0.40f=0.40fdf

;dfloat float float float f=0.40d=0.40f=0.40d=0.40f=0.40df;d=0.40float f=0.40d=0.40f=0.40f=0.




float VM=0.15f;float offtrim=1.4434f;

float A[10];
long b[10];
float VACT、IACt;
float Iaref、VDref、VQref、VZref、 vgd、vgq、vgZ;
float ukD、ukQ、ukZ、ukIg;
//
函数原型
//
_中断 void ADC_ISR (void);
_中断 void ePWM1A_COMPARE_ISR (void);


UINT16 LoopCount;
UINT16 ConversionCount;
UINT16 Voltage1[400];
uint16 CURRENT[400];
//
// Main
//
void main (void)
{

InitSysCtrl();
EALLOW;
#IF (CPU_FRQ_150MHz) //默认- 150MHz SYSCLKOUT
//
// HSPCLK = SYSCLKOUT/2*ADC_MODCLK2 = 150/(2*3)= 25.0MHz
//
#define ADC_MODCLK 0x3
#endif
#IF (CPU_FRQ_100MHz)
//
// HSPCLK = SYSCLKOUT/2*ADC_MODCLK2 = 100/(2*2)= 25.0MHz
//
#define ADC_MODCLK 0x2
#endif
EDIS;

EALLOW;
SysCtrlRegs.HISPCP。all = ADC_MODCLK;
EDIS;
Dint;
InitPieCtrl();

IER = 0x0000;
IFR = 0x0000;

InitPieVectTable();

EALLOW; //写入 EALLOW 受保护的寄存器需要此操作
PieVectTable.EPWM1_INT =&ePWM1A_COMPARE_ISR;
PieVectTable.ADCINT =&ADC_ISR;
EDIS;//这是禁止写入 EALLOW 受保护寄存器所必需的

GPIO_Setup1 ();
InitEPwm1Examples();

AdcRegs.ADCMAXCONV.ALL = 0x0001; //在 SEQ1上设置2 conv
AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x3;//将 ADCINA3设置为第1个 SEQ1转换器
AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x2;//将 ADCINA2设置为第2个 SEQ1转换器
AdcRegs.ADCTRL2.bit.ePWM_SOCA_SEQ1 = 1;
AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1;//启用 SEQ1中断(每个 EOS)
PieCtrlRegs.PIEIER1.bit.INTx6=1;
PieCtrlRegs.PIEIER3.bit.INTx1 = 1;
IER |=(4|1);

EINT; //启用全局中断 INTM
ERTM; //启用全局实时中断 DBGM

for (;;);
}


void GPIO_Setup1 (void){
EALLOW;
GpioCtrlRegs.GPAPUD.bit.GPIO0 = 0;//启用 GPIO0上的上拉
GpioCtrlRegs.GPAPUD.bit.GPIO1 = 0;//启用 GPIO1上的上拉
GpioCtrlRegs.GPAPUD.bit.GPIO2 = 0;//启用 GPIO2上的上拉
GpioCtrlRegs.GPAPUD.bit.GPIO3 = 0;//启用 GPIO3上的上拉
GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1;// GPIO0 = PWM1A
GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 1;// GPIO1 = PWM1B
GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 1;// GPIO2 = PWM2A
GpioCtrlRegs.GPAMUX1.bit.GPIO3=1;// GPIO3=PWM2B
GpioCtrlRegs.GPADIR.bit.GPIO24=0;
GpioCtrlRegs.GPAMUX2.bit.GPIO24=0;
GpioCtrlRegs.GPAPUD.bit.GPIO24=0;
GpioCtrlRegs.GPAQSEL2.bit.GPIO24=0;
GpioCtrlRegs.GPBMUX1.bit.GPIO32 = 0;
GpioCtrlRegs.GPBDIR.bit.GPIO32 = 1;
EDIS;

}
void
InitEPwm1Examples()
{
//
//设置 TBCLK
//
//EPWM1 A 和 B 为 GPIO 0和1
EPwm1Regs.TBCTL.bit.CTRMODE = 2;//向上计数递减
EPwm1Regs.TBPRD = 1875; //设置计时器周期
EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;//禁用相位加载
EPwm1Regs.TBPHS.Half.TBPHS = 0x0000; //相位为0
EPwm1Regs.TBCTR = 0x0000; //清除计数器
EPwm1Regs.TBCTL.bit.HSPCLKDIV = 001;//时钟与 SYSCLKOUT 之比
EPwm1Regs.TBCTL.bit.CLKDIV = 000;
EPwm1Regs.TBCTL.bit.SYNCOSEL=1;
EPwm1Regs.CMPA.half.CMPA =937;//设置比较值
EPwm1Regs.CMPB = 937; //设置比较 B 值
EPwm1Regs.DBCTL.bit.out_mode=3;
EPwm1Regs.DBCTL.bit.POLSEL=2;
EPwm1Regs.DBCTL.bit.in_mode=0;
EPwm1Regs.DBRED=20;
EPwm1Regs.DBFED=20;
EPwm1Regs.AQCTLA.bit.CAU=2;//将 PWM1A 设置为零
EPwm1Regs.AQCTLA.bit.CAD=1;
EPwm1Regs.AQCTLB.bit.CBU=2;
EPwm1Regs.AQCTLB.bit.CBD = 1;
EPwm1Regs.ETSEL.bit.INTEN = 1;
EPwm1Regs.ETSEL.bit.INTSEL=1;
EPwm1Regs.ETPS.bit.INTPRD=1;
EPwm1Regs.ETSEL.bit.SOCAEN = 1; //在组上启用 SOC
EPwm1Regs.ETSEL.bit.SOCASEL = 4;//从 CPMA 中选择 SOC、以进行递增计数
EPwm1Regs.ETPS.bit.SOCAPRD = 1; //在发生第一个事件时生成脉冲

EPwm2Regs.TBCTL.bit.CTRMODE = 2;//向上计数递减
EPwm2Regs.TBPRD = 1875; //设置计时器周期
EPwm2Regs.TBCTL.bit.PHSEN = TB_DISABLE;//禁用相位加载
EPwm2Regs.TBPHS.Half.TBPHS = 0x0000; //相位为0
EPwm2Regs.TBCTR = 0x0000; //清除计数器
EPwm2Regs.TBCTL.bit.HSPCLKDIV = 001;//时钟与 SYSCLKOUT 之比
EPwm2Regs.TBCTL.bit.CLKDIV = 000;
EPwm2Regs.TBCTL.bit.SYNCOSEL=1;
EPwm2Regs.CMPA.half.CMPA =937;//设置比较值
EPwm2Regs.CMPB = 937; //设置比较 B 值
EPwm2Regs.DBCTL.bit.OUT_MODE=3;
EPwm2Regs.DBCTL.bit.POLSEL=2;
EPwm2Regs.DBCTL.bit.IN_MODE=0;
EPwm2Regs.DBRED=20;
EPwm2Regs.DBFED=20;
EPwm2Regs.AQCTLA.bit.CAU=2;//将 PWM1A 设置为零
EPwm2Regs.AQCTLA.bit.CAD=1;
EPwm2Regs.AQCTLB.bit.CBU=2;
EPwm2Regs.AQCTLB.bit.CBD = 1;
}
__interrupt void ePWM1A_COMPARE_ISR (void)
{
postate=GpioDataRegs.GPADAT.bit.GPIO24;

if (postate> prestate){
v2[count]=1;
Theta=0.0f;
GpioDataRegs.GPBTOGGLE.bit.GPIO32=1;
}

prestate=postate;


M=Voltage1[ConversionCount];

b1=0.5f+(m-0.5f)*sin (theta);
b2=0.5f+(m-0.5f)*sin (theta+3.141592f);
EPwm1Regs.CMPA.half.CMPA =EPwm1Regs.TBPRD-(UINT16)(B1*EPwm1Regs.TBPRD);//设置比较值
EPwm1Regs.CMPB = EPwm1Regs.TBPRD-(UINT16)(B1*EPwm1Regs.TBPRD); //设置比较 B 值
EPwm2Regs.CMPA.half.CMPA =EPwm1Regs.TBPRD-(UINT16)(B2*EPwm1Regs.TBPRD); //设置比较 A 值
EPwm2Regs.CMPB = EPwm1Regs.TBPRD-(UINT16)(B2*EPwm1Regs.TBPRD); //设置比较 B 值
V1[count]=EPwm1Regs.CMPA.half-CMPA;
//v2[count]=EPwm2Regs.CMPA.half-CMPA;
// v1[count]=b;*/
//EPwm1Regs.CMPA.half.CMPA=EPwm1Regs.TBPRD-_IQsat (_IQ28mpy (b、EPwm1Regs.TBPRD)、EPwm1Regs.TBPRD、0);
// v1[count]=b;
计数=计数+ 1;
Theta=theta+deltheta;
IF (theta->PI){
计数= 0;
Theta=0.0f;
}
d1[计数]=b1;
EPwm1Regs.ETCLR.bit.INT=1;
PieCtrlRegs.PIEACK.All=4;
//
//确认此中断以从组1接收更多中断
//
//PieCtrlRegs.PIEACX.ALL = PIEACK_Group1;
return;
}
_interrupt void ADC_ISR (void)
{
Voltage1[ConversionCount]= AdcRegs.ADCRESULT0 >> 4;
Current[ConversionCount]= AdcRegs.ADCRESULT1 >>4;
A[ConversionCount]=(float)(Voltage1[ConversionCount]*0.000732600f);//增益为3/4095
b[ConversionCount]=(float)(Current[ConversionCount]*0.000732600f);//增益为3/4095
VACL=a[转换计数]-1.4434f;
IACt=b[转换计数]-1.4434f;
if (ConversionCount = 400)
{
ConversionCount = 0;
sum=0.0f;
}
其他
{
ConversionCount++;
}

AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1; //重置 SEQ1
AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1; //清除 INT SEQ1位
PieCtrlRegs.PIEACX.ALL = PIEACK_Group1;//确认 PIE 中断

返回;
} 

 

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

    您在 ADCRESULT 寄存器中观察到哪些值?

    C2000Ware 中的 ADC_SoC 示例是否仍适用于您的设置?

    Tommy
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、ADC SoC 示例工作正常。 但在我的程序中、它显示了一些随机值。 通常为1和0混合。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 USER="Bala Naga lingaiah"]是的、ADC SoC 示例正常工作。 但在我的程序中、它显示了一些随机值。 大部分为1和0混合。[/引号]

    恐怕我无法对问题描述有任何有用的理解。 如果 ADC_SoC 示例正常工作、最好将工作 ADC 配置与程序进行比较。

    对于调试、我建议对程序中的数据流进行自下而上的分析。 首先确定 ADCRESULT 值与预期输入信号的偏离程度。 必要时使用静态直流信号以简化过程。

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

    自上次更新以来已经有一段时间了。 我假设您能够解决您的问题。

    如果没有、请回复此主题。 如果该线程由于超时而锁定、请创建一个描述问题当前状态的新线程。

    Tommy
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    现在工作正常。 我没有获取 ePWM 中断、而是获取计时器中断。 感谢您寻求解决我的问题。