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.

[参考译文] TM4C123GH6PGE:QS 记录器示例源代码 ADC 问题

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/878416/tm4c123gh6pge-qs-logger-example-source-code-adc-questions

器件型号:TM4C123GH6PGE
主题中讨论的其他器件:TM4C1236D5PMTM4C123INA301TM4C123GH6PMINA198DK-TM4C123G

您好、Bob

Bob Said >使用 VADC 连接到 VREFP 的64引脚器件、让我们使用3.30V 的基准电压。

我设计电路和 PCB 艺术品已经有一段时间了、但由于电晕病毒、零件供应延迟了。

我想在源代码中应用 VREFP 3.3V,因此我在 SW-TM4C-DRL-UG 文档中看到了 ADCReferenceSet ()函数。

但是、没有更改3.3V 的程序方法、 也查看了数据表中的寄存器、但没有找到。

TM4C1236D5PM (64引脚)、不带 VREFP、VDDA (最小2.97标称3.3最大3.63) 3.3V 电源。

Q1>如何修改源代码以更改3.3V?

[ Acquise.c/AcquireInit ()]

  ADCReferenceSet (ADC0_BASE、ADC_REF_EXT_3V);

  ADCReferenceSet (ADC1_base、ADC_REF_EXT_3V);

[ adc.h ]

#define ADC_REF_EXT_3V        0x00000001 //外部3V 基准

此致、

Jame、Shin

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

    对于64引脚器件、VDDA 和 VREFP 连接在一起。 无需调用 ADCReferenceSet()。 您的基准电压将是施加在 VDDA 和 GNDA 引脚之间的电压。 该电压必须介于2.97V 和3.63V 之间。 使用比例式计算中的任何电压。  

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

    (图1.)   源代码

    FPULazyStackingEnable();    //浮点使能

    uint32_t  adc_volt;

    uint32_t pui32ADC0Value[1];

    uint32_t ui32电流;

    unsigned int uiValue;

    浮点 fAmp;

    //================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================

      /*1*/  ADCSequenceDataGet (ADC0_BASE,0,pui32ADC0Value);

               adc_volt=(pui32ADC0Value[0]* 4096)/819;

               UARTprintf ("\nCH0电压=%d.%d V \n"、ADC_VOLT/1000、ADC_VOLTL%1000);//显示 CH0/AIN0 (PE3)

    //================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================  

     /*2*/   ADCSequenceDataGet (ADC1_base、0、pui32ADC0Value); //显示 CH23/AIN23 (PP0)

               ui32Current =(pui32ADC0Value[0]* 200)/273;

               UARTprintf ("CH23 ADC 值=%d \n"、ui32Current);

    //------------------------------------------------

     /*3*/  ADCSequenceDataGet (ADC1_base、0、pui32ADC0Value); //显示 CH23/AIN23 (PP0)

              ui32Current =(pui32ADC0Value[0]* 200)/273;

              UARTprintf ("CH23电流=%d.%d mA \n"、ui32电流/10、ui32电流%10);

    //------------------------------------------------

     /*4*/  ADCSequenceDataGet (ADC1_base、0、pui32ADC0Value); //显示 CH23/AIN23 (PP0)

              ui32Current =(pui32ADC0Value[0]* 200)/273;

              UARTprintf ("CH23电流=%d.%04d A \n"、ui32Current/1000、ui32Current%1000);

    //------------------------------------------------

     /*5*/  ADCSequenceDataGet (ADC1_base、0、uiValue); //显示 CH23/AIN23 (PP0)

              fAmp = (浮点) uiValue *0.01 *100*3.0/4096.0

              UARTprintf ("浮动电流=%f \n"、fAmp);

    ============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================

    您好、Bob

    Bob Said >建议一种真正的浮点计算方法

    浮点 fAmp;

    unsigned int 值;

    (笑声)

    ADCSequenceDataGet (ADC0_BASE、3、值);

    fAmp =(浮点)值/0.01 * 100.0 * 3.30 / 4096.0

    /*5 */情况:编译警告:“单精度操作数隐式转换为双精度”

    -(浮动)型“铸件操作员”出现警告

    -结果显示为实际类型输出分配运算符%f 的错误

    Q1> UARTprintf ()和 usnprintf ()数据类型的输出格式指定符没有 % f

          因此、日志消息或 OLED 显示屏都将输出错误

          “n.nn”表达式采用真实计算的输出方法是什么?   

    Q2>/*4*/案例:使用传统的十进制计算方法完成当前计算时,强制找到当前单位(mA)到(A)。

          ADC = 134值是施加在 INA189器件上的增益100V/V。

          当通过输出函数计算 ADC/10时、它变为13.4mA。

         我需要的是0.0134A

          但是、"% d.%d"、134/1000、134%1000的计算结果为0.134。

          强制添加0以将 %04d 格式说明符更改为0.0134。

         这是正确的方式吗?   请提供建议。

    此致、

    Jame、Shin

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

    如"C:\ti\TivaWare_C_Series-2.1.4.178\docs\SW-TM4C-utils-UG.2.4.178.pdf"中所述、UARTprintf 函数不支持%f 这样做是为了减小代码的大小。 您的解决方案#4是一个很好的解决方案。  

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

    Bob、您好!

    感谢您的回答。

    32位 Tiva MCU 可以计算浮点运算。

    但是、是否得出结论认为 OLED 显示屏和日志消息不能以实数类型输出?

    我感到矛盾。

    Q1>  是否有任何方法输出实际浮点计算的结果?

    Tiva MCU 无法输出实际值、因此之前的 TI 开发团队似乎在数学上计算了这些值(最常见的除数)。

    - GCD (3000、4095)= 15、3000/15 = 200和4096/15 = 273.066

    -(3000/4096)/(18Khom /123k Ω)≒4100/819

      (公式)

    ui32Current =(ui32Current * 200)/273

    ui32Milli伏特=(g_pui32ADCData[ui8Idx]* 4100)/ 819

    从上一篇文章的故事中推断出来、我认为:

    此致、

    Jame、Shin

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

    尊敬的 James:

    [引用 user="Jame shin"] Q1>  是否有任何方法可以输出实际浮点计算的结果?[/quot]

    我认为您不理解这些数字是如何在计算机中表示的。 TM4C 能够进行浮点计算(ANSI/IEEE 标准754-2008)。 您看到的问题是 OLED 显示屏显示 ANSI 字符串。 您必须将浮点值转换为 ANSI 字符串。 UARTPrintf()函数不支持该转换。 您可以使用 sprintf()函数将浮点数转换为字符串,然后使用 UARTPrintf()打印该字符串。

    或者、您可以将浮点数转换为两个整数(整数部分和十进制部分)、并像在上面的案例4中所做的那样打印它们。 结果相同、但这种方法可以节省代码大小。

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

    您好 Bob。

    我对 QS 记录器示例中的编码有疑问。

    - ProcessDataItem()函数。

    for (ui8Idx = ADCSRQ_CURRENT;

              ui8Idx <(ADCSEQ_CURRENT + NUM_CURRENT_SAples);ui8Idx++)

          {

              ui32Current += g_pui32ADCData[ui8Idx];

          }

          ui32电流/= NUM_CURRENT_SAples;

    -AcquireStart()函数。

      MAP_ADCSequenceDataGet (ADC1_base、0、g_pui32ADCData);

    Q1>从 ADCSequenceDataGet ()函数捕获一个 ADC 值。

          我不知道如何将每7个采样数据从 g_pui32ADCData [6]输入到 g_pui32ADCData [12]。

        请说明使用的源代码。

    此致、

    Jame、Shin

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

    我不确定我是否理解您的问题。 函数 ADCSequenceDataGet ()返回该序列中可用的样本数。 由于序列0同时用于 ADC0和 ADC1、因此返回的最大采样数为8 (序列0的 FIFO 大小为8)。 样本数也是通过调用文件 acque.c 第1286行中 AbquireInit()函数中的 ADCSequenceStepConfigure()来定义的。 循环配置"NUM_ADC_CHANNEers"(13)。 前8个在 ADC0的序列0中配置、后5个在 ADC1的序列0中配置。

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

    您好 Bob。

    我没有明确的问题。 抱歉。

    表13-2. 数据表中的采样和 FIFO 深度序列发生器

    SS0:8、SS1:4、SS2:4、SS3:1

    Q1> ADCSequenceStepConfigure ()参数 ui32Step 的作用是什么?

          如果该步骤的含义是采样数、且范围为最小1 到 最大8、则表示。

              e.g) ADCSequenceStepConfigure (ADC1_base、0、7、ADC_CTL_CH23 | ADC_CTL_IE | ADC_CTL_END);

          如果 STEP 的含义是指模拟输入0 ~ 23的数量(AIN0 ~ AIN23)。

             e.g) ADCSequenceStepConfigure (ADC1_base、0、23、ADC_CTL_CH23 | ADC_CTL_IE | ADC_CTL_END);

          

    Q2> ADC1 SS0的 FIFO 值保存为每个数组名称的索引。

        我找不到任何源代码可按如下方式保存。  请解释您的建议。

          G_pui32ADCData[6]= ADC 采样1电流值………… G_pui32ADCData[12]= ADC 采样7电流值

          

              ADCSequenceDataGet (ADC1_base、0、g_pui32ADCData[6]);

              ADCSequenceDataGet (ADC1_base、0、g_pui32ADCData[7]);

              ADCSequenceDataGet (ADC1_base、0、g_pui32ADCData[8]);

              ADCSequenceDataGet (ADC1_base、0、g_pui32ADCData[9]);

              ADCSequenceDataGet (ADC1_base、0、g_pui32ADCData[10]);

              ADCSequenceDataGet (ADC1_base、0、g_pui32ADCData[11]);

              ADCSequenceDataGet (ADC1_base、0、g_pui32ADCData[12]);

    Q3>为什么您在最大 SS0:8个采样时对其进行7次采样,如表13-2所示?

    此致、

    Jame、Shin

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

    Jame shin 说:
    Q1> ADCSequenceStepConfigure ()参数 ui32Step 关于什么?

    这些序列在启动时可以执行多次转换、一次转换后进行多次转换。 序列0、最多8次转换、序列1和序列2最多4次、序列3仅一次。 对于序列0、1和2、步骤配置要转换的通道。 它们按步骤0、1、2的顺序完成...

    [引用 user="Jame shin"]

    Q2> ADC1 SS0的 FIFO 值保存为每个数组名称的索引。

        我没有找到任何源代码可按如下方式保存。

    您引用的代码示例不正确。 完成所有转换后读取 ADC 的代码位于 acque.c 的第671和672行(原始示例)中。  

    //
    //从所有 ADC 序列发生器检索数据
    //
    MAP_ADCSequenceDataGet (ADC0_BASE、0、&g_pui32ADCData[0]);
    MAP_ADCSequenceDataGet (ADC1_base、0、&g_pui32ADCData[8]);
    

    函数 ADCSequenceDataGet ()返回 FIFO 中的所有值。 由于 ADC0配置为8个样本、ADC1配置为5个样本、因此第一个调用填充 g_pui32ADCData[0]-[7]、第二个调用填充 g_pui32ADCData[8]-[12]  

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

    第一。 AccireInit ()

      {

        对于(ui32Chan = 0;ui32Chan < NUM_ADC_CHANNELS;ui32Chan++)

        // for (ui32Chan =0;ui32Chan <13;ui32Chan ++)

        。

          //配置序列步骤

          MAP_ADCSequenceStepConfigure (ui32Base、ui32Seq、ui32Chan % 8、ui32ChCtl);

            // ui32Chan:0、1、2、3、4、5、6、7 (ADC0、SEQ=0)

        //           8、9、10、11、12      (ADC1、SEQ =0)  

        。  

        }

    2。 ADC0SS0Handler()

        {

         …μ A

        MAP_ADCSequenceDataGet (ADC0_BASE、0、&g_pui32ADCData[0]);

        MAP_ADCSequenceDataGet (ADC1_base、0、&g_pui32ADCData[8]);

        。

        }

    3号。 处理数据项()

        {

          。   

            对于(ui8Idx = ADCSRQ_CURRENT;ui8Idx <(ADCSRQ_CURRENT + NUM_CURRENT_SAples);ui8Idx++)

          //对于(ui8Idx = 6;ui8Idx < 13;ui8Idx++)

          {

           ui32Current += g_pui32ADCData[ui8Idx];

          }

        ui32Current /= NUM_CURRENT_SAples;    // ui32Current = ui32Current / 7、([6]、[7]、[8]、[9]、[10]、[11]、[12])

        。

       }

    您好 Bob。

    由于缺乏表达,我没有通过所希望的问题。 抱歉。

    Bob Said >进行所有转换后读取 ADC 的代码位于 acque.c 的第671行和第672行中

    Q1>配置# 1序列步骤、并在两个变量中将来自 FIFO 的 ADC 值另存为# 2:& g_pui32ADCData [0]和& g_pui32ADCData [8]

      # 3计算采样平均值以减少误差。

      但我不知道 g_pui32ADCData [6]~ g_pui32ADCData [12]的值是如何填充的。

      请详细解释。

    此致、

    Jame、Shin

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

    ADC0配置为按以下顺序转换8个通道: CHAN_USER0、CHAN_User1、CHAN_User2、CHAN_User3、CHAN_EXTTEMP、 CHAN_INTTEMP、 CHAN_CURRENT、CHAN_CURRENT。 请注意、最后两次转换是同一通道 的 CHAN_CURRENT (ADC23)。  

    函数  

    MAP_ADCSequenceDataGet (ADC0_BASE、0、&g_pui32ADCData[0]); 

    读取全部8个通道的结果、并将其存储在 g_pui32ADCData[0]至 g_pui32ADCData[7]中。  

    ADC1被配置为5 次读取 CHAN_CURRENT (ADC23)。 函数

    MAP_ADCSequenceDataGet (ADC1_base、0、&g_pui32ADCData[8]); 

    读取所有5个结果并将其存储在 g_pui32ADCData[8]到 g_pui32ADCData[12]中。  

    现在、G_pui32ADCData[6]到 g_pui32ADCData[12]包含7个 CHAN_CURRENT (ADC23)读数。

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

    [引用 user="Bob Crosby"]现在 g_pui32ADCData[6]到 g_pui32ADCData[12]包含7个 CHAN_CURRENT (ADC23)读数。

    如果海报启用了"8个此类读数"、则简单的"无符号加法后跟3个(适当)向右移位"将不需要进行除法。   (计算"平均值"。)

    可能是、"花费更多时间优化电流传感器的设计和实施"优于"将传感器打败"!   ("错误尝试" 以提高准确性。)   

    有(小... 即 保证)即使是"聚类" 100左右(不准确)的传感器读数也会提高"精度!"   (尽管"视在传感器精度"会提高。)

    这张经典的图纸很好地说明了:  (裂缝员工注意到"参考偏差"表示精度-"聚类表示精度"。)

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

    您好 Bob。

    组装电路板即将进入并进行测试。

    我有一个问题是从上一篇文章中学到的。

    在[图1]中、之前的 R2值为18K。

    Bob 说、通过降低每位电压与电阻之比、我将其更改为相同的值、因为它具有精度。

    ADCReferenceSet ()函数不要求您设置 VREFP。

    Q1>+5V_EXT 输入端口提供4.95V 电压、ADC 结果为4.4V ~ 4.45V。

          因此会发生4.95–4.45 = 0.5V 的差异。

        如何校准? (未应用 VREFP 3.3V。)

          

        ui32Vol=(pui32ADC0Value[0]* 4100)/ 819;

    当然、正如您所回答的、我停止了实数类型的计算及其结果、因为字符发生了变化。

    浮动电压;

    unsigned int 值;

    (笑声)

    ADCSequenceDataGet (ADC0_BASE、3、值);

    fVolt =(float) value * 2.0 * 3.30 / 4096.0

     

    Q2>+ 5V_INT 输入端口为+ 1.5V。 为什么 PE2/AIN1引脚的 ADC 输出值为4.53V?

            我不知道为什么。 请检查配置源代码是否错误。

    MAIN ()

      三

      char pcVoltBuffer[6];

      pccar Current Buffer[6];

     uint32_t pui32ADC0Value[2];  

     uint32_t ui32V;

     uint32_t ui32电流;

     ……μ A

      SysCtlPeripheralEnable (SYSCTL_Periph_ADC0);

      SysCtlPeripheralEnable (SYSCTL_Periph_ADC1);

      SysCtlPeripheralEnable (SYSCTL_Periph_GPIOE);

      SysCtlPeripheralEnable (SYSCTL_Periph_GPIOD)

    GPIOPinTypeADC (GPIO_Porte _BASE、GPIO_PIN_3|GPIO_PIN_2);       

    GPIOPinTypeADC (GPIO_PORTD_base、GPIO_PIN_1_GPIO_PIN_0);

      ADCSequenceConfigure (ADC0_BASE、0、ADC_TRIGGER_PROCESSOR、0);   

      ADCSequenceConfigure (ADC1_base、0、ADC_TRIGGER_PROCESSOR、0);

      ADCSequenceStepConfigure (ADC0_BASE、0、2、ADC_CTL_CH0|ADC_CTL_CH6|ADC_CTL_IE|ADC_CTL_END);

      ADCSequenceStepConfigure (ADC1_base、0、2、ADC_CTL_CH1|ADC_CTL_CH7|ADC_CTL_IE|ADC_CTL_CTL_END);

      ADCSequenceEnable (ADC0_BASE、0);

      ADCSequenceEnable (ADC1_BASE、0);

      IntMasterEnable();

     while (1)

     {

         ……μ A。

          ADCProcessorTrigger (ADC0_BASE、0);

         ADCProcessorTrigger (ADC1_base、0);

         while (!ADCIntStatus (ADC0_BASE、0、false)&&!ADCIntStatus (ADC1_base、0、false))

         {

         }

        ADCIntClear (ADC0_BASE、0);

        ADCIntClear (ADC1_BASE、0)

        …

          // PE[3]/AIN0,电压(ADC0)

          ADCSequenceDataGet (ADC0_BASE、0、&pui32ADC0Value[0]);

          ui32Vol=(pui32ADC0Value[0]* 4100)/ 819;

          usnprintf (pcVoltBuffer、5、"%U.%u "、ui32V/1000、ui32Vol%1000);

        …

        // PD[1]/AIN6、电流(ADC0)

          ui32Current =(pui32ADC0Value[1]* 200)/273;

          usnprintf (pcCurrent Buffer、5、"%U.%04u "、ui32Current/1000、ui32Current%1000);

          …

        // PE[2]/AIN1,电压(ADC1)

          ADCSequenceDataGet (ADC1_base、0、&pui32ADC0Value[0]);  

          ui32Vol=(pui32ADC0Value[0]* 4100)/ 819;   

          usnprintf (pcVoltBuffer、5、"%U.%u "、ui32V/1000、ui32Vol%1000);

        

        …

        // PD[0]/AIN7,电流(ADC1)

          ui32Current =(pui32ADC0Value[1]* 200)/273;

          usnprintf (pcCurrent Buffer、5、"%U.%04u "、ui32Current/1000、ui32Current%1000);

        …

      }

    Bob 说>测量的准确度不能超过1/2 (量化误差)。

                  调节输入电压以使最小的 mV/位为单位、可获得最小的量化误差。

    Q3>[图1]我应用了 R1:150k、R2:150k、与方框图相同

    PE3/AIN0引脚上的 ADC 测量电压值为15.4至15.5V。

     5V_EXT 输入端口的输入电压为4.97V。  

    如何更改以下源代码?   

    ui32Vol=(pui32ADC0Value[0]* 4100)/ 819;

    此致、
    Jame、Shin

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

    Bob、您好!

    我仍然不知道上一帖子中的<Q1> 和<Q2>。

    同时、调试如下。  (R2值为18K。)

    这是对前一个 Q2的补充。

    Q2-1>为什么 ADC0和 ADC1值与从指定采样序列发生器输出 FIFO 复制到存储器驻留缓冲器的数据类似?

    // 5.02V 电源。 无负载。    (ADC0)

    ADC0:PE3 / AIN0 (CH0):+EXT 电压测量、  PD1 / AIN6 (CH6):+EXT 电流测量

    // 1.54V 电源。 无负载。   (ADC1)

    ADC1:PE2 / AIN1 (CH1):+INT 电压测量、  PD0 / AIN7 (CH7):+INT 电流测量

    ADCSequenceStepConfigure (ADC0_BASE、0、2、ADC_CTL_CH0|ADC_CTL_CH6|ADC_CTL_IE|ADC_CTL_END);
    ADCSequenceStepConfigure (ADC1_BASE、 0、2、ADC_CTL_CH1|ADC_CTL_CH7|ADC_CTL_IE|ADC_CTL_END);
    …μ A
    
    ADCSequenceDataGet (ADC0_BASE、0、&pui32ADC0Value[0]);//第一个断点。
    …μ A
    ADCSequenceDataGet (ADC1_base、0、&pui32ADC0Value[0]);//第二个断点。
    …μ A 

    但是、我设置了两个断点、并使用 pui32ADC0Value [0]调试工具检查了这些值。

    (第一个断点。)

    // ADC0

    pui32ADC0Value[0]:0x0000.038C -> D'908,      pui32ADC0Value[1]:0x 0000.001C -> D'28

        (908 * 4100)/ 819 = 4545               (28 * 200)/ 273 = 20

                        结果= 4.54V                                            结果= 0.0020A                                     

    // ADC1

          pui32ADC0Value[0]:0x0000.038C -> D'908,      pui32ADC0Value[1]:0x 0000.000A -> D'10

          (908 * 4100)/ 819 = 4545               (10 * 200)/ 273 = 7

                          结果= 4.54V                                           结果= 0.0007A

    (第1第2个休息点。)

    // ADC1

          pui32ADC0Value[0]:0x0000.0006 -> D'6、      pui32ADC0Value[1]:0x 0000.000A -> D'10

           (6 * 4100)/ 819 = 30               (10 * 200)/ 273 = 7

                       结果= 0.03V                                            结果= 0.0007A

    Q3> ADCSequenceDataGet (ADC1_base、0和 pui32ADC0Value [0])如何纠正其他状态?

        我猜 ADC1会以延时时间进行响应。

    此致、
    Jame、Shin

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

    尽管为您调试代码超出了我的支持范围、但如果您希望我更仔细地查看您的代码、 请使用 Code Composer Studio "File"->"Export"功能提供完整的项目、然后将创建的.zip 文件附加到此线程中。

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

    Bob、您好!

    感谢您的建议。 通过这种方式、我使用 Keil 工具 uVision。

    进展缓慢,但我将努力解决这个问题。

    在上一个海报中,我询问了 ADCSequenceStepConfigure ()函数的参数。

    ui32Step 作为详细函数的答案、我认为我的理解是错误的。

    •  ADC0:PE3/AIN0、CH0 (电压测量)、PD1/AIN6、CH6 (电流测量)

                设置 : ADCSequenceStepConfigure (ADC0_BASE,0,2,  

                                        ADC_CTL_CH0 | ADC_CTL_CH6 | ADC_CTL_IE | ADC_CTL_END);

    • ADC1:PE2/AIN1、CH1 (电压测量)、PD0/AIN7、CH7 (电流测量)

                设置 :ADCSequenceStepConfigure (ADC1_BASE,0,2

                                         ADC_CTL_CH1 | ADC_CTL_CH7 | ADC_CTL_IE | ADC_CTL_END);

    在上述配置中、

    在 pui32ADC1Value 的起始地址起始地址起始位置通过 SS_FIFOn 32位单元发送到存储器驻留缓冲区的次数不是从指定的 ADC 通道发送的次数?  (如果要执行以下操作、如何实现源)

    ADCSequenceDataGet (ADC0_BASE、0、&pui32ADC0Value[0]);   //  ui32Step = 2

     i.e) PE3 / AIN0、CH0 -> pui32ADC0Value[0]、    PD1/AIN6  -> pui32ADC0Value[1]

    ADCSequenceDataGet (ADC1_base、0、&pui32ADC1Value[0]);  //  ui32Step = 2

     i.e) PE2 / AIN1、CH1 -> pui32ADC1Value[0]、PD0 / AIN7、CH7 -> pui32ADC1Value[1]

    对于 pui32ADC1Value [0]&[1]、只有 ADC1的 ADC 捕获值不正确。

    这种方法也是这样。 请给我一份清单。

    此致、

    Jame、Shin

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

    配置 ADC 序列的步骤时、每个步骤只指定一个通道。 下面是配置 ADC0的两行代码、分别为通道0和通道6配置序列0步进0和步进1。 在通道6转换后、中断标志被置位。

    ADCSequenceStepConfigure (ADC0_BASE、0U、0U、ADC_CTL_CH0);
    ADCSequenceStepConfigure (ADC0_BASE、0U、1U、ADC_CTL_CH6 | ADC_CTL_END | ADC_CTL_IE);
    

    同样、要为通道1配置 ADC1、序列0步骤0、为通道7配置步骤1、请使用以下代码:

    ADCSequenceStepConfigure (ADC1_base、0U、0U、ADC_CTL_CH1);
    ADCSequenceStepConfigure (ADC1_base、0U、1U、ADC_CTL_CH7 | ADC_CTL_END | ADC_CTL_IE);
    

    现在,在中断例程中(或在设置中断标志之后),当您调用 ADCSequencDataGet ()时,您应该会得到两个转换结果,它们被复制到*pui32Buffer 参数(第三个参数)指向的缓冲区中。

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

    Bob、您好!

    ADCSequenceStepConfigure () 已解出参数和设置过程。

    感谢您对我的误解所给予的热情和全面的理解。

    [1] 测量端口的实际输入电源电压为4.99V。

        测得的 ADC 值范围为4.49 ~ 4.56V。

        发生 ADC 捕获错误范围。

       4.99V -(4.49 ~ 4.56) V = 0.5V ~ 0.43V

    [2]在下面的上一个帖子中,

       我没有设置64引脚 MCU 设置问题的答案和

      以另一种方式建议使用浮点实型计算方法。

      但是、我尝试了实际类型计算、但由于缺乏程序技能、我无法进行计算。

      此外、在 VDDA 引脚附近应用了 D-CAP 0.1uF。

    //选择外部基准以获得最大精度。

    ADCReferenceSet (ADC0_BASE、ADC_REF_EXT_3V);

    (建议的计算方法(3.3V))

    fVolt =(float) value * 2.0 * 3.30 / 4096.0;

    Q1>如何更改整数计算下面的内容? (对于 ADC VREFP (VDDA) 3.3V)

        ui32Vol=(pui32ADC1Value[0]* 4100)/ 819;

          ui32Current =(pui32ADC1Value[1]* 200)/273;

    此致、

    Jame、Shin

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

    1) 1)如果测量值与模拟输入引脚上的值不匹配10%、则会经常匹配。 仔细检查模拟输入引脚上的电压测量值以及 VREEFA+和 VREFA-(引脚8和9)上的电压测量值。 如果问题是噪声、最好清除信号。 使用硬件采样平均可以有所帮助。

    2) 2)如果失调电压是由于电阻分压器或基准电压的差异所致、则可以修改4100/819值以进行补偿。 如果计算值为低10%、则将分子增加10%(4100变为4510)。 尝试在多个电压下进行检查、以验证增益偏移是否为线性。

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

    Bob、您好!

    感谢您在上一帖子中给出的两个答案。

    正如您告诉我的、我进行了10%的校正。

    为了提高准确性,通过 ADCHardwareOversampleConfigure ()函数应用了硬件样本平均。

    不过,我已证实一些非常奇怪的结果。

    e.g) ADCHardwareOversampleConfigure (ADC0_BASE、2)

        ADCHardwareOversampleConfigure (ADC1_base、2)

    ADC 0:Volt1 ADC 1:测量的是电压2。 并将数据发送到 MCU 的 UART0、3、5。

    两个 ADC 值读取所需的接近值。

    但是、如果只有 UART0向 MCU 发送数据、则 ADC 值会随时显著下降。

    在 ADC0和 ADC1模块中、在 ADC0模块的序列0中捕获的 ADC 值从0x386更改为0x1B。

    具体而言、它变为0x386 (4.96V)和0x1B (0.14V)。 无法恢复。

    当我测试它时、它可以偶尔恢复。

    Q1>我不知道原因。 问题是什么?

        如果参数 ui32Factor 设置为4、则发生频率小于2。

    Q2>是否有正确的功能设置方法?

          删除 ADCHardwareOversampleConfigure 函数不会导致任何问题。

          但是、它会降低精度。

    此致、
    Jame、Shin

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

    很抱歉、我不知道您的代码中发生了什么。 您能否将最新项目导出到.zip 文件并将其附加到此线程?

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

     Bob、您好!

    感谢你的答复。

    如前所述、我使用 Keil 项目 、但 您需要的是 CCS 项目。

    感谢你的帮助。 我将通过我的努力解决这个问题。

    下面简要减少了源代码。

    如果不使用 ADCHardwareOversampleConfigure ()函数,则没有问题。

    也就是说、即使从 UART0、3和5接收到数据、ADC 值在 ADC0和 ADC1模块中也是正常的。

    但是、如果声明了 ADCHardwareOversampleConfigure ()函数、则只有 ADC0模块读取接近0的 ADC 值。

    Q1>函数(ADCHardwareOversampleConfigure)过程声明方法是否错误?

    Q2>如何为我提供检查清单?

    此致、
    Jame、Shin

    main()
    
    { 
    … SysCtlPeripheralEnable (SYSCTL_Periph_ADC0); SysCtlPeripheralEnable (SYSCTL_Periph_ADC1); … GPIOPinTypeADC(…) (笑声) ADCSequenceConfigure (ADC0_BASE、0、ADC_TRIGGER_processor、0); ADCSequenceConfigure (ADC1_BASE、 0、ADC_TRIGGER_processor、0); ADCSequenceStepConfigure (ADC0_BASE、0U、0U、ADC_CTL_CH0); ADCSequStepConfigure (ADC0_BASE、 0U、1U、ADC_CTL_CH6|ADC_CTL_IE|ADC_CTL_END); ADCSequenceStepConfigure (ADC1_BASE、0U、 0U、ADC_CTL_CH1); ADCSequenceStepConfigure (ADC1_BASE、0U、1U、 ADC_CTL_CH7|ADC_CTL_IE|ADC_CTL_END); … //硬件样本取平均 值 ADCHardwareOversampleConfigure (ADC0_BASE、2); ADCHardwareOversampleConfigure (ADC1_BASE、2); ADCSequenceEnable (ADC0_BASE、 0); ADCSequenceEnable (ADC1_base、0); ADCIntClear (ADC0_BASE、0); ADCIntClear (ADC1_base、0); IntMasterEnable (); while (1) { if (g_BSerialTerminal) { ADCProcessorTrigger (ADC0_BASE、0); ADCProcessorTrigger (ADC1_base、0); while (!ADCIntStatus (ADC0_BASE、0、false)&&!ADCIntStatus (ADC1_base、0、false)) { } ADCIntClear (ADC0_BASE、0); ADCIntClear (ADC1_BASE、0); 。 ADCSequenceDataGet (ADC0_BASE、0、&pui32ADC0Value[0]); … 如果(...) { } ADCSequenceDataGet (ADC1_base、0、&pui32ADC1Value[0]); … 如果(...) { } … 。} // IF (g_BSerialTerminal)结束 … if (UART0_RX)…μ s。 }; if (UART3_RX)…μ H。 }; if (UART5_RX)…μ A。 }; … 。} // while (1) end }// main end

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

    我看不到您对 ADCHardwareOversampleConfigure()的调用出现问题。 我确实看到您的环路在等待两个 ADC 完成时出现问题、但不确定这与您看到的问题是否相关。  

    while (!ADCIntStatus (ADC0_BASE、0、false)&&!ADCIntStatus (ADC1_base、0、false))
    {
    
    }
    

    应为:

    while (!ADCIntStatus (ADC0_BASE、0、false)||!ADCIntStatus (ADC1_base、0、false))
    {
    
    }
    

    您需要等待 ADC0 "或" ADC1未就绪。  

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

    您好!

    如果没有错误-海报的代码可确保" 早期且非法"退出" while 循环"-保证有缺陷的 ADC 数据读数!

    然而、存在"不仅仅是一个简单的代码错误"-海报特别显示、"在错误中被邀请"、拒绝了"kiss!"   如果使用了"kiss"(两种) ADC 模块、则会被读作"反过来"(顺序)-并消除了出现此类"和/或逻辑错误"的可能性!   只有在这样的情况下,才会出现"正确、有序的阅读"----试图(可能)"增加优雅"(通过增加逻辑)的情况。   这样做-"kiss"将(立即)检测到该代码错误!

    海报的其他(非常不寻常)问题:

    ADC 0:Volt1 ADC 1:测量的是电压2。 并将数据发送到 MCU 的 UART0、3、5。
    两个 ADC 值读取所需的接近值。
    但是、如果只有 UART0向 MCU 发送数据、则 ADC 值会随时显著下降。   [CB1:这确实需要更详细的说明-谨慎使用语言]

    此类问题导致:

    • "将数据发送到 MCU "的意思(实际)是什么?   "多个 MCU"是否在这里发挥作用?   由于 ADC 包含在 MCU 中-可能需要什么"发送到 MCU"?  
    • 这是否是"单板异常?"   论坛帮助者是否会被呈现为具有 A (问题集)-只有一个电路板是唯一的?   (可能由"任何东西"引起-(例如、故障:电路板、组件、组件等!)   多电路板测试 提供了"A-B (偶数) A-B-C 电路板比较"的主要优势-以加快/简化诊断而闻名!
    • 代码显示 UART0是 UART0、3、5序列中的第一个。   更改该序列(即 UART5、3、0) 可增加洞察力!
    • 传递给 UART0之前、ADC 结果是否已知(&已确认)?   (这不是确认(真正)发生此类变化的唯一方法吗?)
    • (如上所述)是否正确-并且(仅限) UART0产生此类问题- UART0和/或其"线路驱动器"(如果有)和/或"负载"是否可能被怀疑?   (这可能是一个"语言问题"-因为(任何) UART 能够"影响 ADC 转换(或结果)"的可能性只有在(两者) ADC 转换和 UART 操作重叠时才可能"影响" ADC 转换(或结果)!)   (即 UART 和后继电路消耗足够的电流来改变"VDDA"和/或"Spike " ADC 输入...)

    Engineering 101 "活得好..."   MCU (几乎仅限 MCU)是否"一路前进?"

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

    Bob、您好!

    问题已解决。 谢谢你。

    我知道完成问题的数量与 ADCHardwareOversampleConfigure ()中设置的样本数量相同。

    Q1>但是、如果 ADC0等待 ADC1、ADC 数据是否会消失?

        我不确定这两个器件为何都在等待 ADC 转换完成。

        ADC0已经厌倦了等待,而且很不好。 (我感觉)

        我不知道为什么和(&&)需要更改或(||)。

    此致、
    Jame、Shin

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

    在您的代码示例中、每个 ADC 转换器独立运行。 首先启动 ADC0、然后启动 ADC1。 您将循环写入以等待它们完成、原因是:等待 ADC0和 ADC1都处于忙状态。 由于 ADC0首先启动、因此它将首先完成。 您将退出 while 循环、但 ADC1尚未准备就绪。 相反、如果在 ADC0或 ADC1忙时等待循环被写入为等待、则在两个 ADC 完成转换之前、您不会退出 while 循环。

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

    Bob、您好!

    我已经测试了 ADC 平均值

    ADCHardwareOversampleConfigure ()函数不起作用。

    Q1>不会显示硬件采样平均值计算。  为什么会这样呢?

        1 case>未声明 ADCHardwareOversampleConfigure ()函数。

               ADC 值测量值:  4.16、4.96、4.98、4.99、5.0、 5、11、5.5V

        2个案例>ADCHardwareOversampleConfigure ()采样2x,函数声明。

                ADC 值测量值:4.16、4.96、4.98、4.99、5.0、 5、11、5.17、5.5V

        3个案例>ADCHardwareOversampleConfigure ()采样4x,函数声明。

                ADC 值测量值:4.16、4.95、4.98、4.99、5.0、 5、11、5.5V

    此致、
    Jame、Shin

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

    这些价值观对我来说很好。 你期待什么? 除非信号噪声很大、否则使用硬件过采样不应产生任何明显的差异。

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

    您好!

    可能是(反向)"!ADCIntStatus"和参数"false"-不适当地"解决此代码问题?"

    人们相信(包括)原始海报和(后续)读者都可以从"简化"中受益。

    while (!ADCIntStatus (ADC0_BASE、0、false)&&!ADCIntStatus (ADC1_base、0、false))


    可替换为大幅简化的:

    while (a & b)

    其中"a =!ADCIntStatus (ADC0_BASE、0、false)& b =!ADCIntStatus (ADC1_base、0、false)"-因此删除了"负逻辑-此处有太多的作用-。

    因此、要注意" while 函数仍然存在"(即"等待"两次转换完成)、这要简单得多、只有在(两者) a & b 逻辑正确的情况下。  一旦一个或两个都证明"不真实"、while 循环就会退出。   (这不是海报所需的内容)并导致"早期和非法"退出-由供应商的 Bob & CB1 crüe 标识...)   负逻辑-即使在供应商 API 中遇到-也应以"小心、谨慎和精确!"的态度对待。  

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

    您好、我的正义朋友 CB1、

    感谢您的发帖。

    CB1说过>... (反向)"!ADCIntStatus"和参数"false"- Inreinasted "Cloud this code issue"

         a>TM4C-DRL-UG 文档如下。

           设置为 false“原始中断状态”。 该函数返回指定采样序列的中断状态。

           首先、当 ADC0被转换时、它变为 True、然后在 while 语句中等待、直到 ADC1变为 True、

           然后退出循环。

                顺便说一下、ADC0为什么会丢失 ADC 值?

                如果 ADC0和 ADC1模块想同时工作、如何对源代码进行编码?  

                e.g) ADCSequenceDataGet (ADC0_BASE、0、&pui32ADC0Value[0])&&

               ADCSequenceDataGet (ADC1_base、0、&pui32ADC1Value[0])

    Deep Kiss 标准版

    此致、
    Jame、Shin

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

    您好!

    工作人员(在芝加哥"病毒"天气下飞行)"正在途中"。   (&假设他们"需要"我的指导。)   一定要快一点...

    您写道:"顺便说一下、ADC0为什么会丢失 ADC 值?"   这让我感到非常好奇-我是否(之前)没有要求提供更深入的细节?   (即、您需要更好地解释您是否在将该值发送到(谋杀) UART_0之前已经测试过该值!

    此外、"如果 ADC0和 ADC1模块希望同时工作、如何对源代码进行编码?"

    供应商 Bob -过去几个月-提供了"这种解决方案!"   (脚踢 CB1的后部-即使 CB1提供了他的"标准"数千码的标准...)

     crüe Bob 的功劳-他(独自)注意到、"计时器可能"共同触发(同时触发) ADC0和 ADC1"-整个 CB1 T Ü V 甚至从未考虑过(从未考虑过)的事情!   (不幸的是,这不是第一次也不是最后一次)这种"不知情. 千码-你知道!"

    员工(这次-&(这次仅限)提供:  (来自 PDL 用户指南-更多"阅读"-更少发布...)

    4.2.2.27 ADCSequenceConfigure
    配置采样序列的触发源和优先级。

    原型:
    无效
    ADCSequenceConfigure (uint32_t ui32Base、
    uint32_t ui32SequenceNum、
    uint32_t ui32Trigger、
    uint32_t ui32Priority)

    参数:
    ui32Base 是 ADC 模块的基址。
    ui32SequenceNum 是采样序列编号。
    ui32Trigger 是启动采样序列的触发源;必须是 ADC_TRIGGER___LW_AT__∗值之一。
    ui32Priority 是采样序列相对于其他采样序列的相对优先级。

    描述:
    此函数用于配置采样序列的启动条件。 有效采样序列发生器的范围从0到3;序列发生器0捕获多达8个采样、序列发生器1和2捕获多达4个采样、序列发生器3捕获单个采样。 触发条件和优先级(相对于其它采样序列发生器执行)被设定。
    ui32Trigger 参数可采用以下值:

    ADC_TRIGGER_PROCESSOR()函数由处理器生成的触发器。
    ADC_TRIGGER_COMP0 -由第一个模拟比较器生成的触发器;通过比较器配置()进行配置。
    ADC_TRIGGER_EXTERNAL -由端口 B4引脚的输入生成的触发器。
    ADC_TRIGGER_TIMER -由计时器生成的触发器;使用 TimerControlTrigger()进行配置。   (您需要付出一些努力!)

    BTW -除非我今天早上"比平常更厚"、否则您没有说明我(年轻)的员工过去的"代码简化"(通过取消使用"负逻辑"的 ADC 测试)是否有助于您理解!   他们会"打败我"、并排除你的"闭合环路"。   (他们的工作是否有帮助?)   (甚至在他们"为您服务之前、今天!)

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

    您好、CCB1、

    感谢您的回答。

    我星期日中午时分。

    不要在后台。

    周末愉快!

    此致、
    Jame、Shin

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

    [报价用户="Jame shin"]不要在后台。

    非常感谢-非常感谢。

    现在我们"渴望"(即希望)一天-休息室。   目前、我们的运营范围是"后台"、而是另一个后台"。   我们的一个办公室窗户望着"大湖!"   (密歇根湖-美国5个之一 大湖区)  所有剩余的窗户(玻璃)都显示了一个(相邻的)砖墙。   我们将资金投资于:员工、仪器仪表、装配设备、最新/最伟大的组件和"低于豪华、商业房地产..."

    "将一个刚刚转换的 ADC 值传递到 UART_0 -(单独)会导致该 ADC 值的严重下降"这一说法(不寻常) 确实值得自定义分析-在一个设备齐全(我们敢说)的"后台"内进行。   此外-如果您的(假设的)单板证明"阳光敏感型"-工作人员/我可能只是知道合适的"诊断空间!"   (即太阳一出东地平线...)

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

    Bob、您好!

    我从您那里学到了很多。 谢谢你。

    Bob Said >您的期望是什么? 除非信号噪声很大、否则使用硬件过采样不应产生任何明显的差异。

    Q1>我了解到、打开 ADC 来调用硬件平均函数、以减少高值和低值之间的偏差。

    因此、在上一帖子中、基于 Case1>的硬件平均值为 x2、x4的 CASE2和 Case3中、偏差并未降低。

    我的观点与案例1与案例2和案例3相同、因此没有改进。 我有误解吗?

    Q2>我不确定下面是什么。 请说明。

    SW_DRL:“启用4x 过采样可将250k 次采样/秒 ADC 的吞吐量降低至62.5k 次采样/秒。 "

    Bob Said >通常、我们将采样频率称为采样频率、而不是采样时间的倒数。

    Q2-1>“每秒250k 次采样 ADC 到每秒62.5k 次采样”。 在 SW_DRL 文档中。 这话什么意思?

            (1M 采样/s)/ 4 = 250k 采样/s 正常。 我不知道为什么62.5Ksps 再次将250ksps 除以4。

    Q2-2>当 x4时、(最大值) 1M 采样/秒除以4等于250K 采样/秒。

     ADC SSFIFO 捕获 ADC 值4次、我知道这4个 ADC 值计算硬件平均值。

    4个 ADC 中1个的捕获时间是多少?

    也许 TC (ADC 转换时间为1us)/ 4 = 0.25us?

    Q2-3> TS (采样时间250ns)将模拟输入信号的单位时间(1秒)除以1MHz (采样频率)、再除以采样频率、即可变为1us。

    i.e) 1us /250ns = 4、这是否意味着每单位时间进行4次采样?

    总之、在所有四个采样中、采样一次的时间是250ns (0.25us)?

      -第2季度和第3季度也有类似的问题。

    此致、
    Jame、Shin

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

    [引用 user="Jame shin"]

    Q1>我了解到、打开 ADC 来调用硬件平均函数、以减少高值和低值之间的偏差。

    因此、在上一帖子中、基于 Case1>的硬件平均值为 x2、x4的 CASE2和 Case3中、偏差并未降低。

    我的观点与案例1与案例2和案例3相同、因此没有改进。 我是否有误解?[/引述]

    也许我误解了您提供的数据。 这些连续值是否测量直流电压? 您是否更改了订单、或者它们是否与订单中的订单一致。 如果您已经对这些结果进行了排序、您的输入信号是否会发生变化? 如果这是采样的顺序、则得到的值会不断增加。 这可能是由采样时间不足引起的。 但是、使用硬件取平均值也会补偿不足的采样时间、我们看不到任何差异。 由于您的电路使用单位增益放大器、因此输入电阻应非常低。  

    [引用 user="Jame shin"]

    Q2-2>当 x4时、(最大值) 1M 采样/秒除以4等于250K 采样/秒。

     ADC SSFIFO 捕获 ADC 值4次、我知道这4个 ADC 值计算硬件平均值。

    4个 ADC 中1个的捕获时间是多少?

    可能是 TC (ADC 转换时间为1us)/ 4 = 0.25us?[/引述]

    ADC 模块由16MHz PIOSC 计时。 每次转换需要16个时钟周期。 单次转换需要1uS。 如果您进行4倍硬件取平均值、ADC 会进行4次转换、对其取平均值、然后将平均值作为单个条目存储在 FIFO 中。 创建一个 FIFO 结果需要4us。

    [引用 user="Jame shin"]

    Q2-3> TS (采样时间250ns)将模拟输入信号的单位时间(1秒)除以1MHz (采样频率)再除以采样频率、即可变为1us。

    采样时间为4个 ADC 时钟、即250nS。 转换时间为12个 ADC 时钟或750nS。 采样和转换的总时间为1uS。 采样率(在连续模式下)为每1uS 一次采样、即1M 采样/S 通过4倍的硬件取平均值、每4uS 或每秒250K 个样本即可获得结果。

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

    Bob、您好!

    Bob Said >这些连续值是否测量直流电压?

          a>DC + 5V 在无限循环中持续测量。

    Bob Said >您是否更改了订单、或者订单是否与订单的顺序一致。

                  如果您已经对这些结果进行了排序、您的输入信号是否会发生变化?

         a>我已经用我的眼睛在 OLED 显示屏上读取了 ADC 值、因此它不符合顺序。

    Bob Said >这可能是由采样时间不足引起的。

         a>在无限环路中测量端口 B1和 B2的电压和电流。 i.e) ADC0:B1端口、ADC1:B2端口

            和 UART0、1、2、3、5、7 Rx 引脚接收来自 Rx 引脚的数据以处理中断。

            当然、如果您没有从所有 UART Rx 引脚接收数据、ADC 捕获值会快速显示在显示屏上。

           但是、当从所有 UART Rx 引脚接收数据时、ADC 捕获值在显示屏上缓慢显示。

    Q1>所有 UART 波特率均为115200bps。 它是8.68us / 1位传输速度。

          同时捕获 ADC0模块上的电压和电流。

        然后、下一个 ADC1模块捕获电压和电流。

        从上一篇文章中、我了解到采样转换时间为4us。

        顺便说一下、硬件过采样 x 2为2us。

        因此、4us + 2us = 6us 时间、即发生 MCU 占用时间。

        减去 UART 的1位传输时间和 ADC MCU 的占用时间。

        差异为8.68us–6us = 2.68us。

        数据表解释了“快速中断处理:始终12个周期”。

        因此、如果 ISR 例程中的处理时间足够为100个周期。

          MCU 系统时钟50MHz (20ns/1周期)。

          20ns x 100周期= 2us。

          因此、2us x 6 UART 的 ISR 处理时间为12us。

         总之、2.68us–12us =-9.32us 是不够的。

          上述计算是否正确?

    Q2>如何知道硬件平均函数是否正常工作?

          如果上面的 Q1计算值为-9.32us,我该怎么办?

    此致、
    Jame、Shin

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

    抱歉、您的计算对我来说毫无意义。 如果不查看您的整个代码、我只能进行推测。 我认为您所做的是使用软件触发器进行 ADC 转换、然后使用 UART 将 ASCII 结果发送到显示器。 您还在处理从其他 UART 接收数据的过程。 是的、由于您没有使用中断、因此您将更新显示的频率是 CPU 开销的函数。 在这种情况下、您需要花费多长时间接收和处理来自其他 UART 的数据。 您可能大部分时间都在等待 ADC 或等待 UART。 您应该使用中断。

    从整体计划开始。 需要立即执行哪些操作、哪些可以等待。 您需要多久更新一次显示屏? 如果更新频率超过每秒两次、人们是否能够看到这些数字? 您可以通过使用计时器每500ms 生成一次中断来实现这一点。 在该中断例程中、启动 ADC 转换、但不要等待。 使用 ADC 完成中断开始发送到显示屏。 如果您需要发送超过8个字符来更新显示(UART FIFO 深度为8个字符)、请使用 UART TXIS 中断在 FIFO 占空时发送额外的字符。

    我不确定您在 UART RX 中断中为 UART 0、1、2、3、5、7执行的操作。 您不应进行任何数据处理。 应清空接收 FIFO、设置主例程中处理数据的标志、然后退出。 然后、主循环将只是检查标志并执行所需的数据处理。

    虽然这可能比您准备好解决的问题还要多、但这些问题通常通过使用 TIRTOS 等实时操作系统来解决。  

    TM4C123还在必要时支持嵌套中断。 在某些时候、您可能会超过 TM4C123 CPU 的计算能力、某些东西会丢失或延迟。 我怀疑你在这一点上。

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

    Bob、您好!

    我有疑问、因此请提供建议和解释。

    上一篇文章,Bob 说>  

    因此、FADC (ADC 时钟)比最大采样率快16倍。  

    在大多数应用中、采样率甚至更低。 如果源阻抗较高、则必须增加采样时间。

    如果要转换多个通道、则每个通道的采样率在转换的通道之间进行分频。

    Q1>如果需要将4个通道转换为 ADC、如果不希望采样率除以转换通道、该怎么办?

       i.e)如果您希望为每个通道使用 TC (ADC 转换时间) 1us、您应该怎么做?

    Q2>在 TI 的所有 MCU 中、是否有任何每个通道具有1us TC 的器件?

    Q3>如果有4个输入通道、如果您希望1us 而不是 TC = 1us / 4ch = 250ns、

         FADC (转换时钟频率)是否为64Mhz (当 ADC 12位、16MHz * 4 = 64时)?

        i.e)它是 TS (ADC 采样时间) 1us 吗? 因此、ADC 输入电容器充电放电时间将为1us?

    Q4>在 Q1至 Q3条件下选择器件更好的方法是什么?

    此致、
    Jame、Shin

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

    采样率和社交距离问候、

    [引用 user="Jame shin"]如果要对每个通道使用 TC (ADC 转换时间) 1us,应执行什么操作?

    澄清(可能)帮助供应商 Bob 代表您"不懈"努力:

    • 您如何证明您追求 TC " 1µS 或 bust"的理由?   您的所有4个模拟信号是否都需要根据正常采样定理要求在这些信号上运行该转换速率?
    • 如果这证明了情况(相信可疑)-正如我的员工先前在这个(冗长)线程中提到的-您可以使用 MCU 计时器"同时触发(两个) ADC 模块"-这会将要转换的通道数一分为二 -从而"使转换速率加倍!"   (您是如何失去这一事实的?)
    • 因此-如果您(另外)部署第二个(完全相同) MCU -并且计时器按描述触发每个 MCU -您可以(可能)跨"全部四个"通道""""、"淘汰" 1µS μ s 转换速率!

    [报价 USER="Jame shin"] TI 的所有 MCU 中是否有每个通道具有 TC 1us 的任何器件?

    同样、"您的"建议解决方案(使用另一个(非其他 MCU)不太可能证明是最佳解决方案。   该供应商(及其他供应商)生产的分立式(外部) ADC IC 比 MCU "种类多得多"。   您的搜索将显示分辨率更高且转换时间更快的器件。   其中某些(更高分辨率) ADC 可能允许以(部分)分辨率的"成本"进行更快速的转换、但仍然满足您所述(但没有任何理由)要求...  

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

    由于您使用的某些术语不正确、我在理解您的问题时遇到了问题。 让我定义三个术语:

    TC -转换时间。 对于 TM4C 器件、最短转换时间为1us。 这就是 ADC 将一个模拟值数字化所需的时间。

    TS - ADC 采样时间、这是 ADC 用来为采样电容器充电的时间。 对于 TM4C、最短采样时间为250nS。 采样时间是转换时间的一部分。 采样值为250nS、实际转换值为750nS。

    SR -采样率。 这是一个通道每秒转换的次数。 如果只转换一个通道并连续进行转换、则采样率与转换时间成反比、对于 TM4C、采样率为1M 次/秒

    如果您需要以1M 次采样/秒的采样率转换四个 ADC 通道、则无法使用 TM4C ADC 进行转换。 要转换四个通道、需要四个1uS 的转换时间、因此每个通道每4uS 采样一次。 这将提供250K 样本/秒的采样率。

    TM4C23器件上有两个 ADC。 每个通道都可以转换单个通道、采样率为1M 次采样/秒。 您可以使用外部 ADC 芯片。 您可以从以下位置开始查看 :http://www.ti.com/data-converters/adc-circuit/overview.html

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

    Bob、您好!

    在这个(接缝突发)线程中、我的员工注意到、"您"之前曾建议"定时器触发器"可以在(两个) MCU 的 ADC 模块上运行-因此可能(近乎)使"分组 ADC"转换速率加倍!   (但正如您刚才所说的、采样率仍然是固定的。)

    海报"遗漏"了这样一个事实、即(只有)连续转换可以实现最高的潜在转换速率、并且"必要的 ADC 数据处理"会降低实现的总体(即有效)转换速率。   

    不知为何的员工会回忆一个、"角形变硬-对风车收费"-结果可疑...

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

    Bob、您好!

    感谢对这些术语的澄清。

    单个 ADC 的价格对我来说很贵。

    Bob 说、上一篇文章>

    在采样期间、开关断开、ADC 输入引脚上的电压对内部采样保持电容器进行充电(或放电)。

    简单的答案是、4个 ADC 时钟是该 ADC 转换器允许的最快时间。 但在某些设计中、4个 ADC 时钟(250nS)可能不够。

    Bob Said > TS - ADC 采样时间、这是 ADC 用来为采样电容器充电的时间。

    Q1>是否只需4个 ADC 时钟即可为电容器充电?

          为什么电容器放电不包括 TS (ADC 采样时间)?

        i.e) (时间常数) t = RC、我了解如果输入阻抗较大、则4个 ADC 时钟是不够的。

    Bob Said > TM4C23器件上有两个 ADC。 每个通道都可以转换单个通道、采样率为1M 次采样/秒。

    Q2> ADC0:2个通道、ADC1:2个 ADC 模块2个通道、如下所示?

        ADC0模块为 TC:2US、FCONV:500kSPS

        ADC1的模块为 TC:2us、FCONV:500kSPS

      因此、所有4个通道都是 TC:4us、FCONV:250kSPS。  我知道。  

      当触发两个 ADC 模块时、TC 和 FCONV 值是多少?

    Q3>是否可以按如下方式设置计时器、或者是否需要通过添加计时器源代码来启动计时器?

        ADCSequenceConfigure (ADC0_BASE,0,ADC_TRIGGER_TIMER,0);

        ADCSequenceConfigure (ADC1_base,0,ADC_TRIGGER_TIMER,0);

    Q4>您能否在下面解释详细信息?  ( 我不明白 CB1的意思。)

    CB1说过>"定时器触发器"可以在(两个) MCU 的 ADC 模块上运行-因此有可能(接近)使"分组 ADC"转换速率加倍!   (但正如您刚才所说的、采样率仍然是固定的。)   …………  降低实现的总体(即有效)转换率。  

    此致、
    Jame、Shin

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

    [引用 USER="Jame shin"] Q1>它是否只需要4个 ADC 时钟来为电容器充电?

    正如您指出的、它是输入阻抗的函数。  

    Q2:两个 ADC 转换器独立运行、并且可以同时运行。 因此、当每个 ADC 转换两个通道时、四个输入中的每一个的有效转换速率为每秒500K 次采样。

    [引用用户="Jame shin"] Q3>是否可以按如下方式设置计时器,或者是否需要通过添加计时器源代码来启动计时器?

    否、也必须配置计时器。 如果您需要最大转换速率、则不需要计时器、而只需使用连续转换。

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

    您好!

    这里是否有不同(更具包容性)意见的空间?

    [引用 user="Bob Crosby"]

    Q2:两个 ADC 转换器独立运行、并且可以同时运行。 因此、当每个 ADC 转换两个通道时、四个输入中的每一个的有效转换速率为每秒500K 次采样。

    Jame shin
    Q3>是否可以按如下方式设置计时器、或者是否需要通过添加计时器源代码来启动计时器?

    [/报价]

    我们的团队实验并确认、通过"从同一个"触发源"触发两个 ADC 模块-有效 ADC 转换速率可以加倍!   "转化率加倍"是否可以获得供应商的许可/批准?   (此增强型触发方法在此处由工程师 Bob 注释。)

    实际上、"连续转换"(通过参数"ADC_TRIGGER_AYST"实现)可以最大限度地提高转换速率-但代价是"中断两个 ADC 模块之间的同步!"   和-计时器触发器"ADC_TRIGGER_TIMER"也可以(轻松)实现最大转换速率-同时保持 ADC 模块同步!

    我们的小组发现、"定时器触发的转换"大大改进了 ADC 转换的(管理)。   (即、当电磁阀(或其他噪声源)被激活/释放时、或者当"ADC 结果缓冲器的恒定过写被证明是不可取的"时、转换可能会停止-这是 连续转换的已知(但不需要)副产品!)

    (每个) ADC 模块使用"定时器触发(同步)转换"似乎最接近满足这个用户的目标。

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

    CB1、

    是的、我同意您在上面提出的所有观点。  

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

    Bob、您好!

    Bob Siad>不、计时器也必须进行配置。 如果您需要最大转换速率、则不需要计时器、而只需使用连续转换

    Q1>“但只需使用连续转换。 “在我的情况下,这意味着只有 ADC 连续转换没有时间从 UART 接收数据0,1、2、5、7?

    Q2>通过设置超时来触发两个 ADC 模块上的计时器、源代码是否正确? 如果有问题、请触按。

    上一篇文章、Bob Siad>  您需要多久更新一次显示?     

                          您可以通过使用计时器每500ms 生成一次中断来实现这一点。

                          如果更新频率超过每秒两次、人们是否能够看到这些数字?

    Q3>我理解您之前建议的词语。 但是、在我的情况下、当阈值电流值(0.7Amp)或更多电流流动时、状态反应时间必须很短。   因此,定时器的装载值为50ms (吹气源代码0x26259F)。 如果有更好的方法、您能告诉我吗?

    此致、
    Jame、Shin

    main()
    {
    …
    
    //启用 Timer0外设
    SysCtlPeripheralEnable (SYSCTL_Periph_TIMER0);
    
    //等待 Timer0模块准备就绪。
    while (!SysCtlPeripheralReady (SYSCTL_Periph_TIMER0))
    {
    }
    
    //初始化计时器 A 在时间模式中递增计数
    TimerConfigure (TIMER0_BASE、TIMER_CFG_PERIODICY_UP);
    
    //设置周期计时器(TimerA)的计数时间。
    //计时器时钟=系统时钟50MHz,TC = 20ns,
    //计数= 50ms /20ns = 2,500,000,
    //十六进制转换= 2,500,000 - 1 = 2,499,999 (0x26259F)
    //
    TimerLoadSet (TIMER0_BASE、TIMER_A、0x26259F);
    
    
    //启用计时器可导致 ADC 触发事件。
    TimerADCEventSet (TIMER0_BASE、TIMER_ADC_TIMEOUT_A)
    
    //启用计时器。
    TimerEnable (TIMER0_BASE、TIMER_A);
    
    // ADC 设置
    ………
    
    ADCSequenceConfigure (ADC0_BASE、0、ADC_TRIGGER_TIMER、0);
    ADCSequenceConfigure (ADC1_BASE、 0,ADC_TRIGGER_TIMER,0);
    ………
    
    IntEnable (INT_TIMER0A);
    
    IntMasterEnable ();
    
    
    
    while (1)
    {
    …μ A。
    if (g_BSerialTerminal)
    {
    ADCProcessorTrigger (ADC0_BASE、0);
    ADCProcessorTrigger (ADC1_base、0);
    
    while (!ADCIntStatus (ADC0_BASE、0、false)||!ADCIntStatus (ADC1_base、0、false))
    {
    }
    
    ADCIntClear (ADC0_BASE、0);
    ADCIntClear (ADC1_BASE、0);
    …
    ADCSequenceDataGet (ADC0_BASE、0、&pui32ADC0Value[0]);
    …
    ui32Current =(pui32ADC0Value[1]* 1378)/273;
    
    IF (ui32电流> 7000)
    {
    }
    
    ADCSequenceDataGet (ADC1_base、0、&pui32ADC1Value[0]);
    …
    ui32Current =(pui32ADC0Value[1]* 1378)/273;
    IF (ui32电流> 7000)
    {
    }
    
    }
    // IF (g_BSerialTerminal)结束
    
    …
    if (UART0_RX)…μ s。 };
    if (UART1_RX)…μ H。 };
    if (UART2_RX)…μ H。 };
    if (UART3_RX)…μ H。 };
    if (UART5_RX)…μ A。 };
    if (UART7_RX)…μ H。 };
    
    
    。} // while (1) end
    
    }// main end
    

    // TIMERA,超时,中断 ISR
    void Timer0AIntHandler (void)
    {
    TimerIntClear (TIMER0_BASE、TIMER_TINA_TIMEOUT);
    TimerIntEnable ((TIMER0_BASE、TIMER_TINA_TIMEOUT);
    
    }
    

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

    此线程(很快)能否达到100个帖子... 您好!

    您是否确实打算使用两个(不同) ADC 触发器?    (也许这是可能的、但不太可能。)

    第一:   

    ADCSequenceConfigure (ADC0_BASE,0,ADC_TRIGGER_TIMER,0);
    ADCSequenceConfigure (ADC1_base,0,ADC_TRIGGER_TIMER,0);


    然后、接着是:

    ADCProcessorTrigger (ADC0_BASE、0);
    ADCProcessorTrigger (ADC1_base、0);

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

    [引用 user="Jame shin"]Q1>“但只使用连续转换。 “在我的情况下,这意味着只有 ADC 连续转换,而没有时间从 UART 接收数据,0,1,2,3,5,7?

    实际上、连续转换不会干扰在 UART 上接收数据。 这两种情况都可以同时发生。 但是、您可能没有足够的 CPU 时间来处理连续转换和接收到的数据。

    [引用 USER="Jame shin"]Q2>通过设置在两个 ADC 模块上触发计时器的超时、源代码是否正确? [/报价]

    CB1回答(感谢 CB1!)

    [引述 user="Jame shin"]Q3>我理解您之前建议的词语。 但是、在我的情况下、当阈值电流值(0.7Amp)或更多电流流动时、状态反应时间必须很短。   因此,定时器的装载值为50ms (吹气源代码0x26259F)。 如果有更好的方法、您能告诉我吗?

    您是否考虑使用具有集成比较器的电流传感器、例如 INA301。 在过流情况下、使用 ALERT 引脚生成一个中断以实现快速响应。

    http://www.ti.com/product/INA301

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

    您好!

    供应商的 Bob 先前指出、您应该注意"人类处理显示数据所需的时间"。   我的小组仍然担心您会寻求:

    • 更新您的(非常小) OLED  (500ms 周期(2次更新/秒)应该是最快的更新速率-尤其是对于极小的 OLED!

    • 监控系统电流消耗

    触发器来执行该操作。

    我的团队在显示和电流监控与测量方面拥有丰富的经验(两者均有)。   使用 MCU 的 ADC 来监测和测量电流存在严重缺点!   (仅 ADC 就证明了"太慢"和"太受干扰"-因此增加了很多风险!)     

    Bob 建议使用"快得多"(专用于任务)电流传感器 IC 、这消除了(两者) ADC 的电流监控/测量责任...  (另请注意、INA (电流感测)系列的"特定"成员包括"集成感测电阻器"、从而提高精度并减小 PCB 尺寸...

    此外、您需要制定"应对此类过流的策略"。   一些过流可能是"瞬态"(非常短暂)、可以通过(短暂)"关闭"那些要求最大电流的 MCU 任务来解决。   在更严重的情况下-您可以"增加停机时间"-和/或"重置您的系统"-但如果过流持续存在-您可能必须完全禁用您的小型系统... 在所有情况下、Bob 建议的快速(可靠)响应(INA)可最大限度地防止"系统损坏!"

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

    Bob、您好!

    我尝试触摸精简源代码中的正确源代码以触发 ADC 计时器、但存在问题。

    Bob 说>" CB1回答(感谢 CB1!) "

    它在下面的源代码处停止。

    e2e.ti.com/.../3313455

    //等待转换完成。

    while (!ADCIntStatus (ADC0_BASE、0、false)||!ADCIntStatus (ADC1_base、0、false))

    //

    //清除 ADC 中断标志。

    ADCIntClear (ADC0_BASE、0);

    ADCIntClear (ADC1_BASE、0);

    Q1>如何正确更改源代码?

    此致、
    Jame、Shin