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/TMS320F28069M:[问题] ADC SOC

Guru**** 2541200 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/799163/ccs-tms320f28069m-problem-adc-soc

器件型号:TMS320F28069M

工具/软件:Code Composer Studio

大家好、

我正在尝试实现峰值电流模式控制器、并希望在 EPWM1B 下降沿创建 ADC 中断。

请参阅:

当我运行下面的代码时、GPIO 触发时间比 EPWM1B 的上升沿晚1us。

我想在下降沿运行它、是否知道为什么会出现这个问题?

空 InitEPwm1()

//
//启用 TZ1和 TZ2作为单次触发源
//
EALLOW;

//EPwm1Regs.TBPHS = 0;//将相位寄存器设置为零
EPwm1Regs.TBPRD = 449;//周期= 300 TBCLK 计数//(200KHz @ 60MHz 时钟)
EPwm1Regs.CMPA.half.CMPA = 449;
EPwm1Regs.CMPB = 228;//比较 B = 400 TBCLK 计数
EPwm1Regs.TBPHS.Half.TBPHS = 0;//将相位寄存器设置为零
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;//非对称模式
EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;//相位加载被禁用
EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;//时钟与 SYSCLKOUT 的比率
EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;
EPwm1Regs.TBCTL.bit.PRDLD = TB_SHADOW;

EPwm1Regs.TBCTR = 0;//清除 TB 计数器
EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_DISABLE;
EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;// TBCTR 上的负载=零
EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;// TBCTR 上的负载= 0

EPwm1Regs.AQCTLA.bit.ZRO = AQ_SET;//将 PWM1A 设置为零
EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR;

EPwm1Regs.AQCTLB.bit.ZRO = AQ_SET;
EPwm1Regs.AQCTLB.bit.CBU = AQ_CLEAR;

//定义事件(DCA

EDIS;

void ADC_init (void)

ePWM1B 上具有中断的/* ADC */
EALLOW;

AdcRegs.ADCCTL1.bit.ADCBGPWD = 1;//电源 ADC BG
AdcRegs.ADCCTL1.bit.ADCREFPWD = 1;//电源基准
AdcRegs.ADCCTL1.bit.ADCPWDN = 1;//电源 ADC
AdcRegs.ADCCTL1.bit.ADCENABLE = 1;//启用 ADC
AdcRegs.ADCCTL1.bit.ADCREFSEL = 0;//选择内部 BG


AdcRegs.ADCCTL2.bit.ADCNONOVERLAP = 1;//启用非重叠模式/CLA
AdcRegs.ADCCTL2.bit.CLKDIV2EN = 1;//启用非重叠模式/CLA
AdcRegs.ADCCTL1.bit.INTPULSEPOS = 1;// ADCINT1在 AdcResults 锁存后跳闸
AdcRegs.INTSEL1N2.bit.INT1E = 1;//启用 ADCINT1
AdcRegs.INTSEL1N2.bit.INT1CONT = 0;//禁用 ADCINT1连续模式
AdcRegs.INTSEL1N2.bit.INT1SEL = 1;//设置 EOC1以触发 ADCINT1触发

AdcRegs.ADCSOC0CTL.bit.ACQPS = 6;
AdcRegs.ADCSOC1CTL.bit.ACQPS = 6;
AdcRegs.ADCSOC0CTL.bit.TRIGSEL = 6;
AdcRegs.ADCSOC1CTL.bit.TRIGSEL = 6;
AdcRegs.ADCSOC0CTL.bit.CHSEL = 9;// Vout B1
AdcRegs.ADCSOC1CTL.bit.CHSEL = 10;// Vout B2

EPwm1Regs.ETSEL.bit.SOCBEN = 1;
EPwm1Regs.ETSEL.bit.SOCBSEL = 6;// 6.
EPwm1Regs.ETPS.bit.SOCBPRD = 1;

EDIS;

void GPIO_init (void)

EALLOW;
//通用输入/输出
GpioCtrlRegs.GPBMUX1.bit.GPIO34 = 0;
GpioCtrlRegs.GPBMUX1.bit.GPIO39 = 0;
GpioCtrlRegs.GPAMUX2.bit.GPIO19=0;

// GPIO 作为输出
GpioCtrlRegs.GPBDIR.bit.GPIO34 = 1;
GpioCtrlRegs.GPBDIR.bit.GPIO39 = 1;
GpioCtrlRegs.GPADIR.bit.GPIO19 = 1;

// GPIO 关闭/打开(1 =关闭、0为打开)
GpioDataRegs.GPBSET.BIO34 = 1;
GpioDataRegs.GPBSET.bit.GPIO39 = 0;
//GpioDataRegs.GPASET.bit.GPIO19=1;
EDIS;

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

    您是否正在监控 GPIO12? 当您说"GPIO 触发器"时、您指的是哪个边沿方向(上升/下降)? 您何时看到互补 GPIO 边沿? 您是否进行了优化编译?

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

    没有、我正在监控 GPIO19。 我是指下降沿方向。

    我确实使用了正常的方法来编译它、因此我认为我没有使用优化来编译它。

    不管怎样、我让它工作了。。。 "问题"是我没有从 RAM 执行它、现在我执行了、并且速度要快得多。

    除了在 ADC 转换后进入 ADC 中断大约需要1uS 之外、为什么这么长以及是否可以使这个延迟更短?

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

    Klaas、

    我没有在与 AppNote 关联的参考代码中看到 GPIO19配置、因此我无法评论该信号在您的系统中执行的操作。

    您如何确定 ADC 中断何时开始? 参考代码使用 GPIO12进行外部性能评测。 更精确的延迟测量方法是从 ISR 内读取 ePWM TBCTR 值。 由于您知道 ADC 是由 CMPB 递增触发的、因此可以将当前的 TCBTR 值与 CMPB 进行比较、以了解经历了多少个 EPWM 周期。

    中断延迟由 ADC 转换时间(由 ADC 设置决定)和固有 的 ISR 上下文切换时间组成、在最佳条件下通常在14个周期范围内。

    Tommy

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

    嗯、你是对的。。。 我没有添加 ISR 代码。

    当我将 CMPB 值设置为100时、它将在大约203 (@200kHz、90Mhz 时钟、TBPRD = 450)上进入我的中断。

    这是一个巨大的延迟、您是否知道为什么需要如此多的时钟周期?

    谢谢!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您是否将 ISR 中的 TBCTR 值保存到变量以供观察? 直接通过表达式窗口读取 TBCTR 将不准确。

    在转换完成之前、ADCINT1信号不会生效、因此当当前 ADC 配置为2次非重叠模式转换且 CLKDIV2时、ADC 转换的节拍数为:2次转换 x 20个周期 x 2个 SYSCLK =~80个周期。

    如果您假设 ISR 响应的节拍数为~20、则剩余的节拍数为~100。

    系统中是否有任何阻塞事件、如其他中断或原子操作?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您的回答、这让我更加清楚! 我预计每通道/采样的速度将远远超过444ns。