本帖最后由 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、演示
|