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.

[参考译文] MSP430F5529:ADC12重复序列问题

Guru**** 2531060 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/799563/msp430f5529-adc12-repeat-sequence-problem

器件型号:MSP430F5529

我正在尝试执行以下操作:

每次从定时器 B CCR1触发时、对9个通道进行采样并停止、在最后一次转换时使用单个中断来收集数据。

我希望这可以自动运行、而无需手动切换任何位。 这是可行的吗?

我初始化如下内容:


//定时器 B:400Hz 和 A/D 触发器
P3DIR |= BIT6;             // P3.6输出引脚43 400Hz
P3SEL |= BIT6;             // P3.6选项选择(TB0.6)
//ccr0设置周期
TBCCR0 = 29999;             // 400Hz @24MHz (半周期、切换)
//ccr1触发 A/D
TBCCR1 = 5;               //只需一个窄脉冲即可触发
TBCCTL1 = OUTMOD_7;           // CCR1复位/设置模式 A/D 触发
P5DIR |= BIT7;P5SEL |= BIT7;      //(调试)输出引脚56 (Disp 引脚6)
//ccr6生成400Hz 输出
TBCCTL6 = OUTMOD_4;           //切换,用于400Hz 输出的引脚43
TBCCR6 = 3000;             //相位偏移(在正弦波峰值处采样)
TBCTL = TBSSEL_2 + MC_1;        // SMCLK、upmode

//ADC12 (tudi za potenciometer)
ADC12CTL0 = ADC12ON;          // ADC12打开
ADC12CTL0 &=~ADC12ENC;
while (ADC12CTL1和 ADC12BUSY);
P6SEL |= BIT4+BIT5+BIT6+BIT7;      // P6 ADC 选项选择
P7SEL |= BIT0+BIT1 + BIT2 + BIT3;      // P7 ADC 选项选择
P5SEL |= BIT0+BIT1;           // P7 ADC 选项选择(封装)
ADC12CTL0 |= ADC12SHT00 + ADC12SHT10;//采样时间、chans 0...7 & 8...15
ADC12CTL0 |= ADC12MSC;
ADC12MCTL0 = ADC12INCH_4;        // ref=Vcc、VSS、通道4
ADC12MCTL1 = ADC12INCH_5;        // ref=Vcc、VSS、通道5
ADC12MCTL2 = ADC12INCH_6;        // ref=Vcc、VSS、通道6
ADC12MCTL3 = ADC12INCH_7;        // ref=Vcc、VSS、通道7
ADC12MCTL4 = ADC12INCH_12;       // ref=Vcc、VSS、CHAN 12.
ADC12MCTL5 = ADC12INCH_13;       // ref=Vcc、VSS、通道13
ADC12MCTL6 = ADC12INCH_14;       // ref=Vcc、VSS、CHAN 14
ADC12MCTL7 = ADC12INCH_15;       // ref=Vcc、VSS、通道15
ADC12MCTL8 = ADC12INCH_8;        // ref=Vcc、VSS、通道8 (密封)
ADC12MCTL9 = ADC12INCH_9 + ADC12EOS; // ref=Vcc、VSS、CHAN 9 (灌电流)、序列结束
ADC12CTL1 = ADC12SHS_3;         // trig =定时器 B CCR1
ADC12CTL1 |= ADC12SHP;         //脉冲模式采样
ADC12CTL1 |= ADC12CSTARTADD_0;     //起始地址
ADC12CTL1 |= ADC12CONSEQ_3;       //重复应答序列
//ADC12CTL1 |= ADC12CONSEQ_1;      //应答序列(切换 ADC12ENC!)
ADC12CTL2 |= ADC12RES_2;        // 12位分辨率
ADC12IE = ADC12IE9;           //在最后一次转换时启用中断
ADC12CTL0 |= ADC12ENC;         //启用转换(必须是最后一次)

现在、中断只会切换引脚、因此我可以看到发生了:

 

#pragma vector = ADC12_vector

_interrupt void ADC12_ISR (void)

开关(ADC12IV)
 {
 情况0:中断;   //向量0:无中断
 情况2:中断;   //矢量2:ADC 溢出
 情况4:中断;   //矢量4:ADC 时序溢出
 情况6:中断;   //向量6:ADC12IFG0
 情况8:中断;   //向量8:ADC12IFG1
 情况10:中断;   //向量10:ADC12IFG2
 情况12:中断;   //向量12:ADC12IFG3
 案例14:中断;   //矢量14:ADC12IFG4
 情况16:中断;   //向量16:ADC12IFG5
 情况18:中断;   //向量18:ADC12IFG6
 情况20:中断;   //向量20:ADC12IFG7
 情况22:中断;   //向量22:ADC12IFG8
 情况24:中断;   //向量24:ADC12IFG9
 情况26:中断;   //向量26:ADC12IFG10
 情况28:中断;   //向量28:ADC12IFG11
 情况30:中断;   //向量30:ADC12IFG12
 情况32:中断;   //向量32:ADC12IFG13
 案例34:中断;   //矢量34:ADC12IFG14
 情况36:中断;   //向量36:ADC12IFG15
 默认值:break;
 }
int a=ADC12MEM9;
P1OUT ^= 0x01;   //切换 P1.0 (调试)

问题是、如果我将 MSC 位置位、ADC 会持续采样、忽略 EOS 位、不等待触发信号。

如果我不设置 MSC 位、ADC 只转换计时器每次触发的一个输入、以便 ADC 中断仅在9个触发后触发。

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

    您好、Marko、

    您可以使用多个采样和转换模式(ADC12MSC = 1)通过通道序列模式(自动扫描模式)实现此功能。 每个触发器将允许对所有9个通道进行采样和转换。 在每个序列之后、您可以使用 DMA 自动切换 ADCENC 位、然后等待下一个触发事件。

    下面显示了2个通道的流程图、供您参考。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢 Wei、Í 将尝试此操作。
    我还没有使用 DMA、因此我必须先学习一点。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您写道
    "您可以使用 DMA 自动切换 ADCENC 位"
    我已经学习了数据表、找不到方法来实现这一点? (DMA 硬件切换 ENC 位)
    现在、我"手动"切换 DMA (或 ADC)中断例程中的 ADC12ENC 位。
    我不是一个大问题、我有足够的时间、采样时序应该可以-我只是想知道是否有一种"完全自动"的 ADC 运行方式。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我认为简短的答案是否定的 (有用于设置控制寄存器的 DMA 技巧、但我不确定 Wei 的工作原理。)

    如果 CONSEQ=0或1且 SHS !=0,则必须在触发器之间切换 ENC。 如果 CONSEQ=2或3、您不必切换 ENC、但如果您使用 MSC=1、它们将不间断运行。 [参考用户指南(SLAU208Q)图28-7、8、9、10]

    如果您不需要在通道之间进行(准)同步采样、CONSEQ=3和 MSC=0的组合不一定很奇怪。 我有一些应用对此无关紧要。 只需将您的计时器触发速率乘以9即可。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    好的、谢谢。 因此、我将在中断上切换 ENC、这实际上并不是太多开销。

    我正在对400Hz 正弦波进行采样并比较通道、因此我希望采样尽可能接近。

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

    "自动切换 ADCENC 位"的意思是 CPU 无需唤醒即可运行切换代码。
    在 ADC 完成序列转换时、DMA0将由 ADC12IFGx 触发。 然后 DMA0将常量值复制到 ADC12CTL0、同时禁用 ADCENC。
    2、DAMP 1由 DMA0触发。 然后、DMA1在 ADCENC 被启用的情况下将一个常量值复制到 ADC12CTL0。

    您可以在初始化 MCU 并让其运行时配置 DMA0&1。 每个 ADC12IFGx 都可以触发上述步骤、以便在每个转换序列后切换 ADCENC、而无需运行任何代码。