【ESP32 idf 硬件I2C驱动MPU6050获取六轴数值】

news2024/12/29 11:28:28

目录

  • I2C
    • 介绍
    • 配置
    • 安装驱动
    • 通信
      • 创建&删除命令链接容器
      • 起始时序
      • 写数据
      • 读数据
      • 结束时序
      • 开始命令
  • mpu6050 硬件i2c驱动代码&调试
    • 代码
    • 调试

I2C

介绍

介绍部分可以看我写的【ESP32 idf 软件模拟I2C驱动MPU6050实现六轴加速度的获取】,这个是使用软件模拟的I2C时序从而实现的,这次是硬件idf实现。

在这里插入图片描述
步骤:

在这里插入图片描述
在这里插入图片描述

配置

在这里插入图片描述
在这里插入图片描述

代码:

    uint8_t res;
    i2c_config_t i2c_config_InitStructure;
    i2c_config_InitStructure.clk_flags = 0; // 采用默认时钟
    i2c_config_InitStructure.master.clk_speed = 50000; // 通信速度 分为标准速度100kbps和快速400kbps,这里用50kbps即可
    i2c_config_InitStructure.mode = I2C_MODE_MASTER; // 主机模式
    i2c_config_InitStructure.scl_io_num = MPU6050_SCL_Pin; // 通信引脚,scl
    i2c_config_InitStructure.scl_pullup_en = GPIO_PULLUP_ENABLE; // scl 上拉使能
    i2c_config_InitStructure.sda_io_num = MPU6050_SDA_Pin; // sda引脚
    i2c_config_InitStructure.sda_pullup_en = GPIO_PULLUP_ENABLE; // sda 上拉使能

    res = i2c_param_config(i2c_port, &i2c_config_InitStructure);//配置参数
    if (res == ESP_OK) {
        ESP_LOGI(TAG, "i2c_param_config success");
    } else {
        ESP_LOGE(TAG, "i2c_param_config failed with error: %d", res);
    }

安装驱动

在这里插入图片描述
代码

    res = i2c_driver_install(i2c_port, I2C_MODE_MASTER, 0, 0, 0); // 安装驱动
    if (res == ESP_OK) {
        ESP_LOGI(TAG, "i2c_driver_install success");
    } else {
        ESP_LOGE(TAG, "i2c_driver_install failed with error: %d", res);
    }

参数一选择I2C资源,和上面配置的保持一致。

参数二选择主从模式。

如果是主机的话,后三个的参数都可以不需要,塞个0即可。

通信

在这里插入图片描述
在这里插入图片描述

创建&删除命令链接容器

在这里插入图片描述
删除命令容器可以减少资源浪费。

起始时序

在这里插入图片描述

写数据

写数据有以下两种方式,当然了,都是主模式使用的。
区别在于第一个函数是写一个Byte,而第二个函数可以写多个Byte。
在这里插入图片描述

读数据

在这里插入图片描述

结束时序

在这里插入图片描述

开始命令

既然上面的容器配置好了,必然需要开启该容器
在这里插入图片描述

mpu6050 硬件i2c驱动代码&调试

代码

MPU6050.c

/*
 * @Author: i want to 舞动乾坤
 * @Date: 2024-07-26 08:52:56
 * @LastEditors: i want to 舞动乾坤
 * @LastEditTime: 2024-07-26 16:42:29
 * @FilePath: \i2c_hardware_driver_mpu6050\main\MPU6050.c
 * @Description: 
 * 
 * Copyright (c) 2024 by i want to 舞动乾坤, All Rights Reserved. 
 */

#include <stdint.h>
#include "MPU6050_REG.h"
#include <driver/i2c.h>
#include <esp_log.h>
#include <freertos/FreeRTOS.h>
#include <freertos/task.h>

#define MPU6050_Address 0x68 // MPU6050 的 7 位地址
#define MPU6050_SCL_Pin GPIO_NUM_22
#define MPU6050_SDA_Pin GPIO_NUM_21
#define i2c_port I2C_NUM_0

static const char* TAG = "MPU6050";

/**
 * @description: MPU6050写寄存器
 * @param {uint8_t} RegAddress 寄存器地址,范围:参考MPU6050手册的寄存器描述
 * @param {uint8_t} Data 要写入寄存器的数据,范围:0x00~0xFF
 * @tip:设备地址通常是一个 7 位地址。当在软件中使用该地址时,通常需要将其左移一位(即乘以 2)以适应 I2C 总线传输格式。具体来说:
		I2C 总线上的设备地址总共是 8 位:
		前 7 位是设备的地址。
		第 8 位(最低位)是读/写位(R/W),用于指示这次操作是读还是写。
		0 表示写操作(I2C_MASTER_WRITE)。
		1 表示读操作(I2C_MASTER_READ)。
		所以,当你指定设备地址时,需要将其左移一位,并将读/写位添加到最低位。例如,对于一个 7 位设备地址 0x68:
		写操作:地址为 0x68 << 1 | I2C_MASTER_WRITE,即 0xD0。
		读操作:地址为 0x68 << 1 | I2C_MASTER_READ,即 0xD1。
		这是为什么需要左移一位的原因。
 * @return {*}无
 */
void MPU6050_WriteReg(uint8_t RegAddress, uint8_t Data)
{
    uint8_t res;
    i2c_cmd_handle_t cmd = i2c_cmd_link_create(); // 创建链接,装载容器
    i2c_master_start(cmd); // 产生起始信号
    i2c_master_write_byte(cmd, (MPU6050_Address << 1) | I2C_MASTER_WRITE, true); // 发送从机地址,并产生应答
    i2c_master_write_byte(cmd, RegAddress, true); // 发送从机数据寄存器的地址,并产生应答
    i2c_master_write_byte(cmd, Data, true); // 写入数据 并产生应答
    i2c_master_stop(cmd); // 产生停止信号
    res = i2c_master_cmd_begin(i2c_port, cmd, 100 / portTICK_PERIOD_MS); // 启动容器,开始工作
    i2c_cmd_link_delete(cmd); // 删除链接容器,避免占用资源

    if (res == ESP_OK) {
        ESP_LOGI(TAG, "MPU6050_WriteReg success - RegAddress: 0x%02X, Data: 0x%02X", RegAddress, Data);
    } else {
        ESP_LOGE(TAG, "MPU6050_WriteReg failed with error: %d - RegAddress: 0x%02X, Data: 0x%02X", res, RegAddress, Data);
    }
}

/**
 * @description: 读寄存器的数据
 * 
 * @param {uint8_t} RegAddress  寄存器地址,范围:参考MPU6050手册的寄存器描述
 * @return {*}读取寄存器的数据,范围:0x00~0xFF
 */
uint8_t MPU6050_ReadReg(uint8_t RegAddress)
{
    uint8_t Data = 0;
    uint8_t res;



	i2c_cmd_handle_t cmd = i2c_cmd_link_create(); // 创建链接,装载容器
	i2c_master_start(cmd); // 产生起始信号
	i2c_master_write_byte(cmd, (MPU6050_Address << 1) | I2C_MASTER_WRITE, true); // 发送从机地址,并产生应答
	i2c_master_write_byte(cmd, RegAddress, true); // 发送从机数据寄存器的地址,并产生应答

	// 开始在该寄存器下读数据
	i2c_master_start(cmd); // 产生起始信号
	i2c_master_write_byte(cmd, (MPU6050_Address << 1) | I2C_MASTER_READ, true); // 发送从机地址,读写位为1,表示即将读取,并产生应答
	i2c_master_read_byte(cmd, &Data, I2C_MASTER_LAST_NACK); // 读一个字节的数据至Data内,并且非应答
	i2c_master_stop(cmd); // 发送停止信号
	res = i2c_master_cmd_begin(i2c_port, cmd, 100 / portTICK_PERIOD_MS); // 启动容器,开始工作
	i2c_cmd_link_delete(cmd); // 删除链接,保证资源不会被一直占用

	if (res == ESP_OK) {
		ESP_LOGI(TAG, "MPU6050_ReadReg success - RegAddress: 0x%02X, Data: 0x%02X", RegAddress, Data);
	
	} else {
		ESP_LOGE(TAG, "MPU6050_ReadReg failed with error: %d - RegAddress: 0x%02X, retrying...", res, RegAddress);
		vTaskDelay(10 / portTICK_PERIOD_MS); // 延迟10ms后重试
	}
    

    return Data;
}

/**
 * @description: MPU5050初始化
 * @return {*}无
 */
void MPU6050_Init(void)
{
    uint8_t res;
    i2c_config_t i2c_config_InitStructure;
    i2c_config_InitStructure.clk_flags = 0; // 采用默认时钟
    i2c_config_InitStructure.master.clk_speed = 50000; // 通信速度 分为标准速度100kbps和快速400kbps,这里用标准速度即可
    i2c_config_InitStructure.mode = I2C_MODE_MASTER; // 主机模式
    i2c_config_InitStructure.scl_io_num = MPU6050_SCL_Pin; // 通信引脚,scl
    i2c_config_InitStructure.scl_pullup_en = GPIO_PULLUP_ENABLE; // scl 上拉使能
    i2c_config_InitStructure.sda_io_num = MPU6050_SDA_Pin; // sda引脚
    i2c_config_InitStructure.sda_pullup_en = GPIO_PULLUP_ENABLE; // sda 上拉使能

    res = i2c_param_config(i2c_port, &i2c_config_InitStructure);//配置参数
    if (res == ESP_OK) {
        ESP_LOGI(TAG, "i2c_param_config success");
    } else {
        ESP_LOGE(TAG, "i2c_param_config failed with error: %d", res);
    }

    res = i2c_driver_install(i2c_port, I2C_MODE_MASTER, 0, 0, 0); // 安装驱动
    if (res == ESP_OK) {
        ESP_LOGI(TAG, "i2c_driver_install success");
    } else {
        ESP_LOGE(TAG, "i2c_driver_install failed with error: %d", res);
    }

    MPU6050_WriteReg(MPU6050_PWR_MGMT_1, 0x01); // 唤醒mpu6050
    MPU6050_WriteReg(MPU6050_PWR_MGMT_2, 0x00);
    MPU6050_WriteReg(MPU6050_SMPLRT_DIV, 0x09); // 10分频
    MPU6050_WriteReg(MPU6050_CONFIG, 0x06); // 数字低通滤波器
    MPU6050_WriteReg(MPU6050_GYRO_CONFIG, 0x18); // 陀螺仪寄存器
    MPU6050_WriteReg(MPU6050_ACCEL_CONFIG, 0x18); // 加速度寄存器 最大量程
}



/**
  * 函    数:MPU6050获取ID号
  * 参    数:无
  * 返 回 值:MPU6050的ID号
  */
uint8_t MPU6050_GetID(void)
{
	return MPU6050_ReadReg(MPU6050_WHO_AM_I);

}



/**
  * 函    数:MPU6050获取数据
  * 参    数:AccX AccY AccZ 加速度计X、Y、Z轴的数据,使用输出参数的形式返回,范围:-32768~32767
  * 参    数:GyroX GyroY GyroZ 陀螺仪X、Y、Z轴的数据,使用输出参数的形式返回,范围:-32768~32767
  * 返 回 值:无
  * 具体选择转的角速度是多少 是通过比例公式计算出来的  读取的数据/32768  =  x /满量程  求x
  */
void MPU6050_GetData(int16_t *AccX, int16_t *AccY, int16_t *AccZ, 
						int16_t *GyroX, int16_t *GyroY, int16_t *GyroZ)
{
	uint8_t DataH,DataL;
	//读取加速度x轴寄存器的高八位
	DataH=MPU6050_ReadReg(MPU6050_ACCEL_XOUT_H);
	//读取加速度x轴寄存器的低八位
	DataL=MPU6050_ReadReg(MPU6050_ACCEL_XOUT_L);
	*AccX=(DataH<<8) | DataL;//读取
	
	//读取加速度y轴寄存器的高八位
	DataH=MPU6050_ReadReg(MPU6050_ACCEL_YOUT_H);
	//读取加速度y轴寄存器的低八位
	DataL=MPU6050_ReadReg(MPU6050_ACCEL_YOUT_L);
	*AccY=(DataH<<8) | DataL;  //返回出去
	
	
	//读取加速度z轴寄存器的高八位
	DataH=MPU6050_ReadReg(MPU6050_ACCEL_ZOUT_H);
	//读取加速度z轴寄存器的低八位       
	DataL=MPU6050_ReadReg(MPU6050_ACCEL_ZOUT_L);
	*AccZ=(DataH<<8) | DataL;  //返回出去
	
	
		
	//读取加速度z轴寄存器的高八位
	DataH=MPU6050_ReadReg(MPU6050_ACCEL_ZOUT_H);
	//读取加速度z轴寄存器的低八位       
	DataL=MPU6050_ReadReg(MPU6050_ACCEL_ZOUT_L);
	*AccZ=(DataH<<8) | DataL;  //返回出去
	
	
	DataH = MPU6050_ReadReg(MPU6050_GYRO_XOUT_H);		//读取陀螺仪X轴的高8位数据
	DataL = MPU6050_ReadReg(MPU6050_GYRO_XOUT_L);		//读取陀螺仪X轴的低8位数据
	*GyroX = (DataH << 8) | DataL;						//数据拼接,通过输出参数返回
	
	DataH = MPU6050_ReadReg(MPU6050_GYRO_YOUT_H);		//读取陀螺仪Y轴的高8位数据
	DataL = MPU6050_ReadReg(MPU6050_GYRO_YOUT_L);		//读取陀螺仪Y轴的低8位数据
	*GyroY = (DataH << 8) | DataL;						//数据拼接,通过输出参数返回
	
	DataH = MPU6050_ReadReg(MPU6050_GYRO_ZOUT_H);		//读取陀螺仪Z轴的高8位数据
	DataL = MPU6050_ReadReg(MPU6050_GYRO_ZOUT_L);		//读取陀螺仪Z轴的低8位数据
	*GyroZ = (DataH << 8) | DataL;						//数据拼接,通过输出参数返回
}

MPU6050.h

#ifndef __MPU6050_H__
#define __MPU6050_H__
void MPU6050_Init(void);
uint8_t MPU6050_ReadReg(uint8_t RegAddress);
void MPU6050_WriteReg(uint8_t RegAddress,uint8_t Data);
void MPU6050_GetData(int16_t *AccX, int16_t *AccY, int16_t *AccZ, 
						int16_t *GyroX, int16_t *GyroY, int16_t *GyroZ);
uint8_t MPU6050_GetID(void);

#endif


MPU6050_REG.h

#ifndef __MPU6050_REG_H__
#define __MPU6050_REG_H__
//存放MPU6050常用的寄存器地址
#define	MPU6050_SMPLRT_DIV		0x19   //分频值,值越小越快
#define	MPU6050_CONFIG			0x1A
#define	MPU6050_GYRO_CONFIG		0x1B
#define	MPU6050_ACCEL_CONFIG	0x1C

#define	MPU6050_ACCEL_XOUT_H	0x3B
#define	MPU6050_ACCEL_XOUT_L	0x3C
#define	MPU6050_ACCEL_YOUT_H	0x3D
#define	MPU6050_ACCEL_YOUT_L	0x3E
#define	MPU6050_ACCEL_ZOUT_H	0x3F
#define	MPU6050_ACCEL_ZOUT_L	0x40
#define	MPU6050_TEMP_OUT_H		0x41
#define	MPU6050_TEMP_OUT_L		0x42
#define	MPU6050_GYRO_XOUT_H		0x43
#define	MPU6050_GYRO_XOUT_L		0x44
#define	MPU6050_GYRO_YOUT_H		0x45
#define	MPU6050_GYRO_YOUT_L		0x46
#define	MPU6050_GYRO_ZOUT_H		0x47
#define	MPU6050_GYRO_ZOUT_L		0x48

#define	MPU6050_PWR_MGMT_1		0x6B
#define	MPU6050_PWR_MGMT_2		0x6C
#define	MPU6050_WHO_AM_I		0x75

#endif

main.c

/*
 * @Author: i want to 舞动乾坤
 * @Date: 2024-07-25 21:29:11
 * @LastEditors: i want to 舞动乾坤
 * @LastEditTime: 2024-07-26 09:26:14
 * @FilePath: \i2c_hardware_driver_mpu6050\main\main.c
 * @Description: 
 * 
 * Copyright (c) 2024 by i want to 舞动乾坤, All Rights Reserved. 
 */
#include <stdio.h>
#include "MPU6050.h"
#include <esp_log.h>
#include <freeRtos/FreeRTOS.h>
#include <freeRtos/task.h>
uint8_t ID;								//定义用于存放ID号的变量
int16_t AX, AY, AZ, GX, GY, GZ;			//定义用于存放各个数据的变量
void app_main(void)
{
    MPU6050_Init();
    ID=MPU6050_GetID();//获取设备ID
    ESP_LOGI("MPU6050 ID","#%x\n",ID);
    while(1)
	{
		MPU6050_GetData(&AX, &AY, &AZ, &GX, &GY, &GZ);//把六个变量的地址传递过去
        //显示六元组数据
        ESP_LOGI("AX value is","%d\n",AX);
        ESP_LOGI("AY value is","%d\n",AY);
        ESP_LOGI("AZ value is","%d\n",AZ);
        ESP_LOGI("GX value is","%d\n",GX);
        ESP_LOGI("GY value is","%d\n",GY);
        ESP_LOGI("GZ value is","%d\n",GZ);
        vTaskDelay(1000/portTICK_PERIOD_MS);//1000ms获取一次
	}
}

调试

在这里插入图片描述
参考大佬文章:【快速上手ESP32(基于ESP-IDF&VSCode)】

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

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

相关文章

数据结构-C语言-排序(4)

代码位置&#xff1a; test-c-2024: 对C语言习题代码的练习 (gitee.com) 一、前言&#xff1a; 1.1-排序定义&#xff1a; 排序就是将一组杂乱无章的数据按照一定的规律&#xff08;升序或降序&#xff09;组织起来。(注&#xff1a;我们这里的排序采用的都为升序) 1.2-排…

找工作准备刷题Day10 回溯算法 (卡尔41期训练营 7.24)

回溯算法今天这几个题目做过&#xff0c;晚上有面试&#xff0c;今天水一水。 第一题&#xff1a;Leetcode77. 组合 题目描述 解题思路 从题目示例来看&#xff0c;k个数是不能重合的&#xff0c;但是题目没有明确说明这一点。 使用回溯算法解决此问题&#xff0c;利用树形…

设计模式-结构型-09-外观模式

文章目录 1、影院管理项目2、外观模式基本介绍4、MyBatis 框架源码分析5、外观模式总结 1、影院管理项目 组建一个家庭影院&#xff1a; DVD 播放器、投影仪、自动屏幕、环绕立体声、爆米花机&#xff0c;要求完成使用家庭影院的功能&#xff0c;其过程为&#xff1a; 直接用…

推荐一个酷炫高逼格的服务器探针的监控工具,免费开源(附源码)

背景 作为一名攻城狮&#xff0c;面对各种服务器内存飙高、CPU猛增、磁盘打满等等服务器问题&#xff0c;可谓是伤透了我们的心。 不仅要开发&#xff0c;还要处理这些问题&#xff0c;大把的时间浪费了&#xff0c;这时候一个好的全面的监控工具尤为重要了。 所以&#xff…

Spring AI (三) 提示词对象Prompt

3.提示词对象Prompt 3.1.Prompt Prompt类的作用是创建结构化提示词, 实现了ModelRequest<List<Message>>接口 Prompt(String contents)&#xff1a;创建一个包含指定内容的Prompt对象。 Prompt(String contents, ChatOptions modelOptions)&#xff1a;创建一个…

Github 2024-07-26 Java开源项目日报 Top10

根据Github Trendings的统计,今日(2024-07-26统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Java项目9HTML项目1TypeScript项目1非开发语言项目1JavaGuide - Java 程序员学习和面试指南 创建周期:2118 天开发语言:Java协议类型:Apache…

【C++】初识C++基础篇·一(命名空间,函数重载,缺省参数,引用);

文章目录 前言1.输入与输出输出输入cin和scanf的对比 2.命名空间2.1namespace存在的意义2.2namespace的使用3.缺省参数4.函数重载重载函数的调用规则 5.引用 前言 我们先通过一段简单的代码来拉开C的序幕&#xff1b; //text.cpp #include<iostream> #include<stdio…

C++知识点总结:3.C++引用(自用)

C引用 1. 引用定义2. 引用的本质3. 引用和指针的不同之处补充指针常量和常量指针 4. 引用不能指代临时变量5. const引用&#xff08;常引用&#xff09;可以绑定临时数据6. const引用与转换类型 引用&#xff1a; [1]C语言中文网 [2]偶尔e网事,【C基础之二】常量指针和指针常量…

学习记录:ESP32控制舵机 FREERTOS BLE

控制舵机 PWM信号 PWM信号是一种周期性变化的方波信号&#xff0c;它有两个关键参数&#xff1a; 周期&#xff08;Period&#xff09;&#xff1a;一个完整的PWM信号的时间长度&#xff0c;通常用秒&#xff08;s&#xff09;或毫秒&#xff08;ms&#xff09;表示。占空比…

MQ消息队列+Lua 脚本实现异步处理下单流程

具体实现和代码可参考我以前做过的笔记&#xff1a;《黑马点评》异步秒杀优化|消息队列 回顾一下下单流程&#xff1a; 用户发起请求 会先请求Nginx,Nginx反向代理到Tomcat&#xff0c;而Tomcat中的程序&#xff0c;会进行串行工作&#xff0c; 分为以下几个操作&#xff1…

昇思25天学习打卡营第25天|基于 MindSpore 实现 BERT 对话情绪识别

基于 MindSpore 实现 BERT 对话情绪识别 模型概述 BERT&#xff08;双向编码器表征量&#xff09;是Google于2018年发布的一种先进语言模型&#xff0c;基于Transformer架构&#xff0c;具备双向上下文理解功能。BERT的预训练方法创新性地结合了两种任务&#xff1a; Masked …

高级网页爬虫开发:Scrapy和BeautifulSoup的深度整合

引言 在互联网时代&#xff0c;数据的价值日益凸显。网页爬虫作为一种自动化获取网页内容的工具&#xff0c;广泛应用于数据挖掘、市场分析、内容聚合等领域。Scrapy是一个强大的网页爬虫框架&#xff0c;而BeautifulSoup则是一个灵活的HTML和XML文档解析库。本文将探讨如何将…

凸优化笔记-基本概念

原文 文章目录 最小二乘问题 仿射affine hullaffine dimension 凸集锥集超平面和半空间单纯形整半定锥保凸性的操作透视函数 凸函数的条件1阶判定条件2阶判定条件 Epigraph 外图 m i n i m i z e f 0 ( x ) minimize\ \ \ f_0(x) minimize f0​(x) s u b j e c t t o f i ( …

Python 爬虫入门(一):从零开始学爬虫 「详细介绍」

Python 爬虫入门&#xff08;一&#xff09;&#xff1a;从零开始学爬虫 「详细介绍」 前言1.爬虫概念1.1 什么是爬虫&#xff1f;1.2 爬虫的工作原理 2. HTTP 简述2.1 什么是 HTTP&#xff1f;2.2 HTTP 请求2.3 HTTP 响应2.4 常见的 HTTP 方法 3. 网页的组成3.1 HTML3.1.1 HTM…

Debug下载与安装(Windows11)

前言 在安装配置前我们先下载一下我们需要用的文件 下载debug 百度网盘下载 下载DOSBox DOSBox 两个文件下载好后我们就开始安装和配置了 第一步&#xff1a;安装DOSBox 第二步&#xff1a;安装好后找到安装路径找到Options.bat文件并打开 第三步&#xff1a;在文件最下…

图片变色,背景方向渐变web

<!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <title>图片变色</title> <script src"03.JS\3.8JS案例加强\JQuery.js"></script> <style> .image-filter…

nvm 安装和遇到的问题

环境 win 11 安装 下载安装包 访问 https://github.com/coreybutler/nvm-windows/releases 选择需要的版本继续下载安装基本是可以下一步下一步的啦&#x1f92d; 安装 node 我这里需要16.x.x的node&#xff0c;执行以下命令 nvm install 16使用 node nvm use 16问题 …

苹果CMS V10萌芽采集插件Pro v10.7.3

苹果CMS V10萌芽采集插件Pro v10.7.3 插件下载:萌芽采集插件Pro v10.7.3.zip 使用说明: 将addons文件和static文件放到你苹果cms程序的根目录并覆盖&#xff0c; 在登录后台在应用-应用市场启用。http://你的域名/admin.php/admin/mycj/union.html

卷积的意义及其派生(一)

1.卷积的意义 1.1从LTI的角度看 卷积最开始其实是信号处理中用来描述线性移不变系统Linear time-invariant systems的。线性&#xff0c;表明可以叠加&#xff0c;信号可以拆分成脉冲的响应&#xff1b;时不变&#xff0c;指信号不随着时间的迁移改变&#xff0c;意味着能量守…

计算机网络(Wrong Question)

一、计算机网络体系结构 1.1 计算机网络概述 D 注&#xff1a;计算机的三大主要功能是数据通信、资源共享、分布式处理。&#xff08;负载均衡、提高可靠性&#xff09; 注&#xff1a;几段链路就是几段流水。 C 注&#xff1a;记住一个基本计算公式&#xff1a;若n个分组&a…