[PSOC™ Creator] [PSoC™ Creator] [PSoC™ Creator] 英飞凌CYW20829+PWM测试

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

以下几个方面进行详细说明**作的步骤:

一、准备
开发板:确保英飞凌CYW20829开发板及其所有连接都牢固可靠,特别是与电源和测试设备的连接。
测试设备:台式示波器
连接线:使用探头连接到开发板上的电流测量点。


二、软件环境
PSoC™ Creator或ModusToolbox:英飞凌的CYW20829通常使用ModusToolbox进行软件开发。
新建工程:在ModusToolbox中新建一个PWM相关的工程,输入工程名称并选择对应的开发板型号(CYW920829M2EVK-02)。
其它的步骤就略过。

在Device Configurator中配置PWM外设,选择LED灯的引脚作为PWM输出,并设置PWM的频率、占空比等参数。

三、代码编写
初始化PWM:打开代码,主函数中可以看到函数和初始化PWM外设,并配置其参数。cyhal_pwm_init()和cyhal_pwm_set_duty_cycle(),cy_rslt_t cybsp_init()。
控制PWM输出:编写代码来控制PWM的输出,实现特定的功能(呼吸灯效果等)。
对于呼吸灯效果,可以通过定时器中断来周期性地调整PWM的占空比,从而实现LED亮度的变化。也利用按键来控制实现PWM输出调节。




四、相关代码:
  1. // 定义一个中断服务例程,用于处理定时器事件
  2. // callback_arg 是中断回调时可能传递的参数,这里未使用
  3. // event 是中断事件的类型,这里也未使用
  4. static void isr_timer(void* callback_arg, cyhal_timer_event_t event)
  5. {
  6. // 忽略callback_arg和event参数,因为它们在这个ISR中未被使用
  7. (void)callback_arg;
  8. (void)event;
  9. // 如果timer_count大于0,则递减
  10. if(timer_count > 0)
  11. timer_count -= 1;
  12. // 如果timer_count减到0,重置为2000,并切换LED2的状态
  13. if(timer_count == 0)
  14. {
  15. timer_count = 2000;
  16. cyhal_gpio_toggle(CYBSP_USER_LED2); // 切换LED2的状态(开/关)
  17. }
  18. // 根据timer_count的值调整LED1的PWM占空比
  19. // 如果timer_count小于1000,占空比随timer_count线性增加
  20. if(timer_count < 1000)
  21. {
  22. cyhal_pwm_set_duty_cycle(&pwm_led1_control, timer_count/10.0, 10000);
  23. // 这里,timer_count/10.0计算占空比,10000是PWM的分辨率(周期)
  24. }
  25. // 如果timer_count大于或等于1000,占空比随(2000-timer_count)线性减少
  26. else {
  27. cyhal_pwm_set_duty_cycle(&pwm_led1_control, (2000-timer_count)/10.0, 10000);
  28. // 同样,占空比通过(2000-timer_count)/10.0计算
  29. }
  30. }
通过按键实现PWM控制
  1. // 假设的全局变量
  2. volatile bool key_pressed = false; // 标记按键是否被按下,需要volatile防止编译器优化
  3. static uint16_t pwm_duty_cycle = 0; // PWM占空比,范围从0到10000
  4. // 按键中断服务例程(假设存在,但在这里未定义)
  5. // void isr_key(void* callback_arg, cyhal_gpio_event_t event) {
  6. // if (event == CYHAL_GPIO_IRQ_RISE_EDGE) { // 假设我们关注上升沿
  7. // key_pressed = true;
  8. // // 可以在这里直接调整pwm_duty_cycle,但更好的做法是设置一个标志
  9. // }
  10. // // 可能还需要处理下降沿来重置key_pressed
  11. // }
  12. // 定时器中断服务例程
  13. static void isr_timer(void* callback_arg, cyhal_timer_event_t event)
  14. {
  15. (void)callback_arg;
  16. (void)event;
  17. // 如果按键被按下,则更新PWM占空比(这里只是简单示例)
  18. if (key_pressed) {
  19. // 假设每次按键按下,PWM占空比增加或减少一定量
  20. // 注意:这里需要添加逻辑来防止占空比超出范围
  21. pwm_duty_cycle = (pwm_duty_cycle + 100) % 10001; // 简单示例:每次增加100,循环到0
  22. cyhal_pwm_set_duty_cycle(&pwm_led1_control, pwm_duty_cycle, 10000);
  23. // 重置按键状态(这应该在按键释放时发生,但在这个简化的示例中我们在这里做)
  24. key_pressed = false;
  25. }
  26. // 如果还需要定时器做其他事情(比如闪烁LED2),可以在这里添加
  27. // ...(但在这个示例中我们省略了这些部分)
  28. }
  29. // 注意:你还需要设置定时器、PWM和按键的中断,并将它们与相应的ISR关联起来。
  30. // 这通常通过Cypress HAL库提供的API完成。
五、实现效果

本帖子中包含更多资源

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

×
ym0sly 发表于 2024-7-30 11:07 | 显示全部楼层
英飞凌的CYW20829通常使用ModusToolbox进行软件开发。
盗铃何须掩耳 发表于 2024-7-31 14:20 | 显示全部楼层
很简洁的代码就实现了
我想看大海 发表于 2024-7-31 14:25 | 显示全部楼层
这个开发环境好用不

评论

还可以,不是很难  发表于 2024-8-1 09:22
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

258

主题

829

帖子

6

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