STM32采集FSR压力数据时,软硬件协同滤波该怎么做才既稳定又匹配Python上位机?

根据你的代码和上位机需求,我将提供**精准、对应、可直接使用的修改方案**,分为**下位机(STM32)优化**和**上位机(Python)处理**两部分。 ## 一、下位机代码优化(STM32端) ### 1. **ADC采样优化** - 增加硬件滤波和多次采样平均 修改 `ADC.C` 文件: ```c // ADC.C - 修改后的版本 #include "adc.h" #include "stm32f10x.h" #include "math.h" #define SAMPLE_TIMES 8 // 采样次数,用于平均滤波 void ADC1_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; ADC_InitTypeDef ADC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_ADC1, ENABLE); RCC_ADCCLKConfig(RCC_PCLK2_Div6); // PA1 通道1 (注意:ADC_Channel_1对应PA1) GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; GPIO_Init(GPIOA, &GPIO_InitStructure); // PA4 通道4 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; GPIO_Init(GPIOA, &GPIO_InitStructure); ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; ADC_InitStructure.ADC_ScanConvMode = DISABLE; ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel = 1; ADC_Init(ADC1, &ADC_InitStructure); ADC_Cmd(ADC1, ENABLE); ADC_ResetCalibration(ADC1); while(ADC_GetResetCalibrationStatus(ADC1)); ADC_StartCalibration(ADC1); while(ADC_GetCalibrationStatus(ADC1)); } // 改进的读取函数:多次采样 + 去极值平均法 static u16 ADC_ReadChannel(u8 channel) { u32 sum = 0; u16 samples[SAMPLE_TIMES]; u16 min, max; u8 i; // 采样SAMPLE_TIMES次 for(i = 0; i < SAMPLE_TIMES; i++) { ADC_RegularChannelConfig(ADC1, channel, 1, ADC_SampleTime_239Cycles5); ADC_SoftwareStartConvCmd(ADC1, ENABLE); while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)); samples[i] = ADC_GetConversionValue(ADC1); Delay_us(10); // 小延时避免连续采样干扰 } // 找最小最大值(去极值) min = samples[0]; max = samples[0]; for(i = 1; i < SAMPLE_TIMES; i++) { if(samples[i] < min) min = samples[i]; if(samples[i] > max) max = samples[i]; } // 去掉最小最大值后求平均 for(i = 0; i < SAMPLE_TIMES; i++) { if(samples[i] != min && samples[i] != max) { sum += samples[i]; } } return sum / (SAMPLE_TIMES - 2); } // 通道1:PA4 = ADC_Channel_4 u8 Get_FSR1_Pressure(void) { u16 adc = ADC_ReadChannel(ADC_Channel_4); // 限幅处理,防止异常值 if(adc > 4095) adc = 4095; return (adc * 100) / 4095; } // 通道2:PA1 = ADC_Channel_1 u8 Get_FSR2_Pressure(void) { u16 adc = ADC_ReadChannel(ADC_Channel_1); // 限幅处理,防止异常值 if(adc > 4095) adc = 4095; return (adc * 100) / 4095; } ``` ### 2. **MAIN.C 优化** - 增加数据发送频率控制 ```c // MAIN.C - 修改后的版本 #include "stm32f10x.h" #include "adc.h" #include "usart.h" #include "delay.h" // 数据缓冲区,用于平滑处理 #define BUFFER_SIZE 5 u8 fsr1_buffer[BUFFER_SIZE] = {0}; u8 fsr2_buffer[BUFFER_SIZE] = {0}; u8 buffer_index = 0; // 移动平均滤波函数 u8 Moving_Average(u8 buffer[], u8 new_value) { buffer[buffer_index] = new_value; buffer_index = (buffer_index + 1) % BUFFER_SIZE; u32 sum = 0; for(u8 i = 0; i < BUFFER_SIZE; i++) { sum += buffer[i]; } return sum / BUFFER_SIZE; } int main(void) { u8 fsr1_raw, fsr2_raw; u8 fsr1_smooth, fsr2_smooth; Delay_Init(); ADC1_Init(); USART1_Init(9600); // 初始化缓冲区 for(u8 i = 0; i < BUFFER_SIZE; i++) { fsr1_raw = Get_FSR1_Pressure(); fsr2_raw = Get_FSR2_Pressure(); fsr1_buffer[i] = fsr1_raw; fsr2_buffer[i] = fsr2_raw; Delay_ms(50); } while(1) { // 读取原始数据 fsr1_raw = Get_FSR1_Pressure(); fsr2_raw = Get_FSR2_Pressure(); // 移动平均滤波 fsr1_smooth = Moving_Average(fsr1_buffer, fsr1_raw); fsr2_smooth = Moving_Average(fsr2_buffer, fsr2_raw); // 发送平滑后的数据给上位机 Usart1_SendTwoNum(fsr1_smooth, fsr2_smooth); // 调整采样间隔(根据需求调整) Delay_ms(100); // 100ms采样间隔,10Hz采样率 } } ``` ## 二、上位机Python代码优化(关键!) ### 1. **改进的串口读取和数据处理类** ```python # serial_processor.py import serial import numpy as np from collections import deque from scipy.signal import savgol_filter import threading import time class SmoothPressureProcessor: def __init__(self, port='COM3', baudrate=9600, buffer_size=50): """ 初始化平滑压力处理器 :param port: 串口端口 :param baudrate: 波特率 :param buffer_size: 数据缓冲区大小 """ self.serial_port = None self.port = port self.baudrate = baudrate self.buffer_size = buffer_size # 数据缓冲区 self.ch1_raw_buffer = deque(maxlen=buffer_size) self.ch2_raw_buffer = deque(maxlen=buffer_size) self.ch1_smooth_buffer = deque(maxlen=buffer_size) self.ch2_smooth_buffer = deque(maxlen=buffer_size) # 时间戳 self.time_buffer = deque(maxlen=buffer_size) self.start_time = time.time() # 线程控制 self.running = False self.thread = None # 平滑参数 self.savgol_window = 15 # Savitzky-Golay窗口大小 self.savgol_order = 3 # 多项式阶数 # 异常值过滤阈值 self.max_jump = 30 # 相邻点最大允许跳变值 def connect(self): """连接串口""" try: self.serial_port = serial.Serial( port=self.port, baudrate=self.baudrate, timeout=0.1 # 缩短超时时间 ) print(f"已连接到 {self.port}") return True except Exception as e: print(f"连接失败: {e}") return False def disconnect(self): """断开连接""" self.stop() if self.serial_port and self.serial_port.is_open: self.serial_port.close() def _read_serial_data(self): """读取串口数据的内部方法""" if not self.serial_port or not self.serial_port.is_open: return None, None try: line = self.serial_port.readline().decode('ascii', errors='ignore').strip() if line: parts = line.split(',') if len(parts) == 2: ch1 = int(parts[0]) ch2 = int(parts[1]) # 有效性检查 if 0 <= ch1 <= 100 and 0 <= ch2 <= 100: return ch1, ch2 except: pass return None, None def _smooth_data(self, data_buffer): """使用Savitzky-Golay滤波器平滑数据""" if len(data_buffer) < self.savgol_window: # 数据不足时使用移动平均 return np.mean(list(data_buffer)) if data_buffer else 0 # 转换为数组并应用滤波 data_array = np.array(list(data_buffer)) # 使用Savitzky-Golay滤波 smoothed = savgol_filter( data_array, window_length=self.savgol_window, polyorder=self.savgol_order, mode='nearest' # 边界处理模式 ) return smoothed[-1] # 返回最新的平滑值 def _remove_outliers(self, new_val, last_val): """去除异常值""" if last_val is None: return new_val # 如果跳变过大,认为是异常值,返回上一个值 if abs(new_val - last_val) > self.max_jump: return last_val return new_val def start(self): """启动数据采集线程""" if self.running: return self.running = True self.thread = threading.Thread(target=self._update_loop) self.thread.daemon = True self.thread.start() def stop(self): """停止数据采集""" self.running = False if self.thread: self.thread.join(timeout=1) def _update_loop(self): """数据更新循环""" last_ch1 = None last_ch2 = None while self.running: # 读取数据 ch1_raw, ch2_raw = self._read_serial_data() if ch1_raw is not None and ch2_raw is not None: # 去除异常值 ch1_filtered = self._remove_outliers(ch1_raw, last_ch1) ch2_filtered = self._remove_outliers(ch2_raw, last_ch2) # 更新原始缓冲区 self.ch1_raw_buffer.append(ch1_filtered) self.ch2_raw_buffer.append(ch2_filtered) # 更新时间戳 current_time = time.time() - self.start_time self.time_buffer.append(current_time) # 平滑处理 if len(self.ch1_raw_buffer) >= 5: # 至少有5个点才开始平滑 ch1_smooth = self._smooth_data(self.ch1_raw_buffer) ch2_smooth = self._smooth_data(self.ch2_raw_buffer) self.ch1_smooth_buffer.append(ch1_smooth) self.ch2_smooth_buffer.append(ch2_smooth) last_ch1 = ch1_filtered last_ch2 = ch2_filtered time.sleep(0.01) # 10ms循环间隔 def get_latest_data(self): """获取最新数据""" if not self.ch1_smooth_buffer or not self.ch2_smooth_buffer: return 0, 0, 0, 0 # 返回原始值和平滑值 ch1_raw = self.ch1_raw_buffer[-1] if self.ch1_raw_buffer else 0 ch2_raw = self.ch2_raw_buffer[-1] if self.ch2_raw_buffer else 0 ch1_smooth = self.ch1_smooth_buffer[-1] if self.ch1_smooth_buffer else ch1_raw ch2_smooth = self.ch2_smooth_buffer[-1] if self.ch2_smooth_buffer else ch2_raw return ch1_raw, ch2_raw, ch1_smooth, ch2_smooth def get_all_data(self): """获取所有缓冲数据""" times = list(self.time_buffer) ch1_raw = list(self.ch1_raw_buffer) ch2_raw = list(self.ch2_raw_buffer) ch1_smooth = list(self.ch1_smooth_buffer) ch2_smooth = list(self.ch2_smooth_buffer) return times, ch1_raw, ch2_raw, ch1_smooth, ch2_smooth ``` ### 2. **改进的实时绘图代码** ```python # pressure_plotter.py import matplotlib.pyplot as plt import matplotlib.animation as animation from serial_processor import SmoothPressureProcessor import numpy as np class RealTimePressurePlotter: def __init__(self, port='COM3'): self.processor = SmoothPressureProcessor(port=port) self.fig, self.axes = plt.subplots(2, 2, figsize=(12, 8)) self.setup_plots() # 数据存储 self.max_points = 200 # 显示的最大点数 def setup_plots(self): """设置子图""" # 通道1原始vs平滑 self.ax1 = self.axes[0, 0] self.ax1.set_title('通道1 - 原始 vs 平滑') self.ax1.set_xlabel('时间 (s)') self.ax1.set_ylabel('压力值') self.ax1.set_ylim(0, 100) self.ax1.grid(True, alpha=0.3) self.line1_raw, = self.ax1.plot([], [], 'r-', alpha=0.5, linewidth=1, label='原始') self.line1_smooth, = self.ax1.plot([], [], 'b-', linewidth=2, label='平滑') self.ax1.legend() # 通道2原始vs平滑 self.ax2 = self.axes[0, 1] self.ax2.set_title('通道2 - 原始 vs 平滑') self.ax2.set_xlabel('时间 (s)') self.ax2.set_ylabel('压力值') self.ax2.set_ylim(0, 100) self.ax2.grid(True, alpha=0.3) self.line2_raw, = self.ax2.plot([], [], 'g-', alpha=0.5, linewidth=1, label='原始') self.line2_smooth, = self.ax2.plot([], [], 'm-', linewidth=2, label='平滑') self.ax2.legend() # 双通道对比(平滑后) self.ax3 = self.axes[1, 0] self.ax3.set_title('双通道对比(平滑)') self.ax3.set_xlabel('时间 (s)') self.ax3.set_ylabel('压力值') self.ax3.set_ylim(0, 100) self.ax3.grid(True, alpha=0.3) self.line3_ch1, = self.ax3.plot([], [], 'b-', linewidth=2, label='通道1') self.line3_ch2, = self.ax3.plot([], [], 'm-', linewidth=2, label='通道2') self.ax3.legend() # 数值显示 self.ax4 = self.axes[1, 1] self.ax4.axis('off') self.text_display = self.ax4.text(0.1, 0.5, '', fontsize=12, verticalalignment='center', bbox=dict(boxstyle='round', facecolor='wheat', alpha=0.5)) plt.tight_layout() def update_plot(self, frame): """更新绘图""" # 获取数据 times, ch1_raw, ch2_raw, ch1_smooth, ch2_smooth = self.processor.get_all_data() if len(times) > 0: # 只显示最近的数据 start_idx = max(0, len(times) - self.max_points) times_display = times[start_idx:] # 更新通道1 if len(ch1_raw) > 0: ch1_raw_display = ch1_raw[start_idx:] self.line1_raw.set_data(times_display, ch1_raw_display) if len(ch1_smooth) > 0: ch1_smooth_display = ch1_smooth[start_idx:] self

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

Python内容推荐

基于 DDPM 的光伏功率时序场景生成方法研究(Python代码实现)

基于 DDPM 的光伏功率时序场景生成方法研究(Python代码实现)

内容概要:本文系统研究了基于去噪概率扩散模型(DDPM)的光伏功率时序场景生成方法,提出了一种利用Python实现的高精度、强波动性光伏出力场景生成框架。文章深入解析了DDPM的核心机制,包括前向扩散过程与反向去噪过程的数学原理,并结合真实光伏功率数据进行模型训练与采样,有效捕捉了光照强度、气象条件等外部因素导致的功率波动特性。相较于传统的蒙特卡洛模拟和生成对抗网络(GAN)等方法,该方法在保持时间序列相关性、统计分布一致性和场景多样性方面表现出更强的能力,特别适用于高比例可再生能源接入背景下的电力系统规划、运行调度与风险评估。此外,文档还整合了大量相关科研资源,涵盖W-GAN、条件GAN、联邦学习、电动汽车承载力评估等多个前沿方向,构建了一个面向新能源场景生成与电力系统优化的综合性技术生态体系。; 适合人群:具备一定Python编程能力和机器学习理论基础,从事新能源发电预测、电力系统优化、智能算法应用等领域的研究生、科研人员及工程技术人员。; 使用场景及目标:①用于电力系统中光伏出力不确定性的精细化建模与多场景生成,支撑含高比例可再生能源的调度决策、规划分析与风险评估;②为学术研究提供可复现、易扩展的DDPM模型代码框架,推动扩散模型在能源领域时间序列生成任务中的落地与创新;③结合文中提供的Matlab/Python开源资源,拓展至风电功率预测、负荷场景生成、电动汽车接入优化等交叉研究方向,促进多学科融合创新。; 阅读建议:建议读者结合文档中提供的完整代码资源(可通过公众号“荔枝科研社”获取)进行动手实践,优先透彻理解DDPM的算法流程与关键模块设计后再迁移至具体应用场景。同时可参考文中列出的相关论文复现项目,逐步构建完整的科研知识体系和技术积累路径。

复现电表数据隐私保护下的联邦学习行业电力负荷预测框架(Python代码实现)

复现电表数据隐私保护下的联邦学习行业电力负荷预测框架(Python代码实现)

内容概要:本文提出了一种面向电表数据隐私保护的联邦学习行业电力负荷预测框架,通过Python代码实现,解决了多参与方在数据孤岛和隐私受限条件下难以协同建模的问题。该框架基于联邦学习机制,允许多个电力用户或企业在不共享原始用电数据的前提下,共同训练高性能的负荷预测模型。文中详细介绍了系统架构设计、本地模型训练流程、全局参数聚合策略以及差分隐私等隐私保护技术的融合方法,有效保障了数据安全性,同时提升了行业级负荷预测的准确性与泛化能力,适用于电力公司、工业园区等多方协作的分布式预测场景。; 适合人群:具备一定Python编程基础和机器学习知识,从事电力系统分析、能源管理、智能电网或数据隐私保护相关研究的研发人员及高校研究生。; 使用场景及目标:①应用于跨企业、跨区域的电力负荷协同预测任务;②解决传统集中式预测因数据隐私问题导致的模型训练障碍;③推动联邦学习在能源领域的实际落地,实现安全、高效、合规的行业智能化升级。; 阅读建议:读者应结合提供的Python代码进行动手实践,重点理解联邦学习的通信机制、本地模型更新方式与全局聚合逻辑,并可通过构建多客户端仿真环境来验证框架的收敛性、预测性能及隐私保护效果。

复现基于改进扩散模型的高海拔地区新能源高波动出力场景生成方法(Python代码实现)

复现基于改进扩散模型的高海拔地区新能源高波动出力场景生成方法(Python代码实现)

内容概要:本文提出一种基于改进扩散模型的高海拔地区新能源高波动出力场景生成方法,针对高海拔地区光伏、风电等新能源出力存在的强不确定性与剧烈波动性问题,通过改进扩散模型结构并引入适应性训练策略,有效捕捉新能源出力的时间序列特征与极端波动行为,生成高保真、统计一致性良好的出力场景。该方法为电力系统在高比例新能源接入背景下的规划、调度、风险评估及储能配置提供了高质量的数据支撑,并配套提供了完整的Python代码实现,便于科研人员复现与二次开发。; 适合人群:具备一定Python编程能力和机器学习基础知识,从事新能源发电预测、电力系统运行优化、随机规划、场景生成等方向研究的研究生、科研人员及工程师。; 使用场景及目标:①解决高海拔地区新能源出力波动剧烈、传统模型难以精确建模的问题;②生成满足统计特性要求的多维新能源出力场景,用于随机优化、鲁棒调度、容量配置等电力系统分析;③深入理解扩散模型在时间序列生成任务中的改进思路与技术实现路径,推动其在能源系统中的应用创新。; 阅读建议:建议读者结合所提供的Python代码进行动手实践,重点理解扩散过程设计、噪声预测网络架构、损失函数构造及采样策略等核心模块,同时可对比W-GAN、DDPM等主流生成模型,评估该方法在生成质量与稳定性方面的优势与局限。

【分布式联邦学习】居民电力负荷预测+隐私保护研究(Python代码实现)

【分布式联邦学习】居民电力负荷预测+隐私保护研究(Python代码实现)

内容概要:本文围绕基于分布式联邦学习的居民电力负荷预测与隐私保护展开研究,提出了一种在保障用户数据隐私前提下实现高效负荷预测的技术框架。研究采用联邦学习机制,使多个参与方能够在不共享原始用电数据的情况下协同训练预测模型,有效规避了传统集中式建模带来的隐私泄露风险。技术实现上融合了LSTM、GAN等深度学习模型,用于捕捉居民用电行为的时间序列特征,并引入Wasserstein生成对抗网络(W-GAN)和去噪扩散模型(DDPM)增强对新能源出力不确定性及复杂用电场景的建模能力。整体方案兼具算法创新性与工程可行性,适用于新型电力系统背景下智能电网的数据安全与智能决策需求。; 适合人群:具备一定Python编程基础和机器学习知识,从事电力系统、能源互联网、人工智能相关研究的科研人员及研究生。; 使用场景及目标:①实现居民侧电力负荷的高精度预测;②在保障用户用电数据隐私安全的基础上开展跨区域模型协作训练;③探索联邦学习与生成模型在电力场景生成与不确定性建模中的融合应用。; 阅读建议:建议读者结合提供的代码资源进行实践操作,重点关注联邦学习架构的设计细节与模型通信机制,并可进一步扩展至光伏、风电等新能源场景的联合预测研究。

GCC安装包(windows版)

GCC安装包(windows版)

源码直接下载地址: https://pan.quark.cn/s/a4b39357ea24 在Windows系统环境中部署的GCC安装软件,内含用户所需的所有库文件。

基于深度学习的三相电压源逆变器开路故障诊断框架,利用α β电流轨迹成像和ResNet-50  视觉变压器模型。.zip

基于深度学习的三相电压源逆变器开路故障诊断框架,利用α β电流轨迹成像和ResNet-50 视觉变压器模型。.zip

1.版本:matlab2014a/2019b/2024b 2.附赠案例数据可直接运行。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

易语言源码易语言网页颜色计算器源码

易语言源码易语言网页颜色计算器源码

易语言源码易语言网页颜色计算器源码

在VSCode中构建Vue项目

在VSCode中构建Vue项目

源码链接: https://pan.quark.cn/s/6d0bd8ec7575 在vscode上搭建一个vue项目—初学总结。 1.假设Vscode、nodejs等已经安装好了。 2.全局安装vue-cli,vue-cli可以帮助我们快速构建Vue项目。 安装命令: npm install -g vue-cli 打开VScode的终端,调出命令输入框。 点击终端-新建终端,输入上述命令,回车,等待安装完成。 3.安装webpack,它是打包js的工具 安装命令: npm install -g webpack 安装方法同上。 4.安装完成之后就可以开始创建vue项目,首先创建一个文件夹用来存放你的项目,用vscode打开对应的文件夹,并在终端cd到对应的文件夹。 比如我

道路安全锥交通锥检测数据集7091张VOC+YOLO格式

道路安全锥交通锥检测数据集7091张VOC+YOLO格式

道路安全锥交通锥检测数据集7091张VOC+YOLO格式 数据集格式:Pascal VOC格式+YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):7091 标注数量(xml文件个数):7091 标注数量(txt文件个数):7091 标注类别数:8 所在github仓库:datasets_sl 标注类别名称(注意yolo格式类别顺序不和这个对应,而以labels文件夹classes.txt为准):["blue","blue_cone","large_orange_cone","orange","orange_cone","unknown_cone","yellow","yellow_cone"] 每个类别标注的框数: blue 框数 = 596 blue_cone 框数 = 51558 large_orange_cone 框数 = 4593 orange 框数 = 1909 orange_cone 框数 = 12482 unknown_cone 框数 = 4222 yellow 框数 = 1356 yellow_cone 框数 = 52735 总框数:129451 每个类别占有图片数: blue 占有图片数 = 356 blue_cone 占有图片数 = 5546 large_orange_cone 占有图片数 = 1850 orange 占有图片数 = 500 orange_cone 占有图片数 = 2504 unknown_cone 占有图片数 = 440 yellow 占有图片数 = 502 yellow_cone 占有图片数 = 5386 图片分辨率:640x640 使用标注工具:labelImg 数据集是否增强:否 标注规则:对类别进行画矩形框 重要说明:数据集没有划分

永磁同步电机FOC闭环控制详解.docx

永磁同步电机FOC闭环控制详解.docx

源码下载地址: https://pan.quark.cn/s/a4b39357ea24 FOC 环节控制全面说明 FOC(磁场定向控制)闭环控制属于永磁同步电机(PMSM)的一种控制策略,其核心在于通过对电机电流实施调控,进而达成对电机输出转矩(电流表现)、运行速度及具体位置的有效管理。FOC 控制策略的构成要素涵盖了电流的采集过程、坐标体系转换(包括Clark变换、Park变换及反Park变换)以及SVPWM调制等关键环节。FOC控制策略的基本理念是通过精细调控电机电流,从而实现对电机输出转矩(电流形态)、运行速度与具体位置的有效掌控。一般情况下,电流环节被设定为最内层闭环,速度环节处于中间层级,而位置环节则构成最外层闭环。在FOC控制过程中,必须对电机电流进行实时监测,并将其转化为dq轴电流值,随后运用PI控制器对电流进行修正,以此达成对电机转矩的精确调控。在FOC控制框架内,电机速度的调控同样至关重要,此目标可通过在电流环基础上增设一个速度环来实现。速度环的输出结果将作为电流环的输入信号,从而促成速度与电流的双重闭环控制机制。进一步地,对于位置控制功能,需要在速度电流环的外围构建一个位置环,借此实现涵盖位置、速度及电流的三重闭环控制体系。在位置控制的应用场景中,必须采集电机的实时位置信息,并将其与预设的位置目标值进行对比,进而计算出两者之间的偏差量,随后通过PID控制器对这一偏差进行修正,最终实现位置控制的精确性。在工业实践领域,FOC控制策略被广泛部署于永磁同步电机的操控系统中,诸如电机驱动系统、伺服系统等场合。FOC控制策略的优势在于能够实现高精度的电机操控,然而,其应用也伴随着若干局限性,例如对磁编码器的依赖性较高、系统可能存在延迟现象等。在系统学习...

分辨率VESA标准文件-下载即用.zip

分辨率VESA标准文件-下载即用.zip

源码链接: https://pan.quark.cn/s/f029b7e90b9e 显示设备接口符合 VESA 协议规范

GPS NMEA-0183解析代码

GPS NMEA-0183解析代码

代码下载地址: https://pan.quark.cn/s/ad4cbdefb9a8 NMEA-0183协议中包含了数量庞大的语句定义,然而在实际应用中,频繁使用或具备最佳兼容性的语句仅限于$GPGGA、$GPGSA、$GPGSV、$GPRMC、$GPVTG以及$GPGLL这几类。本代码致力于提供相应的数据解析方案,关于各语句格式的详细说明,可参考链接https://blog.csdn.net/u012572552/article/details/84587926获取。

多接地配电系统的基于PMU的系统状态估计(Matlab代码实现)

多接地配电系统的基于PMU的系统状态估计(Matlab代码实现)

内容概要:本文系统阐述了多接地配电系统中基于相量测量单元(PMU)的状态估计方法,并配套提供了完整的Matlab代码实现。该方法充分利用PMU提供的高精度、时间同步的电压电流相量数据,构建精确的数学模型,结合优化估计算法,实现对配电系统关键状态变量(如节点电压、支路电流等)的高精度、实时估计。研究特别关注多接地系统中不同接地方式(如中性点不接地、经小电阻接地、经消弧线圈接地等)对系统电气特性和状态估计精度的影响,通过精细化的建模有效提升了算法在复杂实际场景下的鲁棒性与准确性。此项技术显著增强了新型电力系统,尤其是在高比例分布式电源接入背景下配电网的可观测性,为实现精准的故障诊断、快速恢复控制和系统安全稳定运行提供了核心技术支撑; 适合人群:具备电力系统分析、状态估计理论基础和Matlab编程能力的研究生、高校科研人员及电力系统自动化、智能配电网领域的工程技术人员; 使用场景及目标:①应用于高等院校和科研院所,进行配电系统状态估计、PMU应用、智能电网监控等方向的学术研究与仿真验证;②服务于电力公司或自动化设备厂商,用于开发高级配电管理系统(ADMS)中的核心状态估计模块,提升配电网的实时监控与智能化管理水平; 阅读建议:读者应在掌握电力系统状态估计基本原理的前提下,结合所提供的Matlab代码深入剖析算法的具体实现流程,建议通过调整网络拓扑结构、修改系统参数或模拟不同接地故障场景等方式,动手实践以充分验证和理解该方法的有效性、适应性及局限性。

Linux命令su、sudo、sudo su、sudo -i说明与区别.doc

Linux命令su、sudo、sudo su、sudo -i说明与区别.doc

已经博主授权,源码转载自 https://pan.quark.cn/s/09a989c9d455 sudo 与 su 这两个命令之间存在着显著的不同点:在使用 sudo 命令时,需要提供当前登录用户的密码进行验证,而 su 命令则要求输入 root 用户的密码。此外,它们在默认操作行为上也有区别。具体来说,sudo 命令仅允许以提升的权限执行单个命令,而 su 命令会启动一个新的 shell 会话,并且允许以 root 权限执行多个命令,直到明确退出该会话。在 Linux 操作系统中,熟练掌握 su、sudo 以及它们的不同变体,如 sudo su 和 sudo -i,具有非常重要的意义。这些命令主要用于权限管理,特别是在需要以管理员(root)身份执行任务时。接下来将详细阐述这些命令的具体用法及其之间的差异。 1. **su(Switch User)**: su 命令的功能在于从一个用户切换到另一个用户,通常用于切换到 root 用户以获取更高的权限。当使用 su 命令时,系统会请求输入目标用户的密码。例如,执行 `su root` 将会切换至 root 用户。然而,需要注意 su 命令在默认情况下不会改变环境变量,会保持原用户的设置。如果希望完全模拟新用户的环境,应当使用 `su -` 或 `su -l`,这两种方式会加载目标用户的 Shell 配置文件并将工作目录切换至该用户的家目录。 2. **sudo(Super User DO)**: 相比之下,sudo 命令允许用户以其他用户(通常为 root)的身份执行单个命令,而无需知晓该用户的密码。用户需要提供的密码是其自己的密码,因为 sudo 的权限控制是基于用户配置的。在大多数系统中,sudo 执行的命令会设有时...

AI生图系统 PHP 源码 开源 AI 绘画平台 支持文生图图生图

AI生图系统 PHP 源码 开源 AI 绘画平台 支持文生图图生图

一、功能概览 前台用户端功能 用户账号体系 支持邮箱验证码注册、账号登录与退出登录,保障用户身份安全。 AI 绘图能力 文生图:输入提示词即可一键生成图片,支持 1:1、16:9、9:16、4:3、3:4 多种常用尺寸 图生图:可上传或粘贴参考图片,基于原图做 AI 二次编辑优化 任务调度管理 实时展示任务排队状态、处理进度,任务异常自动重试,避免绘图失败丢失任务。 个人作品画廊 统一存储所有生成作品,支持分类筛选(全部、成功、失败、处理中、排队中)、关键词搜索;支持批量选中、批量重新生成失败作品。 站点实时数据看板 首页可视化展示当前在线人数、排队任务数量、平均生图速度、全站总消耗额度。 系统公告模块 后台可发布多类型公告,以顶部横幅形式在前台首页展示。 积分等级体系 AI 创作消耗积分,完成作品发布可赚取积分,分享作品可获得积分额外奖励,积分累计提升用户等级。 后台管理端功能 数据仪表盘 直观统计今日注册用户数、今日绘图任务量、任务成功率、API 调用错误次数等核心运营数据。 用户管理 可查看全站用户列表,支持账号启用 / 禁用、手动调整用户积分额度、重置用户登录密码。 任务管理 查看全站所有绘图任务,支持对批量失败任务一键重新执行。 画廊内容审核 管理员可审核用户公开作品,设置作品展示或隐藏状态,规避违规内容风险。 公告管理 支持新增、编辑、删除公告,提供普通提示、成功、警告、错误四种公告展示样式。 API 接口配置 可配置 API 中转站地址、密钥、选用模型、请求超时时间、接口最大并发数量。 邮箱配置 基于 SMTP 协议配置发件邮箱,支持 QQ、163、Gmail 等主流邮箱,内置发信测试功能。 系统全局设置 自定义站点名称、新用户初始积分额度、图片本地留存天数、站点注册功能开关。

在HTML中使用自定义字体

在HTML中使用自定义字体

代码下载地址: https://pan.quark.cn/s/5a0279133f80 ### 在HTML中应用非标准字体的方法 在网页设计实践中,采用非标准字体能够使网站展现独特的风格,进而改善用户的浏览感受。本文将系统阐述如何在HTML文档中实现非标准字体的应用,并辅以示例代码进行演示。 #### 一、认识@font-face指令 要在HTML页面中嵌入非标准字体,必须首先掌握CSS中的`@font-face`指令。该指令能够让开发者明确指定一种特定的字体文件,并指导浏览器如何处理这种字体。`@font-face`指令的基本书写格式如下: ```css @font-face { font-family: fontFamilyName; /* 字体家族的名称 */ src: /* 指明字体文件存放的路径 */; } ``` #### 二、整合多种格式的字体文件 当前的网络浏览器支持多种字体类型,为了保障所有浏览器都能正常显示字体,通常需要准备多种不同格式的字体文件,如EOT、WOFF、TTF和SVG等。下面是一个完整的`@font-face`指令范例: ```css @font-face { font-family: fontFamilyNameRegular; src: url(fontFamilyName.eot); /* IE9的兼容模式 */ src: local(fontFamilyNameRegular), /* 浏览器首先尝试在本地系统查找字体 */ local(fontFamilyName), url(fontFamilyName.woff) format(woff), /* 现代浏览器使用格式 */ url(fontFamilyName.tt...

bootstrap-select下拉框demo(含多种样式)

bootstrap-select下拉框demo(含多种样式)

源码链接: https://pan.quark.cn/s/c875fcc71b46 bootstrap-select The jQuery plugin that brings select elements into the 21st century with intuitive multiselection, searching, and much more. Now with Bootstrap 5 support. Demo You can view a live demo and some examples of how to use the various options here. Quick start Bootstrap-select requires jQuery v1.9.1+, Bootstrap’s dropdown.js component, and Bootstrap's CSS. If you're not already using Bootstrap in your project, a precompiled version of the Bootstrap v3.4.1 minimum requirements can be downloaded here. If using bootstrap-select with Bootstrap v4+, you'll also need Popper.js. For all of Bootstrap v4's requirements, see Getting started. A precompiled version of the requirements will be...

【静态约束法】配电网电动汽车接入容量评估研究(Matlab代码实现)

【静态约束法】配电网电动汽车接入容量评估研究(Matlab代码实现)

内容概要:本文围绕“静态约束法”在配电网电动汽车接入容量评估中的应用展开研究,通过Matlab代码实现相关建模与仿真,旨在评估配电网对电动汽车的承载能力。研究综合考虑电力系统运行的多项静态约束条件,如节点电压偏差、线路热稳定极限、变压器负载率等,构建科学合理的优化评估模型,系统分析电动汽车规模化接入对配电网电能质量与设备负载的影响,进而定量确定配电网的最大安全接入容量。文中提供了完整的Matlab代码实现流程,涵盖数据输入、模型构建、约束处理与结果可视化,具有较强的可复现性和工程参考价值。; 适合人群:电气工程、电力系统及其自动化等相关专业的研究生、科研人员及从事配电网规划、运行与管理的工程技术人员。; 使用场景及目标:①用于高校和科研机构开展电动汽车与电网互动(V2G)、新型负荷接入影响评估等相关课题的研究;②为电网公司或能源管理部门评估特定区域配电网接纳电动汽车充电负荷的能力提供技术支撑和决策依据;③作为学习和掌握基于Matlab进行电力系统稳态分析、优化建模与仿真编程的优质教学案例。; 阅读建议:建议读者结合文中提供的Matlab代码逐行研读,深入理解静态约束条件的物理意义及其数学建模方法,重点掌握潮流计算与约束校验的实现逻辑,并可通过调整电动汽车接入位置、渗透率及充电功率等参数进行多场景仿真,以全面把握配电网承载力评估的关键技术要点。

SIMATIC-NET-PC-Software-V15-SP1.iso.txt

SIMATIC-NET-PC-Software-V15-SP1.iso.txt

打开链接下载源码: https://pan.quark.cn/s/f57729299250 请访问指定网址获取SIMATIC NET V15 SP1版本的下载资源。完成注册后方可进行文件获取。务必先查阅产品文档中关于安装的注意事项。ISO镜像文件可在本处获取。注册是必要的条件,文件名为SIMATIC_NET_PC_Software_V15_SP1.iso,体积为1.2 GB。自解压存档亦可在本处下载。注册是必要的条件,文件名为SIMATIC_NET_PC_Software_V15_SP1.exe,体积为980.0 MB。

java + Scrimish卡牌游戏

java + Scrimish卡牌游戏

使用Eclipse开发的一个Scrimish游戏,实现了玩家和电脑的对弈功能。 程序代码内有备注,有文档说明,程序通过测试运行成功。

最新推荐最新推荐

recommend-type

python批量截取视频某一帧图片可控制图片大小

用python tkinter开发的一个可以批量截取MP4视频的小工具,有界面可以直接操作(需要python环境)
recommend-type

Python视频编辑库MoviePy的使用

主要介绍了Python视频编辑库MoviePy的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
recommend-type

moviepy:使用Python进行视频编辑

moviepy:使用Python进行视频编辑
recommend-type

python+ffmpeg批量去视频开头的方法

今天小编就为大家分享一篇python+ffmpeg批量去视频开头的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
recommend-type

python进行视频字幕视频和合成

利用讯飞的语音转写api进行转写、movieby模块进行音频截取,FFMPEG进行合并。需要申请讯飞的api,免费有5个小时
recommend-type

学生成绩管理系统C++课程设计与实践

资源摘要信息:"学生成绩信息管理系统-C++(1).doc" 1. 系统需求分析与设计 在进行学生成绩信息管理系统开发前,首先需要进行系统需求分析,这是确定系统开发目标与范围的过程。需求分析应包括数据需求和功能需求两个方面。 - 数据需求分析: - 学生成绩信息:需要收集学生的姓名、学号、课程成绩等数据。 - 数据类型和长度:明确每个数据项的数据类型(如字符串、整型等)和长度,例如学号可能是字符串类型且长度为一定值。 - 描述:详细描述每个数据项的意义,以确保系统能够准确处理。 - 功能需求分析: - 列出功能列表:用户界面应提供清晰的操作指引,列出所有可用功能。 - 查询学生成绩:系统应能通过学号或姓名查询学生的成绩信息。 - 增加学生成绩信息:允许用户添加未保存的学生成绩信息。 - 删除学生成绩信息:能够通过学号或姓名删除已经保存的成绩信息。 - 修改学生成绩信息:通过学号或姓名修改已有的成绩记录。 - 退出程序:提供安全退出程序的选项,并确保所有修改都已保存。 2. 系统设计 系统设计阶段主要完成内存数据结构设计、数据文件设计、代码设计、输入输出设计、用户界面设计和处理过程设计。 - 内存数据结构设计: - 使用链表结构组织内存中的数据,便于动态增删查改操作。 - 数据文件设计: - 选择文本文件存储数据,便于查看和编辑。 - 代码设计: - 根据功能需求,编写相应的函数和模块。 - 输入输出设计: - 设计简洁明了的输入输出提示信息和操作流程。 - 用户界面设计: - 用户界面应为字符界面,方便在命令行环境下使用。 - 处理过程设计: - 设计数据处理流程,确保每个操作都有明确的处理逻辑。 3. 系统实现与测试 实现阶段需要根据设计阶段的成果编写程序代码,并进行系统测试。 - 程序编写: - 完成系统设计中所有功能的程序代码编写。 - 系统测试: - 设计测试用例,通过测试用例上机测试系统。 - 记录测试方法和测试结果,确保系统稳定可靠。 4. 设计报告撰写 最后,根据系统开发的各个阶段,撰写详细的设计报告。 - 系统描述:包括问题说明、数据需求和功能需求。 - 系统设计:详细记录内存数据结构设计、数据文件设计、代码设计、输入/输出设计、用户界面设计、处理过程设计。 - 系统测试:包括测试用例描述、测试方法和测试结果。 - 设计特点、不足、收获和体会:反思整个开发过程,总结经验和教训。 时间安排: - 第19周(7月12日至7月16日)完成项目。 - 7月9日8:00到计算机学院实验中心(三楼)提交程序和课程设计报告。 指导教师和系主任(或责任教师)需要在文档上签名确认。 系统需求分析: - 使用表格记录系统需求分析的结果,包括数据项、数据类型、数据长度和描述。 - 分析数据项如学生成绩信息、状态器、链表节点等,确定其属性和行为。 以上就是文档中提到的学生成绩信息管理系统开发的关键知识点。开发此类系统需要熟练掌握C++编程基础,了解面向对象的程序设计思想,以及熟悉文件操作和链表等数据结构的应用。此外,良好的软件开发流程意识、测试意识和文档撰写能力也是必不可少的。
recommend-type

别再手动拖拽了!用Lumerical脚本批量创建FDTD仿真结构(附完整代码)

# 告别低效建模:Lumerical脚本自动化实战指南 在光子学仿真领域,时间就是科研生命线。当同行还在GUI界面里反复点击菜单时,你已经用脚本批量生成了20组参数化结构——这不是未来场景,而是每位FDTD用户都应该掌握的基础生产力革命。本文将彻底改变你与Lumerical的交互方式,从手动拖拽的农耕时代,跃迁到自动化建模的工业文明。 ## 1. 为何脚本建模是必然选择 2019年Nature Photonics的一项研究显示,科研工作者在仿真工具上平均浪费37%的时间在重复性操作上。对于需要参数扫描的纳米光学结构设计,这个数字可能更高。手动创建10个不同尺寸的纳米柱阵列意味着: -
recommend-type

Java邮件解析任务中,如何安全高效地提取HTML邮件内容并避免硬编码、资源泄漏和类型转换异常?

<think>我们被要求优化一段Java代码,该代码用于处理邮件(特别是来自特定发件人的构建通知邮件)。代码的主要问题包括: 1. 重复获取邮件内容:在检查MIME类型后,多次调用`msg[i].getContent()`,这可能导致性能问题或流关闭异常。 2. 类型转换问题:直接将邮件内容转换为`Multipart`而不进行类型检查,可能引发`ClassCastException`。 3. 代码结构问题:逻辑嵌套过深,可读性差,且存在重复代码(如插入邮件详情的操作在两个地方都有)。 4. 硬编码和魔法值:例如在解析HTML表格时使用了硬编码的索引(如list3.get(10)),这容易因邮件
recommend-type

RH公司应收账款管理优化策略研究

资源摘要信息:"本文针对RH公司的应收账款管理问题进行了深入研究,并提出了改进策略。文章首先分析了应收账款在企业管理中的重要性,指出其对于提高企业竞争力、扩大销售和充分利用生产能力的作用。然后,以RH公司为例,探讨了公司应收账款管理的现状,并识别出合同管理、客户信用调查等方面的不足。在此基础上,文章提出了一系列改善措施,包括完善信用政策、改进业务流程、加强信用调查和提高账款回收力度。特别强调了建立专门的应收账款回收部门和流程的重要性,并建议在实际应用过程中进行持续优化。同时,文章也意识到企业面临复杂多变的内外部环境,因此提出的策略需要根据具体情况调整和优化。 针对财务管理领域的专业学生和从业者,本文提供了一个关于应收账款管理问题的案例研究,具有实际指导意义。文章还探讨了信用管理和征信体系在应收账款管理中的作用,强调了它们对于提升企业信用风险控制和市场竞争能力的重要性。通过对比国内外企业在应收账款管理上的差异,文章总结了适合中国企业实际环境的应收账款管理方法和策略。" 根据提供的文件内容,以下是详细的知识点: 1. 应收账款管理的重要性:应收账款作为企业的一项重要资产,其有效管理关系到企业的现金流、财务健康以及市场竞争力。不良的应收账款管理会导致资金链断裂、坏账损失增加等问题,严重影响企业的正常运营和长远发展。 2. 应收账款的信用风险:在信用交易日益频繁的商业环境中,企业必须对客户信用进行评估,以便采取合理的信用政策,降低信用风险。 3. 合同管理的薄弱环节:合同是应收账款管理的法律基础,严格的合同管理能够保障企业权益,减少因合同问题导致的应收账款风险。 4. 客户信用调查:了解客户的信用状况对于预测和控制应收账款风险至关重要。企业需要建立有效的客户信用调查机制,识别和筛选信用良好的客户。 5. 应收账款回收策略:企业应建立有效的账款回收机制,包括定期的账款跟进、逾期账款的催收等。同时,建立专门的应收账款回收部门可以提升回收效率。 6. 应收账款管理流程优化:通过改进企业内部管理流程,如简化审批流程、提高工作效率等措施,能够提升应收账款的管理效率。 7. 应收账款管理策略的调整和优化:由于企业的内外部环境复杂多变,因此制定的管理策略需要根据实际情况进行动态调整和持续优化。 8. 信用管理和征信体系的作用:建立和完善企业内部信用管理体系和征信体系,有助于企业更好地控制信用风险,并在市场竞争中占据有利地位。 9. 对比国内外应收账款管理实践:通过研究国内外企业在应收账款管理上的不同做法和经验,可以借鉴先进的管理理念和方法,提升国内企业的应收账款管理水平。 综上所述,本文深入探讨了应收账款管理的多个方面,为RH公司乃至其他同类型企业提供了应收账款管理的改进方向和策略,对于财务管理专业的教育和实践都具有重要的参考价值。
recommend-type

新手别慌!用BingPi-M2开发板带你5分钟搞懂Tina Linux SDK目录结构

# 新手别慌!用BingPi-M2开发板带你5分钟搞懂Tina Linux SDK目录结构 第一次拿到BingPi-M2开发板时,面对Tina Linux SDK里密密麻麻的文件夹,我完全不知道从哪下手。就像走进一个陌生的大仓库,每个货架上都堆满了工具和零件,却找不到操作手册。这种困惑持续了整整两天,直到我意识到——理解目录结构比死记硬背每个文件更重要。 ## 1. 为什么SDK目录结构如此重要 想象你正在组装一台复杂的模型飞机。如果所有零件都混在一个箱子里,你需要花大量时间寻找每个螺丝和面板。但如果有分门别类的隔层,标注着"机身部件"、"电子设备"、"紧固件",组装效率会成倍提升。Ti