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.

[参考译文] MSP430FR5949:ADC/TA0触发器/重复通道序列模块

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/848933/msp430fr5949-adc-ta0-triggers-repeat-sequence-of-channels-mod

器件型号:MSP430FR5949

大家好:

我想实现一个功能:定时器触发 ADC 模块来执行重复通道序列模式。 但是、现在的问题是序列采样间隔是定时器周期或 ADC 采样转换间隔、下面是我的软件配置和功能图

void ADC_init (void)

P1SEL1 |=(BIT2+BIT3);
P1SEL0 |=(BIT2+BIT3);//BIT1+

P3SEL1 |=(BIT0+BIT1 +BIT2 + BIT3);
P3SEL0 |=(BIT0+BIT1 +BIT2 + BIT3);

while (REFCTL0和 REFGENBUSY);
REFCTL0 |= REFVSEL_2 | REFON;
//while (REFCTL0和 REFGENRDY);//基准电压输出已准备就绪、可供使用

ADC12CTL0 &=~ADC12ENC;
ADC12CTL0 |= ADC12ON|ADC12MSC;//

ADC12CTL1 = ADC12SHP| ADC12SH_1 |ADC12CONSEQ_3;//
ADC12CTL2 |= ADC12PWRMD;//ADC12RES_2 |;// 12位转换结果

ADC12CTL3 &=~ADC12TCMAP;
ADC12CTL0 |= ADC12SHT0_0;
ADC12MCTL0 = ADC12VRSEL_1+ADC12INCH_3;电场 μ s
ADC12MCTL1 = ADC12VRSEL_1+ADC12INCH_13;小通道电流 μ s
ADC12MCTL2 = ADC12VRSEL_1+ADC12INCH_14+ADC12EOS;大通道电流 μ s
ADC12IER0 = 0x04;//启用 ADC12IFG.3
ADC12CTL0 |= ADC12ENC |ADC12SC;//;//启动采样和转换

//配置 Timer0_A3以定期触发 ADC12
TA0CCR0 = TIME_1ms;// PWM 周期
TA0CCTL1 = OUTMOD_3;//CCIE;//|// TACCR1设置/复位
TA0CCR1 = TIME_1ms;// TACCR1 PWM 占空比
TA0CTL = tassel__ACLK | MC__UP;//|TAIE;// ACLK、向上计数模式// ACLK、向上计数模式

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

    使用 CONSEQ=1和 MSC=1。

    在 ISR 中、您需要切换 ENC (低电平、然后高电平)、否则 ADC 将停止。 [参考用户指南(SLAU367o)、图34-9.]

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢,我会尝试。如果我想使用 DMA,如何通过 MCU 切换编码?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您可能希望在 DMA 完成 ISR 中执行此操作。 (定时器 ISR 太早、ADC ISR 被认为与 DMA 不起作用。)

    这意味着每个 DMA 序列只能执行一个 ADC 突发、但我认为由于 DMASA 和 DMADA 一起重新设置、因此仍然很困难。

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

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

    大家好、

    我在没有 DMA 的情况下实现了以前的要求。

    我尝试使用 dma.TA0 CCR1触发器 ADC12、TA0 CCR0触发器 DMA0。我可以控制 CCR1和 CCR0.in 之间的间隔、但实际上、它不起作用。

    void ADC_init (void)

    P1SEL1 |=(BIT2+BIT3);//参考电压和电池电压
    P1SEL0 |=(BIT2+BIT3);//

    P3SEL1 |=(BIT0+BIT1 +BIT2 + BIT3);//电流通道2电流通道1电场采样温度采样 μ s
    P3SEL0 |=(BIT0+BIT1 +BIT2 + BIT3);

    while (REFCTL0和 REFGENBUSY);
    REFCTL0 |= REFVSEL_2 | REFON;//先开启基准电压
    //while (REFCTL0和 REFGENRDY);//基准电压输出已准备就绪、可供使用

    ADC12CTL0 &=~ADC12ENC;
    ADC12CTL0 |= ADC12ON|ADC12MSC;//

    ADC12CTL1 = ADC12SHP|ADC12SH_1 |ADC12CONSEQ_1;//
    ADC12CTL2 |= ADC12PWRMD;//ADC12RES_2 |;// 12位转换结果

    ADC12CTL0 |= ADC12SHT0_1;
    ADC12MCTL0 = ADC12VRSEL_1+ADC12INCH_3;电场 μ s
    ADC12MCTL1 = ADC12VRSEL_1+ADC12INCH_13;小通道电流 μ s
    ADC12MCTL2 = ADC12VRSEL_1+ADC12INCH_14+ADC12EOS;大通道电流 μ s
    //ADC12IER0 = 0x04;
    //adc_all ();//adc_ui ();//
    ADC12CTL0 |= ADC12ENC;//|ADC12SC;//;//启动采样和转换
    //adc_stop ();
    DMAInit1();
    //配置 Timer0_A3以定期触发 ADC12
    TA0CCR0 = TIME_1ms;//TIME_1ms;// PWM 周期
    TA0CCR1 = TIME_1ms/2;//TIME_1ms;// TACCR1 PWM 占空比
    TA0CCTL1 = OUTMOD_7;//CCIE;//|// TACCR1设置/复位
    TA0CTL = tassel__ACLK | MC__UP;//|TAIE;// ACLK、向上计数模式//  


    空 DMAInit1()

    //ADC12IER0=0;
    DMACTL0 = DMA0TSEL_1;//DMA0TSEL_2:TA0CCR2 CCIFG |DMA1TSEL_26:ADC12转换结束

    DMA0CTL = DMADD_1| DMADSTINCR_3 | DMASRCINCR_3;//目标地址增加目标地址递增来源地址不变
    DMA0SZ = 3;//LF_NUM;//(VRECORD1_FLASH_ADDR-RECORD1_FLASH_ADDR)* 2总长度
    __data16_write_addr ((unsigned short)&DMA0SA、(unsigned long)&ADC12MEM0);//电流采样转换结果存储区
    __data16_write_addr ((unsigned short)&DMA0DA、(unsigned long)&results);//目标地址

    DMA0CTL |=DMAEN+DMAIE;//

    #pragma vector=dma_vector
    _interrupt void DMA_ISR (void)

      LPM3_EXIT;
      ADC12CTL0 &=~ ADC12ENC;
      ADC12CTL0 |= ADC12ENC;

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

    它以什么方式不起作用? 它不会传输数据? 或程序锁定?

    我很确定您需要在 ISR 中清除 DMAIFG、要么使用"&="、要么读取 DMAIV。 这里的症状是程序锁定。

    通常、我会看到 ADC [参考数据表(SLAS590N)表6-10的 DMA0TSEL_24。]  我认为 、OUTMOD=7的 DMA0TSEL_1将同时触发 DMA 和 ADC、因此您可能会得到半个完成的结果。

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

    我最初的想法是定时器会自动触发 ADC 来执行序列采样、ADC 采样会触发 DMA、20个序列采样会完成来产生 DMA 中断。目前、我的 MCU 想法是不可实现的、所以我放弃了实际的 DMA。

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

    是的,除了20个序列之外,你可以执行所有这些操作--你希望 SA 为每个序列重新启动,但 DA 不会启动,并且(浏览所有图表)我看不到任何这样做的模式。

    我很确定、如果您使用 DMADD=5、您可以安排只设置一次、让 DMA 自行重复、但每个序列仍会收到一个中断。

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

    大家好、Bruce

    我有疑问。

    '当 CONSEQx={1、3}时、序列中最后一个 ADC12MEMx 的 ADC12IFG 标志可以触发一个 DMA 传输。 任何 ADC12IFG 标志

    当 DMA 控制器访问相应的 ADC12MEMx 时自动清零。" [参考用户指南(SLAU367o) 11.2.11]

    实际上、序列采样中的每个 ADC12IFGx 都会触发一 个 DMA 传输、而不是最后一个 ADC12IFG 触发一个 DMA 传输。

    为什么?

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

    我的记忆有点模糊。 您到底观察到什么? 您是否获得了该序列中3个转换中每个转换的完整块(3个样本)?

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

    我有这个想法有两个原因:

    (1) DMA0CTL = DMADD_4| DMADSTINCR_3 | DMASRCINCR_3;

    重复单次传输。虽然只产生一个 DMA 中断、但 DMA 仍会在三次内被触发、我认为是这样

    (2)使用带有 DMA 的 ADC 时,功耗甚至大于不带 DMA 的 ADC 时的功耗。

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

    我不知道答案。 在单次传输的情况下、触发(电平)不会由 DMA 传输更改(清除)、直到您结束 但是、由于电平与边沿之间的关系、这只是一个半理论。

    UG 句读起来有点奇怪、因为它意味着一个基于 CONSEQ 设置的不同 ADC12<->DMA Verilog-level 互连。 如果您想向作者推荐一些内容、UG 页面底部有一个"文档反馈"链接。

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

    谢谢!我会再试一次。