0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

用精准的PWM轻触你的绚烂多彩

先楫半导体HPMicro 2022-05-26 09:14 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

1简介


本文主要介绍基于HPM6750 EVK Mini板驱动点亮LED三色灯,从而让用户能快速熟悉先楫MCU PWM定时器原理和HPM_SDK Driver API的使用方法。


本文档中有关HPM6750 EVK mini板的使用说明可以参考位于SDK软件包中\Doc目录下的HPM6750EVKMINI_UG.pdf


本文档中有关HPM6750 EVK mini 硬件原理图,请查阅HPM6750EVKMINI硬件设计资料\原理图\HPM6750EVKMINI Rev.B.pdf。


本文档中有关HPM6750 MCU datasheet,请查阅HPM6750_DS.pdf;有关HPM6750 MCU user manual请查阅HPM6750_UM.pdf


本文将基于HPM SDK中pwm driver api接口抽象封装针对LED灯的adapte接口,并通过adapte接口实现LED三色灯的开关和呼吸效果。

2 环境准备


2.1PWM定时器原理


查阅HPM6750 MCU user manual文档中章节:电机系统->45 PWM定时器PWM内容。

9e866d12-dc59-11ec-b80f-dac502259ad0.png

PWM的框图

大致介绍:

l 先楫PWM定时器由4个模块组成:定时器时间基准模块、比较器模块、输出通道模块、PWM输出控制模块。


l 定时器时间基准模块决定PWM定时器运行的时间和周期。通过读写计数器、起始寄存器、重载寄存器、计数器使能来设置定时器时间基准模块。


l PWM生成通过定时器时间基准模块配合比较器以及输出通道来生成输出参考信号。一个输出通道可匹配多个比较器(注意:匹配多个比较器必须连续),当计数器的值等于比较器的值时,产生匹配事件逻辑1,当计数器到达重载数值时,产生重载事件逻辑0。如果比较器的值和重载值相同,则会保持逻辑1产生100%占空比输出,如果比较器的值>重载值,则会保持逻辑0产生0%占空比输出。


l 输出通道输出的参考信号经过PWM输出控制模块处理互补控制、死区插入、取反控制、强制输出、故障保护后,形成输出信号到IO口。如果不对输出控制模块操作则透传输出通道参考信号。由于LED RGB三色灯使用不到以上,本文档不介绍PWM输出控制模块。


l 针对LED 简单的PWM波形,只需要一个比较器即可实现。波形实现如图:

9ed225ea-dc59-11ec-b80f-dac502259ad0.png

波形实现如图

PWM频率:总线时钟频率/重载值。

占空比:比较器值/总步长 * 100。

2.2PWM Driver API梳理

查阅HPM SDK软件API手册中PWM driver APIs章节。

9f131fe6-dc59-11ec-b80f-dac502259ad0.png

针对LED 简单波形使用到的接口有:

//重载值设置pwm_set_reload//计数器起始值设置pwm_set_start_count//比较器配置pwm_config_cmp//PWM波形设置(输出通道和比较器匹配设置)pwm_setup_waveform//加载比较器影子寄存器匹配设置
pwm_load_cmp_shadow_on_match//计时器使能计数pwm_start_counter//计数器禁止计数pwm_stop_counter//更新比较器边沿触发值(调整占空比)pwm_update_raw_cmp_edge_aligned//使能PWM通道输出pwm_enable_output
//禁止PWM通道输出pwm_disable_output

2.3确认LED 硬件PIN脚


查阅HPM6750 EVK mini 硬件原理图,确认LED三色灯三路PWM通道和管脚,分别为:

RED: PWM0.P7 —— PB20

GREEN: PWM1.P1 —— PB18

BLUE: PWM1.P0 —— PB19

9f853ebe-dc59-11ec-b80f-dac502259ad0.png9fc965e4-dc59-11ec-b80f-dac502259ad0.png

3 接口封装

3.1PWM初始化

pwm_port_handle_t hpm_pwm_init(PWM_Type* pwm_id, uint32_t pwm_out, uint32_t pwm_cmp, bool init_zero, clock_name_t clock_name){ led_pwm_t *handle = malloc(sizeof(led_pwm_t)); if(NULL == handle) return NULL; memset(handle, 0, sizeof(led_pwm_t)); handle->pwm = pwm_id; handle->reload = 0; handle->step = 0; handle->pwm_irq = 0; handle->pwm_cmp = pwm_cmp; handle->pwm_ch = pwm_out; handle->pwm_cmp_initial_zero = init_zero; handle->bus_freq = clock_get_frequency(clock_name); return (pwm_port_handle_t)handle;}

handle->pwm_irq = 0; handle->pwm_cmp = pwm_cmp; handle->pwm_ch = pwm_out; handle->pwm_cmp_initial_zero = init_zero; handle->bus_freq = clock_get_frequency(clock_name); return (pwm_port_handle_t)handle;

3.2PWM释放


void hpm_pwm_deinit(pwm_port_handle_t pwm_handle){ led_pwm_t *handle = (led_pwm_t *)pwm_handle; if(NULL == handle) return; pwm_disable_output(handle->pwm, handle->pwm_ch); free(handle); handle = NULL; return;

3.3PWM运行


#define PWM_DUTY_STEP_COUNT (100U)/*duty: 0~100%, freq: 100~200000000*/int hpm_pwm_start(pwm_port_handle_t pwm_handle, uint32_t duty, uint32_t freq){ led_pwm_t *handle = (led_pwm_t *)pwm_handle; uint32_t reload, now_cmp; pwm_cmp_config_t cmp_config = {0}; pwm_config_t pwm_config = {0}; if(NULL == handle) { return -1; } if(freq > handle->bus_freq) { return -2; } reload = handle->bus_freq / freq - 1; //start 0 index if(reload == 0) return -2; if(reload != handle->reload || handle->reload == 0) { handle->reload = reload; pwm_stop_counter(handle->pwm); pwm_get_default_pwm_config(handle->pwm, &pwm_config); pwm_get_default_cmp_config(handle->pwm, &cmp_config); pwm_config.enable_output = false; pwm_config.dead_zone_in_half_cycle = 0; pwm_config.invert_output = false; /* * reload and start counter */ pwm_set_reload(handle->pwm, 0, handle->reload); pwm_set_start_count(handle->pwm, 0, 0); cmp_config.mode = pwm_cmp_mode_output_compare; cmp_config.cmp = handle->pwm_cmp_initial_zero ? 0 : handle->reload + 1; cmp_config.update_trigger = pwm_shadow_register_update_on_modify; /* config initial compare value which should take affect immediately */ pwm_config_cmp(handle->pwm, handle->pwm_cmp, &cmp_config); /* * config pwm as output driven by cmp */ if (status_success != pwm_setup_waveform(handle->pwm, handle->pwm_ch, &pwm_config, handle->pwm_cmp, &cmp_config, 1)) { printf("failed to setup waveform\n"); return -3; } pwm_load_cmp_shadow_on_match(handle->pwm, handle->pwm_cmp, &cmp_config); handle->step = (handle->reload + 1)/PWM_DUTY_STEP_COUNT; pwm_update_raw_cmp_edge_aligned(handle->pwm, handle->pwm_cmp, handle->pwm_cmp_initial_zero ? 0 : handle->reload + 1); pwm_start_counter(handle->pwm); } if(duty == 100) { now_cmp = handle->reload + 1; } else { now_cmp = handle->step * PWM_DUTY_STEP_COUNT/100 * duty; } pwm_update_raw_cmp_edge_aligned(handle->pwm, handle->pwm_cmp, now_cmp); pwm_enable_output(handle->pwm, handle->pwm_ch); return 0;

3.4PWM停止


nt hpm_pwm_stop(pwm_port_handle_t pwm_handle){ led_pwm_t *handle = (led_pwm_t *)pwm_handle; if(NULL == handle) return -1; pwm_disable_output(handle->pwm, handle->pwm_ch); return 0;

4 功能实现

4.1呼吸灯功能


#define LED_PWM_FREQ 200000 //200khz

int sample_breath_lamp(pwm_port_handle_t handle){ if(NULL == handle) { printf("handle is null\n"); return -1; } for(uint32_t i = 0; i <= 100; i++) { hpm_pwm_start(handle, i, LED_PWM_FREQ); board_delay_ms(10); } for(uint32_t i = 100; i > 0; i--) { hpm_pwm_start(handle, i, LED_PWM_FREQ); board_delay_ms(10); } hpm_pwm_stop(handle); return 0;}

4.2LED点亮呼吸


board_init(); board_init_rgb_pwm_pins(); printf("rgb led example\n"); pwm_port_handle_t red_handle = hpm_pwm_init(RED_PWM, RED_PWM_OUT, RED_PWM_CMP, RED_PWM_CMP_INITIAL_ZERO, RED_PWM_CLOCK_NAME); if(red_handle == NULL) { printf("red pwm init fail!\n"); while(1); } pwm_port_handle_t green_handle = hpm_pwm_init(GREEN_PWM, GREEN_PWM_OUT, GREEN_PWM_CMP, GREEN_PWM_CMP_INITIAL_ZERO, GREEN_PWM_CLOCK_NAME); if(green_handle == NULL) { printf("green pwm init fail!\n"); while(1); } pwm_port_handle_t blue_handle = hpm_pwm_init(BLUE_PWM, BLUE_PWM_OUT, BLUE_PWM_CMP, BLUE_PWM_CMP_INITIAL_ZERO, BLUE_PWM_CLOCK_NAME); if(blue_handle == NULL) { printf("blue pwm init fail!\n"); while(1); } //on led and off led hpm_pwm_start(red_handle, 100, LED_PWM_FREQ); board_delay_ms(1000); hpm_pwm_start(red_handle, 0, LED_PWM_FREQ); board_delay_ms(1000); hpm_pwm_start(green_handle, 100, LED_PWM_FREQ); board_delay_ms(1000); hpm_pwm_start(green_handle, 0, LED_PWM_FREQ); board_delay_ms(1000); hpm_pwm_start(blue_handle, 100, LED_PWM_FREQ); board_delay_ms(1000); hpm_pwm_start(blue_handle, 0, LED_PWM_FREQ); board_delay_ms(1000); while(1) { printf("now red breath...\n"); sample_breath_lamp(red_handle); printf("now green breath...\n"); sample_breath_lamp(green_handle); printf("now bule breath...\n"); sample_breath_lamp(blue_handle); } hpm_pwm_deinit(red_handle); hpm_pwm_deinit(green_handle); hpm_pwm_deinit(blue_handle); return 0;}

5 功能测试

5.1 生成rgb_led工程


工程路径在HPM_SDK 文件夹:“hpm_sdk\samples\rgb_led

a0185e9c-dc59-11ec-b80f-dac502259ad0.png

根据SDK 开发指南文档《HPM6750EVKMINI_UG》中的工程生成步骤,在rgb_led目录下来生成segger embedded studio的工程文件。

a0506e5e-dc59-11ec-b80f-dac502259ad0.png

通过双击工程文件multcore_core0.emProject可以直接进入SES(segger embedded studio) 。

a0cdb080-dc59-11ec-b80f-dac502259ad0.png

双击“multcore_core0.emProject”打开该工程,如下图。

a1182584-dc59-11ec-b80f-dac502259ad0.png

5.2 运行rgb_led

运行rgb_led例程,可以查看到Mini板三色点亮熄灭以及循环呼吸效果。

a1677a08-dc59-11ec-b80f-dac502259ad0.pnga1ed3ce2-dc59-11ec-b80f-dac502259ad0.png


5.3PWM波形查看

通过示波器查看rgb pwm波形,确认频率和占空比是否正确。

A.200KHz,50%占空比

实测:一个周期5us,波峰2.495us。

a269b42a-dc59-11ec-b80f-dac502259ad0.pnga2cc9dce-dc59-11ec-b80f-dac502259ad0.png

B.200KHz, 20%占空比

实测:一个周期5us,波峰:994.7ns,验证通过。

a35c18e6-dc59-11ec-b80f-dac502259ad0.pnga3ef9f58-dc59-11ec-b80f-dac502259ad0.png

C.100KHz, 50%占空比

实测:一个周期10us,波峰4.995us,验证通过。

a4735c08-dc59-11ec-b80f-dac502259ad0.pnga4fd6e8e-dc59-11ec-b80f-dac502259ad0.png

D.100KHz, 10%占空比

实测:一个周期10us,波峰994.8ns,验证通过。

a5852e00-dc59-11ec-b80f-dac502259ad0.pnga63d43a0-dc59-11ec-b80f-dac502259ad0.png

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • PWM
    PWM
    +关注

    关注

    116

    文章

    5847

    浏览量

    223853
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    1分钟搞懂|什么是PWM脉宽调制#脉宽调制 #PMW #电路知识 #占空比

    PWM
    安泰小课堂
    发布于 :2025年11月28日 17:55:03

    TE Connectivity ALCOSWITCH轻触开关技术解析与应用指南

    TE Connectivity的(TE) Alcoswitch轻触开关是设计旨在安装到印刷电路板 (PCB) 上的小型机电设备。这些开关紧凑轻薄,在多位置和超微型型材中提供高可靠性和更长的生命周期
    的头像 发表于 11-06 16:01 218次阅读

    轻触开关:指尖上的 “魔法钥匙”,寰立为开启便捷电子世界

    在电子设备如繁星般遍布生活的今天,有这样一种看似不起眼,却能让设备 “听令于指尖” 的关键元件 —— 轻触开关。它如同藏在电子设备里的 “魔法钥匙”,轻轻一按,就能触发设备的各种功能,而寰立开关旗下
    的头像 发表于 10-14 11:47 458次阅读
    <b class='flag-5'>轻触</b>开关:指尖上的 “魔法钥匙”,寰立为<b class='flag-5'>你</b>开启便捷电子世界

    一文读懂 PWM控制背光亮度原理

    (脉冲宽度调制) 的技术。本文将用通俗易懂的方式,为揭开PWM调光的神秘面纱。 一、核心原理:“开关”代替“旋钮” 想象一下两种控制灯泡亮度的方法: 模拟调光(旋钮式):像一个老式的调光台灯,通过
    发表于 09-03 08:48

    是德示波器如何用数字通道快速定位PWM故障

    PWM(脉冲宽度调制)信号在电机控制、电源管理、通信协议等领域广泛应用,其稳定性直接影响系统性能。当PWM信号出现异常时,快速定位故障是工程师的关键需求。是德示波器凭借其强大的数字通道功能和精准
    的头像 发表于 07-08 17:04 438次阅读
    是德示波器如何用数字通道快速定位<b class='flag-5'>PWM</b>故障

    KSC DCT系列轻触开关的主要优势和应用领域

    双电路技术是指在一个轻触开关(单刀双掷,SPDT)内部产生两个独立输出信号的功能。请参见下面的SPDT电路。KSC DCT轻触开关有一个共用引脚、一个常关(NC)引脚和一个常开(NO)引脚。如果用户
    的头像 发表于 06-26 14:35 738次阅读
    KSC DCT系列<b class='flag-5'>轻触</b>开关的主要优势和应用领域

    知道船变压器有哪些吗?

    在船舶和海洋平台上,电力系统的稳定运行至关重要,而船变压器作为其中的关键设备,其种类繁多,各具特点。知道船变压器有哪些吗?让我们一起来揭开它们的神秘面纱。CSD船变压器是船舶供
    的头像 发表于 06-01 00:00 482次阅读
    <b class='flag-5'>你</b>知道船<b class='flag-5'>用</b>变压器有哪些吗?

    轻触开关运用原理

    GD-TS-10-1RS 一、机械式轻触开关 ‌ ‌ 核心结构组件 ‌ ‌ 金属弹片/导电橡胶 ‌:受力形变后接触导电部件,形成通路13。 ‌ 引脚配置 ‌:通常为5引脚(含接地引脚),外力作用
    的头像 发表于 05-26 17:14 816次阅读
    <b class='flag-5'>轻触</b>开关运用原理

    LED驱动芯片功能单一调光不精准怎么解决?找禾润HTR3229支持16×8或15×9阵列的LED驱动

    的 I2C 接口编程,轻松实现高效控制。每路 LED 配备 8 位 PWM 数据独立调光,结合每路 CSx 的 8 位直流扫描数据,支持每个点 256 阶线性 PWM 调光,调光精准细腻,光效随心掌控
    发表于 05-22 18:21

    工业传感器的“爱情长跑”:精准数据守护每一份信任

    520特别策划属于工程师的浪漫2025/05/20工业浪漫精准数据精准数据守护每一份信任520,这个以“爱”为名的日子总让人联想到玫瑰、誓言与浪漫但在工业世界中,有一种“爱”更为深沉——它是传感器
    的头像 发表于 05-20 07:34 503次阅读
    工业传感器的“爱情长跑”:<b class='flag-5'>用</b><b class='flag-5'>精准</b>数据守护每一份信任

    Littelfuse推出KSC2 DCT系列轻触开关

    Littelfuse宣布推出C&K Switches KSC2 KSC双电路技术 (DCT) 系列轻触开关。这是C&K创新轻触开关系列的最新产品,致动器高度为3.5毫米,低于致动器
    的头像 发表于 02-26 15:08 1074次阅读

    【电子工具】DM40数字万表,60000计数(Max),精准且创新设计,快捷高效;集万表,示波器及信号发生器功能于一体!

    DM40数字万表,60000计数(Max),精准且创新设计,快捷高效;集万表,示波器及信号发生器功能于一体! DM40数字万表是正点原子全新推出的首款智能万
    发表于 02-17 15:35

    Littelfuse推出直角照明轻触开关

    Littelfuse公司,一家专注于推动可持续、互联与更安全世界的工业技术制造领导者,近期隆重推出了C&K Switches品牌的EITS系列直角照明轻触开关。这一系列开关产品的问世,为众多复杂电子
    的头像 发表于 12-23 15:30 989次阅读

    Littelfuse推出C&amp;K Switches EITS系列直角照明轻触开关

    Littelfuse公司,作为工业技术制造领域的佼佼者,一直致力于推动世界的可持续发展、互联及安全性。近日,该公司推出了C&K Switches旗下的EITS系列直角照明轻触开关,为众多行业带来
    的头像 发表于 12-18 13:39 974次阅读

    Littelfuse推出全新直角照明轻触开关

    Littelfuse推出 C&K Switches EITS 系列直角照明轻触开关。这些开关提供表面贴装 PIP 端子和标准通孔配置,为电信、数据中心和专业音频/视频设备等广泛应用提供创新
    的头像 发表于 12-18 10:39 1129次阅读