这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 活动中心 » 板卡试用 » 【分享评测,赢取加热台】+EFR32xG24 PWM控制红色LED(呼吸灯)

共2条 1/1 1 跳转至

【分享评测,赢取加热台】+EFR32xG24 PWM控制红色LED(呼吸灯)

工程师
2024-03-28 19:24:04   被打赏 40 分(兑奖)     打赏

Silicon Labs的EFR32xG24是一款功能强大的无线SoC(片上系统),适用于智能家居、照明和医疗设备等物联网应用。这款芯片集成了多种关键特性,使其成为一个理想的网状物联网无线连接解决方案。

首先,EFR32xG24拥有高达+10 dBm的输出功率,确保了出色的无线通讯性能。它还支持20位ADC(模数转换器),能够实现高精度的模拟信号转换。此外,EFR32xG24还配备了AI/ML硬件加速器,为机器学习应用提供了强大的硬件支持。

在硬件设计方面,EFR32xG24提供了丰富的接口和扩展功能。它集成了虚拟COM端口、J-Link板载调试器、USB连接等接口,方便开发者进行调试和通信。此外,它还支持外部设备调试,使得开发者能够灵活地扩展硬件功能。

在传感器方面,EFR32xG24支持多种传感器接口,包括Si7021 RHT传感器、惯性传感器、立体声话筒、压力传感器和环境光传感器等。这些传感器为物联网应用提供了丰富的环境感知能力,使得设备能够更好地适应各种场景。

在软件开发方面,Silicon Labs为EFR32xG24提供了强大的支持。开发者可以使用Zigbee、BLE、Matter或任何基于2.4 GHz协议的专有应用程序来创建无线应用程序。同时,Silicon Labs还提供了多种选项来为其MCU创建ML应用程序,使得开发者能够轻松地将机器学习算法集成到设备中。

1、先看原理图,灯是怎么接的,在MCU哪个IO口上。

image.pngLEDR红灯接在MCU46脚上面的。

还是来个完整的图。

image.png

软件编译下载界面:

image.png


代码:

// 初始化并启动PWM输出。  
sl_pwm_start(&sl_pwm_led0);  
  
// 定义PD02口为输出脚。  
// 这里将GPIO端口D的引脚2定义为PWM输出。  
#define SL_PWM_LED0_OUTPUT_PORT  gpioPortD  
#define SL_PWM_LED0_OUTPUT_PIN    2  
  
// 定义定时器0为PWM源。  
// 使用定时器0来生成PWM信号。  
#define SL_PWM_LED0_PERIPHERAL  TIMER0  
#define SL_PWM_LED0_PERIPHERAL_NO  0  
  
// PWM工作代码:  
// 工作原理就是根据设定的占空比(duty cycle)来开关PWM信号。  
// 循环100次,逐步改变PWM占空比。  
for (uint8_t i = 0; i < 100; i++) {  
    // 设置PWM的占空比,这里假设pwm_lut是一个已经定义好的占空比查找表。  
    sl_pwm_set_duty_cycle(&sl_pwm_led0, pwm_lut);  
    // 等待6毫秒。  
    sl_sleeptimer_delay_millisecond(6);  
    // 如果i等于0,额外等待190毫秒,可能是为了让用户看到初始状态或者为了调试目的。  
    if (i == 0) {  
        sl_sleeptimer_delay_millisecond(190);  
    }  
}  
  
// 再循环从100递减到1,逐步改变PWM占空比。  
for (uint8_t i = 100; i > 0; i--) {  
    // 同上,设置PWM的占空比。  
    sl_pwm_set_duty_cycle(&sl_pwm_led0, pwm_lut);  
    // 等待6毫秒。  
    sl_sleeptimer_delay_millisecond(6);  
    // 如果i等于100,再次额外等待190毫秒,这可能是一个调试延时或者用于观察PWM状态变化。  
    if (i == 100) {  
        sl_sleeptimer_delay_millisecond(190);  
    }  
}

PWM输出波形:

完成关的波形

image.png

开到一多半的波形

image.png

完全关的波形

image.png

测量的位置实物图:

image.png

要使用Silicon Labs的EFR32xG24来控制一个红色LED实现呼吸灯效果(即LED亮度逐渐增强然后逐渐减弱),您需要配置PWM(脉宽调制)以产生变化的占空比信号。下面是一个简单的示例代码,演示了如何配置PWM来驱动红色LED。

首先,您需要定义PWM的配置,包括使用的GPIO端口和引脚、PWM的时钟源和频率等。接着,您需要编写一个函数来逐渐改变PWM的占空比,从而实现呼吸灯效果。

参考示例:

#include "em_device.h"  
#include "em_chip.h"  
#include "em_cmu.h"  
#include "em_gpio.h"  
#include "em_timer.h"  
#include "sl_pwm.h"  
  
// 定义PWM使用的GPIO端口和引脚  
#define SL_PWM_LED_OUTPUT_PORT    gpioPortF  
#define SL_PWM_LED_OUTPUT_PIN     4  
  
// 定义PWM使用的定时器  
#define SL_PWM_LED_TIMER        TIMER1  
#define SL_PWM_LED_TIMER_NO     1  
  
// 定义PWM的配置结构体  
sl_pwm_t sl_pwm_led;  
  
// 初始化PWM和GPIO  
void pwm_init(void)  
{  
    // 初始化CMU和GPIO  
    CMU_ClockEnable(cmuClock_GPIO, true);  
    CMU_ClockEnable(SL_PWM_LED_TIMER_CLOCK, true);  
    GPIO_PinModeSet(SL_PWM_LED_OUTPUT_PORT, SL_PWM_LED_OUTPUT_PIN, gpioModePushPull, 1);  
  
    // 初始化PWM  
    sl_pwm_init(&sl_pwm_led, SL_PWM_LED_TIMER, SL_PWM_LED_TIMER_NO, SL_PWM_LED_OUTPUT_PORT, SL_PWM_LED_OUTPUT_PIN);  
    sl_pwm_config_set(&sl_pwm_led,  
                       SL_PWM_MODE_UP_DOWN, // 上下模式  
                       10000,                 // 周期,单位通常是时钟周期,这里需要根据时钟频率调整  
                       0,                   // 初始占空比  
                       0);                 // 比较匹配值,用于设置占空比  
  
    // 启动PWM  
    sl_pwm_start(&sl_pwm_led);  
}  
  
// 改变PWM占空比以产生呼吸灯效果  
void pwm_breathe(uint16_t* duty_cycle, bool increasing)  
{  
    static uint32_t last_tick = 0;  
    uint32_t current_tick = CMU_ClockCycleGet();  
    uint32_t elapsed_ticks = current_tick - last_tick;  
    const uint32_t tick_period = 1000; // 每1000个时钟周期更新一次占空比,这个值可以根据需要调整  
  
    if (elapsed_ticks >= tick_period) {  
        last_tick = current_tick;  
        if (increasing) {  
            if (*duty_cycle < 10000) { // 假设10000是最大占空比(这里需要根据PWM配置调整)  
                *duty_cycle += 100; // 每次增加100  
            } else {  
                increasing = false; // 达到最大占空比后开始减小  
            }  
        } else {  
            if (*duty_cycle > 0) {  
                *duty_cycle -= 100; // 每次减小100  
            } else {  
                increasing = true; // 达到最小占空比后开始增加  
            }  
        }  
        sl_pwm_set_duty_cycle(&sl_pwm_led, *duty_cycle); // 设置新的占空比  
    }  
}  
  
int main(void)  
{  
    CHIP_Init();  
    pwm_init();  
  
    uint16_t duty_cycle = 0;  
    bool increasing = true;  
  
    while (1) {  
        pwm_breathe(&duty_cycle, increasing);  
        // 可以添加延时或其他任务  
    }  
}


几点注意事项:

  1. pwm_lut 变量在代码中没有定义,应该是一个存储PWM占空比值的数组或查找表。

  2. sl_pwm_set_duty_cycle 函数用于设置PWM的占空比。

  3. sl_sleeptimer_delay_millisecond 函数用于延迟指定的毫秒数。

  4. 代码中两次循环了从0到100和从100到0的过程,每次循环都会调用sl_pwm_set_duty_cycle来改变占空比。

  5. 每次改变占空比后都等待6毫秒,但在循环的起始和结束时都额外等待了190毫秒,这可能是为了观察初始和结束状态,或者是用于调试目的。

视频连接:

EFR32X24输出PWM

" target="_self"EFR32X24输出PWM






高工
2024-03-28 20:40:31     打赏
2楼

PWM波怎么也出现了抖动呀 


共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]