打印
[PSoC™ Creator]

【英飞凌CYW20829测评】+通过PWM控制LED呼吸灯

[复制链接]
1790|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 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、代码:
/**  
* 定时器中断服务例程(ISR)  
* 当定时器达到其计数终端时,此函数被调用。  
*  
* @param callback_arg 回调函数参数,本例中未使用。  
* @param event 发生的事件类型,本例中未使用,因为只关注计数终端事件。  
*/  
static void isr_timer(void* callback_arg, cyhal_timer_event_t event)  
{  
    // 忽略未使用的参数,以避免编译器警告  
    (void)callback_arg;  
    (void)event;  
  
    // 减少计数器,每次中断时执行  
    if(timer_count > 0)  
    {  
        timer_count -= 1;  
    }  
  
    // 当计数器减到0时,重置计数器并切换LED2的状态  
    if(timer_count == 0)  
    {  
        timer_count = 2000; // 重置计数器  
        cyhal_gpio_toggle(CYBSP_USER_LED2); // 切换LED2的状态  
    }  
  
    // 根据计数器的值调整LED1(呼吸灯)的PWM占空比  
    // 注意:这里可能需要根据PWM的分辨率调整占空比的计算方式  
    if(timer_count < 1000)  
    {  
        // 当计数器小于1000时,占空比逐渐增加  
        // 但这里有一个问题:cyhal_pwm_set_duty_cycle的第二个参数应该是占空比的百分比(0-100)  
        // 因此,我们需要将timer_count/10.0的结果转换为百分比  
        // 注意:如果PWM的分辨率不是10000(这里假设为10000),则需要相应地调整  
        cyhal_pwm_set_duty_cycle(&pwm_led1_control, (uint16_t)((timer_count / 10.0) * 100.0), 10000);  
    }  
    else  
    {  
        // 当计数器大于或等于1000时,占空比逐渐减小  
        // 同样,需要将计算结果转换为百分比  
        cyhal_pwm_set_duty_cycle(&pwm_led1_control, (uint16_t)(((2000 - timer_count) / 10.0) * 100.0), 10000);  
    }  
  
    // 注意:确保PWM的分辨率(本例中的10000)与您的硬件设置相匹配  
    // 如果分辨率不同,需要相应地调整占空比的计算方式  
}


4、演示


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

161

主题

650

帖子

3

粉丝