定时器

单片机是嵌入式系统的核心元件,使用单片机的电路要复杂得多,但在更改和添加新功能时,带有单片机的电路更加容易实现,这也正是电器设备使用单片机的原因。那么在单片机电路的设计中需要注意的难点有哪些?你都解决了吗?下面分享10个单片机电路设计中的难点,一起来学习吧~

1、单片机上拉电阻的选择

“”

“”

大家可以看到复位电路中电阻R1=10k时RST是高电平 ,而当R1=50时RST为低电平,很明显R1=10k时是错误的,单片机一直处在复位状态时根本无法工作。出现这样的原因是由于RST引脚内含三极管,即便在截止状态时也会有少量截止电流,当R取的非常大时,微弱的截止电流通过就产生了高电平。

2、LED串联电阻的计算问题

通常红色贴片LED:电压1.6V-2.4V,电流2-20mA,在2-5mA亮度有所变化,5mA以上亮度基本无变化。

“”

3、端口出现不够用的情况

这时可以借助扩展芯片来实现,比如三八译码器74HC138来拓展。

“”

“”

4、滤波电容

滤波电容分为高频滤波电容和低频滤波电容。

1、高频滤波电容一般用104容(0.1uF),目的是短路高频分量,保护器件免受高频干扰。普通的IC(集成)器件的电源与地之间都要加,去除高频干扰(空气静电)。

2、低频滤波电容一般用电解电容(100uF),目的是去除低频纹波,存储一部分能量,稳定电源。大多接在电源接口处,大功率元器件旁边,如:USB借口,步进电机、1602背光显示。耐压值至少高于系统最高电压的2倍。

5、三极管的作用

1)开关作用:

“”

LEDS6为高电平时截止,为低电平时导通。

限流电阻的计算:集电极电流为I,则基极电流为I/100(这里涉及到放大作用,集电极电流是基极的100倍),PN结电压0.7V,R=(5-0.7)/(I/100)

2)放大作用:集电极电流是基极电流的100倍

3)电平转换:

“”

当基极为高电平时,三极管导通,右侧的导线接地为低电平,当基极为低电平时,三极管截止,输出高电平。

6、数码管的相关问题

“”

数码管点亮形成的数字由a,b,c,d,e,f,e,dp(小数点)构成,字模及真值表如上图。

7、电流电压驱动问题

由于单片机输出有限,当负载很多的时候需要另外加驱动芯片 ,比如74HC245。

8、上拉电阻

上拉电阻选取原则

1、从节约功耗及芯片灌电流能力考虑应当足够大;电阻大,电流小。
2、从确保足够的驱动电流考虑应当足够小;电阻小,电流大。
3、对于高速电路,过大的上拉电阻可能会导致边沿变平缓。

综合考虑:上拉电阻常用值在1K到10K之间选取,下拉同理。

上下拉电阻,上拉就是将不确定的信号通过一个电阻嵌位在高电平,下拉同理。

1)电平转换,提高输出电平参数值。
2)OC门必须加上拉电阻才能使用。
3)加大普通IO引脚驱动能力。
4)悬空引脚上下拉抗干扰。

9、晶振和复位电路

晶振电路

1)晶振选择:

根据实际系统需求选择,6M,12M,11.0592M,20M等待。

2)负载电容:

对地接2个10到30pF的电容即可,常用20pF。

3)万用表测晶振:

直接用红表笔对晶振引脚,黑表笔接GND,测量电压即可。复位电路把单片机内部电路设置成为一个确定的状态,所有的寄存器初始化。

51单片机的复位时间大约在2个机械周期左右,具体需要看芯片数据手册。一般通过复位芯片或者复位电路,具体的阻容参数的计算,通过google查找。

10、按键抖动及消除

按键也是机械装置,在按下或放开的一瞬间会产生抖动,如下图:

“”

消除方法有两种:软件除抖和硬件除抖,其中硬件除抖是应用了电容对高频信号短路的原理。

软件除抖是检测出键闭合后执行一个延时程序,产生5ms~10ms的延时,让前沿抖动消失后再一次检测键的状态,如果仍保持闭合状态电平,则确认为真正有键按下。

来源:凡亿PCB
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 39

一、STM32定时器

STM32中定时器可分为高级定时器、通用定时器、基本定时器三类,他们都是由一个可编程的16位预分频器(TIMX_PSC)驱动的16位自动装载计数器(TIMX_CNT)构成。这三种定时器的区别如下:


二、通用定时器

1、通用定时器的功能特点

① 位于低速的APB1总线上(APB1)

② 16 位向上、向下、向上/向下(中心对齐)计数模式,自动装载计数器(TIMx_CNT)。

③ 16 位可编程(可以实时修改)预分频器(TIMx_PSC),计数器时钟频率的分频系数为 1~65535 之间的任意数值。

④ 4 个独立通道(TIMx_CH1~4),这些通道可以用来作为:

  • 输入捕获
  • 输出比较
  • PWM 生成(边缘或中间对齐模式)
  • 单脉冲模式输出

⑤ 可使用外部信号(TIMx_ETR)控制定时器和定时器互连(可以用 1 个定时器控制另外一个定时器)的同步电路。

2、可产生中断或DMA的事件

① 更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发)
② 触发事件(计数器启动、停止、初始化或者由内部/外部触发计数)
③ 输入捕获
④ 输出比较
⑤ 支持针对定位的增量(正交)编码器和霍尔传感器电路
⑥ 触发输入作为外部时钟或者按周期的电流管理

3、计数器模式

1、向上计数模式:计数器从0计数到自动加载值(TIMx_ARR),然后重新从0开始计数并且产生一个计数器溢出事件。

2、向下计数模式:计数器从自动装入的值(TIMx_ARR)开始向下计数到0,然后从自动装入的值重新开始,并产生一个计数器向下溢出事件。

3、中央对齐模式(向上/向下计数):计数器从0开始计数到自动装入的值-1,产生一个计数器溢出事件,然后向下计数到1并且产生一个计数器溢出事件;然后再从0开始重新计数。


4、工作过程

在选定的时钟源(可以是内部的也可以是外部的)和预分频器TIMX_PSC的驱动下,根据设置的计数模式(向上、向下、中央对齐)自动

装载计数器TIMX_CNT开始计数;如果使能了相应的事件(更新事件、触发事件、输入捕获、输出比较)则会产生相应的中断

  • 如果没有开启输入和输出,只使能了计数器计数溢出后自动装载,可以做为一个简单定时器使用,计数器自己开始周期计数
  • 如果开启了通道输入捕获,当检测到ICx信号上相应的边沿后,计数器(CNT)的当前值被锁存到捕获/比较寄存器(TIMx_CCRx)中,通过中断的方式可以读取出来假设为 n1,然后更改输入捕获的信号级性(上升沿或下降沿),当再次检测到ICx信号上相应的边沿后,计数器(CNT)的当前值再次被锁存到捕获/比较寄存器(TIMx_CCRx)中假设为 n2;n2 -n1节可算出电平的持续时间
  • 如果开启了输出控制,可以产生一个由TIMx_ARR寄存器确定频率、由TIMx_CCRx寄存器确定占空比的PWM信号。
  • 如果选择外部的同步时钟信号(TI1F_ED、TI1FP1、TI2FP2)作为计数器的时钟源,可以用来统计脉冲,实现脉冲频率采集功能


5、计数器时钟源选择


内部时钟(CK_INT)


外部时钟模式1:外部输入脚(TIx)


外部时钟模式2:外部触发输入(ETR)


内部触发输入(ITRx):使用一个定时器作为另一个定时器的预分频器,如可以配置一个定时器Timer1而作为另一个定时器Timer2的预分频器

6、计数器时基单元


7、定时器同步


所有TIMx定时器在内部相连,用于定时器同步或链接。当一个定时器处于主模式时,它可以对另一个处于从模式的定时器的计数器进行复

位、启动、停止或提供时钟等操作。定时器同步在实际使用中很少使用到,但是在CubeMX配置时会有Trigger Output(TRGO)

Parameters 配置项,所以还是需要搞清楚是干嘛用的。

主/从定时器使用场景:

  • 使用一个定时器作为另一个定时器的预分频器
  • 使用一个定时器使能另一个定时器
  • 使用一个定时器去启动另一个定时器
  • 使用一个定时器作为另一个的预分频器
  • 使用一个外部触发同步地启动2个定时器

在 控制寄存器2(TIMx_CR2)中的MMS[2:0]主模式选择 (Master mode selection):专门选择在主模式下送到从定时器的同步信息

(TRGO)


版权声明:本文为CSDN博主(hurryddd)原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/m0_37845735/article/details/105395643

围观 357

XpressConnectTM重定时器能经济而高效地将高速信号覆盖率提高到三倍

随着数据中心工作负载对高性能计算需求的增加,急需新的超低延迟信号传输技术来提升人工智能(AI)、机器学习(ML)、高级驾驶员辅助系统(ADAS)和其他计算工作负载应用的性能。为满足这一需求,Microchip Technology Inc.(美国微芯科技公司)今天宣布推出低延迟 PCI Express(PCIe®) 5.0 和 Compute Express Link™(CXL™)1.1/2.0 等XpressConnect系列重定时器产品。

XpressConnect系列重定时器的覆盖范围是PCIe第五代电信号的三倍,使数据中心设备供应商能够利用下一代计算IO性能的技术进步,同时为高级硬件架构提供所需的灵活性和连接功能。XpressConnect重定时器可提供超低延迟的信号传输,支持 AI、ML、通信系统和高性能计算应用中最繁重的计算工作负载。

Microchip数据中心解决方案业务部营销和应用工程副总裁Andrew Dieckmann表示:“随着存储、计算和存储器带宽需求的不断增长,超大规模数据中心、服务器和存储供应商不断向Microchip寻求领先的计算、存储和存储器连接解决方案。Microchip在提供与XpressConnect重定时器的无缝互操作性方面具有独特优势,因为我们拥有广泛的PCIeSwitchtecTM和Flashtec®产品组合以及与行业合作伙伴的密切关系,可助力客户降低工程成本和实现更快上市。”

XpressConnect系列可提供更广泛的覆盖范围,并且延时比PCIe规范低80%以上,引脚间延迟小于10 ns。XpressConnect重定时器提供支持多种通道数的不同型号,其中最多的是16条通道的PCIe Gen 5,可连接各种PCIe和CXL设备。XpressConnect重定时器支持无源铜缆和光缆,并具有热插拔和暴力插拔等高可靠性功能。XpressConnect使系统集成商能够使用成本更低的电缆和板卡材料,为主板、背板、电缆和转接卡等提供经济高效的解决方案。

为了让客户实现快速上市,Microchip与英特尔®合作开发了标准转接卡形式的XpressConnect参考设计。客户可通过英特尔资源和设计中心获得该设计。XpressConnect还支持ChipLink诊断和开发工具,以降低工程开发成本,加快上市时间。

英特尔技术项目总监Jim Pappas表示:“PCIe 5.0和CXL将增强英特尔未来代号为‘Sapphire Rapids’的Xeon可扩展处理器的工作负载性能和能力。与所有新标准一样,PCIe 5.0和CXL的采用将取决于行业领导者提供的验证和互操作性。Microchip和英特尔在PCIe解决方案方面有着悠久的合作历史。我们很高兴能够继续共同努力,提供一个强大的生态系统,让下一代PCIe 5.0和CXL 1.1/2.0解决方案能轻松采用低延迟重定时器。”

CXL联盟主席Barry McAuliffe表示:“Microchip是CXL 联盟的重要贡献者,既是CXL董事会成员,也是开发CXL规范的技术工作组成员。Microchip的XpressConnect低延迟重定时器是对CXL生态系统的有益补充。”

开发工具

Microchip发布了一整套设计资料、参考设计、评估板和工具,支持客户利用PCIe Express 5.0的高带宽和CXL 1.1/2.0的低延迟连接构建系统。Microchip在所有数据中心产品中使用的ChipLink诊断GUI已经扩展到支持XpressConnect重定时器,可提供广泛的调试、诊断、配置和取证工具。

供货

XpressConnect重定时器现正向合格的客户提供样品。有关订购详情,请联系您的 Microchip 销售人员。

除了存储技术,Microchip还为全球数据中心基础设施建设者提供全面的系统解决方案,包括存储器、时序和同步系统、独立安全启动、安全固件和身份验证、无线产品、用于配置和监控数据中心设备的触摸显示屏,以及预测性风扇控制。

资源

可通过Flickr或联系编辑获取高分辨率图片(可免费发布):
应用图:
www.flickr.com/photos/microchiptechnology/50542295227/sizes/l/

Microchip Technology Inc. 简介

Microchip Technology Inc.是致力于智能、互联和安全的嵌入式控制解决方案的领先供应商。其易于使用的开发工具和丰富的产品组合让客户能够创建最佳设计,从而在降低风险的同时减少系统总成本,缩短上市时间。Microchip的解决方案为工业、汽车、消费、航天和国防、通信以及计算市场中12万多家客户提供服务。Microchip总部位于美国亚利桑那州Chandler市,提供出色的技术支持、可靠的产品交付和卓越的质量。详情请访问公司网站www.microchip.com

围观 46

STM32F1xx官方资料:《Cortex-M3权威指南-中文》-第8章最后一个小节:Systick定时器

SysTick定时器

Systick定时器,是一个简单的定时器,对于CM3、CM4内核芯片,都有Systick定时器。Systick定时器常用来做延时,或者实时系统的心跳时钟。这样可以节省MCU资源,不用浪费一个定时器。比如UCOS中,分时复用,需要一个最小的时间戳,一般在STM32+UCOS系统中,都采用Systick做UCOS心跳时钟。

Systick定时器就是系统滴答定时器,一个24 位的倒计数定时器,计到0 时,将从RELOAD 寄存器中自动重装载定时初值。只要不把它在SysTick 控制及状态寄存器中的使能位清除,就永不停息,即使在睡眠模式下也能工作。

SysTick定时器被捆绑在NVIC中,用于产生SYSTICK异常(异常号:15)。Systick中断的优先级也可以设置。

实际上,Systick就是一个定时器而已,只是它放在了NVIC中,主要的目的是为了给操作系统提供一个硬件上的中断,称之为滴答中断操作系统进行运转的时候,也会有时间节拍。它会根据节拍来工作,把整个时间段分成很多小小的时间片,而每个任务每次只能运行一个时间片的时间长度,超时就退出给别的任务运行,这样可以确保任何一个任务都不会霸占操作系统提供的各种定时功能,都与这个滴答定时器有关。因此,需要一个定时器来产生周期性的中断,而且最好还让用户程序不能随意访问它的寄存器,以维持操作系统的节拍。只要不把它在SysTick控制及状态寄存器中的使能位清除,就一直执行。 

SysTick相关寄存器

SysTick有四个寄存器,分别为CTRL(控制与状态寄存器)、LOAD(自动重装载值寄存器)、VAL(当前值寄存器)、CALIB(校准值寄存器)。

在MDK的core_m3.h文件中定义了一个结构体SysTick_Type,里面也包括了这四个寄存器。

typedef struct
{
  __IO uint32_t CTRL;                         /*!< Offset: 0x00  SysTick Control and Status Register */
  __IO uint32_t LOAD;                         /*!< Offset: 0x04  SysTick Reload Value Register       */
  __IO uint32_t VAL;                          /*!< Offset: 0x08  SysTick Current Value Register      */
  __I  uint32_t CALIB;                        /*!< Offset: 0x0C  SysTick Calibration Register        */
} SysTick_Type;

它们的各位描述如下面的表格所述:


对于STM32,外部时钟源(STCLK)是HCLK(AHB总线时钟)的1/8,内核时钟(FCLK)是HCLK(AHB总线时钟)。



SysTick相关库函数

SysTick_CLKSourceConfig(),这是Systick的时钟源选择,直接配置CTRL寄存器的值。假设HCLK为72MHz,选用外部时钟源,那么SysTick的时钟即9MHz。这就意味着,SysTick的计数器VAL每减1代表时间过去了1/9us。

具体的定义在misc.c文件中。

void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource)
{
  /* Check the parameters */
  assert_param(IS_SYSTICK_CLK_SOURCE(SysTick_CLKSource));
  if (SysTick_CLKSource == SysTick_CLKSource_HCLK)
  {
    SysTick->CTRL |= SysTick_CLKSource_HCLK;
  }
  else
  {
    SysTick->CTRL &= SysTick_CLKSource_HCLK_Div8;
  }
}

SysTick_Config(uint32_t ticks) ,这是SysTick的初始化函数,时钟为HCLK,并开启SysTick中断。其中函数的参数表示两次中断之间时间间隔期间的SysTick周期,即两次中断之间有多少个SysTick周期。

具体的定义在core_cm3.h文件中。

static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{ 
  if (ticks > SysTick_LOAD_RELOAD_Msk)  return (1);            /* Reload value impossible */
                                                               
  SysTick->LOAD  = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;      /* set reload register */
  NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);  /* set Priority for Cortex-M0 System Interrupts */
  SysTick->VAL   = 0;                                          /* Load the SysTick Counter Value */
  SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk | 
                   SysTick_CTRL_TICKINT_Msk   | 
                   SysTick_CTRL_ENABLE_Msk;                    /* Enable SysTick IRQ and SysTick Timer */
  return (0);                                                  /* Function successful */
}

void SysTick_Handler(void),这是SysTick的中断服务函数。我们举一个例子,利用中断的方式实现delay延时函数,见下面的程序:

static __IO uint32_t TimingDelay;
void Delay(__IO uint32_t nTime)
{ 
   TimingDelay = nTime;
   while(TimingDelay != 0);
}
void SysTick_Handler(void)
{
    if (TimingDelay != 0x00) 
     { 
       TimingDelay--;
     }
}
 int main(void)
 {  …
    if (SysTick_Config(SystemCoreClock / 1000)) //systick时钟为HCLK,中断时间间隔1ms
     {
     while (1);
     }
    while(1)
     { Delay(200);//200ms
     … 
     }
}

Delay延时函数讲解

之前利用中断实现延时函数,但是一直使用中断会造成资源的浪费,不建议这样实现,我们利用查询的方式实现delay延时。下面主要介绍Delay延时函数的实现:

delay_init()

首先是delay_init(),延时初始化函数。利用Syst_CLKSourceConfig()函数选择SysTick时钟源,选择外部时钟(HCLK的1/8);同时初始化fac_us和fac_ms两个变量。

void delay_init()
{
	SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);	//选择外部时钟  HCLK/8
	fac_us=SystemCoreClock/8000000;	      //为系统时钟的1/8,实际上也就是在计算1usSysTick的VAL减的数目
	fac_ms=(u16)fac_us*1000;		//代表每个ms需要的systick时钟数,即每毫秒SysTick的VAL减的数目   
}

delay_ms()

其次,delay_ms(),此函数用来延时指定的ms。

此时要注意nms的范围,SysTick->LOAD为24位寄存器,所以最大延时为:nms<=0xffffff*8*1000/SYSCLK;SYSCLK单位为Hz,nms单位为ms。对72M条件下,nms<=1864。如果超出这个值,建议多次调用此函数来实现。

void delay_ms(u16 nms)
{	 		  	  
	u32 temp;		   
	SysTick->LOAD=(u32)nms*fac_ms;			//时间加载(SysTick->LOAD为24bit)
	SysTick->VAL =0x00;           //清空计数器
	SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;          //开始倒数  
	do
	{
		temp=SysTick->CTRL;
	}while((temp&0x01)&&!(temp&(1<<16)));	//等待时间到达,看CTRL的第16位(COUNTFLAG)是否为1,看STRL的第0位(ENABLE)是否为1   
	SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;       //关闭计数器
	SysTick->VAL =0X00;       //清空计数器	  	    
} 

这段代码其实就是先把延时的时间换算成SysTick的时钟周期数,然后写入LOAD寄存器。然后清空当前寄存器VAL的内容,再开启倒数功能。等倒数结束即延时了nms、最后关闭SysTick,清空VAL的值,实现一次延时的操作。

这里特别说一下,temp&0x01,这一句用来判断SysTick定时器是否还处在开启的状态,可以防止SysTick被意外关闭导致的死循环。

delay_us()

最后,delay_us(),此函数用来延时指定的us。具体的逻辑和上面一个函数类似,就不介绍了。

void delay_us(u32 nus)
{		
	u32 temp;	    	 
	SysTick->LOAD=nus*fac_us; 				//时间加载	  		 
	SysTick->VAL=0x00;        //清空计数器
	SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;          //开始倒数	  
	do
	{
		temp=SysTick->CTRL;
	}while((temp&0x01)&&!(temp&(1<<16)));	//等待时间到达   
	SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;       //关闭计数器
	SysTick->VAL =0X00;       //清空计数器	 
}

delay延时的相关函数在SYSTEM文件夹下的delay子文件夹,在使用delay_ms()或者delay_us()函数之前一定不要忘记先初始化delay_init()。

来源:CSDN,作者:Yngz_Miao,转载此文目的在于传递更多信息,版权归原作者所有。
原文:
https://blog.csdn.net/qq_38410730/article/details/79843806
版权声明:本文为博主原创文章,转载请附上博文链接!

围观 1098

标准的 51 单片机内部有 T0 和 T1 这两个定时器,T 就是 Timer 的缩写,现在很多 51 系列单片机还会增加额外的定时器,在这里我们先讲定时器 0 和 1。前边提到过,对于单片机的每一个功能模块,都是由它的 SFR,也就是特殊功能寄存器来控制。与定时器有关的特殊功能寄存器,有以下几个,大家不需要去记忆这些寄存器的名字和作用,你只要大概知道就行,用的时候,随时可以查手册,找到每个寄存器的名字和每个寄存器所起到的作用。

表 5-1 的寄存器是存储定时器的计数值的。TH0/TL0 用于 T0,TH1/TL1 用于 T1。

表 5-2 是定时器控制寄存器 TCON 的位分配,表 5-3 是则是对每一位的具体含义的描述。


大家注意在表 5-3 中的描述中,只要写到硬件置 1 或者清 0 的,就是指一旦符合条件,单片机将自动完成的动作,只要写软件置 1 或者清 0 的,是指我们必须用程序去完成这个动作,后续遇到此类描述就不再另做说明了。

对于 TCON 这个 SFR,其中有 TF1、TR1、TF0、TR0 这 4 位需要我们理解清楚,它们分别对应于 T1 和 T0,我们以定时器 1 为例讲解,那么定时器 0 同理。先看 TR1,当我们程序中写 TR1 = 1 以后,定时器值就会每经过一个机器周期自动加 1,当我们程序中写 TR1 = 0以后,定时器就会停止加 1,其值会保持不变化。TF1,这个是一个标志位,他的作用是告诉我们定时器溢出了。比如我们的定时器设置成 16 位的模式,那么每经过一个机器周期,TL1加 1 一次,当 TL1 加到 255 后,再加 1,TL1 变成 0,TH1 会加 1 一次,如此一直加到 TH1和 TL1 都是 255(即 TH1 和 TL1 组成的 16 位整型数为 65535)以后,再加 1 一次,就会溢出了,TH1 和 TL1 同时都变为 0,只要一溢出,TF1 马上自动变成 1,告诉我们定时器溢出了,仅仅是提供给我们一个信号,让我们知道定时器溢出了,它不会对定时器是否继续运行产生任何影响。

本节开头我们就提到了定时器有多种工作模式,工作模式的选择就由 TMOD 来控制,TMOD 的位分配和描述见表 5-4 到 5-6 所示,TMOD 的位功能如表 5-5 所示。



可能你已经注意到了,表 5-2 的 TCON 最后标注了“可位寻址”,而表 5-4 的 TMOD 标注的是“不可位寻址”。意思就是说:比如 TCON 有一个位叫 TR1,我们可以在程序中直接进行 TR1 = 1 这样的操作。但对 TMOD 里的位比如(T1)M1 = 1 这样的操作就是错误的。我们要操作就必须一次操作这整个字节,也就是必须一次性对 TMOD 所有位操作,不能对其中某一位单独进行操作,那么我们能不能只修改其中的一位而不影响其它位的值呢?当然可以,在后续课程中你就会学到方法的,现在就先不关心它了。

表 5-6 列出的就是定时器的 4 中工作模式,其中模式 0 是为了兼容老的 8048 系列单片机而设计的,现在的 51 几乎不会用到这种模式,而模式 3 根据我的应用经验,它的功能用模式 2 完全可以取代,所以基本上也是不用的,那么我们就重点来学习模式 1 和模式 2。

模式 1,是 THn 和 TLn 组成了一个 16 位的定时器,计数范围是 0~65535,溢出后,只要不对 THn 和 TLn 重新赋值,则从 0 开始计数。模式 2,是 8 位自动重装载模式,只有 TLn做加 1 计数,计数范围 0~255,THn 的值并不发生变化,而是保持原值,TLn 溢出后,TFn就直接置 1 了,并且 THn 原先的值直接赋给 TLn,然后 TLn 从新赋值的这个数字开始计数。这个功能可以用来产生串口的通信波特率,我们讲串口的时候要用到,本章节我们重点来学习模式 1。为了加深大家理解定时器的原理,我们来看一下他的模式 1 的电路示意图 5-2。

图 5-2 定时器/计数器模式 1 示意图

我带领大家一起来分析一遍这个示意图,日后如果再遇到类似的图,大家就可以自己研究了。OSC 框表示时钟频率,因为 1 个机器周期等于 12 个时钟周期,所以那个 d 就等于 12。下边 GATE 右边的那个门是一个非门电路,再右侧是一个或门,再往右是一个与门电路,大家可以对照一下 5-1 节的内容。

图上可以看出来,下边部分电路是控制了上边部分,那我们先来看下边是如何控制的,我们以定时器 0 为例。

1) TR0 和下边或门电路的结果要进行与运算,TR0 如果是 0 的话,与运算完了肯定是 0,所以如果要让定时器工作,那么 TR0 就必须置 1。

2) 这里的与门结果要想得到 1,那么前面的或门出来的结果必须也得是 1 才行。在 GATE位为 1 的情况下,经过一个非门变成 0,或门电路结果要想是 1 的话,那 INT0 即 P3.2 引脚必须是 1 的情况下,这个时候定时器才会工作,而 INT0 引脚是 0 的情况下,定时器不工作,这就是 GATE 位的作用。

3) 当 GATE 位为 0 的时候,经过一个非门会变成 1,那么不管 INT0 引脚是什么电平,经过或门电路后都肯定是 1,定时器就会工作。

4) 要想让定时器工作,就是自动加 1,从图上看有两种方式,第一种方式是那个开关打到上边的箭头,就是 C/T = 0 的时候,一个机器周期 TL 就会加 1 一次,当开关打到下边的箭头,即 C/T =1 的时候,T0 引脚即 P3.4 引脚来一个脉冲,TL 就加 1 一次,这也就是计数器功能。

本文转自:微信号 - gongyebang(工业帮PLC教育机构),转载此文目的在于传递更多信息,版权归原作者所有。

围观 371

在单片机的学习过程中,单片机定时器的合理设置和应用是非常关键的一步,也是刚开始接触单片机知识的新人工程师们比较容易出错误的一个环节之一。在今天的文章中,我们为大家总结了单片机定时器应用过程中的两大常见问题进行实时解析,希望能够对各位新人工程师的学习提供一定帮助。

问题一:51单片机的T0、T1定时器四种工作方式各有什么特点?

在单片机定时器的应用过程中,定时器在进行设置时会有四种不同的工作方式,合理选择相应的工作方式可以帮助工程师快速完成及时设置。

下面我们就来逐一讲解一下这四种不同的计时方式。
方式0是单片机计时器的第一种计时方式,这一方式13位计数模式。方式1则采用16位计数模式,方式2采用8位自动重装入计数模式,这两种技术模式也是目前在单片机应用过程中最常使用的及时方式。最后一种单片机定时器的计时方式是方式3,这一模式下只有T0有的双8位计数模式。

问题二:在设置单片机定时器的过程中出现了错误,应该怎么进行误差纠正?

在使用单片机定时器进行计时设置的过程中,出现设置错误的情况是在所难免的,这就需要我们采取一些方法对已经造成的错误进行纠正了。由于单片机的机器周期通常为1μs~2μs,因此定时误差一般应在0μs~20μs之内,对于一般应用,此误差可以忽略,但是对于精确度要求比较高的应用场合,此误差必须进行校正。定时误差是定时溢出后转入执行定时处理语句段之间所耗费的时间,此时间主要由定时溢出转入定时处理语句段所必须执行的指令或硬件过程产生。

定时误差校准的一个比较简单的方法式,在定时溢出响应后,立刻停止定时器的计数工作,同时快速读出当时计数值,然后将完成这一任务的程序段执行时间考虑进去,作为修正因子校正定时初值,以下程序段以中断处理方式为例来进行说明。需要注意的是,由于执行从指令clrTR0(停止计数)到指令setbTR0(重新开启计数)之间的指令需8个机器周期,应将此消耗考虑进去,因此该程序将定时误差缩小在1个机器周期内。

这一纠正程序的设计如下图所示:

以上就是本文针对单片机定时器使用过程中常见的两种问题,所进行的分享和解析,希望能够对各位新人工程师的单片机学习提供一定的帮助。

来源:玩转单片机、网络

围观 328

页面

订阅 RSS - 定时器