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/TMS320F28035:在 PWM 前端之间启动 ADC

Guru**** 2589245 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/662327/ccs-tms320f28035-start-adc-between-pwm-fronts

器件型号:TMS320F28035

工具/软件:Code Composer Studio

你好。 我正在为 BLDC 电机创建驱动程序。 它可以正常工作、但我想添加单分流器的电流测量值。 现在、我每1ms 启动一次 ADC、因此 resumalts 会产生噪声。 我想、如果我在经过一段时间的 PWM 点击后开始谈话、我将获得更好的结果。

我可以实现吗?

以下是我的代码、其中 ePWM 和 ADC:

AdcRegs.ADCCTL1.bit.INTPULSEPOS= 1;//ADCINT1在 AdcResults 锁存
器 AdcRegs.INTSEL1N2.bit.INT1E 之后跳闸 = 1;//启用 ADCINT1
AdcRegs.INTSEL1N2.bit.INT1CONT = 0;//禁用 ADCINT1连续模式
AdcRegs.INTSEL1N2.bit.INT1SEL= 1;//设置 EOC0以触发 ADCINT1以触发

AdcRegs.ADCSOC0CTL??? ????? ?????)将 SOC0通道选择设置为 ADCINA5 (在内部连接到温度传感器)
AdcRegs.ADCSOC1CTL.bit.CHSEL= 1;//(????????????? ????? 将 SOC1通道选择设置为 ADCINA5 (在内部连接到温度传感器)勘误表变通办法
AdcRegs.ADCSO2CTL.bit.CHSEL= 5;//temp0 MCU
AdcRegs.ADCSO3CTL.bit.CHSEL= 8;//temp1 AdcRegs.ADCCOCL.ADCSOC0
= ADCTR2.ADCTRL = ADCSOTCL.ADCTR0;ADCSOCTR1.ADCTR1.ADCTRL = ADCTR1.ADCTR2.ADCTR1.TCL.ADCTR0 = ADCTR1.ADCTR0 = ADCTR1.ADCTR2.ADCTR1.ADCTR1.ADCTR1.ADCTRL = ADCTR1.ADCTR1.ADCTR1.ADCTR2.ADCTRL = ADCTR1.ADCTR1.TCM0



//设置 EPWM1A
上的 SOC0启动触发器勘误表 ADcRegs.ADCSOC2CTL.bit.TRIGSEL = 0;//设置 EPWM1A 上的 SOC0启动触发器勘误表
AdcRegs.ADCSOC3CTL.bit.TRIGSEL= 0;
AdcRegs.ADCSOC4CTL.PS

= 36位 ADC36.ADCMCTL.ADC36.ADC36.ADCMCTL.ADC36.ADC36.ADCTIGCLP=36位 ADC36.ADC36.ADCTRCLK 周期;ADC36.ADC36.ADCMCTRCL.ADC36.ADCTRCL.ADC36.ADC36.ADC36.ADC36.ADCTRCLPs = ADC
//将 SOC1 S/H 窗口设置为37个 ADC 时钟周期,(36个 ACQPS 加1)勘误表变通办法
AdcRegs.ADCSOC2CTL.bit.ACQPS= 36;//将 SOC1 S/H 窗口设置为37个 ADC 时钟周期,(36个 ACQPS 加1)勘误表 AdcRegs.ADCSOC3CTL.bit.ACQPS



= 36个 ADCCTRL = ADCCTR1.tb.ADCCTRL = 36


个 ADCCTRK = ADCCTRF_ADCCTRL = ADCCTRM 36个 ADCCTRK = ADCCTRL = ADCCTRM 36个 ADCCTRK = ADCCTRL (ADCCTRL = ADCC3CTL = ADCC3CTL = ADCC3CTL //对
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;

//在0 EPwm1Regs.CMTL.RCC.PHM1RP.AMCC.AMCC.WCTL.STR=






0;SYSMRP.WCMDR.AMPCM1RP.DR.WCMTL.RP.WCMTL.RP.WCMTL.DR.WCMTL.TL.DR.WCMTL.TL.TL.TL.TL.RCMPADDR.TL.TL.TL.TL.TL.RCMPADDR.TL.TL.TL.RCMPADRCMPO.TL.TL.RCMPADRCMTL.TL.TL.TL.TL.TL.TL.TL.TL.TL.TL.TL.TL.RCMTL.RCMTL.TL.RCMPO. //设置比较 A 值
EPwm1Regs.CMPB = 0.5 * EPWM1_TIMER_TBPRD; //设置比较 B 值

//设置操作
EPwm1Regs.AQCTLA.bit.ZRO = AQ_SET; //在零
EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR 上设置 PWM1A; //在事件 A 上清除 PWM1A,向上计数

//EPwm1Regs.AQCTLB.bit.ZRO = AQ_SET; //将 PWM1B 置为零
//EPwm1Regs.AQCTLB.bit.CBU = AQ_CLEAR; //清除事件 B 上的 PWM1B,向上计数

//低电平有效 PWM -设置死区
EPwm1Regs.DBCTL.bit.out_mode = DB_full_enable;
EPwm1Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC;EPwm1Regs.DBCTL.bit.DBWRM1=
DB_DPWDD_RM1; DB_REDM1LD_REP.DB_REP.DB_REDP_DP_LD_REDM.DB_REDP_REM1REP.DB_REDP_DP_LD_REM1REDP_LD_REDP_REML.DB_DP_REDP_REM1RE



//中断,我们将在其中更改比较值
EPwm1Regs.ETSEL.bit.INTSEL = et_CTR_ZERO; //选择零事件
EPwm1Regs.ETSEL.bit.INTEN 上的 INT = 1; //启用 INT
EPwm1Regs.ETPS.bit.INTPRD = et_3rd; //在发生第三个事件时生成 INT


//信息此示例用于跟踪
// CMPA/CMPB 值
的移动方向,允许的最小值和最大值以及
//指向正确 ePWM 寄存
器 epwm1_info.EPwmTimerIntCount = 0的指针; //将中断计数器
epwm1_info.EPwmRegHandle =&EPwm1Regs; //将指向 ePWM 模块

epwm1_info.ePWMx 的指针设置为0;
}

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

    你好

    我认为您应该对该代码进行两处更改:

    1) 1)根据 SPRUGE5文档、第33页 ADCTRIG 必须设置为"0x05"-这意味着"ePWM1的 ADCSOCA 信号"。

    2) 2)然后、您应该将 ePWM 设置为生成"ADCSOCA"脉冲。 请看 SPRUGE9文档、第134页:您应该设置"ETSEL.bit.SOCASEL" 来选择在所需的时刻生成 ADCSOCA 信号(CTR=ZRO 或 CTR=PRD)、然后您应该将"ETSEL.bit.SOCAEN = 1"设置为"全局"启用此信号。 请不要忘记将"ETPS.bit.SOCAPRD"设置为非零 vallue。 否则永远不会生成信号。

    3) 3)我还建议您禁用 ePWM 中断并仅保留 ADCEOC 中断。 Beacuse 现在可以使 ADC 中断的频率与 ePWM 中断相同、但 ADC 中断更好、因为您可以在其中准备好 ADC 结果。 还应考虑将 ADC 中断更改为 EOC5而不是 EOC0、因为当您从 EOC5进入 ADC 中断时、其他 ADC 通道可能不会在该时间转换。 尽管这取决于您的代码、当然...