TI中文支持网
TI专业的中文技术问题搜集分享网站

MSP430F5529 ADC12代码疑问

参照各种官方示例程序之后编写了一段ADC12的转换程序。程序实现的功能是:通过I/O端口P6.6获取输入模拟信号,通过TA0获取取样频率10µs/sample,并触发ADC转换。时钟源取SMCLK,用DCO配置0.7MHz,采用Up-Mode和Repeat single-channel conversion,中断时将ADC12MEM0的值存入ADC_Results[index]。

为了验证程序是否正确运行,用了示例程序里的HAL_Dogs102x6.h(为了显示在LCD屏上)和HAL_Board.h(为了点亮或熄灭LED灯),但没法运行。所以问题就是:

1. ADC12这部分是不是能实现10µs/sample的功能

2.如何验证此程序按预期正确运行了

主程序附件添加了

麻烦各位了,我找不出程序的错又没有办法验证它是否正确运行

Shi JianHua:

首先,你要有一个好用的仿真器,就是大家说的fet,其次要熟悉iar,或者ccs。

接下来就可以使用一下方法确认你的程序是否正确执行

1:使用仿真功能,单步执行,完全可以看到程序执行的过程。

2;断点测试,在你要看结果的地方加断点,程序执行到这个地方会停止,你可以用各种仪表测试状态

3;先把程序运行起来,看到现象,也就是程序不光是对错,可以执行,然后再加入你的方法,先加载最前端,然后一点一点的往后加,就可以看到你要的结果了

Triton Zhang:

1. 在你贴出的代码中我没找到你用于显示的代码。

2. 附件中的代码的原意是用TA0定时器产生一个周期性的定时器,并在定时器中断中触发ADC采样。TA0的周期定位10us,这样就可以实现楼主想要的10us/sample.

3. 附件中的源码没看到TA0中断的处理, 而在源码的MAIN函数中    用这句话来触发的ADC采样。ADC12CTL0 |= ADC12SC; 

 你不能把例程代码乱凑一起就成为自己的代码。先要理解流程,然后在整理程序结构,最后变成代码。建议你先画流程图,先把CPU处理流程搞清楚,然后在写代码。代码是最简单的事,关键是你要搞清楚程序的流程,这个比编程重要100倍。 

Haiqi Bian:

回复 Triton Zhang:

请教:我现在的基本思路是:1.先初始化各种引脚,P6.6用来获取输入信号;2.为了得到想要的10µs/sample也就是100KHz,先初始化时钟,选择SMCLK= DCO = 0.7MHz;3.接着是初始化ADC12,设置引脚P6.6来得到信号输入,设置成Repeat single-channel模式,转换值存放地址,时钟源SMCLK,以及参考电压和输入端口INCH;4.最后初始化Timer_A,选择时钟源SMCLK,计数模式Up-Mode,和TA0周期值。5.最后的最后,在Timer_A中断函数中,开始ADC12采样和转换。

这个思路可执行不?

Triton Zhang:

回复 Haiqi Bian:

1. 这样做的风险在于TIMER中断响应时间+ADC的采样时间有可能会大于10us.MSP430的中断系统不支持优先级别高的中断打断低优先级级别的中断,所以你必须确保TA的中断能及时响应。

2. 你可以直接设置ADC的触发源来之TA0-OUT0或TA0-OUT1,这样可以避免中断造成的延时。

Haiqi Bian:

回复 Triton Zhang:

所以我设置了ADC12CTL1 SHSx = 1,也就是TA0.1。然后我逐步运行了程序发现进不了Timer的中断,我给你看看代码,原因出在哪里呀?

void Timer_Initial(void){
volatile unsigned int  i;
    TA0CTL = TASSEL_2 + MC_1; // Choose SMCLK, Up-Mode
    TA0CCR1 = 6;                              // 0.7MHz/100KHz – 1 = 6
    TA0CCTL1 = CAP + CCIE + CCIFG + OUTMOD_3; // Set/reset
    for(i = 0; i < 0x30; i++);
    TA0CTL |= TACLR + TAIE;         // Enable interrupt, Clear TAR

    __enable_interrupt();
}

#pragma vector = TIMER0_A1_VECTOR
__interrupt void TIMER0_A1_ISR(void)
{
  switch(__even_in_range(TA0IV,10))
  {
    case  2 :      // TACCR1 CCIFG
         ADC12_Initial(); break;                            // Initial ADC12
    case  4 :      // TACCR2 CCIFG
         P1OUT ^= 0x02;break;
    case 10 :     // TAIFG
         P1OUT ^= 0x01;break;
   }
}

赞(0)
未经允许不得转载:TI中文支持网 » MSP430F5529 ADC12代码疑问
分享到: 更多 (0)