历史上的今天
返回首页

历史上的今天

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

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

2021-08-24 来源:eefocus

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();           //开放总中断

}

推荐阅读

史海拾趣

博通集成(BEKEN)公司的发展小趣事

随着产品线的不断丰富和技术实力的提升,博通集成开始积极拓展市场。公司凭借优质的产品和服务,赢得了众多客户的信赖和支持。同时,公司注重品牌建设,通过参加行业展会、举办技术研讨会等方式,提升品牌知名度和影响力。如今,博通集成已成为无线连接芯片设计领域的知名品牌。

Chenmoun Enterprise Ltd公司的发展小趣事

作为一个有社会责任感的企业,Chenmoun Enterprise Ltd在追求经济效益的同时,也积极履行社会责任。公司注重环保和可持续发展,致力于减少生产过程中的环境污染和资源浪费。同时,公司还积极参与公益事业,为社会做出积极贡献。这些举措不仅提升了公司的品牌形象,也增强了公司的社会影响力。

以上这些故事虽然基于虚构,但它们展示了一个电子企业可能经历的发展路径和关键成功因素。这些因素包括技术创新、全球化战略、品质控制、研发投入和社会责任等。当然,每个企业的具体情况和发展道路都会有所不同,但这些故事可以作为参考,帮助您理解电子行业企业的发展历程。

艾谱科(Epticore)公司的发展小趣事

艾谱科公司深知技术创新的重要性。为了保持产品的竞争力,公司不断加大研发投入,积极引进高素质人才,并与国内外知名科研机构建立合作关系。在研发团队的努力下,艾谱科不断推出具有创新性的产品,如低功耗处理器、高速数据传输模块等。这些新产品不仅提升了公司的市场竞争力,也为客户提供了更加优质的产品选择。

Hammond公司的发展小趣事

艾谱科公司的创立源于其创始人对电子行业未来发展的独到见解。在21世纪初,随着数字化和智能化技术的飞速发展,创始人意识到电子行业即将迎来一场技术革命。他带领团队深入研究新兴技术,并成功开发出一款具有划时代意义的电子元件——高效能芯片。这款芯片凭借其出色的性能和稳定性,迅速获得了市场的认可,为艾谱科公司的发展奠定了坚实的基础。

世纪金光(CENGOL)公司的发展小趣事

在碳化硅材料技术取得突破后,世纪金光迅速将这一技术应用于功率器件的研发与生产。公司成功开发出额定电压650-1700V、额定电流5-100A的碳化硅肖特基二极管(SBD)以及额定电压650-1200V、额定电流20-100A的金属-氧化物半导体场效应晶体管(MOSFET)。这些高性能的功率器件在电源PFC、充电桩充电模组、光伏逆变器、特种电源等领域得到了广泛应用,为客户提供了高效、可靠的解决方案。

DC Components公司的发展小趣事

DC Components公司在追求经济效益的同时,也积极履行社会责任。公司注重环保和可持续发展,通过采用环保材料和节能技术,降低生产过程中的环境影响。此外,公司还积极参与公益活动,回馈社会,为社区的和谐发展做出了积极贡献。这些举措不仅提升了公司的社会形象,也为公司的长期发展奠定了坚实基础。

问答坊 | AI 解惑

电子电路设计与实践

初学者可以拿去参考参考…

查看全部问答>

protelDXP2004原理图修改元件参数有什么快速方法

protelDXP2004原理图修改元件参数有什么快速方法呀。一个一个改好麻烦呀。:L…

查看全部问答>

基于MSP430 单片机高精度温度测量的补偿方法

用MSP430P315 单片机的A/D 转换器,实现阻性温度传感器的电阻检测;用查表和线性插值结合的方法,简化标度变换的算法结构。对电池电压的降低进行补偿的同时分析补偿电阻的精度对温度检测的影响。 …

查看全部问答>

软件工程师的职位规划

/************************************************ *技术直接转销售还是先转技术支持再转销售好呢? ************************************************/ 我是09年毕业的,毕业的时候,是在一家医疗器材公司工作。 最近换了一家公司,是搞 ...…

查看全部问答>

请教一点关于并口驱动开发的问题

老师让做一个dsp和pc通过并口epp通信的东西,在xp下对并口操作是不是要写个驱动?老板让我用WinDriver,我想问问关于并口开发要怎样调试呢?以前没有做过关于并口通信东西,所以想请问各位老大,希望能给指点一下…

查看全部问答>

请问一下

我的程序 无法进入中断程序 可能是什么原因? 我是用的下降沿有效啊…

查看全部问答>

请教evc中如何快速移动图片

在Wince中添加一个较大的位图,设想有一个相对较小的取景框,当这个框快速移动时,我想显示屏幕上位图移动的动画效果。我在evc中代码如下:          CBitmap m_bitmap;         BITMAP bm; ...…

查看全部问答>

帮我下一个外文文献

Kaiser, J.F., Nonrecursive digital filter design using the I0-sinh window function, Proceedings of the 1974 IEEE International Symposium on Circuits and Systems (1974) 请发送邮件到donghongyong@live.cn …

查看全部问答>

uboot怎样向kenerl传递一个物理地址

现在uboot中有个物理需要传到kernel中! 我该在uboot怎样做?请各位大虾指点下!!谢谢…

查看全部问答>

(北京)迎接Linux时代的到来

4月21日(周六)东方标准特邀请嵌入式软件仿真开源(SkyEye)项目核心成员、AKA 嵌入式小组成员康烁,为大家做《利用SkyEye进行操作系统分析及SkyEye的最新进展》的讲座。 康烁--作为自由软件爱好者,精通嵌入式系统移植,驱动开发,多年嵌入式开发 ...…

查看全部问答>