TMS320F28P650SH: CMPSS误触发

Part Number: TMS320F28P650SH


image.png

按勘误表所述进行了修改仍会导致CMPSS11误触发

image.png

CMPSS的滤波器是大于50ns的

  • 已经收到了您的案例,调查需要些时间,感谢您的耐心等待。

  • 能告诉我您的公司名称吗(英文的)

  • Wuhan Land Electronics Co., Ltd. 谢谢

  • 若ADC采样同一AGPIO模拟引脚时CMPSS11仍持续跳闸,最常见原因是外部网络导致的干扰持续时间超出预期。若响应时间允许,可采用稍强的滤波设置(增加100-200纳秒延迟,但能可靠抑制极短事件)。

    关键在于应用勘误表中的“ADC预处理”方案:在采样受影响通道前,先对连接已知电源轨(如3.3V)的通道执行虚拟转换,使采样保持电容初始电压接近目标值。此举可减少瞬态反冲对共享节点的干扰。

  • 如上所述代码,CMPSS的滤波已经到us量级仍会出现误触发,所以一味增加滤波时间我认为是没有什么作用的。其次您说的在采样受影响通道前,先对连接已知电源轨(如3.3V)的通道执行虚拟转换,这个有没有示例代码表示一下如何操作,谢谢

  • 当然,ADC预充电的解决方法本质上是在转换“问题”AGPIO通道之前,对连接已知电源轨的通道进行一次临时转换。目的是让ADC采样/保持电容从接近预期电压的位置开始工作,从而大幅降低共享AGPIO节点上的电荷反冲。

    一个简单示例如下:

    选择 ADC_SOC_NUMBER0 = 预充电通道(ADC 输入物理连接至 3.3V)
    选择 ADC_SOC_NUMBER1 = 受影响通道(待采样的 AGPIO 模拟引脚)
    假设为每个通道分配两个中断:

    ADC_setInterruptSource(ADCA_BASE, ADC_INT_NUMBER1, ADC_SOC_NUMBER0);
    ADC_enableInterrupt(ADCA_BASE, ADC_INT_NUMBER1);
    ADC_clearInterruptStatus(ADCA_BASE, ADC_INT_NUMBER1);
    
    
    ADC_setInterruptSource(ADCA_BASE, ADC_INT_NUMBER2, ADC_SOC_NUMBER1);
    ADC_enableInterrupt(ADCA_BASE, ADC_INT_NUMBER2);
    ADC_clearInterruptStatus(ADCA_BASE, ADC_INT_NUMBER2);

    那么当我们想要读取时

    static inline uint16_t read_withh_precondition(void)
    {
    uint16_t dummy, value;
    
    ADC_clearInterruptStatus(ADCA_BASE, ADC_INT_NUMBER1);
    ADC_forceSOC(ADCA_BASE, ADC_SOC_NUMBER0);
    
    while(!ADC_getInterruptStatus(ADCA_BASE, ADC_INT_NUMBER1)) { }
    ADC_clearInterruptStatus(ADCA_BASE, ADC_INT_NUMBER1);
    
    dummy = ADC_readResult(ADCARESULT_BASE, ADC_SOC_NUMBER0);

    然后立即采样目标通道:

    ADC_clearInterruptStatus(ADCA_BASE, ADC_INT_NUMBER2);
    ADC_forceSOC(ADCA_BASE, TARGET_SOC);
    
    while(!ADC_getInterruptStatus(ADCA_BASE, ADC_INT_NUMBER2)) { }
    ADC_clearInterruptStatus(ADCA_BASE, ADC_INT_NUMBER2);
    
    value = ADC_readResult(ADCARESULT_BASE, ADC_SOC_NUMBER0);
    return value;
    }