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.

[参考译文] TM4C123GE6PM:由计时器触发的 ADC

Guru**** 2477065 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/686552/tm4c123ge6pm-adc-triggered-by-timer

器件型号:TM4C123GE6PM

你(们)好  

我想使用 Tiva TM4C123G launchpad 的 ADC 模块制作一个简单的程序。 其思路是将计时器配置为在特定时间段内中断(我希望以350kHz 的频率运行计时器)、并触发转换。 我已经制作了代码、但 ADC 配置肯定有问题。 这不n´t 我进行多个转换。

欢迎提出任何建议

代码如下:

#include 
#include 
#include "inc/tm4c123ghp6.h"
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "driverlib/sysctl.h"
#include "driverlib/interrupt.h"
#include "driverlib/gpio.h"
#include "driverlib/timer.tidr.h";include
"integr.idr.idr"t.idr.idr.idr.idr.idr"





(intr.h)#include "int1 intru.int_inu.h)
uint32_t ui32Period;

SysCtlClockSet (SYSCTL_SYSDIV_2_5 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHz);
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOF);
GPIOPinTypeGPIOOutput (GPIO_PORTF_BASE、GPIO_PIN_1_GPIO_PIN_2|GPIO_PIN_3);


SysCtlPeripheralEnable (SYSCTL_Periph_Timer1);
TimerConfigure (Timer1_base、timer_CFG_PERIODICRACRACASE);
ui32Period =(SysCtlClockGet ()/350000)/2;
TimerLoadSet (Timer1_base、timer_A、ui32Period -1);
TimerControlTrigger (Timer1_base、timer_A、true);

//**** ADC 配置******** //

SysCtlPeripheralEnable (SYSCTL_Periph_ADC0);
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOE);
GPIOPinTypeADC (GPIO_Porte _BASE、GPIO_PIN_3);

//选择序列发生器3 (FIFO 深度1)

ADCSequenceDisable (ADC0_BASE、3);
ADCSequenceConfigure (ADC0_BASE、3、ADC_TRIGGER_TIMER、0);

//仅一步配置:

ADCSequenceStepConfigure (ADC0_BASE、3、0、ADC_CTL_CH0 | ADC_CTL_IE | ADC_CTL_END);
ADCSequenceEnable (ADC0_BASE、3);

//ADCIntClear (ADC0_BASE、3);

//中断使能

IntEnable (INT_TIMER1A);
TimerIntEnable (Timer1_base、timer_TINA_TIMEOUT);
IntMasterEnable();
ADCIntEnable (ADC0_BASE、3);
IntEnable (INT_ADC0SS3);
TimerEnable (Timer1_base、timer_A);


while (1)
{
}
}



空 Timer1IntHandler (空)
{
//清除计时器中断
TimerIntClear (Timer1_base、timer_TINA_TIMEOUT);
ADCIntClear (ADC0_BASE、3);
ADCSequenceDataGet (ADC0_BASE、3、muestra);

}


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

    [引用 user="Israel Redo"> ADC 配置中必须存在错误。 这n´t 允许我进行多次转换。[/QUERP]

    相信以下各项需要(您)进一步审查:

    • TimerConfigure (Timer1_base、timer_CFG_PERIODICRACRACASE);  这是否更合适?   Timer_CFG_A_PERIODICRACRAC周期-半宽周期计时器
    • DRL 用户指南建议: "定时器模块在被配置前被禁用并且保持在禁用状态。"   您要么"违反了"、要么依赖"默认行为"-这两种行为都不理想。
    • 您不会详细描述" 您为什么认为、"只发生一次转换。"   在您的350kHz 中断速率下-数据被"机器设定"为" muestra[]"-并且可能不会及时"读取/处理"。
    • 您已为 提供,"ADCIntEnable (ADC0_BASE,3)"...  然而、ADC 中断 是"未发现任何情况"。   这是必需的...

    我想建议您将数据速率降低到一个舒适的"人类可读度量"(可能每秒一次)、以便更好地了解您的" 单读"的现实情况。

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

    如果您使用计时器触发 ADC、实际上应该调用的是 ADC 中断例程。 一段时间后、我做了一个计时器中断生成 ADC 转换的示例、该转换使用 UDMA 将转换放入缓冲区。 我随函附上了 CCS 项目、希望它能有所帮助。/cfs-file/__key/communityserver-discussions-components-files/908/8154.ADCwDMA.zip

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Bob、您是关于 ADC 中断的、我非常欣赏该示例、实际上我想制作一个简单的示例来读取 ADC、然后转到 UDMA 传输、因为我不是很了解它的工作原理。 但该示例使其变得非常简单。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 CB1_MOBILE

    首先、非常感谢您的建议。 我已经检查并修复了您提到的每个要点。 现在、它正在工作(我认为) ADC 中断中存在的主要问题(rookie 错误)、我设置了一个断点来观察变量并正确更新该值。

    但是、由于我需要达到350kHz、我正在切换一个引脚以在示波器中测量该引脚以进行测试、因此出现了两个问题

    a:当我进行调试时、频率下降至~10Hz、这也许是正常现象、我认为 CCS 的刷新间隔以毫秒为单位、会产生影响。 当我停止调试会话时、频率为"正常"、转至(b)。

    b.频率变为388kHz 而不是350kHz、可能是我无法正确切换引脚?

    这是包含更改的代码

    uint32_t muestra [1];

    void ADC0IntHandler (void);

    void main (void)

    uint32_t ui32Period;

    SysCtlPeripheralReset (SYSCTL_Periph_ADC0);
    SysCtlPeripheralReset (SYSCTL_Periph_Timer1);

    SysCtlClockSet (SYSCTL_SYSDIV_2_5 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN |
    SYSCTL_XTAL_16MHz);

    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOF);
    GPIOPinTypeGPIOOutput (GPIO_PORTF_BASE、GPIO_PIN_1_GPIO_PIN_2|GPIO_PIN_3);
    SysCtlPeripheralEnable (SYSCTL_Periph_Timer1);

    //***定时器初始化***

    TimerConfigure (Timer1_base、timer_CFG_A_PERIODICRACRACASE);
    ui32Period =(SysCtlClockGet ()/350000)/2;
    TimerLoadSet (Timer1_base、timer_A、ui32Period -1);
    TimerEnable (Timer1_base、timer_A);
    TimerControlTrigger (Timer1_base、timer_A、true);

    //*** ADC 初始化***

    SysCtlPeripheralEnable (SYSCTL_Periph_ADC0);//启用 ADC 模块0的时钟
    SysCtlDelay (10);
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOE);
    GPIOPinTypeADC (GPIO_Porte _BASE、GPIO_PIN_3);// AIN0

    IntDisable (INT_ADC0SS3);
    ADCIntDisable (ADC0_BASE、3);
    ADCSequenceDisable (ADC0_BASE、3);

    ADCSequenceConfigure (ADC0_BASE、3、ADC_TRIGGER_TIMER、0);

    ADCSequenceStepConfigure (ADC0_BASE、3、0、ADC_CTL_CH0 | ADC_CTL_IE |
    ADC_CTL_END);

    ADCSequenceEnable (ADC0_BASE、3);
    ADCIntClear (ADC0_BASE、3);
    ADCIntEnable (ADC0_BASE、3);
    IntEnable (INT_ADC0SS3);

    IntMasterEnable();//启用处理器中断

    while (1)




    void ADC0IntHandler (void){

    //清除中断状态标志。
    ADCIntClear (ADC0_BASE、3);

    ADCSequenceDataGet (ADC0_BASE、3、muestra);

    IF (GPIOPinRead (GPIO_PORTF_BASE、GPIO_PIN_1))

    GPIOPinWrite (GPIO_PORTF_BASE、GPIO_PIN_1、0);

    其他

    GPIOPinWrite (GPIO_PORTF_BASE、GPIO_PIN_1、2);

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

    大家好、谢谢。

    [引用用户="Israel Reboldo"]频率变为388kHz 而不是350kHz,可能是我没有正确切换引脚? [/报价]

    这既是一个有价值的观察结果、也是一个奇怪的观察结果!   当您"施加一个切换功能"时-预计这样会"增加执行时间"-从而"降低" 您的频率-而不是"增加"频率-您 不同意吗?   您是否可能"已撤销报告结果"以及"添加 GPIO 切换"确实已产生(更低)频率?   更快的"GPIO 切换"方法是使用"X-OR"系列运算符...

    除此之外、计时器的时钟源(对我而言)未指定。   我通常避免使用内部(不是特别精确)振荡器。  (喜欢营销"过度推广!")   该频率差异约为11%-您必须检查(如果您使用内部振荡器)以查看该11%是否在"范围内"。

    我今天早上已经做了牙科手术(不是我通常做的那样-更少的是复制)-但是你注意到,“SysClock 被350K 除-然后(再次)被2除。   也许-由于毒品影响-我发现"二分法"嫌疑人...   (这意味着您的频率应更高!)

    您的示波器最近是否已经过校准-正如我在这里所写的(经常)-您是否移除了示波器的接地探头-以便能够实现适当的 HF 测量(减去过冲和下冲)?  (您将一根很短的导线连接到探头接地的"套管"上-这大大减少了此类过冲/下冲。)

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

    我也不会在写入前读取端口、而是保持一个简单的标志。  或者更好地在开始时设置为高电平、在结束时设置为低电平、这样可以进行多次测量

    • 中断之间的时间
    • 中断所花费的时间
    • 已使用%CPU (从前两个计算得出)
    • 频率和处理时间方面的抖动

    使用可以在脉宽上触发的示波器、您还可以查找缺少的样本。

    除以2对我来说也是可疑的、我不记得计时器中有两个预分频因子。

    Robert

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

    返回主器件-我们已"发出了"-返回五个中的两个(霜冻爪)!

    我将向您授予三个(NEAT)积分-但"X-OR"切换-当然-执行速度更快... (如果这是一个目标-否则-您的4个"功能检测"解释了为什么(您)收到(正确)大降压...

    请注意,您的“冻结的 tundra”产生了... 77°F (最佳度数)-然后... 31°F -第二天(非常)。 很难找到(任何人),没有生病。 哦,加拿大——确实!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    同意 CB1_MOBILE、这些是总冲压线。 我执行了您的建议、频率现在没有问题。 除以2也是错误的、我将该除法从工作簿的示例中删除、需要获得50%的中断。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我将检查时钟源指令、尽管我在电路板示例中没有看到它、这就是我依赖内部振荡器的原因。 非常感谢!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果您使用"内部"振荡器-认识到"精度"可能"在(接受)市场营销的眼中"更重要"-而不是"寻求精确度"的客户-用户...