欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

第5章 ARM PWM

程序员文章站 2022-06-08 20:39:26
...

5.1PWM概述

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

第5章 ARM PWM

图 1 PWM TIMER Clock Tree Diagram

5.2相关寄存器

5.2.1定时器配置寄存器0(TCFG0)

表1 TFCG0

第5章 ARM PWM

Timer Input Clock Frequency = PCLK/({prescaler value + 1})/{divider value}
{prescaler value} = 1 to 255
{divider value} = 1, 2, 4, 8, 16
Dead zone length = 0 to 254
NOTE: If deadzone length is set as “n”, real Dead Zone length is “n + 1” (n = 0 to 254)

5.2.2定时器配置寄存器1(TCFG1)

主要用于PWM定时器的MUX输入。

表2 TCFG1

第5章 ARM PWM

5.2.3 TCNTB0

表3 TCNTB0

第5章 ARM PWM

5.2.4 TCMPB0

表4 TCMPB0

第5章 ARM PWM

5.2.5 TCNTO0

表5 TCNTO0

第5章 ARM PWM

5.2.6 TCON

表6 TCON

第5章 ARM PWM第5章 ARM PWM

5.3 PWM程序设计

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的重载值。如果要设置一个新的值,必须执行手动更新操作。

第5章 ARM PWM

图2蜂鸣器电路图

该开发板的蜂鸣器是无源蜂鸣器,所有我们不能用该端口输出高低电平来控制蜂鸣器的播放,必须要使用PWM定时器来控制。
 头文件定义

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)

 控制部分

void pwm_init(void)  
{  
    GPD0.CON = GPD0.CON & (~(0xf))| 0x2;  
    GPD0.PUD = GPD0.PUD & (~(0xf)) ;  
    PWM.TCFG0 = PWM.TCFG0 & (~(0xff))|0xf9;  
    PWM.TCFG1 = PWM.TCFG1 & (~(0xf)) | 0x2;  
    PWM.TCMPB0 = 50;  
    PWM.TCNTB0 = 100;  
    PWM.TCON = PWM.TCON & (~(0xff)) | (1 << 0) | (1 << 1) ;  
    //第一次要手动设置  
}  
void beep_on(void)  
{  
    PWM.TCON = PWM.TCON & (~(0xff)) | (1 << 0) | (1 << 3) ;  
}  
void beep_off(void)  
{  
    PWM.TCON = PWM.TCON & (~(1 << 0)) ;  
}

完整程序清参考附件。

本章参考附件

点击进入

相关标签: ARM PWM