参照各种官方示例程序之后编写了一段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;
}
}