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.
您好、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 延迟所致。)