佚名通过本文主要向大家介绍了msp430多路数据采集,msp430捕获,msp430定时器捕获,12864液晶屏msp430,msp430系列等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题:MSP430 多路捕获问题……
描述:
主函数代码:
描述:
MSP430捕获函数代码定时器
我编了一个MSP430f169 捕获8路PWM波信号的程序。分别用定时器B的所有捕获比较寄存器以及定时器A的一个捕获比较寄存器进行捕获。结果只有TBCCR0和TBCCR1捕获的两路信号是对的,其他几路都不对。实在找不出哪出问题了,各位前辈帮我看一下。下面是代码。主函数代码:
/*********************************************************
程序功能:分别检测加速度计模块从P4.0到P4.6端口输入的PWM波
信号的T1和T2(T1为高电平脉宽,T2为周期),并将数
据通过串口发送到PC(理想PWM波周期1600us情况下)
-----------------------------------------------------------
通信格式:N.8.1, 9600
-----------------------------------------------------------
**********************************************************/
#include<MSP430f169.h>
#include "UART0_Func.c"
#include "function.c"
//#define M1 16
//unsigned int cap1=0,cap2=0,N1=0,N2=0;
unsigned int cap[8]={0,0,0,0,0,0,0,0};//存放捕获是6路信号各自的上升沿时计数器的数值
unsigned int n[8]={0,0,0,0,0,0,0,0};//存放计数溢出的次数
long widthT01[16]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
long widthT02[16]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};//存放每路信号的高点平宽度和周期信息
long widthT03[16]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
long widthT04[16]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
long widthT11[16]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
long widthT12[16]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
long widthT13[16]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
long widthT14[16]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
long widthT21[16]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
long widthT22[16]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
long widthT23[16]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
long widthT24[16]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
long widthT31[16]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
long widthT32[16]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
long widthT33[16]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
long widthT34[16]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
//char m=0,n=0,a=0,b=0;
char m[16]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};//用于记录每路数据已经采集了的个数,每路信号采集M1个数,
long XT1[4]={0,0,0,0};//存放8路信号取平均后的值。
long XT2[4]={0,0,0,0};
long YT1[4]={0,0,0,0};
long YT2[4]={0,0,0,0};
unsigned char data_T[34];//存放将要发送的数据
void main( void )
{
char k1;
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;//关闭看门狗
//-------开晶振XT2---------
BCSCTL1&=~XT2OFF; //打开XT2振荡器
do
{
IFG1 &= ~OFIFG; // 清除振荡器失效标志
for (int i=256;i>0;i--); // 延时,等待XT2起振
}
while ((IFG1 & OFIFG) != 0); // 判断XT2是否起振 */
IFG1&=~OFIFG;
BCSCTL2=SELM1+SELS+DIVS0+DIVS1;//SMCLK=XT2,8分频
P4SEL|=BIT0+BIT1+BIT2+BIT3+BIT4+BIT5+BIT6;////P4.0和P4.1作为捕获模块功能输入端输入方波
//TBCCTL0=0;//捕获源为P4.0,即CCI0A(也是CCI0B)
P1DIR = BIT0+BIT4; //设置P1.0方向为输出
P1SEL = BIT2; //设置P1.2端口为功能模块使用
TACTL = TACLR+TASSEL_2+TAIE+MC1;
//==定时器A时钟信号选择SMCLK,8分频,同时设置定时器A计数模式为连续增计模式==
TACCTL1|=CM_1+SCS+CAP+CCIE; //MC0
//输入上升沿捕获,CCI0A为捕获信号源
TBCCTL0|=CM_1+SCS+CAP+CCIE;//上升沿捕获,同步捕获,工作在捕获模式+中断允许
TBCCTL1|=CM_1+SCS+CAP+CCIE;//上升沿捕获,同步捕获,工作在捕获模式+中断允许
TBCCTL2|=CM_1+SCS+CAP+CCIE;//上升沿捕获,同步捕获,工作在捕获模式+中断允许
TBCCTL3|=CM_1+SCS+CAP+CCIE;//上升沿捕获,同步捕获,工作在捕获模式+中断允许
TBCCTL4|=CM_1+SCS+CAP+CCIE;//上升沿捕获,同步捕获,工作在捕获模式+中断允许
TBCCTL5|=CM_1+SCS+CAP+CCIE;//上升沿捕获,同步捕获,工作在捕获模式+中断允许
TBCCTL6|=CM_1+SCS+CAP+CCIE;//上升沿捕获,同步捕获,工作在捕获模式+中断允许
TBCTL|=TBSSEL_2+MC_2+TBIE;//选择SMCLK+连续计数模式
//+终端允许
InitUART();//初始化UART端口
_EINT();//中断允许
while(1)
{
for(k1=0;k1<M1;k1++)
{
XT1[0]+=widthT01[k1];
XT2[0]+=widthT02[k1];
YT1[0]+=widthT03[k1];
YT2[0]+=widthT04[k1];
XT1[1]+=widthT11[k1];
XT2[1]+=widthT12[k1];
YT1[1]+=widthT13[k1];
YT2[1]+=widthT14[k1];
XT1[2]+=widthT21[k1];
XT2[2]+=widthT22[k1];
YT1[2]+=widthT23[k1];
YT2[2]+=widthT24[k1];
XT1[3]+=widthT31[k1];
XT2[3]+=widthT32[k1];
YT1[3]+=widthT33[k1];
YT2[3]+=widthT34[k1];
}
XT1[0]>>= 4;
XT2[0]>>= 4;
YT1[0]>>= 4;
YT2[0]>>= 4;
XT1[1]>>= 4;
XT2[1]>>= 4;
YT1[1]>>= 4;
YT2[1]>>= 4;
XT1[2]>>= 4;
XT2[2]>>= 4;
YT1[2]>>= 4;
YT2[2]>>= 4;
XT1[3]>>= 4;
XT2[3]>>= 4;
YT1[3]>>= 4;
YT2[3]>>= 4;//求和取平均
if(n[0]==0)
{
Hex2Dec(0,XT1,XT2,YT1,YT2,data_T);//将第一对信号放入data_T数组准备发送
Hex2Dec(1,XT1,XT2,YT1,YT2,data_T);//第二对信号
Hex2Dec(2,XT1,XT2