[讨论] 请教:430的AD采样控制PWM宽度,进不了中断

78900   2010-7-8 20:04 楼主


大家好,我想输入一个模拟信号,当电压升高,输出的PWM占空比就变大。但是程序进不了中断,请帮忙看看这段程序,谢谢。程序是改别人的,刚开始学,见笑了

#include "msp430x14x.h"
#define uchar unsigned char
#define uint unsigned int
uint Results[32]; //存放ADC的转换结果
long A_verage; //存放32个数据之和
uint A_ve = 0; //存放32个数的平均值

void main( void )
{
WDTCTL = WDTPW + WDTHOLD;
P6DIR = BIT0;
P6SEL |= 0x01; // Ena××e A/D channel A0
ADC12CTL0 = ADC12ON + SHT0_15 + MSC; // Turn on ADC12, set sampling time
ADC12CTL1 = SHP + CONSEQ_2; // Use sampling timer, set mode
ADC12IE = 0x01; // Ena××e ADC12IFG.0
ADC12CTL0 |= ENC; // Ena××e conversions
ADC12CTL0 |= ADC12SC; // Start conversion

TBCTL = TBSSEL_1 + TBCLR + MC0;
TBCCTL1 = OUTMOD_7;
TBCCR0 = 500;
TBCCR1 = 250;
P4DIR = 0X02;
P4SEL = 0X02;

_EINT();
while(1);

}

/*******************************************
函数名称:ADC12ISR
功 能:ADC12的中断服务函数
参 数:无
返回值 :无
********************************************/
#pragma vector=ADC_VECTOR
__interrupt void ADC12ISR (void)
{
static uchar index = 0;

Results[index++] = ADC12MEM0; // Move results, IFG is cleared
if(index == 32)
{
uchar i;

A_verage = 0;
for(i = 0; i < 32; i++)
A_verage += Results;
A_verage >>= 5; //除以32求平均值
if(A_verage > A_ve)
{
if(TBCCR1 < 500) TBCCR1 = TBCCR1 + 10;
else TBCCR1 = 0;
}
else
{
if(TBCCR1 > 10) TBCCR1 = TBCCR1 - 10;
else TBCCR1 = 500;
}
A_ve = A_verage;

index = 0;
}
} 本帖最后由 dontium 于 2015-1-23 13:42 编辑

回复评论 (9)

TBCTL = TBSSEL_1 + TBCLR + MC0;
有问题,计数器没打开,改成TBCTL = TBSSEL_1 + TBCLR + MC1;
再看看
点赞  2010-7-8 20:50
你好,谢谢。计数器好像是打开了的,我用的是增计数模式,照你的改了只是改成了连续计数模式,还是进不了中断。请问其他地方有问题吗?谢谢
点赞  2010-7-8 21:32
#define MC_0 (0*0x10u) /* Timer A mode control: 0 - Stop */
#define MC_1 (1*0x10u) /* Timer A mode control: 1 - Up to CCR0 */
#define MC_2 (2*0x10u) /* Timer A mode control: 2 - Continous up */
#define MC_3 (3*0x10u) /* Timer A mode control: 3 - Up/Down */
这是149的,可你用的是其它的吧。
程序里没有对ADC12MCTL0 进行设置,加一条 ADC12MCTL0 |= INCH_0;
指定通道的
点赞  2010-7-8 21:43
和定时器没关系,是AD初始化的问题。
建议弄个例程先跑一下AD
点赞  2010-7-9 08:52
你好,我用的就是149啊
点赞  2010-7-10 10:13
引用:

和定时器没关系,是AD初始化的问题。
建议弄个例程先跑一下AD
AD我是跑过的,是对的,在以前AD程序上面加的定时器啊。应该不是AD的问题吧
点赞  2010-7-10 10:15
引用:

AD我是跑过的,是对的,在以前AD程序上面加的定时器啊。应该不是AD的问题吧
请问你觉得AD哪里有问题呢?我再多看几遍,或许真的有问题呢
点赞  2010-7-10 10:18
确实没有问题,以上程序能正常运行啊,能够正常进入中断,只是如果不改成
TBCTL = TBSSEL_1 + TBCLR + MC_1;
TBR就一直是0,没打开,判断条件一直是错误的,当然中断函数的返回值就一直是错误的
如果确实不能进中断,那就看看是不是硬件上有问题了!
点赞  2010-7-10 15:30
引用:

确实没有问题,以上程序能正常运行啊,能够正常进入中断,只是如果不改成
TBCTL = TBSSEL_1 + TBCLR + MC_1;
TBR就一直...
大哥,真的诶,我也能进了,哈哈,谢谢大哥,谢谢各位朋友!
点赞  2010-7-10 16:43
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复