国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

STM32通過PWM輸出使蜂鳴器實(shí)現(xiàn)播放音樂功能

這篇具有很好參考價(jià)值的文章主要介紹了STM32通過PWM輸出使蜂鳴器實(shí)現(xiàn)播放音樂功能。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

源碼下載鏈接[點(diǎn)擊跳轉(zhuǎn)]https://download.csdn.net/download/Coin_Collecter/88641632

1.什么是PWM輸出

? ? ? ?PWM,全稱Pulse Width Modulation,即脈寬調(diào)制技術(shù),是一種通過改變信號(hào)的占空比來控制電路的技術(shù)。在PWM信號(hào)中,周期是固定的,而占空比則可以根據(jù)需要進(jìn)行調(diào)整。通過改變占空比,可以控制電路輸出的電壓、電流等物理量的大小,從而實(shí)現(xiàn)對(duì)電路的控制。PWM頻率是指一秒鐘內(nèi)從高電平時(shí)間在到低電平時(shí)間,再從低電平跳到高電平的瞬間次數(shù),也就是一秒鐘內(nèi)有多少個(gè)PWM的周期。PWM周期是指一秒鐘內(nèi)從高電平時(shí)間在到低電平時(shí)間。PWM占空比是指一個(gè)周期內(nèi)高電平時(shí)間和總時(shí)間的比值。

? ? ? ? PWM的基本產(chǎn)生如下圖,即面積等效法,當(dāng)b的占空比為百分之百的時(shí)候,a輸出為高電平,而當(dāng)b在一個(gè)周期占空比為其他數(shù)值的時(shí)候,根據(jù)定積分產(chǎn)生的正弦波面積則不同,經(jīng)過多個(gè)周期不同占空比的時(shí)候,就會(huì)產(chǎn)生不同的面積波形,即產(chǎn)生了一個(gè)模擬信號(hào)。

??????? PWM在生活中有很多應(yīng)用,例如通過PWM輸出控制LED亮度,當(dāng)頻率太小的時(shí)候,一個(gè)周期時(shí)間太長肉眼就能看到LED亮滅的過程,而當(dāng)頻率足夠高的時(shí)候,LED的燈光的亮滅速度趕不上開關(guān)速度(LED燈還沒完全亮就又熄滅了)由于視覺暫留作用人眼不感覺電燈在閃爍,而是感覺燈的亮度減小了,從而達(dá)到了控制LED亮度的效果。

stm32通過pwm驅(qū)動(dòng)無源蜂鳴器音樂,stm32,嵌入式硬件,單片機(jī)

2.如何讓蜂鳴器發(fā)出不同頻率的聲音

2.1設(shè)置預(yù)分頻

void TIMx_BEEP_Config(void){
  //......省略部分代碼 
  TIM_TimeBaseStructure.TIM_Period = 1;//當(dāng)定時(shí)器從0計(jì)數(shù)到255,即為256次,為一個(gè)定時(shí)周期
  TIM_TimeBaseStructure.TIM_Prescaler = 72-1;//設(shè)置預(yù)分頻
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;//設(shè)置時(shí)鐘分頻系數(shù):不分頻
  TIM_OCInitStructure.TIM_Pulse = 0;//占空比0										  			
  //......省略部分代碼 
}

? ? ? ? 由代碼可見預(yù)分頻值為71,則為72分頻(多少分頻都可以,72分配只是為了方便后面計(jì)算),由于STM32的默認(rèn)系統(tǒng)時(shí)鐘頻率為72MHz,分頻后則為1MHz。此時(shí)定時(shí)器會(huì)在一秒內(nèi)計(jì)數(shù)1M次,且由?知道,可以通過改變周期T來得到任意頻率f。

??????? 通過固件庫函數(shù)TIM_SetAutoreload(TIM_TypeDef* TIMx, uint16_t Autoreload);修改自動(dòng)重裝載寄存器周期的值即可得到任意頻率的PWM輸出。

??????? 通過TIM_SetCompare1(TIM_TypeDef* TIMx, uint16_t Compare1);來修改比較寄存器中的比較值,改變PWM輸出的占空比。

2.2音調(diào)頻率對(duì)照?qǐng)D:

stm32通過pwm驅(qū)動(dòng)無源蜂鳴器音樂,stm32,嵌入式硬件,單片機(jī)

? ? ? ? 在有了音調(diào)頻率對(duì)照?qǐng)D后只需要通過調(diào)整PWM輸出頻率即可控制蜂鳴器發(fā)出不同的音調(diào),實(shí)現(xiàn)通過蜂鳴器播放音樂。

??????? 由上述可知,分頻后頻率為1MHz,且,頻率已知,因此可以算出所需的T的值。例如低音1

2.3定義一個(gè)修改占空比和寄存器周期值的函數(shù)

定義一個(gè)set_beep(uint16_t f)函數(shù),變量f為音調(diào)頻率,通過該函數(shù)即可實(shí)現(xiàn)讓蜂鳴器發(fā)出任意頻率的聲音。文章來源地址http://www.zghlxwxcb.cn/news/detail-781654.html

void set_beep(uint16_t f){
	if(f==0){
		TIM_SetAutoreload(TIM1,1);
		TIM_SetCompare1(TIM1,0);
	}else{
		TIM_SetAutoreload(TIM1,(1000000/f));
		TIM_SetCompare1(TIM1,(1000000/f)/15);
	}
}

3.孤勇者樂譜

?4.實(shí)例代碼

main.c

#include "stm32f10x.h"
#include "Beep.h"
#include "SysTick.h"http://里面寫了一個(gè)延時(shí)函數(shù),不重要,因此不上傳該部分的代碼

#define   L1     262-1//低調(diào) do 的頻率
#define   L2     294-1//低調(diào) re 的頻率
#define   L3     330-1//低調(diào) mi 的頻率
#define   L4     350-1//低調(diào) fa 的頻率
#define   L5     392-1//低調(diào) sol 的頻率
#define   L6     440-1//低調(diào) la 的頻率
#define   L7     494-1//低調(diào) si 的頻率
                                               
#define   M1     524-1//中調(diào) do 的頻率
#define   M2     588-1//中調(diào) re 的頻率
#define   M3     660-1//中調(diào) mi 的頻率
#define   M4     700-1//中調(diào) fa 的頻率
#define   M5     784-1//中調(diào) sol 的頻率
#define   M6     880-1//中調(diào) la 的頻率
#define   M7     988-1//中調(diào) si 的頻率
 
#define   H1     1048-1//高調(diào) do 的頻率
#define   H2     1176-1//高調(diào) re 的頻率
#define   H3     1320-1//高調(diào) mi 的頻率
#define   H4     1480-1//高調(diào) fa 的頻率
#define   H5     1640-1//高調(diào) sol 的頻率
#define   H6     1760-1//高調(diào) la 的頻率
#define   H7     1976-1//高調(diào) si 的頻率
 
#define   S      0//不發(fā)音

int16_t music[]=
{
		M3,M3,S,S,M1,M2,M1,M3,M3,S, //都是勇敢的
		M1,M2,M1,M2,M3,L6,M1,L6,M1,L6,M1,M2,M1,L7,L7,S,S, //你額頭的傷口你的不同你犯的錯(cuò)
	    M3,M3,S,S,M1,M2,M1,M3,M3,S, //都不必隱藏
	    M1,M2,M1,M2,M3,L6,M1,L6,M1,L6,M1,M3,M2,L7,L7,S,S, //你破舊的玩偶你的面具你的自我
		L6,M1,M6,M6,M6,M5,M6,M6,M5,M6,M5,M6,M5,M3,M3,M3,S,S, //他們說要帶著光馴服每一頭怪獸
		L6,M1,M6,M6,M6,M5,M6,M5,M7,M7,M7,M6,M7,M7,M6,M3,M3,S,S, //他們說要縫好你的傷沒人愛小丑
		M3,M5,M3,M2,M3,M2,M3,M2,S, //為何孤獨(dú)不可光榮
		M3,M5,M3,M5,M3,M2,M3,M2,M3,M2,S, //人只有不完美值得歌頌
		M1,M2,M3,L6,M1,M3,M2,M3,M2,M1,M1,L6,L6,S,S,//誰說污泥滿身的不算英雄
		M6,M7,H1,H2,M7,H1,H1,S,	//愛你孤身走暗巷
		H1,M7,H1,H2,M7,H1,H1,S, //愛你不跪的模樣
		H1,H2,H3,H2,H3,H2,H3,H3,H2,H3,H5,H3,S, //愛你對(duì)峙過絕望不肯哭一場(chǎng)
		M6,M7,H1,H2,M7,H1,H1,H1,M7,H1,H2,M7,H1,H1,S, //愛你破爛的衣裳卻敢堵命運(yùn)的槍
	    H1,H2,H3,H2,H3,H2,H3,H3,H2,H3,H5,H3,S, //愛你和我那么像缺口一樣
		H5,H3, //去嗎
		H5,H3,S, //配嗎
	    H5,H3,H5,H6,H3,H5,S, //這襤褸的披風(fēng)
		H5,H3,//戰(zhàn)嗎
	    H5,H3,S, //戰(zhàn)啊
		H5,H3,H5,H6,H3,H5,H5,H5,H3,H2,H2,H2,H1,H3,H3,H2,H2,H2,H1,H1,M6,M6,S,S, //以最卑微的夢(mèng)致那黑夜中的嗚咽與怒吼
		H5,H5,H3,H2,H2,H2,H1,H3,H3,H2,H2,H2,H1,H1,M6,M6,S,S, //誰說站在光里才算英雄
};

int main(void)
{	
	uint16_t i;
	TIMx_BEEP_Config();
	while(1)
    {
		for(i=0;i<sizeof(music)/sizeof(music[0]);i++)
        {
			set_beep(music[i]);
			delay_ms(250);
		}
	}
}

Beep.c

#include "Beep.h"   
//不同型號(hào)的單片機(jī)蜂鳴器所對(duì)應(yīng)的引腳和定時(shí)器都有所不同,需要根據(jù)實(shí)際情況修改
void TIMx_BEEP_Config(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	TIM_OCInitTypeDef  TIM_OCInitStructure;																				
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
    TIM_TimeBaseStructure.TIM_Period = 1;
    TIM_TimeBaseStructure.TIM_Prescaler = 72-1;
    TIM_TimeBaseStructure.TIM_ClockDivision = 0;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStructure.TIM_Pulse = 0;
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
	TIM_OC1Init(TIM1, &TIM_OCInitStructure);
	TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable); 
    TIM_ARRPreloadConfig(TIM1, ENABLE);
	TIM_CtrlPWMOutputs(TIM1,ENABLE);
    TIM_Cmd(TIM1, ENABLE);
}

void set_beep(uint16_t f)
{
	if(f==0){
		TIM_SetAutoreload(TIM1,1);
		TIM_SetCompare1(TIM1,0);
	}else{
		TIM_SetAutoreload(TIM1,(1000000/f));
		TIM_SetCompare1(TIM1,(1000000/f)/15);
	}
}

Beep.h?

#include "stm32f10x.h"

void TIMx_BEEP_Config(void);
void set_beep(uint16_t f);

5.演示視頻

到了這里,關(guān)于STM32通過PWM輸出使蜂鳴器實(shí)現(xiàn)播放音樂功能的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • STM32 蜂鳴器介紹 配置 播放音節(jié)

    STM32 蜂鳴器介紹 配置 播放音節(jié)

    ???????? 蜂鳴器一般被分為兩類 : 有源蜂鳴器 和 無源蜂鳴器 。 其中源是振蕩源 。 有源蜂鳴器內(nèi)部有振蕩電路,可以把直流電源轉(zhuǎn)換為一定頻率的脈沖信號(hào)。 因?yàn)樗恢陛敵鲆欢ǖ念l率,我們無法改變頻率,所以聲音只有一種,我們只能通過電源,控制它發(fā)不發(fā)聲。

    2024年02月04日
    瀏覽(17)
  • STM32蜂鳴器播放音樂(代碼全)

    在STM32F103ZET6板子上使用蜂鳴器播放音樂,我們可以將其分為幾個(gè)模塊:初始化模塊、蜂鳴器控制模塊、音樂播放模塊和主函數(shù)模塊。以下是一個(gè)簡單的示例代碼,使用STM32 HAL庫和定時(shí)器來驅(qū)動(dòng)蜂鳴器播放音樂。 首先,確保你已經(jīng)配置了STM32CubeMX或STM32CubeIDE,并生成了HAL庫代碼

    2024年04月25日
    瀏覽(20)
  • STM32單片機(jī)(三)第二節(jié):GPIO輸出練習(xí)3(蜂鳴器)

    STM32單片機(jī)(三)第二節(jié):GPIO輸出練習(xí)3(蜂鳴器)

    ?? 專欄簡介:本專欄記錄了從零學(xué)習(xí)單片機(jī)的過程,其中包括51單片機(jī)和STM32單片機(jī)兩部分;建議先學(xué)習(xí)51單片機(jī),其是STM32等高級(jí)單片機(jī)的基礎(chǔ);這樣再學(xué)習(xí)STM32時(shí)才能融會(huì)貫通。 ?? 專欄適用人群 :適用于想要從零基礎(chǔ)開始學(xué)習(xí)入門單片機(jī),且有一定C語言基礎(chǔ)的的童鞋

    2024年02月11日
    瀏覽(29)
  • 3、stm32:GPIO輸出——LED閃爍、LED流水燈、蜂鳴器

    3、stm32:GPIO輸出——LED閃爍、LED流水燈、蜂鳴器

    目錄 一、GPIO簡介 二、GPIO基本結(jié)構(gòu) 三、GPIO模式 四、GPIO常用寄存器 (1)端口配置低高寄存器(GPIOx_CRL/GPIOx_CRH)(x=A…E) (2)端口輸入數(shù)據(jù)寄存器(GPIOx_IDR)(x=A…E) (3)端口輸出數(shù)據(jù)寄存器(GPIOx_ODR)(x=A…E) (4)端口位設(shè)置/清除寄存器(GPIOx_BERR)(x=A…E) (5)端口位清除寄存器(GP

    2024年02月09日
    瀏覽(18)
  • 基于RT-Thread+STM32F407的蜂鳴器音樂播放器

    基于RT-Thread+STM32F407的蜂鳴器音樂播放器

    本項(xiàng)目為RT-Thread學(xué)習(xí)項(xiàng)目,參考于RT-Thread官網(wǎng)Demo示例 硬件基于STM32F407ZGT6正點(diǎn)原子探索者開發(fā)板+無源蜂鳴器模塊 RTOS軟件基于RT-Thread 4.0.5版本 編譯器為官方的提供的RT-Thread Studio 會(huì)使用到STM32CubeMX 配置產(chǎn)生PWM波 會(huì)使用MobaXterm串口終端軟件查看串口終端數(shù)據(jù) 官網(wǎng)Demo示例網(wǎng)址:

    2024年02月02日
    瀏覽(48)
  • stm32蜂鳴器實(shí)現(xiàn)電子琴(原理+代碼)

    stm32蜂鳴器實(shí)現(xiàn)電子琴(原理+代碼)

    許久沒有摸32了,今天是培訓(xùn)的第一天,做個(gè)電子琴練練手。 編程難度很小,無非就是gpio控制引腳高低電平轉(zhuǎn)換,比較值得注意的主要是一些樂理上的知識(shí)。 我們能聽到的1 2 3 4 5 6 7的音符,實(shí)際上是一個(gè)個(gè)固定的頻率,這個(gè)具體算我也不懂,問巴赫去吧 總而言之,通過百度

    2024年02月06日
    瀏覽(25)
  • (STM32基礎(chǔ))STM32實(shí)現(xiàn)LED閃爍&LED流水燈&蜂鳴器

    (STM32基礎(chǔ))STM32實(shí)現(xiàn)LED閃爍&LED流水燈&蜂鳴器

    1、按照新建工程步驟創(chuàng)建工程,新建start、library、user三個(gè)文件夾,從固件庫添加相應(yīng)文件 2、keilkil小程序用來清理listings和objects文件夾中編譯產(chǎn)生的中間文件,以后需要打包工程的話可以先用keilkill先清理,這樣文件夾會(huì)大大縮小所占內(nèi)存。 在library中可以查看外設(shè)函數(shù)庫,

    2024年02月07日
    瀏覽(25)
  • STM32F103C8T6最小系統(tǒng)板實(shí)現(xiàn)蜂鳴器報(bào)警

    STM32F103C8T6最小系統(tǒng)板實(shí)現(xiàn)蜂鳴器報(bào)警

    SWD方式下載程序,4線,VCC,GND。 SWDIO:Serial Wire Data Input Output,串行數(shù)據(jù)輸入輸出引腳,作為仿真信號(hào)的雙向數(shù)據(jù)信號(hào)線,建議上拉。 SWCLK:Serial Wire Clock,串行線時(shí)鐘引腳,作為仿真信號(hào)的時(shí)鐘信號(hào)線,建議下拉; 蜂鳴器的IO口接在了最小系統(tǒng)板的PB12引腳上。 蜂鳴器的操作

    2024年02月01日
    瀏覽(21)
  • STM32實(shí)戰(zhàn)-無源蜂鳴器

    STM32實(shí)戰(zhàn)-無源蜂鳴器

    前言: 主要通過無源蜂鳴器實(shí)現(xiàn)功能有: 1、上電后,無源蜂鳴器發(fā)出警報(bào)聲; 2、通過觸摸按鍵1打開或關(guān)閉蜂鳴器; 目錄 ?1、硬件電路部分 2、技術(shù)講解? 2.1通用定時(shí)器(TIMx)? 2.2主要特性? ?2.3框圖 3.軟件編程? 3.1參數(shù)配置? 3.2程序框架? 3.3蜂鳴器函數(shù)? 3.4回調(diào)函數(shù) ? ?

    2024年02月04日
    瀏覽(21)
  • STM32——有源蜂鳴器模塊

    STM32——有源蜂鳴器模塊

    ? ? ? ? 蜂鳴器模塊在一個(gè)單片機(jī)項(xiàng)目中同樣不可或缺,可能這篇文章對(duì)大多數(shù)人幫助并不大,但對(duì)剛剛?cè)腴T的同學(xué)快速上手蜂鳴器模塊應(yīng)該有所幫助。 ? ? ? ?有源蜂鳴器模塊,與無源蜂鳴器模塊最大的區(qū)別是其內(nèi)部已經(jīng)包含振蕩器,只要輸入高低電平,就能控制蜂鳴器的

    2024年04月25日
    瀏覽(115)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包