YuanHub 源码分析【二】全局变量与调试

情系淮思:五款车规MCU横向对比与VCU选型 本文对比五款车规MCU中的S32K312与S32K324,聚焦核心架构、存储、通信及安全特性。S32K324为双核160MHz Cortex-M7,内存、外设(如以太网、QuadSPI、SAI)全面升级,支持高实时并行处理与复杂应用;而S32K312为单核120MHz,适用于中端车身控制。两者均满足ASIL B功能安全,具备完整安全引擎。选型建议:中端用S32K312,高端复杂系统优选S32K324。 阅读详情

一、Simulink 的参数结构体

1.1 概述

对于 YuanHub 项目来说,每一个功能均由一个 Simulink 实现。

其 Simulink 仿真文件目录如下:

simulink_project/
├── simulink_project.prj        ← MATLAB 工程定义文件
├── architecture/               ← 系统架构模型
├── controller/                 ← 控制器模型(核心)
├── data/                       ← 模型数据字典
├── lib/                        ← Simulink 自定义库
├── module_code_gen/            ← 代码生成入口模型
├── plant/                      ← 被控对象(电机/传感器)模型
├── resources/                  ← MATLAB 工程资源/元数据
├── simulation/                 ← 独立仿真模型
├── test_harness/               ← 测试台架
├── utilities/                  ← 工具脚本
└── work/                       ← 工作/缓存目录

本文不关心别的文件夹,我们只讨论 controller/ 目录下的 Simulink 仿真文件:

controller/                       ← 控制器模型(核心)
├── csp_planning.slx              ← 同步位置模式 (CSP) 规划模型
├── cst_planning.slx              ← 同步力矩模式 (CST) 规划模型
├── csv_planning.slx              ← 同步速度模式 (CSV) 规划模型
├── current_ctl_loop_task.slx     ← 电流环控制任务模型
├── database_init.slx             ← 数据库/参数初始化模型
├── direction_id.slx              ← 电机方向辨识模型
├── elec_angle_id.slx             ← 电气角度/零位辨识模型
├── input_shaping_ei.slx          ← 输入整形 (Input Shaping) 滤波模型
├── linear_trajectory_planning.slx ← 线性轨迹规划模型
├── load_pos_sensor.slx           ← 负载端位置传感器处理模型
├── math_lib.slx                  ← 控制算法通用数学库
├── mit_ctl.slx                   ← MIT 力控模式模型
├── motor_ctl_sm.slx              ← 电机控制状态机模型
├── motor_pos_sensor.slx          ← 电机端位置传感器处理模型
├── notch_filter.slx              ← 陷波滤波器 (Notch Filter) 模型
├── notch_filter_config_set.slx   ← 陷波器配置参数设置模型
├── pole_pairs_id.slx             ← 电机极对数辨识模型
├── pos_speed_ctl_pip.slx         ← 位置/速度环 PI 控制器模型
├── pos_trajectory_planning.slx   ← 位置轨迹规划模型
├── protect_check.slx             ← 安全保护/故障检测模型
├── reciprocal_motion.slx         ← 往复运动控制模型
├── reference_signal.slx          ← 给定信号发生器模型
├── set_notch_filter_config.slx   ← 陷波器在线配置模型
├── speed_obs_pll.slx             ← 基于 PLL 的速度观测器模型
└── tq_fc_id.slx                  ← 扭矩/摩擦力辨识模型

在这个目录下的每一个 Simulink 仿真文件,均代表一个功能,它将被我们的 YuanHub 功能直接使用。

以电流环模型举例:

每一个模型均有 input、config 和 output 三个结构体,供每个独立模型使用。

在下文我们会举例几个较为常用的结构体,下面所有的结构体定义均在目录:

servo_hub-master\simulink_code_gen\servo_hub_database_type.h

1.2 总结构体

结构体作用
Axis顶层总结构体,包含下面所有子结构体,是整个控制层的数据接口
AxisDw顶层内部工作状态(DW = Data Work),存放各模块的运行时中间变量

代码:

1.3 电机参数

结构体作用
PmsmConfigPMSM 电机物理参数:极对数、电阻、电感 (Ld/Lq)、惯量、磁链、额定/峰值电流、最大转速、编码器分辨率、转矩常数、控制环周期等

代码:

1.4 电流环控制

1.4.1 模型外观

电流环的模型是:current_ctl_loop_task

我们可见每一个模型均有 input、config 和 output 三个结构体:

1.4.2 配置信息

其中输入输出和配置的结构体名分别为:

类型结构体作用
配置类CurrentCtlConfig电流环配置:PI 增益(kp/ki)、死区补偿电压、采样噪声、PWM 占空比上限、电角度补偿、UVW 相序方向
输入CurrentCtlInput电流环输入:目标 id/iq 电流、三相实测电流、电角度、母线电压、控制模式、驱动器温度、电角速度
输出CurrentCtlOutput电流环输出:补偿后目标三相电压 uabc、当前 dq 轴电流、补偿前目标三相电压

1.4.3 CurrentCtlConfig

typedef struct
{
    /* 电流采样噪声绝对值 */
    real32_T i_noise_A;

    /* 死区补偿电压大小 */
    real32_T comp_du_V;

    /* 电流环目标带宽 % */
    real32_T bandwidth_percentage;

    /* 电流环运行周期 */
    real32_T dt_s;

    /* 磁链系数 */
    real32_T flux_wb;

    /* d轴 kp控制增益 */
    real32_T kp_ld;

    /* d轴 ki控制增益 */
    real32_T ki_ld;

    /* q轴 kp控制增益 */
    real32_T kp_lq;

    /* q轴 ki控制增益 */
    real32_T ki_lq;

    /* pwm 占空比最大值 */
    real32_T pwm_duty_cycle_max;

    /* 电角度补偿系数 */
    real32_T elec_angle_compensation;

    /* UVW相序 */
    int8_T phase_dir;
}

CurrentCtlConfig;

1.4.4 CurrentCtlInput

typedef struct
{
    /* 目标id iq 电流 */
    real32_T idq_tar_A[2];

    /* iabc 三相当前电流反馈 */
    real32_T iabc_now_A[3];

    /* 当前电角度 */
    real32_T elec_theta_rad;

    /* 当前母线电压 */
    real32_T dc_bus_now_V;

    /* 电流环控制模式 */
    uint8_T mode;

    /* 三相目标电压 */
    real32_T uabc_tar_V[3];

    /* 驱动器当前温度 */
    real32_T driver_temp;

    /* 电角速度 */
    real32_T elec_angle_speed_rad_s;

    /* iq 目标电流偏置 */
    real32_T iq_offset_A;
}

CurrentCtlInput;

1.4.5 CurrentCtlOutput

typedef struct
{
    /* 死区补偿后目标三相电压 */
    real32_T uabc_tar_comp_V[3];

    /* 当前dq轴电流 */
    real32_T idq_now_A[2];

    /* 补偿前目标三相电压 */
    real32_T uabc_tar_org_V[3];
}

CurrentCtlOutput;

1.5 位置速度环控制

结构体作用
配置类PosSpeedCtlConfig位置速度环配置:位置环 Kp、速度环 Kp/Ki、前馈系数(aff/vff)、惯性系数 J/Kt、运行周期、扰动观测器带宽及使能、动态积分使能
输入PosSpeedCtlInput位置速度环输入:目标位置、当前位置、目标速度、目标加速度、当前转速、最大 q 轴电流、位置/速度偏置
输出PosSpeedCtlOutput位置速度环输出:目标 q 轴电流、位置跟随误差、负载扰动补偿电流

1.6 电机编码器

结构体作用
配置类MotorPosSensorConfig电机侧编码器配置:分辨率、初始位置、极对数、电角度偏移值、计数方向
输入MotorPosSensorInput电机侧编码器输入:当前单圈脉冲数
输出MotorPosSensorOutput电机侧编码器输出:累计脉冲值、当前电角度

1.7 速度观测器

结构体作用
配置类SpeedObsPllConfigPLL 速度观测器配置:运行周期、观测带宽、编码器分辨率倒数、最大速度限制
输入SpeedObsPllInput速度观测器输入:电机当前位置
输出SpeedObsPllOutput速度观测器输出:观测转速(rad/s)

1.8 错报与状态机

结构体作用
配置类MotorCtlSmConfig控制状态机配置:运行模式、欠压/过压/过速/欠温/过温/过流/位置跟随误差保护阈值、保护使能位掩码
输入MotorCtlSmInput状态机输入:电机使能指令、硬件就绪状态
输出MotorCtlSmOutput状态机输出:运行状态(使能/失能/错误)、错误码、警告码、当前模式、上一周期状态

1.9 MIT 控制模式

结构体作用
配置类MitCtlConfigMIT 控制配置:位置刚度 Kp、速度阻尼 Kd、编码器分辨率倒数、转矩常数
输入MitCtlInputMIT 控制输入:前馈力矩、目标/当前位置、目标/当前速度、最大 q 轴电流
输出MitCtlOutputMIT 控制输出:目标 q 轴电流

1.10 其他

其他的结构体不再赘述

二、伺服本体参数数据库

2.1 概述

除 Simulink 所使用的参数之外,还有 YuanHub 所本身使用的全局变量。这也就是我们的参数数据库,或称对象字典。

其全部的结构定义在下目录中:

servo_hub-master\database\data_param.h

2.2 指令层

上位机/用户下发的控制指令

结构体功能概述
AppControlWord主控制字 + 运行中暂停命令,驱动状态机转换(使能/停机等)
AppOpMode设定目标运行模式(PP/PV/PT/Homing/MIT 等)
AppMotionParam各模式的运动目标值与轮廓参数(位置/速度/力矩目标、加减速、回零参数、MIT参数、插值时间等)
SystemCmd系统级命令(复位/重启等)
EncoderCalibrationCmd编码器校准控制字和校准时间

2.3 反馈层

设备实时状态上报

结构体功能概述
AppStatusInfo设备综合状态:状态字、错误字、告警字、母线电压、温度、功率、IO状态、抱闸、当前模式、版本
AppMotionInfo运动实时数据:负载端/电机端的位置、速度、力矩、电流的指令值与反馈值,三相电流、控制环耗时/周期、回零状态等
SystemStatus参数存储状态反馈 + Flash 存储命令
EncoderCalibrationStatus编码器校准过程状态反馈
HistoricalInfo16条历史错误记录,用于故障追溯

2.4 配置层

系统/硬件/保护参数

结构体功能概述
AppEncoderConfig编码器类型、分辨率、RPM⇔pps 及负载⇔电机端转换系数
AppBaseConfig运动极性、回零偏移、CAN通信、快速停机、抱闸全套参数、数字IO输出
AppMotorConfig电机物理参数:额定/峰值电流、力矩、极对数、转速、电阻/电感、减速比、惯量
AppProtectConfig保护阈值:欠压/过压、过载/过流、过速、驱动器/电机/MCU温度报错与警告阈值、CAN超时
AppRestrictParam运动安全限制:位置溢出/软件限位、速度/加速度/电流上限、限位使能
AppWindowParam检测窗口:位置跟随误差、位置到达、速度到达、零速检测的窗口值与超时时间
AppPermissionConfig控制权限:通信控制权限 / 内部控制权限切换
AppMavlinkConfigMAVLink 协议的系统ID和组件ID

2.5 辅助层

调试/标识/心跳

结构体功能概述
HeartBit系统初始化完成标志,用于启动握手/心跳检测
CustomInfo用户模型编码,标识自定义模块
AppDebugParam48个临时调试变量(16×float + 16×uint32 + 16×int32),供开发阶段使用

2.7 调试所常用的结构体

2.7.1 AppStatusInfo

typedef struct
{
    uint32_t Statusword; //状态字
    uint32_t Error_word; //错误字
    float DC_link_circuit_voltage; //母线电压当前值
    float Drive_accumulated_heat; //驱动器热量累计值
    float Drive_temperature; //驱动器当前温度
    uint32_t Alarm_word; //告警字
    int8_t Modes_of_operation_display; //当前模式
    uint32_t Version; //软件版本
    float Motor_temperature; //电机当前温度
    float Motor_power; //电机当前功率
    float Mcu_temperature; //Mcu当前温度
    uint32_t Digital_io_inputs_status; //数字IO输入状态
    uint8_t Brake_state; //抱闸状态
}AppStatusInfo;

2.7.2 AppMotionInfo

typedef struct
{
    int64_t Position_demand_value; //负载端位置指令值
    int64_t Position_actual_value_inc; //负载端内部位置当前值
    int64_t Position_actual_value; //负载端位置当前值
    int64_t Following_error_actual_value; //负载端位置误差值
    float Velocity_demand_value; //负载端速度指令值
    float Velocity_actual_value; //负载端速度当前值
    float Torque_demand_value; //力矩指令值
    float Torque_actual_value; //力矩当前值
    float Current_actual_value; //电流当前值
    float D_current_actual_value; //d轴电流当前值
    float U_current_actual_value; //U相当前电流
    float V_current_actual_value; //V相当前电流
    float W_current_actual_value; //W相当前电流
    int64_t Motor_position_demand_value; //电机端位置指令值
    int64_t Motor_position_actual_value; //电机端位置当前值
    int64_t Motor_following_error_actual_value; //电机端位置误差值
    float Motor_velocity_demand_value; //电机端速度指令值
    float Motor_velocity_actual_value; //电机端速度当前值
    uint16_t U_adc_mid_val; //U相电流校准值
    uint16_t V_adc_mid_val; //V相电流校准值
    uint16_t W_adc_mid_val; //W相电流校准值
    float Current_loop_time; //电流环耗时
    float Position_loop_time; //位置环耗时
    float Current_loop_cycle; //电流环周期
    float Position_loop_cycle; //位置环周期
    float Interp_period; //插值时间周期
    uint8_t Emergency_brake_requested; //紧急制动请求值
    uint8_t Target_update_state; //目标值更新状态
    int8_t Homing_step; //回零步骤
    uint8_t Encoder_zero_crossing_state; //编码器过零点状态
    int8_t Homing_state; //回零状态
}AppMotionInfo;

三、BspData 结构体

3.1 概述

kBspData 就是硬件层与控制算法层之间的数据桥梁——ADC 采样结果写进来,bsp_api.c 中的各种 bsp_get / bsp_set 函数读写它,控制环路(电流环、位置环)通过这些接口获取传感器数据并输出控制量。

3.2 结构与释义

typedef struct
{
    uint16_t adc1_raw_buffer[3];
    uint16_t adc2_raw_buffer[3];
    uint16_t adc3_raw_buffer[3];
    float dc_bus_voltage_val;
    float dc_bus_current_val;
    float motor_temp_val;
    float mos_temp_val;
    float mcu_temp[3];
    volatile float uvw_current[3];
    volatile float uvw_target_voltage[3];
    bool pwm_en_state;
    bool pwm_ready_state;
    uint32_t pwm_state_cnt;
    uint16_t brake_pwm_timer_psc;         // PWM抱闸IO输出定时器预分频值
    uint32_t brake_pwm_timer_arr;         // PWM抱闸IO输出定时器自动重装载值
    uint32_t brake_pwm_duty_ccr_tar;      // 抱闸PWM占空比对应CCR目标值
    uint32_t brake_pwm_duty_ccr_action;   // 抱闸PWM占空比对应CCR动作值
    uint32_t brake_pwm_duty_ccr_hold;     // 抱闸PWM占空比对应CCR保持值
    bool pl_start_state;
    BspCyclicSync cs;
} BspData;

含义如下:

成员变量用途描述
adc1/2/3_raw_buffer[3]3路 ADC 的 DMA 原始采样缓冲区(母线电压/电流、MOS温度、MCU温度等)
dc_bus_voltage_val母线电压值 (V)
dc_bus_current_val母线电流值 (A)
motor_temp_val / mos_temp_val / mcu_temp[3]电机温度、MOS温度、MCU温度
uvw_current[3]UVW 三相实时电流 (A),volatile 修饰
uvw_target_voltage[3]UVW 三相目标电压 (V),volatile 修饰
pwm_en_state / pwm_ready_state / pwm_state_cntPWM 使能状态、就绪状态及计数
brake_pwm_*抱闸 PWM 控制参数(预分频、ARR、占空比CCR目标/动作/保持值)
pl_start_state位置环是否已启动标志
cs (BspCyclicSync)EtherCAT 同步周期模式控制参数(DC/SM同步)

3.2 结构体内参数被赋值的过程

3.2.1 读取母线电压

/**
 * @brief 读取母线电压
 * @return float 母线电压,单位V
 */
float bsp_get_dc_bus_voltage(void)
{
#ifdef VIRTUAL_MOTOR_MODEL
    return kAxis.sim_plant_output.dc_bus_V;
#else
    kBspData.dc_bus_voltage_val = (float)kBspData.adc1_raw_buffer[DC_BUS_VOLTAGE_RANK1_INDEX] *
                                      DC_BUS_ADC_VOLTAGE_K +
                                  DC_BUS_ADC_VOLTAGE_BIAS;

    return kBspData.dc_bus_voltage_val;
#endif
}

3.2.2 读取母线电流

/**
 * @brief 读取母线电流
 * @return float 母线电流,单位A
 */
float bsp_get_dc_bus_current(void)
{
#ifdef VIRTUAL_MOTOR_MODEL
    return 0;
#else
    kBspData.dc_bus_current_val = (float)(kBspData.adc1_raw_buffer[DC_BUS_CURRENT_RANK2_INDEX] -
                                          UVW_CURRENT_MID_VAL) *
                                      DC_BUS_CURRENT_SAMP_ADC_K +
                                  DC_BUS_ADC_CURRENT_BIAS;

    return kBspData.dc_bus_current_val;
#endif
}

3.2.3 读取电机当前温度

/**
 * @brief 读取电机当前温度
 * @return float 电机温度,单位摄氏度
 */
float bsp_get_motor_temp(void)
{
#ifdef VIRTUAL_MOTOR_MODEL
    float temp = (float)(rand() % 201 - 100) / 10.0f;
    return 48.0f + temp;
#else
    kBspData.motor_temp_val = (float)kBspData.adc3_raw_buffer[TEMP_MOTOR_RANK2_INDEX] *
                                  MOTOR_TO_IN_VOLTAGE_RATIO * MOTOR_TEMP_SENSOR_K +
                              MOTOR_TEMP_SENSOR_BIAS;

    return kBspData.motor_temp_val;
#endif
}

3.2.4 读取 mos 当前温度

/**
 * @brief 读取mos当前温度
 * @return float mos温度,单位摄氏度
 */
float bsp_get_mos_temperature(void)
{
#ifdef VIRTUAL_MOTOR_MODEL
    return 25.0f;
#else
    float temp_mv = (float)kBspData.adc2_raw_buffer[TEMP_MOS_RANK1_INDEX] * MOS_TEMP_VOLTAGE_K;
    kBspData.mos_temp_val = (temp_mv - MOS_TEMP_SENSOR_BIAS) * MOS_TEMP_SENSOR_K;

    return kBspData.mos_temp_val;
#endif
}

3.2.5 读取 mcu 温度

/**
 * @brief 读取mcu温度
 * @return float 单位摄氏度
 * @note 底层提供三维数组,连续存放三个温度值,用于中值滤波
 */
float bsp_get_mcu_temperature(void)
{
    static uint8_t mcu_temp_index = 0;

    mcu_temp_index++;
    if (mcu_temp_index >= 3)
    {
        mcu_temp_index = 0;
    }
    kBspData.mcu_temp[mcu_temp_index] = __LL_ADC_CALC_TEMPERATURE(ADC_REFERENCE_MV,
                                                                  kBspData.adc3_raw_buffer[TEMP_MCU_RANK1_INDEX], LL_ADC_RESOLUTION_16B);

    return kBspData.mcu_temp[mcu_temp_index];
}

3.2.6 获取 UVW 三相电流

从 ADC 值计算出电流的公式如下:

K = (\frac{V_{ref}}{Resolution})\cdot \frac{1}{Gain}\cdot \frac{1}{R_{shunt}}

  • ADC = ADC 最大量程 (V)
  • Resolution = ADC 分辨率 (12位就是4096)
  • Gain = 放大倍数
  • Rshunt = 采样电阻值
  • K = 电流采样ADC转化系数

下面就是计算 K 的分辨率:

#define UVW_CURRENT_SAMP_ADC_K          (ADC_REFERENCE_V / ADC_RESOLTION /(CURRENT_SAMP_OPAMP_VOLTAGE_GAIN * UVW_CURRENT_SAMP_RES))   //UVW电流采样ADC转化系数

除此之外,还需要减去电流运放零点,全部代码如下:

/**
 * @brief 获取UVW三相电流
 * @param[out] piabc UVW三相电流数组,单位A
 */
void bsp_get_phase_current(float piabc[3])
{
#ifdef VIRTUAL_MOTOR_MODEL
    piabc[0] = kAxis.sim_plant_output.iabc_now_A[0];
    piabc[1] = kAxis.sim_plant_output.iabc_now_A[1];
    piabc[2] = kAxis.sim_plant_output.iabc_now_A[2];
#else
    uint16_t drift[3] = {0};

    if (false == bsp_get_pwm_state()) // PWM未准备好,电流采样回读值强制为0
    {
        kBspData.uvw_current[0] = 0.0f;
        kBspData.uvw_current[1] = 0.0f;
        kBspData.uvw_current[2] = 0.0f;
    }
    else
    {
        sys_get_current_calibration_drift(drift);

        kBspData.uvw_current[0] = UVW_CURRENT_DIRECTION *
                                  (float)(int32_t)(UVW_CURRENT_U_CHANNEL - drift[0]) * UVW_CURRENT_SAMP_ADC_K;
        kBspData.uvw_current[1] = UVW_CURRENT_DIRECTION *
                                  (float)(int32_t)(UVW_CURRENT_V_CHANNEL - drift[1]) * UVW_CURRENT_SAMP_ADC_K;
        kBspData.uvw_current[2] = UVW_CURRENT_DIRECTION *
                                  (float)(int32_t)(UVW_CURRENT_W_CHANNEL - drift[2]) * UVW_CURRENT_SAMP_ADC_K;
    }

    piabc[0] = kBspData.uvw_current[0];
    piabc[1] = kBspData.uvw_current[1];
    piabc[2] = kBspData.uvw_current[2];
#endif
}
21 硬件工程师笔面试高频考点真题解析——单片机 本文系统介绍了单片机的核心概念与应用知识,包括:单片机定义与选型要点(性能、存储、外设等);核心参数(主频、I/O、通信接口等);最小系统组成(电源、复位、晶振、BOOT);常见外设(GPIO、ADC、定时器等);GPIO工作模式(输入/输出);死机原因分析(硬件干扰、软件错误等);上电故障排查流程(电源、时钟、程序等);与DSP、FPGA的对比(控制vs运算vs可编程);常用通信总线特点(UART、I2C、SPI、CAN);看门狗功能(超时复位防死机)。内容涵盖单片机硬件设计关键要点,适合嵌入式开发者参考 阅读详情

相关推荐

NV MCU与SoC的交互

MCU通过IST_REQ信号触发SoC执行IST,由IST_DONE_N通知完成,SOC_RESET_N由MCU控制。MCU与SoC间通过通信通道(如以太网)传输IST结果。热/电压监测通过I2C实现,阈值由MCU初始设置、SoC动态更新,异常可中止IST。客户应用可在检测严重错误时通过IST管理器中止IST,相关原因与状态将被记录。

liu-yonggang的专栏 55

基本定时器(TIM6/TIM7)

基本定时器最简单,就干一件事:到点了触发中断。定时器本质就是计数器,每个时钟脉冲加1,数到ARR就溢出、产生中断、清0重来。三个核心寄存器:PSC(预分频器):对输入时钟分频CNT(计数器):从0往上数ARR(自动重装载值):数到这个值就溢出,CNT清0,产生更新中断公式:  定时周期 = (PSC+1) × (ARR+1) / 定时器时钟  更新事件频率 = 定时器时钟 / ((PSC+1) × (ARR+1)) 例:TIM6时钟84MHz,要定时0.5秒(2

2401_89890233的博客 260

STM32超声波避障小车硬件设计与实时测距实现

超声波测距是嵌入式系统中经典的环境感知技术,其原理基于声波在空气中的传播时间与距离的线性关系,通过精确计时实现非接触式距离测量。该技术具备成本低、抗光干扰强、算法简洁等优势,广泛应用于智能小车、机器人避障、液位监测等场景。工程落地的关键在于硬件信号完整性(如5V/3.3V电平匹配)、微秒级定时精度(依赖高稳定外部晶振与输入捕获模式)以及强干扰环境下的数据鲁棒性(需软硬协同滤波)。本文以STM32F103C8T6为平台,深入解析HC-SR04模块的时序闭环控制、TIM3输入捕获双沿测量、L298N电机状态机驱

weixin_42578963的博客 297

7-2 按键控制LED流水灯(SDCC + Notepad++ + STC-ISP/普中ISP)

本节基于上节定时器T0设计,实现按键控制LED流水灯。通过配置12MHz晶振下16位定时器模式,初值设为64536(0xFC18),每1毫秒溢出一次,替代原有Delay方法。启用定时器中断,设置TR0启动,TF0标志自动置位触发中断,配合外部按键控制流水灯状态,提升系统实时性与效率。

xunyan6234的博客 81

latex使用overleaf插入多行图片

对于一般的latex模板,可以使用下面方式: (1)现在模板最前面的加入包 \usepackage{graphicx} \usepackage{subfigure} (2) 使用下面代码插入图片 \begin{figure}[htbp] \centering \subfigure[pic1.]{ \includegraphics[width=5.5cm]{pic1.png} } \quad \subfigure[pic2.]{ \includegraphics[width=5.5cm]{pic

Look Forward To 1万+

SAP 屏幕增强:客户商主数据屏幕增强(KNA1、KNB1、KNVV)

本文介绍了SAP系统中针对客户主数据(KNA1、KNB1、KNVV)进行屏幕增强的具体实现方法。主要内容包括:1)在SPRO配置中创建新条目;2)通过SE80创建函数组和程序(LZKNA1TOP等);3)设置子屏幕9001并添加自定义结构字段;4)利用BADI(CUSTOMER_ADD_DATA等)实现数据交互逻辑。文章分别详细说明了针对客户主数据的一般数据(KNA1)、公司代码数据(KNB1)和销售数据(KNVV)三类不同数据的增强配置步骤,包括函数模块创建、屏幕设置和BADI方法调用等关键技术点。

SAP ABAP开发技能记录分享 1619

TMS320F28335 学习笔记(二):系统时钟、PLL 与看门狗

本文系统介绍F28335的时钟架构与看门狗应用,涵盖外部晶振、PLL倍频生成系统时钟(SYSCLKOUT)、高速/低速外设时钟分频配置,以及看门狗的启用、关闭与喂狗机制。强调时钟配置准确性对延时、PWM、通信等外设的重要性,指出常见错误如晶振不匹配、未等待PLL锁定、随意修改PLL或喂狗周期过长等问题,并提供初始化框架与验证方法,帮助开发者正确配置时钟系统,确保程序稳定运行。

2403_83044722的博客 367

高分影像批处理第三回——RPC文件与几何校正

前言 前面两章部分完成了图像的基本组织和大气校正,可是对于遥感影像地理相关数据,精确的地理坐标也是非常关键的。L1级数据,可惜,并没有帮我们处理地理坐标系统。无论是打开ENVI还是用gdal工具查看图像元数据,其坐标系统都是错误的或者说是未读入的。因此本章节来解决这个问题。

weixin_43762038的博客 1万+

代码小白笔记:江科大 51 单片机 LCD1602 课程详解

本文为单片机新手梳理江科大51课程中LCD1602的驱动逻辑,聚焦“看懂代码”而非深究寄存器。通过解析接线、底层函数(延时、写命令/数据)、初始化流程及光标定位,详解字符、字符串、数字(十进制、十六进制、二进制)的显示原理,核心在于理解“RS控制指令/数据”、“地址映射规则”及“数字转字符”的位运算技巧,帮助读者快速上手并自定义显示内容。

2301_81429079的博客 338

基于立创EDA的IP5389BZ+IP6829 100W有线15W无线带屏充电宝DIY全流程解析

本文详细解析了基于立创EDA平台,采用IP5389BZ和IP6829芯片DIY一款100W有线快充、15W无线充电并带显示屏的移动电源的全过程。内容涵盖核心功能规划、硬件选型、电路设计、PCB布局、焊接组装、分步调试以及软件逻辑,为电子爱好者提供了一份从原理到实践的完整指南,并重点强调了电池安全与IP6829供电电压等关键注意事项。

weixin_34374684的博客 307

保姆级教程:用中移ML307模组对接高德/OneOS定位服务,从配置apikey到解析+MLBSLOC状态码

本文详细介绍了如何使用中移ML307系列模组对接高德/OneOS定位服务,从配置apikey到解析+MLBSLOC状态码的全过程。涵盖高德定位服务和OneOS定位服务的配置步骤、常见错误处理及性能优化技巧,帮助开发者快速实现基站定位功能,提升物联网项目的定位精度和稳定性。

weixin_30632089的博客 508

MCU 启动流程解析:从 SRAM 到 DDR

MCU 的性能瓶颈通常不在 DDR 带宽,而在访问延迟与确定性。因此,关键代码、中断向量、栈以及功能安全数据应放在片内 SRAM;大块传感器数据缓冲、堆和冷数据则放在 DDR。启动流程的核心可以概括为三步:Boot ROM 搬运、Remap 切换、SRAM 执行。

Where there is life, there is hope. 290

Ollama模型路径迁移实战:Windows/Mac/Linux三平台保姆级教程(附常见问题排查)

本文提供了一份详细的Ollama模型路径迁移教程,涵盖Windows、macOS和Linux三大平台。通过设置OLLAMA_MODELS环境变量或创建符号链接,指导用户将模型从默认路径安全迁移至新位置,以释放系统盘空间或提升性能。教程包含迁移前的准备、分平台步骤、迁移后的验证以及常见问题排查,确保迁移过程平滑可靠。

js777的博客 1184

XZ6273H 100V低功耗高压LDO硬件设计与实测体验

这款LDO提供SOT23-3、SOT89-3和TO92三种通用封装,不同场景下可以灵活选择:做小型化的PCB节点时用SOT23-3,板卡面积能控制得非常小;常规工业板卡选SOT89-3,贴片焊接方便,自带的焊盘也能提供基础散热能力;从实际落地的情况来看,它最适配两类场景:一类是汽车电子里的休眠值守子模块,车辆熄火后仍能保持极低的待机功耗,不会过度消耗电瓶电量;另一类是户外无人值守的通信远端节点,长期运行下的低功耗表现能大幅降低设备的供电维护成本。

koce13544100678的博客 231

基于深度学习的生活垃圾检测与分类系统:YOLOv5、YOLOv6、YOLOv7与YOLOv8实现

本项目的目标是开发一个基于YOLO系列模型的生活垃圾检测与分类系统。数据集准备与标注:收集并标注生活垃圾图像数据集。模型训练:使用YOLOv5、YOLOv6、YOLOv7、YOLOv8等深度学习模型训练垃圾分类系统。UI界面设计:设计一个简洁的用户界面,支持图像或视频的上传与垃圾分类结果展示。实时垃圾检测与分类:通过摄像头进行实时垃圾检测和分类。结果展示与保存:展示检测结果,支持用户保存分类后的图像或视频。

YOLO 705

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

MCU的ADC采样怎么配

一块采集板,室温下读电池电压挺准,一上高低温箱就差出0.3V。软件反复查了三遍,没改一行代码,最后发现是参考电压选错了——电源纹波直接灌进了测量基准。ADC这东西,代码就那么几行,坑全在配置里。这篇拿ATmega16当例子,把采样链路从头讲清:参考电压怎么选、时钟为什么卡在50到200kHz、结果为什么要讲究读取顺序。这些规则不只对AVR成立,换成车规MCU,思路一样。

qq_43241255的博客 194

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

HAL库基本定时器框架分析

这部分是在main.c里面调用的,使能定时器外设和中断位。实时真正干活的操作在中断处理函数里进行。流程1 定时器外设初始化和中断配置。流程2 使能定时器中断相关位。流程3 中断处理函数。

tecoes的博客 22

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

PHY内部环回通过,能证明网口整条链路正常吗?

PHY内部环回通过,只能证明该测试路径在记录条件下工作正常,不能直接证明变压器、RJ45、网线和对端组成的整条链路正常。采购收到“环回合格”报告时,应先确认数据从哪里发出、在哪里折返、又在哪里检查。

Voohu_Elsa的博客 189

从FT 93k测试机角度看如何测试芯片的VOH/VOL/VIH/VIL,通俗易懂的方式介绍

FT 93k测试中,VIH/VIL与VOH/VOL的核心是验证芯片“听清”与“说清”的能力。VIH/VIL测试芯片输入灵敏度,通过施加边界电压并观察功能响应;VOH/VOL则在负载下测量输出电平,模拟真实工作状态。测试需严格遵循规格书的负载电流条件,确保信号可靠传输,避免灰色地带干扰。本质是精准复现测试条件,实现“听话的对话者”与“挑剔的听众”的双重角色。

Wang20122013的博客 227

Arduino-MEGA-ESP单片机理论课笔记-06温湿度-07时间-延时定时-2026

本文解析了DHT11温湿度传感器的Arduino代码,逐行讲解了库引入、引脚定义、传感器初始化及数据读取流程。重点说明了delay(1000)导致阻塞的问题,并提出使用millis()实现非阻塞定时,将采样间隔改为2秒,提升程序响应性。同时建议增加isnan()错误检测、优化串口输出格式,确保数据稳定可靠。

zhangrelay的专栏 363

认识元器件 · 单片机(MCU/MPU/SOC) · 实战篇16

VBUS检测用于识别USB主机是否存在,自供电设备强制检测,采用PA9引脚(5V耐压)通过分压或MOSFET方案实现。分压电阻取高阻值(如82k+33k),确保分压后电压≤4V,符合GPIO输入电平要求;当GPIO耐压条件不足时,改用N沟道MOSFET(如2N7002)检测,适用于高电压场景(如5–48V)。三电阻加焊桥可覆盖1.8V/3.3V双档,但量产建议使用标准封装。需避免MCU未上电时5V VBUS接入PA9,以防损坏器件。

一只天天被叨叨的小可爱 207

哪些国产单片机厂家提供FAE技术支持?英锐恩等对比

大厂FAE资源通常优先服务大客户,中小批量项目往往只能找代理商或看论坛。如果你需要,推荐:收到请求当日或次日回复,必要项目24小时内工程师到场,还能组织芯片研发工程师一起评审问题。生态成熟、资料丰富;通过代理商体系提供支持。

2601_95079068的博客 226

【电感专题2:电感的感抗、电路的阻抗、电流的滞后】

本文系统阐述了电感的感抗特性及其对交流电路的影响。感抗 随频率升高而增大,阻碍电流变化,导致电流滞后电压90°。在串联RL电路中,总阻决定电流大小,频率或电感增大时阻抗上升,电流减小;反之则电流增大。仿真验证了理论计算与波形特征一致,直观展示了电流滞后于电压的相位关系。

weixin_57246604的博客 330

USB3.0读卡器为何跑不满速?CH379工程实践拆解

规范覆盖上,这颗芯片从eMMC4.4、4.5.1一直到5.0的HS200与HS400都有支持,老库存卡和新采购颗粒都能兼容,这在料源不稳定的时期尤为重要,一颗芯片同时兼容SD物理层1.0、2.0与SD3.0规范,也覆盖了MMC卡这类偏工业的存量介质。调试阶段,TEST引脚每秒输出一帧状态数据,包含USB连接速度、卡的插入与初始化状态以及上下传速率,115200bps的串口格式接一根线就能读取,产线工装可以直接用它做成品测试判断,不必反复插拔试错。这颗决定读卡器性能上限的芯片,值得从工程角度拆开看一遍。

ccbw16的博客 120

飞控主控 MCU 怎么选?STM32H743、STM32F405 与 AT32F421 应用及选型对比

AT32F421 采用 ARM Cortex-M4 内核,主频最高 120MHz,具有较紧凑的封装形式,可以用于空间和成本受到限制的电调产品。当飞控需要增加更多传感器、提高 IMU 采样频率,或者同时运行导航、通信和数据处理任务时,较高的 CPU 性能可以减少任务之间的资源竞争。对于开发团队来说,满足当前功能、保留合理的性能余量,同时控制整体 BOM 成本,才是更实际的选型思路。例如,在需要进行多路电流采样、PWM 控制和电机状态监测的设备中,G473 的模拟外设资源可能比单纯提高 CPU 主频更加重要。

Cheryl13824368625 139

第 2 章 模型边缘部署 | MCU 级部署(最小算力约束)

在资源极度受限的MCU(如STM32L4)上部署深度学习模型,需遵循“小、静、整”三原则:模型参数<200KB、内存静态分配、仅用规整算子。唯一可行方案是使用专为嵌入式设计的DS-CNN,其基于深度可分离卷积,参数仅87KB,MACs<5M,支持INT8量化。通过X-CUBE-AI工具链完成PTQ量化,结合真实场景校准集与Conv+BN融合优化,实现48ms内推理延迟,成功落地16kHz音频关键词唤醒系统。

weixin_51988935的博客 129
上一篇: YuanHub 源码分析【三】电流环的初始化、应用和 Simulink 建模
下一篇: YuanHub 源码分析【五】速度模式举例通过 Mavlink 协议配置过
崔佳宇_
崔佳宇_ 优质创作者: 嵌入式与硬件开发技术领域 优质创作者: 嵌入式与硬件开发技术领域
博客等级 码龄10年 1万+粉丝 173原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值