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

STM32 学习10 PWM输出

STM32 学习10 PWM输出

  • 一、PWM简介
    • 1. PWM的概念
    • 2. PWM的工作原理
    • 3. PWM 常用的应用场景
  • 二、一些概念
    • 1. 频率
    • 2. 占空比
  • 三、STM32F1 PWM介绍
    • 1. 定时器与寄存器
      • (1)**自动重装载寄存器(ARR)**:
      • (2)**比较寄存器(CCR)**:
    • 2. PWM的输出模式
      • (1)PWM模式1
      • (2)PWM模式2
    • 3. 边沿对齐与中心对齐
      • (1)边沿对齐模式
      • (2)中心对齐模式
  • 四、PWM输出配置步骤
    • 1. 使能定时器及端口时钟
    • 2. 定时器的重映像
      • (1)定时器4复用功能重映像
      • (2)定时器3复用功能重映像
      • (3) 定时器2复用功能重映像
    • 3. 输出端口复用
    • 4. 初始化定时器参数
    • 5. 初始化PWM输出参数
    • 6. 开启定时器
    • 7. 修改TIMx_CCRx的值控制占空比
    • 8. 使能 TIMx 在 CCRx 上的预装载寄存器
    • 9. 使能 TIMx 在 ARR上的预装载寄存器允许位
    • 10. 设置 MOE位
  • 五、代码示例
    • 1. pwm_utils.h
    • 2. pwm_utils.c
    • 3. main函数实现

一、PWM简介

1. PWM的概念

PWM的全称是脉冲宽度调制(Pulse Width Modulation),是一种控制模拟信号的方法。它通过改变脉冲的宽度来控制模拟信号的平均值。

2. PWM的工作原理

PWM的工作原理是将一个周期性的脉冲信号与一个控制信号进行比较。当控制信号大于脉冲信号时,输出高电平;当控制信号小于脉冲信号时,输出低电平。通过改变脉冲信号的宽度,可以控制输出信号的平均值。

输出信号的平均值连在一起,可以达到模拟信号的效果,如下图所示:
wikipedia示例

3. PWM 常用的应用场景

  • 电机控制:用于控制电机的速度和方向;
  • 照明控制:用于控制灯光的亮度;
  • 电源管理:用于控制电源的输出电压;
  • 音频控制:用于控制声音的大小。

二、一些概念

1. 频率

PWM波形在单位时间内重复出现的次数。

2. 占空比

PWM波形中高电平信号所占的比例。

三、STM32F1 PWM介绍

1. 定时器与寄存器

STM32F1除了基本定时器TIM6和TIM7,其它定时器都可以产生PWM输出。其中:

  • TIM1和TIM8:均可同时产生7路PWM输出;
  • 其它通用定时器:均可同时产生4路PWM输出。

在STM32微控制器中,生成PWM信号通常涉及到自动重装载寄存器(ARR)和比较寄存器(CCR)两个重要的寄存器。

(1)自动重装载寄存器(ARR)

  • 通过修改ARR的值,可以调节PWM信号的周期,从而改变PWM信号的频率。
  • 当ARR增加时,整个PWM信号的周期增加,导致PWM信号的频率降低。

(2)比较寄存器(CCR)

  • 通过修改CCR的值,可以调节PWM信号的占空比,从而改变PWM信号的高电平持续时间。
  • CCR的值通常应该小于ARR的值,以确保PWM信号的占空比在0到100%之间。
  • 当CCR增加时,高电平部分的持续时间增加,导致PWM信号的占空比增加。

2. PWM的输出模式

PWM输出模式一共8种,常用的是PWM1和PWM2,其用法差不多,区别如下:
下表是PWM1和PWM2的区别:

(1)PWM模式1

在该模式下,定时器的计数器从0开始递增,

  • 当计数器的值小于CCR时,输出为高电平;
  • 当计数器的值大于等于CCR时,输出为低电平;
  • 在计数器达到ARR时,产生一个更新事件,计数器重新从0开始计数。

这种模式下,PWM信号的周期由ARR决定,占空比由CCR决定。

(2)PWM模式2

与PWM模式1相比,PWM模式2输出有效性正好是相反的。

下表是PWM1和PWM2的比较:

模式CNT 计算方式CNT<CCRCNT>CCR
PWM1递增通道CH有效通道CH无效
PWM1递减通道CH无效通道CH有效
PWM2递增通道CH无效通道CH有效
PWM2递减通道CH有效通道CH无效

3. 边沿对齐与中心对齐

(1)边沿对齐模式

  • 在边沿对齐模式下,PWM信号的起始位置位于PWM周期的起始边沿(即ARR),然后递增至CCR,再递增至ARR,最后重复此过程。
  • PWM信号的高电平和低电平都与PWM周期的边沿对齐,即从PWM周期的起始边沿开始。
  • 边沿对齐模式通常用于需要高精度输出的应用,例如需要精确控制PWM信号的起始和终止时间的应用场景。
    在这里插入图片描述
    以上图为例,TIMx_CR1寄存器的DIR位为低时,递增计数,设ARR=8,当CCRx=4时:
  • CNT从0增至3的时候,输出PWM参考信号0CxREF为有效的高电平;
  • CNT从4到8的时候,0CxREF输出为低电平;

0CXREF表示定时器的比较器

(2)中心对齐模式

  • 在中心对齐模式下,PWM信号的起始位置位于PWM周期的中间,然后递增至CCR,再递减至0,再重复此过程。
  • PWM信号的高电平和低电平都与PWM周期的中心对齐,即从PWM周期的中间开始。
  • 中心对齐模式通常用于需要调节占空比范围较大的应用,例如需要在PWM周期内任意调节占空比的应用场景。由于PWM信号的起始位置位于PWM周期的中间,因此可以实现更宽范围的占空比调节。

在这里插入图片描述
以上图为例,设ARR=8,当CCRx=4时,

  • 当CNT<CCRx,输出为有效信号高电平 ;
  • 当CNT>CCRx,输出为有效信号低电平;

四、PWM输出配置步骤

PWM 的配置在库文件 time.c 中。

1. 使能定时器及端口时钟

下面是使能设置代码:

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);

2. 定时器的重映像

后面示例的 PWM 需要配置引脚的复用功能(重映像),定时器的重映像可在《STM32F10x参考手册》查询,摘录如下:

(1)定时器4复用功能重映像

在这里插入图片描述

(2)定时器3复用功能重映像

在这里插入图片描述

(3) 定时器2复用功能重映像

在这里插入图片描述

以使用 TIM3 的通道1为例,它默认是在PA6引脚上,它完全重映像是在PC6,后面使用的开发板上原理图示:
在这里插入图片描述
示例代码将使用PC6输出TIM3的通道1 PWM波。

代码示例:

// 设置 TIM3 完全重映像
GPIO_PinRemapConfig(GPIO_FullRemap_TIM3, ENABLE);

3. 输出端口复用

在输出PWM信号时,通常需要考虑信号的稳定性、噪声抑制以及输出电流的能力等因素。复用推挽输出是一种常见的配置方式。

// 复用推挽输出
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;  

4. 初始化定时器参数

包括 : 自动重载值、分频系数、计数方式等。

void TIM_TimeBaseInit(TIM_TypeDef*TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStructure)

5. 初始化PWM输出参数

包括 :PWM 模式、输出极性、使能等。

void TIM_OCxInit(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStructure);// 结构体定义 
typedef struct
{uint16_t TIM_OCMode;  		// 比较输出模式uint16_t TIM_OutputState;  	// 比较输出使能uint16_t TIME_OutputNState: // 比较互补输出使能uint32_t TIM_Pulse;        	// 脉冲宽度 0~65535/*** 输出极性*   * TIM_OCPolarity_High: 高电平有效*   * TIM_OCPolarity_Low: 低电平有效*/uint16_t TIM_OCPolarity;/*** 互补比较输出极性*   * TIM_OCNPolarity_High: 高电平有效*   * TIM_OCNPolarity_Low: 低电平有效*/	uint16_t TIM_OCNPolarity;/*** 空闲状态下比较输出状态*   * TIM_OCIdleState_Set: 置位*   * TIM_OCIdleState_Reset: 复位*/	uint16_t TIM_OCIdleState;/*** 空闲状态下比较输出状态*   * TIM_OCNIdleState_Set: 置位*   * TIM_OCNIdleState_Reset: 复位*/uint16_t TIM_OCNIdleState;
} TIM_OCInitTypeDef;

6. 开启定时器

// NewState: 新的状态,可以是 ENABLE 或 DISABLE。
void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState)   

7. 修改TIMx_CCRx的值控制占空比

void TIM_SetCompare1(TIM_TypeDef* TIMx, uint32_t Compare1);

8. 使能 TIMx 在 CCRx 上的预装载寄存器

// 参数 TIM_OCPreload 可为 TIM_OCPreload_Enable、TIM_OCPreload_Disable
void TIM_OCxPreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);

9. 使能 TIMx 在 ARR上的预装载寄存器允许位

// NewState: 新的状态,可以是 ENABLE 或 DISABLE。
void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState);

10. 设置 MOE位

对于高级定时器,需要设置MOE位。
MOE 位,全称 Master Output Enable,是定时器控制寄存器 1 (TIMx->CR1) 中的一个控制位(15位),用于使能或禁用定时器主输出。

  • MOE 位可以用于控制 PWM 输出的使能和禁用。
  • 可以使用 MOE 位来实现软启动和软停止功能。
  • 可以使用 MOE 位来实现故障保护功能。
void TIM_CtrlPWMOutputs(TIM_TypeDef* TIMx, FunctionalState NewState);

五、代码示例

本实验对TIM3控制,使用通道1, 对TIM3_CH1重映像到PC6引脚,控制PC6上接的LED亮度。
示例程序控制LED呼吸灯效果,渐渐变亮,再渐渐变暗。

1. pwm_utils.h

#ifndef __PWM_UTILS_H__
#define __PWM_UTILS_H__#include "stm32f10x.h"void tim3_ch1_pwm_init(u16 preriod, u16 prescaler);
void tim3_ch1_pwm_set_duty(u16 duty);
#endif

2. pwm_utils.c

#include "pwm_utils.h"
#include "led_utils.h"/*** @brief  定时器3初始化
*/
void tim3_ch1_pwm_init(u16 preriod, u16 prescaler){// 使能TIM3时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);// 使能LED所在端口的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);// 使能AFIORCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);GPIO_InitTypeDef GPIO_InitStructure; //定义GPIO初始化结构体GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置输出速度为50MHzGPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //设置为推挽输出模式GPIO_Init(LED_PORT, &GPIO_InitStructure); //初始化 LED_PORT// 管脚重映像GPIO_PinRemapConfig(GPIO_FullRemap_TIM3, ENABLE);// 定时器初始化TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_TimeBaseStructure.TIM_Period = preriod; //设置自动重装载寄存器周期值TIM_TimeBaseStructure.TIM_Prescaler = prescaler; //设置时钟预分频数TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分频因子TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;// 初始化TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);// PWM模式1TIM_OCInitTypeDef TIM_OCInitStructure;TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式1TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性:TIM输出比较极性高TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能TIM_OC1Init(TIM3, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM3 OC1// 使能TIM3的CCR1寄存器预装载TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);// 使能TIM3的ARR寄存器预装载TIM_ARRPreloadConfig(TIM3, ENABLE);// 使能TIM3TIM_Cmd(TIM3, ENABLE);
}
void tim3_ch1_pwm_set_duty(u16 duty){// 设置定时器3的PWM占空比TIM_SetCompare1(TIM3, duty);
}

3. main函数实现

#include "gpio_utils.h"
#include "stm32f10x.h"
#include "sys_tick_utils.h"
#include "led_utils.h"
#include "pwm_utils.h"// 主函数
int main(void)
{// led 初始化custom_led_init();// tick 初始化sys_tick_init(72);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// PWM 初始化,2Ktim3_ch1_pwm_init(500, 72-1);led_all_off();int i = 0;u8 direction=0;while (1) //无限循环{tim3_ch1_pwm_set_duty(i);if(direction==0){i++;}else{i--;}if(i>300){direction = 1;}else if(i<1){direction = 0;}delay_ms(10);}
}

实测PC6的波形是一直变化中:

在这里插入图片描述
本文代码开源地址:
https://gitee.com/xundh/stm32_arm_learn

相关文章:

STM32 学习10 PWM输出

STM32 学习10 PWM输出 一、PWM简介1. PWM的概念2. PWM的工作原理3. PWM 常用的应用场景 二、一些概念1. 频率2. 占空比 三、STM32F1 PWM介绍1. 定时器与寄存器&#xff08;1&#xff09;**自动重装载寄存器&#xff08;ARR&#xff09;**&#xff1a;&#xff08;2&#xff09;…...

SQL语言(数据库编程)

一.select查询 在数据库编程中,SQL(Structured Query Language,结构化查询语言)是一种用于管理关系数据库管理系统(RDBMS)的标准编程语言。其中,SELECT 是 SQL 中最常用的查询语句,用于从数据库表中检索数据。 下面是一个基本的 SELECT 查询的示例: SELECT column1…...

C#面向对象(OOPs)中的多态性

本文由 简悦 SimpRead 转码&#xff0c; 原文地址 mp.weixin.qq.com C#面向对象(OOPs)中的多态性 概述&#xff1a;在编程语言和类型理论中&#xff0c;多态性是为不同类型的实体提供单个接口&#xff0c;或者使用单个符号来表示多个不同的类型。多态对象是能够呈现多种形式的…...

(二十一)从零开始搭建k8s集群——kubernates核心组件及功能介绍

前言 Kubernetes是一个可移植、可扩展、开源的平台&#xff0c;用于管理容器化的工作负载和服务&#xff0c;它促进了声明性配置和自动化。Kubernetes容器可以持续开发、集成和部署&#xff1a;可靠且频繁地构建和部署容器镜像&#xff0c;快速有效地回滚&#xff1b;开发与运…...

[云原生] k8s之存储卷

一、emptyDir存储卷 当Pod被分配给节点时&#xff0c;首先创建emptyDir卷&#xff0c;并且只要该Pod在该节点上运行&#xff0c;该卷就会存在。正如卷的名字所述&#xff0c;它最初是空的。Pod 中的容器可以读取和写入emptyDir卷中的相同文件&#xff0c;尽管该卷可以挂载到每…...

【PCL】(二十七)基于法线差的点云分割

&#xff08;二十七&#xff09;基于法线差的点云分割 图片来源 提出这个方法的论文&#xff1a;Difference of Normals as a Multi-Scale Operator in Unorganized Point Clouds 算法流程&#xff1a; 在大尺度的范围内&#xff08;半径 r 1 r_1 r1​&#xff09;估计每个点…...

智慧公厕系统的组成部分有什么?

智慧公厕系统是现代城市管理中一项重要的创新&#xff0c;利用物联网、互联网、大数据、云计算、自动化控制等先进的技术手段&#xff0c;提供高效便捷的公厕服务。从信息系统的角度来看&#xff0c;智慧公厕系统主要由硬件、软件和网络组成&#xff0c;硬件、软件和网络三大部…...

[数据集][目标检测]芒果叶病害数据集VOC+YOLO格式4000张5类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;4000 标注数量(xml文件个数)&#xff1a;4000 标注数量(txt文件个数)&#xff1a;4000 标注…...

Linux: 预备

计算机结构基础 操作系统: 内核 (管理软硬件) shell(给用户使用操作系统的方式) 操作系统的目标 对硬件抽象 原因:操作系统是对软硬件资源管理的应用软件抽象:内存管理, 进程管理, 文件管理, 驱动管理软件:驱动程序(给软件提供访问硬件的软件)硬件:磁盘(对应文件), 网卡等隔离…...

ChatGPT 升级出现「我们未能验证您的支付方式/we are unable to authenticate」怎么办?

ChatGPT 升级出现「我们未能验证您的支付方式/we are unable to authenticate」怎么办&#xff1f; 在订阅 ChatGPT Plus 时&#xff0c;有时候会出现以下报错 &#xff1a; We are unable to authenticate your payment method. 我们未能验证您的支付方式。 出现 unable to a…...

JavaWeb - 3 - JavaScript(JS)

JavaScript(JS)官方参考文档&#xff1a;JavaScript 教程 JavaScript&#xff08;简称&#xff1a;JS&#xff09;是一门跨平台、面向对象的脚本语言&#xff0c;是用来控制网页行为的&#xff0c;它能使网页可交互&#xff08;脚本语言就不需要编译&#xff0c;直接通过浏览器…...

基于springboot+vue的美食烹饪互动平台

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…...

linux中操作服务器常用命令

在Linux中操作服务器时&#xff0c;常用的命令包括&#xff1a; ls&#xff1a;列出目录内容。 cd&#xff1a;切换目录。 pwd&#xff1a;显示当前所在的目录路径。 mkdir&#xff1a;创建一个新的目录。 rmdir&#xff1a;删除一个空的目录。 cp&#xff1a;复制文件或目录。…...

最简k8s部署(AWS Load Balancer Controller使用)

问题 我需要在k8s集群里面部署springboot服务&#xff0c;通过k8s ingress访问集群内部的springboot服务&#xff0c;应该怎么做&#xff1f; 这里假设已经准备好k8s集群&#xff0c;而且也准备好springboot服务的运行镜像了。这里我们将精力放在k8s服务编排上面。 一图胜千言…...

差距拉开了!量化大厂最新业绩排行曝光!

经历了一月份的失落和二月份绝地反攻&#xff0c;量化大厂们的整体业绩备受关注。 而今年2月份的量化战绩&#xff0c;甚为关键&#xff01; 毕竟市场指数“前低后高”&#xff0c;基金经理与投资人开年以来&#xff0c;共同经历了“惊心动魄”的考验。 量化大厂&#xff0c…...

【Web前端】Vue核心基础

文章目录 1. Vue简介2. Vue官网使用指南3. 初识Vue3.1 搭建Vue开发环境3.2 HelloWorld案例3.3 el与data的两种写法3.4 MVVM模型3.5 模板语法 4. 数据绑定4.1 v-bind单向数据绑定4.2 v-model双向数据绑定 5. 事件处理5.1 v-on绑定事件5.2 事件修饰符5.3 键盘事件 6. 计算属性6.1…...

Linux操作系统项目上传Github代码仓库指南

文章目录 1 创建SSH key2.本地git的用户名和邮箱设置3.测试连接4.创建仓库5.终端项目上传 1 创建SSH key 1.登录github官网,点击个人头像,点击Settings,然后点击SSH and GPG keys,再点击New SSH key。 Title 可以随便取&#xff0c;但是 key 需要通过终端生成。 Linux终端执行…...

机器学习--循环神经网路(RNN)2

在这篇文章中&#xff0c;我们介绍一下其他的RNN。 一.深层RNN 循环神经网络的架构是可以任意设计的&#xff0c;之前提到的 RNN 只有一个隐藏层&#xff0c;但 RNN 也可以是深层的。比如把 xt 丢进去之后&#xff0c;它可以通过一个隐藏层&#xff0c;再通过第二个隐藏层&am…...

sheng的学习笔记-AI-多分类学习:ECOC,softmax

目录&#xff1a;sheng的学习笔记-AI目录-CSDN博客 基本术语&#xff1a; 若我们欲预测的是离散值&#xff0c;例如“好瓜”“坏瓜”&#xff0c;此类学习任务称为“分类”(classification)&#xff1b; 若欲预测的是连续值&#xff0c;例如西瓜成熟度0.95、0.37&#xff0c;…...

ChatGPT Plus 支付出现「您的银行卡被拒绝/your card has been declined」怎么办?

ChatGPT Plus 支付出现「您的银行卡被拒绝/your card has been declined」怎么办&#xff1f; 在订阅 ChatGPT Plus 或者 OpenAI API 时&#xff0c;有时候会出现已下报错 &#xff1a; Your card has been declined. 您的银行卡被拒绝 出现这种错误&#xff0c;有以下几个解…...

Qwen3.5-9B-AWQ-4bit C语言项目代码审查与注释生成工具开发

Qwen3.5-9B-AWQ-4bit C语言项目代码审查与注释生成工具开发 1. 嵌入式开发的代码质量痛点 在嵌入式开发领域&#xff0c;C语言依然是无可争议的王者。但每个经历过大型嵌入式项目的人都知道&#xff0c;维护那些充满指针操作和内存管理的代码有多痛苦。想象一下这样的场景&am…...

对话式革新:OpenClaw全场景实战指南(含CloudBase开发全流程\+生态深度解析)

在AI原生工具爆发的2026年&#xff0c;鹅厂OpenClaw以“文本驱动、本地优先、事件编排”的核心优势&#xff0c;打破了传统AI助手“只建议、不执行”的局限&#xff0c;从单一工具升级为覆盖办公、创作、学习、研发等多场景的生态体系。它并非简单的对话机器人&#xff0c;而是…...

XVim2核心功能详解:从基础操作到高级文本对象

XVim2核心功能详解&#xff1a;从基础操作到高级文本对象 【免费下载链接】XVim2 Vim key-bindings for Xcode 9 项目地址: https://gitcode.com/gh_mirrors/xv/XVim2 XVim2是一款为Xcode 9打造的Vim键位绑定插件&#xff0c;它将Vim的高效编辑体验无缝融入Xcode开发环境…...

go语言学习(分支语句与循环语句)

判断语句if 标准if语句 输入年龄&#xff0c;程序根据年龄判断状态&#xff1a; 未出生&#xff1a;age < 0儿童&#xff1a;age < 18成年人&#xff1a;age < 30中年人&#xff1a;age < 50老年人&#xff1a;age > 50 package mainimport "fmt"func…...

学Simulink——基于Simulink的轴向磁通电机多物理场耦合仿真​

目录 手把手教你学Simulink——基于Simulink的轴向磁通电机多物理场耦合仿真​ 摘要​ 一、背景与挑战​ 1.1 为什么轴向磁通电机的仿真让人“头秃”?​ 1.2 核心痛点与设计目标​ 二、系统架构与核心控制推导​ 2.1 整体架构:跨越维度的“降阶打击”​ 2.2 核心数学推…...

告别卡顿!用C#多媒体定时器(MmTimer)实现1ms精度的实时数据采集

突破毫秒壁垒&#xff1a;C#多媒体定时器在工业级数据采集中的实战指南 工业自动化产线上&#xff0c;一台机械臂正在以0.1mm的精度进行精密焊接。突然&#xff0c;由于上位机数据采集的定时器出现5ms的延迟波动&#xff0c;导致焊接路径出现偏差&#xff0c;整批零件报废——这…...

ERP系统与医疗器械生产管理规范的契合点

ERP系统与医疗器械生产管理规范的契合点 医疗器械生产管理规范&#xff08;GMP&#xff09;对数据完整性、过程追溯性、质量管理体系有严格要求。ERP系统通过以下模块实现合规&#xff1a; 主数据管理 建立医疗器械唯一标识&#xff08;UDI&#xff09;数据库&#xff0c;确保产…...

天赐范式第16天:【硬核物理】哥本哈根学派沉默了:用纯经典混沌模拟出量子双缝干涉,量子力学统计特性可能是高维相空间混沌投影的观点(附源码)

摘要&#xff1a;不需要波函数&#xff0c;不需要概率云&#xff0c;甚至不需要“上帝掷骰子”。本文基于受驱摆高斯势垒的混沌系统&#xff0c;利用 RK45 高精度积分器&#xff0c;在 2000 个粒子的系综模拟中&#xff0c;成功复现了双缝干涉的统计包络特征&#xff0c;分布重…...

从网络到本地:根治Android/Flutter项目Gradle SSL连接重置的实战指南

1. 当Gradle遇上SSL连接重置&#xff1a;开发者的噩梦时刻 "又卡在Gradle下载了&#xff01;"这可能是Android和Flutter开发者最常发出的抱怨之一。想象一下这样的场景&#xff1a;你刚接手一个老项目&#xff0c;满心欢喜地点击运行按钮&#xff0c;结果控制台突然抛…...

Navicat数据库自动备份实战:如何设置夜间定时任务避免业务中断

Navicat数据库自动备份实战&#xff1a;如何设置夜间定时任务避免业务中断 深夜的办公室只剩下服务器指示灯在黑暗中闪烁&#xff0c;数据库管理员小李终于可以松一口气——公司的核心业务数据正在Navicat的自动备份任务中安全流转。对于现代企业而言&#xff0c;数据库就像数字…...