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.

[参考译文] MSP430FR5994:ADC12_B 在自动扫描/重复自动扫描模式下运行

Guru**** 2552440 points
Other Parts Discussed in Thread: MSP430FR5994, ENERGYTRACE

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/590533/msp430fr5994-adc12_b-operation-in-autoscan-repeated-autoscan-mode

器件型号:MSP430FR5994
主题中讨论的其他器件: ENERGYTRACE

大家好、  

我无法理解 MSP430FR5994中 ADC12_B 的行为。  

我已经设置了两个通道 MCTL0和1、并且在 MCTL1上设置 EOS/使能的中断。  因此、我希望该中断每隔一个 ADC 触发就会发生一次。  

我已将计时器 B 设置为8Hz 时的触发器、并将其配置为切换引脚输出。  

我还切换了 ADC ISR 中的另一个引脚、这种切换频率为2Hz、而不是预期的4Hz。  

我想我会误解一些东西。 在自动扫描中、 我尝试切换、然后重置并忽略 ENC 位、似乎没有任何变化。  

我还尝试了重复自动扫描。 仍然是一样的。 接下来的描述我认为这个模式将允许连续读取通道,0然后读取1 (使用 ISR()),然后读取0再读取1…… 而无需触摸 ENC。  

--

我使用了1秒的 Energytrace、如下所示。 它显示 ADC 导通时间为0.25s、在8hz 时等于2个读数。 然后关闭0.25s、再打开...  似乎解释了为什么速率降低2倍、 但为什么在序列完成后存在此差距?

此外、为什么 ADC/MODOSC/SMCLK 在整个0.25个周期内处于打开状态? 对于自动扫描/重复自动扫描、外观相同。 我是否无法正确配置它? 或者可能是调试器的影响?
代码的主要部分如下所示。  如果有任何帮助或建议、我们将不胜感激!
谢谢、
Michael。
/*
* main 函数
*/
int main (void)
{

WDTCTL = WDTPW | WDTHOLD; //停止看门狗计时器
init_gpio();
init_Clock();
init_Timer_TB0 ();
init_adc_aderent_autoscan();

while (1)
{
//scope_blue_low;
_bis_SR_register (LPM3_bits | GIE);//输入 LPM3、带中断
__no_operation(); //对于调试器
}
}

//ADC 设置
void Init_adc_ere重复_autoscan()
{
/*设置 ADC 引脚*/
P3SEL0 |= ADC_A15_PIN;
P3SEL1 |= ADC_A15_PIN;

/*
* MSC=0:上升沿触发每个 S&C
*采样时间、S&H=4、ADC12打开
*
ADC12CTL0 = ADC12SHT0_0 | ADC12ON;

/*重复自动扫描
*使用 TB0.0进行触发
* SAMPCON 源自采样定时器。
* ADC12SSELx:0 = MODOSC 是时钟源
*
ADC12CTL1 = ADC12SHP | ADC12SH_2 | ADC12CONSEQ_3;

/*
* ADC12CTL2设置位深度、diff、lpmode
* ADC12CTL3设置内部 ADC 通道
*现在保留默认值。
*

/*
* A15 ADC 输入选择。
* Vref+= AVCC、Vref-= AVSS
* ADC12EOS:序列结束
*@TODO -如果在重复自动扫描中未设置 EOS、会发生什么情况? 可以持续那么长的时间
*当您在被覆盖之前获得 memx 结果时? (IFG 仍然可以触发一个读取)
*
ADC12MCTL0 = ADC12INCH_15;//通道:ADC12INCH_15
ADC12MCTL1 = ADC12INCH_15 | ADC12EOS;//通道:ADC12INCH_15

/*
*中断
*
ADC12IER0 |= ADC12IE1;//在 IFG1上启用 ADC 中断

ADC12CTL0 |= ADC12ENC; //启用转换
}

...

ADC ISR()的//位
案例 ADC12IV_ADC12IFG1://向量14:ADC12MEM1
IF (ADC12MEM1 >= APP_LIGHT_THRESHOLD) 高于环境温度水平。
{
P1OUT |= BIT0; // P1.0 = 1
}
其他
{
P1OUT &=~BIT0; // P1.0 = 0
}
// ADC12CTL0 &=~ADC12ENC;
//ADC12CTL0 ^= ADC12ENC;
示波器_PURP_TOG;
//ADC12CTL0 |= ADC12ENC;
_BIC_SR_REGISTER_ON_EXIT (LPM3_BITS);
中断; 

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

    自动扫描模式流程图:

    电源 我认为"等待启用"中的"ADC12ENC 1"可能是一个拼写错误。 可能应该是'!=',就像其他流程图一样

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Michael、
    您可以在 ADC 初始化中尝试设置 ADC12MSC =1吗? 我想这就是您看到您正在观察的操作的原因。

    此外、您是否在代码中的任何其他位置切换 ADC12ENC?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Michael、
    我重新阅读您的帖子、并意识到我的答案没有帮助。

    如何设置 Timer_B? 它是否处于切换模式?
    您还有其他任何 ISR、尤其是 TimerB 吗?
    如果是、它们的内容是什么?

    您能否在线路进入 LPM3之前尝试设置 ADC12ENC?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Cameron、

    谢谢、yep MSC=0、所以我可以使用计时器 B 触发、ENC 不会在其他任何地方切换。

    我将在 ADC 初始化结束时、即 LPM3之前设置 ENC。

    定时器输出处于切换模式'outmod_4'、这是否是问题?  我曾认为这只是引脚输出。  

    void Init_Timer_TB0 ()
    {
    TB0CCTL0 = OUTMOD_4;
    
    TB0CCR0 = APP_TrigFreq_COUNTER[counter_index];
    
    TB0CTL = TBSSEL_ACLK | MC__UP;//ACLK=32768、UP 模式
    
    。} 


    此致、
    Michael

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

    啊、好的、我看到您在 while 环路中的意思。 我已将计时器更改为设置/复位模式、并在进入 LPM3之前将'Set ENC'移动到。 现在读数正确,谢谢!!

    我在设置中添加了"CS_TurnOffSMCLK ();"、但注意到 ADC 和 MODOSC 在 ADC 触发器之间仍然保持开启状态。 有没有办法解决这个问题? 我想以一定的速率触发 ADC、在中间休眠、直到它填满32个结果、然后执行中断或 DMA 传输。  

    我注意到、它提到了自动扫描模式(图28-9)中有关必须在序列之间切换 ENC 以实现最低功耗的内容(否则仍会请求时钟...)。 在重复自动扫描模式下没有提到这一点、我希望 ADC 在该模式下睡眠?
    谢谢、
    Michael。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Michael、
    关于 Timer B、TB0CL0设置为什么? 您是否观察到8Hz 或4Hz 的上升沿?
    您使用 TB0.0可能是您的问题的一部分、也可能是您看到4Hz 运行的原因。 基本上、它只在 TB0CL0计数时切换、所以每2个周期只会有一个上升沿。 为了解决这个问题、使用一个不同的 TB0.x 并将它的 TB0CLx 设置为半个 TB0CL0。 TB0.1和 UP 可被设置为在 TB0CL0上和它们自己的 TB0CLx 上改变。 请参阅图20-12以了解我的意思、并选择可满足您需求的输出模式。 或者、您可以将 TB0.0的频率加倍。

    MODOSC 和 ADC 将保持有效、直到对 ADC 的需求结束。 我认为您之所以保持此状态是因为您处于 MEM0和 MEM1之间的状态(我需要对此进行测试)。 我看到您对两个样本使用相同的输入通道、这只是为了测试、还是这是您的最终设计? 如果是单次转换、则可能更好。

    至于 ENC、我相信当您处于"等待触发"状态时、仍会请求时钟。 这就是为什么 MODOSC 和 ADC 保持开启状态的原因。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Michael、

    您能否使用添加的代码行发布新能量跟踪的屏幕截图?

    下面是我认为正在发生的情况(关于第一个 Energytrace 屏幕截图)的图、(我尚未在硬件上确认)。 我认为您的 TB0只有一个上升沿@4Hz、并且您在"等待触发"状态下介于 MEM0和 MEM1采样之间的时间。 阴影部分是实际用于转换的17个时钟周期。

    根据您的应用、最好使用单通道单次转换、每次使用 DMA 传输、同时切换 ENC 以释放 ADC 资源。

     

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

    谢谢。 我在下面显示了能量迹线。 我还放置了一个逻辑分析仪屏幕、其中显示了计时器输出(映射到引脚)和 SR 位(映射到 PJ.x)。 tmrB 上的上升沿现在为8Hz、 但 ADC 是重复自动定序、因此它以 一半的触发速率(2个通道)完成并生成中断。  

    它与您的图表一致、需要阅读、但在完成之前一直保持到下一个阅读。 (MSC=0)。


    我们拥有非常严格的功率预算、并寻找一种方法来避免 CPU 或 DMA 在每次采样时唤醒。 在该方案中、最好使用所有 MEM 寄存器、即使它们都是相同的通道(我们的应用是两个通道、因此触发器可能需要是2xF)。  一直在寻找一种具有小型缓冲器的"智能 ADC"、而 MSP430FR 似乎可以做到这一点。 遗憾的是、当我看到 MSP430有一个32结果缓冲器时、我认为这是 ADC 的一个很好的功能。 您能不能想象一下、可以对其进行配置、以便定时器可以触发采样、直至32个结果填满、而不存在任何 DMA 或 CPU 连接、并且 ADC 会在采样之间自动断电?  如果没有它、32结果缓冲器将不会用于我们的应用。

    我还有另一篇文章、在这种情况下、我试图找出最低的 DMA 唤醒能量。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Michael、
    听起来最好是单通道模式、并且可以为中断提供服务、也可以为每个采样使用 DMA。 我会尝试这些方法并比较功耗、它们可能适合您的预算。

    我将把您的反馈意见提交给我们的内部团队。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢 Cameron。