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**** 2387080 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。

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

#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);

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_PROCESSOR, 0);
ADCSequenceStepConfigure(ADC0_BASE, ACCELX, 0, ADC_CTL_IE | ADC_CTL_END | ADC_CTL_CH3); //AccelX
ADCSequenceEnable(ADC0_BASE, ACCELX);


ADCProcessorTrigger(ADC0_BASE, JOYSTICKX);
while(!ADCIntStatus(ADC0_BASE, JOYSTICKX, false)){}
ADCSequenceDataGet(ADC0_BASE, JOYSTICKX, &x);

ADCProcessorTrigger(ADC0_BASE, JOYSTICKY);
while(!ADCIntStatus(ADC0_BASE, JOYSTICKY, false)){}
ADCSequenceDataGet(ADC0_BASE, JOYSTICKY, &y);

ADCProcessorTrigger(ADC0_BASE, ACCELZ);
while(!ADCIntStatus(ADC0_BASE, ACCELZ, false)){}
ADCSequenceDataGet(ADC0_BASE, ACCELZ, &accZ);

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

    我不知道如何编辑我的帖子、但我在第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)时、它将停止工作。

    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);


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

    您好!

     您希望将 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。 下面是我的设置、这些都是我要使用的外设。

    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
    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);
    ADCSequenceDataGet(ADC0_BASE, 5, &x);


    输出为:

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

    当我运行此操作(取消注释行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);
    


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


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

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

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

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

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

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