在线时间4071 小时
UID3441752
注册时间2017-11-21
NXP金币752114
TA的每日心情 | 开心 2024-3-26 15:16 |
---|
签到天数: 266 天 [LV.8]以坛为家I
管理员
- 积分
- 32067
- 最后登录
- 2024-4-30
|
使用FlexIO模块来产生PWM及PFM波
本文将介绍如何使用i.MX RT系列MCU中的FlexIO模块,来输出PWM以及PFM波。
概述
FlexIO 是i.MX RT系列MCU的一种片内外设,它是一个非常灵活并且可以随意配置的模块,不仅可以模拟出类似于UART、I2C、SPI、I2S等常用通信接口外,用户还可以使用它来输出PWM及PFM。
FlexIO作为一个独立的外设并不会用于取代PWM及PFM发生器,而是作为一个扩展以便在MCU资源不足时,还能够满足额外的生成需求。
本文创建了一个基于SDK以及i.MX RT系列开发平台的简单例程,以供用户熟悉如何使用FlexIO模块来输出PWM及PFM。
示例平台
以下所述的例程将使用i.MX RT1010-EVK开发板,如图1所示。用户对例程稍作修改后就可以在i.MX RT系列的其他EVK板上运行。
图 1. I.MXRT1010-EVK开发板
在本例程中,FlexIO生成的PWM波通过FlexIO_IO26 (GPIO_AD14) 引脚输出,生成的PFM波通过FlexIO_IO21 (GPIO_AD09) 引脚输出。
FlexIO模块简介
i.MX RT1010的FlexIO模块具有以下的一些特性:
多组32位的移位寄存器,具有发送、接收以及数据拟合等模式
具有双重缓存区的移位寄存器支持连续的数据传输
移位器可以串联以支持大数据量传输
自动生成并插入起始位及停止位
支持并行接口的1, 2, 4, 8, 16或32位的多位移位宽度
中断,直接存储器存取或轮询的方式进行收发
独立于总线时钟频率的可编程波特率,支持停止模式下的异步操作
高度灵活的16位定时器,支持各种内部或外部触发器、复位、使能与失能方式
可编程的逻辑模式,通过集成外部数字逻辑功能芯片或结合引脚/移位器/定时器功能,以产生复杂的输出
支持当CPU进入失能各项系统控制功能模式下的可编程状态机,支持最多8个状态,8个输出和每个状态3个可选择的输入
图2 为整个FlexIO模块的移位器定时器及引脚的结构图。
图 2. FlexIO模块框图
i.MX RT系列MCU的FlexIO模块所包含的资源不尽相同,用户可根据FLEXIO_PARAM寄存器,读取所用芯片FlexIO模块包含的移位器、定时器、引脚及触发器数量。本例程中所使用的i.MX RT1010芯片中包含8个寄存器、8个定时器、32个引脚以及两个外部触发器。(由于芯片设计引脚的限制,RT1010的实际使用的FlexIO引脚只有27个)
使用FlexIO生成PWM和PFM
为了生成PWM及PFM波,需要用到以下的一些资源:
两个定时器:一个用于生成PWM,配置为8位PWM模式;一个用于生成PFM,配置为16位counter模式
两个引脚:配置为定时器输出,以输出PWM及PFM波
图3所示为一个FlexIO定时器的框图。在本例程中,输出PWM及PFM只需要用到两个定时器连接到两个输出引脚。
图 3. FlexIO定时器框图
本例程中使用FlexIO的Timer 0来生成PWM波并通过FlexIO_D26引脚输出,使用Timer 1来生成PFM波并通过FlexIO_D21引脚输出。
下面列出一些所用定时器的关键配置项:
定时器模式选择(TIMCTLn[TIMOD])
生成PWM波所使用的Timer 0需配置成8位PWM high模式。在此模式下,计数器及比较寄存器的低8位用于配置定时器输出保持高电平的时间,计数器及比较寄存器的高8位用于配置定时器输出保持低电平的时间。
生成PFM波所使用的Timer 1需配置成16位counter模式。在此模式下,计数器及比较寄存器的整个16位位宽都用于配置波特率,而通过配置FlexIO的时钟源以及本设置后可以修改输出波形的频率。
定时器计数源选择 (TIMCFGn[TIMDEC])
不论是生成PWM还是PFM,都是选择FlexIO clock(FLEXIO_CLK[1])作为定时器的计数源。在此配置下,计数器在FlexIO clock的每个周期内都会自减。
FlexIO时钟是一个可配置项,配置CCM_CSCMR2[FLEXIO1_CLK_SEL], CCM_CS1CDR[FLEXIO1_CLK_PODF]和CCM_CS1CDR[FLEXIO1_CLK_PRED]寄存器可以修改FlexIO时钟的频率,对于更加详细时钟配置请参考RT1010的参考手册CCM章节的内容。
定时器比较寄存器配置 (TIMCMPn[CMP])
FlexIO定时器的计数值记到零时会从比较寄存器中重新加载数据,对于PWM,比较寄存器的低8位配置PWM高电平输出周期为(CMP[7:0] + 1),高8位配置PWM低电平的输出周期为(CMP[15:8] + 1)。配置这个寄存中的这两个值可以控制输出PWM波的占空比与频率。比较寄存器的值可以从下面的公式计算出来:
TIMCMPn[CMP] = (((FLEXIO_CLK / freq[2]) * (100-duty[3]) / 100-1) << 8) | ((FLEXIO_CLK / freq) * duty / 100 - 1)
对于PFM的配置,整个比较寄存器的16位都是用于计数器值的重置,PFM波的频率可以由一下公式计算得到:
freqF[4] = FLEXIO_CLK /( (CMP + 1) * 2)
[1] FLEXIO_CLK 是从CCM中输出的FlexIO的外设时钟.
[2] PWM波的频率.
[3] PWM波的占空比(百分比表示).
[4] PFM波的频率.
图4 展示了根据以上定时器的配置,FlexIO是如何生成PWM及PFM波的。
图4. 波形生成原理
运行示例代码
用户可以在nxp.com下载本文的配套例程。工程名为flexio_pwm_pfm,编译下载运行此工程后,使用逻辑分析仪或示波器连接RT1010的J26-4(FlexIO_D21)及J26-8(FlexIO_D26),来抓取生成的PWM及PFM波。图5即为实物连接图。
图 5. 实物连线图
逻辑分析仪所抓取的波形如图6所示。
图 6. PWM和PFM波
用户可以修改flexio_pwm_init()函数中的参数来修改PWM波的频率及占空比,并且可以使用flexio_pfm_configfre()函数来修改PFM波的频率。也可以在自己的工程中直接使用这些函数接口来配置FlexIO模拟输出PWM及PFM波。
下图是用示波器所观察到的波形。
相较于专门的PWM发生器,使用FlexIO模块模拟的PWM波存在一些不足。例如,FlexIO模拟PWM波的频率受限于FlexIO的时钟频率及IO口的输出频率;模拟的PWM波只支持边沿对齐方式的PWM,不支持中心对齐以及不对称方式的PWM;并且模拟PWM波的方式也不支持死区及错误保护等高级功能。
参考资料
i.MX RT1010 Processor Reference Manual (document I.MXRT1010RM)
MCUXpresso SDK: Software Development Kit for NXP MCUs
作者:Tim Wang@NXP 文章出处:恩智浦MCU加油站
|
|