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 采样时间受 LCD 屏幕的限制

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/591128/tm4c123gh6pm-adc-sampling-time-limited-by-lcd-screen

器件型号:TM4C123GH6PM

我使用的是 Tiva C LaunchPad 和 Kentec BoosterPack。  我最初的目标是从2个 ADC 中获取读数、对其进行比较、并在 ADC1>ADC2收到引脚中断时使 LED 闪烁。  我让该代码和电路正常工作。

现在我将继续尝试在每个 ACD 的屏幕上显示值。  我想我一开始很小、只是尝试在电路其余部分正常工作时在 Kentec 屏幕上显示一个图像。  在混乱一段时间后、我终于得到了一个图像在屏幕上弹出、同时程序的所有其他部分正常工作。  但是、我发现我需要使 ADC 采样速率小于2个样本/秒、否则图像将无法正确加载。  当我增加样本/秒时、将加载的图像将更少。

对于真实屏幕、我将会有基本文本、按钮和输入。  但我担心处理器可能无法处理屏幕以及我需要它执行的功能、以便执行控制器的"主"任务。

该处理器是否能够处理小屏幕(可能高达5")以及10个样本/秒的基本电机控制、并以高达120Hz 的频率输出信号?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您是否正在尝试使用每次 ADC 转换更新显示屏? 我怀疑问题不在于进行 ADC 转换的时间、而是在于更新显示屏的时间。 诀窍是在后台更新屏幕。 这可能是一个适用于 RTOS 的好应用程序。 此外、GRLIB (图形驱动程序库)是为实现可移植性和可读性而构建的。 这不是最有效的、尤其是当您只想更新屏幕的一部分时。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在做了一些研究之后、我相信您认为 RTOS 可能是长期发展的正确途径。 但是、我正在尝试开发一个基本的数字电机控制器来替代低端模拟控制器。 它不必是漂亮的或超快的。 只要电机以正确的速度/扭矩运行、简单文本和按钮就会工作。

    此时、我只是在 main 中显示一个图像、就是这样。 我在取样时遇到了这个问题、希望获得一些指导、就像我浪费时间追求这条路线一样。

    最重要的是、我需要在引脚上输出高达1、200 /秒的脉冲、并以适当的速率读取电机反馈、例如10个样本/秒 更新屏幕可能会很慢、可能是每秒1次?

    如果你不得不去棒球场,你会说我可以在80MHz 的频率下跑出去,这样做吗? 或者、您是否肯定会选择基于 RTOS 的系统、甚至不会打扰到非操作系统? 或者、我是否可以使用另一个芯片来处理屏幕、让主处理器担心电机控制?

    谢谢你
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    //
    // 声明头文件
    #include 
    #include 
    include "grlib/grlib.h"
    #include "driverlib/tm4c123gh66.h"
    #include "inc/hw_memmap.h"
    #include "driverlib/gpio.h"
    #include "driverlib/sysctl.h"
    #include "driverlib/interrupt.h"
    #include "driverlib/driverlib#include
    
    "#defintration.h"#include "driverlib.包含"#driverlib#def"#def"driverlib_example.h"#include
    
    
    "driver.h"#include "driverlib#include
    
    
    
    
    
    "#def"#include "driverlib.hr.hr.include #include "#include "#include "#def"
    
    
    
    
    
    
    
    #include "driverlib.hr.dl.hr.hr.dl.include "#include "#include "#include "#include "#include "driverlib"#include "#include "#def"#include "driverlib
    
    //
    // 声明函数
    
    void Sample (void);
    int Control (void);
    int manipulation (void);
    void ZerCrossing (void);
    void Timer0 (void);
    空 ClrScreen (空);
    //*********
    
    //
    // 声明/初始化变量
    uint32_t Theta=0;
    extern const uint8_t g_pui8Image_DSI_logo[];
    tContext sContext;
    tRectangle sRect;
    
    
    //*********
    
    
    int main (void)
    {
    //将系统时钟初始化为50MHz
    SysCtlClockSet (SYSCTL_SYSDIV_4|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHz|SYSCTL_OSC_MAIN);
    
    Kentec320x240x16_SSD2119Init();
    Initialize();//Initialization 例程
    GrContextInit (&sContext、&g_sKentec320x240x16_SSD2119);
    ClrScreen();
    
    GrImageDraw (&sContext、g_pui8Image_DSI_logo、0、0);
    格林图(&S);
    
    
    
    //运行无限循环并让中断完成困难的工作
    while (1)
    {
    }
    }
    
    
    //*********
    //********* 功能声明
    //
    
    
    
    void ClrScreen()
    {
    sRect.i16XMin = 0;
    sRect.i16YMin = 0;
    sRect.i16XMax = 319;
    sRect.i16YMax = 239;
    GroundContForegrSet (&sContext、 ClrBlack);
    GrRectFill (&sContext、&sRect);
    GrFlush (&sContext);
    }
    
    //
    // sample ()函数
    
    #define SYSCYC_DEG 1852 //系统时钟周期数/触发角的度数
    //结果来自:
    //40MHz (系统时钟频率)
    ///------------------
    //[60 (线路频率)*2 (我们只对半个周期感兴趣)*180 (半个周期中的度数)
    //= 1/2线频正弦波中的1851.8个周期/触发角
    
    UINT32_t FireTime=0;
    Int32_t Error=0;
    UINT32_t Reference=0;
    UINT32_t VelocityFB=0;
    
    
    
    
    void Sample (void){
    
    //清除 ADC 中断状态标志
    ADCIntClear (ADC0_BASE、0);
    ADCIntClear (ADC1_BASE、0);
    
    //触发 ADC
    ADCProcessorTrigger (ADC0_BASE、0);
    //SysCtlDelay (3);
    ADCProcessorTrigger (ADC1_base、0);
    //SysCtlDelay (3);
    
    //获取样本并将其放入缓冲区
    ADCSequenceDataGet (ADC0_BASE、0、参考);
    ADCSequenceDataGet (ADC1_base、0、VelocityFB);
    
    //计算误差
    error=(Reference-VelocityFB);
    
    //如果误差大于0,则计算 Theta
    if (Error>0){
    //通过得到%误差并将其乘以180来计算触发时间
    //获得我们需要的触发度数。 然后乘以
    //循环/度数,以获得被输入 Timer0的触发时间。
    //公式看起来很奇怪,因为我们处理整数,所以是除法
    //将导致截断,因此需要最后进行。
    FireTime=(SYSCYC_DEG*(4095-Error)*180)/4095;
    }
    //如果错误小于0,则我们将触发时间设置为333,361,比最大值高1
    //上面的 FireTime 方程式
    其他
    {FireTime=333361;
    
    }
    
    }
    //********
    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果您不更新显示器(开始时除外)、则图像将无法正确加载、这毫无意义。 我建议您配置您的中断例程。 也许他们所花的时间比你预期的要长得多。 在特定例程中将未使用的 GPIO 线路驱动为高电平、然后查看示波器上的信号、应该可以很好地了解在每个例程中花费的相对时间量。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    事实证明、我使用的是 Tiva Workshop 中的一半代码和我自己的一半代码、因此我不会清除 ADC 采样的中断。 这就是导致处理器锁定在对 ADC 进行采样的环路中而不执行任何其他操作的原因。

    解决此问题后、我可以轻松地在屏幕上显示字符。

    感谢您告知我 RTOS 的优势。 最后、我将进行切换、但现在我已使屏幕与主程序一起工作。