历史上的今天
返回首页

历史上的今天

今天是:2024年12月18日(星期三)

正在发生

2019年12月18日 | AVR单片机定时计数器学习笔记分享

2019-12-18 来源:elecfans

  定时计数器的结构与应用定时计数器(Timer/Counter)常用于计数、延时、测量 周期、频率、脉宽、提供定时脉冲信号等。在实际应用中,对于转速,位移、速度、流量等物理量的 测量,通常也是由传感器转换成脉冲电信号,通过使用定时计 数器来测量其周期或频率,再经过计算处理获得。


  AVR的定时计数器接口功能: 通过定时计数器与比较匹配寄存器相互配合,生成占空比 可变的方波信号,即脉冲宽度调制输出PWM信号,可用于 D/A、马达无级调速控制、变频控制等。本文主要介绍的是AVR单片机定时/计数器学习笔记,具体的跟随小编来了解下。

  AVR单片机定时计数器学习笔记分享

  AVR单片机定时/计数器学习笔记

  定时/计数器1(16位)有普通模式、CTC模式、快速PWM模式、相位修正PWM模式等工作模式。

  1、普通模式(设为溢出中断工作方式,向量号为9)

  工作原理:在设定的时钟频率下,计数寄存器由初值逐次加1,当达到计数最大值(65535)时,溢出,执行中断子程序。

  需要配置的寄存器:T/C1控制寄存器B(TCCR1B)、计数寄存器(TCNT1H和TCNT1L)、T/C1中断屏蔽寄存器(TIMSK)。

  (1)由TCCR1B的bit2、bit1、bit0设置时钟频率(有内部和外部)

  (2)由TCNT1H和TCNT1L设置计数初值(注意应先写H,再写L)

  (3)由TIMSK的bit2设置中断使能(注意最后还应开启总中断SREG|=BIT(7))

  编程时中断的声明 #pragma interrupt_handler 中断函数名:中断向量号

  注意:在中断子程序中,应该再次装入计数初值,因为进入中断时计数初值变成了0。


  2、CTC模式(需要用到OC1A、OC1B两个引脚)

  应用:用于产生占空比为50%的方波信号

  AVR单片机定时计数器学习笔记分享

  ( N为分频系数 )

  需要配置的寄存器:T/C1控制寄存器A(TCCR1A)、T/C1控制寄存器B(TCCR1B)、输出比较寄存器1A(OCR1A)。

  (1)TCCR1A的bit7、bit6用于设置OC1A脚的比较输出模式,bit5、bit4用于设置OC1B脚的比较输出模式。(此处我们都设为,比较匹配时OC1A、OC1B电平取反)

  (2)TCCR1B的bit4、bit3和TCCR1A的bit1、bit0组合来设置波形产生模式。(此处我们设为模式4—CTC模式)

  (3)TCCR1B的bit2、bit1、bit0设置时钟频率。

  (4)OCR1A用来设置计数的上限值


  例程:

  #include 《iom16v.h》

  #include 《macros.h》

  void main()

  {

  DDRD|=0X30; //PD4、PD5设为输出

  TCCR1A=0X50; //比较匹配时取反

  TCCR1B=0X09; //CTC模式,无预分频

  OCR1A=1999; //OC1A、OC1B均产生2KHz的方波信号(系统时钟为8MHz)

  }


  3、快速PWM模式(需要用到OC1A、OC1B两个引脚)

  前提:由TCCR1B的bit4、bit3和TCCR1A的bit1、bit0组合来设置波形产生模式为模式15(快速PWM)。

  AVR单片机定时计数器学习笔记分享

  (1)TCCR1A的bit7、bit6用于设置OC1A脚的比较输出模式,bit5、bit4用于设置OC1B脚的比较输出模式。(此处我们设为,OC1A比较匹配时取反;OC1B比较匹配时清零,TOP时置位)

  (2)TCCR1B的bit2、bit1、bit0设置时钟频率。

  (3)OCR1A用来设置计数的上限值,OCR1B用来设置计数的匹配值


  例程1:

  #include 《iom16v.h》

  #include 《macros.h》

  void main()

  {

  DDRD|=0X30;

  TCCR1A=0X63; //15模式,OC1B比较匹配时清零,TOP时置1;OC1A匹配时取反

  TCCR1B=0X1B; //64预分频

  OCR1A=1249; //上限值,OC1B输出100Hz;OC1A输出50Hz方波

  OCR1B=250; //匹配值,OC1B输出占空比为20%

  }

  例程2:

  #include《iom16v.h》

  #include《macros.h》

  //产生38KHz 占空比为50%的信号

  void main()

  {

  DDRD|=0X30;

  TCCR1A=0X23; //配置寄存器,OC1A作为普通IO口;OC1B比较匹配时清零,TOP时置1

  TCCR1B=0X19; //15模式,无预分频

  OCR1A=209; //上限值,得到38KHz的PWM信号(OC1B口)

  OCR1B=104; //匹配寄存器,2分之1的占空比

  }

  例程3:

  #include《iom16v.h》

  #include《macros.h》

  //产生1Hz 占空比为50%的信号

  void main()

  {

  DDRD|=0X30;

  TCCR1A=0X23; //配置寄存器,OC1A作为普通IO口;OC1B比较匹配时清零,TOP时置1

  TCCR1B=0X1D; //15模式,1024预分频

  OCR1A=7811; //上限值,得到1Hz的PWM信号(OC1B口)

  OCR1B=3905; //匹配寄存器,2分之1的占空比

推荐阅读

史海拾趣

Advanced_Linear_Devices_Inc.公司的发展小趣事

在电子行业的快速发展中,ALD以其创新的CMOS技术崭露头角。1985年,公司创立之初,便致力于研发小功率线性集成电路,为线性工程师提供标准产品和定制方案。经过团队的不懈努力,ALD成功开发出了一系列具有高精度和低功耗特点的CMOS线性集成电路,这些产品在工业控制、电子仪器等领域得到了广泛应用,为公司的快速发展奠定了坚实基础。

Hirel Systems Ltd公司的发展小趣事

在集成电路的封装领域,ALD同样展现出了强大的创新能力。公司不仅提供了塑封、PDIP、小型装(SOIC)等常见的封装形式,还开发出了密封陶瓷封装(CDIP)等高性能封装技术。这些封装技术不仅提高了集成电路的可靠性和稳定性,还降低了生产成本,为客户提供了更具竞争力的产品。

CHINFA公司的发展小趣事

CHINFA公司的创立并非一帆风顺。在创业初期,公司面临着资金短缺、技术落后和市场竞争激烈等多重困难。然而,公司的创始人凭借对电子行业的深厚热爱和坚定信念,带领团队克服了一个又一个难关。他们通过自主研发、技术创新和市场拓展,逐渐在行业中崭露头角。

Formosa MS公司的发展小趣事

作为一家有社会责任感的企业,CHINFA公司始终关注社会公益事业。公司积极参与扶贫济困、捐资助学等公益活动,为社会做出了积极贡献。同时,公司还注重员工培训和福利保障,为员工提供了良好的工作环境和发展机会。这种对社会责任的担当和履行,使CHINFA公司赢得了社会各界的广泛认可和尊重。

这五个故事只是CHINFA公司发展历程中的一部分,但它们却充分展示了公司在电子行业中的坚韧不拔、追求卓越的精神风貌。相信在未来的发展中,CHINFA公司将继续书写更加辉煌的篇章。

Cristek Interconnects Inc公司的发展小趣事

面对日益复杂的供应链环境,Cristek Interconnects Inc公司进行了深入的供应链优化。公司与多家优质供应商建立了长期稳定的合作关系,确保了原材料的稳定供应和质量可靠。同时,公司还引入先进的供应链管理系统,提高了供应链的透明度和效率,为公司的快速发展提供了有力保障。

Chemtronics公司的发展小趣事

自1958年成立以来,Chemtronics公司在电子维护和维修领域不断进取。最初,公司专注于生产一系列清洁剂产品,以其高效清洁能力获得了市场的认可。随着时间的推移,Chemtronics逐渐将产品线扩展至超纯溶剂、净化室级别擦拭棒和擦拭布等领域,进而又扩展到电子电气和电信工业的精密返工和维修工具。这一转变不仅体现了公司对市场需求的敏锐洞察,也彰显了其不断创新的精神。

问答坊 | AI 解惑

51单片机C语言控制与应用教程

51单片机C语言控制与应用教程,很好的,初学者用…

查看全部问答>

难题请教,51从外部flash的FFFD地址启动?怎么做啊

我有一颗芯片 ip210w由 8051内核和一个MAC组成 芯片手册有一句话:CPU starts up and runs instructions at address 0xFFFD of external Flash. 就是这句话把我郁闷了好久,怎么烧程序都不行。CPU都跑不起来。 请教高手如何让我的CPU跑起来,谢 ...…

查看全部问答>

程序执行时间问题

问个VC问题  (应用程序通过pci采集板读数据) 应用程序的WM_TIMER在电脑刚开机(开机2,3分钟左右)会被阻塞吗? 我有段定时器(100ms)的执行程序,我想知道这段程序的执行时间。开始time1=GetTickCount(),末尾time=GetTickCount()-ti ...…

查看全部问答>

不能捕捉到CArchiveException 请各路英雄指教

大家好, 最近我遇到一个问题,在我的应用程序中(MFC工程), 里面有一句代码,是对文件读写的,如果这儿有一个空文件(里面什么内容也没有), 但我们又对它进行了读操作(调用CArchive >>进行读出),那么这儿一定会有个 CArchiveException异 ...…

查看全部问答>

MC45 GPRS模块如何实现自动重连 总是在线???

1.如题 ```` 2.还有就是如果一段时间没有数据传输 是不是就自动断开了? 3.断开后就可以继续发AT指令了么? 4.谢谢。。。。。…

查看全部问答>

EVC4.0编译后生成的EXE在目标板上执行 出错 乱码

1、开始我使用的共享MFC库出错,后来我使用的静态MFC库,不出错了,,,但我在PB里已经向目标板加上了MFC组件,不知道为什么出错 2、我生成的EXE文件里如果有中文会显示乱码,不如应该如何解决 先谢谢了…

查看全部问答>

WIN CE开发问题启蒙,希望得到帮助

谁有好的WIN CE的书籍或课程视频资料,介绍一下,我用VS2005的!最好都有链接地址,可以看看,简介也好!…

查看全部问答>

今天调试板子,发现不法连接

今天调试板子,发现无法连接。第一个想到的是电源电压(焊DSP之前有测过电压都是对的)。 把所有的电容测了,发现RTS管脚处,用了一个RC 滤波电路。C上电压变成2.75V。去掉电容,DSP可连接。 将原本的4.7K,电阻换小后,电压上抬到3V左右。DSP工 ...…

查看全部问答>

求助:任务ready不执行?

求助:建立了一个任务,就是不停进行打开、写、关闭、删除文件的操作,处于ready的状态,同时只有tShell处于ready状态,但spy后发现没有任何任务占用tick时间,中断也没有。该任务没执行。 出现这种情况是在建立任务后,在任务中输入i等指令后,就 ...…

查看全部问答>

自己总结的ucos引发任务调度的情况,求补充,求拍砖

1.最基本的:系统开始运行OSStart()会引发一次调度 2.创建一个新任务时,如果此时系统在运行状态,则引发一次调度。3.某任务调用挂起函数挂起自己后引发一次调度。 4.调用恢复任务函数OSTaskResume()引发一次调度。 5.任务延时时,引发一次 ...…

查看全部问答>