历史上的今天
今天是:2025年01月26日(星期日)
2019年01月26日 | STC单片机硬件PWM的使用分析
2019-01-26 来源:eefocus
STC单片机(具有PCA功能的),怎么实现可变频率的PWM输出?很多朋友还在使用定时器做可变频PWM, 这里我就介绍怎么使用硬件PWM,在定时器0的分频基数下设计PWM。

首先看CMOD这个寄存器,这里我们主要关注 CPS0,CPS1,CPS2,这三个位控制选择PCA的计数脉冲源。 对应PWM功能,则是选择频率。 首先可以选择 6个固定分频,可以看图片看出,分别是1,2,4,6,8,12的系统分频。我们需要做可变频率的PWM,所以我们需要选择模式2,选择定时器0的溢出作为系统分频基数。
然后,我么看怎么具体的去计算,去实现分频。 这里就需要上面这个图片的计算规则。 这里我举一个例子来说明,比如我们单片机的晶振使用的是12MHZ,而我们需要实现300HZ的频率。 如果得到呢?
首先,如果我们采用CMOD的固定分频,可以发现,无论是1,2,4,8,12,分频下来的频率都不是300HZ。 所以这里也体现我们使用定时器0做分频基数的好处了。

我们继续计算,12MHZ需要转化为300HZ,那么根据上图,首先我们需要确定PCA时钟输入频率,根据公式 300*256=76800HZ,这个值就是我们需要的PCA时钟输入频率。现在问题就是 ,我们怎么把12MHZ,转化为76.8KHZ, 12000KHZ/76.8KHZ=156.25 ,这个156.25就是分频基数,而这个分频基数由我们的定时器溢出参数来设定,意思就是当我们定时器如果计数156.25溢出就可以做到分频基数为156.25, 所以我们在设置定时器0的计数起始值就是65536-156=65380,对应TH0=0XFF,TL0=0X64。
好了,怎么计算PWM在定时器0下实现我们自己需要的任意频率的计算方式这里就介绍完了。 如果要动态实现频率可变,我们就可以通过通讯去动态调整定时器0的计数基数,(实际就是调整了分频基数),就可以实现频率的改变了。 另外,说明:这里的定时器0,不需要中断,并且该定时器也不是作为产生PWM用的,是作为一个分频基数用!
上一篇:STM8L15x系列DAC的使用
下一篇:STC15单片机6路专用PWM
史海拾趣
|
EVC模拟器连上了,程序download过去了,但是Remote File viewer怎么都连不上(帮帮忙) RT 我自己编译的SDK 装上了之后 模拟器也连上了 程序也下载下去了 但是点Tools/Remote File Viewer怎么都连不上 提示信息是: cannot load device specific files associated with this tool 有高手遇到过这种情况没 ...… 查看全部问答> |
|
C51单片机,串口通信 这个状态下如何做个手柄出来? 我在想:WINDOWS手柄肯定有一个通信协议,只要单片机按协议发出数据,WINDOWS是不是就可以 认识到这个手柄,从而在 设备管理器里认为这个是手柄? 还是需要专门的 IC… 查看全部问答> |
|
如何实现xpe系统的交互式登陆? 我在使用第二个用户远程登陆时,提示我不能进行交互式登陆。 后来将第二个用户设置为管理员权限,可以远程登陆,但已经本机登陆的administrator用户被迫注销。 怎样能够实现第二个用户登陆机器,而不影响前一个用 ...… 查看全部问答> |
|
单片机是stc89c51,6个数码管,P0.0~P0.7接的是数码管的段位(a,b,c.......,dp),P2.0~P2.5共6位接数码管的位选,共阳极接法,6个数码管都能正常显示,但不管给哪一个数码管送位选信号时,其它数码管都会导通,也就是全部都会显示,而且显示的是一 ...… 查看全部问答> |
|
还是内核调试的问题,CS8900不支持KITL 怎么调试内核? 若要调试内核或是驱动 应该裁剪一个可以调试版本的内核 其中 在SETTINGS 时下面两项要选择 ENABLE KITL ENABLE Kernel Debuger 而看资料说,CS8900不支持 KITL 这个选项 那应该怎么设置才能调试内核呢? … 查看全部问答> |
|
贡献2个STM32初学笔记资料 IAR环境搭建教程完整版.pdf (1.7 MB) 下载次数: 283 2009-11-28 02:21 很好的ARM开源项目技术方案(完整版).pdf (1.43 MB) 下载次数: 296 2009-12-1 12:49 硬件工程师入门资 ...… 查看全部问答> |
|
我最近在学习使用multisim软件学习单片机,但是在用multisim进行单片机仿真的时候,遇到了一些困难,我使用的单片机仿真芯片是“MCU MODULE-->805x-->8051”,用c语言写程序,但是在调试的时候总是报错显示头文件错误,头文件使用reg51.h $MON5 ...… 查看全部问答> |




