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口上。
LEDR红灯接在MCU46脚上面的。
还是来个完整的图。

软件编译下载界面:

代码:
// 初始化并启动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输出波形:
完成关的波形

开到一多半的波形

完全关的波形

测量的位置实物图:

要使用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);
// 可以添加延时或其他任务
}
}几点注意事项:
pwm_lut 变量在代码中没有定义,应该是一个存储PWM占空比值的数组或查找表。
sl_pwm_set_duty_cycle 函数用于设置PWM的占空比。
sl_sleeptimer_delay_millisecond 函数用于延迟指定的毫秒数。
代码中两次循环了从0到100和从100到0的过程,每次循环都会调用sl_pwm_set_duty_cycle来改变占空比。
每次改变占空比后都等待6毫秒,但在循环的起始和结束时都额外等待了190毫秒,这可能是为了观察初始和结束状态,或者是用于调试目的。
视频连接:
EFR32X24输出PWM
我要赚赏金
