STM32CubeMX-H7-12-IIC读写MPU6050模块(中)-MPU6050模块详解以及软件IIC驱动

news2025/4/6 9:21:53

前言

上一篇我们已经完成对IIC代码基本框架的编写,以及获取MPU6050的ID,接下来我们逐一分析这个模块的功能,并用IIC驱动

建议看完上一篇再来看这篇

MPU6050寄存器介绍

1.电源管理寄存器(PWR_MGMT_1,地址:0x6B)

         

     我们要对0x6b这个地址给0以唤醒

    IIC_Write_REG(MPU6050_ADDR_AD0_LOW, PWR_MGMT_1, 0x00);  // 唤醒 MPU6050

    2.陀螺仪配置寄存器(GYRO_CONFIG,地址:0x1B)

    IIC_Write_REG(MPU6050_ADDR_AD0_LOW, GYRO_CONFIG, 0x18);  // 设置陀螺仪自检及测量范围

    选择满量程为±2000°/s

    3.加速度计配置寄存器(ACCEL_CONFIG,地址:0x1C)

        IIC_Write_REG(MPU6050_ADDR_AD0_LOW, ACCEL_CONFIG, 0x18);  // 设置加速度计自检、测量范围及高通滤波频率
    

    加速度计配置寄存器,选择满量程为±16g

    4.加速度计数据寄存器

           等会获取加速度的时候会用,主要获取加速度

    5.陀螺仪数据寄存器

    等会获取角度的时候会用,主要获取角度

    6.中断使能寄存器(INT_ENABLE,地址:0x38)

            看情况使用

    7.采样率分频寄存器(SMPLRT_DIV,地址:0x19)

    IIC_Write_REG(MPU6050_ADDR_AD0_LOW, SMPLRT_DIV, 0x09);  // 设置采样率分频

    8.CONFIG 寄存器主要用于配置 MPU6050 的外部帧同步(FSYNC)引脚输入以及数字低通滤波器(DLPF),以此来改善传感器数据的噪声性能和采样延迟。

    名称描述配置效果
    7 - 3保留这些位为保留位,用户不应进行设置,一般默认置为 0。-
    2EXT_SYNC_SET[2:0]用于配置外部帧同步(FSYNC)引脚输入。
    - 000:无 FSYNC 输入
    - 001:FSYNC 引脚输入同步加速度计采样
    - 010:FSYNC 引脚输入同步陀螺仪 X 轴采样
    - 011:FSYNC 引脚输入同步陀螺仪 Y 轴采样
    - 100:FSYNC 引脚输入同步陀螺仪 Z 轴采样
    - 101:FSYNC 引脚输入同步温度传感器采样
    - 110:保留
    - 111:保留
    可利用外部信号对特定传感器的采样进行同步,从而保证多个传感器采样时间的一致性。
    1 - 0DLPF_CFG[1:0]用于配置数字低通滤波器(DLPF)的设置。
    - 000:带宽 260Hz,延迟 0.98ms,陀螺仪输出率 8kHz
    - 001:带宽 184Hz,延迟 2.9ms,陀螺仪输出率 1kHz
    - 010:带宽 94Hz,延迟 3.9ms,陀螺仪输出率 1kHz
    - 011:带宽 44Hz,延迟 5.9ms,陀螺仪输出率 1kHz
    - 100:带宽 21Hz,延迟 9.9ms,陀螺仪输出率 1kHz
    - 101:带宽 10Hz,延迟 17.85ms,陀螺仪输出率 1kHz
    - 110:带宽 5Hz,延迟 33.48ms,陀螺仪输出率 1kHz
    - 111:保留
    通过选择不同的滤波器配置,可以在噪声抑制和数据延迟之间进行权衡。较高的带宽会减少延迟,但可能会引入更多噪声;较低的带宽则能有效抑制噪声,但会增加数据延迟。

    MPU6050模块功能指令使用-函数封装

    1.指令寄存器的宏定义

    #define M_PI 3.14
    #define SMPLRT_DIV   0x19  // 采样率分频,典型值:0x07(125Hz) */
    #define CONFIG       0x1A  // 低通滤波频率,典型值:0x06(5Hz) */
    #define GYRO_CONFIG  0x1B  // 陀螺仪自检及测量范围,典型值:0x18(不自检,2000deg/s) */
    #define ACCEL_CONFIG 0x1C  // 加速计自检、测量范围及高通滤波频率,典型值:0x01(不自检,2G,5Hz) */
    
    #define ACCEL_XOUT_H 0x3B  // 存储最近的X轴、Y轴、Z轴加速度感应器的测量值 */
    #define ACCEL_XOUT_L 0x3C
    #define ACCEL_YOUT_H 0x3D
    #define ACCEL_YOUT_L 0x3E
    #define ACCEL_ZOUT_H 0x3F
    #define ACCEL_ZOUT_L 0x40
    
    #define TEMP_OUT_H   0x41  // 存储的最近温度传感器的测量值 */
    #define TEMP_OUT_L   0x42
    
    #define GYRO_XOUT_H  0x43  // 存储最近的X轴、Y轴、Z轴陀螺仪感应器的测量值 */
    #define GYRO_XOUT_L  0x44 
    #define GYRO_YOUT_H  0x45
    #define GYRO_YOUT_L  0x46
    #define GYRO_ZOUT_H  0x47
    #define GYRO_ZOUT_L  0x48
    
    #define PWR_MGMT_1   0x6B   // 电源管理,典型值:0x00(正常启用) */
    #define PWR_MGMT_2   0x6C   // 电源管理,典型值:0x00(正常启用) */
    #define WHO_AM_I     0x75 	// IIC地址寄存器(默认数值0x68,只读) */
    
    // HAL库的读写只需要使用7位地址
    #define MPU6050_ADDR_AD0_LOW 0x68	// AD0低电平时7位地址为0X68 iic写时许发送0XD0
    #define MPU6050_ADDR_AD0_HIGH 0x69	

    2.初始化的基本配置

            根据上面的自己配置下寄存器就好

    // MPU6050 初始化函数
    uint8_t MPU6050_Init(void) {
        IIC_Init();  // 初始化 I2C 总线
        // 唤醒 MPU6050
        IIC_Write_REG(MPU6050_ADDR_AD0_LOW, PWR_MGMT_1, 0x00); 
        HAL_Delay(100);  // 等待唤醒
    
        // 设置采样率分频
        IIC_Write_REG(MPU6050_ADDR_AD0_LOW, SMPLRT_DIV, 0x07); 
        // 设置低通滤波器
        IIC_Write_REG(MPU6050_ADDR_AD0_LOW, CONFIG, 0x06); 
        // 设置陀螺仪量程 ±250°/s
        IIC_Write_REG(MPU6050_ADDR_AD0_LOW, GYRO_CONFIG, 0x00); 
        // 设置加速度计量程 ±2g
        IIC_Write_REG(MPU6050_ADDR_AD0_LOW, ACCEL_CONFIG, 0x00); 
    
        HAL_Delay(100);  // 等待传感器稳定
        return 0;
    }

    3.获取模块ID

    // 读取 MPU6050 的设备 ID
    uint8_t MPU6050_GetDeviceID(void) {
        uint8_t data;
        data=IIC_Read_REG(MPU6050_ADDR_AD0_LOW, WHO_AM_I);  // 读取设备 ID 寄存器
    	return data;  // 返回设备 ID	
    }

    上篇文章提到过,返回设备ID

    4.获取温度

    float MPU6050_GET_Tempure(void)
    {
        uint16_t temp;  // 用于存储温度传感器数据
        uint8_t H,L;  // 用于存储高字节和低字节的数据
        H = IIC_Read_REG(MPU6050_ADDR_AD0_LOW, TEMP_OUT_H);  // 读取温度传感器高字节
        L = IIC_Read_REG(MPU6050_ADDR_AD0_LOW, TEMP_OUT_L);  // 读取温度传感器低字节
        temp = (H << 8) | L;  // 将高字节和低字节合并为一个 16 位数据
        return (float)temp / 340.0 + 36.53-200;  // 计算温度值并返回
    }

    手册上是没有-200的,但是我的温度都显示两百多,减去200后看起来正常,大家根据具体情况把这个-200修改,补偿值修改到正常

    5.获取X轴加速度

    float MPU6050_GetAccelX(void) {
        int16_t accel;  // 用于存储加速度传感器数据
        uint8_t H,L;  // 用于存储高字节和低字节的数据
        H = IIC_Read_REG(MPU6050_ADDR_AD0_LOW, ACCEL_XOUT_H);  // 读取加速度传感器 X 轴高字节
        L = IIC_Read_REG(MPU6050_ADDR_AD0_LOW, ACCEL_XOUT_L);  // 读取加速度传感器 X 轴低字节
        accel = (H << 8) | L;  // 将高字节和低字节合并为一个 16 位数据
        return (float)accel / 16384.0;  // 计算加速度值并返回
    }

    6.获取Y轴加速度

    float MPU6050_GetAccelY(void) {
        int16_t accel;  // 用于存储加速度传感器数据
        uint8_t H,L;  // 用于存储高字节和低字节的数据
        H = IIC_Read_REG(MPU6050_ADDR_AD0_LOW, ACCEL_YOUT_H);  // 读取加速度传感器 Y 轴高字节
        L = IIC_Read_REG(MPU6050_ADDR_AD0_LOW, ACCEL_YOUT_L);  // 读取加速度传感器 Y 轴低字节
        accel = (H << 8) | L;  // 将高字节和低字节合并为一个 16 位数据
        return (float)accel / 16384.0;  // 计算加速度值并返回	
    }

    7.获取z轴加速度

    float MPU6050_GetAccelZ(void) {
        int16_t accel;  // 用于存储加速度传感器数据
        uint8_t H,L;  // 用于存储高字节和低字节的数据
        H = IIC_Read_REG(MPU6050_ADDR_AD0_LOW, ACCEL_ZOUT_H);  // 读取加速度传感器 Z 轴高字节
        L = IIC_Read_REG(MPU6050_ADDR_AD0_LOW, ACCEL_ZOUT_L);  // 读取加速度传感器 Z 轴低字节
        accel = (H << 8) | L;  // 将高字节和低字节合并为一个 16 位数据
        return (float)accel / 16384.0;  // 计算加速度值并返回
    }

    8.获取x的角度

    float MPU6050_GetAngleX(void) {
        int16_t gyro;  // 用于存储陀螺仪数据
        uint8_t H,L;  // 用于存储高字节和低字节的数据
        H = IIC_Read_REG(MPU6050_ADDR_AD0_LOW, GYRO_XOUT_H);  // 读取陀螺仪 X 轴高字节
        L = IIC_Read_REG(MPU6050_ADDR_AD0_LOW, GYRO_XOUT_L);  // 读取陀螺仪 X 轴低字节
        gyro = (H << 8) | L;  // 将高字节和低字节合并为一个 16 位数据
        return (float)gyro / 131.0;  // 计算角速度值并返回	
    }

    9.获取y的角度

    float MPU6050_GetAngleY(void) {
        int16_t gyro;  // 用于存储陀螺仪数据
        uint8_t H,L;  // 用于存储高字节和低字节的数据
        H = IIC_Read_REG(MPU6050_ADDR_AD0_LOW, GYRO_YOUT_H);  // 读取陀螺仪 Y 轴高字节
        L = IIC_Read_REG(MPU6050_ADDR_AD0_LOW, GYRO_YOUT_L);  // 读取陀螺仪 Y 轴低字节
        gyro = (H << 8) | L;  // 将高字节和低字节合并为一个 16 位数据
        return (float)gyro / 131.0;  // 计算角速度值并返回
    }

    10.获取z轴角度

    float MPU6050_GetAngleZ(void) {
        int16_t gyro;  // 用于存储陀螺仪数据
        uint8_t H,L;  // 用于存储高字节和低字节的数据
        H = IIC_Read_REG(MPU6050_ADDR_AD0_LOW, GYRO_ZOUT_H);  // 读取陀螺仪 Z 轴高字节
        L = IIC_Read_REG(MPU6050_ADDR_AD0_LOW, GYRO_ZOUT_L);  // 读取陀螺仪 Z 轴低字节
        gyro = (H << 8) | L;  // 将高字节和低字节合并为一个 16 位数据
        return (float)gyro / 131.0;  // 计算角速度值并返回
    }

    完整代码

    .c

    #include "MPU6050.h"
    #include "math.h"
    #include "SOFT_IIC.h"
    #include <stdio.h>
    // MPU6050 初始化函数
    uint8_t MPU6050_Init(void) {
        IIC_Init();  // 初始化 I2C 总线
        // 唤醒 MPU6050
        IIC_Write_REG(MPU6050_ADDR_AD0_LOW, PWR_MGMT_1, 0x00); 
        HAL_Delay(100);  // 等待唤醒
    
        // 设置采样率分频
        IIC_Write_REG(MPU6050_ADDR_AD0_LOW, SMPLRT_DIV, 0x07); 
        // 设置低通滤波器
        IIC_Write_REG(MPU6050_ADDR_AD0_LOW, CONFIG, 0x06); 
        // 设置陀螺仪量程 ±250°/s
        IIC_Write_REG(MPU6050_ADDR_AD0_LOW, GYRO_CONFIG, 0x00); 
        // 设置加速度计量程 ±2g
        IIC_Write_REG(MPU6050_ADDR_AD0_LOW, ACCEL_CONFIG, 0x00); 
    
        HAL_Delay(100);  // 等待传感器稳定
        return 0;
    }
    
    // 读取 MPU6050 的设备 ID
    uint8_t MPU6050_GetDeviceID(void) {
        uint8_t data;
        data=IIC_Read_REG(MPU6050_ADDR_AD0_LOW, WHO_AM_I);  // 读取设备 ID 寄存器
    	return data;  // 返回设备 ID	
    }
    
    float MPU6050_GET_Tempure(void)
    {
        int16_t temp;  // 用于存储温度传感器数据
        uint8_t H,L;  // 用于存储高字节和低字节的数据
        H = IIC_Read_REG(MPU6050_ADDR_AD0_LOW, TEMP_OUT_H);  // 读取温度传感器高字节
        L = IIC_Read_REG(MPU6050_ADDR_AD0_LOW, TEMP_OUT_L);  // 读取温度传感器低字节
        temp = (H << 8) | L;  // 将高字节和低字节合并为一个 16 位数据
        return (float)temp / 340.0 + 36.53-200;  // 计算温度值并返回
    }
    
    float MPU6050_GetAccelX(void) {
        int16_t accel;  // 用于存储加速度传感器数据
        uint8_t H,L;  // 用于存储高字节和低字节的数据
        H = IIC_Read_REG(MPU6050_ADDR_AD0_LOW, ACCEL_XOUT_H);  // 读取加速度传感器 X 轴高字节
        L = IIC_Read_REG(MPU6050_ADDR_AD0_LOW, ACCEL_XOUT_L);  // 读取加速度传感器 X 轴低字节
        accel = (H << 8) | L;  // 将高字节和低字节合并为一个 16 位数据
        return (float)accel / 16384.0;  // 计算加速度值并返回
    }
    
    float MPU6050_GetAccelY(void) {
        int16_t accel;  // 用于存储加速度传感器数据
        uint8_t H,L;  // 用于存储高字节和低字节的数据
        H = IIC_Read_REG(MPU6050_ADDR_AD0_LOW, ACCEL_YOUT_H);  // 读取加速度传感器 Y 轴高字节
        L = IIC_Read_REG(MPU6050_ADDR_AD0_LOW, ACCEL_YOUT_L);  // 读取加速度传感器 Y 轴低字节
        accel = (H << 8) | L;  // 将高字节和低字节合并为一个 16 位数据
        return (float)accel / 16384.0;  // 计算加速度值并返回	
    }
    
    float MPU6050_GetAccelZ(void) {
        int16_t accel;  // 用于存储加速度传感器数据
        uint8_t H,L;  // 用于存储高字节和低字节的数据
        H = IIC_Read_REG(MPU6050_ADDR_AD0_LOW, ACCEL_ZOUT_H);  // 读取加速度传感器 Z 轴高字节
        L = IIC_Read_REG(MPU6050_ADDR_AD0_LOW, ACCEL_ZOUT_L);  // 读取加速度传感器 Z 轴低字节
        accel = (H << 8) | L;  // 将高字节和低字节合并为一个 16 位数据
        return (float)accel / 16384.0;  // 计算加速度值并返回
    }
    
    float MPU6050_GetAngleX(void) {
        int16_t gyro;  // 用于存储陀螺仪数据
        uint8_t H,L;  // 用于存储高字节和低字节的数据
        H = IIC_Read_REG(MPU6050_ADDR_AD0_LOW, GYRO_XOUT_H);  // 读取陀螺仪 X 轴高字节
        L = IIC_Read_REG(MPU6050_ADDR_AD0_LOW, GYRO_XOUT_L);  // 读取陀螺仪 X 轴低字节
        gyro = (H << 8) | L;  // 将高字节和低字节合并为一个 16 位数据
        return (float)gyro / 131.0;  // 计算角速度值并返回	
    }
    
    float MPU6050_GetAngleY(void) {
        int16_t gyro;  // 用于存储陀螺仪数据
        uint8_t H,L;  // 用于存储高字节和低字节的数据
        H = IIC_Read_REG(MPU6050_ADDR_AD0_LOW, GYRO_YOUT_H);  // 读取陀螺仪 Y 轴高字节
        L = IIC_Read_REG(MPU6050_ADDR_AD0_LOW, GYRO_YOUT_L);  // 读取陀螺仪 Y 轴低字节
        gyro = (H << 8) | L;  // 将高字节和低字节合并为一个 16 位数据
        return (float)gyro / 131.0;  // 计算角速度值并返回
    }
    
    float MPU6050_GetAngleZ(void) {
        int16_t gyro;  // 用于存储陀螺仪数据
        uint8_t H,L;  // 用于存储高字节和低字节的数据
        H = IIC_Read_REG(MPU6050_ADDR_AD0_LOW, GYRO_ZOUT_H);  // 读取陀螺仪 Z 轴高字节
        L = IIC_Read_REG(MPU6050_ADDR_AD0_LOW, GYRO_ZOUT_L);  // 读取陀螺仪 Z 轴低字节
        gyro = (H << 8) | L;  // 将高字节和低字节合并为一个 16 位数据
        return (float)gyro / 131.0;  // 计算角速度值并返回
    }

    .h

    #ifndef __MPU6050_H
    #define __MPU6050_H
    
    #include "main.h"
    #define M_PI 3.14
    #define SMPLRT_DIV   0x19  // 采样率分频,典型值:0x07(125Hz) */
    #define CONFIG       0x1A  // 低通滤波频率,典型值:0x06(5Hz) */
    #define GYRO_CONFIG  0x1B  // 陀螺仪自检及测量范围,典型值:0x18(不自检,2000deg/s) */
    #define ACCEL_CONFIG 0x1C  // 加速计自检、测量范围及高通滤波频率,典型值:0x01(不自检,2G,5Hz) */
    
    #define ACCEL_XOUT_H 0x3B  // 存储最近的X轴、Y轴、Z轴加速度感应器的测量值 */
    #define ACCEL_XOUT_L 0x3C
    #define ACCEL_YOUT_H 0x3D
    #define ACCEL_YOUT_L 0x3E
    #define ACCEL_ZOUT_H 0x3F
    #define ACCEL_ZOUT_L 0x40
    
    #define TEMP_OUT_H   0x41  // 存储的最近温度传感器的测量值 */
    #define TEMP_OUT_L   0x42
    
    #define GYRO_XOUT_H  0x43  // 存储最近的X轴、Y轴、Z轴陀螺仪感应器的测量值 */
    #define GYRO_XOUT_L  0x44 
    #define GYRO_YOUT_H  0x45
    #define GYRO_YOUT_L  0x46
    #define GYRO_ZOUT_H  0x47
    #define GYRO_ZOUT_L  0x48
    
    #define PWR_MGMT_1   0x6B   // 电源管理,典型值:0x00(正常启用) */
    #define PWR_MGMT_2   0x6C   // 电源管理,典型值:0x00(正常启用) */
    #define WHO_AM_I     0x75 	// IIC地址寄存器(默认数值0x68,只读) */
    
    // HAL库的读写只需要使用7位地址
    #define MPU6050_ADDR_AD0_LOW 0x68	// AD0低电平时7位地址为0X68 iic写时时发送0XD0
    #define MPU6050_ADDR_AD0_HIGH 0x69	
    
    // 函数声明
    uint8_t MPU6050_Init(void);
    uint8_t MPU6050_GetDeviceID(void);
    float MPU6050_GET_Tempure(void);
    float MPU6050_GetAccelX(void);
    float MPU6050_GetAccelY(void);
    float MPU6050_GetAccelZ(void);
    float MPU6050_GetAngleX(void);
    float MPU6050_GetAngleY(void);
    float MPU6050_GetAngleZ(void);
    
    #endif
    

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

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

    相关文章

    springboot2.7.x整合nacos+seata

    1、nacos及seata下载地址 Nacos Server 下载 | Nacos 官网 Seata Java Download | Apache Seata 这里的seata版本用2.1.0版本。 2、启动nacos D:\本地-seata-nacos\nacos-server\bin>startup.cmd -m standalone 3、修改seata的conf下的application的内容 这里的数据库…

    为 IDEA 设置管理员权限

    IDEA 安装目录 兼容性选择管理员身份运行程序 之后 IDEA 中的操作&#xff08;包括终端中的操作&#xff09;都是管理员权限的了

    单片机学习笔记8.定时器

    IAP15W4K58S4定时/计数器结构工作原理 定时器工作方式控制寄存器TMOD 不能进行位寻址&#xff0c;只能对整个寄存器进行赋值 寄存器地址D7D6D5D4D3D2D1D0复位值TMOD89HGATEC/(T低电平有效)M1M0GATEC/(T低电平有效)M1M000000000B D0-D3为T0控制&#xff0c;D4-D7为T1控制 GAT…

    vue3实现markdown预览和编辑

    Markdown作为一种轻量级标记语言&#xff0c;已经成为开发者编写文档的首选工具之一。在Vue3项目中集成Markdown编辑和预览功能可以极大地提升内容管理体验。本文将介绍如何使用Vditor这一强大的开源Markdown编辑器在Vue3项目中实现这一功能。 一、Vditor简介 Vditor是一款浏…

    高并发秒杀系统接入层如何设计

    博主介绍&#xff1a;✌全网粉丝5W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…

    C++异常处理 throw try catch

    C 异常处理概述 C 异常处理机制提供了一种在程序运行时捕获错误或异常情况的方式。异常处理的目的是使得程序在遇到错误时能够优雅地终止或恢复&#xff0c;并防止程序出现崩溃。C 使用 try, throw, 和 catch 关键字来实现异常处理。 异常处理的基本结构&#xff1a; throw: …

    纯css实现环形进度条

    需要在中实现一个定制化的环形进度条&#xff0c;最终效果如图&#xff1a; 使用代码 <divclass"circular-progress":style"{--progress: nextProgress,--color: endSliderColor,--size: isFull ? 60rpx : 90rpx,}"><div class"inner-conte…

    0基础 | 硬件 | 电源系统 一

    降压电路LDO 几乎所有LDO都是基于此拓扑结构 图 拓扑结构 LDO属于线性电源&#xff0c;通过控制开关管的导通程度实现稳压&#xff0c;输出纹波小&#xff0c;无开关噪声 线性电源&#xff0c;IoutIin&#xff0c;发热功率P电压差△U*电流I&#xff0c;转换效率Vo/Vi LDO不适…

    获取KUKA机器人诊断文件KRCdiag的方法

    有时候在进行售后问题时需要获取KUKA机器人的诊断文件KRCdiag&#xff0c;通过以下方法可以获取KUKA机器人的诊断文件KRCdiag&#xff1a; 1、将U盘插到控制柜内的任意一个USB接口&#xff1b; 2、依次点【主菜单】—【文件】—【存档】—【USB&#xff08;控制柜&#xff09…

    一周学会Pandas2 Python数据处理与分析-NumPy数据类型

    锋哥原创的Pandas2 Python数据处理与分析 视频教程&#xff1a; 2025版 Pandas2 Python数据处理与分析 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili NumPy 提供了丰富的数据类型&#xff08;dtypes&#xff09;&#xff0c;主要用于高效数值计算。以下是 NumPy 的主要…

    Redis核心机制-缓存、分布式锁

    目录 缓存 缓存更新策略 定期生成 实时生成 缓存问题 缓存预热&#xff08;Cache preheating&#xff09; 缓存穿透&#xff08;Cache penetration&#xff09; 缓存雪崩&#xff08;Cache avalanche&#xff09; 缓存击穿&#xff08;Cache breakdown&#xff09; 分…

    如何在Ubuntu上安装Dify

    如何在Ubuntu上安装Dify 如何在Ubuntu上安装docker 使用apt安装 # Add Dockers official GPG key: sudo apt-get update sudo apt-get install ca-certificates curl sudo install -m 0755 -d /etc/apt/keyrings sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg…

    Python FastApi(13):APIRouter

    如果你正在开发一个应用程序或 Web API&#xff0c;很少会将所有的内容都放在一个文件中。FastAPI 提供了一个方便的工具&#xff0c;可以在保持所有灵活性的同时构建你的应用程序。假设你的文件结构如下&#xff1a; . ├── app # 「app」是一个 Python 包…

    【算法竞赛】状态压缩型背包问题经典应用(蓝桥杯2019A4分糖果)

    在蓝桥杯中遇到的这道题&#xff0c;看上去比较普通&#xff0c;但其实蕴含了很巧妙的“状态压缩 背包”的思想&#xff0c;本文将从零到一&#xff0c;详细解析这个问题。 目录 一、题目 二、思路分析&#xff1a;状态压缩 最小覆盖 1. 本质&#xff1a;最小集合覆盖问题…

    常微分方程 1

    slow down and take your time 定积分应用回顾常微分方程的概述一阶微分方程可分离变量齐次方程三阶线性微分方程 一阶线性微分方程不定积分的被积分函数出现了绝对值梳理微分方程的基本概念题型 1 分离变量题型 2 齐次方程5.4 题型 3 一阶线性微分方程知识点5.55.6 尾声 定积分…

    Web前端页面搭建

    1.在D盘中创建www文件 cmd进入窗口命令windowsR 切换盘符d: 进入创建的文件夹 在文件夹里安装tp框架 在PS中打开tp文件 创建网站&#xff0c;根目录到public 在浏览器中打开网页 修改文件目录名称 在public目录中的。htaccess中填写下面代码 <IfModule mod_rewrite.c >…

    开源 LLM 应用开发平台 Dify 全栈部署指南(Docker Compose 方案)

    开源 LLM 应用开发平台 Dify 全栈部署指南&#xff08;Docker Compose 方案&#xff09; 一、部署环境要求与前置检查 1.1 硬件最低配置 组件要求CPU双核及以上内存4GB 及以上磁盘空间20GB 可用空间 1.2 系统兼容性验证 ✅ 官方支持系统&#xff1a; Ubuntu 20.04/22.04 L…

    BN 层的作用, 为什么有这个作用?

    BN 层&#xff08;Batch Normalization&#xff09;——这是深度神经网络中非常重要的一环&#xff0c;它大大改善了网络的训练速度、稳定性和收敛效果。 &#x1f9e0; 一句话理解 BN 层的作用&#xff1a; Batch Normalization&#xff08;批归一化&#xff09;通过标准化每一…

    金仓数据库KCM认证考试介绍【2025年4月更新】

    KCM&#xff08;金仓认证大师&#xff09;认证是金仓KES数据库的顶级认证&#xff0c;学员需通过前置KCA、KCP认证才能考KCM认证。 KCM培训考试一般1-2个月一次&#xff0c;KCM报名费原价为1.8万&#xff0c;当前优惠价格是1万&#xff08;趋势是&#xff1a;费用越来越高&…

    如何通过句块训练法(Chunks)提升英语口语

    真正说一口流利英语的人&#xff0c;并不是会造句的人&#xff0c;而是擅长“调取句块”的人。下面我们从原理、方法、场景、资源几个维度展开&#xff0c;告诉你怎么用“句块训练法&#xff08;Chunks&#xff09;”快速提升英语口语&#xff1a; 一、什么是“句块”&#xff…