0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于RoboMasterC板的RT-Thread使用分享—PWM擴(kuò)展實(shí)驗(yàn)

冬至子 ? 來(lái)源:goldengrandpa ? 作者:goldengrandpa ? 2023-10-13 15:39 ? 次閱讀

創(chuàng)建工程

這次因?yàn)闆](méi)有新增功能所以新建功能部分我就先略過(guò)了,大家可以參考一下上篇文章,其中我修改Kconfig,開啟PWM5 CH1/2/3的部分已經(jīng)提交PR了,各位之后導(dǎo)入工程時(shí)可以先看一下RT-Thread Setting中是否已經(jīng)顯示。

PWM教程之a(chǎn)RGB LED燈調(diào)色

aRGB三原色

aRGB 為一種色彩模式,aRGB 分別代表了 alpha(透明度)、Red(紅色)、Green(綠色)和Blue(藍(lán)色)四個(gè)要素,一般我們給每個(gè)要素設(shè)置十進(jìn)制下 0-255 的取值范圍,通過(guò) 16 進(jìn)制表示就是 0x00-0xFF,因此一個(gè) aRGB 值可以通過(guò)八位十六進(jìn)制數(shù)來(lái)描述,從前到后每?jī)晌灰来螌?duì)應(yīng) a,R,G,B。

在 aRGB 中,alpha 值越大色彩越不透明,RGB 中哪個(gè)值越大,對(duì)應(yīng)的色彩就越強(qiáng)。比如純紅色可以用 8 位 16 進(jìn)制表示為 0xFFFF0000,純綠色可以表示為 0xFF00FF00,純藍(lán)色可以表示為 0xFF0000FF,黃色由藍(lán)色和綠色合成,所以可以表示為 0xFF00FFFF。

程序設(shè)計(jì)

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

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

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

下面就是計(jì)算函數(shù),這里我們需要把傳進(jìn)來(lái)的rt_uint32_t整型進(jìn)行位運(yùn)算,將每八位的值移入給我們的結(jié)構(gòu)體成員內(nèi)。然后用透明度alpha與R、G、B三者依次相乘。后面我們就可以將R、G、B各值作為脈沖寬度。這里R、G、B三個(gè)值計(jì)算出來(lái)范圍是0-65536,我們所以我們后面將PWM周期設(shè)置為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;
}

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

用于MSH命令輸入的參數(shù)都是字符串,所以這里我使用了stroul()函數(shù),這個(gè)函數(shù)可以將字符串轉(zhuǎn)化為無(wú)符號(hào)長(zhǎng)整型。

/*

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" /
使用其中的函數(shù):strtoul(); /
#define PWM_DEV_NAME "pwm5" /
PWM設(shè)備名稱 /
#define PWM_DEV_LEDB_CHANNEL 1 /
藍(lán)燈PWM通道 /
#define PWM_DEV_LEDG_CHANNEL 2 /
綠燈PWM通道 /
#define PWM_DEV_LEDR_CHANNEL 3 /
紅燈PWM通道 */
struct rt_device_pwm pwm_dev; / PWM設(shè)備句柄 /
/ aRGB結(jié)構(gòu)體 /
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[])
{
/
查找設(shè)備 */
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;
/
用于字符串?dāng)?shù)據(jù)的檢測(cè)與轉(zhuǎn)換 */
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);/* 將字符串轉(zhuǎn)換為16進(jìn)制數(shù) */
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)

實(shí)驗(yàn)效果如下我們?cè)贛SH控制臺(tái)輸入0xFF00FF00,就會(huì)亮綠燈。如果輸入0x88888888,就會(huì)顯示如下顏色。

1.jpg

PWM教程之蜂鳴器唱歌

蜂鳴器部分主要參考了RT-Thread文檔中心的蜂鳴器播放器,大家有需要的話可以直接去看官方教程,我這里因?yàn)槠驎?huì)有縮減。

蜂鳴器基礎(chǔ)知識(shí)

蜂鳴器是一種能夠通過(guò)電子信號(hào)控制的發(fā)聲器件。在生活中,幾乎所有能夠發(fā)出嗶嗶響聲的電子器件中都裝有蜂鳴器。蜂鳴器能夠?yàn)槭褂谜咛峁┲庇^的聲音信息,是一種常見(jiàn)的人機(jī)交互模式。

根據(jù)是否內(nèi)置震蕩電路可分為有源蜂鳴器和無(wú)源蜂鳴器。有源蜂鳴器只需要提供直流電壓就可以通過(guò)內(nèi)部的震蕩電路產(chǎn)生震蕩電流進(jìn)而發(fā)出聲音,而無(wú)源蜂鳴器需要輸入特定頻率的方波才能發(fā)出聲音。兩者比較起來(lái),有源蜂鳴器的控制更加簡(jiǎn)單,但是只能發(fā)出單一頻率的聲音,而無(wú)源蜂鳴器雖然控制起來(lái)比較麻煩,但是可以通過(guò)改變輸入方波的頻率發(fā)出不同音調(diào)的聲音,甚至可以用來(lái)演奏樂(lè)曲。

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

程序設(shè)計(jì)

本次我們需要的外設(shè)蜂鳴器,查看原理圖后發(fā)現(xiàn)我們需要的PWM4 CH3已經(jīng)開好了,我們直接去RT-Thread Setting中開啟即可

1.jpg

之后創(chuàng)建beep.c文件,編寫蜂鳴器相關(guān)代碼

/*

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 的設(shè)備需要包含此頭文件
struct rt_device_pwm pwm_device = RT_NULL; //定義 pwm 設(shè)備指針
int beep_init(void)
{
/
查找PWM設(shè)備 /
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); //使能蜂鳴器對(duì)應(yīng)的 PWM 通道
return 0;
}
int beep_off(void)
{
rt_pwm_disable(pwm_device, BEEP_PWM_CH); //失能蜂鳴器對(duì)應(yīng)的 PWM 通道
return 0;
}
int beep_set(uint16_t freq, uint8_t volume)
{
rt_uint32_t period, pulse;
/
將頻率轉(zhuǎn)化為周期 周期單位:ns 頻率單位:HZ /
period = 1000000000 / freq; //unit:ns 1/HZ
10^9 = ns
/
根據(jù)聲音大小計(jì)算占空比 蜂鳴器低電平觸發(fā) /
pulse = period - period / 100 * volume;
/
利用 PWM API 設(shè)定 周期和占空比 */
rt_pwm_set(pwm_device, BEEP_PWM_CH, period, pulse);//channel,period,pulse
return 0;
}
之后我們后面音符頻率對(duì)周期進(jìn)行設(shè)置,下面程序就實(shí)現(xiàn)了播放音符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;
}

后面關(guān)于音樂(lè)數(shù)據(jù)編碼解碼方面的知識(shí),我自己也是完全是跟著教程的復(fù)刻,所以這里就不進(jìn)行教程的搬運(yùn)了,大家自行跟著官方教程吧。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • led燈
    +關(guān)注

    關(guān)注

    22

    文章

    1592

    瀏覽量

    108007
  • RGB
    RGB
    +關(guān)注

    關(guān)注

    4

    文章

    798

    瀏覽量

    58511
  • 蜂鳴器
    +關(guān)注

    關(guān)注

    12

    文章

    891

    瀏覽量

    45953
  • RT-Thread
    +關(guān)注

    關(guān)注

    31

    文章

    1289

    瀏覽量

    40140
  • PWM輸出
    +關(guān)注

    關(guān)注

    1

    文章

    66

    瀏覽量

    5154
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    RT-Thread編程指南

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

    RT-Thread開發(fā),如何有效學(xué)習(xí)RT-Thread的五個(gè)步驟

    RT-Thread推出RT-Thread Inside戰(zhàn)略開放RT-Thread開發(fā)平臺(tái)授權(quán)合作,與硬件十萬(wàn)個(gè)為什么合作首次推出第一款RT-Inside的開發(fā)
    的頭像 發(fā)表于 09-25 09:55 ?3.5w次閱讀
    <b class='flag-5'>RT-Thread</b>開發(fā),如何有效學(xué)習(xí)<b class='flag-5'>RT-Thread</b>的五個(gè)步驟

    Rt-Thread】STM32輸出PWM

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

    RT-Thread Studio驅(qū)動(dòng)SD卡

    總結(jié)前言硬件平臺(tái):RT-Thread ART-Pi STM32H750XBH6開發(fā) H750開發(fā)開發(fā)軟件:RT-Thread Studio參考博客:
    發(fā)表于 12-27 19:13 ?20次下載
    <b class='flag-5'>RT-Thread</b> Studio驅(qū)動(dòng)SD卡

    RT-Thread開源作品秀】基于RT-Thread的星務(wù)平臺(tái)研究

    本作品為了驗(yàn)證星務(wù)軟件在RT-Thread系統(tǒng)運(yùn)行的可行性,底層是否能夠驅(qū)動(dòng)星務(wù)軟件,同時(shí)擴(kuò)展RT-Thread應(yīng)用范圍。ART-Pi作為衛(wèi)星下位機(jī),...
    發(fā)表于 01-25 18:26 ?6次下載
    【<b class='flag-5'>RT-Thread</b>開源作品秀】基于<b class='flag-5'>RT-Thread</b>的星務(wù)平臺(tái)研究

    RT-Thread全球技術(shù)大會(huì):RT-Thread測(cè)試用例集合案例

    RT-Thread全球技術(shù)大會(huì):RT-Thread測(cè)試用例集合案例 ? ? ? ? ? 審核編輯:彭靜
    的頭像 發(fā)表于 05-27 16:34 ?2102次閱讀
    <b class='flag-5'>RT-Thread</b>全球技術(shù)大會(huì):<b class='flag-5'>RT-Thread</b>測(cè)試用例集合案例

    RT-Thread學(xué)習(xí)筆記 RT-Thread的架構(gòu)概述

    RT-Thread 簡(jiǎn)介 作為一名 RTOS 的初學(xué)者,也許你對(duì) RT-Thread 還比較陌生。然而,隨著你的深入接觸,你會(huì)逐漸發(fā)現(xiàn) RT-Thread 的魅力和它相較于其他同類型 RTOS
    的頭像 發(fā)表于 07-09 11:27 ?4557次閱讀
    <b class='flag-5'>RT-Thread</b>學(xué)習(xí)筆記 <b class='flag-5'>RT-Thread</b>的架構(gòu)概述

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

    假期期間打算開一個(gè)坑,和大家分享下基于RoboMaster開發(fā)C型上RT-Thread使用,本系列文章計(jì)劃是給剛接觸STM32和RT-Thread的同學(xué)看的,講的會(huì)稍微基礎(chǔ)一點(diǎn)。 硬件與開發(fā)環(huán)境
    的頭像 發(fā)表于 01-05 12:10 ?2438次閱讀

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

    的通過(guò)Kconfig+CubeMX配置出可以驅(qū)動(dòng)整個(gè)開發(fā)所有外設(shè)的工程的。在社區(qū)前輩的提醒后才知道通過(guò)基于芯片創(chuàng)建工程是沒(méi)有辦法Kconfig配置的。因此我在之后的教程中我會(huì)基于RT-Thread提供
    的頭像 發(fā)表于 01-06 03:05 ?794次閱讀

    RT-Thread文檔_RT-Thread 簡(jiǎn)介

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

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

    RT-Thread文檔_RT-Thread 潘多拉 STM32L475 上手指南
    發(fā)表于 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 介紹與移植
    發(fā)表于 02-22 18:31 ?9次下載
    <b class='flag-5'>RT-Thread</b>文檔_<b class='flag-5'>RT-Thread</b> SMP 介紹與移植

    RT-Thread文檔_PWM 設(shè)備

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

    基于RT-Thread Studio學(xué)習(xí)

    前期準(zhǔn)備:從官網(wǎng)下載 RT-Thread Studio,弄個(gè)賬號(hào)登陸,開啟rt-thread學(xué)習(xí)之旅。
    的頭像 發(fā)表于 05-15 11:00 ?3975次閱讀
    基于<b class='flag-5'>RT-Thread</b> Studio學(xué)習(xí)

    基于rt-thread的socket通信設(shè)計(jì)

    最近再研究 rt-thread 的通信 ,想設(shè)計(jì)出 eps8266(多個(gè)) rt-thread(作為中控) 服務(wù)器的通信框架,使用的開發(fā)是 潘多拉
    的頭像 發(fā)表于 10-13 15:02 ?1370次閱讀
    基于<b class='flag-5'>rt-thread</b>的socket通信設(shè)計(jì)