嵌入式进阶——蜂鸣器

news2024/11/18 21:26:07

🎬 秋野酱:《个人主页》
🔥 个人专栏:《Java专栏》《Python专栏》

⛺️心若有所向往,何惧道阻且长

文章目录

    • 蜂鸣器
    • 原理图
    • 测试发声
    • 乐理知识
    • 乐理应用
    • PWM测试发声
    • PWM驱动封装

蜂鸣器

蜂鸣器是一种能够产生固定频率的声音的电子元件。它通常由振膜、震荡器、放大器和声音反馈电路等部分组成。振膜是蜂鸣器中最核心的部分,它能够将电信号转换为机械振动,产生声音。震荡器提供稳定的电信号,用于驱动振膜产生振动。放大器用于放大电信号的幅度,以便产生足够的声音。声音反馈电路可以提供反馈信号,帮助系统稳定。
蜂鸣器广泛应用于电子设备中,例如电子钟、警报器、电子琴等。它们的声音频率通常在1 kHz到10 kHz之间,具有尖锐而刺耳的特点。蜂鸣器的种类很多,例如电磁式蜂鸣器、压电式蜂鸣器、有源蜂鸣器、无源蜂鸣器等等。不同类型的蜂鸣器具有不同的特点和应用场景。
电子爱好者和开发者通常会使用蜂鸣器作为一种简单而有效的提示器件。例如,在嵌入式系统中,可以通过控制蜂鸣器发出不同的声音来实现提示、警报、提醒等功能。一些开发板和单片机也通常带有蜂鸣器接口,方便开发者使用。
通常我们在开发中用到最多的是 有源蜂鸣器和无源蜂鸣器。有源的直接接电源即可发声。无源的需要连接一个变化频率的电源上,才能发出声音。

原理图

在这里插入图片描述

● 采用P0.0引脚控制三极管的导通
肖特基二极管:
当蜂鸣器在工作时,会产生电磁感应。
当电源关闭或蜂鸣器停止振动时,会产生一个瞬态的电压峰值,这会产生反向电流,可能会对电路及蜂鸣器造成损害或影响其寿命。肖特基二极管可以通过其低的正向电压降和快速反向恢复特性,有效地防止反向电流损害电路。
此外,肖特基二极管的快速开关特性也能够减小蜂鸣器电路中的开关噪声和干扰,提高电路的稳定性和可靠性。因此,在蜂鸣器电路中加入肖特基二极管是一种常见的电路保护和稳定化措施。
肖特基二极管的作用

  1. 快速开关:肖特基二极管具有快速的反向恢复特性,可以快速地从导通到截止转变,因此它通常用于高频开关电路中。
  2. 低正向压降:与普通二极管相比,肖特基二极管具有更低的正向电压降,因此在需要低功耗和高效率的电路中使用时,肖特基二极管可以降低电路中的功耗和热损失。
  3. 防反向漏电流:由于肖特基二极管是由金属和半导体接触组成的,因此在正向偏置时,不会发生少数载流子注入的现象,从而降低了漏电流。
  4. 温度特性好:由于金属与半导体接触,所以肖特基二极管具有良好的温度特性。在高温环境下,肖特基二极管的电性能仍能保持稳定。
    因此,肖特基二极管在高频开关电路、低功耗电路和功率电子等领域中得到了广泛的应用。
    三极管并联电阻
    在三极管的放大电路中,通常会并联一个电阻,这个电阻被称为集电极负载电阻。
    这个集电极负载电阻的作用是:
  5. 稳定直流工作点:集电极负载电阻可以使三极管的直流工作点更加稳定。由于三极管是非线性器件,其直流放大倍数随着工作点的改变而变化。通过加入集电极负载电阻,可以限制直流工作点的漂移,保证放大电路的直流稳定性。
  6. 改善交流性能:集电极负载电阻还可以改善放大电路的交流性能。通过控制集电极电流,可以改变三极管的放大倍数,从而实现对输入信号的放大。同时,集电极负载电阻还可以限制输出幅度,避免过度放大造成信号失真。
  7. 防止三极管损坏:当输入信号过大时,三极管的集电极电压可能会超过其最大耐压值,从而造成三极管损坏。通过加入集电极负载电阻,可以限制输出幅度,避免超过三极管的最大耐压值,从而保护三极管。
    因此,三极管放大电路中并联一个集电极负载电阻是一种常见的电路设计技巧,可以提高电路的性能和稳定性,同时保护三极管免受过电压损坏。

在三极管放大电路中,集电极负载电阻的阻值会影响电路的放大倍数、直流工作点以及输出电阻等性能。
通常情况下,集电极负载电阻的阻值需要根据具体的电路设计要求来确定。一般来说,阻值不应过大或过小,一般取值范围在几百欧姆到几千欧姆之间。
如果集电极负载电阻的阻值太大,会导致放大倍数过低,使得电路的放大效果不理想。另外,由于三极管的输出电阻较小,集电极负载电阻的阻值过大还会导致电路的输出电阻过大,降低电路的输出功率。
如果集电极负载电阻的阻值太小,会导致放大倍数过高,使得电路容易失真或产生饱和现象。同时,由于直流工作点的不稳定性,集电极负载电阻的阻值过小还会导致直流工作点的漂移,降低电路的直流稳定性。
因此,在实际电路设计中,需要根据具体要求综合考虑电路性能和稳定性等因素,选取适当的集电极负载电阻阻值。

测试发声

#include "config.h"
#include "GPIO.h"
#include "delay.h"

#define BUZZER	P00

void GPIO_config(void) {
	GPIO_InitTypeDef	GPIO_InitStructure;		//结构定义
	GPIO_InitStructure.Pin  = GPIO_Pin_0;		//指定要初始化的IO,
	GPIO_InitStructure.Mode = GPIO_OUT_PP;	//指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
	GPIO_Inilize(GPIO_P0, &GPIO_InitStructure);//初始化
}

int main() {
	GPIO_config();
	EA = 1;
	
	while(1) { // 每个循环约4ms,每秒1000ms/4ms = 250次,即频率为250Hz
		P00 = 1;
		delay_ms(2);
		P00 = 0;
		delay_ms(2);
	}
}

通过控制delay_ms的时间,控制发声的频率,来观察蜂鸣器的发声情况。

乐理知识

乐理知识从专业角度来说,包含了很多内容,包括音高、音阶、节奏、和声、旋律、调性、节拍等等方面的知识。
补充知识,不做要求。

  1. 音高:音高是音乐中的一个基本元素,指的是声音高低的程度。常用的表示音高的符号是音符,不同的音高可以使用不同的音符来表示。
  2. 音阶:音阶是一组按照音高顺序排列的音符组成的序列。常用的音阶包括了大调音阶和小调音阶等。
  3. 节奏:节奏是指音乐中的强弱、快慢、持续时间等方面的时间关系。节奏可以通过节拍器或其他的打击乐器来表现。
  4. 和声:和声是指多个声音同时进行时的相互关系。和声可以表现出不同的和声效果,如和弦、和声进程等。
  5. 旋律:旋律是指音乐中的主旋律,是由一系列按照音高顺序排列的音符组成的。旋律可以使用不同的节奏来表现出不同的效果。
  6. 调性:调性是指音乐中的调性关系。常用的调性包括了大调和小调等。
  7. 节拍:节拍是指音乐中的基本的时间单位,用于表示节奏的强弱、快慢等方面的特征。节拍通常使用不同的时间符号来表示。
  8. 同音重复:同音重复是指在不同的位置或时间上出现相同的音符或音高。
    在此呢,我们不研究更全面更深入的乐理知识,我们从我们的常识方面入手,了解简单的发声即可。
    哆来咪发唆拉西哆
    哆来咪发唆拉西哆(Do-Re-Mi-Fa-So-La-Ti-Do)是音乐中的一个音阶记号,也是西方音乐中最基本的一个音阶。它由八个不同的音符组成,分别是:Do、Re、Mi、Fa、So、La、Ti、Do。这些音符分别代表了一个八度内的不同音高。
    在音乐教学中,哆来咪发唆拉西哆常常被用来作为基础训练的内容。通过唱出哆来咪发唆拉西哆,可以帮助学生了解不同音符之间的音高关系,掌握音乐中的基本音程和旋律。同时,哆来咪发唆拉西哆也是很多歌曲的基础,学会了这个音阶,就可以更好地理解和演唱这些歌曲。
    哆来咪发唆拉西哆可以用不同的乐谱表示方式来呈现。以下是常见的两种表示方式:
  9. 数字表示法:数字表示法将每个音符用数字来代表,Do为1,Re为2,Mi为3,Fa为4,So为5,La为6,Ti为7,Do(高八度)为8。因此,哆来咪发唆拉西哆的数字表示法为:1 2 3 4 5 6 7 8。
  10. 符号表示法:符号表示法用特定的符号来表示每个音符,包括大写字母(如C、D、E、F、G、A、B)、升降符号(如#、b)和八度符号(如’)。哆来咪发唆拉西哆的符号表示法为:C D E F G A B C’。
    需要注意的是,不同的乐器和音高区间可能使用不同的记谱方式,但哆来咪发唆拉西哆作为最基本的音阶,通常都可以用以上两种方式表示。
    十二平均律
    十二平均律是现代西方音乐中最广泛使用的音高系统,它的作用可以从以下几个方面来理解:
  11. 方便协调和配合:由于十二平均律将八度音程划分成12个等分,每个等分的音高间隔相等,不同的调式可以使用相同的音高间隔,因此方便不同乐器、不同声部之间的协调和配合。
  12. 增加音乐的表现力:十二平均律中的半音音程比纯律(一种古老的音高系统)中的半音更小,因此可以创造更多的音高变化,增加音乐的表现力。
  13. 适应和反映现代音乐的需求:现代音乐中常常出现的复杂和离奇的调性变化,需要更加灵活和多变的音高体系,而十二平均律可以提供这种灵活性和多变性。
    总之,十二平均律作为一种现代音乐基础的音高系统,为不同音乐风格和流派的发展提供了有力的支持,成为现代音乐的不可或缺的一部分。
    专业的术语理解起来比较抽象,对于乐理不是很了解的可以这样理解:
  14. 我们将音乐的音高分为12个等分。类似我们拼音中的4声(类比说法,还是有区别的)
  15. 我们在12个音高中对应了我们的哆来咪发唆拉西哆
  16. 要发出不同的音高,需要不同的频率来发声。

在这里插入图片描述

乐理应用

Timer测试发声
我们通过timer进行 【哆来咪发唆拉西哆】 测试,timer的延时比较准确。

#include "Config.h"
#include "GPIO.h"
#include "Delay.h"

#include "Timer.h"
#include "NVIC.h"

#define BUZZER	P00

//			 C`	   D`     E`   F`	  G`	A`	  B`    C``
u16 hz[] = {1047, 1175, 1319, 1397, 1568, 1760, 1976, 2093};

void GPIO_config() {
    P0_MODE_OUT_PP(GPIO_Pin_0);
}
void	Timer_config(u16 hz_value)
{
    TIM_InitTypeDef		TIM_InitStructure;						//结构定义
    //定时器0做16位自动重装, 中断频率为1000HZ
    TIM_InitStructure.TIM_Mode      = TIM_16BitAutoReload;	//指定工作模式,   TIM_16BitAutoReload,TIM_16Bit,TIM_8BitAutoReload,TIM_16BitAutoReloadNoMask
    TIM_InitStructure.TIM_ClkSource = TIM_CLOCK_1T;		//指定时钟源,     TIM_CLOCK_1T,TIM_CLOCK_12T,TIM_CLOCK_Ext
    TIM_InitStructure.TIM_ClkOut    = DISABLE;				//是否输出高速脉冲, ENABLE或DISABLE
    TIM_InitStructure.TIM_Value     = 65536UL - (MAIN_Fosc / (hz_value * 2));		//初值,
    TIM_InitStructure.TIM_Run       = ENABLE;				//是否初始化后启动定时器, ENABLE或DISABLE
    Timer_Inilize(Timer0,&TIM_InitStructure);				//初始化Timer0	  Timer0,Timer1,Timer2,Timer3,Timer4
    NVIC_Timer0_Init(ENABLE,Priority_0);		//中断使能, ENABLE/DISABLE; 优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3
}

/**
举例:如下是3个完整周期
--    --    --    
  |  |  |  |  |  
   --    --    --
**/

void timer0_func() {
    BUZZER = ~BUZZER;
}

void main() {
		u8 idx = 0;
    GPIO_config();

//    Timer_config();

    EA = 1;

    // 有源蜂鸣器,才可以直接通过高电平响起
    // BUZZER = 1;

    // 20-20000Hz
    // 舒适: 1000-4000Hz

    while(1) {

        Timer_config(hz[idx]);

        if(++idx > 7){
            idx = 0;
        }
				
        delay_ms(250);
        delay_ms(250);
        delay_ms(250);
        delay_ms(250);
				
    }

}

PWM测试发声

最准确的方式我们还可以选择PWM进行控制,这个也是常用的方式。
在这里插入图片描述

#include "Config.h"
#include "GPIO.h"
#include "Delay.h"

#include "STC8H_PWM.h"
#include "Switch.h"
#include "NVIC.h"

#define BUZZER	P00

//			   C	 D    E 	F	 G	 A	  B	   C`
 u16 hz[] = {523, 587, 659, 698, 784, 880, 988, 1047};

//			 C`	   D`     E`   F`	  G`	A`	  B`    C``
//u16 hz[] = {1047, 1175, 1319, 1397, 1568, 1760, 1976, 2093};

void GPIO_config() {
    P0_MODE_OUT_PP(GPIO_Pin_0);
}

//#define PERIOD (MAIN_Fosc / 1000)
//PWMx_Duty dutyB;
void	PWM_config(u16 hz_value)
{
    PWMx_InitDefine		PWMx_InitStructure;
	
	u16 Period = MAIN_Fosc / hz_value;

    // 配置PWM5
    PWMx_InitStructure.PWM_Mode    		= CCMRn_PWM_MODE1;	//模式,		CCMRn_FREEZE,CCMRn_MATCH_VALID,CCMRn_MATCH_INVALID,CCMRn_ROLLOVER,CCMRn_FORCE_INVALID,CCMRn_FORCE_VALID,CCMRn_PWM_MODE1,CCMRn_PWM_MODE2
    PWMx_InitStructure.PWM_Duty   	 	= (u16)(Period * 0.5);	//PWM占空比时间, 0~Period
    PWMx_InitStructure.PWM_EnoSelect    = ENO5P;			//输出通道选择,	ENO1P,ENO1N,ENO2P,ENO2N,ENO3P,ENO3N,ENO4P,ENO4N / ENO5P,ENO6P,ENO7P,ENO8P
    PWM_Configuration(PWM5, &PWMx_InitStructure);			//初始化PWM,  PWMA,PWMB

    // 配置PWMB
    PWMx_InitStructure.PWM_Period   = Period - 1;			//周期时间,   0~65535
    PWMx_InitStructure.PWM_DeadTime = 0;					//死区发生器设置, 0~255
    PWMx_InitStructure.PWM_MainOutEnable= ENABLE;			//主输出使能, ENABLE,DISABLE
    PWMx_InitStructure.PWM_CEN_Enable   = ENABLE;			//使能计数器, ENABLE,DISABLE
    PWM_Configuration(PWMB, &PWMx_InitStructure);			//初始化PWM通用寄存器,  PWMA,PWMB

    // 切换PWM通道
    PWM5_SW(PWM5_SW_P00);					//PWM5_SW_P20,PWM5_SW_P17,PWM5_SW_P00,PWM5_SW_P74

    // 初始化PWMB的中断
    NVIC_PWM_Init(PWMB,DISABLE,Priority_0);
}
/**
举例:如下是3个完整周期
--    --    --
  |  |  |  |  |
   --    --    --
**/

void main() {
    u8 idx = 0;
	
	// 扩展寄存器使能
	EAXSFR();
	
    GPIO_config();
	
    EA = 1;

    // 有源蜂鸣器,才可以直接通过高电平响起
    // BUZZER = 1;

    // 20-20000Hz
    // 舒适: 1000-4000Hz

    while(1) {

        PWM_config(hz[idx]);

        if(++idx > 7) {
            idx = 0;
        }

        delay_ms(250);
        delay_ms(250);
        delay_ms(250);
        delay_ms(250);

    }

}

PWM驱动封装

可以将蜂鸣器的代码进行封装,这样方便以后调用

#ifndef __BUZZER_H__
#define __BUZZER_H__

#include "Config.h"

// 初始化蜂鸣器
void Buzzer_init();

// 按照指定频率播放
void Buzzer_play(u16 hz_val);

// 停止播放
void Buzzer_stop();

#endif
#include "Buzzer.h"

#include "GPIO.h"
#include "STC8H_PWM.h"
#include "Switch.h"
#include "NVIC.h"

//			   C	 D    E 	F	 G	 A	  B	   C`
//u16 hz[] = {523, 587, 659, 698, 784, 880, 988, 1047};

//			 C`	   D`     E`   F`	  G`	A`	  B`    C``
u16 hz[] = {1047, 1175, 1319, 1397, 1568, 1760, 1976, 2093};


static void GPIO_config(void) {
	GPIO_InitTypeDef	GPIO_InitStructure;		//结构定义
	GPIO_InitStructure.Pin  = GPIO_Pin_0;		//指定要初始化的IO,
	GPIO_InitStructure.Mode = GPIO_OUT_PP;	//指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
	GPIO_Inilize(GPIO_P0, &GPIO_InitStructure);//初始化
}

void Buzzer_init(){
	EAXSFR();
	
	GPIO_config();
}

void Buzzer_beep(u8 hz_val_index){ // 1,2,3,4 ... 7
	
	u16 hz_val = hz[hz_val_index - 1];
	
	Buzzer_play(hz_val);
}


void Buzzer_play(u16 hz_val){
	
    u16 Period = MAIN_Fosc / hz_val;
    PWMx_InitDefine		PWMx_InitStructure;

		// PWM5
    PWMx_InitStructure.PWM_Mode    		= CCMRn_PWM_MODE1;	//模式,		CCMRn_FREEZE,CCMRn_MATCH_VALID,CCMRn_MATCH_INVALID,CCMRn_ROLLOVER,CCMRn_FORCE_INVALID,CCMRn_FORCE_VALID,CCMRn_PWM_MODE1,CCMRn_PWM_MODE2
    PWMx_InitStructure.PWM_Duty   	 	= (int)(Period * 0.005);	//PWM占空比时间, 0~Period
    PWMx_InitStructure.PWM_EnoSelect    = ENO5P;			//输出通道选择,	ENO1P,ENO1N,ENO2P,ENO2N,ENO3P,ENO3N,ENO4P,ENO4N / ENO5P,ENO6P,ENO7P,ENO8P
    PWM_Configuration(PWM5, &PWMx_InitStructure);			//初始化PWM,  PWMA,PWMB

		// PWMB
    PWMx_InitStructure.PWM_Period   = Period - 1;			//周期时间,   0~65535
    PWMx_InitStructure.PWM_DeadTime = 0;					//死区发生器设置, 0~255
    PWMx_InitStructure.PWM_MainOutEnable= ENABLE;			//主输出使能, ENABLE,DISABLE
    PWMx_InitStructure.PWM_CEN_Enable   = ENABLE;			//使能计数器, ENABLE,DISABLE
    PWM_Configuration(PWMB, &PWMx_InitStructure);			//初始化PWM通用寄存器,  PWMA,PWMB

    PWM5_SW(PWM5_SW_P00);					//PWM5_SW_P20,PWM5_SW_P17,PWM5_SW_P00,PWM5_SW_P74

    NVIC_PWM_Init(PWMB,DISABLE,Priority_0);
}


void Buzzer_stop(){
		
    PWMx_InitDefine		PWMx_InitStructure;
    PWMx_InitStructure.PWM_MainOutEnable= DISABLE;				//主输出使能, ENABLE,DISABLE
    PWMx_InitStructure.PWM_CEN_Enable   = DISABLE;				//使能计数器, ENABLE,DISABLE
    PWM_Configuration(PWMB, &PWMx_InitStructure);				//初始化PWM,  PWMA,PWMB
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1699716.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

没有电商经验的人去操作抖音小店,难度大不大?好操作吗?

大家好,我是电商小V 很多新手小伙伴想去操作抖音小店项目,咨询的最多的问题就是我没有电商运营的经验可以去操作吗? 当然是可以操作的,抖音小店项目对于新手来说是一个非常友好的项目,很多小伙伴都是感觉没有电商经验去…

产品经理-流程图结构图(四)

1. 流程图 1.1 概念 为了达到特定的目标而进行的一系列有逻辑性的操作步骤,由两个及以上的步骤,完成一个完整的行为的过程,可称之为流程 1.2 产品经理为什么需要绘制流程图? 保证产品的使用逻辑合理顺畅向项目组其他成员清晰的…

2024最新前端面试八股文【基础篇293题】

⼀、HTML、HTTP、web综合问题 1 前端需要注意哪些SEO 2 <img> 的 title 和 alt 有什么区别 3 HTTP的⼏种请求⽅法⽤途 4 从浏览器地址栏输⼊url到显示⻚⾯的步骤 5 如何进⾏⽹站性能优化 6 HTTP状态码及其含义 7 语义化的理解 8 介绍⼀下你对浏览器内核的理解 9 …

QT常量中有换行符

头文件添加&#xff1a; #pragma execution_character_set("utf-8")

深入理解计算机系统 家庭作业4.52

练习题4.3 p.254 \sim\seq\seq-full.hcl文件内已经说的很清楚了哪些不能更改,哪些是题目要求更改的控制逻辑块. 依据家庭作业4.51的答案,在seq-full.hcl文件内更改对应的HCL描述即可 以下答案注释了#changed的就是更改部分 #/* $begin seq-all-hcl */ ######################…

CCF CAT- 全国算法精英大赛(2024第二场)往届真题练习 3 | 珂学家

前言 这是2024年第一场CCF初赛的题&#xff0c; 其实整场比赛&#xff0c;感觉不是特别难&#xff0c;就是码量大&#xff0c;偏模拟和数学。 对于A题&#xff0c;摩斯密码&#xff0c;很容易抄错&#xff0c;我一直在想有什么好办法可以规避它&#xff0c;是真的苦涩。 真题…

Linux系统启动原理

Linux系统启动原理及故障排除 Centos6系统启动过程 修改系统启动级别 vim /etc/inittabCentos7启动流程 加载BIOS信息&#xff0c;进行硬件检测 根据BIOS设定读取设备中的MBR&#xff0c;加载Boot loader 加载内核&#xff0c;内核初始化以后以模块的形式动态加载硬件 并且加…

死锁及线程与队列之间的等待关系

死锁及线程与队列之间的等待关系 死锁及线程与队列之间的等待关系案例一案例二案例三案例四案例五 结语 死锁及线程与队列之间的等待关系 我想要补充一下我之前GCD学习中没能理解清楚的死锁及线程与队列之间的等待关系&#xff0c;因为在看锁的博客时&#xff0c;有人给出了一…

如何在 Elasticsearch 中选择精确 kNN 搜索和近似 kNN 搜索

作者&#xff1a;来自 Elastic Carlos Delgado kNN 是什么&#xff1f; 语义搜索&#xff08;semantic search&#xff09;是相关性排名的强大工具。 它使你不仅可以使用关键字&#xff0c;还可以考虑文档和查询的实际含义。 语义搜索基于向量搜索&#xff08;vector search&…

Gradient-checkpointing的原理

原文&#xff1a; 将更大的网络安装到内存中。|by 雅罗斯拉夫布拉托夫 |张量流 |中等 (medium.com) 前向传播时&#xff0c;隔几层就保留一层activation数据&#xff0c;其余层的activation都释放掉&#xff1b; 反向传播时&#xff0c;从最近的checkpoint去重新跑forward&…

Docker部署SpringBoot项目(jar包+Mysql)

部署Java项目 项目准备准备Java项目镜像准备配置网络 部署项目细节展示 项目准备 准备Java项目 hmall项目是一个maven聚合项目&#xff0c;使用IDEA打开hmall项目&#xff0c;查看项目结构如图&#xff1a; 我们要部署的就是其中的hm-service&#xff0c;其中的配置文件采用…

前 9 名最佳视频转换器软件完全免费

前 9 名免费视频转换器是什么&#xff1f;在此视频转换器评论中&#xff0c;我们收集了一些有用的提示并列出了顶级免费视频转换器软件&#xff0c;并找出适合所有级别&#xff08;从初学者到专家&#xff09;的最佳免费视频转换器。 顶级视频转换器列表 在这一部分中&#xf…

go 爬虫之 colly 简单示例

1. 背景 colly 是 Go 实现的比较有名的一款爬虫框架&#xff0c;而且 Go 在高并发和分布式场景的优势也正是爬虫技术所需要的。它的主要特点是轻量、快速&#xff0c;设计非常优雅&#xff0c;并且分布式的支持也非常简单&#xff0c;易于扩展。 2. 官方文档 https://go-col…

【简单易用,新人友好】一个轻量级生物信息学流程框架,从此解决99%的生物信息学流程搭建问题...

生物信息学数据分析流程的搭建是一项繁重而复杂的工作。随着行业的发展&#xff0c;各种生信流程框架层出不穷&#xff0c;比如有: NextflowSnakemakeCWLWDL 各种标准&#xff0c;各种规则&#xff0c;令人眼花缭乱。选择太多&#xff0c;往往令人无所适从。特别是新进入行业的…

03自动辅助导航驾驶NOP其实就是NOA

蔚来NOP是什么意思&#xff1f;蔚来NOP是啥 蔚来NOP的意思就是NavigateonPilot智能辅助导航驾驶&#xff0c;也就是大家俗称的高阶辅助驾驶&#xff0c;在车主设定好导航路线&#xff0c;并且符合开启NOP条件的前提下&#xff0c;蔚来NOP可以代替驾驶员完成从A点到B点的智能辅助…

<学习笔记>从零开始自学Python-之-实用库篇(一)-pyscript

由Anaconda创建的PyScript是一项实验性的但很有前途的新技术&#xff0c;它使python运转时在支撑WebAssembly的浏览器中作为一种脚本言语运用。 每个现代常用的浏览器现在都支撑WebAssembly&#xff0c;这是许多言语&#xff08;如C、C和Rust&#xff09;能够编译的高速运转时…

springboot项目,@Test写法 @Before @After

某文件示例 package cn.xxx.crm.boss;import cn.xxxx.crm.manager.mq.rabbit.AliyunCredentialsProvider; import com.rabbitmq.client.AMQP; import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection; import com.rabbitmq.client.ConnectionFactory; im…

大模型提示词Prompt学习

引言 关于chatGPT的Prompt Engineer&#xff0c;大家肯定耳朵都听起茧了。但是它的来由&#xff1f;&#xff0c;怎么能用好&#xff1f;很多人可能并不觉得并不是一个问题&#xff0c;或者说认定是一个很快会过时的概念。但其实也不能说得非常清楚&#xff08;因为觉得没必要深…

x264 码率控制中实现 VBV 算法源码分析

关于 VBV 的解释与原理可以参考x264 码率控制 VBV 原理。 x264中 VBV 算法执行的流程 vbv 参数配置相关函数 x264_param_default函数 功能:编码参数默认设置,关于 vbv的参数的默认设置;函数内vbv相关代码:/* ... */ //代码有删减 param->rc.i_vbv_max_bitrate = 0; par…

《软件方法(下)》8.3.4.3 关于“整体-部分”结构

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 8.3 建模步骤C-2 识别类的关系 8.3.4 识别关联关系 8.3.4.2 关联的进一步细分 是否进一步细分各种关联&#xff0c;各种面向对象方法学观点不同。有的认为关联就是关联&#xff0c;…