zoukankan      html  css  js  c++  java
  • 打打基础,回头看看avr单片机的定时器、中断和PWM(转)

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

    先提提中断:我的理解就是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为上升沿驱动(外部):用于对外部信号的计

        *2上面的计数结果放在计数寄存器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即为高电平的时间(确定占空比)如图
    打打基础,回头看看avr单片机的定时器、中断和PWM
    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

    相位修正其实和上面的方法相同,只不过到最大值时,不是取反,而是计数--,直到到了下限时取反打打基础,回头看看avr单片机的定时器、中断和PWM

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

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

    相位频率修正PWM 

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

  • 相关阅读:
    使用python内置模块os和openpyxl搜索指定文件夹下Excel中的内容
    python实现DNA序列字符串转换,互补链,反向链,反向互补链
    PandaSeq安装报错ltld required, install libtool library
    使用MySQL客户端登录Ensemble数据库查询相关信息
    第118天:移动端开发——视口
    第117天:Ajax实现省市区三级联动
    第116天: Ajax运用artTemplate实现菜谱
    第115天:Ajax 中artTemplate模板引擎(一)
    第114天:Ajax跨域请求解决方法(二)
    第113天:Ajax跨域请求解决方法
  • 原文地址:https://www.cnblogs.com/zhugeanran/p/8541336.html
Copyright © 2011-2022 走看看