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.

[参考译文] TM4C123GH6PM:ADC 比较器中断

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1382343/tm4c123gh6pm-adc-comparator-interrupt

器件型号:TM4C123GH6PM

工具与软件:

您好!

我将尝试实施 ADC 比较器中断、以便在测量的电压高于0.11V 时红色 LED 亮起、并在低于0.11V (约为136/4096 * 3.3V)时熄灭。 下面是我的代码。 我怀疑 InitADC 和 ADC0Seq2Handler 中的中断条件/配置有问题。 我已经正确地更新了 startup_ccs.c 中的矢量表  

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#define ADC_SEQUENCER3_LENGTH 1
#define ADC_SEQUENCER2_LENGTH 4
#define ADC_SEQUENCER1_LENGTH 4
#define ADC_SEQUENCER0_LENGTH 8
#define VOLTAGE_PRIORITY 0
#define VOLTAGE_CALIBRATION_FACTOR 1.008
uint32_t VoltBuf[ADC_SEQUENCER2_LENGTH]; // SS2 has the size of 4 samples
uint32_t voltage;
int32_t VoltIntegerPart;
int32_t VoltFractionPart;
void ADC0Seq2Handler(void){
IntMasterDisable();
uint32_t ulStatus = ADCIntStatus(ADC0_BASE, 2, true);
uint32_t comparatorStatus = ADCComparatorIntStatus(ADC0_BASE);
ADCIntClear(ADC0_BASE,2);
if (comparatorStatus & (1 << 0)) {
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, GPIO_PIN_2);
ADCComparatorIntClear(ADC0_BASE, 0);
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX


现在、PE3正在收集电压数据、我已确认它工作正常。 怎么了?

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

    顺便说一下、第44行应该是 ADCIntEnable (ADC0_BASE、2)

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

    实际上、这杀死了我拥有的其余主要功能。

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

    假设您要将 AIN0传递给比较器0进行比较、您将编写如下内容。  

    ADCSequenceStepConfigure (ADC0_BASE、2、0、ADC_CTL_CH0 | ADC_CTL_CMP0);//将 CH0分配至步骤0并将该通道路由到比较器0。  

    在代码中、我看到使用比较器1和比较器2来检查边界时、没有向任何比较器分配任何通道。 请记住 、与每个比较器单元关联、您可以设置上下键合值。 请参阅以下说明。 无需使用两个不同的比较器单元来设置上限和下限。 您似乎打算使用两个不同的比较器单元来设置两个不同的限值。 在另一种情况下,您只需将通道(例如 CH0)分配给比较器(例如  ADC_CTL_CMP0)  并设置  ADC_CTL_CMP0比较器的下限和上限。  

      

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

    感谢您的答复。 更新后的代码如下所示。 它仍然不工作,我不知道什么是错的。 我一直在遵循这里显示的示例代码: https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/313435/tiva-digital-comparator-problem

    但他们的示例似乎没有内部温度传感器读数、我的示例中没有、我不知道我的设置的哪个部分是错误的。 顺便说一下、如果我运行以下代码、可以在终端上得到正确的输出。 只有 ADC 中断不起作用。  

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    #define ADC_SEQUENCER3_LENGTH 1
    #define ADC_SEQUENCER2_LENGTH 4
    #define ADC_SEQUENCER1_LENGTH 4
    #define ADC_SEQUENCER0_LENGTH 8
    #define VOLTAGE_CALIBRATION_FACTOR 1.008
    int ulTemp_ValueC;
    uint32_t TempBuf[ADC_SEQUENCER3_LENGTH]; // SS3 has the size of 1 sample
    uint32_t VoltBuf[ADC_SEQUENCER2_LENGTH]; // SS2 has the size of 4 samples
    int tempC;
    int tempF;
    uint32_t voltage;
    int32_t VoltIntegerPart;
    int32_t VoltFractionPart;
    void InitUART(void){
    // Initialize the UART.
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    但他们的示例似乎没有内部温度传感器读数、我的却没有、

    您好!

     请注意 与温度传感器读数相关的 ADC 勘误表。  

    顺便说一句、如果我运行以下代码、我可以在终端上获得正确的输出。 仅 ADC 中断无法正常工作。[/QUOT]

    另请参阅以下勘误表。

      

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

    Scott、您好!

     此问题是否已得到解决? 我现在将结束该主题。 如果您有任何更新、您可以再次写入此帖子、该主题将使其状态更改为"已打开"。