• Cortex-A9 PWM Timer


    PWM定时器

           4412时钟为我们提供了PWM定时器,在4412中共有5个32位的定时器,这些定时器可发送中断信号给ARM子系统。另外,定时器0、1、2、3包含了脉冲宽度调制(PWM),并可驱动其拓展的I/O。PWM对定时器0有可选的dead-zone功能,以支持大电流设备。要注意的是定时器4是内置不接外部引脚的。一般用于定时器功能。

          定时器0与定时器1共用一个8位预分频器,定时器2、定时器3与定时器4共用一另一个8位预分频器,每个定时器都有一个时钟分频器,时钟分频器有5种分频输出(1/2、1/4、 1/8 、1/16和外部时钟TCLK)。另外,定时器可选择时钟源,定时器0-4都可以选择外部的时钟源,如PWM_TCLK。

         当时钟被使能后,定时器计数缓冲寄存器(TCNTBn)把计数器初始值下载到递减计数器中。定时器比较缓冲寄存器(TCMPBn)把其初始值下载到比较寄存器中,并将该值与递减计数器的值进行比较。当递减计数器和比较寄存器值相同时,输出电平翻转。递减计数器减至0后,输出电平再次翻转,完成一个输出周期。这种基于TCNTBn和TCMPBn的双缓冲特性使定时器在频率和占空比变化时能产生稳定的输出。

          每个定时器都有一个专用的由定时器时钟驱动的16位递减计数器。当递减计数器的计数值达到0时,就会产生定时器中断请求来通知CPU定时器操作完成。当定时器递减计数器达到0的时候,如果设置了Auto-Reload 功能,相应的TCNTBn的值会自动重载到递减计数器中以继续下次操作。然而,如果定时器停止了,比如在定时器运行时清除TCON中定时器使能位,TCNTBn的值不会被重载到递减计数器中。

         TCMPBn 的值用于脉冲宽度调制(PWM)。当定时器的递减计数器的值和比较寄存器的值相匹配的时候,定时器控制逻辑将改变输出电平。因此,比较寄存器决定了PWM 输出的开关时间。

    PWM定时器的特点

    1. 5个32位定时器;
    2. 2个8位PCLK分频器提供一级预分,5个2级分频器用来预分外部时钟;
    3. 可编程选择PWM独立通道。
    4. 4个独立的可编程的控制及支持校验的PWM通道。
    5. 静态配置:PWM停止;
    6. 动态配置:PWM启动;
    7. 支持自动重装模式及触发脉冲模式;
    8. 一个外部启动引脚。
    9. 两个PWM输出可带Dead-Zone 发生器。
    10. 中断发生器。

    相关寄存器

    1、定时器配置寄存器0(TFCG0)

     电平变化死区及预分频设置

    2、定时器配置寄存器1(TCFG1)

    主要用于PWM定时器的MUX输入(二级分频)

     3、定时时间以及栈空比设置

     

    4412的PWM定时器具有双缓冲功能,能在不停止当前定时器运行的情况下,重载定时器下次运行的参数。所以尽管新的定时器的值被设置好了,但是当前操作仍能成功完成。

    定时器的值可以被写入定时器n 计数缓冲寄存器(TCNTBn),当前的计数器的值可以从定时器计数观察寄存器(TCNTOn)读出。读出的TCNTBn值并不是当前的计数值,而是下次将重载的计数值。

    TCNTn的值等于0的时候,自动重载操作把TCNTBn的值装入TCNTn,只有当自动重载功能被使能并且TCNTn 的值等于0的时候才会自动重载。如果TCNTn等于0,自动重载控制位为0,则定时器停止运行。


    使用手动更新位(Manual Update)和反转位(Inverter)完成定时器的初始化。当递减计数器的值达到0的时候会发生定时器自动重载操作,所以TCNTn的初始值必须由用户提前定义好,在这种情况下就需要手动更新位重载初始值。一下几个步骤给出如何启动定时器。

    1. 向TCNTBn 和 TCMPBn写入初始值。
    2. 置位相应定时器的手动更新为,不管是否使用翻转功能,推荐设置反转位。
    3. 置位相应定时器的启动位启动定时器,清除手动更新位。

    如果定时器被强制停止,TCNTn保持原来的值而不是TCNTBn的重载值。如果要设置一个新的值,必须执行手动更新操作。

     

    下面是一个实例:

    原理图

     

    头文件:

    /* Exynos4412.h */
    typedef struct {       unsigned int    TCFG0;       unsigned int    TCFG1;       unsigned int    TCON;       unsigned int    TCNTB0;       unsigned int    TCMPB0;       unsigned int    TCNTO0;       unsigned int    TCNTB1;       unsigned int    TCMPB1;       unsigned int    TCNTO1;       unsigned int    TCNTB2;       unsigned int    TCMPB2;       unsigned int    TCNTO2;       unsigned int    TCNTB3;       unsigned int    TCMPB3;       unsigned int    TCNTO3;       unsigned int    TCNTB4;       unsigned int    TCNTO4;       unsigned int    TINT_CSTAT;   }pwm;   #define PWM (* (volatile pwm *)0x139D0000)
    #include"exynos_4412.h"
    
    /*占空比 = 高电平时间 / 周期*/
    
    void delay_ms(unsigned int Time)
    {
        unsigned int i,j;
        for(i=0;i<Time;i++)
            for(j=0;j<3000;j++);
    }
    
    int main()
    {
        /*1.将GPD0_0设置成PWM(TOUT0)功能  GPD0CON[3:0]*/
        GPD0.CON = GPD0.CON & (~(0xF)) | (0x2);
        /*2.设置Timer0的一级预分频  TCFG0[7:0]  频率 = 100M/(99+1)=1M*/
        PWM.TCFG0 = PWM.TCFG0 & (~(0xFF)) | (99);
        /*3.设置Timer0的二级预分频  TCFG1[3:0]  递减计数器频率 = 100M/(99+1)/1=1M*/
        PWM.TCFG1 = PWM.TCFG1 & (~(0xF));
        /*4.设置Timer0的为自动重装载  TCON[3]*/
        PWM.TCON = PWM.TCON | (1<<3);
        /*5.设置Timer0的周期  TCNTB0*/
        PWM.TCNTB0 = 1000;
        /*6.设置Timer0的高电平时间  TCMPB0*/
        PWM.TCMPB0 = 500;
        /*7.手动的将TCNTB0中的值更新到递减计数器  TCON[1]*/
        PWM.TCON = PWM.TCON | (1<<1);
        /*8.关闭手动更新  TCON[1]*/
        PWM.TCON = PWM.TCON & (~(1<<1));
        /*9.使能递减计数器开始倒计时  TCON[0]*/
        PWM.TCON = PWM.TCON | 1;
        while(1)
        {
            PWM.TCNTB0 = 1000;
            PWM.TCMPB0 = 500;
            delay_ms(500);
            PWM.TCNTB0 = 500;
            PWM.TCMPB0 = 250;
            delay_ms(500);
        }
        return 0;
    }
  • 相关阅读:
    FZU 2105 (线段树)
    HDU 4903 (模拟+贪心)
    Codeforces Beta Round #91 (Div. 1 Only) E. Lucky Array
    HDU 3308 (线段树区间合并)
    POJ 3667(线段树区间合并)
    线段树题集 (cf版)
    HDU 4902 (牛叉的线段树)
    20150204--JS巩固与加强2-01
    20150203+JS巩固与加强1-02
    20150203+JS巩固与加强1-01
  • 原文地址:https://www.cnblogs.com/chen-farsight/p/6091264.html
Copyright © 2020-2023  润新知