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.

[参考译文] MSP430FR2311:FR2311通道转换周期序列不是恒定的

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/649418/msp430fr2311-fr2311-sequence-of-channel-conversion-period-is-not-constant

器件型号:MSP430FR2311

您好、TI 员工

我使用 EXP-MSP430FR2311 launchpad 进行 ADC 实验。  我的代码如下所示:

/*
@由 SS 供电
@Author kissn Liu
@date 2017-12-8
@fution:ADC 多通道样本使用 TA1触发器;
*/
#include "msp430fr2311.h"
/*
A7-ADC_Result [7]
。
。
。
A0-ADC_Resume[0]

*/

void Software_Trim (); //获取最佳 DCOFTRIM 值
#define MCLK_FREQ_MHz 的软件调整8. // MCLK = 8MHz
unsigned char ADC_Result[8]={0};
void init_adc_using_TA1_trigger ()
{
//配置 ADC A0~7引脚
// SYSCFG2 = ADCPCTL0 | ADCPCTL1 | ADCPCTL2 | ADCPCTL3 | ADCPCTL4 | ADCPCTL6 | ADCPCTL5 | ADCPCTL5

//配置 ADC A1引脚
P1SEL0 = 0xFF;
P1SEL1 = 0xFF;

//配置 ADC
//更改 ADCSHTx 位以更改采样时间
ADCCTL0 |= ADCSHT_3 | ADCMSC | ADCON; //
ADCCTL1上的16ADCclks、MSC、ADC |= ADCSHS_0 | ADCSHP | ADCCONSEQ_1 | ADCSSEL_0 | ADCDIV_0; // ADC 时钟 MODCLK、采样计时器、TA1 TRIG、单序列
ADCCTL2 &=~ADCRES; // 8位转换结果
ADCMCTL0 |= ADCINCH_7 | ADCSREF_0; // A0~7 (EOS);Vref=Vcc
ADCIE |= ADCIE0; //启用 ADC 转换完成中断
ADCCTL0 |= ADCENC; // ADC 使能

TB1CCR0 = 33;
//TB1CCR1 = 16;
TB1CCTL0 =(CCIE);//启用 CCIFG
// TB1CCTL1 = OUTMOD_7;//PWM 输出模式:7 -复位/设置
TB1CTL =(TBSSEL_ACLK | MC_UP);

_bis_SR_register (GIE); //输入带中断

的 LPM3 }
void main()
{
WDTCTL = WDTPW | WDTHOLD; //停止 WDT
//禁用 GPIO 上电默认高阻抗模式以激活
//先前配置的端口设置
PM5CTL0 &=~LOCKLPM5;


_bis_SR_register (SCG0); //禁用 FLL
CSCTL3 |= SELREF_REFOCLK; //将 REFO 设置为 FLL 基准源
CSCTL1 = DCOFTRIMEN_1 | DCOFTRIM0 | DCOFTRIM1 | DCORSEL_3;// DCOFTRIM = 3、DCO 范围= 8MHz
CSCTL2 = FLLD_0 + 243; // DCODIV = 8MHz
__delay_cycles (3);
__BIC_SR_register (SCG0); //启用 FLL
Software_Trim (); //软件调整以获得最佳 DCOFTRIM 值


CSCTL4 = SELMS_DCOCLKDIV | SELA_REFOCLK;//将默认 REFO (~32768Hz)设置为 ACLK 源,ACLK = 32768Hz
//将 DCODIV 默认为 MCLK 和 SMCLK 源
init_adc_using_TA1_TRIGGER ();
P2DIR |= BIT0
;while


}{1}

}
// ADC 中断服务例程

#pragma vector=ADC_vector
__interrupt void ADC_ISR (void)
{
static char i = 7;
switch (__even_in_range (ADCIV、ADCIV_ADCIFG)
){
case ADCIV_none:
中断;
ADCIV_ADCOVIFG 案例:
中断;
案例 ADCIV_ADCTOVIFG:
中断;
ADCIV_ADCHIIFG 案例:
中断;
ADCIV_ADCLOIFG 案例:
中断;
ADCIV_ADCINIFG 案例:
中断;
ADCIV_ADCIFG 案例:
/*
当 ADCSC 触发一个序列时、连续的序列可由 ADCSC 位触发。
当使用任何其他触发源时、必须在每个序列之间切换 ADCENC。
!!!ADC12ENC 必须在序列之间切换
*

ADC_RESULSE[i]= ADCMEM0;
if (i ==0)
{
//ADCCTL0 &=~ADCENC;
__no_operation();
I = 7;
__no_operation();
P2OUT ^= BIT0;//用于调试
__no_operation();
//ADCCTL0 |= ADCENC;
}
其他
{
i--;
}


中断;
默认值:
break;
}
#pragma

vector=Timer1_B0_vector
__interrupt void Timer1_A0 (void)
{
ADCCTL0 |= ADCENC | ADCSC;
__NO_OPERATION ();

}

我 使用单序列通道模式对通道 A7至 A0的 ADC 通道进行采样  

每 1ms 在 Timer B ISR 中,软件触发 ADC 转换、并在 ADC ISR 中切换 P2.0。

我在示波器上测量了 P2.0输出,但奇怪的是:

当我将采样保持时间从 ADCSHT_3 设置为  ADCSHT_2或 ADCSHT_1或 ADCSHT_0时

P2.0输出开始 抖动,P2.0输出波的频率变得不正确。这里 是屏幕截图,当您在示波器上看到它时 ,它会 急剧抖动。

将采样保持时间设置回 ADCSHT_3或  ADCSHT_4时、波形变为正常。

为什么呢?  原因是什么、您可以在 FR2311 LaunchPad 上进行此实验以验证我的描述。

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

    乍一看、这看起来像是的变体

    https://e2e.ti.com/support/microcontrollers/msp430/f/166/t/649350

    由于问题是突发内部时序问题、因此使用软件触发并不真正有用。 (我怀疑您看到的抖动是由于计时器 ISR 被 ADC ISR 延迟所致。)

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

    请记住、ADCIFG 在每次 ADC 转换后都会被处理、因此较小的采样保持时间会涉及更快的转换、而 ADC ISR 中的时间会更多、这会干扰 Bruce 提到的定时器 ISR。 如果您更改 DCO 频率并缩短 ADC 中断服务时间(移除 switch 语句和无操作)、您将注意到差异。

    此致、
    Ryan