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.

[参考译文] CCS/MSP-EXP430FR2433:Driverlib ADC 通道和#39;指定的存储器缓冲器和#39;

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/872885/ccs-msp-exp430fr2433-driverlib-adc-channel-specified-memory-buffer

器件型号:MSP-EXP430FR2433

工具/软件:Code Composer Studio

您好!

我尝试使用 Launchpad 套件通过 driverlib 读取多个通道(适用于 MSP430FR2xx_4xx 器件的 MSP430 DriverLib)

我已经使用 ADC12成功读取了不同 Launchpad 上的多个通道。

使用 ADC 12、我能够根据使用代码的 configureMemory 和 getResult 函数将我的 ADC 值存储在指定的存储器缓冲区中

ADC12_B_configureMemParam memParam1 ={0};
memParam1.memoryBufferControlIndex = ADC12_B_MEMORY_0; //第一个内存插槽
memParam1.inputSourceSelect = ADC12_B_INPUT_A9; //输入引脚传感器1
memParam1.refVoltageSourceSelect = ADC12_B_VREFPS_AVCC_VREFNEG_VSS; //默认值
memParam1.endOfSequence = ADC12_B_NOTENDOSEQUENCE; //继续采样
memParam1.windowComparatorSelect = ADC12_B_Window_Comparator_disable;//默认
memParam1.differialModeSelect = ADC12_B_different_mode_disable;//默认
ADC12_B_configureMemory (ADC12_B_B_base、&memParam1); //加载设置 

其中 ADC12_B_MEMORY_0保存了我的 ADC 值、可以通过读取

L1 = ADC12_B_getResults (ADC12_B_B_base、ADC12_B_MEMORY_0); 

我可以非常轻松地将不同的输入应用于不同的存储器位置、以便读取多个通道。

现在、区别/问题在于:ADC10显然不支持此存储器功能、因为 ADC10的函数 getResults 和 configureMemory 不接受存储器位置(对于 getResults、只要求基址、而对于配置存储器、则没有 memoryBufferControlIndex 设置)。

现在、代码看起来像这样、我想通过 UART 连接发送数据:

ADC_startConversion (ADC_base、 //开始 ADC 转换
ADC_RELEASE_SEQOFCHANNELS); //多个连续读取,直至发出 disable 命令

while (1){
L1 = ADC_getResults (ADC_base);// Lsensor 1
L2 = ADC_getResults (ADC_base);// Lsensor 2.
P1 = ADC_getResults (ADC_base);//传感器1

if (L1 >= 0x001){ 传感器的//阈值
transmiteUSCI_UART16 (L1|0x1000); //为传感器1添加代号1,发送值
} 

之前在 ADC12上、我可以指定我要在 L1、L2和 P1变量中放入哪个值、它效果很好。
现在、在 ADC10上、我通过 UART 获得了一些结果、但我无法确定我实际发送的 ADC 结果、我无法保证它是否是预期的 ADC 结果。

我找到的唯一示例代码是基于中断或针对单个读取的。 我想在环路中手动读取 ADC 传感器值、并通过 UART 输出传感器值。

Driverlib 还在 getResult 函数下"

参数
baseAddress 是 ADC 模块的基地址。
返回
指定存储器缓冲区内容的有符号整数。

"

那么、我的问题是:我的 ADC 值存储在哪里? 这种"指定的存储器缓冲器"在哪里? 我阅读了一些有关 DTC 的内容来从 INCH 寄存器移动存储器、但 driverlib 显然不知道有关 DTC 或 INCH 寄存器的任何信息。

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

    FR2/4系列 ADC 只有一个结果缓冲器+控制(ADCMEM0/MCTL0)。 对于多个通道、它从(向下)到 A0进行采样、与 ADC10类似。 没有 DMA 或 DTC、因此您必须在样本出现时抓取它们。 如果 MSC=1、这可能是一个挑战。 每通道 VREF 设置也很复杂。

    我对多个通道使用的策略是设置 MSC=0、并为触发器留出空间、以便在它们之间留出程序时间来获取结果。

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

    感谢您的回复!

    因此、每次我使用命令"adc_getResults (adc_base)"读取 ADC 时、我都会得到 ADC 通道 A3的结果、 当我再次使用该命令时、它是 A2到 A1 (最低设置的 ADC 通道)的结果 、并且在每次重复命令后再次以 A3 (最高设置的通道)开头?

    VREF 不应成为问题、因为我要为每个通道使用相同的电压基准。 我假设这是默认值。

     也许是一个简单的问题;MSC 代表什么? 我在数据表中没有看到此类缩写。

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

    您目前正在使用重复序列模式(CONSEQ=3)、在上下文中、您可能使用 MSC=1、因此 ADC 正在以最快的速度执行扫描。 对于单个 MEM 寄存器、您在任何给定的时间都不知道结果在其中。 (有线索、但有太多比赛无法可靠地使用。)

    您将需要一个锁步机制(针对每个通道以电路图方式触发/等待/获取)。 有不同的策略、但您不能仅仅让它运行并按照 ADC12的方式在闲暇时挑选结果。

    《FR2/4用户指南》(SLAU445I)第21.2.7.5节介绍了 ADCMSC。 它通常会导致 ADC 在转换完成后(根据上下文)继续工作、而不是等待另一个触发信号。 Driverlib 将其称为 ADC_MULTIPLESAMPLESENABLE。

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

    考虑到我的系统的目标、我希望系统在没有触发的情况下将 ADC 数据流式传输到 PC、这只是最近数据的连续流。 PC 程序不关心 ADC 的确切值、但它会关心该值是否超过特定阈值。 因此、精度和精确时序并不是太重要。

    我想、通过以最快的速度连续运行 ADC、只要我知道正在读取哪个通道、我就会从传感器获得通过 UART 流式传输到我的 PC 的最新值、而不会出现太多问题。 现在、我看到它在这个 ADC 上并不像这样真正起作用。

    您是否建议使用"adc_configureMemory"();"要在 A3上开始采样、请使用单个采样、并且每次完成单次转换并发出中断、我都应该触发下一次转换并等待下一次 ADC 完成中断、该值将为 A2并重复、直到达到 A0? 这是否适用于我的预期用例?

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

    要保留高级结构、您可能需要维护"影子"MEM 寄存器数组。 连续运行 ADC (CONSEQ=3)、但使用离散触发器(MSC=0)、并具有一个 ADC ISR、该 ISR 会将 MEM0值提取到后台的数组中。 main()可以在选择时从数组中提取值,  

    示例 ADC10_10说明了该原理。 ADC_Results[]数组用作影子 MEM 数组。 (我看不到等效的 Driverlib 示例。):

    http://dev.ti.com/tirex/explore/node?node=ADbtMIec3YLSRwlYtORsMw__IOGqZri__LATEST

    此版本的 ADC10_10使用一个定时器触发器(SHS=2)。 您可以使用软件触发器(SHS=0)并在 ISR 中设置 ADCSC 来触发下一个转换;这将快速运行、但您可能会发现它消耗您的 CPU 预算。  

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

    感谢您帮助我了解 ADC:)

    "这个版本的 ADC10_10使用一个定时器触发器(SHS=2)。 您可以使用软件触发器(SHS=0)并在 ISR 中设置 ADCSC 来触发下一个转换;这将快速运行、但您可能会发现它消耗您的 CPU 预算。 "

    这是我将尝试在系统中实现的目标。 幸运的是、MCU 不必执行大量操作、只需将 ADC 数据传递到 UART、因此我希望它能够正常工作。 如果我能使它正常工作、我会回来的。

    更新:


    影子存储器技巧起作用了! 它需要在时钟分频器和周期保持中进行一些修整和"延迟"。 将所有内容设置为最快的设置会给我带来太多的中断。ISR 中的某些递归命令作为触发器运行得非常好。

    很显然、我从一开始就已经设置了 MSC=0、CONSEQ=3和 SHS=0、我唯一真正错过的是我的程序的 ISR 和周期/保持代码(还有一个小错误、其中 eUSCI 的 SMCLK 不是1MHz 而是1.048MHz、给了我奇怪的打包丢失。)

    再次感谢!

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

    您好、M Spit、

    我现在要关闭此帖子。

    如果您有任何疑问、请直接回复重新打开帖子。

    谢谢、