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.

[参考译文] MSP430FR2355:如何从 TB1.1触发 ADC12采样序列

Guru**** 2550820 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/849957/msp430fr2355-how-to-trigger-adc12-sampling-sequence-from-tb1-1

器件型号:MSP430FR2355

你(们)好

我正在尝试弄清楚如何使用 Timer1 (TB1.1)来触发3个连续模拟通道(A0-A3)的采样和转换。

如数据表的表6-22所示、选择 ADCSHSx=0x2应触发采样序列。

但是、当查看 SLAU445i 第21.2.7.2节的图21-13 (通道序列、12位)时、流程图中没有用于触发序列的 TB1.1信号、而应翻转一些 SW 位以启动新序列。 (根据图表、您需要 ADCENC 上的上升沿才能启动新序列!!!)

1) 1)是否详细说明了 TB1.1如何触发一个序列。

2) 2)是否有一个 SW 代码示例、展示了如何在不需要翻转中断例程内的 SW 位的情况下从 TB1.1触发新序列?

此致

Ofer Zilberberg

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

    1) 1)图21-13中的关键字是"Trigger"。 这就是 SHS (本例中为 TB1.1)。

    2) 2)否 如果不在每次突发时切换 ENC、就无法在 SHS > 0的情况下使用 CONSEQ=1。 如果您不需要突发行为(信号不相关、因此不需要准同步采样)、您可以使用 CONSEQ=3、MSC=0并将您的定时器频率乘以4。 实际上、您需要突发内部间隔来留出时间从 MEM0中提取样本。

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

    尊敬的 Bruce

    感谢您的重播。

    我仍然对 TB1.1用于触发的确切方式感到困惑。

    1) 1)在回答1时-从 SLAU445i 的图21-10到21-17中看、TB1.1如何参与"触发"、不会对 TB1.1如何参与触发进行编辑。 您能对它进行详细说明吗?

    2) 2)对于您回答#2 -您是否意味着在使用 CONSEQ=3且 MSC=0时 TB1.1对触发有任何影响? 它是否会触发每个单独的转换?
       再说一次、我不清楚 TB1.1是如何涉及的。 您能解释一下吗?因为我在网上找不到任何解释吗?

    此致

    Ofer Zilberberg

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

    1) TB1.1提供了一个波形(OUTMOD)、其中信号的上升沿是触发器-它在 UG 图中用作 SHI。 21-6. (如果 SHP=0、ADC 使用 TB1.1=SHI 波形的下降沿来停止采样/保持阶段、而不是使用 SHT,参考图21-5。)

    OUTMOD=7或=3通常是一个不错的选择。 (我更喜欢=7、因为在计时器周期开始时触发有助于我保持直视。)

    2)是的、MSC=0时、每个触发器进行一次转换-因此需要增加您的定时器频率、以便在预期周期内获得所有样本。 但是 CONSEQ=3会使您脱离 ENC 切换业务。  

    正如我提到过的、您需要提前了解如何在下一个样本到达之前从 MEM0提取每个样本。 (只有一个 MEM 寄存器、无 DMA。) MSC=0也可以帮助解决这一问题。

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

    你好 Bruce

    非常感谢您的帮助、它正在开始工作、但我没有从 ADC 获得~200KSPS。 相反、顺序转换之间的距离为~30us。

    我使用24MHz SCLK 并为以下项启动 TB1:

    TB1CCR0 = 3600-1;// CCR0将包含 PWM 周期,定义 TB 的最大计数值。

    TB1CCTL1 = CLLD1 | OUTMOD_7;// TBxCLn 在 TBxR 计数为0时加载(向上计数或连续模式)。 当 TBxR 计数到 TBxCL0或0时 TBxCLn 载入(上数/下数模式)。
    //、CCR1设置/复位(CCR0=set CCR1=reset)
    TB1CCR1 = 24;// CCR1 ADC 开始转换和 PWM 占空比
    TB1CCTL2 = CLLD1 | OUTMOD_7;// CCR2复位/置位(CCR2=复位 CCR0=置位)
    TB1CCR2 = 700;// CCR2 PWM 占空比
    TB1CTL = TBSSEL_SMCLK | MC__UP | TBCLR | TBIE;// SMCLK、向上计数模式、清除 TBR、添加| TBIE 以启用定时器中断。 请注意、高位为0表示"无组"和16位操作。

    注意:TB1.1中断仅用于 DAC 输出更新、不属于 ADC 操作的一部分。

    对于 ADC init:(exuse me for the large amount of comment - I am a 初学者)。

    ADCCTL0 = 0;//禁用 ADC 转换以启用寄存器更改。
    ADCCTL0 |= ADCSHT_0 | ADCMSC | ADCON;// ADC 采样保持时间= 1 x 4倍 ADCclk、启用 ADC 多采样转换、ADC 开启
    ADCCTL1 = ADCSHS_2 | ADCSHP | ADCDIV_5 | ADCCONSEQ_1;// 在 TB1.1上使用非反相 TB1.1进行采样,对于 MCLK = 24MHz,使用 ADCDIV_5 (ADCclk = SMclk/6);对于单个通道,启用 ADCclk <=4.10MHz。
    ADCCTL2 = ADCRES_2;// 12位转换结果
    ADCMCTL0 = ADCINCH_2 | ADCSREF_1;//内部 Vref 2.5V、A2处的启动序列(低至 A0)

    ADCIE |=ADCIE0;//为“转换结束”启用中断请求

    //配置引用
    PMMCTL0_H = PMMPW_H;//解锁 PMM 寄存器
    PMMCTL2 |= INTREFEN | REFVSEL_2;//启用内部2.5V 基准
    _DELAY_CYCLES (400);//基准趋稳延迟
    ADCbuffull = 0;//将"ADC buffer full"标志初始化为空(用于临时 ADC 缓冲区)
    ADCCTL0 |= ADCENC;//启用 ADC 转换

    为了获得 ADC 结果、我使用了一个临时的3字数组(ADC_Result) 、因此在 ADCIFG (ADC 中断)内部、我有代码:

    ADCIV_ADCIFG 案例:
    ADC_Result [(ADCMCTL0和0xF)]= ADCMEM0;// A0读取 ADC_Reseol[0]、A1读取 ADC_Reseol[1]、A2读取 ADC_Reseol[2]
    //注意 ADC 的实际"通道选择位"用作临时缓冲区存储的索引。
    // ADC_Result [(ADCMCTL0 & 0xF)]|=((ADCMCTL0 & 0xF)<<12);//在 MSB 添加通道编号的选项。

    if ((ADCMCTL0 & 0xF)= 0)//序列中的最后一个 ADC 通道被采样

    ADCbuffull = 1;//将"ADC buffer full"标志的指示更改为 FULL。
    ADCCTL0 &=~ADCENC;//禁用 ADC 转换
    ADCCTL0 |= ADCENC;   //启用 ADC 转换。

    P6OUT ^= BIT6;//使用异或切换 P6.6

    ADCIFG = 0;//清除中断标志
    中断;

    除了2个问题外、这种方法效果良好:

    1) 1)由于我在每个 ADC 中断中切换一个位、因此我已将序列转换时间设为~30us、即每秒33K 个样本-非常低。
    我能做些什么、为什么它是触觉。

    2) 2)我的 ADC_Result [2]= 0始终。 表示 A2转换出现了躯体错误。 请注意、我可以看到 P6.6的3个切换、这表示 ADC 转换了 A2、A1、A0。

    您能想到对我的2个问题的回答。

    提前感谢。

    Ofer Zilberberg

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

    2) 2)对于 CONSEQ=1、INCH 在转换完成后立即更新、因此它反映了要转换的下一个通道。 必然结果:当序列完成时、INCH 保持为0、因此 INCH==0的读数是不明确的。 如果 CONSEQ=1、最好使用全局计数器变量。

    1) 1)在 SMCLK=24MHz 和 CCR0=3600的情况下、您将请求24000000/3600=6666触发器/秒 每个触发器提供3个样本、因此采样率为20KSPS。

    当 ADCSSEL=0且 ADCDIV=5时、ADC 时钟为3800000/6=633333Hz。 [根据数据表假设 MODOSC 为3.8MHz (SLASEC4B)表5-9]

    SHT=0时、每次转换需要4+14+1=19个 ADC 时钟[参考 UG (SLAU445I)图21-13]。 因此、您的突发采样率为6333/19=3333333SPS、这大约是您要测量的结果。

    您可以通过降低 ADCDIV 来缩短每次转换的时间。 您的吞吐量当前受触发周期(CCR0)的限制。

    [编辑:更正了拼写错误。]

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

    你好 Bruce

    再次感谢您的提示重播。

    至于问题1 -我发现我忘记在 ADCCTL1寄存器中添加 ADCSSEL_2设置。

    现在、我在样本之间得到~5uS、这是可以的。

    至于问题2 -您答对了、在软件处理 ADC 中断时、通道计数器已更新并将指向下一个通道、因此我假定我不会读取 A2、A1、A0 -我将全部进行一次移位。

    因此、在每个序列中、我将有3个读数 A1、A0、A2 (所有3个通道仅按序列移位)。

    为了了解所发生的情况、我在 P6.6上添加了不同的 gelling (3个短脉冲表示 A2、2个短脉冲表示 A1、1个短脉冲表示 A0)。

    随 convenience.e2e.ti.com/.../ADCIFG.c 的代码附上了查找文件 ADCIFG.c

    我已在 TB1中断例程(文件 TB1IFG.c)上添加了针对长脉冲的额外切换:

    e2e.ti.com/.../TB1_5F00_IFG.c

    此外,我已将 cC0计时器更改为800,因为我已解决了#1问题:)。

    我假定在示波器上可以看到:(其中上部黄色迹线是 P2.0 (TB1.1)输出、下部绿色迹线是 P6.6):

    但我很惊讶地发现、我很少看到这张照片(使用范围拍摄多个快照)、在大多数时间我都得到了:

    表示通道 A2缺少样本。

    我不知道发生了什么-你能帮忙吗?

    此致

    Ofer Zilberberg

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

    很抱歉、最后您将重新设置 INCH 我必须一直在考虑其他一些芯片。

    我所看到的内容:

    1) 1)如果转换需要5 μ s、这就是您需要选择 MEM0的时间。 这大约是5*24=120个 CPU 时钟。 听起来似乎很多、但运行速度很快、我想说您的 ISR 有点重。

    这就构成了一场比赛。 您的 ISR 可以在没有事件的情况下及时地向前漂移(您可以在示波器跟踪中看到这一点)、直到它超限。

    2) 2)当 inch=0时执行 ENC 切换、这是在通道0的转换期间(标称值)。 根据上面(1)中的比赛的运行方式、这可能是转换期间的实际情况、也可能不是。 UG 第21.2.7.6节使这种声音良好、但我不确定是否要按。

    3) 3)您是否正在使用 LPM? 当您突破极限时、唤醒时间会有所不同。

    ----

    如果我要做取证、我会深入研究汇编代码、看看会发生什么情况。 由于您仍在开发中、我会说"修复:避免"。 即以下内容的一些子集:

    a)测量 ADC ISR 所需的时间、例如在进入和退出时摆动 GPIO。 由于您使用的是 P6.6上的^=、因此您可能能够从中获得三倍的占空比。

    b)减轻 ADC ISR 的负担

    c)当 inch=2时、执行 ENC 切换

    d)稍微降低 ADC 转换的速度(加上一些工程利润)。

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

    更新了

    我已经知道、与 ADC 转换序列的时间相比、执行 ADC 中断所需的时间可能存在问题。

    我通过扩大采样时间来减慢转换序列时间(使用 ADCCTL0 |= ADCSHT_1 | ADCMSC | ADCON;而不是 ADCCTL0 |= ADCSHT_0 | ADCMSC | ADCON;)。

    我还完全消除了 TB1中断、仅使 ADC 中断运行。

    现在、我获得稳定的3个连续读数、但顺序不正确:

    很明显、通道 A0被转换2次。

    如果没有同步,该怎么办? (我已尝试使用相同的结果来扩大采样时间)。

    提前感谢

    Ofer Zilberberg

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

    您的 ADC ISR 实际需要多长时间?

    当 inch=0时、您是否仍然切换 ENC?

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

    你好 Bruce

    感谢您的快速回答-这有助于解决问题。

     

    1) 1)我已根据 您的建议使用全局计数器进行通道计数。

    2)显然、X=inchx 不是按照流程图的建议执行的、而是在翻转 EMC 位后执行的、因此我在 3次转换后放置了另一个中断(使用 CCR2)来处理翻转、而只在 ADCISC 中存储 MEM0数据。

     

    我在样本之间达到5uS (从 TB1.1到第一个 ADCINT 为7uS、之后为5uS)。

     

    感谢您的耐心和深刻理解,请您参与:)  。

     

    此致

    Ofer Zilberberg