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.

[参考译文] TM4C129ENCPDT:读取加速计 ADC。

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1161548/tm4c129encpdt-read-accelerometer-adc

器件型号:TM4C129ENCPDT

大家好、当我尝试读取电路板上的传感器时、以下代码能够很好地读取操纵杆值和麦克风。 但它不适用于读取加速计。 即使加速计开启 x = PE0、y = PE1、z = PE2。 PE0映射到 CH3、PE1 = CH2、PE2 = CH1。

请参阅下面的代码、提前感谢。

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#define JOYSTICKX 1
#define JOYSTICKY 2
#define MICROPHONE 3
#define ACCELX 4
#define ACCELY 5
#define ACCELZ 6
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);
while(!SysCtlPeripheralReady(SYSCTL_PERIPH_GPIOE)) {}
SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC0);
while(!SysCtlPeripheralReady(SYSCTL_PERIPH_ADC0)) {}
GPIOPinTypeADC(GPIO_PORTE_BASE, GPIO_PIN_4); //Joystick Y
GPIOPinTypeADC(GPIO_PORTE_BASE, GPIO_PIN_3); //Joystick X
GPIOPinTypeADC(GPIO_PORTE_BASE, GPIO_PIN_0); //Accelerometer X
ADCSequenceConfigure(ADC0_BASE, JOYSTICKX, ADC_TRIGGER_PROCESSOR, 0);
ADCSequenceStepConfigure(ADC0_BASE, JOYSTICKX, 0, ADC_CTL_IE | ADC_CTL_END | ADC_CTL_CH9); //Joystick X
ADCSequenceEnable(ADC0_BASE, JOYSTICKX);
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

    我不知道如何编辑我的帖子、但我在第39-41行的 ACCELX 上触发处理器、我粘贴了错误的代码。

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

    您好!

     您有以下行。  

    GPIOPinTypeADC (GPIO_Porte _BASE、GPIO_PIN_0);//加速计 X

    如果您要在 PE2、PE1和 PE0上采样、则需要更改为:

    GPIOPinTypeADC (GPIO_Porte _BASE、 GPIO_PIN_2 | GPIO_PIN_1 | GPIO_PIN_0);

    我在代码中看到的另一件事如下:

    ADCSequenceConfigure (ADC0_BASE、JOYSTICKX、ADC_TRIGGER_PROCESSOR、0);
    ADCSequenceStepConfigure (ADC0_BASE、JOYSTICKX、0、ADC_CTL_IE | ADC_CTL_END | ADC_CTL_CH9);//Joystick X
    ADCSequenceEnable (ADC0_BASE、JOYSTICKX);

    ADCSequenceConfigure (ADC0_BASE、JOYSTICKY、ADC_TRIGGER_PROCESSOR、0);
    ADCSequenceStepConfigure (ADC0_BASE、JOYSTICKY、0、ADC_CTL_IE | ADC_CTL_END | ADC_CTL_CH0);//Joystick Y
    ADCSequenceEnable (ADC0_BASE、JOYSTICKY);

    ADCSequenceConfigure (ADC0_BASE、ACCELX、ADC_TRIGGER_PROCESSORE、0);
    ADCSequenceStepConfigure (ADC0_BASE、ACCELX、0、ADC_CTL_IE | ADC_CTL_END | ADC_CTL_CH3);//AccelX
    ADCSequenceEnable (ADC0_BASE、ACCELX);

    首先、您将 CH9设为在序列发生器0中采样的唯一通道、并将其设为序列发生器中的最后一个通道。 稍后、您将创建 CH0、它将覆盖先前的设置。 随后、您再次将 CH3设为序列发生器0的最后一个通道、并使用 CH3转换完成来触发中断。 它们只是覆盖先前的设置。  

    如果要使用序列发生器0对3个通道进行采样、则需要执行以下操作。 下面只是一个示例。  

    GPIOPinTypeADC (GPIO_Porte _BASE、GPIO_PIN_3 | GPIO_PIN_2 | GPIO_PIN_1);

    ADCSequenceConfigure (ADC0_BASE、0、ADC_TRIGGER_PROCESSOR、0);

    ADCSequenceStepConfigure (ADC0_BASE、0、0、ADC_CTL_CH0); // CH0是序列发生器0的第0步

    ADCSequenceStepConfigure (ADC0_BASE、0、1、ADC_CTL_CH1);// CH1是序列发生器0的第1步

    ADCSequenceStepConfigure (ADC0_BASE、0、2、ADC_CTL_CH2 | ADC_CTL_IE | ADC_CTL_END);//CH2是序列发生器0的第2步。 CH2是序列发生器0中的最后一个通道                                                                                   //并使用 CH2转换完成来触发中断。

    ADCSequenceEnable (ADC0_BASE、0);

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

    非常感谢。 我现在只能让它部分工作。 但仍在进步。


    此代码起作用。 但是、当我尝试将 ADCSequenceStepConfigure 结束更改为麦克风(CH8)时、它将停止工作。

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    ADCSequenceConfigure(ADC0_BASE, 0, ADC_TRIGGER_PROCESSOR, 0);
    ADCSequenceStepConfigure(ADC0_BASE, 0, 0, ADC_CTL_CH0); //Joystick Y
    ADCSequenceStepConfigure(ADC0_BASE, 0, 1, ADC_CTL_CH1); //AccelZ
    ADCSequenceStepConfigure(ADC0_BASE, 0, 2, ADC_CTL_CH2); //AccelY
    ADCSequenceStepConfigure(ADC0_BASE, 0, 3, ADC_CTL_IE | ADC_CTL_END | ADC_CTL_CH3); //AccelX
    //ADCSequenceStepConfigure(ADC0_BASE, 0, 4, ADC_CTL_IE | ADC_CTL_END | ADC_CTL_CH8); //Microphone
    ADCSequenceEnable(ADC0_BASE, 0);
    ADCProcessorTrigger(ADC0_BASE, 0);
    while(!ADCIntStatus(ADC0_BASE, 0, false)){}
    ADCSequenceDataGet(ADC0_BASE, 0, &y);
    ADCSequenceDataGet(ADC0_BASE, 1, &accZ);
    ADCSequenceDataGet(ADC0_BASE, 2, &accY);
    ADCSequenceDataGet(ADC0_BASE, 3, &accX);
    //ADCSequenceDataGet(ADC0_BASE, 4, &mic);
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX


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

    您好!

     您希望将 CH8用于麦克风、作为序列发生器中的最后一个通道。 请注意、CH8位于 PE5引脚上。 是否确定添加了 PE5?

    GPIOPinTypeADC (GPIO_Porte _BASE、GPIO_PIN_5 | GPIO_PIN_3 | GPIO_PIN_2 | GPIO_PIN_1 | GPIO_PIN_0);

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

    您好!

    是的、我已添加 GPIO_PIN_5。 下面是我的设置、这些都是我要使用的外设。

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);
    while(!SysCtlPeripheralReady(SYSCTL_PERIPH_GPIOE)) {}
    SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC0);
    while(!SysCtlPeripheralReady(SYSCTL_PERIPH_ADC0)) {}
    GPIOPinTypeADC(GPIO_PORTE_BASE, GPIO_PIN_4); //Joystick Y
    GPIOPinTypeADC(GPIO_PORTE_BASE, GPIO_PIN_3); //Joystick X
    GPIOPinTypeADC(GPIO_PORTE_BASE, GPIO_PIN_0); //AccelX
    GPIOPinTypeADC(GPIO_PORTE_BASE, GPIO_PIN_1); //AccelY
    GPIOPinTypeADC(GPIO_PORTE_BASE, GPIO_PIN_2); //AccelZ
    GPIOPinTypeADC(GPIO_PORTE_BASE, GPIO_PIN_5); //Microphone
    ADCSequenceConfigure(ADC0_BASE, 0, ADC_TRIGGER_PROCESSOR, 0);
    ADCSequenceStepConfigure(ADC0_BASE, 0, 0, ADC_CTL_CH0); //Joystick Y
    ADCSequenceStepConfigure(ADC0_BASE, 0, 1, ADC_CTL_CH1); //AccelZ
    ADCSequenceStepConfigure(ADC0_BASE, 0, 2, ADC_CTL_CH2); //AccelY
    ADCSequenceStepConfigure(ADC0_BASE, 0, 3, ADC_CTL_CH3); //AccelX
    ADCSequenceStepConfigure(ADC0_BASE, 0, 4, ADC_CTL_CH8); //Microphone
    ADCSequenceStepConfigure(ADC0_BASE, 0, 5, ADC_CTL_IE | ADC_CTL_END | ADC_CTL_CH9); //Joystick X
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX


    运行时:

     
    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    ADCProcessorTrigger(ADC0_BASE, 0);
    while(!ADCIntStatus(ADC0_BASE, 0, false)){}
    ADCSequenceDataGet(ADC0_BASE, 0, &y);
    ADCSequenceDataGet(ADC0_BASE, 1, &accZ);
    ADCSequenceDataGet(ADC0_BASE, 2, &accY);
    ADCSequenceDataGet(ADC0_BASE, 3, &accX);
    ADCSequenceDataGet(ADC0_BASE, 4, &mic);
    ADCSequenceDataGet(ADC0_BASE, 5, &x);
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX


    输出为:

    多功能操作手柄 X:12000000
    操纵杆 Y:2101
    MIC:12000000
    Accel Z:2087
    加速度 X:2891
    Accel Y:2064

    当我运行此操作(取消注释行7-8)时:

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    ADCProcessorTrigger(ADC0_BASE, 0);
    while(!ADCIntStatus(ADC0_BASE, 0, false)){}
    ADCSequenceDataGet(ADC0_BASE, 0, &y);
    ADCSequenceDataGet(ADC0_BASE, 1, &accZ);
    ADCSequenceDataGet(ADC0_BASE, 2, &accY);
    ADCSequenceDataGet(ADC0_BASE, 3, &accX);
    ADCSequenceDataGet(ADC0_BASE, 4, &mic);
    ADCSequenceDataGet(ADC0_BASE, 5, &x);
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX


    操纵杆 X:0
    操纵杆 Y:0
    MIC:0
    加速度 Z:0
    加速度 X:0
    加速 Y:0


    我听说过 FIFO 队列? 我的序列是否太长?

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

    ADC 模块仅支持4个序列发生器。  

    请参阅下面 ADCSequenceDataGet 的用法。 第二个参数是序列发生器编号。 您的所有通道都位于同一序列发生器0中。 没有序列发生器4或5。  

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

    谢谢您、我明天将查看并尝试使其正常工作。 您非常乐于助人、我非常感激。