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**** 1821780 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

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

    我不知道您修改了什么源。 请附上您的代码。

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

    [引用 user="Jame shin"]

    我尝试触摸精简源代码中的正确源代码以触发 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>如何正确更改源代码?

    [/报价]

    不知怎么--年轻的工作人员回忆起卡通,其中"水坝会造成泄漏--人们会插入一根手指--然后是第二根手指--第二个人会插入自己的手指...  但是泄漏仍在继续... 要求整个城镇插入手指..."

    您投诉(今天)过去的建议"突然失败"-您是否应该检查(即测试)过去的建议"何时到达?"

    遵循"您的"代码发明(由 Bob 修改/更正):

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

    您(现在)声称代码在"while ()"中挂起

    无法通过以下方式解决:

    • 采用 while 循环两次(即、首先检查"ADC0_BASE"-并且(仅限)在完成"ADC1_BASE"之后)
    • 如果循环失败-您在确定问题方面的成功已被"解决并加速"(即、谢谢 kiss!)

    有时最好的帮助是"自助"、这在这个"大坝爆发"中有很大的证据、这是不是真的?

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

    Bob、您好!

    我没有抱怨。 这只是某人的想法。

    我从两位(CB1、Bob)专家那里得到了同样的建议。

    Bob 说>我不知道您修改了什么来源。 请附上您的代码。

         a> 是的、要从正常源代码中添加 ADC 触发定时器、请在下面再次附加。

            正是代码减少了整个源代码。

    Q1>请告诉我运行两个 ADC 模块的 ADC_TRIGGER_TIMER 源代码中有什么错误。

    此致、
    Jame、Shin

    SysCtlPeripheralEnable (SYSCTL_Periph_TIMER0);

    while (!SysCtlPeripheralReady (SYSCTL_Periph_TIMER0))

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

    TimerADCEventSet (TIMER0_BASE、TIMER_ADC_TIMEOUT_A);

    TimerEnable (TIMER0_BASE、TIMER_A);

    IntEnable (INT_TIMER0A);

    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);
    
    // CB1和 Bob 同意解决方案建议-------------------------------------------------------
    
    ADCProcessorTrigger (ADC0_BASE,0);
    ADCProcessorTrigger (ADC1_base,0);
    //---------
    
    IntEnable (INT_TIMER0A);
    
    IntMasterEnable ();
    
    
    
    while (1)
    {
    …μ A。
    if (g_BSerialTerminal)
    {
    // ADCProcessorTrigger (ADC0_BASE、0);
    // ADCProcessorTrigger (ADC1_base、0);
    
    // Jame,Shin 问题,现在出现问题
    /********
    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)
    {
    while (!ADCIntStatus (ADC0_BASE、0、false))
    {
    }
    ADCIntClear (ADC0_BASE、0);
    
    ...}
    
    ADCSequenceDataGet (ADC1_base、0、&pui32ADC1Value[0]);
    …
    ui32Current =(pui32ADC0Value[1]* 1378)/273;
    IF (ui32电流> 7000)
    {
    while (!ADCIntStatus (ADC1_base、0、false))
    {
    }
    ADCIntClear (ADC1_BASE、0);
    } // 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);
    
    } 

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

    可能"定时器配置不正确"问候语、

    请注意:

    [引用 user="Jame shin"]//在时间模式下初始化计时器 A 计数

    TimerConfigure (TIMER0_BASE、TIMER_CFG_PERIODICY_UP);[/引用]

    您的评论建议使用"计时器 A"导致的"分离计时器"-它不是吗?   然而、"TIMER_CFG_PERIODICY_UP"被保留用于"全宽"定时器!

    然后、您按照该函数调用操作:

    [引用 user="Jame shin"]

    //  十六进制转换 = 2、500、000 - 1 = 2、499、999 (0x26259F)

    TimerLoadSet (TIMER0_BASE、TIMER_A、0x26259F);[/引用]

    它采用参数"TIMER_A"-为分离定时器保留。

    现在、这个线程非常长(并且阻尼水位如此深)、几乎没有人可以调用 TIMER0的规格。   如果它是一个32位定时器-那么"TIMER_A"只能容纳16位。   (这证明远远低于您所需的250万!)

    值得注意的是,您在函数之间创建了“冲突”: TimerConfigure()和 TimerLoadSet()!   可以是这样吗?

    这是否显示了"注意细节?"中的最大值?   此外,还收到了一条建议(2篇文章返回),使您可以对 while ()循环失败的“方式和原因”进行“洞察”。   你没有提到这一点-这与...有关。

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

    您好 CB1、

    感谢你的答复。

    我单独测试了计时器。

    但问题是一样的。

    TimerConfigure (TIMER0_BASE、TIMER_CFG_PERIODICY_UP); => 定时器配置(TIMER0_BASE、TIMER_CFG_SPLIT_PAIR);

    Q1>由于加载值中的0x26259F 位数是24位,所以它是一个32位的定时器 “全宽”吗?

    此致、
    Jame、Shin

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

    [引用 user="Jame shin"]我单独测试了计时器。

    沟通和语言使用就是这里的一切-我们努力提供帮助和解决问题。

    我们将再次询问:

    • 您是否创建了两个 while 循环-第一个循环等待 ADC0_BASE 完成?
    • 并且-如果(第一个) while 循环(DID)完成-您是否测试了 ADC1_base (具有第二个 while 循环)-并观察其完成情况?

    以下是可能的结果、旨在"在"双 ADC、逻辑组合 while 循环"(这是您的"独特"创建)中释放您的代码、使其不会卡在"双 ADC、逻辑组合 while 循环"中(这是您的"独特"创建)。

    • 您会在 ADC0_BASE 循环中"卡住"  (这是我的组建议的第一个 while 循环)
    • 您会在 ADC1_base 循环中"卡住"  (这是我的组建议的第二个 while 循环)
    • 您会在两个(以上) while 循环中"卡住"
    • 您的代码会设法从两个 while 循环"正确退出"

    您能不能提供以下建议:

    • 您(真的)是否创建并测试了2 while 循环方法?   (即两个 while 循环运行、"一个接一个"-通过测试"一次只测试一个 ADC 模块!"来简化程序代码!)   过去-您声称自己成功使用了单个 ADC 模块的 while 循环...
    • 如果是-出现了4个可能的结果中的哪一个(在上面为您组织并列出)?

    希望您最近的回答"但问题相同"和"详细信息"(在这篇特定文章中)之间的区别是清楚的。   供应商 Bob 和我的团队依靠您清晰而详细地报告"真实事实"-最好您"模拟"所提供的语言(非常详细)-而不是"问题是一样的!"

    您在前面报告说、while 循环的执行"没有困难"-事实上(现在)您注意到会发出强烈的信号、即您的 ADC 设置/配置代码-在使用计时器触发器时-有问题!

    还请注意、Bob 建议(并且我的小组同意)、可以通过使用"INA"电流感应器件来消除您对第二个 ADC 模块(似乎充满问题)的使用。   Bob 和我的团队都敦促您考虑这一点-尽管两个 ADC 模块的管理似乎存在过度挑战、但您还是提供了"无响应"。   您是否不接受我们的建议-即使"您的方式"未成功-您建议我们(进一步)做些什么来提供帮助?

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

    我的正义朋友 CB1

    很抱歉、所有的通信总是混淆不清。

    我不喜欢写英语,这不是我的母语。

    很抱歉、下面的内容很长。

    ##1.

    CB1说>您(真的)创建了2 while 循环方法、然后测试了该方法吗?  

          a>是的、我测试了它。 但是、它会在第一个 while 环路停止。

    ## 2.  

    CB1说过>过去-您说您成功使用了单个 ADC 模块的 while 循环...

          a>是的、Bob 的建议解决了这个问题。

    ## 3.  

    CB1所说>您是否会很好地建议:

          a>您可能会对我造成干扰。

    ##4.  

    CB1说过>如果是的话-在4个可能的结果中、哪一个(在上面为您组织并列出)发生了?

          a>正如您所建议的、我将其拆分为2个 while 循环。 结果在第一个 while 循环处停止。

    //等待转换完成。

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

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

    ##5.  

    CB1说>供应商 Bob 和我的团队依靠您对"真实事实"的清晰详细报告

                  -最好您对提供的语言进行"模拟"(非常详细)

                  ——而不是用“问题是一样的!”来回答

        a>这是对测试结果的反馈以及您建议的内容。

          很抱歉、我的简短句子让您感到很沉重。

    ## 6.

    CB1说>您之前报告过循环执行时"没有困难"

          a>我知道、ADC0连续转换值不会随着时间的推移而转换为 ADC、这仅在 UART0中接收到连续数据时发生。

    ##7.

    CB1说>-您注意到(现在)发出强烈信号、表明您的 ADC 设置/配置代码-在使用计时器触发器时-有问题!

         a> 我不理解您对 ADC 计时器触发器有问题的说法。

        Q1>您能告诉我问题是什么吗?

    ## 8.  

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

      a>通过以下 Q & A、Bob 触发两个 ADC 模块、因此四个信号输入的转换速率据说为500kSPS、而不是250kSPS。

    Q2>以下哪一项是正确的、Bob 还是 CB1?

    Bob Said >这两个 ADC 转换器独立运行、可以同时运行。

                因此、当每个 ADC 转换两个通道时、四个输入中的每一个的有效转换速率为每秒500K 次采样。

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

    Bob, a>不,计时器也必须配置。

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

    ##9.  

    CB1说过>还请注意、Bob 建议(我的小组同意)、可以通过使用"INA"电流感应器件来消除您对第二个 ADC 模块(似乎有问题)的使用。

    a>对于下面的 Q & A、我了解到、主要是使用 INA301 ALERT 引脚进入 PB4、以检测快速电流并将其显示在显示屏上。   "ADC_TRIGGER_EXTERNAL -由端口 B4引脚的输入生成的触发器。 "

    Bob Siad>

      您需要多久更新一次显示屏?       

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

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

    Jame,Q>我理解您之前建议的词语。 但是、在我的案例中、

            当阈值电流值(0.7Amp)或更多电流流动时、状态反应时间必须快。  

            因此,定时器的装载值为50ms (吹气源代码0x26259F)。

            如果有更好的方法、您能告诉我吗?

    Bob,a>您是否考虑使用带有集成比较器 的电流传感器,如 INA301

           在过流情况下、使用 ALERT 引脚生成一个中断以实现快速响应。

    ## 10.  

    Bob Siad>您建议我们(进一步)做些什么来提供帮助?

          a>我认为 CB1是一个司法专家组。

            你是个快速兔吗?

    此致、
    Jame、Shin

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

    [引用 user="Jame shin"]

    CB1说>您(真的)创建了2 while 循环方法、然后测试了该方法吗?  

          a>是的、我测试了它。 但是、它会在第一个 while 环路停止。  [/报价]

    如果我们后退一步-思考(只是一点)-这不是本周六"问题"的"心灵与灵魂"吗?   (今日刊)

    如果您的代码无法在该"第一个 while 循环"中正确执行-那么在扩展到您的"组合、双 while 循环"代码块时、它显然"无机会"执行-这是否不清楚?

    这里的年轻员工建议:

    • 研究并发现您的代码在执行循环时"失败"的"位置和原因"、这一点有点明显、是不是吗?  
    • 您可以(最初)删除"定时器触发器"-而是通过调用"ADC 处理器触发器()"来触发 ADC。   您的目标应该是在循环期间使其(失败)能够正确执行。  (即转义)
    • 后继 w/ADCProcessorTrigger()时:
      • 删除 ADCProcessorTrigger()代码
        • 代码块中的位
        • 以及 ADC 代码块外部(外部)的任何位置
      • 将计时器触发器添加到 ADC 代码块
      • 正确编程计时器-员工建议降低此测试的计时器频率
      • 对"timer code"和"ADC code"进行这些更改后-然后测试(单个) while 循环是否执行(并正确退出... 即不挂起!)

    "kiss"是-并且仍然是您的"朋友和帮助"。   您似乎通过以缓慢、专注和有条不紊的方式向您的计划中引入(非常)多个部件(无需测试和验证每一个部件)、让自己变得过分。   员工已尽最大努力说明流程(如上所述)...

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

    您很难在上面的代码中看到您可能做了哪些错误、因为您在发布的代码中没有执行大部分初始化。 更重要的是、我认为您的系统设计未能满足您的需求。 我的理解是、您需要转换4个模拟信号。 两个代表电压、两个代表电流。 您希望将电流与限值进行比较、并在超过电流限值时迅速做出反应。 此外、您还需要将测量值转换为 ASCII 字符串、并通过 UART 将其发送到某些显示屏。

    基本问题是、您希望高频率的测量检查限制、但您将受到从 UART 发送数据所需时间的限制。 解决方案是使用中断来检查 ADC 值并对其做出快速反应、但在主例程中执行串行输出。 我已经举了一个示例、该示例使用在16KHz 时触发的 ADC0和 ADC1。 在该速率下、将对照限值检查电流值、如果超过限值、将切换 GPIO 引脚并设置标志。  

    该例程每100mS 使用系统计时器中断一次。 每十次中断(每秒一次)都会设置一个标志。 主循环等待设置标志并将最新值发送到 UART0。 在本示例中、值每秒输出一次 UART0。

    我希望此示例对您有所帮助。 当你尝试执行这个示例时、请确保你包括设置中断矢量。 在我的代码中、这在文件 tm4c123gh6m_startup_ccs.c 中完成 当您进行修改时、尽量减少您在中断例程中执行的操作。 中断例程应该是短的。 例如、我将原始电流值与中断中的数字进行了比较、而不是将其转换为实际电流。 在将值从 UART 发送出去之前、该转换可以在主循环中进行。

    /cfs-file/__key/communityserver-discussions-components-files/908/3323.ADCwTimer.zip

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

    十字路口的海报 Jame 您好!

    不打算从供应商 Bob 的"卓越"帮助和努力中带走任何东西-我的团队认为您现在处于"主要十字路口!"   (十字路口-一条向多个不同方向分支的道路-迫使一条路径(通常)仅选择一条路径。)

    为您的使用而改编的供应商代码(可能)几乎肯定会"实现其规定的目标"。   但是-正如供应商(和我的小组注释)所述、我们两个人都无法完全清楚地了解您的整个项目。   我们的团队发现(非常)很少有 OLED 接受 UART 驱动。   (I2C 和 SPI 的流行程度要高得多。)   这意味着您将在某个关键时刻"独自"!   那么呢?   (您能不能真正依赖您在(附近)一直享受到的非凡技术服务?)

    我们的团队为您提出了一种"基于 kiss 的替代方法"。   我的许多(天才)员工(假设)都接近您的年龄(20岁初/ 20岁中)、他们都"清楚地认识到"亲吻"提供的许多优势。"   当然、"复制/粘贴"(来自合格来源)会促使您-但除非您非常严格-它往往会"减少并与实际学习相违背"。   请注意-"剪切/粘贴"代码越大且越广泛-"真正学习和理解!"就越少   (这种联系是因为人类的性质-如果准则(似乎)"满足当今的需要"-为什么要花费(必要)时间和精力"真正掌握和充分理解?")

    我们团队的两篇文章提供了一种"基于 Kiss 的"(重点突出)方法、旨在"最好地实现"您的真正学习和理解。   为了您的利益、我们希望您 仍能投入时间和精力探索"您的计时器触发 ADC 代码块在单个 while 循环中的位置和原因"。"   这种努力、专注和纪律一定会"丰富您的编程和一般问题解决技能"-这无法通过"复制/粘贴!"实现

    如前所述-供应商或我的团队是否完全理解您的整个项目是令人怀疑的。   如果您没有进一步的"基于 kiss"的开发技能您将如何"填充"这些"缺失的器件?"   大型项目-甚至是"巨型"项目-大多数项目总是可以细分为更小、更易于管理的部分。   Kiss 指导您以激光方式关注这些小代码/项目元素中的每一个元素-这是一个"缩小研究范围、实验和分析"、它最能实现"问题解决"-这将为您在未来提供很好的服务...

    你现在站在一个关键的十字路口-我们的团队(做了更多)不仅仅是"希望你取得成功!"   您是否有力量和勇气"确定并选择正确的道路?"

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

    我的正义朋友 CB1

    感谢您在周六在可俯瞰密歇根湖的客房内回答您的问题。

    我不确定 ADC 代码块的确切位置。

    但是、我尝试了您的建议、但它不起作用。

    我有一个理解英语的障碍。

    您能否建议使用以下源代码中的更改源代码?

    此外、  

    感谢您在周日的回复。

    是的。 我站在十字路口。

    我需要力量和勇气。

    此致、
    Jame、Shin

    main()
    {
    …
    
    //启用 Timer0外设
    SysCtlPeripheralEnable (SYSCTL_Periph_TIMER0);
    
    //等待 Timer0模块准备就绪。
    while (!SysCtlPeripheralReady (SYSCTL_Periph_TIMER0))
    {
    }
    
    //初始化计时器 A 在时间模式中递增计数
    TimerConfigure (TIMER0_BASE、TIMER_CFG_SPLIT_PAIR | TIMER_CFG_A_PERIODICY_UP);
    
    //设置周期计时器(TimerA)的计数时间。
    //计时器时钟=系统时钟50MHz,TC = 20ns,
    //计数= 50ms/20ns = 2,500,
    //十六进制转换= 2,500,000 - 1 = 2,499,999 (0x26259F)
    //CB1测试建议计数= 1ms/20ns = 500,
    //十六进制转换= 50000 - 1 = 49999 (0xC34F)
    TimerLoadSet (TIMER0_BASE、TIMER_A、0xC34F);
    
    
    //启用计时器可导致 ADC 触发事件。
    TimerADCEventSet (TIMER0_BASE、TIMER_ADC_TIMEOUT_A)
    
    //启用计时器。
    TimerEnable (TIMER0_BASE、TIMER_A);
    
    // ADC 设置
    //必须启用 ADC0外设才能使用。
    //
    SysCtlPeripheralEnable (SYSCTL_Periph_ADC0);
    SysCtlPeripheralEnable (SYSCTL_Periph_ADC1);
    
    ...
    
    ADCSequenceConfigure (ADC0_BASE、0、ADC_TRIGGER_TIMER、0);
    ADCSequenceConfigure (ADC1_BASE、 0,ADC_TRIGGER_TIMER,0);
    
    // CB1和 Bob 同意解决方案建议
    //--------------------------------------
    ADCProcessorTrigger (ADC0_BASE,0);
    ADCProcessorTrigger (ADC1_base,0);
    //---------
    
    IntEnable (INT_TIMER0A);
    
    IntMasterEnable ();
    
    
    
    while (1)
    {
    …μ A。
    if (g_BSerialTerminal)
    {
    // CB1 & Bob 同意解决方案建议,删除
    // ADCProcessorTrigger (ADC0_BASE、0);
    // ADCProcessorTrigger (ADC1_base、0);
    
    // Jame,Shin 问题,现在出现问题
    /********
    //while (!ADCIntStatus (ADC0_BASE、0、false)||!ADCIntStatus (ADC1_base、0、false))
    //{
    //}
    
    //循环分离时的 CB1测试
    while (!ADCIntStatus (ADC0_BASE、0、false)//在第一个 while 循环处停止
    {
    }
    while (!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)
    {
    while (!ADCIntStatus (ADC0_BASE、0、false))
    {
    }
    ADCIntClear (ADC0_BASE、0);
    
    ...}
    
    ADCSequenceDataGet (ADC1_base、0、&pui32ADC1Value[0]);
    …
    ui32Current =(pui32ADC0Value[1]* 1378)/273;
    IF (ui32电流> 7000)
    {
    while (!ADCIntStatus (ADC1_base、0、false))
    {
    }
    ADCIntClear (ADC1_BASE、0);
    } // 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);
    
    } 

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

    Bob、您好!

    感谢您的回答

    您了解的项目内容都是正确的。

    只有这个是不同的。 向显示屏添加图形内容和 UART 数据是独立于外部输入的数据。

    上一帖子中输出到 UART 的 ADC 值用于测试。

    我使用的是 Keil 工具、它是一款器件 TM4C123FH6PMI7。

    感谢您发送的示例代码。

    此致、
    Jame、Shin

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

    回到"高度专注、一次一小步"、问候、

    我的员工曾发表过几篇文章,“ADC_TRIGGER_TIMER -一个由计时器生成的触发器;使用 TimerControlTrigger()配置”。

    不幸的是-  TimerControlTrigger()函数您的(刚刚到达)代码中没有出现!

    ADC 将不会接收和/或处理计时器触发器、而不会接收到先前的函数调用-您是否同意?

    您是否了解"外设驱动程序库用户指南"中包含的巨大教育价值?   (它是 TivaWare "DOS"文件分组中包含的关键操作手册之一-正是该文档披露了对  TimerControlTrigger()的需求!)   几乎所有 API 的"特性、功能、优势"都在外设驱动程序指南中得到了很好的说明!

    如果您能"设计一种方法来快速/轻松地"测试计时器"、这将对您非常有帮助。   您会如何解决这一问题-即使您不应该使用示波器或逻辑分析仪?   (提示-计时器引脚可同时用作输入或输出-当设置为输出时、它(可能)驱动 LED……)

    如果您可以成功执行定时器操作-那么我们才准备好转到 ADC 操作。   (哪个是定时器触发的)  一个小的成功步长不会超过许多"不成功的步长?"   

    是“最高的建筑” "一次一层!?"   (但我们会看到许多楼层的代码-那些最高层的... 倾斜和倾斜-在完全/正确测试/验证和确认的情况下构建时!)

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

    您好 CB1、

    CB1说>回到“高度专注,一次一小步”

    a.>我未收到上一个端口上的描述。 我无法集中精力。

                  解决了。 谢谢你。

    LA 和 Chicago 英语是否有点不同,“w /”是什么意思?

              例如) 、没有被完全/正确检查!

    此致、
    Jame、Shin

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

     Bob、您好!

    专家的示例不同、即使它不同。 代码长度很简明、需要学习的东西很多。

    我感觉很成熟。 谢谢你。

    ADC 转换率从250kSPS 更改为500kSPS、因此精度和准确度都得到提高。

    Q1>在 QS 记录器示例中、可在 TLV2374PW 器件上测量的电压为0至20V。

         您能否详细解释哪种理论高达20V?

        请参阅,[图1]方框图

        https://e2e.ti.com/support/microcontrollers/other/f/908/p/878416/3278703#3278703

    Q2>如果要测量高达25V 的输入电压、应更改什么?

    Q3>测量电流在分流放大器(INA198)中进行了测试。

          但是、当负载更改为5V 时、ADC 读取的 INA198的输出电压不是线性。

        由于100 ~ 65欧姆负载可变电阻值的波动、电流值很小

          65欧姆至5欧姆的电流值很大。

       是否有任何方法可以校正非线性?

    此致、
    Jame、Shin

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

    集中挑战、问候、

    当遇到"糟糕的一天"或"糟糕的时刻"时-最好"做其他事情"-但"请记住、一定会再来!"   您必须承认并避免"交易"-这绝不是您的朋友!

    你写"已解决"-这意味着什么?   (细节完全缺失-不可接受-会迫使您的无行为帮助者做更多的工作!)

    w 是"后面跟随下一个字"的简写。   (即、谢谢=谢谢;w/out =没有-员工/I 类型60+ WPM -简略使我们能够节省时间并保持精神专注!)   我们尝试"在这里提供帮助"-但"Wolf 始终"在我们的后室门外"-我们必须设计、测试/验证、确认-然后包装和运输-以使他远离!   只有通过"打败股票市场"、我们的豪华后房(照明充足-顺便说一下)才会保持开放...

    您没有回应员工关于"设计计时器操作测试"的建议(完全为了您的利益)   他们和我都认为、这种纪律"能够最好地提升您的 MCU 功能!"   (复制-粘贴-不是太多-当您的客户"更改他们的设计"-以及(也许)供应商的 Bob 无法回复时、会发生什么情况?

    一旦您开发了"方法和技能"来"测试和评估"许多 API 函数(涵盖主要 MCU 外设)、您就可以很好地进入"获得技术理解和独立性的途径!"   而且-凭借每一个"API 函数精通"-您的"信心、问题解决和技术见解"倍增-使您能够更好地"选择并成功运用" MCU 的所有强大 API 函数!   这是一项巨大的授权-并且每天都得到验证!

    对您(以及许多其他人)来说是一个值得关注的目标、是不是吗?   LPad、评估板、IDE 和外设驱动程序库用户指南是"出色的技术帮助"-您真的应该"更好地利用(使用)它们!"   (ThThink/尽力 精简"复制/粘贴"-一个建议的(但较小的)替代方案不是...)

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

    [引用 user="Jame shin"]

    Q1>在 QS 记录器示例中、可在 TLV2374PW 器件上测量的电压为0至20V。

         您能否详细解释哪种理论电压高达20V?[/QUERT]

    QS 记录器演示是为 DK-TM4C123G 开发套件编写的。 (此套件不再提供。)  前四个模拟输入通过电阻器进行调节。 请参阅 用户指南的第27页

    根据基本电子产品的介绍、端子 CH3上的电压将降低 R10/(R10+R9)或 1/6.8的比率。 由于可在 AIN3上测量的最大电压可为3.0V、因此3.0V x 6.8 = 20.4V。

    要增大范围、请更改电阻器。 增加 R9或减少 R10。

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

    [引用 user="Jame shin"]

    Q3>测量电流在分流放大器(INA198)中进行了测试。

          但是、当负载更改为5V 时 、ADC 读取的 INA198的输出电压不是线性。

        由于100 ~ 65欧姆负载可变电阻值的波动、电流值很小

          65欧姆至5欧姆的电流值很大。

       是否有任何方法可以校正非线性?

    [/报价]

    请在 放大器论坛中重新发布有关 INA198的问题