1,首先我想问一下那北测信号可以直接加到相应的引脚上吗??
这是端口配置:::
P1DIR &=~BIT1; //p1.1输入
P1SEL|=BIT1; //P1.1 //捕获外部输入
TACCTL0 |=CM_1+CCIS_0+SCS+CAP+CCIE; //上升沿捕获 CCI0A 捕获 使能
TACTL |=TASSEL_1+MC_2+TAIE+TACLR+ID_0;//ACLK 连续增模式 中断请求使能
2. 程序如下 为什么F(频率)总能为0
#include "CAP.h"
uint16_t pulse=0,time=0; //记录捕获到的完整的脉冲的个数
//uint8_t flag=0; //标志位(溢出中断标志,在中断里面置1)/****************************变量定义*********************************/
uint16_t cap_first=0,cap_last=0; //第一个上升沿到来的时间、每一个上升沿发生的时间(不断刷新)
uint16_t Cap_Tar=0; //记录捕获脉冲的个数
float F=0.0;
/***************************************************************************
|* Function : 计算频率
|* Parameters : none
|* Returns : none
|* Description:
***************************************************************************/
void calculate_F(void)
{
;;
}
/********************************************************************
* Function : TACCR0 CCIFG中断服务 记录捕获脉冲的个数Cap_Tar
0-65535
* Parameters : none
* Returns : none/注意修改为A1或A0 0xFFF0 Timer0_A1 CC1, TA0 0xFFF2 Timer0_A0 CC0*
* Description :所有的其它的CCIFG标志都使用中断向量TAIV
*********************************************************************/
#pragma vector=TIMER0_A0_VECTOR__interrupt void Timer_A0(void)
{
if(Cap_Tar==0)
{ //捕获时间阀值内第一个上升沿的TAR
cap_first=TACCR0;
Cap_Tar++;
}
else
{
cap_last=TACCR0;
Cap_Tar++; }
}
/********************************************************************
* Function : TAIFG(CCR0溢出标志) 溢出中断 计算出捕获到的完整的脉冲个数(pulse)=上升沿的个数减1
* Parameters : none
* Returns : none
* Description :TIMER0_A1_VECTOR该中断向量 它包含了TACCR1 CCIFG, TACCR2 CCIFG, and TAIFG flags。
*********************************************************************/
#pragma vector=TIMER0_A1_VECTOR /* 注意修改为A1或A0 0xFFF0 Timer0_A1 CC1, TA0 0xFFF2 Timer0_A0 CC0*/
__interrupt void Timer_A1(void)
{
switch( TAIV ) //定时器A是的多源中断向量
{
case 2: // CCR1 not used
break; case 4: // CCR2 not used
break; case 10: // overflow
{
if(Cap_Tar==0)
pulse=0;
else
{
pulse=Cap_Tar-1;
time=cap_last-cap_first; //脉冲个数的时间
F=(pulse*32768)/time; //计算频率 Cap_Tar=0; //溢出中断后清0
// P1OUT|=~BIT0;
// flag |=TAIFG; //在主函数中用到 // LPM3_EXIT;
} }
break;
}
}
wszqq:
被测信号可以直接连接到单片机引脚。但要注意几个问题
1、被测信号的电压,如果略高于单片机VCC可以通过引脚串联电阻分压方式解决,如果电压和VCC差别大需要有个电平转换电路(放大或缩小)
2、做捕获时,一般在单片机引脚上加上拉或者下拉电阻(根据捕获跳变沿,功耗等方面考虑进行选择)
程序没有仔细看。
wszqq:
回复 wszqq:
1
yffy:
利用施密特触发器将边缘缓慢变化的周期性信号变换为同频率的矩形脉冲,输入单片机时注意不要超过电源电压。
Fuchong Wang:
TACCTL0 |=CM_1+CCIS_0+SCS+CAP+CCIE; //上升沿捕获 CCI0A 捕获 使能TACTL |=TASSEL_1+MC_2+TAIE+TACLR+ID_0;//ACLK 连续增模式 中断请求使能
是不是直接用=比较好?
uint16_t cap_first=0,
之类的是否加上volatile好一点?