【毕业设计】9-基于STM32无刷直流电机控制器的设计仿真与实现(原理图+源码+仿真工程+论文+PPT+参考英文文献)

news2025/4/9 9:29:28

毕业设计】基于STM32无刷直流电机控制器的设计仿真与实现(原理图+源码+仿真工程+论文+PPT+参考英文文献)

文章目录

  • 毕业设计】基于STM32无刷直流电机控制器的设计仿真与实现(原理图+源码+仿真工程+论文+PPT+参考英文文献)
    • 任务书
    • 设计说明书
      • 摘要
      • 设计框架架构
      • 设计说明书及设计文件
      • 源码展示

任务书

1.基于单片机实现无刷直流电机控制器的设计,完成系统芯片选型;
2.确定无刷直流电机控制器的总体设计方案;
3.给出系统的硬件设计,包括主控模块、位置检测模块、PWM驱动模块、换向逻辑模块、逆变模块、速度反馈模块等硬件模块的电路设计;
4.给出系统的软件设计,并绘制主要模块的流程图;
5.基于Proteus对系统进行仿真。
资料链接
原理图工程文件
原理图截图
仿真模型工程文件
仿真截图
低重复率文档(22642字)
英文文献及翻译

综上分析本设计目标如下:

能够驱动直流无刷电机的运转并有电路保护以免器件烧坏。
能够实时准确的检测到直流无刷电机转子的位置。
能够实现对电机启动和停止的控制。
能够通过滑动变阻器来实现直流无刷电机的无极调速。
电路具有电流、电压保护,以免对电路产生不良影响。
现在已经确定直流无刷无感电机的控制系统需要实现的主要功能和技术有:

能够准确实时的检测到无刷直流电机转子的位置;
用三段式技术使电机能够很好的启动;
PID调节技术;
速度环的控制;
电压保护、电流保护。

设计说明书

摘要

本文的主要工作是基于STM32设计无刷直流电机控制系统。随着科学的进步,电子技术的成熟,现在已经有了很大一部分电子产品开始实现智能化,并且已经开始广泛的应用于当前的生活中来,通过嵌入式设备来使系统达到更好的技术的控制。本文选择使用STM32主控芯片控制无刷直流电机,可以通过按键实现对无刷直流电机的速度控制,并可以将转速显示到液晶显示器。
本文首先阐述了无刷直流电机的研究背景和意义,然后对无刷直流电机实现方案进行了论证分析,并给出无刷直流电机的总体设计方案。接着详细介绍了无刷直流电机的硬件设计,对主控模块,电源模块,显示模块的电路原理图进行了绘制,重点是无刷直流电机的驱动模块和调速模块的程序设计。最后基于Proteus对系统进行仿真、调试。通过这种方式,不仅能精确验证设计后的系统是否满足技术要求,还在提高系统效率、质量的设计基础上降低了开发成本。

设计框架架构

电机调速框架思路:
在这里插入图片描述

设计说明书及设计文件

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

低重复率文档(22642字)在这里插入图片描述

源码展示

/* USER CODE BEGIN Header */
/**  ******************************************************************************
  * @file           : main.c
  * @brief          : Main program body
  ******************************************************************************
  * @attention
  *
  * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
  * All rights reserved.</center></h2>
  *
  * This software component is licensed by ST under BSD 3-Clause license,
  * the "License"; You may not use this file except in compliance with the
  * License. You may obtain a copy of the License at:
  *                        opensource.org/licenses/BSD-3-Clause
  *  ******************************************************************************
  */
/* USER CODE END Header */

/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "adc.h"
#include "tim.h"
#include "gpio.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "includes.h"
#include "lcd.h"
/* USER CODE END Includes */
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
/* USER CODE END PTD */
/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
#define HALL_GPIO GPIOA
//START 任务
//设置任务优先级
#define START_TASK_PRIO      			10 //开始任务的优先级设置为最低
//设置任务堆栈大小
#define START_STK_SIZE  	  			64
//任务堆栈	
OS_STK START_TASK_STK[START_STK_SIZE];
//任务函数
void start_task(void *pdata);	 			   
//LED0任务
//设置任务优先级
#define LED0_TASK_PRIO       			2 
//设置任务堆栈大小
#define LED0_STK_SIZE  		    		64
//任务堆栈	
OS_STK LED0_TASK_STK[LED0_STK_SIZE];
//任务函数
void led0_task(void *pdata);
//Speed_ADC 任务
//设置任务优先级
#define SPEED_ADC_TASK_PRIO       			1
//设置任务堆栈大小
#define SPEED_ADC_STK_SIZE  		    		64
//任务堆栈	
OS_STK SPEED_ADC_TASK_STK[SPEED_ADC_STK_SIZE];
//任务函数
void speed_adc_task(void *pdata);
/* USER CODE END PD */
/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */
/* USER CODE END PM */
/* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN PV */
/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */
	HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
	OSInit();
	OSTaskCreate(start_task,(void *)0,(OS_STK *)&START_TASK_STK[START_STK_SIZE-1],START_TASK_PRIO );//创建起始任务
  /* USER CODE END 1 */
  /* MCU Configuration--------------------------------------------------------*/
  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();
  /* USER CODE BEGIN Init */
  /* USER CODE END Init */
  /* Configure the system clock */
  SystemClock_Config();
  /* USER CODE BEGIN SysInit */		
  /* USER CODE END SysInit */
  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_TIM1_Init();
  MX_ADC1_Init();
  MX_TIM2_Init();
  /* USER CODE BEGIN 2 */
	OSStart();
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */
    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}
/**
  * @brief System Clock Configuration
  * @retval None
  */
void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
  RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
  /** Initializes the CPU, AHB and APB busses clocks 
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL2;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }
  /** Initializes the CPU, AHB and APB busses clocks 
  */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV2;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
  {
    Error_Handler();
  }
  PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC;
  PeriphClkInit.AdcClockSelection = RCC_ADCPCLK2_DIV2;
  if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
  {
    Error_Handler();
  }
}
//LED0任务
void speed_adc_task(void *pdata)
{	 	 
	lcd_system_reset();
	unsigned char temp_table[16] ={"Cur_Speed:"};
	unsigned char temp_table1[16] ={"Tar_Speed:"};
	for(uint8_t i=0;i<10;i++) 
	{
		lcd_char_write(i,0,temp_table[i]); 
		lcd_char_write(i,1,temp_table1[i]); 
	}
	HAL_ADC_Start(&hadc1);
	while(1)
	{
		HAL_ADC_PollForConversion(&hadc1,0); //等待转换完成,第二个参数代表最长等待时间ms
		if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc1), HAL_ADC_STATE_REG_EOC))
		{
			ADC_Value = HAL_ADC_GetValue(&hadc1); // 读取ADC数据 ,4096 -> 3.3V
			ADC_Speed = ADC_Value + 500;  //转换公式  0-4096  ->   500 - 4596
//			if(ADC_Speed > 100){
//				HAL_GPIO_TogglePin(led_GPIO_Port, led_Pin);
//			}
		}
		//当前速度
		temp_table[10]=current_speed/1000+'0';
		temp_table[11]=current_speed/100%10+'0';
		temp_table[12]=current_speed/10%10+'0';
		temp_table[13]=current_speed%10+'0';
	  //目标速度
		temp_table1[10]=ADC_Speed/1000+'0';
		temp_table1[11]=ADC_Speed/100%10+'0';
		temp_table1[12]=ADC_Speed/10%10+'0';
		temp_table1[13]=ADC_Speed%10+'0';
		for(uint8_t i=10;i<14;i++) 
		{
			lcd_char_write(i,0,temp_table[i]); 
			lcd_char_write(i,1,temp_table1[i]); 
		}
	}
}
//speed adc 采样函数
void led0_task(void *pdata)
{	 	
	while(1)
	{
		HAL_GPIO_WritePin(led_GPIO_Port, led_Pin, GPIO_PIN_SET);
		OSTimeDly(10);
		HAL_GPIO_WritePin(led_GPIO_Port, led_Pin, GPIO_PIN_RESET);
		OSTimeDly(10);
	}
}
//外部中断服务函数
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{	
	if(!state)
	{
		__IO uint8_t uwStep = 0;
		uint16_t hall_read=(HALL_GPIO->IDR)&0x0007; // 获取霍尔传感器状态 pin0 1 2
		uwStep = hall_read;
		BLDC_PHASE_CHANGE(uwStep);   // 驱动换相			
	}
	uint16_t key_read =(Start_GPIO_Port->IDR)&0x00e0;
	if(key_read == 0x00c0)
	{
//		state = !state;
//		HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_1);
//		HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_2);
//		HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_3);//		
//		//BLDC_PHASE_CHANGE(7);
//		HAL_TIM_Base_MspDeInit(&htim1);//		
//		HAL_Delay(300);
//		HAL_TIM_Base_MspDeInit(&htim1);
//		HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
//		HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_2);
//		HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_3);
//		BLDC_PHASE_CHANGE(7);
			//HAL_GPIO_TogglePin(led_GPIO_Port, led_Pin);
	}else if(key_read == 0x00a0)
	{
		clock_wise = 0;
	}else if(key_read == 0x0060)
	{
		clock_wise = 1;
	}
}
//定时器2中断函数
//溢出时间为1s
//溢出值1000  每个点为1ms
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{	
	if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1) //捕获中断
	{
		/*
		测速逻辑
		1、中断产生,先判断是否为第一次上升沿
		2、捕获到上升沿后,将时间点存入变量,切换捕获下降沿
		3、捕获到下降沿后,记下时间点,切换为捕获上升沿
		4、捕获到上升沿后,记下时间点
		5、计算周期和占空比
		6、问题如果经过多个周期才有一次上升沿和下降沿怎么办,需要记录溢出次数
		    如果溢出的时候有上升沿标志位		
		问题:proteus三路输入捕获计算,测转速时,如果第一个上升沿和第二个上升沿不在一个定时器计数周期,会计算失败
		*/
		if(Channel1Edge == 0)
		{
			//获取通道1上升沿时间点
			Channel1RisingTimeNow = HAL_TIM_ReadCapturedValue(&htim2, TIM_CHANNEL_1);
			Channel1Edge = 1;//捕获上升沿置位
			Channel1RisingTimeLast = Channel1RisingTimeNow;
		}else if(Channel1Edge == 1)
		{
			Channel1RisingTimeNow = HAL_TIM_ReadCapturedValue(&htim2, TIM_CHANNEL_1);
			if(Channel1RisingTimeNow > Channel1RisingTimeLast)
				{
					Channel1Period = Channel1RisingTimeNow - Channel1RisingTimeLast;
				}
				else
				{
					//Channel2Period = Channel2RisingTimeNow + 1000 - Channel2RisingTimeLast + 1;
				}
			Channel1Edge = 0;
			//pid计算
//				current_speed = 60*1000 / Channel1Period; //转速计算
//				current_speed = current_speed * 5; //速度调整系数
//				motor_duty = Speed_PIDAdjust(current_speed);
		}
	}else if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)
	{
		if(Channel2Edge == 0)
		{
			Channel2RisingTimeNow = HAL_TIM_ReadCapturedValue(&htim2, TIM_CHANNEL_2);
			Channel2Edge = 1;			
			Channel2RisingTimeLast = Channel2RisingTimeNow;
		}
		else if(Channel2Edge == 1)
		{
			Channel2RisingTimeNow = HAL_TIM_ReadCapturedValue(&htim2, TIM_CHANNEL_2);
			if(Channel2RisingTimeNow > Channel2RisingTimeLast)
				{
					Channel2Period = Channel2RisingTimeNow - Channel2RisingTimeLast;
				}
				else
				{
					//Channel2Period = Channel2RisingTimeNow + 1000 - Channel2RisingTimeLast + 1;
				}
			current_speed = 60*1000 / Channel2Period;
			current_speed = current_speed * 5; //速度调整系数
			motor_duty = Speed_PIDAdjust(current_speed);
			Channel2Edge = 0;
		}
	}
	else if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_3)
	{
		if(Channel3Edge == 0)
		{
			Channel3RisingTimeNow = HAL_TIM_ReadCapturedValue(&htim2, TIM_CHANNEL_3);
			Channel3Edge = 1;
			Channel3RisingTimeLast = Channel3RisingTimeNow;
		}
		else if(Channel3Edge == 1)
		{
			Channel3RisingTimeNow = HAL_TIM_ReadCapturedValue(&htim2, TIM_CHANNEL_3);
			if(Channel3RisingTimeNow > Channel3RisingTimeLast)
				{
					Channel3Period = Channel3RisingTimeNow - Channel3RisingTimeLast;
				}
				else
				{
					//Channel3Period = Channel3RisingTimeNow + 1000 - Channel3RisingTimeLast + 1;
				}
//			current_speed = 60*1000 / Channel3Period;
//			current_speed = current_speed * 5; //速度调整系数
//			motor_duty = Speed_PIDAdjust(current_speed);
			Channel3Edge = 0;			
		}
	}
}
/* USER CODE END 4 */
/**
  * @brief  This function is executed in case of error occurrence.
  * @retval None
  */
void Error_Handler(void)
{
  /* USER CODE BEGIN Error_Handler_Debug */
  /* User can add his own implementation to report the HAL error return state */
  /* USER CODE END Error_Handler_Debug */
}
#ifdef  USE_FULL_ASSERT
/**
  * @brief  Reports the name of the source file and the source line number
  *         where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t *file, uint32_t line)
{ 
  /* USER CODE BEGIN 6 */
  /* User can add his own implementation to report the file name and line number,
     tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  /* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
#define ADC_Speed_Max   4596	 //800 3500
#define ADC_Speed_Min   500
#define PWM_Max			    800
#define PWM_Min     	  60
extern int ADC_Speed;  //ADC采样值转换成转速  
extern int motor_period;
extern int motor_duty;   
/*==================================================================================================== 
                                                增量式PID
The PID (????????) function is used in mainly 
control applications. PIDCalc performs one iteration of the PID 
algorithm. 
While the PID function works, main is just a dummy program showing 
a typical usage. 
=====================================================================================================*/
typedef struct PID 
{ 
        int Target;     					//目标转速  相差10%左右,所以显示90%
        int Uk;                 	//Uk
        int Udk;                	//Udk
        int Uk_1;                 //Uk-1
        double P;                 // Proportional Const 
        double I;                 // Integral Const
        int    b; 

}PID;
static PID Speed_PID; 
static PID *Speed_Point = &Speed_PID; 
/*==================================================================================================== 
Initialize PID Structure PID
=====================================================================================================*/ 
void Speed_PIDInit(void) 
{ 
        Speed_Point->Target = ADC_Speed *10 / 9;
        Speed_Point->Uk     = 0;
        Speed_Point->Udk    = 0;
        Speed_Point->Uk_1   = PWM_Min;
        Speed_Point->ek_0   = 0;        					 //ek=0
        Speed_Point->ek_1   = 0;        					 //ek-1=0
        Speed_Point->ek_2   = 0;         					 //ek-2=0
        Speed_Point->P      = 1;  					  //Proportional Const 

}
/*==================================================================================================== 
???PID???? 
=====================================================================================================*/ 
int Speed_PIDAdjust(int Next_Point) 
{ 
				Speed_Point->Target = ADC_Speed *10 / 9;  //重新调整速度
        Speed_Point->ek_0= Speed_Point->Target - Next_Point;         
        if(((Speed_Point->Uk_1>=PWM_Max)&&(Speed_Point->ek_0>=0))||((Speed_Point->Uk_1<=PWM_Min)&&(Speed_Point->ek_0<=0)))
        {
            Speed_Point->b=0;
        } 
        else
        {
            Speed_Point->b=1;
        } 
        //Speed_Point->Udk=Speed_Point->P*(Speed_Point->ek_0-Speed_Point->ek_1) + Speed_Point->b*Speed_Point->I*Speed_Point->ek_0 
          //      + Speed_Point->D*(Speed_Point->ek_0-2*Speed_Point->ek_1+Speed_Point->ek_2);//PID
				Speed_Point->Udk=Speed_Point->P*(Speed_Point->ek_0-Speed_Point->ek_1);//P
        Speed_Point->Uk = Speed_Point->Uk_1 + Speed_Point->Udk;
        Speed_Point->ek_2 = Speed_Point->ek_1;
        Speed_Point->ek_1 = Speed_Point->ek_0;
        Speed_Point->Uk_1 = Speed_Point->Uk; 
    if(Speed_Point->Uk >= PWM_Max)
        {
          return PWM_Max;
        }
        else if(Speed_Point->Uk <= PWM_Min)
        {
					return PWM_Min;
        } 
        return(Speed_Point->Uk); 
}

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

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

相关文章

能迪科技智能控制系统对中央空调进行精准、单独调控医院案例

案例背景​ 梅州市妇女儿童医院新院区&#xff08;以下简称“新院区”&#xff09;是省、市重点项目工程&#xff0c;建设地点位于江南新城客都大道北侧&#xff0c;一期项目总投资4.8亿元&#xff0c;占地面积50亩&#xff0c;总建筑面积87000平方米&#xff0c;按照三级妇幼保…

blender cycles引擎

文章目录简介属性一 Scene采样二 光程最多反弹次数钳制焦散快速GI近似三 体积步进速率四 曲线简介 1 cycles与EV的区别在于cy是传统渲染引擎&#xff0c;效果好&#xff0c;速度慢&#xff0c;ev是实时引擎&#xff0c;速度快&#xff0c;效果差 2 切换渲染引擎&#xff0c;属…

基于51单片机智能IC卡水表控制系统(仿真+源程序+全套资料)

资料编号&#xff1a;200 功能介绍&#xff1a; 采用51单片机作为主控CPU&#xff0c;使用按键进行模拟冲卡&#xff08;模拟缴费冲卡&#xff09;&#xff0c;通过按键来控制当前是否使用自来水&#xff0c;并且LCD1602实时显示当前自来水可用量剩余多少&#xff0c;当自来水…

GhMYB7促进棉纤维中次生壁纤维素的积累

文章信息 题目&#xff1a;GhMYB7 promotes secondary wall cellulose deposition in cotton fibres by regulating GhCesA gene expression through three distinct cis-elements 刊名&#xff1a;New Phytologist 作者&#xff1a;Junfeng Huang&#xff0c;Wenliang Xu e…

图文详解Linux基础经典教程(10)——阿里云安装开发工具

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 概述 之前&#xff0c;我们已经介绍在本地CentOS上安装JDK、Tomcat、MySQL等开发工具。接下来&#xff0c;我们介绍在阿里云安装这些开发工具。 购买阿里云 请在阿里云 h…

自然语言处理NLP——ERNIE-M:基于回译机制的“预训练-微调”多语言模型

目录 系列文章目录 一、背景介绍 1.多语言任务 1.1 多语言任务定义 1.2 多语言任务难题 2.多语言模型 2.1 多语言模型定义与原理 2.2 多语言模型困难 3.论文简介 3.1 背景与开发动机 3.2 论文梗概 3.3 论文贡献与成就 二、相关工作 1.预训练方法 1.1 预训练方法…

Postman之Newman命令行运行脚本生成HTML报告

目录 一、Newman的下载安装 二、Newman生成Html报告 三、执行脚本准备 3.1.导出项目集脚本 3.2.导出环境变量 3.3.导出全局变量 3.4.data数据驱动文件 3.5.文件存储 四、Newman运行命令简介 4.1.运行命令&#xff1a;newman run 4.2.常用参数&#xff1a; 4.3.执行…

【SSM框架】依赖注入

&#x1f353;个人主页&#xff1a;个人主页 &#x1f352;系列专栏&#xff1a;SSM框架 目录 1.依赖注入之setter注入 2.依赖注入之构造器注入 3.特殊值处理 4.为类类型属性赋值 5.为数组类型属性赋值 1.依赖注入之setter注入 ①创建学生类Student package com.atguigu.s…

09【SpringMVC的Json支持】

文章目录三、Json的支持3.1 响应json3.1.1 ResponseBody3.1.2 JsonIgnore3.1.3 JsonFormat3.1.4 ResponseEntity3.1.5 作用在类上3.1.6 RestController3.2 请求Json3.2.1 RequestBody3.2.2 HttpEntity3.2.3 封装Json数据三、Json的支持 SpringMVC支持自动将JSON转换成Java对象…

ubuntu更换清华源

进入&#xff1a;清华大学开源软件镜像站 | Tsinghua Open Source Mirror 选择你的ubuntu版本 vi /etc/apt/sources.list 如果执行apt update 报镜像源证书错误 &#xff08;1&#xff09;将/etc/apt/sources.list中的https改为http, 然后执行apt update&#xff1b; &#…

Linux进程状态

目录 一、普适操作系统的进程状态 1.什么是进程状态 2.三种重要的进程状态 &#xff08;1&#xff09;运行状态 &#xff08;2&#xff09;阻塞状态 &#xff08;3&#xff09;挂起状态 二、Linux源代码中的进程状态 三、Linux进程状态 1.运行状态 2.睡眠状态&#x…

AI加速(九): 深度理解吞吐量和延时

前文回顾&#xff1a; AI加速&#xff08;二&#xff09;| 计算机存储和计算的分离 AI加速&#xff08;三&#xff09;| 每条指令都是流水线的工人 AI加速&#xff08;四&#xff09;| 衣柜般的分层存储设计 AI加速&#xff08;五&#xff09;| 一个例子看懂流水——从指令到…

Java多线程之Thread和Runnable以及Callable接口多线程的简单实现(适合小白入门,十分简单)

Java多线程之Thread和Runnable一、介绍1、程序2、进程3、线程4、整体思路5、注意二、Thread1、思路流程2、样例代码3、多线程下载图片三、Runnable1、思路流程2、样例代码3、多线程下载图片四、Callable接口&#xff08;仅作了解&#xff09;1、具体流程2、优点3、样例五、两者…

视频编解码 — SVC可伸缩性

目录 SVC分层 时域SVC 空域SVC 在一对多的情况下&#xff0c;根据每个接收端的带宽不同&#xff0c;灵活调整发送码率 SVC分层 第0层&#xff0c;最底层&#xff0c;可以独立进行编解码&#xff0c;不依赖第1&#xff0c;第2层第1层&#xff0c;依赖于第0层第2层&#xff…

Linux中的/proc文件系统详解(C/C++代码实现)

Linux /proc这个特殊的目录包含有关Linux系统的所有详细信息&#xff0c;包括其内核、进程和配置参数。通过研究/proc目录&#xff0c;可以了解Linux命令的工作原理&#xff0c;甚至可以执行一些管理任务。 走进Linux的/proc目录 今天&#xff0c;我们将查看/proc目录并熟悉它…

最新版 苹果 IOS AppStore证书申请全流程 包括p12文件

第一步 登陆开发者网站并进入证书管理页。 辅助工具网站地址&#xff1a;http://www.applicationloader.net/ 第二步 添加【Certificates】证书。在这里插入图片描述 第三步 进入添加页后&#xff0c;根据需求选择。 第四步 选择好环境之后&#xff0c;这里需要选择一个…

GitHub上传本地程序操作的问题解决汇总

1、新建远程仓库 2、提交本地程序到GitHub 完整命令汇总&#xff0c;这些命令的顺序已解决目前Git提交所遇到的下面问题 存在的问题展示部分没贴出来&#xff0c;可以先按命令顺序走一遍流程。 git init //把这个目录变成Git可以管理的仓库git checkout -b main //切换至main默…

如何零基础自学 Python ?听我娓娓道来

如何零基础自学 Python &#xff1f; 前言 今天这篇文章是对初学者的一篇学习资料分享与总结&#xff01; 简单介绍下笔者的自学之路 起初学习 Python 是在 2020 年&#xff0c;那时临近毕业&#xff0c;由于面临着找工作的不确定性&#xff0c;便学习了相关的网络安全知识&…

计组作业笔记【 总线 】

系统总线按传输内容不同分为数据总线&#xff0c;地址总线&#xff0c;控制总线。 片内总线与系统总线是并列关系&#xff0c;与通信总线一同作为总线按功能的分类。 所以选B 总线复用是指一种信号线在不同时间传输不同的信息。 所以该题选A。 当某设备正获得了总线控制权时…

系统安装技能测试

系统安装技能测试 目录 系统安装技能测试 一、制作PE U盘 安装完成之后查看U盘是否有PE 使用制作好的U盘进入PE界面 二、使用虚拟机进入PE界面 虚拟机成功进入PE主界面 三、PE界面进行分区操作 在PE模式下&#xff0c;使用ISO进行系统安装 四、PE系统备份 五、使用PXE进行网克…