STM32 PWM波形详细图解
目录
前言
一 PWM介绍
1.1 PWM简介
1.2 STM32F103 PWM介绍
1.3 时钟周期与占空比
二.引脚映像关系
2.1引脚映像与寄存器
2.2 复用功能映像
三. PWM 配置步骤
3.1相关原理图
3.2配置流程
3.2.1 步骤一二:
3.2.2 步骤三:
3.2.3 步骤四五六七:
3.2.4 步骤八:
3.3 PWM 详细代码
3.3.1 PWM.C
3.3.2 main.c
四.PWM波形
4.1 波形查看
4.2 PWM更新频率
4.2.1不使用delay
4.2.2 使用delay
前言
步骤一:通过配置ARR(自动重装载值寄存器)和PSC(预分频器)的值,来设置CNT(计数器)的定时周期、计数频率。
步骤二:再改变CCR(捕获/比较寄存器)的值,通过CNT与CCR的比较,可对PWM占空比进行调整。
经过步骤一和步骤二:即可输出频率和占空比都可以调制的PWM波形
注:
ARR(自动重装载值寄存器)
PSC(预分频器)
CNT(计数器)
CCR(捕获/比较寄存器)
一 PWM介绍
1.1 PWM简介
脉冲宽度调制:PWM是一种数字信号控制技术,其中数字信号的占空比被用来控制模拟信号的幅度。占空比是指在一个周期内,信号处于高电平状态的时间与总周期时间的比例。
PWM是"Pulse Width Modulation"的缩写,中文意思是“脉冲宽度调制”。这是一种模拟信号控制方法,通过改变电信号的占空比来控制功率输出或模拟信号的幅度。PWM广泛应用于各种电子系统中,包括但不限于以下几个领域:
电机控制:PWM用于控制电机的转速和力矩,通过调整电机驱动器的输入电压或电流的占空比来实现。
LED调光:在LED照明中,PWM可以控制LED的亮度,通过改变电流的占空比来调节亮度,而不会改变LED的色温。
音频信号合成:PWM也用于数字音频处理,通过调制脉冲的宽度来合成模拟音频信号。
电源管理:在开关电源中,PWM用于控制开关元件的开关频率和占空比,以调节输出电压和电流。
通信:某些通信协议使用PWM来传输数据,通过调制脉冲的宽度来编码信息。
测量和控制:PWM信号可以用于测量距离、速度等物理量,也可以用于控制各种执行器。
PWM信号的主要特点包括:
- 周期性:PWM信号是周期性重复的,具有固定的频率。
- 占空比:PWM信号的占空比是指高电平状态在整个周期中所占的比例。
- 分辨率:PWM的分辨率取决于信号的周期和能够分辨的最小脉冲宽度,高分辨率的PWM可以提供更平滑的模拟控制。
- 易于生成和控制:PWM信号可以通过数字电路或微控制器轻松生成和调整。
在实际应用中,PWM信号通常由定时器或专用的PWM硬件生成,然后通过数字到模拟转换器(DAC)或直接通过功率放大器输出到负载。通过精确控制PWM信号的频率和占空比,可以实现对各种电子设备的精确控制。
1.2 STM32F103 PWM介绍
在STM32F103中除了基本定时器(定时器6和定时器7),通用和高级定时器都可以用来进行PWM输出。
1.3 时钟周期与占空比
在时基单元中,我们通过对PSC、ARR 大小进行配置,来设置计数器CNT的定时周期、计数频率。
因为前面的时基单元中,已经设置完定时器时钟频率。可以通过TIMx_CCRx(捕获/比较寄存器,也就是上面的CCR),输出占空比可调的PWM波形
注:因为CNT在前面设置向上或向下计数模式后就不用更改了,所以到这一步只需要对CRR的值进行设置,也可以通过while()循环,不断给TIMx_CCRx寄存器赋新的值,来进行脉宽占空比的调整。
输出频率和占空比都可以调制的PWM波形
•PWM频率: Freq = CK_PSC / (PSC + 1) / (ARR + 1)
•PWM占空比: Duty = CCR / (ARR + 1)
•PWM分辨率: Reso = 1 / (ARR + 1)
二.引脚映像关系
2.1引脚映像与寄存器
高级定时器:TIM1和TIM8是高级定时器
通用定时器:TIM2、TIM3、TIM4和TIM5是通用定时器
基本定时器:TIM6和TIM7是基本的定时器
2.2 复用功能映像
引脚重映射:比如当您需要将TIM3的某些通道映射到不同的GPIO引脚上时,可以使用复用功能映像。例如,当默认的TIM3通道引脚不能满足您的硬件设计需求,或者您需要将多个通道映射到同一个引脚上时,可以使用复用功能映像来改变引脚映射。
PWM输出到特定引脚:如果您需要将PWM信号输出到特定的GPIO引脚,而这个引脚不是TIM3的默认输出引脚,您可以通过复用功能映像来实现。例如,将TIM3的CH2映射到PB5,或者将所有四个通道映射到PC6、PC7、PC8、PC9。
下面以TIM3为例
TIM3是STM32微控制器中的一个通用定时器,它具有四个独立的通道,分别是CH1、CH2、CH3和CH4。这些通道可以被配置为输入捕获、输出比较或PWM输出模式,用于各种定时和控制应用。
每个通道都有自己的捕获/比较寄存器(CCR),可以独立设置,以实现不同的定时和控制功能。例如,TIM3_CH1默认引脚为PA6,TIM3_CH1部分重映像引脚为PB4,TIM3_CH1完全重映像引脚为PC6。
三. PWM 配置步骤
3.1相关原理图
这里使用PWM控制LED呼吸灯。这里控制PC8的绿色LED灯,实现呼吸灯的效果。
这里的PC8端口,是TIM3的通道3使用完全重映射
//部分重映射GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3,ENABLE);//完全重映射GPIO_PinRemapConfig(GPIO_FullRemap_TIM3,ENABLE);既:GPIO_PinRemapConfig(GPIO_FullRemap_TIM3,ENABLE);
3.2配置流程
一:使能定时器3和相关IO口时钟。
使能定时器3时钟:RCC_APB1PeriphClockCmd();
使能GPIOC时钟:RCC_APB2PeriphClockCmd();
二:初始化IO口为复用功能输出。函数:GPIO_Init();
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
三:这里我们是要把PC8用作定时器的PWM输出引脚,所以要重映射配置,所以需要开启AFIO时钟。同时设置重映射。
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE);
四:初始化定时器:ARR,PSC等:TIM_TimeBaseInit();
五:初始化输出比较参数:TIM_OC3Init();
六:使能预装载寄存器: TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);
七:使能定时器:TIM_Cmd();
八:不断改变比较值CCRx,达到不同的占空比效果:TIM_SetCompare4();
3.2.1 步骤一二:
一:使能定时器3和相关IO口时钟。
使能定时器3时钟:RCC_APB1PeriphClockCmd();
使能GPIOC时钟:RCC_APB2PeriphClockCmd();
二:初始化IO口为复用功能输出。函数:GPIO_Init();
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;TIM_OCInitTypeDef TIM_OCInitStructure;GPIO_InitTypeDef GPIO_InitStructure;/* 步骤一:使能定时器3和相关IO口时钟。开启时钟 */RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);/* 步骤二:初始化IO口为复用功能输出 */GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽输出GPIO_Init(GPIOC,&GPIO_InitStructure);
3.2.2 步骤三:
三:这里我们是要把PC8用作定时器的PWM输出引脚,所以要重映射配置,所以需要开启AFIO时钟。同时设置重映射。
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE);
/* 步骤三:设置重映射 */GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3,ENABLE);GPIO_PinRemapConfig(GPIO_FullRemap_TIM3,ENABLE);//改变指定管脚的映射
3.2.3 步骤四五六七:
四:初始化定时器:ARR,PSC等:TIM_TimeBaseInit();
五:初始化输出比较参数:TIM_OC3Init();
六:使能预装载寄存器: TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);
七:使能定时器:TIM_Cmd();
/* 步骤四:初始化定时器 */TIM_TimeBaseInitStructure.TIM_Period=per; //自动装载值TIM_TimeBaseInitStructure.TIM_Prescaler=psc; //分频系数TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //设置向上计数模式TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure); /* 步骤五:初始化输出比较参数:TIM_OC3Init(); */TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low;//计数值与TIM_Pulse匹配,输出低电平TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;TIM_OC3Init(TIM3,&TIM_OCInitStructure); //输出比较通道3初始化/* 步骤六:使能预装载寄存器 */TIM_OC3PreloadConfig(TIM3,TIM_OCPreload_Enable);//使能TIMx在 CCR3 上的预装载寄存器TIM_ARRPreloadConfig(TIM3,ENABLE);//使能预装载寄存器/* 步骤七:使能定时器3 */TIM_Cmd(TIM3,ENABLE); //使能定时器
3.2.4 步骤八:
八:不断改变比较值CCRx,达到不同的占空比效果:TIM_SetCompare4();
int main() {u16 i=0; u8 fx=0;delay_init();NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断优先级分组 分2组LED_Init();TIM3_CH3_PWM_Init(500,72-1); //0.5毫秒,(频率是2KHZ)while(1){if(fx==0){i++;if(i==500){fx=1;}}else{i--;if(i==0){fx=0;}}//可直接改变CCR的值(通道3也就是CCR3的值)TIM_SetCompare3(TIM3,i); //i值最大可以取499,因为ARR最大值是499.delay_ms(5); } }
3.3 PWM 详细代码
3.3.1 PWM.C
pwm.c
#include "pwm.h" #include "led.h"/******************************************************************************* * 函 数 名 : TIM3_CH3_PWM_Init * 函数功能 : TIM3通道3 PWM初始化函数 * 输 入 : per:重装载值psc:分频系数 * 输 出 : 无 *******************************************************************************/ void TIM3_CH3_PWM_Init(u16 per,u16 psc) {TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;TIM_OCInitTypeDef TIM_OCInitStructure;GPIO_InitTypeDef GPIO_InitStructure;/* 步骤一:使能定时器3和相关IO口时钟。开启时钟 */RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);/* 步骤二:初始化IO口为复用功能输出 */GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽输出GPIO_Init(GPIOC,&GPIO_InitStructure);/* 步骤三:设置重映射 */GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3,ENABLE);GPIO_PinRemapConfig(GPIO_FullRemap_TIM3,ENABLE);//改变指定管脚的映射 /* 步骤四:初始化定时器 */TIM_TimeBaseInitStructure.TIM_Period=per; //自动装载值TIM_TimeBaseInitStructure.TIM_Prescaler=psc; //分频系数TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //设置向上计数模式TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure); /* 步骤五:初始化输出比较参数:TIM_OC3Init(); */TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;//计数值与TIM_Pulse匹配,输出低电平TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;TIM_OC3Init(TIM3,&TIM_OCInitStructure); //输出比较通道3初始化/* 步骤六:使能预装载寄存器 */TIM_OC3PreloadConfig(TIM3,TIM_OCPreload_Enable);//使能TIMx在 CCR3 上的预装载寄存器TIM_ARRPreloadConfig(TIM3,ENABLE);//使能预装载寄存器/* 步骤七:使能定时器3 */TIM_Cmd(TIM3,ENABLE); //使能定时器}
3.3.2 main.c
main.c
#include "sys.h" #include "delay.h" #include "usart.h" #include "led.h" #include "key.h" #include "time.h" #include "pwm.h"int main() {u16 i=0; u8 fx=0;delay_init();NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断优先级分组 分2组LED_Init();TIM3_CH3_PWM_Init(500,72-1); //周期0.5毫秒,(频率是2KHZ)/* PSC = 72; ARR = 500; 周期 = 500/1000000 = 5/10000 =0.0005秒 = 0.5毫秒 频率 = 2KHZ*//*LED亮灭时间2秒(亮1秒,灭1秒),t = 1000/500 =2; */while(1){if(fx==0){i++;if(i==500){fx=1;}}else{i--;if(i==0){fx=0;}}//可直接改变CCR的值(通道3也就是CCR3的值)TIM_SetCompare3(TIM3,i); //i值最大可以取499,因为ARR最大值是499.delay_ms(2); } }
四.PWM波形
4.1 波形查看
假设 CPU 的时钟频率为 1 MHz(1 微秒/周期),并且循环体内的指令执行需要 10 个周期(这是一个粗略的估计,下面实际测试是差不多的),那么每次循环大约需要 10 微秒。因此,一个完整的亮灭周期大约需要:
这里的if(fx==500),递增和递减共需:500*2 = 1000次计算:
1000×10 微秒=10000 微秒=10 毫秒1000×10微秒=10000微秒=10毫秒
所以,LED 亮灭一次的周期大约为 10 毫秒。这意味着 LED 每 10 毫秒亮灭一次。但请注意,这个估计值可能与实际值有所不同,具体取决于 CPU 的执行速度和循环体内的指令数量。
波形大致为:因为pwm周期
4.2 PWM更新频率
注意:
更改delay_ms()延时函数的大小:是修改LED灯亮灭的周期;
LED亮灭周期是由频率(时基单元PSC ARR CNT)和占空比(CCR)控制的;
dalay_ms()函数是为了控制PWM信号的更新速率:在代码中,
delay_ms()函数控制了i值更新的速率,即控制了 PWM 信号占空比变化的速率。如果没有这个延迟,i的值会非常快地在 0 到 500 之间变化,导致 PWM 信号的频率非常高,这可能超出了人眼的感知范围,使得 LED 的亮度看起来是恒定的。
4.2.1不使用delay
1 不使用delay_ms()函数
循环中没有包含任何延迟,这意味着
i的值会非常快速地在 0 到 500 之间变化,没有任何停留。由于没有延迟,i的值变化得太快,导致人眼无法察觉到 LED 的亮度变化,看起来就像是 LED 一直亮着。
4.2.2 使用delay
2 使用delay_ms(1)函数后:这里就是LED的亮灭周期为1秒
- 从 0 增加到 500 需要 500 次循环。
- 从 500 减少到 0 也需要 500 次循环。
- 因此,一个完整的亮灭周期需要 1000 次循环。
每次循环的时间为 1 毫秒,所以一个完整的亮灭周期的时间为:
1000×1 毫秒=1000 毫秒=1 秒1000×1毫秒=1000毫秒=1秒
如下图
相关文章:
STM32 PWM波形详细图解
目录 前言 一 PWM介绍 1.1 PWM简介 1.2 STM32F103 PWM介绍 1.3 时钟周期与占空比 二.引脚映像关系 2.1引脚映像与寄存器 2.2 复用功能映像 三. PWM 配置步骤 3.1相关原理图 3.2配置流程 3.2.1 步骤一二: 3.2.2 步骤三: 3.2.3 步骤四五六七: …...
Python Web 开发 FastAPI 入门:从基础架构到框架比较
Python Web 开发 FastAPI 入门:从基础架构到框架比较 目录 🖥️ Web 服务器概述(如 Nginx、Apache)🔗 前后端分离架构详解🔄 HTTP 路由和请求处理机制🧰 Web 框架概述:Django、Fla…...
基于STM32的智能仓库管理系统设计
目录 引言环境准备 硬件准备软件准备智能仓库管理系统基础 控制系统架构功能描述代码实现:实现智能仓库管理系统 4.1 RFID标签读取模块4.2 库存管理模块4.3 数据显示与监控模块4.4 无线通信模块应用场景:智能仓库管理系统优化问题解决方案与优化收尾与总…...
排序算法--堆排序【图文详解】
“留在码头的船才最安全” “但亲爱的,那不是造船的目的。 堆--插入heapInsert 原来有一个大根堆,如图: 现在要新插入一个数字50,进行插入 流程:和父亲相比,如果比父亲大,和父亲交换ÿ…...
FCBP 认证考试要点摘要
理论知识 数据处理与分析:包括数据的收集、清洗、转换、存储等基础操作,以及数据分析方法,如描述性统计分析、相关性分析、数据挖掘算法等的理解和应用 。数据可视化:涉及图表类型的选择与应用,如柱状图、折线图、饼图…...
鸿蒙生态崛起的机遇有什么
鸿蒙生态系统的崛起为各个领域带来了多个机遇,主要体现在以下几个方面: 智能设备的互联互通:鸿蒙系统旨在实现不同设备之间的无缝连接,为物联网(IoT)设备的发展提供了良好的基础。这将推动智能家居、智慧城…...
基础(函数、枚举)错题汇总
枚举默认从0开始,指定后会按顺序赋值 而这个枚举变量X,如果在全局(函数外部)定义,那默认为0,如果在函数内部(局部变量),那就是随机值,必须初始化。 枚举变量…...
【Spark源码分析】规则框架- `analysis`分析阶段使用的规则
analysis分析阶段使用的规则 规则批策略规则说明SubstitutionfixedPointOptimizeUpdateFields该规则优化了 UpdateFields 表达式链,因此看起来更像优化规则。但是,在处理深嵌套模式时,UpdateFields 表达式树可能会非常复杂,导致分…...
mysql--二进制安装编译安装yum安装
二进制安装 创建用户和组 [rootlocalhost ~]# groupadd -r -g 306 mysql [rootlocalhost ~]# useradd -r -g 306 -u 306 -d /data/mysql mysql 创建文件夹并添加所属文件用户和组 [rootlocalhost ~]# mkdir -p /data/mysql [rootlocalhost ~]# chown mysql:mysql /data/mysql …...
《Django 5 By Example》阅读笔记:p339-p358
《Django 5 By Example》学习第12天,p339-p358总结,总计20页。 一、技术总结 1.项目(购物网站) django-admin startproject myshop 虽然这里只是示例,但我觉得这种命名为 myxxx 的习惯非常不好,因为在实际应用中,是…...
鸿蒙修饰符
文章目录 一、引言1.1 什么是修饰符1.2 修饰符在鸿蒙开发中的重要性1.3 修饰符的作用机制 二、UI装饰类修饰符2.1 Styles修饰符2.1.1 基本概念和使用场景2.1.2 使用示例2.1.3 最佳实践 2.2 Extend修饰符2.2.1 基本概念2.2.2 使用示例2.2.3 Extend vs Styles 对比2.2.4 使用建议…...
springboot359智慧草莓基地管理系统(论文+源码)_kaic
毕 业 设 计(论 文) 题目:智慧草莓基地管理系统 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本智慧草莓基地管理系统就…...
单片机位数对性能会产生什么影响?!
单片机的位数是指其处理器核心的位宽,通常以比特(bit)为单位。常见的位数有8位、16位、32位和64位等。 单片机位数越高,处理器能够处理的数据量越大,性能也相应提高。 以下是对单片机位数对性能影响的详细分析&#…...
stm32内部高速晶振打开作为主时钟
首先建议你别这么干,因为内部晶振特别容易受温度等外界影响,很容易卡死或堵死程序 我是因为没画外部晶振电路,所以只能开内部晶振来作为时钟 适用于stm32f103系列 把下面的代码换掉源文件里的时钟源配置 /* 开启HSI 即内部晶振时钟 */RCC…...
【分页查询】.NET开源 ORM 框架 SqlSugar 系列
.NET开源 ORM 框架 SqlSugar 系列 【开篇】.NET开源 ORM 框架 SqlSugar 系列【入门必看】.NET开源 ORM 框架 SqlSugar 系列【实体配置】.NET开源 ORM 框架 SqlSugar 系列【Db First】.NET开源 ORM 框架 SqlSugar 系列【Code First】.NET开源 ORM 框架 SqlSugar 系列【数据事务…...
【CSS in Depth 2 精译_061】9.4 CSS 中的模式库 + 9.5 本章小结
当前内容所在位置(可进入专栏查看其他译好的章节内容) 【第九章 CSS 的模块化与作用域】 ✔️ 9.1 模块的定义 9.1.1 模块和全局样式9.1.2 一个简单的 CSS 模块9.1.3 模块的变体9.1.4 多元素模块 9.2 将模块组合为更大的结构 9.2.1 模块中多个职责的拆分…...
惠普电脑切换默认F1至F12快捷键,FN切换
发现新买的惠普电脑,按F1至F12发现是快捷功能键,而按fnF1至F12才是windows的功能键和正常我自己使用的电脑刚好相反,实在太不方便了。 解决办法需要进入biso里面去把功能键模式选中给关掉,才能恢复回来...
计算机的错误计算(一百七十)
摘要 回复一中学生来信,探讨 MATLAB 关于算式 的计算问题。 在计算机的错误计算(一百三十二)中,我们探讨了手持式计算器关于算式 的计算问题。一中学生来信询问该算式在数学软件中是否会出错。 例1. 在 MATLAB 中计算 . 首…...
Python `async def` 函数中使用 `yield` 和 `return` 的区别
Python async def 函数中使用 yield 和 return 的区别 1. return 的使用示例代码输出结果解释 2. yield 的使用示例代码输出结果解释 3. 总结 在 Python 中,async def 函数用于定义异步函数,这些函数可以在执行过程中暂停和恢复,通常与 await…...
JAVA修饰符
JAVA 修饰符...
移动端ECharts实战:如何隐藏原生滚动条实现内容区域左右滑动(附完整代码)
移动端ECharts进阶:原生滚动条隐藏与手势滑动优化全解析 在移动端数据可视化项目中,ECharts的默认滚动条交互常常成为用户体验的"阿喀琉斯之踵"。当用户手指在狭小的滚动条上艰难拖动时,那种顿挫感和操作失败率会让精心设计的数据图…...
OpenClaw多模态扩展:为nanobot添加图像识别能力
OpenClaw多模态扩展:为nanobot添加图像识别能力 1. 为什么需要图像识别能力 去年夏天,我接手了一个自动化内容审核的小项目。最初只是用OpenClaw处理文本内容,但很快发现一个致命缺陷——当需要审核带图片的帖子时,我的机器人就…...
FastAPI 2.0 AI流式响应性能瓶颈分析与突破方案(源码级内存泄漏定位实录)
第一章:FastAPI 2.0 AI流式响应性能瓶颈分析与突破方案(源码级内存泄漏定位实录)在高并发AI推理服务场景下,FastAPI 2.0 的 StreamingResponse 在持续返回大模型 token 流时,常出现 RSS 内存持续增长、GC 延迟升高、最…...
Wan2.2-I2V-A14B企业应用:品牌广告片AI辅助生成+人工精修工作流
Wan2.2-I2V-A14B企业应用:品牌广告片AI辅助生成人工精修工作流 1. 企业级视频创作新范式 在品牌营销领域,高质量视频内容的需求正呈指数级增长。传统视频制作流程面临三大痛点:创意实现周期长、专业团队成本高、批量生产难度大。Wan2.2-I2V…...
从零开始学习C++ -- 基础知识
C入门基础1.C的第一个程序2.命名空间2.1 namespace的价值2.2 namespace的定义2.3命名空间使用3.C输入&输出4.缺省参数5.函数重载6.引用6.1引用的概念和定义6.2引用的特性6.3引用的使用6.4const引用6.5指针和引用的关系7.inline8.nullptr1.C的第一个程序 #include <iost…...
如何突破内容访问限制?5类开源工具的技术解析与场景适配
如何突破内容访问限制?5类开源工具的技术解析与场景适配 【免费下载链接】bypass-paywalls-chrome-clean 项目地址: https://gitcode.com/GitHub_Trending/by/bypass-paywalls-chrome-clean 在信息爆炸的数字时代,优质内容往往被各种访问限制所阻…...
UniApp实战:如何安全高效地在安卓10+设备上实现本地数据存储(附权限配置避坑指南)
UniApp安卓10本地数据存储实战:权限配置与高性能方案设计 当你的UniApp在安卓10设备上突然无法保存用户配置时,控制台那行冰冷的"Permission denied"可能让整个开发团队陷入深夜加班。这不是简单的API调用问题,而是安卓存储机制变革…...
ChromePass终极指南:3分钟找回Chrome浏览器所有保存密码
ChromePass终极指南:3分钟找回Chrome浏览器所有保存密码 【免费下载链接】chromepass Get all passwords stored by Chrome on WINDOWS. 项目地址: https://gitcode.com/gh_mirrors/chr/chromepass 你是否曾在Chrome浏览器中保存了重要账号密码,却…...
Windows Defender Remover:彻底移除Windows安全组件的终极解决方案
Windows Defender Remover:彻底移除Windows安全组件的终极解决方案 【免费下载链接】windows-defender-remover A tool which is uses to remove Windows Defender in Windows 8.x, Windows 10 (every version) and Windows 11. 项目地址: https://gitcode.com/gh…...
PyTorch 2.8镜像部署教程:从零配置到运行Llama3-70B 4bit量化推理完整指南
PyTorch 2.8镜像部署教程:从零配置到运行Llama3-70B 4bit量化推理完整指南 1. 环境准备与快速部署 在开始之前,请确保您的硬件配置满足以下最低要求: 显卡:NVIDIA RTX 4090D 24GB显存内存:120GB以上存储:…...

















