[AIROC™ 蓝牙] 【英飞凌CYW20829测评】+ 呼吸灯

[复制链接]
786|0
 楼主| YangTwo 发表于 2024-7-21 10:11 | 显示全部楼层 |阅读模式
本帖最后由 YangTwo 于 2024-7-21 10:11 编辑

一、什么是呼吸灯?
呼吸灯,就是指灯光设备的亮度随着时间由暗到亮逐渐增强,再由亮到暗逐渐衰减,很有节奏感地一起一伏,就像是在呼吸一样,因而被广泛应用于手机、 电脑等电子设备的指示灯中,冰冷的电子设备应用呼吸灯后,顿时增添了几分温暖。


二、呼吸灯与PWM控制原理
呼吸的特性是一种类似图 指数曲线 中的指数曲线过程,吸气是指数上升过程,呼气是指数下降过程,成年人吸气呼气整个过程持续约3秒。




要控制LED灯达到呼吸灯的效果,实际上就是要控制LED灯的亮度拟合呼吸特性曲线。前面控制全彩LED灯时,通过控制脉冲的占空比来调整各个通道LED灯的亮度,从而达到混色的效果。若控制脉冲的占空比在3秒的时间周期内按呼吸特性曲线变化,那么就可以实现呼吸灯的效果了。
这种使用脉冲占空比拟合不同波形的方式称为PWM(脉冲宽度调制)控制技术——通过对一系列脉冲的宽度进行调制,来等效地获得所需要波形(含形状和幅值)。PWM控制的基本原理为:冲量相等而开头不同的窄脉冲加在具有惯性的环节上时,其效果基本相同。其中冲量指窄脉冲的面积;效果相同指环节输出响应波形基本相同。


三、基于CYW20829硬件PWM的呼吸灯控制



PWM外设配置
  1. /*******************************************************************************
  2. * File Name: cycfg_peripherals.c
  3. *
  4. * Description:
  5. * Peripheral Hardware Block configuration
  6. * This file was automatically generated and should not be modified.
  7. * Configurator Backend 3.20.0
  8. * device-db 4.16.0.6098
  9. * mtb-pdl-cat1 3.11.0.34443
  10. *
  11. *******************************************************************************
  12. * Copyright 2024 Cypress Semiconductor Corporation (an Infineon company) or
  13. * an affiliate of Cypress Semiconductor Corporation.
  14. * SPDX-License-Identifier: Apache-2.0
  15. *
  16. * Licensed under the Apache License, Version 2.0 (the "License");
  17. * you may not use this file except in compliance with the License.
  18. * You may obtain a copy of the License at
  19. *
  20. *     http://www.apache.org/licenses/LICENSE-2.0
  21. *
  22. * Unless required by applicable law or agreed to in writing, software
  23. * distributed under the License is distributed on an "AS IS" BASIS,
  24. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  25. * See the License for the specific language governing permissions and
  26. * limitations under the License.
  27. ******************************************************************************/

  28. #include "cycfg_peripherals.h"

  29. #define tcpwm_0_group_1_cnt_5_INPUT_DISABLED 0x7U

  30. const cy_stc_tcpwm_pwm_config_t tcpwm_0_group_1_cnt_5_config =
  31. {
  32.     .pwmMode = CY_TCPWM_PWM_MODE_PWM,
  33.     .clockPrescaler = CY_TCPWM_PWM_PRESCALER_DIVBY_1,
  34.     .pwmAlignment = CY_TCPWM_PWM_LEFT_ALIGN,
  35.     .deadTimeClocks = 0,
  36.     .runMode = CY_TCPWM_PWM_CONTINUOUS,
  37.     .period0 = 32768,
  38.     .period1 = 32768,
  39.     .enablePeriodSwap = false,
  40.     .compare0 = 16384,
  41.     .compare1 = 16384,
  42.     .enableCompareSwap = false,
  43.     .interruptSources = (CY_TCPWM_INT_ON_TC & 0U) | (CY_TCPWM_INT_ON_CC0 & 0U) | (CY_TCPWM_INT_ON_CC1 & 0U),
  44.     .invertPWMOut = CY_TCPWM_PWM_INVERT_DISABLE,
  45.     .invertPWMOutN = CY_TCPWM_PWM_INVERT_DISABLE,
  46.     .killMode = CY_TCPWM_PWM_STOP_ON_KILL,
  47.     .swapInputMode = tcpwm_0_group_1_cnt_5_INPUT_DISABLED & 0x3U,
  48.     .swapInput = CY_TCPWM_INPUT_0,
  49.     .reloadInputMode = tcpwm_0_group_1_cnt_5_INPUT_DISABLED & 0x3U,
  50.     .reloadInput = CY_TCPWM_INPUT_0,
  51.     .startInputMode = tcpwm_0_group_1_cnt_5_INPUT_DISABLED & 0x3U,
  52.     .startInput = CY_TCPWM_INPUT_0,
  53.     .killInputMode = tcpwm_0_group_1_cnt_5_INPUT_DISABLED & 0x3U,
  54.     .killInput = CY_TCPWM_INPUT_0,
  55.     .countInputMode = tcpwm_0_group_1_cnt_5_INPUT_DISABLED & 0x3U,
  56.     .countInput = CY_TCPWM_INPUT_1,
  57.     .swapOverflowUnderflow = false,
  58.     .immediateKill = false,
  59.     .tapsEnabled = 45,
  60.     .compare2 = 16384,
  61.     .compare3 = 16384,
  62.     .enableCompare1Swap = false,
  63.     .compare0MatchUp = true,
  64.     .compare0MatchDown = false,
  65.     .compare1MatchUp = true,
  66.     .compare1MatchDown = false,
  67.     .kill1InputMode = tcpwm_0_group_1_cnt_5_INPUT_DISABLED & 0x3U,
  68.     .kill1Input = CY_TCPWM_INPUT_0,
  69.     .pwmOnDisable = CY_TCPWM_PWM_OUTPUT_HIGHZ,
  70.     .trigger0Event = CY_TCPWM_CNT_TRIGGER_ON_DISABLED,
  71.     .trigger1Event = CY_TCPWM_CNT_TRIGGER_ON_DISABLED,
  72.     .reloadLineSelect = false,
  73.     .line_out_sel = CY_TCPWM_OUTPUT_PWM_SIGNAL,
  74.     .linecompl_out_sel = CY_TCPWM_OUTPUT_INVERTED_PWM_SIGNAL,
  75.     .line_out_sel_buff = CY_TCPWM_OUTPUT_PWM_SIGNAL,
  76.     .linecompl_out_sel_buff = CY_TCPWM_OUTPUT_INVERTED_PWM_SIGNAL,
  77.     .deadTimeClocks_linecompl_out = 0,
  78. #if defined (CY_IP_MXS40TCPWM)
  79.     .hrpwm_enable = false,
  80.     .hrpwm_input_freq = CY_TCPWM_HRPWM_FREQ_80MHZ_OR_100MHZ,
  81.     .kill_line_polarity = CY_TCPWM_LINEOUT_AND_LINECMPOUT_IS_LOW,
  82.     .deadTimeClocksBuff = 0,
  83.     .deadTimeClocksBuff_linecompl_out = 0,
  84.     .buffer_swap_enable = false,
  85.     .glitch_filter_enable = false,
  86.     .gf_depth = CY_GLITCH_FILTER_DEPTH_SUPPORT_VALUE_0,
  87.     .dithering_mode = CY_TCPWM_DITHERING_DISABLE,
  88.     .period_dithering_value = 128,
  89.     .duty_dithering_value = 128,
  90.     .limiter = CY_TCPWM_DITHERING_LIMITER_7,
  91. #endif /* defined (CY_IP_MXS40TCPWM) */
  92. };

  93. #if defined (CY_USING_HAL) || defined(CY_USING_HAL_LITE)
  94. const cyhal_resource_inst_t tcpwm_0_group_1_cnt_5_obj =
  95. {
  96.     .type = CYHAL_RSC_TCPWM,
  97.     .block_num = 1U,
  98.     .channel_num = 5U,
  99. };
  100. #endif /* defined (CY_USING_HAL) || defined(CY_USING_HAL_LITE) */

  101. #if defined(CY_USING_HAL_LITE) || defined (CY_USING_HAL)
  102. const cyhal_clock_t tcpwm_0_group_1_cnt_5_clock =
  103. {
  104.     .block = CYHAL_CLOCK_BLOCK_PERIPHERAL1_16BIT,
  105.     .channel = 0,
  106. #if defined (CY_USING_HAL)
  107.     .reserved = false,
  108.     .funcs = NULL,
  109. #endif /* defined (CY_USING_HAL) */
  110. };
  111. #endif /* defined(CY_USING_HAL_LITE) || defined (CY_USING_HAL) */

  112. #if defined (CY_USING_HAL) || defined(CY_USING_HAL_LITE)
  113. const cyhal_pwm_configurator_t tcpwm_0_group_1_cnt_5_hal_config =
  114. {
  115.     .resource = &tcpwm_0_group_1_cnt_5_obj,
  116.     .config = &tcpwm_0_group_1_cnt_5_config,
  117.     .clock = &tcpwm_0_group_1_cnt_5_clock,
  118. };
  119. #endif /* defined (CY_USING_HAL) || defined(CY_USING_HAL_LITE) */

  120. void init_cycfg_peripherals(void)
  121. {
  122. #if defined (CY_DEVICE_CONFIGURATOR_IP_ENABLE_FEATURE)
  123.     Cy_SysClk_PeriGroupSlaveInit(CY_MMIO_TCPWM0_PERI_NR, CY_MMIO_TCPWM0_GROUP_NR, CY_MMIO_TCPWM0_SLAVE_NR, CY_MMIO_TCPWM0_CLK_HF_NR);
  124. #endif /* defined (CY_DEVICE_CONFIGURATOR_IP_ENABLE_FEATURE) */
  125.     Cy_SysClk_PeriphAssignDivider(PCLK_TCPWM0_CLOCK_COUNTER_EN261, CY_SYSCLK_DIV_16_BIT, 0U);
  126. }
  127. void reserve_cycfg_peripherals(void)
  128. {
  129. #if defined (CY_USING_HAL)
  130.     cyhal_hwmgr_reserve(&tcpwm_0_group_1_cnt_5_obj);
  131. #endif /* defined (CY_USING_HAL) */
  132. }

四、实物展示

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

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

本版积分规则

27

主题

110

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部