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