登录/注册

CYPRESS芯片 输出渐灭PWM

更多

在 Cypress(现为 Infineon 的一部分)的芯片上(如 PSoC 4, PSoC 5LP, PSoC 6 系列)实现 输出渐灭(Fade-out)PWM,本质上是让 PWM 输出的占空比从某个较高值(如 100%)随时间逐渐减小到 0%,从而控制连接的 LED 或其他负载的亮度从最亮缓慢熄灭。

以下是常用的实现方法(主要思路和步骤):

核心原理

  1. 配置 PWM 组件:

    • 使用 Cypress PSoC Creator(旧版)或 ModusToolbox(新版)中的图形化设计工具(如 Component Catalog)。
    • 拖放并配置一个 PWM (v2)TCPWM (Timer/Counter/PWM) 组件。
    • 设置关键参数:
      • Period(周期): 决定 PWM 频率。频率越高,LED 闪烁感越弱(通常几 KHz 到几十 KHz)。例如,时钟 24 MHz,Period = 24000,则频率 = 24MHz / 24000 = 1KHz。
      • Compare(比较值/初始占空比): 设置初始占空比,对于渐灭通常设为一个高值(接近 Period 值,如 90% * Period)。
      • Clock(时钟源): 选择一个合适的系统时钟或分频后的时钟。
  2. 动态修改 Compare 值以实现渐灭:

    • 渐灭效果需要通过代码在运行时不断减小 PWM 的 Compare 寄存器值。
    • 需要一个定时器中断循环延时来触发占空比的更新。

实现方法(举例:软件定时器中断方式)

  1. 硬件配置:

    • 在 IDE 中配置好 PWM 组件,例如命名为 PWM_Fade
    • 配置一个定时器组件(如 Timer, TCPWM 作为定时器)或使用 SysTick(如果可用)作为软件定时器,命名为 Timer_Update。设置其周期为渐灭的单步更新时间(例如 10ms 或 20ms)。这个时间决定了渐灭的平滑度和速度。
  2. 代码实现(伪代码/核心逻辑):

    • 初始化:

      // 包含必要的头文件(根据组件自动生成)
      #include "project.h"
      
      // 全局变量
      uint16_t currentDuty = PERIOD_MAX * 0.9; // 初始占空比 90%
      uint16_t fadeStep = 5; // 每次中断减小的量 (控制渐灭速度)
      uint16_t periodValue = PWM_Fade_ReadPeriod(); // 获取PWM周期值
      
      int main(void) {
          CyGlobalIntEnable; // 启用全局中断
      
          PWM_Fade_Start(); // 启动PWM输出
          Timer_Update_Start(); // 启动定时器
          Timer_Update_EnableInterrupt(); // 启用定时器中断
      
          for (;;) {
              // 主循环可以处理其他任务或进入低功耗模式
              CySysPmSleep(); // 进入睡眠模式(可选)
          }
      }
    • 定时器中断服务程序:

      // Timer_Update 的中断服务程序
      CY_ISR(Timer_Update_ISR) {
          Timer_Update_ReadStatusRegister(); // 清除中断标志(重要!)
      
          // 渐灭逻辑:减小占空比
          if (currentDuty > fadeStep) {
              currentDuty -= fadeStep; // 减少当前占空比
          } else {
              currentDuty = 0; // 防止减过头
              Timer_Update_Stop(); // 如果渐灭完成,可以停止定时器
              // PWM_Fade_Stop(); // 或者直接停止PWM (可选)
          }
      
          PWM_Fade_WriteCompare(currentDuty); // 更新PWM比较值(占空比)
      }

关键点和优化

  1. 更新频率 (Timer_Update 周期) 与 fadeStep

    • 这两个参数共同决定了渐灭的速度平滑度
    • 更新频率越高(周期越短),fadeStep 越小,渐灭效果越平滑细腻,但耗费的 CPU 资源也略多。需要根据实际需求平衡。通常 10ms ~ 50ms 的更新间隔配合较小的 fadeStep (1 ~ 10) 即可达到平滑效果。
    • 渐灭总时间 ≈ (初始占空比 / fadeStep) * 定时器更新周期
  2. 线性 vs. 非线性渐灭:

    • 以上代码实现了线性渐灭(占空比随时间匀速减小)。
    • 人眼对亮度的感知是非线性的(近似对数)。要实现视觉上更均匀的亮度变化(即看起来匀速变暗),需要进行 Gamma 校正
      • 可以预先计算一个查找表,表中存放的是经过 Gamma 校正后的占空比值。
      • 在中断中根据“当前步数”或“剩余时间”来索引查找表的值,然后更新 PWM_Fade_WriteCompare()
      • 查找表元素 gamma_lut[i] = (uint16_t)(pow((double)i / num_steps, gamma) * periodValue + 0.5); (gamma 通常取 2.2 - 2.8)。
  3. 硬件辅助渐灭:

    • 部分 Cypress 芯片(如 PSoC 5LP/6 的 TCPWM)支持更复杂的 PWM 模式。
    • 带缓冲的 PWM (Buffered PWM): TCPWM 通常具有 Compare Buffer 寄存器。你可以在后台改变 Buffer 的值,然后在某个事件(比如定时器匹配或周期结束)时自动加载到 Compare 寄存器中。这样可以更精确地同步占空比更新。
    • 伪随机数列 (Pseudorandom Sequence Mode): 可以利用 TCPWM 的这个模式结合 DMA 或者中断来控制占空比变化规律,实现自定义的渐灭曲线。
  4. 使用 DMA:

    • 对于需要极高平滑度或者复杂渐灭曲线的情况,可以将预计算好的占空比值数组存储在内存中。
    • 配置 DMA 通道,在每次定时器触发时自动将数组中的下一个值搬运到 PWM 的 CompareCompare Buffer 寄存器中。这可以大大减轻 CPU 负担。设置好 DMA 的传输计数器(数组大小)即可控制渐灭的总步数。

总结

在 Cypress 芯片上实现渐灭 PWM 的关键步骤是:

  1. 硬件配置: 正确设置 PWM 组件(频率/周期)和一个用于定时更新占空比的定时器。
  2. 软件逻辑:
    • 初始化 PWM 和定时器,设置好初始占空比。
    • 定时器中断服务程序(或主循环配合延时)中不断减小 PWM 的 Compare 值,直到 0。
    • 处理好中断标志清除,防止错过或重复进入中断。
  3. (可选)视觉优化: 使用查找表 + Gamma 校正实现视觉上更均匀的亮度衰减。
  4. (可选)性能优化: 利用 TCPWM 的缓冲模式、伪随机序列或 DMA 提供更平滑、更高效的实现方案。

选择哪种具体实现方法取决于你对效果精细度、CPU 资源利用率和开发复杂度的要求。简单的软件定时器中断方式足以满足大多数基础的渐灭需求。

基于PWM的LED调光技术与呼吸灯实现方法!

利用PWM技术控制LED亮度,不仅效率高、响应快,还能实现细腻的视觉过渡。系统介绍PWM的工作机制,结合具体硬件平台,展示如何编程实现LED的渐

2025-12-15 13:03:06

SM7075-12 AC/DC PWM 功率开关芯片 输出电压12V

PWM功率开关芯片是一种采用脉冲宽度调制(PWM)技术的集成电路,主要用于控制开关电源的

2024-11-23 16:39:46

(Bpowlicon宝砾微)LYF93011 恒压输出电子烟驱动器、带充电功能PWM 封装SOT23-6

1、产品简介 LYF93011 是数模混合电路设计的带充电功能的PWM 恒压输出电子烟驱动ASIC,采用SOT23-6 封装,具有超低能耗,彻底解决原有的MCU控制方案的死机现象。

2024-09-20 09:42:24

基于51单片机的PWM控制LED灯设计资料源程序

基于51单片机的PWM控制LED灯渐亮渐灭设计资料源程序

资料下载 木头1233 2023-04-27 15:09:31

高效PWM电流型DC-DC升压芯片HM9221

HM9221是一款高效率、大电流的固定频率PWM电流型DC-DC升压芯片。HM9221的内置功率MOS管,提供最大6A的输入电流,满足大电流负载需要。HM9221的外置软启动管脚,可以方便的调节

资料下载 h1654156040.5061 2021-03-15 14:16:46

使用51单片机输出PWM波形的程序免费下载

本文档的主要内容详细介绍的是使用51单片机输出PWM波形的程序免费下载。

资料下载 尚文清 2019-08-29 17:29:00

使用单片机PWM实现电压输出的程序免费下载

本文档的主要内容详细介绍的是使用单片机PWM实现电压输出的程序免费下载。

资料下载 佚名 2019-08-19 17:31:00

使用51单片机按键控制输出PWM的占空比的资料和程序免费下载

之前说到利用51单片机输出pwm,但是输出的pwm是固定占空比的,如果想

资料下载 张文 2019-08-13 17:32:00

怎么实现dsp芯片输出占空比固定的pwm波形

实现DSP芯片输出占空比固定的PWM波形需要以下步骤:定义占空比、设置计时器、计算周期和持续时间、更新占空比、

2023-12-26 17:28:20

科普丨语音芯片支持PWM(脉宽调制)输出的优势

语音芯片支持 PWM输出对于语音芯片而言是一种灵活、高效和精确的

2023-10-10 17:14:47

使用单独按键实现,为什么我的程序无法开关?

各位大虾,我是刚刚学单片机,如何使用单独按键实现渐亮渐灭(功能是用一个轻触开关,开灯时LED灯慢慢亮起和关灯时慢慢灭掉),我写程序但无法开关,为

2023-10-08 07:34:13

(≧∇≦)ノ简单实现LED 灯的设计

如果,在每个LED 灯珠上并联大电容,而且电容值是逐渐递进增大,那么,这个LED 灯在通电瞬间会不会产生LED 灯珠逐个渐亮的效果!?

2023-01-27 23:08:55

PWM波控制LED亮闪烁

【MSP430F5529】学习笔记-PWM波(11月10日)用PWM波控制LED亮灭闪烁先放代码/* * main.c */#include&q

2021-11-29 06:04:58

PWM占空比指数渐变芯片-GP9700的特性以及应用

灭功能。 特性: 芯片上电后,EN信号由低变高,则PWM脚连续输出

2020-10-12 11:35:37

求开发,关于led控制亮,不是现在那种不明显效果的

12v灯珠控制,需要有一个信号输入控制灯亮亮(渐亮)需要效果明显,灭(渐灭

2019-09-27 12:53:14
7天热门专题 换一换
相关标签