AI嵌入式K210项目(8)-PWM控制呼吸灯

本文详细介绍了如何在K210芯片上利用PWM技术控制RGB灯的亮度,通过定时器调整PWM的频率和占空比,展示了PWM的实际应用和编程实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言

上一章我们讲了定时器,本章我们来看一下PWM的功能,并实现一个呼吸灯的小实验;


一、什么是PWM?

PWM控制的是脉冲输出的占空比,占空比是指在一个脉冲循环内,通电时间相对于总时间所占的比例。比如说,一个RGB灯在它一个工作周期中有一半时间被接通了,那么它的占空比就是50%,同时亮度也只有50%。如果加在该工作元件上的信号电压为3V,则实际的工作电压平均值或电压有效值就是1.5V。
详细介绍可以参考我的这篇博客,原理都是类似的STM32开发(6)----CubeMX配置PWM

二、K210的PWM

K210芯片定时器总共有3个,每个定时器有4路通道。每个定时器可以设置触发间隔,和定时器中断处理函数。定时器还可以设置为PWM输出的功能,但是如果设置PWM输出,则不可以使用定时的功能。
PWM 用于控制脉冲输出的占空比。其本质是一个定时器,所以注意设置 PWM 号与通道时不要与 TIMER定时器冲突。

PWM 模块具有以下功能:
• 配置 PWM 输出频率
• 配置 PWM 每个管脚的输出占空比

对应头文件 pwm.h
为用户提供以下接口
• pwm_init
• pwm_set_frequency
• pwm_set_enable

为了呈现实验效果,本文还使用RGB灯来观察现象
在这里插入图片描述

实验过程

新建pwm文件夹,在文件夹里新建main.c
在这里插入图片描述
注意包含头文件

#include "fpioa.h"
#include "sleep.h"
#include "gpio.h"
#include "sysctl.h"
#include "plic.h"
#include "timer.h"
#include "pwm.h"
/*****************************HARDWARE-PIN*********************************/
// 硬件IO口,与原理图对应
#define PIN_RGB_R             (12)
/*****************************SOFTWARE-GPIO********************************/
// 软件GPIO口,与程序对应
#define RGB_R_GPIONUM          (0)

/*****************************FUNC-GPIO************************************/
// GPIO口的功能,绑定到硬件IO口
#define FUNC_RGB_R             (FUNC_GPIO0 + RGB_R_GPIONUM)
void hardware_init(void)
{
    fpioa_set_function(PIN_RGB_R, FUNC_TIMER1_TOGGLE1);//绑定pwm function
}

/**
* Function       timer_timeout_cb
* @brief         定时器中断回调
* @param[in]     ctx
* @param[out]    void
* @retval        0
* @par History   无
*/
int timer_timeout_cb(void *ctx) {
    static double duty_cycle = 0.01;
    /* 0为渐增,1为渐减 */
    static int flag = 0;      
    /* 传入cycle的不同值,调节PWM的占用比,也就是调节灯的亮度 */
    pwm_set_frequency(PWM_DEVICE_1, PWM_CHANNEL_0, 200000, duty_cycle);
    /* 修改cycle的值,让其在区间(0,1)内渐增和渐减 */
    flag ? (duty_cycle -= 0.01): (duty_cycle += 0.01);
    if(duty_cycle > 1.0)
    {
        duty_cycle = 1.0;
        flag = 1;
    }
    else if (duty_cycle < 0.0)
    {
        duty_cycle = 0.0;
        flag = 0;
    }
    return 0;
}

/**
* Function       init_timer
* @brief         初始化定时器
* @param[in]     ctx
* @param[out]    void
* @retval        0
* @par History   无
*/
void init_timer(void) {
    /* 定时器初始化 */
    timer_init(TIMER_DEVICE_0);
    /* 设置定时器超时时间,单位为ns */
    timer_set_interval(TIMER_DEVICE_0, TIMER_CHANNEL_0, 10 * 1e6);
    /* 设置定时器中断回调 */
    timer_irq_register(TIMER_DEVICE_0, TIMER_CHANNEL_0, 0, 1, timer_timeout_cb, NULL);
    /* 使能定时器 */
    timer_set_enable(TIMER_DEVICE_0, TIMER_CHANNEL_0, 1);
}

/**
* Function       init_pwm
* @brief         初始化PWM
* @param[in]     void
* @param[out]    void
* @retval        void
* @par History   无
*/
void init_pwm(void)
{
    /* 初始化PWM */
    pwm_init(PWM_DEVICE_1);
    /* 设置PWM频率为200KHZ,占空比为0.5的方波 */
    pwm_set_frequency(PWM_DEVICE_1, PWM_CHANNEL_0, 200000, 0.5);
    /* 使能 PWM 输出 */
    pwm_set_enable(PWM_DEVICE_1, PWM_CHANNEL_0, 1);
}

/**
* Function       main
* @brief         主函数,程序的入口
* @param[in]     void
* @param[out]    void
* @retval        0
* @par History   无
*/
int main(void)
{
    /* 硬件引脚初始化 */
    hardware_init();

    /* 系统中断初始化和使能 */
    plic_init();
    sysctl_enable_irq();
    
    /* 初始化定时器 */
    init_timer();

    /* 初始化PWM */
    init_pwm();

    while(1);

    return 0;
}

代码写好后,我们开始编译,注意:如果你编译过程中出现错误,可以先make clean掉之前生成的过程文件,重新生成

cd build
//注意这里的目标文件目录改成gpio,和刚才新建的文件夹名称一致
cmake .. -DPROJ=timer  -G "MinGW Makefiles"
make

编译完成后,在build文件夹下会生成pwm.bin文件。

使用type-C数据线连接电脑与K210开发板,打开kflash,选择对应的设备,再将程序固件烧录到K210开发板上。
在这里插入图片描述
观察现象,可以看到红色灯渐渐点亮,然后渐渐熄灭
在这里插入图片描述

总结

本节介绍基于PWM的内部实现是基于定时器的定时功能,控制PWM的两个重要因素是频率和占空比,PWM输出修改的是占空比,也就是通电时间占总时间的百分比,改变了输出的有效值,从而改变了RGB灯的亮度。

### K210 芯片物体识别的有效距离范围 K210 是一款由 Kendryte 开发的 AIoT 处理器,其内置双核 RISC-V CPU 和神经网络加速单元(NPU),能够高效运行机器学习模型以实现图像分类、目标检测等功能[^1]。然而,关于 K210 物体识别的具体有效距离范围,并不是一个固定的数值,而是受到多种因素的影响。 #### 影响物体识别有效距离的因素 以下是影响 K210 芯片在物体识别任务中有效距离的主要因素: 1. **摄像头传感器性能** - 如果搭配的是低分辨率或低灵敏度的摄像头模组,则会显著降低可识别的距离。通常情况下,高像素和大光圈镜头可以提升远距离成像质量,从而增加识别距离[^2]。 2. **算法精度与复杂度** - 使用不同的深度学习框架或者预训练模型会影响最终的结果。例如轻量级 MobileNet 可能适合资源受限环境但可能牺牲部分准确性;而更复杂的 YOLO 或 SSD 则提供更高的精确率,在相同条件下或许支持更大的探测范围[^3]。 3. **被测物大小及其特征明显程度** - 较大的物体更容易被远处捕捉到并正确分类。同样地,具有独特纹理/颜色对比强烈的对象也相对容易辨认出来即使它们位于较远位置处[^4]。 4. **光照条件及其他外部干扰源** - 白天充足阳光下相比夜晚昏暗场景自然会有更好的表现效果 。另外雨雪天气也可能造成一定程度上的视线阻碍进而缩短实际应用中的视距限界[^5]。 综上所述 ,虽然理论上基于该硬件平台构建的应用程序可以在几十米甚至上百米范围内完成某些特定类型的物品侦测工作(具体取决于上述提到的各种变量组合情况),但在设计项目初期就应该充分考虑这些参数以便合理规划部署方案达到预期功能需求 。 ```python import kpu as ku from Maix import GPIO, I2S, FFT, image def load_model(path_to_model): task = ku.load(path_to_model) return task task_fd = load_model("/sd/KPU/face_detect/face_detection.kmodel") # 加载人脸检测模型作为例子展示加载过程 img = img.Image(size=(224, 224)) # 创建空白图片用于测试输入尺寸适配 fm.register(board_info.PIN9, fm.fpioa.GPIOHS0) # 初始化GPIO口连接至屏幕显示输出控制信号线 lcd.init() # LCD初始化函数调用语句 while True: img.clear() output=ku.run(task_fd,img) if max(output)>0.8: # 假设阈值设置为0.8表示当预测概率超过此值时认为成功匹配到了目标类别 print("Detected!") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

叶与花语

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值