请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号: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 上进行此实验以验证我的描述。

