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.

[参考译文] TMS320F28335:通过 ADC 引脚电压控制进行 ePWM 占空比调整

Guru**** 2595805 points
Other Parts Discussed in Thread: TMS320F28335, C2000WARE, CONTROLSUITE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1227690/tms320f28335-epwm-duty-cycle-adjustment-with-voltage-control-trough-adc-pins

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

我正在使用 TMS320F28335微处理器、在我的代码 AdcRegs.ADCCTL1.bit.ADCREFSEL = 0中;
AdcRegs.ADCSOC0CTL.bit.CHSEL = 5;
AdcRegs.ADCSOC0CTL.bit.TRIGSEL = 5;
AdcRegs.ADCSOC0CTL.bit.ACQPS = 6;
CCS 会显示#137 struct "adc_regs"没有字段、请帮我调试、下面是我的全部代码

#include "DSP28x_Project.h"
#include
#include
#include
extern UINT16 RamfuncsLoadStart;
extern UINT16 RamfuncsLoadSize;
extern UINT16 RamfuncsLoadEnd;
外部 UINT16 RamfuncsRunStart;


void InitEPwm1Example (void);

void InitEPwmTimer (void);

空 Debun (无符号短整型计数);

//针对此文件中的函数的 prototype 语句。

INT V0 = 0;


__interrupt void epwm1_timer_ISR (void);

#define PWM1_INT_ENABLE 1.
#define PWM2_INT_ENABLE 1.
#define PWM3_INT_ENABLE 1.
#define PWM4_INT_ENABLE 1.


#define EPWM1_TIMER_TBPRD 5000 //周期寄存器
#define EPWM1_MAX_CMPA 1200
#define EPWM1_MIN_CMPA 50.
#define EPWM1_MAX_CMPB 600
#define EPWM1_MIN_CMPB 50.

#define EPWM2_TIMER_TBPRD 5000 //周期寄存器
#define EPWM2_MAX_CMPA 1200
#define EPWM2_MIN_CMPA 50.
#define EPWM2_MAX_CMPB 600
#define EPWM2_MIN_CMPB 50.


#define EPWM_CMP_UP 1.
#define EPWM_CMP_DOWN 0
/**
* main.c
*/
int main (空)

InitSysCtrl();

InitEPwm1Gpio();


Dint;

InitPieCtrl();

IER = 0x0000;
IFR = 0x0000;

InitPieVectTable();
EALLOW;//写入 EALLOW 保护寄存器需要执行此操作
PieVectTable.EPWM1_INT =&epwm1_timer_isr;
EDIS;//这需要禁用对 EALLOW 保护寄存器的写入


EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;
EDIS;

InitEPwm1Example();
InitEPwmTimer ();//在本示例中,仅初始化 ePWM 计时器


IER |= M_INT3;
PieCtrlRegs.PIEIER3.bit.intx1 = PWM1_INT_enable;

EALLOW;
GpioCtrlRegs.GPAMUX1.bit.GPIO8 = 0;
GpioCtrlRegs.GPADIR.bit.GPIO8 = 1;
GpioDataRegs.GPACLEAR.bit.GPIO8 = 1;

EDIS;

EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;//停止所有 TB 时钟
EDIS;


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

//配置 ADC
EALLOW;
AdcRegs.ADCCTL1.bit.ADCREFSEL = 0;

AdcRegs.ADCSOC0CTL.bit.CHSEL = 5;//将 SOC0通道选择设置为 ADCINA4
// AdcRegs.ADCSOC1CTL.bit.CHSEL = 2;//将 SOC1通道选择设置为 ADCINA2
AdcRegs.ADCSOC0CTL.bit.TRIGSEL = 5;//在 EPWM1A 上设置 SOC0启动触发、由于 SOC0首先循环转换、然后是 SOC1
// AdcRegs.ADCSOC1CTL.bit.TRIGSEL = 5;//在 EPWM1A 上设置 SOC1启动触发、原因是 SOC0先循环转换、然后循环 SOC1
AdcRegs.ADCSOC0CTL.bit.ACQPS = 6;//将 SOC0 S/H 窗口设置为7个 ADC 时钟周期、(6 ACQPS + 1)
// AdcRegs.ADCSOC1CTL.bit.ACQPS = 6;//将 SOC1 S/H 窗口设置为7个 ADC 时钟周期、(6 ACQPS + 1)
EDIS;

memcpy (&RamfuncsRunStart、&RamfuncsLoadStart、(UINT32)&RamfuncsLoadSize);
InitFlash();
InitAdc();

for (;;)

EPwm1Regs.CMPA.half.CMPA = V0;

EPwm1Regs.AQCTLA.bit.ZRO = AQ_SET;//将 PWM1A 设置为零
EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR;//针对事件 A 清除 PWM1A、向上计数

EPwm1Regs.AQCTLB.bit.ZRO = AQ_Clear;//将 PWM1B 设置为零
EPwm1Regs.AQCTLB.bit.CAU = AQ_SET;//在事件 B 上清除 PWM1B、向上计数

GpioDataRegs.GPACLEAR.bit.GPIO8 = 1;


__ asm (" NOP");
}

}
void InitEPwm1Example()

//设置 TBCLK
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;//递增计数
EPwm1Regs.TBPRD = EPWM1_TIMER_TBPRD;//设置计时器周期
EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;//禁用相位加载
EPwm1Regs.TBPHS.half.TBPHS = 0x0000;//相位为0
EPwm1Regs.TBCTR = 0x0000;//清除计数器
EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;//时钟比与 SYSCLKOUT 的比率
EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;

//在零时设置影子寄存器加载
EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_shadow;
EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_影子;
EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;

//设置比较值
EPwm1Regs.CMPA.half.CMPA = EPWM1_MAX_CMPA;//设置比较 A 值
EPwm1Regs.CMPB = EPWM1_MAX_CMPB;//设置比较 B 值

//设置操作
EPwm1Regs.AQCTLA.bit.ZRO = AQ_SET;//将 PWM1A 设置为零
EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR;//针对事件 A 清除 PWM1A、向上计数

EPwm1Regs.AQCTLB.bit.ZRO = AQ_Clear;//将 PWM1B 设置为零
EPwm1Regs.AQCTLB.bit.CAU = AQ_SET;//在事件 B 上清除 PWM1B、向上计数

EPwm1Regs.ETSEL.bit.SOCAEN = 1;//在组上启用 SOC
EPwm1Regs.ETSEL.bit.SOCASEL = 6;//在向上计数时从 CMPB 选择 SOC
EPwm1Regs.ETPS.bit.SOCAPRD = 1;//在发生第1个事件时生成脉冲


EPwm1Regs.DBCTL.bit.out_mode = DB_FULL_ENABLE;
EPwm1Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC;
EPwm1Regs.DBRED = 1;
EPwm1Regs.DBFED = 1;

}

空 InitEPwmTimer()

EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;//停止所有 TB 时钟
EDIS;

//设置同步
EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;//直通
//通过

//允许每个计时器同步

EPwm1Regs.TBCTL.bit.PHSEN = TB_ENABLE;


EPwm1Regs.TBPRD = EPWM1_TIMER_TBPRD;
EPwm1Regs.ETSEL.bit.INTSEL = ET_CTRU_CMPB;//在发生零事件时选择 INT
EPwm1Regs.ETSEL.bit.inten = PWM1_INT_ENABLE;//启用 INT
EPwm1Regs.ETPS.bit.INTPRD = ET_1ST;//在发生第1个事件时生成 INT

EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;//开始同步所有计时器
EDIS;

}

__interrupt void epwm1_timer_ISR (void)

V0 = AdcResult.ADCRESULT0;
GpioDataRegs.GPASET.bit.GPIO8 = 1;

//清除此计时器的 INT 标志
EPwm1Regs.ETCLR.bit.INT = 1;

//确认该中断以接收来自组3的更多中断
PieCtrlRegs.PIEACK.all = PIEACK_Group3;

}

空 Debun (无符号短整型){
Volatile unsigned short InnerCount;
while (计数){
计数--;
InnerCount = 10000;
while (InnerCount--);

}
}

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

    您好、HH、

    您是否能够展示来自 CCS 的编译器错误? 此外、您是否尝试过从我们的 C2000WARE SDK 导入示例?  

    此致!

    Ryan Ma

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

    错误包含以下内容:

    #137结构"adc_regs"没有字段"ADCCTL1"

    #137结构"adc_regs"没有字段"ADCSOC0CTL"

    #137结构"adc_regs"没有字段"ADCSOC0CTL"

    #137结构"adc_regs"没有字段"ADCSOC0CTL"

    已输入示例代码、可以使用该代码

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

    您是否确保在 CCS 项目中包含 DSP2803x_GlobalVariableDefs.c 文件?

    您是否尝试过从 C2000WARE SDK 导入 ADC 示例:C:\ti\c2000\c2000\C2000Ware_4_03_00_00\device_support\f2803x\examples\c28\adc_soc?

    此示例使用了上述字段的 adc_regs 结构。

    您能否尝试导入该项目、并在您的其他项目中包含 ADC_regs 结构所需的相应文件。

    此致!

    Ryan Ma

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

    我很确定我已经包含 DSP2833x_GlobalVariableDefs.c 文件
    我使用28335、程序代码从28069更改为28069、因为寄存器的名称和函数有些不同、我不知道改用什么。
    C:\elica\controlSUITE\device_support\F2833x\v142\DSP2833x_examples_ccsv5\adc_soc、我使用了这个示例程序、我的 CCS 的表达式会随着输入电压的变化而变化。

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

    对不起、我单击了错误的设备。 您可以使用这些寄存器、而不是当前在 ADC 中查看的寄存器。 您还可以通过 ADC 寄存器的 TRM 部分找到这些寄存器。

    ADCCTL -> ADCTRL1

    ADCSOC0CTL -> ADCTRL2

    此致!

    Ryan Ma

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

    我已经按照您所描述的方式完成、但有新的错误:

    #137结构"ADCTRL1_BITS"没有字段"ADCREFSEL"

    #137 struct "ADCTRL2_bits"没有字段"CHSEL"

    #137结构"ADCTRL2_BITS"没有字段"TRIGSEL"

    #137 struct "ADCTRL2_bits"没有"ACQPS"字段

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

    您好、HH、

    当迁移到新器件时、请确保查看在整个器件中发生更改的寄存器。 他们可能已更改了命名。

    这些是2833x 的 ADC 寄存器

    此致!

    Ryan Ma