请选择 进入手机版 | 继续访问电脑版
查看: 1655|回复: 2

[分享] 一个PWM问题引发的“奇案” —— LPC802 USART的妙用

[复制链接]
  • TA的每日心情
    开心
    3 天前
  • 签到天数: 266 天

    [LV.8]以坛为家I

    3297

    主题

    6542

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    31909
    最后登录
    2024-3-29
    发表于 2020-11-19 17:35:18 | 显示全部楼层 |阅读模式
    一个PWM问题引发的“奇案” —— LPC802 USART的妙用


    大家知道,对于MCU应用来说,输出PWM很常见。
    PWM,作为MCU的标配,就算一些低端MCU,至少也会在通用定时计数器中顺便支持PWM输出。
    然而,在LPC802中,对PWM输出存在一个限制,即当PWM信号频率是通过奇数分频得到时,不能输出占空比为50%的PWM;偶数分频,可以得到50%占空比PWM。
    输出50%的PWM是再普通不过的应用,现在当PWM频率来自奇数分频时,被告知不能输出50%占空比PWM,这是不是很尴尬。好在,一个奇巧之术被引入来解决了此问题,化解了这场尴尬……


    LPC802概览
    首先,快速浏览我们的主角LPC802的背景资料。


    LPC802是NXP推出有些年头的一款基于Cortex M0+的低端产品,因其简单好用,性价比高,低功耗优势,在市场上应用很广。它的推出是奔着喊了多年的32bit替代8/16bit MCU的小目标去的,可应用于简单马达控制,游戏控制器,传感器控制等简单应用。


    LPC802有多“低端”:主频最高15Mhz,16KB Flash和2KB SRAM存储空间;封装小,支持TSSOP16, TSSOP20和HVQFN33;外设资源是很基本的标配,一个I2C,一个SPI,两个USART,一个多速率定时器(multi-rate timer), 自唤醒定时器,一个通用定时器,一个12位ADC, 一个模拟比较器,一个开关矩阵(SWM)和通用I/O。详情可参阅UM,这里不再赘述。

    PWM问题:CTIMER的力不从心
    回到我们开场提到的PWM输出问题,为方便讨论,首先来设定一个在LPC802上输出PWM的具体需求:主频9Mhz,产生一个频率为1.8Mhz,占空比为50%的PWM并无需软件介入可自动持续输出。


    这是一个简单普通的需求。我们很自然地能想到用LPC802的通用定时计数器CTIMER来做,它的特性之一就是可输出PWM。可是如本文开头提到,LPC802的此特性存在的一个限制,当PWM的频率是由奇数分频来产生的时候,就算配置占空比为50%,CTIMER却不能输出占空比为50%的PWM,而是40/60%(见下图,Duty显示为60%)。


    在LPC802的有限资源中,没有明确描述哪个还能支持PWM。山穷水尽,柳暗花明……这里就引入了USART,利用它一个少用的特性,巧妙地解决了此问题。


    下面来看看此“奇妙”方案。
    11.png

    “奇妙”方案:USART的闪亮登场
    USART,我们最常用的就是通过它来实现串口通讯,从这点很难将它和PWM输出联系起来,因为这里是利用了它的异步通讯模式。


    实际上,USART还支持同步模式,作为同步模式,类似于I2C、SPI,作为主设备时,是可以输出clock的。


    说到这,有读者或许敏锐地感觉到了和PWM信号输出的联系。是的,正是利用USART的同步模式,作为主设备时,在其clock引脚上输出clock信号来作为PWM信号输出的。


    我们知道,作为clock信号,若没提供可配置机制的话,它一般就固定50%占空比的。USART的同步主模式下,输出的clock信号正是如此。这个clock信号可以解决前面提到的PWM输出问题。下面我们来看看具体相关实现。


    (1)首先,在USART配置寄存器(CFG)中,有两个位域来分别配置同步模式和主模式:
    13.png
    (2)实现PWM信号频率1.8Mhz,即配置以产生1.8Mhz的clock频率。
    在LPC802用户手册USART章节“13.3.1Configure the USART clock and baud rate”中明确提到同步模式下输出时钟计算公式:Un_SCLK = FCLK/(BRGVAL+1)。其中,Un_SCLK就是时钟引脚上输出的clock频率,FCLK为提供给USART模块的时钟频率(可以将主频直接导入,即为9Mhz),BRGVAL是在USART波特率产生寄存器中由以下位域进行配置:

    所以,只要将此位域配置为4,即可得到输出的clock频率(即PWM信号频率):9Mhz/5=1.8Mhz。


    (3) 接下来,还有最后一个问题,就是如何做到PWM信号一经产生,可以无需软件介入而自动持续输出。这是很关键的一点。


    有意思的是,USART的同步模式下,居然支持clock信号可以配置为持续输出,在USART的控制寄存器(CTL)中有此配置位域,如下:
    14.png
    12.png




    至此,这个PWM问题,就这样“神奇完美”地被解决了。


    最后,给大家展示这个解决方法实现后输出的波形(持续不断输出一个1.8Mhz频率50%占空比的PWM信号):
    15.png





    签到签到
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    2021-12-23 09:57
  • 签到天数: 1587 天

    [LV.Master]伴坛终老

    5

    主题

    3046

    帖子

    23

    金牌会员

    Rank: 6Rank: 6

    积分
    8183
    最后登录
    2024-3-28
    发表于 2020-11-19 20:37:39 | 显示全部楼层
    那么问题来了,如果要改变占空比的话,咋办?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    3 天前
  • 签到天数: 266 天

    [LV.8]以坛为家I

    3297

    主题

    6542

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    31909
    最后登录
    2024-3-29
     楼主| 发表于 2020-12-2 09:47:49 | 显示全部楼层
    Splore.Liu 发表于 2020-11-19 20:37
    那么问题来了,如果要改变占空比的话,咋办?

    好问题
    签到签到
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-3-29 15:43 , Processed in 0.124821 second(s), 22 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表