历史上的今天

今天是:2024年08月24日(星期六)

2021年08月24日 | MC9S08DZ60单片机测量时间的问题

发布者:chi32 来源: eefocus关键字:MC9S08DZ60  单片机  测量时间 手机看文章 扫描二维码
随时随地手机看文章

1.问题描述


用DZ60的计时器测周期时发现,TPM(计时器)在初始化后,需要等待500多ms才能勉强测到。


TPM产生的波形如下图,蓝色波形上升沿为初始化指令执行完成时间点,用一个IO口输出高电平并延时100ms作为示波器触发源,黄色波形为TPM的PWM方式输出波形。

2.问题分析


在DZ60DATASHEET中文版第313页找到这段话。


大概意思是TPM的通道控制寄存器的更新时机由clksb:clksa控制。而clksb:clksa的功能如表16-3所示。


合起来就是说,对通道控制寄存器的写入,不是直接写到寄存器里面,而是先写到寄存器对应的缓冲器。当TPM计数器关闭时,写入的数据从缓冲器写入完成后立即更新到寄存器;而当TPM有时钟在运行时,写入的数据更新则需要等到,计时器从0xfffe变成0xffff才开始进行。


由此想到,产生问题的TPM初始化是128分频(16MHZ总线时钟下,周期为8us)。16位TPM计数器从0开始计数,则有更新设置需等待时间为65535×8us=524ms。与所见波形符合。


3.问题解决


无论TPM用作输入捕捉,还是PWM或者比较输出,所有TPM控制寄存器初始化时,都要先把时钟关掉,即clksb:clksa=0b00。问题解决后得到波形如下:

4.正确实例


//初始化时必须先关掉时钟,否则以下两个寄存器要到将要溢出即(0xfffe->0xffff)时才会更新。

    //--如果设置128分频,则初始化时间需要 16MHz/128*65535=524ms

//关掉时钟初始化,则寄存器在写入完成后立即更新,无需等待。

//TPM2产生中央对齐PWM输出

    TPM_CSTR(TPM_NUM_2) =0b00100111;

    //                      |||||||

    //                      ||||||+-----PS0

    //                      |||||+------PS1 ----128倍分频

    //                      ||||+-------PS2/

    //                      |||+--------CLKSA

    //                      ||+---------CLKSB/--关时钟

    //                      |+----------CPWMS---所有通道以中央对齐PWM模式运行

    //                      +-----------TOIE----禁止溢出中断

//TPM1设置为输入捕捉

    TPM_CSTR(TPM_NUM_1) =0b00000111;

    //                      |||||||

    //                      ||||||+-----PS0

    //                      |||||+------PS1 ----128倍分频

    //                      ||||+-------PS2/

    //                      |||+--------CLKSA

    //                      ||+---------CLKSB/--关时钟

    //                      |+----------CPWMS---所有通道以输入捕捉运行

    //                      +-----------TOIE----禁止溢出中断

//TPM2通道设置

    TPM2_CHSCSTR(TPM_CHNo)=0b00101000;

    //                        |||||

    //                        ||||+-----ELSA

    //                        |||+------ELSB/---High-true 脉冲(清除向上比较输出)

    //                        ||+-------MSA

    //                        |+--------MSB/----CPWMS=1时,此设置无效

    //                        +---------CHIE----禁止中断

    tmp = Period * (125) / 2;

    TPM2MOD = tmp;     //周期Period以ms为单位

    TPM2C0V = tmp / 10 * Duty / 10;   //占空比Duty为0~100整数

    TPM2SC_CLKSB = 0;

    TPM2SC_CLKSA = 1;  //寄存器设置完成,再打开总线时钟,避免长时间的寄存器更新。

//TPM2通道设置

    TPM1SC_CLKSB = 0;

    TPM1SC_CLKSA = 1;  //寄存器设置完成,再打开总线时钟,避免长时间的寄存器更新。

    TPM1SC_TOIE = 1;   //使能输入捕捉中断

EnableTPM1ChInt(G_TMUch_Start);

 

中断程序的写法如下

interrupt void isrT1Ch0In(void)

{

   DisableInterrupt();          //禁止总中断

 

   if(TPM1C0SC_CH0F == 1)   //判断是否发生输入捕捉中断

   {

       TPM1C0SC_CH0F = 0;     //清除标志位

       switch(g_trigged)

       {

       case 0:

           //第一次触发,保存数据

           g_start_data = TPM1C0V;

           g_trigged++;

           //设置第二次触发边沿方式

           TPM_CSTR(TPM_NUM_1) =0b00000111;//重新初始化,避免长时间的寄存器更新。

           switch(G_Edge_Stop) 

           {

             case POS_EDGE:

                 TPM1_CHSCSTR(G_TMUch_Stop)=0b00000100;

                 //                              |||||

                 //                              ||||+-----ELSA

                 //                              |||+------ELSB/---上升边沿捕捉

                 //                              ||+-------MSA

                 //                              |+--------MSB/----输入捕捉模式

                 //                              +---------CHIE----禁止通道中断

                 break;

             case NEG_EDGE:

                 TPM1_CHSCSTR(G_TMUch_Stop)=0b00001000;//下降边沿捕捉

                 break;

             default:

                 TPM1_CHSCSTR(G_TMUch_Stop)=0b00000100;//默认为上升边沿捕捉

                 break;

           }           

          //寄存器设置完成,再打开总线时钟,避免长时间的寄存器更新。

           TPM1SC_CLKSB = 0;

           TPM1SC_CLKSA = 1; 

           TPM1SC_TOIE = 1;

           EnableTPM1ChInt(G_TMUch_Stop);

           break;

       case 1:

           //第二次触发,保存数据

           g_stop_data = TPM1C0V;

           g_trigged++;

           //时间采集完毕,恢复成IO功能

           TPM1_CHSCSTR(G_TMUch_Start)=0b00000000; 

           TPM1_CHSCSTR(G_TMUch_Stop)=0b00000000;  //恢复成IO功能

           break;

       default:

           break;

       } 

   }

   

   EnableInterrupt();           //开放总中断

}

关键字:MC9S08DZ60  单片机  测量时间 引用地址:MC9S08DZ60单片机测量时间的问题

上一篇:飞思卡尔芯片k66单片机溢出_PWM 初试溢出中断
下一篇:mc9s08dz60 BootLoader基于bin文件

推荐阅读

昨日,阿里健康首次对外披露其在杭州试水30分钟达、24小时药房“网订店送”服务的订单情况:目前由阿里健康发起的中国医药O2O先锋联盟,一天上线的全国药房已超10万单。据悉,在杭州的30分钟急送药和夜间送药服务试点成功后,也将在更多城市推广。这似乎是阿里健康强化线下医药零售布局中的小小一步,更是阿里巴巴进军医疗健康行业的战略中毫不起眼的冰山...
继续上面的操作,我们打开keil,是空的!点击project ->New uVision Project选择工程的位置并命名工程名字 保存后,选择你对应的芯片,OK后,一个空的环境搭好了!下一步建立一个代码文件夹,先说明我们要用的文件有哪些:然后将上面的文件分配到建立的文件代码,分配方式为CORE 文件夹:LIB文件夹:最后在APP里建个main.c文件!这样我们基本完成了代...
使用过汇编语言和C语言的朋友肯定会感觉到C语言的人性化与方便性,汇编语言起源的年代比较早,因此,有很多程序高手仍使用汇编语言,毕竟自己也已经习惯了,但对于一些单片机新手入门的,我们还是推荐使用C语言来写程序,相对来说比较通俗,易学。在某些特定的场合,汇编语言仍然有不可代替的优势,毕竟指令执行时间很精确,但对于目前越来越长的程序代码...
#include <hidef.h> /* common defines and macros */#include <mc9s12dg128.h> /* derivative information */#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"unsigned int i;void main(void) { DDRB=0XFF;//PORTBÉ趨ΪÊä³ö PORTB=0XFF;//PORTB³õʼ»¯ÎªÈ«¸ß TSCR1=0x90;//¶¨Ê±Æ÷ʹÄÜÇÒTF...

史海拾趣

问答坊 | AI 解惑

恒压/恒流输出式单片开关电源的设计原理

恒压/恒流输出式单片开关电源的设计原理 摘要:单片开关电源是国际上90年代才开始流行的新型开关电源芯片,本文阐述恒压/恒流输出式的设计原理。 关键词:单片开关设计原理恒压/恒流输出 恒压/恒流输出式单片开关电源可简称为恒压/恒流源。其特点是 ...…

查看全部问答∨

分析LM3S8962串口使用学习心得

LM3S8962串口模块特点;       1. 支持数据5~8位可配置;最高波特率3.125MHZ;       2. 起始位,停止位宽带可配置;       3. 校验方式可以配置,支持偶 ...…

查看全部问答∨

一个专门给在杭软件硬件工作者开的群23267630

一个专门给在杭软件硬件工作者开的群23267630,欢迎在杭州从事软件,硬件开发的朋友加入…

查看全部问答∨

华为生产计划手册,看到有人需要

【资料名称】:华为生产计划手册 \'|:S:A\'j$y;`\"d&xmscbsc 移动通信论坛拥有30万通信专业人员,超过50万份GSM/3G等通信技术资料,是国内领先专注于通信技术和通信人生活的社区。;A#K3^9o8R3L%F.{4h#` 【资料作者】:华为移动通信,通信工程师 ...…

查看全部问答∨

有关USB总线数据包的问题,在线等,谢谢

我从总线上捕获的USB信号为:令牌包(省略)EOP KJKJKJKK KKJKJKKK(PID) JKJKJKJK JKJKJK EOP ACK(省略)环境说明:这个包是一个IN包(从device 发往主机的),用的是中断端点我现在不知道为什么PID后面 ...…

查看全部问答∨

103ZEFSMC上面的那个INT2INT3做什么的???

目前FSMC上面挂4个设备 其中DM90000A的中断接到一个普通GPIO做中断的 能不能用这两个呢?(关键是这两个是不是做这个用的??) 望研究过的人详细解释…

查看全部问答∨

电烙铁拆卸QFP芯片方法

用电烙铁拆: 步骤1、用直径0.15mm左右的漆包线从第一排引脚下穿过,一头固定,一头拉在手里。 2、用电烙铁从漆包线动端加热,同时用手将漆包线向下拉,注意手和烙铁的配合。 3、然后用上述方法拆其余三排引脚。OK! 对印制板无任何损伤!…

查看全部问答∨

铁电存储器无应答

STM32中模拟了一个I2C,与铁电通信时发现铁电无应答。因此读铁电的功能也不能用!!!! 有没有人碰到过这样的问题啊?大家给点意见嘛。        再对问题做点补充。模拟I2C中,PB.9做的SDA脚。在接受应答时,PB.9若设置成 ...…

查看全部问答∨

音频信号分析仪完整资料(包含各种论文、方案)

本帖最后由 paulhyde 于 2014-9-15 09:10 编辑  …

查看全部问答∨

DS18B20初始化

sbit sbit_D18B20_DQ = P3^7; bit b_DS18B20_is_reset = 0; int int_temperature = 0; uchar uc_DS18B20_dat_buf[9] = {0};         b_DS18B20_is_reset = 0;         sbit_D18B20_DQ = 1;   & ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
更多往期活动
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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