现在在用430149开发板做一个测量外部方波信号高电平宽度的实验。不知道为什么显示老是不正确。特来请教高手指点。
配置如下:1、430149单片机。
2、选P1.2为功能口,TA1(CCI1A为信号源 输入)
3、开机默认上升沿,同步,捕获,捕捉到上升沿后,再捕捉下降沿,两者的差值便是外部信号高电平宽度。
4、时钟为SMCLK,8分频,连续计数模式,允许溢出中断;
5、信号输入为外部提供的低频方波,高电平宽度,在70MS。
6、为了便于观察,直接接到12864LCD上,显示5位数字。
现在的问题是:我参照标准的流程改动的程序,采集到高电平的脉宽后,送显示总是不正确和我外接的脉冲信号不一致。不知道什么回事,很是上火啊。
下面附上的是主程序部分:
//********************************************************************
//128*64液晶显示
//开发板使用TIMERA进行连续计数模式的实验,
//测量P1.2口,输入的外部方波信号,检测“高电平”宽度,输入为70MS左右。
//捕捉到的高电平的宽度WIDE通过LCD显示出来。
//钟源为XT2CLK 8MHZ设置 1/8 分频后,时钟为 1M,这
//样70ms 的脉宽应该得到 70ms/(1000000)=70000!
//显示前数据除以10后送显示,应该为7000;
//********************************************************************
#include <msp430x14x.h>
#include "Config.h" //开发板配置头文件,主要配置IO端口信息
unsigned int start,end,wide=1000;
unsigned char overflow;
//*************************************************************************
// 主函数
//*************************************************************************
void main(void)
{
WDT_Init(); //看门狗关闭
Clock_Init(); //系统时钟设置MCLK时钟源为XT2CLK;SMCLK时钟源为XT2CLK 均为8MHZ;
Close_LED(); //关闭数码管显示
P1SEL |= BIT2; //;P1.2为功能口,TA1(CCI1A input)
TACTL=TASSEL_2+MC_2+TACLR+TAIE+ID_3;//时钟为SMCLK**,连续计数模式,清楚定时器,允许溢出中断;8分频
CCTL1=CM_1+SCS+CAP+CCIE+CCIS_0; //开机默认上升沿捕捉,同步,捕获,开中断。*CCI1A为信号源*,
LCD_Init(); //lcd初始化
_EINT();//开中断
while(1)
{
HEX_TO_BCD(wide,sjbcd00);
numxs(); //显示wide脉宽值 ,初始值为1000;
delay_ms(100);
}
}
//***********************************************************************
// TIMERA中断服务程序,需要判断中断类型
//***********************************************************************
#pragma vector = TIMERA1_VECTOR//TA捕获中断服务程序
__interrupt void Timer_A(void)
{
switch(TAIV) //需要判断中断的类型
{
case 2://TA1中断 //捕获中断
if (CCTL1&CM_1) //上升沿中断到来
{
start=TAR; //同CCR1;
CCTL1=(CCTL1&(~CM_1))|CM_2; //改为下降沿触发
overflow=0; //溢出计数复位
}
else if (CCTL1&CM_2) //下降沿捕捉
{
end=TAR;//TAR;
CCTL1=(CCTL1&(~CM_2))|CM_1; //改为上升沿触发
wide=overflow*(65535/10)+(end-start)/10;//计算wide脉宽值
HEX_TO_BCD(wide,sjbcd00);//BCD吗转换。
numxs();//显示wide脉宽值
delay_ms(100);//延时100MS
}
break;
case 10:
overflow++; //溢出计数加1;70MS的脉宽一定会溢出的
HEX_TO_BCD(wide,sjbcd00);
numxs();// 保持显示捕捉到的“高电平”宽度,显示wide脉宽值 ,
delay_ms(100);
break;
default:
break;
}
}
系统时钟设置子程序如下:
void Clock_Init()
{
uchar i;
BCSCTL1&=~XT2OFF; //打开XT2振荡器
BCSCTL2|=SELM1+SELS; // MCLK时钟源为XT2CLK;SMCLK时钟源为XT2CLK 均为8MHZ;
do{
IFG1&=~OFIFG; //清楚振荡器错误标志
for(i=0;i<100;i++)
_NOP();
}
while((IFG1&OFIFG)!=0); //如果标志位1,则继续循环等待
IFG1&=~OFIFG;
}
其他的程序都是基本的配置程序不会影响到该程序的调试:
比如:void WDT_Init()
{
WDTCTL = WDTPW + WDTHOLD; //关闭看门狗
}
HEX_TO_BCD(wide,sjbcd00);//转BCD码程序
numxs(); //送显示程序,显示wide脉宽值 ,初始值为1000;
delay_ms(100); //延迟程序,
因为我采集的信号是低频的,高电平在70ms,;
晶振源为XT2CLK 8MHZ设置 1/8 分频后,时钟为 1M,这样70ms 的脉宽应该得到 70ms/(1000000)=70000!
为了便于显示,数据除以10后送显示,应该为7000;即: wide=overflow*(65535/10)+(end-start)/10;//计算wide脉宽值
不知道这样对不对。现在显示老是不稳定。显示经常在12136和17717这两个数字附近显示。
我感觉应该是那里没有设置好。在中断程序中CASE 2的最后加入清零指令后也是一样?(TACTL=TACLR或者overflow=0;)
不知道那位大虾做过类似的,请指点一二。
|