色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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
    +關注

    關注

    114

    文章

    5190

    瀏覽量

    214105
收藏 人收藏

    評論

    相關推薦

    Littelfuse推出直角照明輕觸開關

    Littelfuse公司,一家專注于推動可持續、互聯與更安全世界的工業技術制造領導者,近期隆重推出了C&K Switches品牌的EITS系列直角照明輕觸開關。這一系列開關產品的問世,為眾多復雜電子
    的頭像 發表于 12-23 15:30 ?212次閱讀

    Littelfuse推出全新直角照明輕觸開關

    Littelfuse推出 C&K Switches EITS 系列直角照明輕觸開關。這些開關提供表面貼裝 PIP 端子和標準通孔配置,為電信、數據中心和專業音頻/視頻設備等廣泛應用提供創新
    的頭像 發表于 12-18 10:39 ?172次閱讀

    TI高端開關驅動PWM負載

    電子發燒友網站提供《TI高端開關驅動PWM負載.pdf》資料免費下載
    發表于 09-25 11:18 ?0次下載
    <b class='flag-5'>用</b>TI高端開關驅動<b class='flag-5'>PWM</b>負載

    OPA2333P作為精準ADC采集跟隨器電路應該怎么設計能提高采集的精準性和穩定性?

    OPA2333P作為精準ADC采集跟隨器電路應該怎么設計能提高采集的精準性和穩定性
    發表于 08-02 06:05

    表面貼裝 TCXO 汽車電子 DSK1612ATD:精準驅動汽車電子的卓越之選

    表面貼裝 TCXO(汽車電子)DSK1612ATD:精準驅動汽車電子的卓越之選
    的頭像 發表于 08-01 11:02 ?318次閱讀
    表面貼裝 TCXO 汽車電子<b class='flag-5'>用</b> DSK1612ATD:<b class='flag-5'>精準</b>驅動汽車電子的卓越之選

    中國星坤輕觸開關:智能設備的理想選擇!

    在現代電子設備和工業應用中,輕觸開關以其微小的體積和強大的功能,成為了不可或缺的組件。中國星坤公司最新推出的輕觸開關,以其卓越的性能和多樣化的設計,滿足了市場對高性能開關的需求。 防水IP67,高壽
    的頭像 發表于 08-01 10:19 ?358次閱讀
    中國星坤<b class='flag-5'>輕觸</b>開關:智能設備的理想選擇!

    按鍵開關連接器立式貼片 輕觸按鍵3*6*2.5H

    按鍵開關連接器立式貼片 輕觸按鍵3*6*2.5H
    發表于 06-18 09:42 ?0次下載

    輕觸按鍵開關6*6*H貼片式

    連接器52PIN、M.2 NGFF KEY連接器67PIN、板對板連接器、SATA連接器、USB連接器、TYPE C連接器、電池座、WAFER連接器、FPC連接器、接線端子、輕觸按鍵開關、1代天線座、排針排母、DB連接器、同軸線材等,公司的品質穩定,價格優惠,交期快,并可以為
    發表于 06-18 09:38 ?0次下載

    輕觸三功能+常按 SOS 功能手筒LED驅動ICSD3302數據手冊

    電子發燒友網站提供《輕觸三功能+常按 SOS 功能手筒LED驅動ICSD3302數據手冊.pdf》資料免費下載
    發表于 04-25 14:18 ?2次下載

    怎么MULTISIM生成不同占空比的PWM波?

    怎么MULTISIM生成不同占空比的PWM波?又是怎么在這個軟件測量出生成的PWM波的?
    發表于 04-14 22:00

    一種隔絕銀遷移的超長壽命輕觸開關

    一種隔絕銀遷移的輕觸開關
    的頭像 發表于 04-09 14:40 ?367次閱讀

    如何生成脈沖寬度調制PWM信號?

    PWM信號具有許多優點,例如精準性高,可以快速實現控制的響應和控制精度,并快速響應任何運動誤差。
    的頭像 發表于 03-27 16:29 ?1272次閱讀
    如何生成脈沖寬度調制<b class='flag-5'>PWM</b>信號?

    電視機上的港源輕觸開關#輕觸開關# 輕觸開關

    電視機輕觸開關
    2279019514
    發布于 :2024年03月27日 14:35:40

    松下輕觸開關高級指南

    從基礎知識到選型,盡在此冊 何謂輕觸開關? 輕觸開關是指,按壓操作部,實現電流接通或切斷的小型微小電流開關。 “輕觸(Tactile)”,是 "可觸覺感知"的意思,亦即,需要人員識別按壓操作部,且
    發表于 01-10 17:27 ?1447次閱讀
    松下<b class='flag-5'>輕觸</b>開關高級指南
    主站蜘蛛池模板: 深夜草逼逼| 最新黄yyid| 成年人视频在线免费| 色尼玛亚洲综合| 国产偷国产偷亚洲高清SWAG| 亚洲黄色免费观看| 脔到她哭H粗话HWWW男男动漫| a级男女性高爱潮高清试看| 色欲天天婬色婬香影院| 国产在线精品亚洲| 18动漫在线观看| 色噜噜狠狠一区二区三区| 好色的妹妹| chinesevideoshd性舞| 亚婷婷洲AV久久蜜臀无码| 毛片网站网址| 国产成人在线视频网站| 夜夜澡人人爽人人喊_欧美| 欧美麻豆一精品一AV一免费| 国产精品成人啪精品视频免费观看| 亚洲一在线| 日本无修肉动漫在线观看| 精品熟女少妇AV免费观看| www色视频在线观看| 亚洲色综合狠狠综合区| 欧美日韩在线成人看片a| 国产在线亚洲精品观看不卡| 99精品成人无码A片观看金桔| 无套内射无矿码免费看黄| 免费一级片网站| 好男人社区| 大学生第一次破苞疼哭了| 有人有片的观看免费视频| 色爱区综合激情五月综合激情| 九九九九九热| 国产高清视频a在线大全| 95国产精品人妻无码久| 亚洲狠狠97婷婷综合久久久久| 欧美特级特黄AAAAA片| 久久大综合| 国产色偷偷男人的天堂|