在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

基于RoboMasterC板的RT-Thread使用分享—PWM擴展實驗

冬至子 ? 來源:goldengrandpa ? 作者:goldengrandpa ? 2023-10-13 15:39 ? 次閱讀

創建工程

這次因為沒有新增功能所以新建功能部分我就先略過了,大家可以參考一下上篇文章,其中我修改Kconfig,開啟PWM5 CH1/2/3的部分已經提交PR了,各位之后導入工程時可以先看一下RT-Thread Setting中是否已經顯示。

PWM教程之aRGB LED燈調色

aRGB三原色

aRGB 為一種色彩模式,aRGB 分別代表了 alpha(透明度)、Red(紅色)、Green(綠色)和Blue(藍色)四個要素,一般我們給每個要素設置十進制下 0-255 的取值范圍,通過 16 進制表示就是 0x00-0xFF,因此一個 aRGB 值可以通過八位十六進制數來描述,從前到后每兩位依次對應 a,R,G,B。

在 aRGB 中,alpha 值越大色彩越不透明,RGB 中哪個值越大,對應的色彩就越強。比如純紅色可以用 8 位 16 進制表示為 0xFFFF0000,純綠色可以表示為 0xFF00FF00,純藍色可以表示為 0xFF0000FF,黃色由藍色和綠色合成,所以可以表示為 0xFF00FFFF。

程序設計

根據上面的描述我們就可以創建一個rt_uint32_t類型變量作為我們的aRGB值。之后每八位分別作為我們的alpha(透明度)、Red(紅色)、Green(綠色)和Blue(藍色)四個要素。

我這里為了代碼變量的清晰,我定義了一個aRGB結構體,用于裝載計算后的aRGB值。大家可以自行嘗試一下。這里三原色的類型為rt_uint16_t的原因之后我們計算過程中需要給它們乘以alpha因此使用rt_uint8_t會溢出。

typedef struct
{
rt_uint8_t alpha; /* 透明度 最大值為FF */
rt_uint16_t red;
rt_uint16_t green;
rt_uint16_t blue;
} aRGB;

下面就是計算函數,這里我們需要把傳進來的rt_uint32_t整型進行位運算,將每八位的值移入給我們的結構體成員內。然后用透明度alpha與R、G、B三者依次相乘。后面我們就可以將R、G、B各值作為脈沖寬度。這里R、G、B三個值計算出來范圍是0-65536,我們所以我們后面將PWM周期設置為65536。

static void aRGB_count(aRGB* LED_aRGB, rt_uint32_t set_aRGB)
{
LED_aRGB->alpha = (set_aRGB & 0xFF000000) >> 24;
LED_aRGB->red = ((set_aRGB & 0x00FF0000) >> 16) * LED_aRGB->alpha;
LED_aRGB->green = ((set_aRGB & 0x0000FF00) >> 8) * LED_aRGB->alpha;
LED_aRGB->blue = ((set_aRGB & 0x000000FF) >> 0) * LED_aRGB->alpha;
}

下面就放出完整代碼,這里我是自定義了一個MSH命令,輸入aRGB_led_sample 0xFF00FF00之類的命令即可設置aRGB值。

用于MSH命令輸入的參數都是字符串,所以這里我使用了stroul()函數,這個函數可以將字符串轉化為無符號長整型。

/*

Copyright (c) 2006-2021, RT-Thread Development Team

SPDX-License-Identifier: Apache-2.0

Change Logs:
Date Author Notes
2022-12-31 Goldengrandpa the first version
/
#include
#include
#include "stdlib.h" /
使用其中的函數:strtoul(); /
#define PWM_DEV_NAME "pwm5" /
PWM設備名稱 /
#define PWM_DEV_LEDB_CHANNEL 1 /
藍燈PWM通道 /
#define PWM_DEV_LEDG_CHANNEL 2 /
綠燈PWM通道 /
#define PWM_DEV_LEDR_CHANNEL 3 /
紅燈PWM通道 */
struct rt_device_pwm pwm_dev; / PWM設備句柄 /
/ aRGB結構體 /
typedef struct
{
rt_uint8_t alpha; /
透明度 最大值為FF /
rt_uint16_t red;
rt_uint16_t green;
rt_uint16_t blue;
} aRGB;
aRGB LED_aRGB={0,0,0,0};
static void aRGB_count(aRGB
LED_aRGB, rt_uint32_t set_aRGB)
{
LED_aRGB->alpha = (set_aRGB & 0xFF000000) >> 24;
LED_aRGB->red = ((set_aRGB & 0x00FF0000) >> 16) * LED_aRGB->alpha;
LED_aRGB->green = ((set_aRGB & 0x0000FF00) >> 8) * LED_aRGB->alpha;
LED_aRGB->blue = ((set_aRGB & 0x000000FF) >> 0) * LED_aRGB->alpha;
}
static int aRGB_led_sample(int argc, char argv[])
{
/
查找設備 */
pwm_dev = (struct rt_device_pwm ) rt_device_find(PWM_DEV_NAME);
if (pwm_dev == RT_NULL)
{
rt_kprintf("pwm sample run failed! can't find %s device!n", PWM_DEV_NAME);
return RT_ERROR;
}
rt_uint32_t ui32_aRGB = 0;
/
用于字符串數據的檢測與轉換 */
rt_kprintf("input para is: %s %sn",argv[0],argv[1]);
if(2!=argc)
{
rt_kprintf("error cmd! please input as: (0x7FFFFFFF) n");
return RT_ERROR;
}
ui32_aRGB=(rt_uint32_t)strtoul(argv[1],NULL,16);/* 將字符串轉換為16進制數 */
aRGB_count(&LED_aRGB, ui32_aRGB);
rt_uint32_t period=65536;
rt_pwm_set(pwm_dev, PWM_DEV_LEDB_CHANNEL, period, LED_aRGB.blue);
rt_pwm_set(pwm_dev, PWM_DEV_LEDG_CHANNEL, period, LED_aRGB.green);
rt_pwm_set(pwm_dev, PWM_DEV_LEDR_CHANNEL, period, LED_aRGB.red);
rt_pwm_enable(pwm_dev, PWM_DEV_LEDB_CHANNEL);
rt_pwm_enable(pwm_dev, PWM_DEV_LEDG_CHANNEL);
rt_pwm_enable(pwm_dev, PWM_DEV_LEDR_CHANNEL);
}
MSH_CMD_EXPORT(aRGB_led_sample, pwm aRGB sample)

實驗效果如下我們在MSH控制臺輸入0xFF00FF00,就會亮綠燈。如果輸入0x88888888,就會顯示如下顏色。

1.jpg

PWM教程之蜂鳴器唱歌

蜂鳴器部分主要參考了RT-Thread文檔中心的蜂鳴器播放器,大家有需要的話可以直接去看官方教程,我這里因為篇幅原因會有縮減。

蜂鳴器基礎知識

蜂鳴器是一種能夠通過電子信號控制的發聲器件。在生活中,幾乎所有能夠發出嗶嗶響聲的電子器件中都裝有蜂鳴器。蜂鳴器能夠為使用者提供直觀的聲音信息,是一種常見的人機交互模式。

根據是否內置震蕩電路可分為有源蜂鳴器和無源蜂鳴器。有源蜂鳴器只需要提供直流電壓就可以通過內部的震蕩電路產生震蕩電流進而發出聲音,而無源蜂鳴器需要輸入特定頻率的方波才能發出聲音。兩者比較起來,有源蜂鳴器的控制更加簡單,但是只能發出單一頻率的聲音,而無源蜂鳴器雖然控制起來比較麻煩,但是可以通過改變輸入方波的頻率發出不同音調的聲音,甚至可以用來演奏樂曲。

這里我們板載的是無源貼片蜂鳴器,這也是我們這個篇章的先決條件。

程序設計

本次我們需要的外設蜂鳴器,查看原理圖后發現我們需要的PWM4 CH3已經開好了,我們直接去RT-Thread Setting中開啟即可

1.jpg

之后創建beep.c文件,編寫蜂鳴器相關代碼

/*

Copyright (c) 2006-2021, RT-Thread Development Team

SPDX-License-Identifier: Apache-2.0

Change Logs:
Date Author Notes
2023-01-01 Goldengrandpa the first version
*/
#include "beep.h"
#include //使用 RT-Thread 的設備需要包含此頭文件
struct rt_device_pwm pwm_device = RT_NULL; //定義 pwm 設備指針
int beep_init(void)
{
/
查找PWM設備 /
pwm_device = (struct rt_device_pwm )rt_device_find(BEEP_PWM_DEVICE);
if (pwm_device == RT_NULL)
{
rt_kprintf("pwm device %s not found!n", BEEP_PWM_DEVICE);
return -RT_ERROR;
}
return 0;
}
int beep_on(void)
{
rt_pwm_enable(pwm_device, BEEP_PWM_CH); //使能蜂鳴器對應的 PWM 通道
return 0;
}
int beep_off(void)
{
rt_pwm_disable(pwm_device, BEEP_PWM_CH); //失能蜂鳴器對應的 PWM 通道
return 0;
}
int beep_set(uint16_t freq, uint8_t volume)
{
rt_uint32_t period, pulse;
/
將頻率轉化為周期 周期單位:ns 頻率單位:HZ /
period = 1000000000 / freq; //unit:ns 1/HZ
10^9 = ns
/
根據聲音大小計算占空比 蜂鳴器低電平觸發 /
pulse = period - period / 100 * volume;
/
利用 PWM API 設定 周期和占空比 */
rt_pwm_set(pwm_device, BEEP_PWM_CH, period, pulse);//channel,period,pulse
return 0;
}
之后我們后面音符頻率對周期進行設置,下面程序就實現了播放音符CDEFGAB的功能。

#include
#include "beep.h"
uint16_t freq_tab[12] = {262, 277, 294, 311, 330, 349, 369, 392, 415, 440, 466, 494}; //原始頻率表 CDEFGAB
uint8_t beep_volume = 3;
int main(void)
{
/* user app entry */
int i;
beep_init();
for (i = 0; i < 12; i++)
{
beep_set(freq_tab[i], beep_volume);
beep_on();
rt_thread_mdelay(500);
beep_off();
rt_thread_mdelay(500);
}
return 0;
}

后面關于音樂數據編碼解碼方面的知識,我自己也是完全是跟著教程的復刻,所以這里就不進行教程的搬運了,大家自行跟著官方教程吧。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • led燈
    +關注

    關注

    22

    文章

    1592

    瀏覽量

    108235
  • RGB
    RGB
    +關注

    關注

    4

    文章

    801

    瀏覽量

    58628
  • 蜂鳴器
    +關注

    關注

    12

    文章

    893

    瀏覽量

    46050
  • RT-Thread
    +關注

    關注

    31

    文章

    1305

    瀏覽量

    40303
  • PWM輸出
    +關注

    關注

    1

    文章

    66

    瀏覽量

    5207
收藏 人收藏

    評論

    相關推薦

    RT-Thread編程指南

    RT-Thread編程指南——RT-Thread開發組(2015-03-31)。RT-Thread做為國內有較大影響力的開源實時操作系統,本文是RT-Thread實時操作系統的編程指南
    發表于 11-26 16:06 ?0次下載

    RT-Thread開發,如何有效學習RT-Thread的五個步驟

    RT-Thread推出RT-Thread Inside戰略開放RT-Thread開發平臺授權合作,與硬件十萬個為什么合作首次推出第一款RT-Inside的開發
    的頭像 發表于 09-25 09:55 ?3.5w次閱讀
    <b class='flag-5'>RT-Thread</b>開發,如何有效學習<b class='flag-5'>RT-Thread</b>的五個步驟

    Rt-Thread】STM32輸出PWM

    主要記錄了Rt-Thread 中STM32 輸出PWM配置過程,通過設置不同頻率PWM使蜂鳴器發出不同音調
    發表于 12-16 16:57 ?17次下載
    【<b class='flag-5'>Rt-Thread</b>】STM32輸出<b class='flag-5'>PWM</b>

    RT-Thread Studio驅動SD卡

    總結前言硬件平臺:RT-Thread ART-Pi STM32H750XBH6開發 H750開發開發軟件:RT-Thread Studio參考博客:
    發表于 12-27 19:13 ?20次下載
    <b class='flag-5'>RT-Thread</b> Studio驅動SD卡

    RT-Thread開源作品秀】基于RT-Thread的星務平臺研究

    本作品為了驗證星務軟件在RT-Thread系統運行的可行性,底層是否能夠驅動星務軟件,同時擴展RT-Thread應用范圍。ART-Pi作為衛星下位機,...
    發表于 01-25 18:26 ?6次下載
    【<b class='flag-5'>RT-Thread</b>開源作品秀】基于<b class='flag-5'>RT-Thread</b>的星務平臺研究

    RT-Thread全球技術大會:RT-Thread測試用例集合案例

    RT-Thread全球技術大會:RT-Thread測試用例集合案例 ? ? ? ? ? 審核編輯:彭靜
    的頭像 發表于 05-27 16:34 ?2126次閱讀
    <b class='flag-5'>RT-Thread</b>全球技術大會:<b class='flag-5'>RT-Thread</b>測試用例集合案例

    RT-Thread學習筆記 RT-Thread的架構概述

    RT-Thread 簡介 作為一名 RTOS 的初學者,也許你對 RT-Thread 還比較陌生。然而,隨著你的深入接觸,你會逐漸發現 RT-Thread 的魅力和它相較于其他同類型 RTOS
    的頭像 發表于 07-09 11:27 ?4592次閱讀
    <b class='flag-5'>RT-Thread</b>學習筆記 <b class='flag-5'>RT-Thread</b>的架構概述

    基于RoboMasterC型開發RT-Thread使用分享(一)

    假期期間打算開一個坑,和大家分享下基于RoboMaster開發C型上RT-Thread使用,本系列文章計劃是給剛接觸STM32和RT-Thread的同學看的,講的會稍微基礎一點。 硬件與開發環境
    的頭像 發表于 01-05 12:10 ?2542次閱讀

    基于RoboMasterC型開發RT-Thread使用分享(二)

    的通過Kconfig+CubeMX配置出可以驅動整個開發所有外設的工程的。在社區前輩的提醒后才知道通過基于芯片創建工程是沒有辦法Kconfig配置的。因此我在之后的教程中我會基于RT-Thread提供
    的頭像 發表于 01-06 03:05 ?840次閱讀

    RT-Thread文檔_RT-Thread 簡介

    RT-Thread文檔_RT-Thread 簡介
    發表于 02-22 18:22 ?5次下載
    <b class='flag-5'>RT-Thread</b>文檔_<b class='flag-5'>RT-Thread</b> 簡介

    RT-Thread文檔_RT-Thread 潘多拉 STM32L475 上手指南

    RT-Thread文檔_RT-Thread 潘多拉 STM32L475 上手指南
    發表于 02-22 18:23 ?9次下載
    <b class='flag-5'>RT-Thread</b>文檔_<b class='flag-5'>RT-Thread</b> 潘多拉 STM32L475 上手指南

    RT-Thread文檔_RT-Thread SMP 介紹與移植

    RT-Thread文檔_RT-Thread SMP 介紹與移植
    發表于 02-22 18:31 ?9次下載
    <b class='flag-5'>RT-Thread</b>文檔_<b class='flag-5'>RT-Thread</b> SMP 介紹與移植

    RT-Thread文檔_PWM 設備

    RT-Thread文檔_PWM 設備
    發表于 02-22 18:35 ?1次下載
    <b class='flag-5'>RT-Thread</b>文檔_<b class='flag-5'>PWM</b> 設備

    基于RT-Thread Studio學習

    前期準備:從官網下載 RT-Thread Studio,弄個賬號登陸,開啟rt-thread學習之旅。
    的頭像 發表于 05-15 11:00 ?4089次閱讀
    基于<b class='flag-5'>RT-Thread</b> Studio學習

    基于rt-thread的socket通信設計

    最近再研究 rt-thread 的通信 ,想設計出 eps8266(多個) rt-thread(作為中控) 服務器的通信框架,使用的開發是 潘多拉
    的頭像 發表于 10-13 15:02 ?1406次閱讀
    基于<b class='flag-5'>rt-thread</b>的socket通信設計
    主站蜘蛛池模板: 色视频在线免费看| 三级网址在线| 日本aaaaa级毛片片| 日本不卡在线一区二区三区视频| 中文字幕1区| 老司机亚洲精品影院在线| 99久久国产免费中文无字幕| 亚洲最大的成人网| 深爱婷婷| 老色鬼久久综合第一| 国产吧在线视频| 午夜一级黄色片| 免费公开在线视频| 在线视频91| 末发育女一区二区三区| 亚洲成在人线影视天堂网| 日韩一级高清| 久久这里只精品热在线8| www.亚洲黄色| 末发育娇小性色xxxxx视频| 91福利免费视频| 日本欧美一区二区三区视频| 亚洲六月婷婷| 欧美一级特黄aa大片视频| 狠狠色丁香婷婷综合久久片| 在线看3344免费视频| 六月丁香综合网| 亚洲一区视频在线| 亚洲第一页在线| 男人你懂的在线观看视频| 变态重口极致另类在线| 日日射夜夜| 4438x色| 亚洲国产成人精品青青草原100| 欧美人成在线观看| a级精品九九九大片免费看| 久久女同| 欧美卡一卡二卡新区网站| 四虎在线网址| 国产精品黄网站免费进入| 久久看精品|