分享MSP430用TB捕获脉宽问题与解决心得

发布者:meirong最新更新时间:2020-04-04 来源: eefocus关键字:MSP430  TB捕获  脉宽 手机看文章 扫描二维码
随时随地手机看文章

=============================================================================================================================

硬件:单片机:MSP430F149
晶振:32K,8M
输入信号:通过无线接收到低电平10ms,高电平7.5ms,
输入口:P4.0(TB0)
要求:捕获低电平的脉宽
============================================================================================================================
软件:
1. 初步思路:通过定时器TBCCR0作为捕获模块对外部输入信号进行捕获:先设为下降沿捕获,如果捕获到,马上修改为上升沿捕获,并马上TBR清零开始计数;如果不过到上升沿,马上改为下降沿,并把TBCCR0的数据记下来,此即为脉冲低电平宽度。
2. 使用TI公司的c语言例程稍做修改程序可以运行。
3. 出现问题:程序能捕获到上升下降沿,并且捕获到的width总是忽大忽小,毫无规律。
程序改来改去毫无进展,头开始慢慢大了~~~
4.师兄过来看看说,怎么没有开晶振啊?我说没用到8M的,也就没专门开晶振~不过既然说起,要不干脆换个晶振试试,于是加了段程序,并把TB改成用MCLK(8M):


void InitSys() 

    unsigned int iq0; 

 

    //使用XT2振荡器 

    BCSCTL1 &= ~XT2OFF;                   //打开XT2振荡器 

    do { 

        IFG1 &= ~OFIFG;                   // 清除振荡器失效标志 

        for (iq0 = 0xFF; iq0 > 0; iq0--); // 延时,等待XT2起振 

    } while ((IFG1 & OFIFG) != 0);        // 判断XT2是否起振 

    BCSCTL2 = SELM_2 + SELS;              //选择MCLK=SMCLK为XT2 

}


奇怪的事情发生了,程序一直卡在此处的延时程序语句中,怎么回事,难道晶振打不开?突然想到查查硬件,才发现8M晶振一个管脚松了#◎¥※@$……
焊好8M晶振后,程序可以继续运行了.
5.又发现问题:虽然程序可以正常运行了,width采集到的数据也不再忽大忽小了,开始很规律的在14500左右变化,可一算,14500*(1/8000000)=1.8125ms,跟输入信号脉宽不一致,用示波器测输入端确实是10ms啊???
6.突然想10ms的数据如果采集到应该为10ms/(1/8000000)=80000,这个数据早就超过TBR的值了。那TBR溢出后就会从0重新开始计时,那显示的数据就应该正好是65500+14500=80000!!也就是说,我得到的数据是对的,只是没有考虑TBR溢出的情况!
7.既然问题发现了,就好办了~TB的TBCTL不是可以时钟分频功能吗?设置1/8分频后,时钟为1M,这样10ms的脉宽应该得到10ms/(1000000)=10000!
程序修改好后一运行,果然~阿弥托佛

源程序如下: 


#include  

 

unsigned int width[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; 

unsigned int i = 0; 

 

void main(void) 

    WDTCTL = WDTPW + WDTHOLD;      // 关闭看门狗 

 

    P4SEL |= BIT0;                 // P4.0作为捕获模块功能的输入端输入方波 

 

    //-------开晶振XT2--------- 

 

    BCSCTL1 &= ~XT2OFF;            // 打开XT2振荡器 

    do { 

        IFG1 &= ~OFIFG;            // 清除振荡器失效标志 

        for (i = 256; i > 0; i--);       // 延时,等待XT2起振 

    } while ((IFG1 & OFIFG) != 0); // 判断XT2是否起振 

 

    BCSCTL2 = SELM_2 + SELS;       // 选择MCLK=SMCLK为XT2 

 

    //----------------------------- 

 

    TBCCTL0 &= ~(CCIS1 + CCIS0);   // 捕获源为P4.0,即CCI0A(也是CCI0B) 

    TBCCTL0 |= CM_2 + SCS + CAP;   // 下降沿捕获,同步捕获,工作在捕获模式 

    TBCCTL0 |= CCIE;               // 允许捕获比较模块提出中断请求 

    TBCTL   |= ID_3; 

    TBCTL   |= TBSSEL_2;           // 选择时钟MCLK 

    TBCTL   |= TBCLR;              // 定时器清零, 

    //定时器开始计数(连续计数模式0~0xFFFF) 

    TBCTL   |= MC_2; 

 

    _EINT(); 

 

    while(1); 

 

//―――――定时器TB的CCR0的中断:用于检测脉冲上升与下降沿―――― 

#pragma vector = TIMERB0_VECTOR 

__interrupt void TimerB0(void) 

    if(TBCCTL0&CM1) {              // 捕获到下降沿

        TBCTL |= TBCLR; 

        TBCCTL0 =( TBCCTL0 & (~CM1)) | CM0; //改为上升沿捕获:CM1置零,CM0置一 

 

    } else if (TBCCTL0 & CM0) {    // 捕获到上升沿 

        width[i++] = TBCCR0;       // 记录下结束时间 

        TBCCTL0 = (TBCCTL0 & (~CM0)) | CM1; //改为下降沿捕获:CM0 置零,CM1 置一 

        if (i == 10) {

            i = 0; 

        }

    } 

}


教训:
1.程序的模块化设计很重要。每次写程序,最好遵循如下规矩:
关看门狗;WDTCTL=WDTPW+WDTHOLD;
开晶振:都把ACLK= XT1(32k),MCLK=SMCLK=XT2(8M);并且能用8M最好用8M,这样比较准确。
晶振的检测方法:XT2可以通过程序中的扫描标志位实现。
或者设置P1.4(SMCLK),P2.0(ACLK),然后用示波器检查

主程序:使用自己写的模板。

2.如果在一个问题上卡住了,就不断细化深入下去,直到触到其本质,就看你能把这个问题细化到什么程度!

3.任何数字或信息都有他隐含的本质信息,都能直接或间接反映其本质。就看你能否抓住这个数字,想到他对本质的反映

====================================================================================

关键字:MSP430  TB捕获  脉宽 引用地址:分享MSP430用TB捕获脉宽问题与解决心得

上一篇:MSP430常见问题与解答
下一篇:MSP430的内存分配到底有多重要?

推荐阅读最新更新时间:2024-11-08 19:59

MSP430 定时器A和B 中断定时 1秒操作
/******************** TimerA0 1秒定时 TIMER B 1 秒定时溢出中断 :MCLK = 2MHz DCOCLK LFXT1 = 32768Hz ACLK ***********************/ #include msp430x14x.h unsigned int i; unsigned int times,times_b; unsigned int sec; /***** 定时器A 初使化 *******/ void TimerA_Init(void) { TACTL = TASSEL_1 + ID0 + TACLR ; //ACLK=32768Hz ,清除tar ,2分频 CCT
[单片机]
MSP430F449的时钟问题
当发生上电复位(POR)或者上电清除(PUC)信号时,系统各寄存器会发生复位。 注意:系统时钟相关的几个寄存器在复位后,其初始值不是0. SCFQCTL 寄存器 bit 7 bit6~0 SCFQ_M N 复位后,初始值为:0x001F bit7:0:使能 DCO(频率调整器)1:禁止 DCO N是倍频,系数,决定DCO的最终频率输出。F=D(N+1)*fcrystal.由N初值为1F可以知道。N=31 其中D是由FLL_CTL0的最高位DCOPLUS决定,其为0时不分频即D=1。DCOPLUS为1时DCO信号经锁频环反馈环节分频,即有由SCFI0的FLLDX位决定D的值。初始值为0。 其中fcrystal值位
[单片机]
MSP430F5529 DriverLib 库函数学习笔记(十五)SFR 模块
平台:Code Composer Studio 10.3.1 MSP430F5529 LaunchPad™ Development Kit (MSP‑EXP430F5529LP) API (机翻) 特殊函数寄存器API提供了一组用于使用MSP430Ware SFR模块的函数。提供了启用和禁用中断和控制~ RST/NMI引脚的功能。 SFR模块可以使设备的其他外设产生中断。 SFR APl被分成两组: SFR管理中断的函数 SFR 管理RST/NMI引脚控制的函数 SFR管理中断的函数 SFR_enableInterrupt(uint8_t interruptMask) //启用选定
[单片机]
MSP430单片机硬件知识(4)
MSP430单片机的时钟系统 MSP430根据型号的不同最多可以选择使用3个振荡器。我们可以根据需要选择合适的振荡频率,并可以在不需要时随时关闭振荡器,以节省功耗。这3个振荡器分别为: (1)DCO 数控RC振荡器。它在芯片内部,不用时可以关闭。DCO的振荡频率会受周围环境温度和MSP430工作电压的影响,且同一型号的芯片所产生的频率也不相同。但DCO的调节功能可以改善它的性能,他的调节分为以下3步:a:选择BCSCTL1.RSELx确定时钟的标称频率;b:选择DCOCTL.DCOx在标称频率基础上分段粗调;c:选择DCOCTL.MODx的值进行细调。 (2)LFXT1 接低频振荡器。典型为接32768HZ的时钟振荡器,此时
[单片机]
msp430中如何连续对位进行取反_MSP430系列通用串行通信模块的异步模式
1、 MSP430 串行通信概述 串口 是系统与外界联系的重要手段,在嵌入式系统开发和应用中,经常需要使用上位机实现系统调试及现场数据的采集和控制。一般是通过上位机本身配置的串行口,通过串行通信技术,和嵌入式系统进行连接通信。 MSP430系列的每一种型号都可以实现 串行通信 功能:USART硬件直接实现。 片内具有硬件USART模块的MSP430系列单片机,由于系列不同片内可以包含一个USART模块(USART0),还可以包含多个USART模块(USART0、USART1、USART2)。USART模块可以自动从任何一种低功耗模式LPMx开始自动工作。所有USART0和USART1都可以实现两种通信方式:UART异步通信和S
[单片机]
<font color='red'>msp430</font>中如何连续对位进行取反_<font color='red'>MSP430</font>系列通用串行通信模块的异步模式
基于MSP430F133的电子镇流器综合测试仪
引言 电子节能灯是走进千家万户的产品,提高它的品质对于提倡节能的现代化建设有重要意义,对于生产企业则是增强产品竞争力的必由途径,电子节能灯实现节能的主要原理是以电子镇流器代替传播电感镇流器,提高电子节能灯品质最重要的是要保证电子镇流器的品质,我校受企业的委托研制了本综合测试仪,用于生产过程中的分析,测试电子镇流器的性能。 1 电子镇流器主要测试项目 电子镇流器原理可以简化为图1所示的电路,影响电子镇流器性能的主要指标有:启动阶段的预热灯管电压,预热灯丝电流和预热时间,稳定后的灯管电压、灯管电流、灯丝电流、振荡频率、输入电流、输入功率和功率因素,为此须放置传感器采集输出端的灯管电压,灯丝电流,阴极电路和振荡频率,采集输入端
[测试测量]
MSP430F5529 DriverLib 库函数学习笔记(十二)I2C实战
平台:Code Composer Studio 10.3.1 MSP430F5529 LaunchPad™ Development Kit (MSP‑EXP430F5529LP) 上机实战 I2C给 DAC 芯片 DAC7571 写入数字量 DAC7571 介绍 DAC7571 是低功耗,单通道 12 位 DA 转换器.DAC7571 兼容 I2C 接口,通过这两条数据线和外部通信,时钟的最高速度为 3.4Mbps. DAC7571 的外观图和引脚定义 如上图所示: 1 脚:模拟电压输出脚. 2 脚:接地. 3 脚:电源输入脚. 4 脚:串行数据输入引脚. 5 脚:串行时钟输入引脚. 6 脚:地址选择脚. DAC
[单片机]
<font color='red'>MSP430</font>F5529 DriverLib 库函数学习笔记(十二)I2C实战
流量检测中MSP430单片机的应用分析
0 引言   对于传统流量检测系统而言,其多数选用的是电磁传感器,而电磁传感器易受外界磁场的影响而导致流量计量的不正确,MSP430单片机作为一种超低功耗的16位混合信号处理器,其在流量检测中的应用得到了越来越广泛的应用,因此,本文重点就基于MSP430单片机的流量检测仪的设计进行了研究。   1.以MSP430单片机为基础的流量检测仪的工作原理分析   考虑到流量检测仪低功耗等方面的特性,控制器选用的为MSP430F149,具体而言,此流量检测仪的工作原理如下:当液体经过流量检测仪的过程中,检测仪内部的旋转磁盘进行转动,因而旋转磁盘上所设置的磁钢会触发传感器,并使其发出极为微弱的电信号,通过将此信号进行逐级放大和滤波之后,信
[单片机]
流量检测中<font color='red'>MSP430</font>单片机的应用分析
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved