当前位置: 首页 > news >正文

庐山派K230学习日记4 PWM控制

1 本节介绍​

📝本节您将学习如何通过将K230开发板的GPIO引脚复用为PWM功能并输出PWM信号;实现输出PWM信号及控制板载无源蜂鸣器发出声音。

🏆学习目标

1️⃣如何将GPIO引脚配置为PWM模式,通过40Pin排针中的部分引脚来输出PWM信号。

2️⃣如何驱动板载的无源蜂鸣器,实现让蜂鸣器鸣叫及播放简单的音调。

2 名词解释​

名词说明
PWMPulse width modulation (脉宽调制)
无源蜂鸣器是一种需要外部信号源提供音频频率的电子器件,用于产生声音。
  1. 脉冲宽度调制(PWM)是一种通过改变脉冲的宽度来控制电信号平均功率的技术。在PWM中,脉冲的频率一般保持恒定,但脉冲的宽度(有效电平的时间)根据需要的模拟信号变化,从而实现对电机速度、LED调光和温度控制等的精确控制
  2. 无源蜂鸣器是一种电子发声器件,直接供电并不会鸣叫,只有当输入信号的频率变化时,其发出的声音的频率和音调才会发生相应变化。主要用来产生简单的音调来警示用户。

3 什么是PWM?​

图 0

PWM(Pulse Width Modulation,脉宽调制)是一种在嵌入式系统中常用的技术,它可以用来模拟信号,控制设备的功率输出或者实现对设备的精确控制。PWM信号是一种类似于方波的信号,具有固定的频率,但脉冲宽度(占空比)可以调整。在一定频率下,我们可以通过调整这个占空比来改变他的有效电压,在一定程度上可以实现D/A转换(数字量转模拟量,不过一般来说都是用DAC,本开发板K230的DAC已经被连接到了3.5mm耳机孔上面了,可以用来播放音频)。

  • 频率(Frequency):指PWM信号在一秒内循环的次数。频率是周期的倒数,单位是赫兹(Hz)。
  • 周期(Period):指一个完整的PWM信号的时间长度,与频率成反比。单位是秒(s)。
  • 脉宽(Pulse Width):指PWM信号中高电平(通常为1)的时间长度。单位是秒(s)或毫秒(ms)。
  • 占空比(Duty Ratio):表示在一个完整的PWM信号周期内,高电平(通常为1)所占的时间比例。占空比 = (脉宽 / 周期)x 100%。
  • 上升沿(Rising Edge):PWM信号从低电平跳变到高电平的瞬间,通常用来作为触发事件。
  • 下降沿(Falling Edge):PWM信号从高电平跳变到低电平的瞬间,也常被用作触发事件。
  • 正脉冲宽度(Positive Pulse Width):PWM信号中高电平的持续时间,一般情况下的脉宽指的就是这个。
  • 负脉冲宽度(Negative Pulse Width):PWM信号中低电平的持续时间。

在嵌入式系统中,PWM的应用场景非常广泛,例如:

  1. 电机控制:通过调整PWM的占空比,可以精确控制直流电机的转速。占空比越高,电机转速越快;占空比越低,电机转速越慢。
  2. LED亮度调节:通过调整PWM的占空比,可以实现对LED灯的亮度调节。占空比越高,LED灯越亮;占空比越低,LED灯越暗。

举个例子:假设我们有一个LED灯,想实现亮度调节。我们可以生成一个PWM信号,频率为1kHz(周期为1ms),然后通过调整占空比来实现LED灯的亮度调节。如果占空比为100%,那么LED灯将一直处于亮的状态;如果占空比为50%,那么LED灯将以1ms为周期,半亮半暗;如果占空比为0%,那么LED灯将一直处于熄灭状态。通过不断调整占空比,就可以实现LED灯的亮度调节。如果PWM信号的频率过低,我们可能会感觉到它在闪烁。所以,在设计PWM驱动的LED灯时,一般会选择较高的频率来避免可见的闪烁。通常我们是看不到它闪烁的,这主要是因为两个原因:第一个是PWM信号的频率够高,第二个是人眼的视觉暂留效应。即当光源瞬间消失时,我们还能在极短的时间内感知到光源。这种效应导致人眼对快速闪烁的光源产生平滑的感觉。当PWM频率足够高时,视觉暂留效应会使我们感觉到LED灯的亮度是连续的。

4 手机屏幕的亮度是怎么调节的?​

我们平时一直摸的手机屏幕有一部分就是用PWM来调节的。在智能手机屏幕中,PWM调光和DC调光是两种常见的屏幕亮度调节技术。它们的主要区别在于亮度调节的实现方式。

PWM调光:如之前所说,PWM(脉宽调制)调光是通过调整占空比来控制屏幕亮度的。在这种方法中,屏幕背光源会周期性地开启和关闭。占空比越高,背光源亮的时间越长,屏幕亮度越高;占空比越低,背光源亮的时间越短,屏幕亮度越低。

DC调光:DC(直流)调光是通过调整屏幕背光源的电流来实现亮度调节的。在这种方法中,背光源会一直保持开启状态,但电流的大小会改变,从而调整屏幕亮度。

这两种调光技术各有优缺点:

PWM调光优缺点

  • 优点:能实现较高的亮度范围和对比度,通常在高亮度下表现更好。
  • 缺点:在低频率下,PWM调光可能导致屏幕闪烁,对部分人来说可能引起眼睛疲劳和不适。此外,对于快速拍照或录像时,PWM调光可能导致出现条纹或闪烁的现象。

DC调光优缺点

  • 优点:在低亮度下表现更好,因为屏幕背光源一直保持开启状态,不会出现闪烁现象,对眼睛更友好。
  • 缺点:在高亮度下,对比度和亮度范围可能不如PWM调光好。此外,DC调光可能导致背光源的寿命降低和能耗略高。

各种技术的选择取决于手机制造商的考虑和市场需求。有一些高端手机是用的混合调光,在高亮度的模式下用DC调光,亮度低于一定值后用PWM调光。???

5 开发板上可用的PWM信号​

40PIN排针引出脚

图 1

从上图可以看到,我们排针处有以下PWM可供用户使用。

排针引脚号芯片引脚号PWM通道号
12GPIO 47PWM3
26GPIO 61PWM1
32GPIO 46PWM2
33GPIO 52PWM4
35GPIO 42PWM0

板载无源蜂鸣器电路

图 2

这个就是我们的板载无源蜂鸣器了,蜂鸣器可以将电信号转化为声音信号,可以向用户提供声音反馈或者警报信号。 蜂鸣器从构造类型上有电磁式和电压式两种从驱动方式上来说有无源(由外部方波驱动)和有源(由内部驱动,外部给电就行)两种,这里选择的是无源电磁式贴片蜂鸣器工作电压2.5-4.5v,频率4000Hz,这里的频率是指他在这个频率下的声音最响。大家可以用这个蜂鸣器来做人机交互的提示,也可以用不同的PWM来驱动这个蜂鸣器来播放简单的纯音调音乐。

D15在这里的主要作用是保护这个驱动的MOS管,因为蜂鸣器和电机一样是一个感性元件,也就是说它的电流是不能瞬变的。必须有一个续流二极管提供续流。如果没有这个续流二极管,停止给蜂鸣器供电的时候在蜂鸣器两端会有反向感应电动势,产生高达几十V的尖峰电压,很有可能损坏驱动电路。 R89:限流电阻,防止电流太大损坏芯片的PWM输出引脚。R90就是一个简单的下拉电阻了。

驱动蜂鸣器的芯片引脚号PWM通道号
GPIO 43PWM1

板载屏幕背光驱动电路

图 3

这个屏幕背光驱动电路,可以简单把他当成一个恒流源。

LCD_EN可以是一个使能电平,也可以是PWM信号。使能电平只能控制屏幕的亮灭,使用PWM信号时可以调节屏幕背光的平均亮度,通过改变PWM信号的占空比(就是高电平时间和整个周期时间的比值)。

芯片FB脚连接了两个电阻,FB脚的阻值决定了驱动芯片的最大输出电流,这里采用两个0603封装的电阻主要是为了 方便大家焊接 和 通过两个电阻组合出不常用的阻值。FB脚通过这部分电阻来检测通过屏幕背光LED的电流,并将此电流值反馈给驱动芯片。驱动芯片根据反馈电流与设定值进行比较,从而调整输出,使之维持恒流状态。这里两个电阻默认是贴两个3.6欧姆的,按照他的计算公式I(led)=0.2V/R(cs)这里设定的最大电流是111mA,一般驱动大尺寸(10寸以上)的屏幕就需要设置为100MA以上的驱动电流,这里是为了兼容泰山派,和泰山派共用一款3.1寸屏幕扩展板,我们默认适配的屏幕扩展板上面是自带一个适配小屏幕的驱动电流的。这样处理可以让我们的板子既能驱动大屏幕,也能驱动小屏幕。

同时,我们目前选用的这个31p屏幕接口的MIPI线序,是可以直接接入市面上常见的大屏幕的(小屏幕一般没有这个接口,需要转换),也就是说理论上大屏幕不需要额外的扩展板就可以直接接入我们的DSI接口进行驱动,当然还需要软件再适配一下。

驱动板载背光驱动的芯片引脚号PWM通道号
GPIO 25PWM5

⚠️注意!

驱动蜂鸣器的PWM通道是PWM1,而排针处的26号引脚(GPIO 61)的通道也是PWM1,因此它们无法同时独立使用PWM功能。

K230内部包含两个PWM硬件模块,每个模块有三个输出通道。每个模块的输出频率可调,但同一模块内的三个通道共享同一频率,而占空比可独立调整。因此,通道 0、1和2 输出频率相同通道 3、4和5 输出频率也相同。如果同时使用蜂鸣器(PWM1)和排针上的PWM通道(例如PWM0、PWM1、PWM2),需要注意它们的频率是耦合的,无法单独调整。

这里优先考虑的是板载功能的互斥,所以驱动蜂鸣器用的是PWM1,背光驱动用的是PWM5,这两个PWM通道之间没有耦合,可以随意调整。如果大家同时用到蜂鸣器和背光驱动的时候就要注意了,如果此时使用排针的PWM信号,那么他的频率也就是周期其实你已经不能改了,否则就会互相影响。

6 PWM使用指南​

6.1 将引脚的复用功能配置为PWM模式​

使用一个GPIO的复用功能,首先要做的就是要把他配置为相应的模式,按我们之前在GPIO和FPIOA章节中所说。这里不再赘述。先用FPIOAset_function方法把对应GPIO配置为PWM模式。如下所示:

from machine import FPIOA# 创建FPIOA对象,用于初始化引脚功能配置
fpioa = FPIOA()# 将排针处有PWM功能的引脚配置为PWM功能
fpioa.set_function(47, FPIOA.PWM3)
fpioa.set_function(61, FPIOA.PWM1)
fpioa.set_function(46, FPIOA.PWM2)
fpioa.set_function(52, FPIOA.PWM4)
fpioa.set_function(42, FPIOA.PWM0)# 将蜂鸣器驱动脚GPIO43配置为PWM功能
fpioa.set_function(43, FPIOA.PWM1)# 将屏幕背光驱动驱动脚GPIO25配置为PWM功能
fpioa.set_function(25, FPIOA.PWM5)

6.2 配置PWM模块​

⚠️注意!

K230 内部包含两个 PWM 硬件模块,每个模块具有三个输出通道。每个模块的输出频率可调,但三个通道共享同一时钟,而占空比则可独立调整。因此,通道 0、1 和 2 输出频率相同,通道 3、4 和 5 输出频率也相同。这里优先考虑的是板载功能的互斥,所以驱动蜂鸣器用的是PWM1,背光驱动用的是PWM5,这两个PWM通道之间没有耦合,可以随意调整。如果大家同时用到蜂鸣器和背光驱动的时候就要注意了,如果此时使用排针的PWM信号,那么他的频率也就是周期其实你已经不能改了,否则就会互相影响。

要使用 machine.PWM,首先需要导入该模块:

from machine import PWM

6.2.1 构造函数​

用于构造pin对象,可同时对引脚进行初始化。

pwm = PWM(channel, freq, duty=50, enable=False)

参数

  • channel: PWM 通道号,取值范围为 [0, 5]。具体能用哪些引脚请看上面的 开发板上可用的PWM信号 介绍。
  • freq: PWM 通道输出频率。单位为Hz。
  • duty: PWM 通道输出占空比,表示高电平在整个周期中的百分比,取值范围为 [0, 100],支持小数点。可选参数,默认值为 50。
  • enable: PWM 通道输出是否立即使能,可选参数,默认值为 False。

6.2.2 freq 方法​

pwm.freq([freq])

获取或设置 PWM 通道的输出频率。

参数

  • freq: PWM 通道输出频率,可选参数。如果不传入参数,则返回当前频率。

返回值

返回当前 PWM 通道的输出频率或空。

示例

# 获取当前频率
current_freq = pwm.freq()
print("当前频率为:", current_freq, "Hz")# 设置新的频率
pwm.freq(4000)  # 将频率设置为4000Hz

6.2.3 duty 方法​

pwm.duty([duty])

获取或设置 PWM 通道的输出占空比。

参数

  • duty: PWM 通道输出占空比,可选参数。支持小数点。如果不传入参数,则返回当前占空比。

返回值

返回当前 PWM 通道的输出占空比或空。

示例

【TODO】:当前有BUG,duty设置的占空比好像不太对劲,是 100%-当前的设定值。

# 获取当前占空比
current_duty = pwm.duty()
print("当前占空比为:", current_duty, "%")# 设置新的占空比
pwm.duty(75)  # 将占空比设置为75%

6.2.4 enable 方法​

pwm.enable(enable)

使能或禁用 PWM 通道的输出。

参数

  • enable: 是否使能 PWM 通道输出。
    • True||1
    • False||0

返回值

6.2.5 deinit 方法​

pwm.deinit()

释放 PWM 通道的资源

7 控制排针引脚输出PWM信号​

# pwm3
import time
from machine import PWM, FPIOA# 配置排针引脚号12,芯片引脚号为47的排针复用为PWM通道3输出
pwm_io = FPIOA()
pwm_io.set_function(47, FPIOA.PWM3)# 初始化PWM参数
pwm = PWM(3, 2000, 50, enable=True)  # 默认频率2kHz,占空比50%# pwm1
import time
from machine import PWM, FPIOA# 配置排针引脚号26,芯片引脚号为61的排针复用为PWM通道1输出
pwm_io = FPIOA()
pwm_io.set_function(61, FPIOA.PWM1)# 初始化PWM参数
pwm = PWM(1, 2000, 50, enable=True)  # 默认频率2kHz,占空比50%# pwm2
import time
from machine import PWM, FPIOA# 配置排针引脚号32,芯片引脚号为46的排针复用为PWM通道2输出
pwm_io = FPIOA()
pwm_io.set_function(46, FPIOA.PWM2)# 初始化PWM参数
pwm = PWM(2, 2000, 50, enable=True)  # 默认频率2kHz,占空比50%# pwm4
import time
from machine import PWM, FPIOA# 配置排针引脚号33,芯片引脚号为52的排针复用为PWM通道4输出
pwm_io = FPIOA()
pwm_io.set_function(52, FPIOA.PWM4)# 初始化PWM参数
pwm = PWM(4, 2000, 50, enable=True)  # 默认频率2kHz,占空比50%# pwm0
import time
from machine import PWM, FPIOA# 配置排针引脚号35,芯片引脚号为42的排针复用为PWM通道0输出
pwm_io = FPIOA()
pwm_io.set_function(42, FPIOA.PWM0)# 初始化PWM参数
pwm = PWM(0, 2000, 50, enable=True)  # 默认频率2kHz,占空比50%

有条件的话可以把对应排针接入示波器,调整好时基,坐标等就能看到输出2KHz,占空比为50%的PWM信号了,如下图所示:

图 4

横坐标为时间,每一个格子为250微秒,也就是0.25ms,正好对应2kHz的频率。从图中可以看到,信号的高电平持续时间是250微秒,占整个周期的一半,也就是占空比为50%。 建议大家在代码中调整PWM参数,然后去观察信号的变化。

8 控制板载无源蜂鸣器​

知道了啥是PWM,以及如何控制PWM后,我们就可以驱动板载蜂鸣器来播放声音了。

8.1 什么是蜂鸣器​

大家可以先去立创商城看看蜂鸣器都有哪些,点这个链接。

它是一种常见的声音输出设备,可以发出各种声音或音调。它们广泛应用于家用电器、电子设备、汽车、安全系统等领域。以下是蜂鸣器的主要种类及其使用场景。

蜂鸣器从构造类型上有电磁式和电压式两种:

电磁式蜂鸣器

它是利用电磁原理来产生声音,内部由线圈、电磁铁和振动膜片组成。电流通过线圈时,产生的磁场驱动振动膜片振动,从而发出声音。声音较大,但能耗高,容易受到磁场干扰,且对工作电压要求较为严格。适用于低频应用、需要较大音量的场合,适合工业环境或报警器等。

压电式蜂鸣器

它是基于压电效应原理,利用压电陶瓷材料在外加电场作用下发生形变,驱动振动膜片发出声音。其功耗低,体积小,工作电压范围很广。但低频性能较差,声音是比较小的。适用于对体积和功耗有要求的电子设备。

从驱动方式来说蜂鸣器主要分为两大类:有源蜂鸣器和无源蜂鸣器。

有源蜂鸣器(Active Buzzer)

有源蜂鸣器内部集成了一个振荡电路,当直接接入电源时就可以发出声音。由于内部已经集成了振荡电路,有源蜂鸣器的控制相对简单,只需要提供一个恒定的电源电压即可。但是,这种蜂鸣器的音调和音量调节较为有限。

无源蜂鸣器(Passive Buzzer)

与有源蜂鸣器不同,无源蜂鸣器没有内置振荡电路。要使无源蜂鸣器发声,需要提供一个外部的交流信号(PWM信号)。这种蜂鸣器的优点是可以通过调整外部信号的频率和占空比来实现更丰富的音调和音量控制。

我这里选用的无源蜂鸣器的C编号是C95297,是一个贴片无源电磁式蜂鸣器,他的驱动频率是4000Hz,也就是说我们的PWM频率在4KHz时声音是最响的。

8.2 简单鸣叫一声​

下面代码的主要功能就是让蜂鸣器发出一个短暂的4kHz(50%占空比)声音,然后在50毫秒后关闭。

import time
from machine import PWM, FPIOA# 配置蜂鸣器IO口功能
beep_io = FPIOA()
beep_io.set_function(43, FPIOA.PWM1)# 初始化蜂鸣器PWM通道
beep_pwm = PWM(1, 4000, 50, enable=False)  # 默认频率4kHz,占空比50%# 使能PWM通道输出
beep_pwm.enable(1)
# 延时50ms
time.sleep_ms(50)
# 关闭PWM输出 防止蜂鸣器吵闹
beep_pwm.enable(0)
# 叫完了就释放PWM
beep_pwm.deinit()

开头就是导入time库用来延时,PWM用来控制引脚输出PWM信号,FPIOA用来将引脚复用为PWM功能

接下来实例化FPIOA,设置蜂鸣器的驱动脚GPIO43为PWM通道1输出模式。设置频率为4KHz,占空比为50%,enable=False表示初始化时关闭PWM输出,即默认状态下蜂鸣器不发声。接下来调用beep_pwm.enable(1)让蜂鸣器开始发出4Khz的声音,延时50ms后先关闭PWM输出,来停止蜂鸣器的发声,最后释放一下PWM通道资源,防止在不断电的情况下继续运行其他程序造成的资源占用

8.3 播放【一闪一闪亮晶晶】​

下面代码的主要功能就是通过定义音符频率来控制蜂鸣器来发出《一闪一闪亮晶晶》旋律的声音。

下述程序的流程图如下:

import time
from machine import PWM, FPIOA# 配置蜂鸣器IO口功能
beep_io = FPIOA()
beep_io.set_function(43, FPIOA.PWM1)# 初始化蜂鸣器
beep = PWM(1, 1000, 50, enable=False)  # 默认频率1kHz,占空比50%# 定义音符频率(以Hz为单位)
notes = {'C4': 261,'D4': 293,'E4': 329,'F4': 349,'G4': 392,'A4': 440,'B4': 493,'C5': 523
}# 定义《一闪一闪亮晶晶》旋律和节奏 (音符, 时长ms)
melody = [('C4', 500), ('C4', 500), ('G4', 500), ('G4', 500),('A4', 500), ('A4', 500), ('G4', 1000),('F4', 500), ('F4', 500), ('E4', 500), ('E4', 500),('D4', 500), ('D4', 500), ('C4', 1000)
]def play_tone(note, duration):"""播放指定音符"""frequency = notes.get(note, 0)  # 获取音符对应的频率if frequency > 0:beep.freq(frequency)        # 设置频率beep.enable(True)           # 启用蜂鸣器time.sleep_ms(duration)     # 持续播放指定时间beep.enable(False)          # 停止蜂鸣器time.sleep_ms(50)           # 音符之间的短暂停顿# 播放旋律
for note, duration in melody:play_tone(note, duration)# 释放PWM资源
beep.deinit()

上面这个程序的开头和上一个程序是一样的,都是导入需要的模块及配置蜂鸣器的PWM输出,这里就不再赘述。

不同的是定义了一个音符频率表notes,单位是Hz,对应了标准的音符。然后定义了旋律和节奏melody,包含具体的音符和持续时间的列表,每个元组表示一个音符和它的时长(单位是毫秒)。例如,('C4', 500)表示音符C4将持续500毫秒。

接下来定义了一个播放单个音符的函数play_tone,接受两个参数:音符note和持续时间duration。在这个函数中,根据音符名称从音符表中查找对应的频率。如果找不到对应的音符,默认返回0;然后设置蜂鸣器的频率为指定的音符频率;开启PWM信号并持续duration毫秒,最后停止发声在两个音符之间短暂暂停50ms,避免连续播放时音符之间没有间隔造成的失真。

之后就到了播放旋律了,使用for循环遍历melody列表,依次播放每个音符。每次循环会调用play_tone函数,传入音符和它的持续时间

最后等播放完毕后,释放PWM资源。

参考资料:

  1. class PWM – pulse width modulation — MicroPython latest documentation
  2. 2.9 PWM 模块 API 手册 — CanMV K230

相关文章:

庐山派K230学习日记4 PWM控制

1 本节介绍​ 📝本节您将学习如何通过将K230开发板的GPIO引脚复用为PWM功能并输出PWM信号;实现输出PWM信号及控制板载无源蜂鸣器发出声音。 🏆学习目标 1️⃣如何将GPIO引脚配置为PWM模式,通过40Pin排针中的部分引脚来输出PWM信号…...

Android配件应用默认启动与USB权限申请区别

使用效果: USB配件授权演示 选择USB配件默认打开应用 申请USB配件使用权限...

【车载开发系列】GPIO模式分类

【车载开发系列】GPIO模式分类 这里写目录标题 【车载开发系列】GPIO模式分类一. GPIO概念二. GPIO的模式区分三. GPIO的八大模式1)推挽输出(Output push-pull)2)开漏输出(Output open-drain)3)…...

uniapp--HBuilder开发

提示:本文为学习内容,若有错误,请联系作者,谦虚受教。 文章目录 前言一、下载HBuilder二、添加modbus相关库1.下载nodejs2.下载modbus库3.项目添加modbus库 三、HBuilder相关功能语句1.文件夹说明2.消息信息框3.开关按钮4.选中按钮…...

学习笔记|arduino uno r3|点亮|hello world|Atmega328P|开发板学习:概述

目录 arduino uno r3开发板学习开发板概述重要引脚介绍配置开发环境安装 Arduino IDE 编程环境介绍Arduino 介绍 实操连接选择程序程序代码编译和执行 总结课后练习 arduino uno r3开发板学习 开发板概述 Arduino UNO 是一款基于Atmega328P 的微控制器开发板。它有 14 个数字…...

Go语言的 的注解(Annotations)核心知识

Go语言的注解(Annotations)核心知识 Go语言是一种简洁且高效的编程语言,广泛应用于后端开发、云计算和微服务架构。在探索Go语言的特性时,我们不可忽视一个重要的概念:注解(Annotations)。虽然…...

WinRAR中“自动加密”如何使用?

WinRAR加密大家都不陌生,那么自动加密功能大家熟悉嘛?如何使用自动加密功能?今天介绍详细教程给大家。 打开WinRAR软件之后选择工具栏中的【选项】,点击设置 然后切换到【压缩】选项卡,点击【创建默认配置】&#xff…...

`http_port_t

http_port_t 是 SELinux(Security-Enhanced Linux)中的一种端口类型标签,用于标识哪些端口可以被 HTTP 和 HTTPS 服务使用。SELinux 是一种强制访问控制(MAC)安全模块,它通过定义安全策略来限制进程对系统资…...

C++编程等级认证学习计划

C编程等级认证学习计划 计划目标 在30天内系统学习并掌握C编程等级认证(一至八级)的知识点,为参加认证考试做好充分准备。 前期准备 学习资料收集 准备涵盖C编程一至八级知识点的专业教材,如《C Primer》等。收集相关的在线教…...

c和c++中为什么要防止头文件被重复包含!

在编程中,头文件就像一本工具书,它包含了函数、类、宏、全局变量等的定义和声明,供其他代码文件引用。想象一下,如果你在写一篇文章时,反复引用同一本工具书的内容,会发生什么情况呢? 1. 避免重…...

安的厦小程序开发日志

目录 背景名字由来架构文件目录app.jsonapp.wxsspackage.jsonproject.config.jsindex.wxmlindex.wxssindex.jsindex.jsondetail.wxmldetail.wxssdetail.jsdetail.json参考资料背景 我们正在经历一场价值观的变迁,过去的丈母娘和女朋友总是要求男方要买房,那是因为房子是当下…...

深度评测uni-app x:开启跨平台开发新篇章

文章目录 一、引言1.1 跨平台开发的崛起1.2 uni-app x 初印象 二、uni-app x 核心特性评测2.1 uts 语言:跨平台编程新利器2.2 uvue 渲染引擎:原生渲染新体验2.3 强大的组件和 API 支持2.4 插件生态:拓展无限可能 三、与 uni-app 对比&#xf…...

第06章 重定向与管道

一、概述 在企业生产环境中,如何记录一个程序运行的过程记录或者定时任务执行的结果呢?假设定时任务凌晨执行,我们在白天上班时需要查看执行是否成功要怎么办?就可以使用本章介绍的重定向和管道符号。 二、重定向 2.1 文件描述…...

python中的字典类型数据及其操作

1、字典的定义 映射是一种键(索引)和值(数据)的对应键值对:键是数据索引的扩展字典是键值对的集合,键值对之间无序字典采用大括号{}和dict()创建,键值对用冒号:表示,key…...

『SQLite』表达式操作

摘要:表达式是一个或多个值、运算符和计算值的 SQL 函数的组合。SQL 表达式与公式类似,都写在查询语言中。 基本语法 SELECT column1, column2, columnN FROM table_name WHERE [CONTION | EXPRESSION];布尔表达式 SQLite 的布尔表达式在匹配单个值的…...

PHP7和PHP8的最佳实践

php 7 和 php 8 的最佳实践包括:使用类型提示以避免运行时错误;利用命名空间组织代码并避免命名冲突;采用命名参数、联合类型等新特性增强可读性;用错误处理优雅地处理异常;关注性能优化,如避免全局变量和选…...

Python实现一个简单的 HTTP echo 服务器

一个用来做测试的简单的 HTTP echo 服务器。 from http.server import HTTPServer, BaseHTTPRequestHandler import jsonclass EchoHandler(BaseHTTPRequestHandler):def do_GET(self):# 构造响应数据response_data {path: self.path,method: GET,headers: dict(self.headers…...

字玩FontPlayer开发笔记4 性能优化 首屏加载时间优化

字玩FontPlayer开发笔记4 性能优化 首屏加载时间优化 字玩FontPlayer是笔者开源的一款字体设计工具,使用Vue3 ElementUI开发,源代码: github: https://github.com/HiToysMaker/fontplayer gitee: https://gitee.com/toysmaker/fontplayer …...

NeurIPS 2024 | SHMT:通过潜在扩散模型进行自监督分层化妆转移(阿里,武汉理工)

当前的妆容转移技术面临两个主要挑战: 缺乏成对数据,导致模型训练依赖于低质量的伪配对数据,从而影响妆容的真实感; 不同妆容风格对面部的影响各异,现有方法难以有效处理这种多样性。 今天给大家介绍的方法是由阿里联…...

“知识图谱AI教学辅助系统:点亮智慧学习的新灯塔

嘿,各位教育界的小伙伴们!今天咱们来聊聊一个超级有料的话题——知识图谱AI教学辅助系统。想象一下,如果有一个智能导师能根据你的需求定制专属的学习路径,还能像百科全书一样随时解答疑问,是不是感觉学习变得更高效、…...

STM32-ADC模数转换

定义: ADC(Analog-Digital Converter)模拟-数字转换器 ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量,建立模拟电路到数字电路的桥梁 12位逐次逼近型ADC【表示转化的范围是0-2^12 - 1】,1us转换时间 输…...

Springboot整合MyBatis-Plus

1、整合MyBatis-Plus 1、导入依赖 <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.2.0</version></dependency>2、配置 1&#xff09;配置数据源&#xff0c;导…...

分类、聚类与回归的评价指标

在cross_validate或cross_val_score中&#xff0c;参数scoring&#xff0c;与分类、聚类和回归算法的评价指标有关。 3.4.3. The scoring parameter: defining model evaluation rules For the most common use cases, you can designate a scorer object with the scoring pa…...

Day28下 - 大模型微调:酒店评论情感分析

一、前置准备 1. 下载 LLaMA Factory https://github.com/hiyouga/LLaMA-Factory.git 搭建过程详见&#xff1a;https://blog.csdn.net/CSBLOG/article/details/144584581 2. 选择 预训练模型 和 prompt指令模型 预训练阶段在实际工作中&#xff0c;一般是用不上的&#xff…...

企业级Nosql数据库和Redis集群

一、关系数据库和Nosql数据库 关系数据库 定义&#xff1a;关系数据库是建立在关系模型基础上的数据库。它使用表格&#xff08;关系&#xff09;来存储数据&#xff0c;通过行和列的形式组织信息。例如&#xff0c;一个简单的学生信息表可能有 “学号”“姓名”“年龄”“班级…...

代码优化方案

① 引入清晰的中间变量 即如果判断条件很复杂的情况下&#xff0c;最好的方式是引入清晰的中间变量。 isValid val > someConstant; isAllowed condition2 || condition3; isSecure condition4 && !condition5;// 有了描述性变量&#xff0c;我们就不需要再记住…...

C++直接内存管理new和delete

0、前言 C语言定义了两个运算符来分配和释放动态内存。运算符new分配内存&#xff0c;delete释放new分配的内存。 1、new动态内存的分配 1.1、new动态分配和初始化对象 1&#xff09;、new内存分配 在自由的空间分配的内存是无名的&#xff0c;new无法为其分配的对象…...

CPU过剩是什么意思? 有什么对电脑的影响吗?如何确认CPU有没有过剩

CPU 过剩通常是指计算机系统中 CPU 的性能远远超出了当前运行任务的需求。以下从产生原因和对电脑的影响为你详细介绍&#xff1a; 产生原因 硬件升级与软件发展不同步&#xff1a;用户为追求高性能提前升级了 CPU&#xff0c;而当前的软件应用程序在算法和功能上没有太大突破&…...

Git的简单介绍与如何安装Git

文章目录 前言一、初始git1.git是什么2.为什么要使用git(出现的问题)3.git是如何解决问题的 二、git的安装与卸载1.centos系统2.ubuntu系统3.windows 三、搭建git本地环境1.创建git本地仓库2.配置用户信息 总结 前言 本文简单引入git的相关内容。 一、初始git 1.git是什么 g…...

Linux vi/vim 编辑器:功能强大的文本处理工具

Linux vi/vim 编辑器&#xff1a;功能强大的文本处理工具 引言 Linux 系统中的 vi/vim 是一种功能强大的文本编辑器&#xff0c;它广泛应用于程序员、系统管理员和其他需要处理文本文件的用户群体中。vi 是 visual interface 的缩写&#xff0c;而 vim 则是 vi improved 的缩…...

计算机毕业设计Python电商品推荐系统 商品比价系统 电商比价系统 商品可视化 商品爬虫 机器学习 深度学习 京东爬虫 国美爬虫 淘宝爬虫 大数据

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…...

正则表达式 - 使用总结

正则表达式 - 使用总结 正则表达式(Regular Expression,简称Regex)是一种强大的文本处理工具,它允许我们通过特定的模式(pattern)来搜索、匹配和操作字符串。在编程、数据分析和文本处理等领域,正则表达式发挥着非常重要的作用。本文将总结正则表达式的基本概念、使用方…...

性能测试04|JMeter:连接数据库、逻辑控制器、定时器

目录 一、连接数据库 1、使用场景 2、直连数据库的关键配置 3、案例 ​编辑 二、逻辑控制器 1、if控制器 2、循环控制器 3、ForEach控制器 三、定时器 1、同步定时器 2、常数吞吐量定时器&#xff08;用的少&#xff0c;了解即可&#xff09; 3、固定定时器 一、连…...

力扣刷题:二叉树OJ篇(上)

大家好&#xff0c;这里是小编的博客频道 小编的博客&#xff1a;就爱学编程 很高兴在CSDN这个大家庭与大家相识&#xff0c;希望能在这里与大家共同进步&#xff0c;共同收获更好的自己&#xff01;&#xff01;&#xff01; 目录 1.单值二叉树&#xff08;1&#xff09;题目描…...

【跨域】解决SpringBoot和openresty跨域问题

平时后端只需要写一个配置类就可以解决跨域但是最近的新项目死活不行 先说结论 项目中的权限校验(也可以是其他的)拦截器优先级高于跨域拦截器导致跨域处理失效 解决办法 1.在addCorsMappings上增加 Order(value -100)// 跨域优先级最高 2.nginx放行OPTIONS请求 SpringBo…...

下载ffmpeg执行文件

打开网址&#xff1a;Download FFmpeg 按下面步骤操作 解压文件就可以看到ffmpeg的执行文件了&#xff0c;需要通过命令行进行使用&#xff1a; ffmpeg命令行使用参考&#xff1a; ffmpeg 常用命令-CSDN博客...

SQLite 实际案例研究与创新应用

SQLite 作为一种强大而简单的数据库实现&#xff0c;应用于各类场景&#xff0c;从移动应用到物联网设备&#xff0c;再到边缘计算。在本章中&#xff0c;我们将通过几个典型案例&#xff0c;探讨 SQLite 如何在实际中解决复杂问题&#xff0c;并研究其创新应用的可能性。 案例…...

C语言 递归编程练习

1.将参数字符串中的字符反向排列&#xff0c;不是逆序打印。 要求&#xff1a;不能使用C函数库中的字符串操作函数。 比如&#xff1a; char arr[] "abcdef"; 逆序之后数组的内容变成&#xff1a;fedcba 1.非函数实现&#xff08;循环&#xff09; 2.用递归方法…...

【HDU】1089 A+B for Input-Output Practice (I)

1089 AB for Input-Output Practice (I):以EOF结尾的输入 Problem Description Your task is to Calculate a b. Too easy?! Of course! I specially designed the problem for acm beginners. You must have found that some problems have the same titles with this one,…...

[python3]Excel解析库-xlwings

xlwings 是一个强大的 Python 库&#xff0c;它允许你直接与 Microsoft Excel 进行交互。通过 xlwings&#xff0c;你可以轻松地在 Python 脚本或 Jupyter Notebook 中读取、写入和操作 Excel 文件&#xff0c;而无需手动打开 Excel 应用程序。此外&#xff0c;xlwings 还支持将…...

[python3]Excel解析库-xlutils

xlutils 是一组用于处理 Excel 文件的 Python 库&#xff0c;它实际上是 xlrd 和 xlwt 的扩展&#xff0c;提供了额外的功能来操作 Excel 文件。xlutils 主要由三个部分组成&#xff1a;xlutils.copy、xlutils.filter 和 xlutils.view&#xff0c;它们分别用于复制和修改现有 E…...

React中的合成事件

合成事件与原生事件 区别&#xff1a; 1. 命名不一样&#xff0c;原生用纯小写方式&#xff0c;react用小驼峰的方式 原生&#xff1a;onclick React的&#xff1a;onClick 2. 事件处理函数的写法不一样 原生的是传入一个字符串&#xff0c;react写法传入一个回调函数 3.…...

记录一次电脑被入侵用来挖矿的过程(Trojan、Miner、Hack、turminoob)

文章目录 0、总结1、背景2、端倪3、有个微软的系统更新&#xff0c;就想着更新看看&#xff08;能否冲掉问题&#xff09;4、更新没成功&#xff0c;自动重启电脑5、风险文件&#xff08;好家伙命名还挺规范&#xff0c;一看名字就知道出问题了&#xff09;6、开机有一些注册表…...

牛客网刷题 ——C语言初阶(5操作符)——BC107 矩阵转置

1.题目描述&#xff1a;BC107 矩阵转置 牛客网OJ链接 KiKi有一个矩阵&#xff0c;他想知道转置后的矩阵&#xff08;将矩阵的行列互换得到的新矩阵称为转置矩阵&#xff09;&#xff0c;请编程帮他解答。 输入描述: 第一行包含两个整数n和m&#xff0c;表示一个矩阵包含n行m列…...

【调试记录】在CARLA中插入可以播放视频的组件

〇、问题描述 做实验验证的时候&#xff0c;需要在CARLA仿真环境中添加一个可以播放视频的功能&#xff0c;查了很多现有的实验&#xff0c;基本都是插入图像&#xff0c;而对于插入视频&#xff0c;实现的方法就很麻烦了。一开始考虑的是直接用射影变换进行叠加&#xff0c;计…...

【Linux】RPMSG通讯协议介绍

RPMSG协议通讯协议介绍 RPMSG&#xff0c;全称Remote processor Messaging。是一种核间通讯协议。在Linux Kernel中&#xff0c;已经内置了RPMSG。 Linux RPMSG基于共享内存&#xff0c;利用RPMSG可以高效的实现核间通信。比如Linux与FreeRTOS、Linux与Android&#xff0c;都可…...

Branch-Solve-Merge Improves Large Language Model Evaluation and Generation

题目 分支-求解-合并改进了大型语言模型的评估和生成 摘要 大型语言模型(LLM)经常用于多方面的语言生成和评估任务&#xff0c;这些任务涉及满足复杂的用户约束或考虑多个方面和标准。然而&#xff0c;由于模型缺乏一致性&#xff0c;无法计划和分解问题&#xff0c;他们的表现…...

SqlSugar-文章目录

SqlSugar学习总结1(基础操作) SqlSugar学习总结2(主从复制-数据库配置) SqlSugar学习总结3(主从复制-读写分离) SqlSugar学习总结4(树形递归查询) SqlSugar学习总结5(映射)...

如何理解RDD,以及RDD的五大特性和五大特点。

RDD&#xff1a;英文全称Resilient Distributed Dataset&#xff0c;叫做弹性分布式数据集&#xff0c;代表一个不可变、可分区、里面的元素可并行计算的分布式的抽象的数据集合。 Resilient弹性&#xff1a;RDD的数据可以存储在内存或者磁盘当中&#xff0c;RDD的数据可以分区…...

umd格式

umd格式是啥&#xff1f; umd格式是一种通用模块&#xff0c;他同时支持AMD、CJS、ESM模块和全局变量的方式 umd格式打包后的基本代码结构如下: (function (root, factory) {if (typeof define function && define.amd) {// AMDdefine([dependency], factory);} el…...