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:定时器 A 不触发 ADC12

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/604697/msp430f5529-timer-a-not-triggering-adc12

器件型号:MSP430F5529

我目前正在尝试使用 MSP430F5529读取模拟值并将其填充到数组中。 我已将 MSP430配置为从 TimerA0开始采样转换、如数据表中所示、但目前没有从 ADC 获得任何响应。 请参阅下面的代码。 如果对我配置错误的内容提出任何建议、我们将不胜感激

#include 


static void setup_adc ();
void setup_TimerA0 (void);
void setClocks ();
void SetVcoreUp (unsigned int level);


#define Num_Of_Results 2000
volatile unsigned int results[Num_Of_Results]; //存储500个字,或在100ksps 的1kHz 正弦最佳采样下,
//5个数据周期的值
unsigned char 索引= 0;



void main (void){
WDTCTL = WDTPW | WDTHOLD; //停止看门狗计时器


setClocks(); //将 ACLK 设置为 REF0 = 32.768kHz、将 MCLK 和 SMCLK 设置为 DCO = 20MHz
Setup_TimerA0();
setup_adc ();



infinite_loop:
{
_bis_SR_register (GIE); // LPM0,启用全局中断
__no_operation(); //对于调试器
}


转至 infinite_loop;
}


//函数//


// Timer1中断服务例程
#if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)
#pragma vector=Timer1_A0_vector
__interrupt void Timer1_A0_Compiler (void)
#Elif define ISR (__GISR_INCE_1
)(void 1)(nvoid Timer1_A0

)(void Timer1)(void Timer1)(nif_interrupt 1)(void 1)(nu_interrupt 1)
#endif
{
P1OUT ^= 0x01; //切换 P1.0
TA1CCR0 += 50000; //将偏移添加到 CCR0
}



// ADC 中断
#if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)
#pragma vector=ADC12_vector
__interrupt void ADC12ISR (void)
#Elif defined (__GIC_)
void __attribute__((void)(void ADC12_vector (void) ADC12ISR (void)#error

!ADC12vector (void)不支持 ADC12!
#endif
{
结果[索引]= ADC12MEM0; //移动结果
索引++; //将结果索引递增,取模;在此处设置 Breakpoint1


if (索引== 2000)
索引= 0;


ADC12IFG = 0x0000;
}






静态空 setup_ADC (void){


// DAC 缓冲器(OPA735)的输出阻抗为125欧姆,因此从用户指南的第28.2.5.3节
* t_SAMP >(125+1800)*2^13*25p + 800n 或 t_SAMP > 1.234us。 MCLK/4周期为200ns
、*所以所需的采样周期为7个时钟(?)
*


ADC12CTL0 = ADC12SHT0_1 | ADC12ENC | ADC12ON; //采样计时器为8个时钟、启用转换、打开 ADC12
ADC12CTL1 = ADC12SSEL_2 | ADC12DIV_3 | ADC12SH_1 | ADC12SHP; //选择 MCLK (20MHz)作为参考时钟
//将时钟除以4。 新时钟变为 MCLK/4 = 5MHz
//SHI 源是计时器 A CCR1
//SAMPCON 由采样定时器提供(8个时钟)


P6SEL |= 0x01; // P6.0 ADC 通道 A0选择
ADC12IE = 0x01; //启用 ADC 中断
}



void setClocks(void){

void SetVcoreUp (unsigned int level);


//将 Vcore 设置增加到3级以支持 fsystem=20MHz
//注意:一次改变一个电平内核电压。
SetVcoreUp (0x01);
SetVcoreUp (0x02);
SetVcoreUp (0x03);


UCSCTL3 = SELREF_2; //设置 DCO FLL 基准= REFO
UCSCTL4 |= SE拉美 经济体系2; //设置 ACLK = REFO


_bis_SR_register (SCG0); //禁用 FLL 控制环路
UCSCTL0 = 0x0000; //设置可能的最低 DCOx、MODx
UCSCTL1 = DCORSEL_5; //选择 DCO 范围20MHz 操作
UCSCTL2 = 610; //将 DCO 乘法器设置为20MHz
//(N + 1)* FLLRef = Fdco
//(610 + 1)* 32768 = 20MHz
_BIC_SR_register (SCG0); //启用 FLL 控制环路


// DCO 范围位已经存在时、DCO 的最坏情况稳定时间
//已更改 n x 32 x 32 x f_MCLK / f_FLL_reference。 请参阅5xx 中的 UCS 一章
// UG 进行优化。
// 32 x 32 x 25 MHz/32、768Hz ~ 780k MCLK 周期、DCO 才能稳定
_DELAY_CYCLES (625000);


//循环直到 XT1、XT2和 DCO 稳定-在这种情况下、只有 DCO 必须稳定
操作
{
UCSCTL7 &=~(XT2OFFG + XT1LFOFFG + DCOFFG);
//清除 XT2、XT1、DCO 故障标志
SFRIFG1 &=~OFIFG; //清除故障标志
} while (SFRIFG1&OFIFG); //测试振荡器故障标志
}


void SetVcoreUp (无符号整型)
{
//打开 PMM 寄存器进行写入
PMMCTL0_H = PMMPW_H;
//设置 SVS/SVM 高侧新电平
SVSMHCTL = SVSHE + SVSHRVL0 *电平+ SVMHE + SVSMHRRL0 *电平;
//将 SVM 低电平设置为新电平
SVSMLCTL = SVSLE + SVMLE + SVSMLRRL0 *电平;
//等待 SVM 稳定
时间((((PMMIFG & SVSMLDLYIFG)=0);
//清除已设置的标志
PMMIFG &=~(SVMLVLRIFG + SVMLMRYIFG)

= 0;//将 PMMCL0设置为新电平
//如果
((PMMIFG & SVMLIFG))、则等待达到新的电平
while (((PMMIFG & SVMLVLRIFG)=0);
//将 SVS/SVM 低电平设置为新的电平
SVSMLCTL = SVSLE + SVSLRVL0 *电平+ SVMLE + SVSMLRRL0 *电平;
//锁定 PMM 寄存器以进行写入访问
PMMCTL0_H = 0x00;
}


void (timerA0)
TA0CTL = tassel_2 + MC_1; // SMCLK、向上计数模式、清零 TAR
TA0CCR0 = 200-1; //200时钟@5MHz = 100ksps
TA0CCTL1 = OUTMOD_3; //set、在 TA1上复位
TA0CCR1 = 99; ADC 的//触发


//代码检查 GPIO 上的采样 PW 周期
P1SEL |= BIT2; // P1.2选项选择
P1DIR |= BIT2; // P1.2输出
} 

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

    代码不起作用的主要原因是您初始化 ADC 的顺序。 如果您查看器件用户指南 www.ti.com/.../slau208 第28.2.1节12位 ADC 内核、您会看到它显示"除了少数例外、ADC12_A 控制位只能在 ADCENC = 0时修改。" 在寄存器部分 ADC12CTL1寄存器图28-14中、您将看到大多数位被阴影并标记为"只有当 ADC12ENC = 0时才能修改"。 现在、ADC12CTL1设置不会发生、因为在它前面的行上、当您初始化 ADC12CTL0时、您会设置 ADC12ENC。 因此、您只需从初始化中删除 ADC12ENC 的设置、并仅在 ADC 设置例程的末尾进行设置。 请注意、在当前设置中、只会发生1个采样-如果您要重复采样由计时器触发的同一通道、则还需要在 ADC12CTL1寄存器中设置 ADC12CONSEQ_2。

    这里有一些很好的 MSP430F5529 ADC 代码示例: dev.ti.com/.../
    此外、您可能更喜欢 driverlib 提供的 API: dev.ti.com/.../

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

    Katie、

    它总是有一些微小的细节、不是吗? 这解决了问题。 谢谢!