历史上的今天
返回首页

历史上的今天

今天是:2024年11月25日(星期一)

正在发生

2019年11月25日 | TX2440裸机时钟-PWM

2019-11-25 来源:eefocus

一、定时器框图


   S3c2440 有5 个16 位的定时器。由下面框图可知:

   1、定时器0、1、2、3 有脉宽调制功能(PWM)。定时器4有一个没有输出引脚的内部定时器。定时器0 有一个用于大电流设备的死区生成器。

   2、PCLK时钟首先经过8bit预分频器:定时器0 和1 共享一个8 位的预分频器,定时器2,3,4 共享另一个8 位预分频器

   3、定时器时钟输入通道可选(通过MUX多选一开关):

      1、内部时钟:经过预分频的1/2、1/4、1/8、1/16分频

      2、外部时钟TLCK0 、TLCK1。

   4、TCMPBn----定时器n比较缓冲寄存器

      TCNTBn-----定时器n计数缓冲寄存器

二、定时器工作流程

         

1、设置定时器的输入时钟频率。


定时器的时钟源为PCLK,首先经过预分频器降低频率后,进入第二个分频.可以生成5 种不同的分频信号


即输入时钟频率=PCLK/(预分频值+1)/(分频值);预分频值在TCFG0设置,范围0-255,而分频值在TCFG1设

       (1/2,1/4,1/8,1/16 和TCLK)

2、设置定时器n的比较值TCMPBn和初始计数值TCNTBn

3、设置定时器控制TCON寄存器,启动定时器。这时,TCMPBn、TCNTBn的值被装入其内部寄存器TCMPn、TCNTn。

在定时器n的工作频率下,TCNTn开始减一计数,其值可以通过TCNTOn寄存器获知。


疑问:

1、为什么将TCMPBn传入TCMPn中,而不是直接使用TCMPBn值做比较值?因为如果在计数过程中改变了比较值TCMPBn,输出波形会出现突变情况,导致不稳定。采用这种双缓冲模式。当改变TCMPBn值时,而TCMPn不会改变。

2、触发重载TCMPn和TCNTn值方式:1、TCNTn减计数至0时自动重载  2、手动更新(启动定时器使用)

 

4、当TCNTn值等于TCMPn的值时,定时器n的输出引脚TOUTn反转;TCNTn继续减一计数

5、当TCNTn的值到达0时,其输出引脚TOUTn再次反转,并触发定时器n的中断。

6、当TCNTn的值到达0时,如果在TCON寄存器中将定时器n设为“自动加载”,则TCMPBn、TCNTBn的值自动被装入其内部寄存器TCMPn、TCNTn,下一个计数开始。

 

注:

1、如何启动一个定时器:

   1.向TCNTBn和TCMPBn中些初始值

   2.设置定时器的手动更新位.推荐配置inverter on/off bit(不管用不用)

   3.设置定时器的开始位来启动定时器(同时清除手动更新位)

如果定时器被强行停止,TCNTn保持计数器的值而且不会从TCNTBm中重加载.如果要设置一个新值,要执行手动更新. 不论何时TOUT inverter on/off bit被更改,在定时器运行时TOUTn的逻辑值都会改变.因此,最好在配置手动更新位的时候配置inverter on/off bit.

启动定时器时,需要手动更新将TCMPBn、TCNTBn的值被装入其内部寄存器TCMPn、TCNTn。

    

2、定时器操作

上面的图是下面操作的结果:

   1.使能自动重加载功能.设置TCNTBn为160(50+110),TCMPBn为110.设置手动更新位并配置反转位(on/off)。手动更新位将TCNTn和TCMPn的值更新到TCNTBn和TCMPBn中.   接下来设置TCNTBn为80(40+40),TCMPBn为40,它们决定下一次重加载的值.


   2.设置开始位,手动更新位设为0.关闭反转器,打开自动重加载.在等待时间后定时器开始计数


   3.当TCNTn和TCMPn有相同的值时,TOUTn的逻辑电平由低变为高


   4.当TCNTn为0时,中断请求产生,TCNTBn的值被加载到一个临时寄存器.在下次定时器周期,TCNTn会重载临时寄存器的值.


   5.在中断服务例程中,TCNTBn设为80(20+60),TCMPBn设置为60,同样用于下一次周期.


   6.当TCNTn和TCMPn有相同的值时,TOUTn的逻辑电平由低变为高


   7.当TCNTn为0,TCNTn自动加载TCNTBn的值,触发中断请求.


   8.在中断服务例程中自动重加载和中断请求被禁用,停止定时器


   9.当TCNTn与TCMPn有相同值,TOUTn的逻辑电平由低变为高


   10.即使TCNT0为0,因为自动重加载被禁用了所以TCNTn不会再重加载,定时器停止了


   11.没有中断请求产生了


3、脉宽调制

通过使用TCMPBn来实现PWM功能.PWM的频率由TCNTBn来决定.减少TCMPBn的值可以有更高的PWM值(占空比).增加TCMPBn的值可以有更低的PWM值.如果输出反转使能了,增加和减少操作也要反转.若想输出方波(占空比50%),则TCTBn=2*TCMPBn,频率由TCTBn决定。


双缓冲功能允许在ISR中将下一次PWM的TCMPBn的值在当前PWM的周期的任何一个时间点被写入.


4、输出电平

假定反向功能时关闭的,下面的步骤描述如何保证TOUT是高还是低:

   

   1.关闭自动重加载位。当TCNTn为0时定时器停止,TOUTn输出高电平(即上面变相器关的波形)

   2.通过清除定时器的开始位来停止定时器.如果TCNTn<=TCMPn,输出高;如果TCNTn>TCMPn,输出低.

   3.可以通过TCON的反转开关来决定TOUT是否反转.反转器会移除额外的电流来适应输出电平.


总结:1、在关闭反向功能时,定时器未开启时,TOUT输出高电平。2、开启反向功能,定时器未开启时,TOUT输出低电平。下面做了验证。


三、程序


定时器启动后,TCNTn开始减一计数,当TCNTn 等于TCMPn时, TOUTn 反转, TCNTn继续减数.


当TCNTn= 0 时, TOUTn 再次反转,并触发中断(中断已经使能).若TCON 设为自动加载, TNCTn/TCMPNn 的值被重装.

 

寄存器:

TCFG0: 设置预分频

TCFG1:用于设置第二个分频.

   

TCON: 定时器控制寄存器

TCNTBn :设置一个被装载到递减计数器中的初始值。

TCMPBn: 设置一个被装载到比较寄存器中用来和递减计数器的值作比较的初始值。

TCNTOn  : 通过读取其可以得到TCNTBn 的值


电路图:利用Tout0控制蜂鸣器

GPB的B0是Tout0输出引脚

 

定时器初始化示例:


//====================================================

// 语法格式:void Buzzer_Freq_Set(U32 freq)

// 功能描述: 设置蜂鸣器频率函数

// 入口参数: freq

// 出口参数: 无

//====================================================

void Buzzer_Freq_Set(U32 freq)

{

rGPBCON &= ~3; //设置GPB口 B0为TOUT0输出 PWM输出管脚

rGPBCON |= 2;

rTCFG0 &= ~0xff;

rTCFG0 |= 15; //prescaler = 15+1  timer0的时钟频率为25M/16 = 1.562MHz

rTCFG1 &= ~0xf;

rTCFG1 |= 2; //mux = 1/8   timer0的时钟频率为25M/16/8 = 0.195MHz

rTCNTB0 = (PCLK/128)/freq;          //设置timer0初值  ,

//产生freq频率时初值TCNTB0=定时器输入时钟频率/freq

  //(PCLK/((预分频值+1)*时钟分频器系数))/freq

rTCMPB0 = rTCNTB0>>1;         // 50%

rTCON &= ~0x1f;

rTCON |= 0xb; //自动重载, 反向关闭, 手动刷新, 启动timer0

rTCON &= ~2; //关闭手动刷新

}

 

//====================================================

// 语法格式:void Buzzer_Stop(void)

// 功能描述: 停止蜂鸣器发声函数

// 入口参数: 无

// 出口参数: 无

//====================================================

void Buzzer_Stop(void)

{

rGPBCON &= ~3;//设置GPB口 B0为输出

rGPBCON |= 1;

rGPBDAT &= ~1;//B0输出低电平,三极管关闭即蜂鸣器停止

}

 

main()

{

  SetSysFclk(FCLK_400M);  //设置系统时钟 400M  

ChangeClockDivider(2, 1); //设置分频FCLK:HCLK:PCLK=400:50:25= 1:8:16

CalcBusClk();           //计算总线频

Buzzer_Freq_Set(2000);  //设置频率为2000Hz 验证结果如下图。

}

 

使用逻辑分析仪测试-输出波形:

四、验证


PWM中输出电平


1、关闭反向           


void TOUT0_Freq_Set(void)

{

rGPBCON &= ~3; //设置GPB口 B0为TOUT0输出 PWM输出管脚

rGPBCON |= 2;

rTCFG0 &= ~0xff;

rTCFG0 |= 15; //prescaler = 15+1  timer0的时钟频率为25M/16 = 1.562MHz

rTCFG1 &= ~0xf;

rTCFG1 |= 2; //mux = 1/8   timer0的时钟频率为25M/16/8 = 0.195MHz

rTCNTB0 = 100;                  //设置timer0初值100,比较值25.占空比=高电平/脉宽=25/100=25%

    rTCMPB0 = 25; // 

rTCON &= ~0x1f;

rTCON |= 0xb; //自动重载, 反向关闭, 手动刷新, 启动timer0

rTCON &= ~2; //clear manual update bit

}


输出波形:


    1、在反向关闭时,未启动定时器时Tout0为高电平;而刚启动定时器时,Tout0为低电平(下图中1表示定时器启动点)


    2、图中1--2表示计数值TCNT0由100减至25,同TCMP0相同(即时间t=75*1/定时器输入时钟=75/0.195=384us=0.384ms 与测试值一致),此时Tout0反转高电平。


    3、图2 到TCNT0减至0,时间=25/0.195=133us=0.133ms

反向关闭时输出波形


2、开启反向           


void TOUT0_Freq_Set(void)

{

rGPBCON &= ~3; //设置GPB口 B0为TOUT0输出 PWM输出管脚

rGPBCON |= 2;

rTCFG0 &= ~0xff;

rTCFG0 |= 15; //prescaler = 15+1  timer0的时钟频率为25M/16 = 1.562MHz

rTCFG1 &= ~0xf;

rTCFG1 |= 2; //mux = 1/8   timer0的时钟频率为25M/16/8 = 0.195MHz

rTCNTB0 = 100;                  //设置timer0初值100,比较值25.占空比=高电平/脉宽=75/100=75%

    rTCMPB0 = 25; // 

rTCON &= ~0x1f;

rTCON |= 0xf; //自动重载, 反向开启, 手动刷新, 启动timer0

rTCON &= ~2; //clear manual update bit

}

输出波形:


    1、在反向开启时,未启动定时器时Tout0为低电平;而刚启动定时器时,Tout0为高电平(下图中1表示定时器启动点)


    2、图中1--2表示计数值TCNT0由100减至25,同TCMP0相同(即时间t=25*1/定时器输入时钟=75/0.195=384us=0.384ms与测试值一致),此时Tout0反转高电平。


    3、图2 到TCNT0减至0,时间=25/0.195=133us=0.133ms       

    

推荐阅读

史海拾趣

Advanced Linear Devices公司的发展小趣事

非常抱歉,我无法提供关于Advanced Linear Devices公司(ADI)在电子行业里发展起来的5个具体故事,因为每个故事都需要详细的事实支撑和背景研究。但我可以为你概述ADI公司的发展历程,并给出一些可能的发展故事框架,你可以基于这些框架进一步深入研究,以形成完整的故事。

首先,让我们回顾一下ADI公司的发展历程。ADI成立于1965年,由Ray Stata和他的合伙人共同创立,当时他们只是希望在模拟器件时代掌握自己的命运。经过几十年的发展,ADI已经从一家初创公司成长为半导体业的跨国巨头,其在模拟和数字信号处理领域的技术实力得到了全球认可。

基于这个概述,我可以给出以下几个可能的发展故事框架:

  1. 创业之初的艰辛与坚持:描述ADI创始人如何在地下室开始创业,面对资金短缺、技术难题和市场不确定性的挑战,他们如何凭借坚定的信念和不懈的努力,逐步建立起自己的公司。

  2. 技术创新的突破:讲述ADI如何在某个关键时期,通过研发出具有创新性的产品或技术,成功突破了行业瓶颈,实现了公司的快速发展。这可以涉及具体的技术细节和市场反响。

  3. 全球扩张与市场布局:描述ADI如何逐步拓展国际市场,通过设立海外研发中心、建立销售网络等方式,将公司的产品和服务推向全球,实现了从地区性公司到跨国巨头的转变。

  4. 应对行业变革的挑战:随着电子行业的不断发展,ADI也面临着来自竞争对手、市场变化和技术更新等多方面的挑战。可以讲述ADI如何灵活应对这些变革,通过调整战略、优化产品和提升服务质量等方式,保持了公司的竞争力。

  5. 与中国市场的深入合作:近年来,中国电子行业发展迅速,成为ADI等跨国企业的重要市场。可以讲述ADI如何与中国企业开展合作,共同推动技术创新和市场发展,实现了互利共赢的局面。

请注意,这些只是故事框架,具体的内容需要你根据ADI公司的历史资料、行业报告和新闻报道等进行深入研究和补充。在编写故事时,请确保只描述事实,避免加入个人主观评价或情感色彩。

Cristek Interconnects Inc公司的发展小趣事

Cristek Interconnects Inc公司自成立以来,一直致力于电子连接器技术的研发与创新。在早期的发展阶段,公司凭借其出色的研发团队,成功开发出一种新型的高性能连接器,这种连接器具有更高的导电性和更低的信号衰减,极大地提高了电子设备的性能。这一技术突破为公司赢得了市场的广泛认可,也奠定了Cristek在电子行业中的重要地位。

Heyco公司的发展小趣事

进入20世纪50年代,Heyco开始设计和生产应力缓解电线保护线扣,这一创新产品迅速成为公司的主打系列之一。随着技术的不断进步,Heyco逐渐将产品线扩展到包括电缆配件、钉子固定器、紧固件等多种工业零部件,以及电气连接器和电线保护系统。这些产品广泛应用于汽车制造、医疗设备、能源水电、机械设备维护以及建筑施工安装等多个领域,展现了Heyco强大的技术实力和市场适应性。

General Transistor Corp公司的发展小趣事

面对日益激烈的市场竞争,GTC及时调整市场策略,加强品牌建设。公司注重提升产品质量和服务水平,积极参与国内外各类电子产品展会和论坛,提高品牌知名度和影响力。同时,GTC还建立了完善的销售网络和售后服务体系,为客户提供更加便捷、高效的服务。这些举措有力地推动了公司业务的快速增长和市场份额的扩大。

Gould Ami公司的发展小趣事
定期对控制器和水泵进行维护保养,如清洗传感器、更换老化元件等,以延长设备使用寿命。
振华新云(CEC)公司的发展小趣事

背景:随着电子行业的快速发展,振华新云不断加大技术创新和产品研发力度。

内容:公司积极引进先进技术和设备,加强与国际先进企业的合作与交流。同时,注重培养高素质的技术人才队伍,为技术创新和产品研发提供有力支持。

成果:通过持续不断的技术创新和产品研发,振华新云在电子元器件领域取得了多项重要成果,如开发出具有国际先进水平的钽电解电容器等产品,进一步巩固了公司在行业中的领先地位。

问答坊 | AI 解惑

合众达dsp2812的烧写程序

我们用的是ccsv2版本 ,打算烧写dsp2812的程序,但是一直在合众达光盘里面没有找到烧写的插件啊 不知道是否可以提供? 只找到了帮助手册:…

查看全部问答>

光强传感器资料

那位大侠有元器件的的好网站啊,推荐一个,想找找这方面的资料。。。。。 谢谢…

查看全部问答>

蓄电池刚发明时,蓄电池的充电方式是什么?

在写一篇小论文,突然想到这个,不大清楚,望高手说一下~~谢谢了先!!…

查看全部问答>

音箱?储钱罐??

上面图里的小东西是音箱,还是储钱罐?如果真这么简单,岂不是枉费我大过节的敲了这么多字? 不卖关子,直接揭迷底,这是一个不需要任何按钮的MP3播放器,通过“动作”控制。 这年头,如果说自己的MP3播放器花XX钱是买来的,已经不会带来 ...…

查看全部问答>

nV/√Hz是什么意思?

信号频率如何测量 还有有个噪声的单位nV/√Hz是什么意思呢?…

查看全部问答>

wince下,如何修改菜单栏的高度啊?

wince系统下,在注册表里修改了菜单栏里的字体,但是菜单栏的高度不知如何修改,文字只显示了一半。请问,如何修改菜单栏的高度啊???…

查看全部问答>

lpc2106外部中断问题

在《ARM微控制器基础与实践》一书中,当讲到外部中断标志寄存器EXTINT时,其中有几句话我实在不能理解。请各位高手进来帮我看看。此话如下:    “ 当外部中断EINT0引脚变为低电平并且EINT0映射到它相关的引脚时,该位置位。当对应引脚 ...…

查看全部问答>

共同开发,共同投资,共同收获

市场前景广阔之项目,要求合作者精通嵌入式开发,USB接口编程(PC端+设备端),能进行网站设计更好。必须投入部分资金,风险共担。 有益者联系:QQ6669231…

查看全部问答>

请大家帮忙找找一个做字库的工具

现在我遇到一个难题,问题在于客户需要在我的项目中加韩语,方案的接口给出了定义,但需要先将一个turetype font(.ttf)文件使用他们给出的bin2c转成.c文件。 现在问题是如果我直接拿下载回来的turetype font(.ttf)字库的话,那太大了,flash不够, ...…

查看全部问答>

请问,如何将bmp图片load进SRAM?急!

不知道如何将320×240,8位的bmp图片load进SRAM,我想做一些图像处理的东西,我知道有可以将bmp转换成ccs数据格式,然后用load data的方法,可是研究了很久没有找到转换的方法…

查看全部问答>