以前小看了定时器,发现这东西还真的很讲究,那先复习复习吧。

先提提中断:我的理解就是cpu执行时,遇到中断——根据对应的中断源(硬件或软件)——pc定位中断入口地址,然后根据这里的函数指针——跳转到相应的服务程序

之所以上面()了硬件或软件,这里还涉及到向量中断和非向量中断:区别就在于确定中断源,如果是硬件编码了中断源的,直接跳转相应的服务函数则是向量中断。而非向量中断指的是:如果发生中断了,但此时还不清楚是那个中断,需要查找标志位来确定跳转到那个中断区域。

可以发现向量中断肯定来的快些,这里为定时器的中断来做好准备。

再来看看avr单片机的定时器:

定时器/计数1(16位)————分为普通模式,CTC模式,快速pwm模式,相位修正pwm模式,相位频率修正pwm模式,输入捕获模式。

普通模式:

*1 寄存器TCCR1B (控制寄存器)

7          6         5           4            3           2           1          0

ICNC1      ICES1     -          WGM13        WGM12      CS12       CS11        CS10

CS12  CS11 CS10控制分频(内:预分频器):取值0-5对应了停止,无分频,8,64,256,1024

当为110为下降沿驱动,111为上升沿驱动(外部):用于对外部信号的计数

上面的计数结果放在计数寄存器TCNT1,TCNT0中(高低8位)

*3中断屏蔽寄存器(TIMSK)

OCIE2      TOIE2      TICIE1   OCIE1A    OCIE1B    TOIE1     OCIE0      TOIE0

TOIE1 :设置为溢出中断,置1

嘿嘿,有了上面的3个寄存器就可以做秒表等了——思路为:设定控制寄存器(内分频,还是外部计数?)——装初值——设置中断方式(这里用了溢出)——打开中断

注意点:装初值时需要先写高位TCNT1,再写低位TCNT0,读时相反

TCCR1B=0x01;无分频

TCNT1H=0x88;

TCNT1L=0x88;TIMSK|=BIT(2); 再开中断 SREG|=bit(7);  这样初始化oK!

由于avr不像51无int code等之类定义的方法,用的是#pragma data:code   底下为存储的内容

写中断也类似:#pragma interrupt_handler  (中断函数名:向量号)miao:9 (现在该理解向量中断吧)

写好申明后就写函数体了 void miao(){中断服务程序}

这样作为普通用法就小功告成了

总结一下就是模式,初值,中断 (对应的3个寄存器)  和具体C函数的写法

CTC模式比较输出模式: 用于输出50%占空比的方波信号,用于产生准确的连续定时信号

硬件:对应了pd4,pd5输出比较b和a

比较输出
  *1 寄存器TCCR1A(控制寄存器)  功能多了寄存器也分a、b了^_^

7          6         5           4            3           2           1          0

com1A1     COM1A0    com1B1     COM1B0        FOC1A       FOC1B       WGM11       WGM10

用到了4567和01     4、5控制b  6、7控制a

com1A(B)1   COM1A(B)0      一般用00和01          WGM11,WGM10放在底下讲

0          0         普通i/0

0          1         比较匹配时输出取反

1          0         比较匹配时输出0

1          1         比较匹配时输出1

*2 寄存器TCCR1B (控制寄存器)

7          6         5           4            3           2           1          0

ICNC1      ICES1     -          WGM13        WGM12      CS12       CS11        CS10

CS12、CS11、CS10为设置时钟源的

WGM13,WGM12,WGM11,WGM10用于波形产生描述的位选择,有对应的表0-15  这里选了4:CTC-OCR1A-立即更新-最大     OCR1A (16位)输出比较寄存器-这里存放了上限值

设置的目的是,计数上升到了设定的上限后就电平取反

思路:先初始话,对应的复用i/o为输出——设定com1A(B)1,COM1A(B)0 为比较输出取反——设定上限值为ocr1A   就ok了

0CR1A可以根据公式计算:具体公式看手册,这里因为我打不起来 o(∩_∩)o...哈哈

  总结一下就是控制寄存器a,b以及上限的值即可产生方波

快速PWM

   分8位9位10位快速pwm,以及自定义方式

我的理解:OCR1A存放上限值,这样用上了A的功能,由上面可知A只能为方波了,且计数到这个值时取反

下限值通过OCR1B来确定的,从而计数到这个值置0,从而可以发现在一个周期内 OCROB即为高电平的时间(确定占空比)如图

TCCR1A=0x63;TCCR1B=0x1B;   工作方式(快速pwm15,64分频)和分频系数

OcR1A=1249;OCCR1B=250;     设为100Hz PWM信号,和2毫秒的高电平时间

总结一下就是控制寄存器:由上限值,和分频系数可以确定计数的时间,确定频率

                         由下限值可以确定占空比

  怎么样?明白了吗?o(∩_∩)o...

相位修正PWM

和快速pwm一样,模式分8位9位10位快速pwm,以及自定义方式共5种对应123和10,11

相位修正其实和上面的方法相同,只不过到最大值时,不是取反,而是计数--,直到到了下限时取反

由上可以发现2图的区别吧,一个为到TOP后,直接置0,后者为--,且在top不取反而是到了最小值是取的,周期故而也比快速的长了一倍,故频率为快速pwm的一半,但是占空比不变,这也是为什么叫快速pwm的原因
TCCR1A=0x63;TCCR1B=0x13    工作方式(相位修正pwm11,64分频)和分频系数

OcR1A=1249;OCCR1B=250;     设为100Hz PWM信号,和2毫秒的高电平时间

相位频率修正PWM

和相位修正的类似
输入捕获

打打基础,回头看看avr单片机的定时器、中断和PWM(转)的更多相关文章

  1. AVR单片机教程——定时器中断

    本文隶属于AVR单片机教程系列.   中断,是单片机的精华. 中断基础 当一个事件发生时,CPU会停止当前执行的代码,转而处理这个事件,这就是一个中断.触发中断的事件成为中断源,处理事件的函数称为中断 ...

  2. 合宙AIR105(三): 定时器, 定时器中断和PWM输出

    目录 合宙AIR105(一): Keil MDK开发环境, DAP-Link 烧录和调试 合宙AIR105(二): 时钟设置和延迟函数 合宙AIR105(三): 定时器, 定时器中断和PWM输出 Ai ...

  3. linux下avr单片机开发:中断服务程序

    不管是什么单片机程序,中断总是非常重要的一部分 ,linux 下的avr开发,主要是依靠avr-gcc,以及avr-libc,它们对中断程序的格式要求,与window下的icc-avr以及win-av ...

  4. 用STM32定时器中断产生PWM控制步进电机

    控制步进电机可以使用PWM.定时器中断.延时,这里用的就是定时器中断来让它转动. 一.硬件部分1.使用的硬件板子用的是正点原子的STM32F103 mini板,驱动器是DM420(DM420驱动器资料 ...

  5. 51单片机实现定时器中断0-F

    #include <reg51.h> #define uint unsigned int #define uchar unsigned char sfr P0M0 = 0x94; sfr ...

  6. 单片机成长之路(avr基础篇)- 003 AVR单片机的BOOT区

    BOOT区的由来基于一个简单的道理,即单片机的程序是保存在FLASH中的,要运行程序就必须不停的访问FLASH存储器.对于一般的FLASH存储器,数据的写入需要一定的时间来完成,在数据写入完成之前,存 ...

  7. 51,PIC,AVR单片机它们的优点缺点都有哪些?

    我有幸接触了几款单片机,并用它们做了一些项目.现在想做个小总结,谈一下自己用各种单片机的感受.仅是个人意见,仁者见仁智者见智. 传统51,我想我就不多说了,适合菜鸟入门,容易上手,价格一般(从性价比方 ...

  8. AVR单片机教程——小结

    本文隶属于AVR单片机教程系列.   第一期挺让我失望的,是我太菜,没有把想讲的都讲出来.经常写了很多,然后一点一点删掉,最后就没多少了. 而且感觉难度不合适,处于很尴尬的位置.讲得简单,难的丢给库, ...

  9. AVR单片机教程——UART进阶

    本文隶属于AVR单片机教程系列.   在第一期中,我们已经开始使用UART来实现单片机开发板与计算机之间的通信,但只是简单地讲了讲一些概念和库函数的使用.在这一篇教程中,我们将从硬件与软件等各方面更深 ...

随机推荐

  1. unity5, import fbx注意事项

    一,模型尺寸. unity中是以米为单位,要想让3dmax中建的模型导入到unity中与unity自带的3d object尺寸一致,最直接的办法是将3dmax中的系统单位也设成米. 菜单->自定 ...

  2. 并发登录人数控制--Shiro系列(二)

    为了安全起见,同一个账号理应同时只能在一台设备上登录,后面登录的踢出前面登录的.用Shiro可以轻松实现此功能. shiro中sessionManager是专门作会话管理的,而sessinManage ...

  3. 字符串函数---itoa()函数具体解释及实现

    itoa()函数 itoa():char *itoa( int value, char *string,int radix); 原型说明: value:欲转换的数据. string:目标字符串的地址. ...

  4. Linux下编译、使用静态库和动态库 自己测过的

    每个程序实质上都会链接到一个或者多个的库.比如使用C函数的程序会链接到C运行时库,GUI程序会链接到窗口库等等.无论哪种情况,你都会要决定是链接到静态库(static libary)还是动态库(dyn ...

  5. github提交一个空目录

    github默认不上传空目录,有的时候需要空目录来保持程序的结构. 二个小问题. 1.始终保持空目录,即时里面有文件,也全部忽略掉. 建立一个.gitignore文件放到空目录内. mkdir emp ...

  6. redhat yum替换成CentOS yum 并修改源

    wget http://mirrors.163.com/centos/6/os/x86_64/Packages/python-iniparse-0.3.1-2.1.el6.noarch.rpm wge ...

  7. VBA 获得绝对地址控制焦点的设置

    先上代码,有时间再补上说明. Dim Mefoucs As String MsgBox "你选定的当前单元格是:" & Selection.Address Mefoucs ...

  8. Amazon EC2云端服务器的使用方法

    Amazon的EC2服务器可以理解为虚拟机,不过它是不需要安装系统的,它是根据镜像自动创建的.在申请EC2的时候,可以选择操作系统的类型,如Redhat Enterprise 6或ubuntu 12等 ...

  9. [转][Python基础]Python中的Lambda表达式

    引用自:http://www.cnblogs.com/evening/archive/2012/03/29/2423554.html 在学习python的过程中,lambda的语法时常会使人感到困惑, ...

  10. Cocos2d-x 3.1.1 学习日志7--7分钟让你了解cocos2d-x3.1.1 Sprite精灵类

    精灵(Sprite)是游戏里面的角色,比方敌人.游戏里面运动的物体等等,所以精灵是游戏里面一个很常见的概念.差点儿无处不在. 在Cocos2D-x里面精灵是用Sprite类来进行表示的,它能够用一张图 ...