[PSOC™ Creator] 【英飞凌CYW20829测评】+通过PWM控制LED呼吸灯

[复制链接]
2403|0
 楼主| meiyaolei 发表于 2024-7-10 09:52 | 显示全部楼层 |阅读模式
本帖最后由 meiyaolei 于 2024-7-10 09:55 编辑

使用英飞凌的CYW20829芯片通过PWM控制LED实现呼吸灯效果和周期闪烁的详细实现过程。
我将进一步解释一些关键点,进行的第一步。

1、步骤解析
新建空白工程
这一步是标准的软件开发流程,通过IDE(ModusToolbox)创建一个新的项目,并输入工程名称。

配置设备
使用Device Configurator(设备配置工具)来配置硬件资源,GPIO、PWM、Timer等。

创建定时器
定时器用于周期性地更新PWM的占空比,从而控制LED的亮度变化。

配置GPIO
CYBSP_USER_LED1 配置为PWM输出,用于实现呼吸灯效果。
CYBSP_USER_LED2 配置为普通GPIO输出,用于周期闪烁。
配置PWM
在外设配置窗口中,设置PWM的相关参数,时钟源、分辨率等。

声明结构体和变量
cyhal_timer_t timer_obj; 用于控制定时器的结构体。
uint16_t timer_count = 2000; 定时器计数器,用于控制PWM占空比的变化周期。
cyhal_pwm_t pwm_led1_control; 用于控制LED1(呼吸灯)的PWM结构体。
定时器回调函数
在isr_timer函数中,根据timer_count的值调整PWM的占空比,并在timer_count达到0时翻转LED2的状态。在timer_count为0时重置为2000,并翻转LED2,但这意味着LED2的闪烁周期与PWM占空比变化周期不同步。如果PWM周期也是2000,那么LED2会在PWM周期结束时闪烁一次,这可能不是您想要的效果。
占空比的计算中,timer_count/10.0 和 (2000-timer_count)/10.0 可能会产生小数,但cyhal_pwm_set_duty_cycle函数通常期望的占空比参数是一个百分比(0-100%),因此您可能需要将结果乘以100,并确保它不会超出这个范围。
初始化函数
在app_timer_init函数中,您初始化了PWM和定时器,并设置了定时器的回调函数。确保tcpwm_0_group_1_cnt_3_hal_config和tcpwm_0_group_1_cnt_0_hal_config是正确配置的硬件抽象层(HAL)配置。
在main函数中调用初始化函数
确保在main函数的最开始或适当的位置调用app_timer_init(),以启动整个系统。

2、操作步骤:
新建工程

输入对应芯片型号,然后点击可读,再点芯片,再点下一步:

输入自己对应的外,与地址,再点生成:


设置参数:


3、代码:
  1. /**  
  2. * 定时器中断服务例程(ISR)  
  3. * 当定时器达到其计数终端时,此函数被调用。  
  4. *  
  5. * @param callback_arg 回调函数参数,本例中未使用。  
  6. * @param event 发生的事件类型,本例中未使用,因为只关注计数终端事件。  
  7. */  
  8. static void isr_timer(void* callback_arg, cyhal_timer_event_t event)  
  9. {  
  10.     // 忽略未使用的参数,以避免编译器警告  
  11.     (void)callback_arg;  
  12.     (void)event;  
  13.   
  14.     // 减少计数器,每次中断时执行  
  15.     if(timer_count > 0)  
  16.     {  
  17.         timer_count -= 1;  
  18.     }  
  19.   
  20.     // 当计数器减到0时,重置计数器并切换LED2的状态  
  21.     if(timer_count == 0)  
  22.     {  
  23.         timer_count = 2000; // 重置计数器  
  24.         cyhal_gpio_toggle(CYBSP_USER_LED2); // 切换LED2的状态  
  25.     }  
  26.   
  27.     // 根据计数器的值调整LED1(呼吸灯)的PWM占空比  
  28.     // 注意:这里可能需要根据PWM的分辨率调整占空比的计算方式  
  29.     if(timer_count < 1000)  
  30.     {  
  31.         // 当计数器小于1000时,占空比逐渐增加  
  32.         // 但这里有一个问题:cyhal_pwm_set_duty_cycle的第二个参数应该是占空比的百分比(0-100)  
  33.         // 因此,我们需要将timer_count/10.0的结果转换为百分比  
  34.         // 注意:如果PWM的分辨率不是10000(这里假设为10000),则需要相应地调整  
  35.         cyhal_pwm_set_duty_cycle(&pwm_led1_control, (uint16_t)((timer_count / 10.0) * 100.0), 10000);  
  36.     }  
  37.     else  
  38.     {  
  39.         // 当计数器大于或等于1000时,占空比逐渐减小  
  40.         // 同样,需要将计算结果转换为百分比  
  41.         cyhal_pwm_set_duty_cycle(&pwm_led1_control, (uint16_t)(((2000 - timer_count) / 10.0) * 100.0), 10000);  
  42.     }  
  43.   
  44.     // 注意:确保PWM的分辨率(本例中的10000)与您的硬件设置相匹配  
  45.     // 如果分辨率不同,需要相应地调整占空比的计算方式  
  46. }


4、演示


本帖子中包含更多资源

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

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

本版积分规则

认证:工程师
简介:超越自我,为设计激发灵感和想象。

263

主题

836

帖子

6

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