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.
我使用此 TI 处理器和 TI 代码来旋转电机。
作为设计的一部分、添加了多个 ADC 通道(即测量电路板电压、电路板电流等)
TI 电机控制软件使用 EPWM1来触发 ADC 通道1、2和3。
包括4到14个通道是软件触发的、以大约30Hz 的速率读取。
通道0也配置为软件触发。 根据头文件中的文档、通道0存在问题、因此无法用于读取电压。
当 EPWM1触发器被禁用时、包含4到14个通道的运行正常。 未检测到异常。
当 EPWM1触发器被使能时、偶尔会出现2个不同但相似的故障。
第一个故障是、包含4到14个通道的随机 ADC 通道将读回4095的值。 这是不正确的读取。 这大约每秒发生一次。
第二个故障是随机 ADC 通道将读回错误的值。 这大约每2分钟发生一次。
通道4至14不会生成中断。 ADC 通道3在 EOC3上为 MainISR()生成中断。
以上所有内容都是电机未运转的情况。
William、
感谢您访问 E2E 论坛。 我将尽最大努力详细介绍下面的工作原理、但如果可能、您可以附加代码的 ADC 配置部分供我查看、这可能会有所帮助。
我需要查看头文件示例中的措辞、但不使用通道(或 SOC0) 0的根本原因是 ADC 无法正确处理从空闲可预测性出发的第一次转换。 我们的大多数示例代码通过使用 SOC0对 ADC 输入进行"虚拟采样"(通常仅与 SOC1相同的 ADC 输入)来解决此问题。 因此、SOC0-3可能全部从 ePWM 触发、但代码中不使用 SOC0的结果。
由于任何通道/SOC 都可能是空闲状态下的第一个通道、因此 SOC#并不重要。
这的另一个方面是 SOC 状态机如何处理并发转换请求。
默认情况下、所有 SOC 以循环方式处理;最后处理的 SOC 是状态机查找"下一个"转换的位置。
问题1:SOCPRIORITY 寄存器是否处于默认状态、或者代码是否已修改、以优先于更高阶的 SOC1-3?
如果我们看一下您的工作案例、其中 SOC4-14是从 SW 强制启动的;ADC 会按照 SOC4到14之间的顺序对其进行处理。 状态机将以值15结束。 因为唯一的东西是4-14;我们可以确保订单被保留。 在这种情况下、如果您让 ADC 空闲(在一段时间内不转换)、那么 SOC4也可能受到与示例中 SOC0相同的影响。
现在、当启用 ePWM 触发 SOC 时、如果默认为 SOCPRIORITY、则不会产生影响。 但是、由于确实如此、我怀疑您对 Q1的回答是 SOCPRIORITY 已被修改。 如果是这种情况、那么当触发 SOC0-3时、即使已经排队、它们也可能挤占 SOC4-14。
导致问题的原因可能与另一个勘误表有关(如下)。 请告诉我这是否适用于您的系统代码、如果不适用于、我们可以从这里开始。
建议 ADC:采样在前一转换的第14个周期结束时、ADC 结果转换、ACQPS = 6或7
详细信息:在采样阶段结束后、片上 ADC 需要13个 ADC 时钟周期来完成转换。 然后、结果在采样后的第14个周期提供给 CPU、并在第15个周期锁存到 ADC 结果寄存器中。 如果下一个转换的采样阶段在第14个周期终止、CPU 锁存到结果寄存器的结果不能保证在所有运行条件下都有效。
权变措施一些权变措施如下:•由于 ADC 采样和转换阶段的性质、只有两个 ACQPS 值(控制采样窗口)会导致出现上述情况- ACQPS = 6或7。 一种解决方案是避免在 ACQPS 中使用这些值。 •当使用 ADCNONOVERLAP 功能(ADCTRL2寄存器中的位1)时、将不会满足上述条件;因此用户可以随意使用所需的任何 ACQPS 值。 •根据系统中使用的 ADC 采样频率、如果系统要求使用 ACQPS = 6或7、用户可以确定其系统是否会达到上述条件。 例如、如果转换器在 ACQPS = 6时持续转换、则将永远不会满足上述条件、因为采样阶段的结束将始终处于进行中的电流转换的第13个周期。
您好、Matthew、
感谢您在这个问题上的帮助。
以下是头文件中的措辞...
AdcRegs.ADCSOC0CTL.bit.CHSEL = 15;/*虚拟测量值。 避免第一个样本问题 Rev0 Picolo*/\
是否有可解决此问题的修订版1?
我将通过 SOC14单独触发每个 SOC4。
我从结果寄存器中读取该值、然后触发我 刚刚读取的 SOC。
它们并非都同时触发。 这听起来可能是一个问题。
我是否应该从 ePWM 触发所有 SOC?
答案1: 我使用默认的 SOCPRIORITY 值。
我在 ADCCTL2中启用了 ADCNONOVERLAP: AdcRegs.ADCCTL2.bit.ADCNONOVERLAP = 1;
我的默认 ACQPS 为0x07。 我尝试了8和6的 ACQPS、但 我在一个通道上遇到了相同的0xFFF 读取故障。 (全部为 ADCNONOVERLAP 真)
我还有随机错误读取(仍在发生)
请注意、我将 ACQPS 设置为8、0xFFF 的频率似乎已经降低。
它不是每秒1次、而是 每秒1次;有时是几分钟。
短期:
00:00:15.77
00:00:11.00
00:00:17.54
00:02:21.14
00:00:09.43
00:00:24.06
00:01:21.83
00:00:38.34
下面是 TI 代码将 SOC0初始化为 SOC3 、然后是代码将 SOC4初始化为 SOC14
#define ADC_MACROL_INIT ()\ delay_US (ADC_USDELAY);\ AdcRegs.ADCCTL1.all=ADC_RESET_FLAG;\ asm (" NOP ");\ asm (" NOP ");\ EALLOW;\ AdcRegs.ADCCTL1.bit.CBSRT* = ADCCESL.D*= ADCCTL1.ADCLT.ADC0;\ ADCLA.ADCR0 = ADCCEST.ADCL1 + ADCCEST.ADC0 *= ADCLT.ADC0 + ADCLT.ADC0 + ADCCEST.ADC0 + ADCR1 ADCR1 + ADCLT.ADAP*= ADAP/ ADCCEST.ADCR1 + ADCCEST.ADCR* ADCR*= ADCR1 + ADCCESD* /*上电基准*/\ AdcRegs.ADCCTL1.bit.ADCPWDN = 1;/*为 ADC 的其余部分加电*/\ AdcRegs.ADCCTL1.bit.ADCENABLE = 1;//启用 ADC */\ \ asm (" RPT#100 || NOP");\AdcRegs.ADCLA.1=ADCCTL1.ADCCEST.ADC.E1.ADAPS.ADAPS.E1.DEPS.ADCMP0 ;\ADCMP0 信道选择******* /\/***** A0-B7 = ADC 通道0 - 15 ***/\ \\ AdcRegs.ADCSOC0CTL.bit.CHSEL = 15;/*虚拟内存。 避免出现第1个采样问题 Rev0 Picolo*/\ AdcRegs.ADCSO0CTL.bit.TRIGSEL = 5;\ AdcRegs.ADCSO0CTL.bit.ACQPS = 6;\ AdcRegs.ADCOC1CTL.bit.CHSEL = 15;// ChSelect:ADC B7->ADCSOC1* = 6、ADCSOC1RMC1.C0 = 1、ADCSOC1RMCTR0 *、ADC1CTRL = 6、ADCSOC1CTR0 = 1、ADCTR0 * 1。 /*将 SOC0 S/H 窗口设置为7个 ADC 时钟周期、(6个 ACQPS 加1)*/\ \\ AdcRegs.ADCSOC2CTL.bit.CHSEL = 7;//选择:ADC A7->V 相位 B */\ AdcRegs.ADCOC2CTL.bit.TRIGSEL = 5; ADCSOC32.ADC32.ChCCL = 6位 ADC32.ADCCPL.ADCTIGSEL = 6;ADC32.ADCCL.ADC32.ADCTIGCCRC.ADCL.ADCTIGSEL = 6位 ADC B4->V 相位 C */\ AdcRegs.ADCSOC3CTL.bit.TRIGSEL = 5;\ AdcRegs.ADCSO3CTL.bit.ACQPS = 6;\ AdcRegs.INTSEL1N2.bit.TRIGSEL = 1;//启用 ADCINT1 */ ADC1INT1.bit = 3 ;\ ADC1INT1.INT1INT1INT1.INT1INT1.INT1INT1.INTn = 0;\ ADCINT1INT1INT1INT1INT1INT1INT1INT1INT1INT1.INT1INT1.INT1.INT1.INT1INTn = 0;*启用 ADCINT1INT1INT1INT1INT1INT1INT1INT1INT1INT1INT1INT1INT1INT1INT1INTn \ //*为 EPWM1的时基设置启用 CNT_ZERO 的事件触发器*/\ EPwm1Regs.ETSEL.bit.SOCAEN = 1;//启用 SOCA */\ EPwm1Regs.ETSEL.bit.SOCASEL = 2;//启用 TBCNTR = SOCA 的 PRD 事件* = 1位/EEPwCAP1.SORD = 1;\ /*在发生第一个事件时生成 SOCA */\ EPwm1Regs.ETCLR.bit.SOCA = 1;//清除 SOCA 标志*/\ \我的代码..... int channelIndex = 0; int firstAvailableSOC = first_available_SOC; //(SOC4) EALLOW; DO { (AvailelMask & 0x01) { volatile ADCSOCxCTL_REG_ADCSOCxReg =(ADCSOCxCTL_REG*)((long)(&AdcRegs.ADCSOC0CTL)+(1 * firstfirstfirstSOC)));ADCSOCxCTL+ = 0x00+通道控制= ADCSOCxCLM+;ADCSOC0 +通道控制= 0x00+;ADCSOCSOC0 = ADCMCOCCS0 +通道控制= ADCSOC0 = ADC0 = ADCMCTRM = ADCMCL+通道控制寄存器0;ADCSOC0 = ADCMCL+通道控制寄存器= ADCSOC0 = ADC0 +通道;ADCSOC0 = ADCSOC0 +通道控制寄存器= ADC0 = ADCMCOCC0
William、
要启动 SOC4- 14、您是否执行以下操作:
AdcRegs.ADCSOCFRC1.ALL = 0x7FF0;
根据您的观察结果、我认为我们最经常地进入第2个勘误表、尤其是 ACQ_PS 热升的值为8。
从同一 PWM 触发所有 SOC 也应解决您的问题;4-14的触发速率是否适用于您的系统?
Matt
您好、Matt、
我将系统配置为使用 SOC4作为"虚拟"读取、然后将 SOC5至 SOC15分配给我的模拟输入。
然后、我使用0xFFF0触发所有这些。 这似乎可以正常工作。 我没有检测到任何故障。
我最初尝试使用 PWM 触发器、但当电机关闭时、PWM 似乎没有运行、并且我一直需要 ADC 值。
我在 SOC4至 SOC15 (含 SOC15)的通道上使用的 ACQPS 为8。
再次感谢您的帮助。
我认为问题已经解决、除非我遗漏了其他东西。
请告诉我。
William C. Hayes