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.

[参考译文] 编译器/TM4C1290NCPDT:设置 ADC

Guru**** 2524550 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/824066/compiler-tm4c1290ncpdt-setup-adc

器件型号:TM4C1290NCPDT

工具/软件:TI C/C++编译器

您好!

我想将 ADC 设置为循环采样、这样会在超过限制一次时产生中断。  已经起作用的是周期性采样并生成中断。 所需的限值中断、我无法运行。 我找不到适合这一目的的样本,我认为文件至少是"简约"。 如果我启用 LIMIT_CHECK (见下面)、我会得到一个中断、但这会持续触发、程序的其余部分会受到这种干扰。 似乎不会清除中断。 欢迎提供任何帮助或提示。

ADCIntEnableEx (ADC_DEVICE_BASE、ADC_INT_DCON_SS0)和 ADCComparatorIntClear (ADC_DEVICE_BASE、ADC_SEQUENCE)之间有何区别?

提前感谢

Micky

#define ADC_SEQUENCE             0 
#define ADC_SEQUEST_PRIO        0
#define ADC_DEVICE_BASE          ADC0_BASE
#define SYSCTL_PERIPH_ADC_DEVICE SYSCTL_PERIPH_ADC0
#define ADC_INPUT_PIN            GPIO_PIN_2
#define ADC_INPUT_PORT           GPIO_PORTK_base
#define ADC_OPAMPLING         64
#define ADC_DIGITAL_COMP         0
#define ADC_VAL_LOW              20.
#define ADC_VAL_HIGH             750
#define ADC_COMP_RESET           1.
#define ADC_CHANNEL              ADC_CTL_CH19
#define ADC_LAST_STEP            0            
#define ADC_INT_SRC              INT_ADC0SS0  
#define TIMER_ADC3_100ms       TIMER_A
#define TIMER_ADC3_10ms        TIMER_B
#define ADC_SEQUENCER_LEN        8.            


vfnInitAdc(){
SysCtlPeripheralEnable (SYSCTL_Periph_ADC_device); ADCClockConfigSet (ADC0_BASE、ADC_CLOCK_SRC_PLL | ADC_CLOCK_RATE_FULL、24); GPIOPinTypeADC (ADC_INPUT_PORT、ADC_INPUT_PIN); IntDisable (ADC_INT_SRC); ADCIntDisable (ADC_DEVICE_BASE、ADC_SEQUENCE); ADCSequenceDisable (ADC_DEVICE_BASE、ADC_SEQUENCE); ADCHardwareOversampleConfigure (ADC_DEVICE_BASE、ADC_OPAMPLING); ADCSequenceConfigure (ADC_DEVICE_BASE、ADC_SEQUENCE、ADC_TRIGGER_TIMER、ADC_SEQUEST_PRIO); #ifdef READ_VALUE ADCSequenceStepConfigure (ADC_DEVICE_BASE、ADC_SEQUENCE、ADC_LAST_STEP、ADC_CHANNEL | ADC_CTL_IE | ADC_CTL_END); #Elif defined (limit_check) ADCSequenceStepConfigure (ADC_DEVICE_BASE、ADC_SEQUENCE、ADC_LAST_STEP、ADC_CHANNEL | ADC_CTL_CMP0 | ADC_CTL_END); #else #error "ADC define read_value or limit_check " #endif ADCComparatorConfigure (ADC_DEVICE_BASE、ADC_DIGITAL_COMP、ADC_COMP_INT_HIGH_HONCE); ADCComparatorRegionSet (ADC_DEVICE_BASE、ADC_DIGITAL_COMP、ADC_VAL_LOW、ADC_VAL_HIGH); ADCComparatorReset (ADC_DEVICE_BASE、ADC_DIGITAL_COMP、ADC_COMP_RESET、ADC_COMP_RESET); ADCIntClear (ADC_DEVICE_BASE、ADC_SEQUENCE); ADCIntClearEx (ADC_DEVICE_BASE、ADC_INT_DCON_SS0); ADCComparatorIntClear (ADC_DEVICE_BASE、ADC_SEQUENCE); ADCIntEnable (ADC_DEVICE_BASE、ADC_SEQUENCE); // //ADCIntEnableEx (ADC_DEVICE_BASE、ADC_INT_DCON_SS0); // ADCComparatorIntEnable (ADC_DEVICE_BASE、ADC_SEQUENCE); IntEnable (ADC_INT_SRC); TimerControlTrigger (timer_app_base、timer_ADCISC_10ms、true); ADCSequenceEnable (ADC_DEVICE_BASE、ADC_SEQUENCE); } volatile UINT32_t UMAX=0; volatile UINT32_t UMIN=4096; void vfnADCseq0Handler (void) { ADCIntClearEx (ADC_DEVICE_BASE、ADC_INT_DCON_SS0); ADCIntClear (ADC_DEVICE_BASE、ADC_SEQUENCE); ADCComparatorIntClear (ADC_DEVICE_BASE、ADC_SEQUENCE); #ifdef read_value 静态 uint32_t auADCValue[8]; ADCSequenceDataGet (ADC_DEVICE_BASE、ADC_SEQUENCE、AUADCValue); //在 auADCValue[0]中的 der interessante Wert ist nun IF (UMAX auADCValue[0]) Umin=auADCValue[0]; #else guLimit=1; ADCComparatorReset (ADC_DEVICE_BASE、ADC_DIGITAL_COMP、ADC_COMP_RESET、ADC_COMP_RESET); //IntDisable (ADC_INT_SRC); #endif }

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

    您好、Michael、

     遗憾的是、我们没有使用数字比较器的示例代码。  您可能是我在过去两年中首次使用数字比较器模式。 :-)

     请参阅以下高手操作示例。 您好像是在高值带配置迟滞单次触发。 您还可以将 COMP1和 COMP0设置为750和20。 750转换为大约0.18V、20转换为大约4.8mV。 您的输入是否可能经常在介于750和20之间的中值带区域波动? 另请在寄存器窗口中检查 CIC 寄存器和 CTC 寄存器。  这是我唯一能想到的能够持续触发中断的方法。 您的 AIN 引脚上是否有输入曲线? 如果您扩大磁滞或将上限和下限向上移动以进行实验、情况会怎样。 您会看到有什么不同吗?

      

     请参阅 ADCIntClearEX 和 ADCIntClear 的源代码。 如您所见 、ADCIntClearEX 将清除指定的标志、而 ADCIntClear 将只清除序列发生器中的一位。 换言之、ADCISC 寄存器中的[3:0]位中只有一个。

    void
    ADCIntClear (uint32_t ui32Base、uint32_t ui32SequenceNum)
    {
    //
    //检查参数。
    //
    assert (((ui32Base == ADC0_BASE)||(ui32Base == ADC1_base));
    assert (ui32SequenceNum < 4);
    
    //
    //清除中断。
    //
    HWREG (ui32Base + ADC_O_ISC)= 1 << ui32SequenceNum;
    }
    
    void
    ADCIntClearEx (uint32_t ui32Base、uint32_t ui32IntFlags)
    {
    //
    //注意:中断位为"W1C",所以我们不使用逻辑或
    //此处清除请求的位。 这样做将清除所有未决的问题
    //中断、而不仅仅是调用方指定的中断。
    //
    HWREG (ui32Base + ADC_O_ISC)= ui32IntFlags; 

      

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

    您好、Charles、

    感谢您的解释。

    "您的输入是否可能经常在介于750和20之间的中值带区域波动?"

    请参阅上面的代码:我在几秒钟内进行了最小值/最大值观察、 进行了连续采样 、结果值介于230和590之间。 因此、我确实设置了具有一定裕度的数字转换器、并且完全没有触发。 当我对样本求平均值时、我不确定平均值样本是馈送到数字比较器还是未平均值。 如果是后面的情况、这可以按照您提到的方式解释行为。 是这样吗?

    感谢您的回答和问候

    Micky

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

    您好、Micky、

     它在平均值之后。 请参阅下面的内容。 在 vfnADCSeq0Handler 中、您可以单步执行并查看是否清除了相应的标志。 请检查 ADCISC 寄存器和 ADCDCISC 寄存器中的标志。

     我建议您做一个实验。 强制在20和750之间施加固定电压、但仅提供高于750的一个尖峰。 我只是想确保在这种情况下、只要在进入 ISR 后清除相应的标志、你就只会得到一个中断。  

      

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

    您好、Charles、

    如果我稍微增大一下 UPPERLIMIT、则 COPERER 保持平静。 我尝试逐步向下。 结果是:要么没有触发发生、要么触发频繁、中断会淹没处理器。 我正在处理的硬件只是使用"即时"进行了一些操作。 也许新的稳定硬件会更加稳健、但我希望、尖峰会每秒撞击一次或两次边界、如果低于该值、则会更频繁地撞击。 我将在一两周左右登记入住并进行报告。

    此致

    Micky

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

    您好、Micky、

     谢谢、我认为数字比较器也在相应地工作。 是的、如果您有数据要与社区分享、请在一周/两周左右的时间内报告您的发现。 我现在将关闭该线程。 但是、您始终可以通过回复该主题帖来重新打开该主题帖。