无刷电机带上驱动器,掉电外力拖动有阻力

news2024/9/28 20:39:01

无刷电机带上驱动器,掉电外力拖动有阻力

这个问题一直以为很好理解或者应该是总所周知的,但是竟然很多人好奇问专门做电机控制的工程师,但是竟然很多人说不明白,今天我就好好聊一聊。

原因

  1. 反电动势效应
    当无刷电机在没有电源供电的情况下被外力拖动时,电机内部的转子仍然会转动。这时,电机的绕组切割磁力线,产生反电动势(Back EMF)。这个反电动势会在电机的绕组中产生电流,进而产生阻力。

  2. 短接制动
    当三相绕组短接后,反电动势在绕组中产生电流。由于三相绕组是短接的,这些电流在绕组中形成闭合回路,短接电流在绕组中产生的磁场与转子磁场相互作用,产生电磁制动力。这种制动力与电机的转速成正比,即电机转速越高,产生的制动力越大。

  3. 电流路径的形成
    · 定子绕组中的电流:反电动势在定子绕组中产生电压,这个电压驱动电流在定子绕组中流动。
    · 驱动器电路的连接:无刷电机的三相绕组通过连接线与驱动器的三相输出端(U、V、W)相连。即使驱动器掉电,电机绕组中的反电动势仍然会通过这些连接线传输到驱动器。
    · 在驱动器的功率开关元件(如MOSFET)上,通常存在体二极管。这些二极管在反向电压超过其导通电压时会导通,允许电流通过。

电流回路示例

96ddc97895efafd618e38eaafd9e6c8_1_.jpg

  1. 反电动势在B相产生正电压,A相产生负电压,从而形成由B相流入A相的电流。
  2. 电流通过A相的体二极管,进入驱动器的电源轨,又B相的体二极管流入地。
  3. 进入电源轨之后,我们将驱动器上的元器件近似比作一个电阻型负载。此时电流已形成,由于有负载电阻的原因电流并不大,这里可以思考下为什么会有这么大的阻力。

解决办法

  1. 原因:
    工作中大多驱动器的设计都会考虑到这些问题,会来看这个问题的同学多半是自己做的驱动器没有注意这个细节,专门跑到CSDN找原因的。请同学们们仔细看看自己的代码的PWM配置有没有将空闲引脚配置为低,如果为低仍有阻力,继续往后看,你的电流采样的偏置电压基准是否是在初始化时采集。

    回到上面的问题,电流明明很小为什么会产生明显的阻力?就是因为反电动势驱动驱动器上的元器件工作,上电就行初始化中会有将MOSFET导通的操作,形成短接制动的效果。

  2. 解决:

    (1)将初始化的PWM引脚改为高组态

	//STM32
	 sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;
  	 sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;

	//HPM5300
	void disable_all_pwm_output(void)
   {
   /*force pwm*/
    pwm_config_force_cmd_timing(DRV_BLDCPWM, pwm_force_immediately);
    pwm_enable_pwm_sw_force_output(DRV_BLDCPWM, DRV_BLDC_UH_PWM_OUTPIN);
    pwm_enable_pwm_sw_force_output(DRV_BLDCPWM, DRV_BLDC_UL_PWM_OUTPIN);
    pwm_enable_pwm_sw_force_output(DRV_BLDCPWM, DRV_BLDC_VH_PWM_OUTPIN);
    pwm_enable_pwm_sw_force_output(DRV_BLDCPWM, DRV_BLDC_VL_PWM_OUTPIN);
    pwm_enable_pwm_sw_force_output(DRV_BLDCPWM, DRV_BLDC_WH_PWM_OUTPIN);
    pwm_enable_pwm_sw_force_output(DRV_BLDCPWM, DRV_BLDC_WL_PWM_OUTPIN);
    pwm_set_force_output(DRV_BLDCPWM,
                        PWM_FORCE_OUTPUT(DRV_BLDC_UH_PWM_OUTPIN, pwm_output_high_z)
                        | PWM_FORCE_OUTPUT(DRV_BLDC_UL_PWM_OUTPIN, pwm_output_high_z)
                        | PWM_FORCE_OUTPUT(DRV_BLDC_VH_PWM_OUTPIN, pwm_output_high_z)
                        | PWM_FORCE_OUTPUT(DRV_BLDC_VL_PWM_OUTPIN, pwm_output_high_z)
                        | PWM_FORCE_OUTPUT(DRV_BLDC_WH_PWM_OUTPIN, pwm_output_high_z)
                        | PWM_FORCE_OUTPUT(DRV_BLDC_WL_PWM_OUTPIN, pwm_output_high_z));
    pwm_enable_sw_force(DRV_BLDCPWM);

   }

	int main(void){

	disable_all_pwm_output();
    my_pwm_init(MY_PWM_FREQUENCY, 500);
	
	while(1){

	}
	}

根据自己具体的MCU型号做对应处理

(2) 如果是将偏置电压采样放在了mian函数的初始中,较为简单的方法是在采样函数前加一个延时,因为拖动大多并不持续。另外的方法就是在校准中进行偏置电压采样存入flash,常用的方法是在下桥臂关断是再进行一次采样,这时的采样即为偏置电压采样,用作电流采样时的offset进行电流计算,这样的好处就是防止环境或工况变化导致的零漂。


void Motor::current_meas_cb(uint32_t timestamp, std::optional<Iph_ABC_t> current) {
    // TODO: this is platform specific
    //const float current_meas_period = static_cast<float>(2 * TIM_1_8_PERIOD_CLOCKS * (TIM_1_8_RCR + 1)) / TIM_1_8_CLOCK_HZ;
    TaskTimerContext tmr{axis_->task_times_.current_sense};

    n_evt_current_measurement_++;

    bool dc_calib_valid = (dc_calib_running_since_ >= config_.dc_calib_tau * 7.5f)
                       && (abs(DC_calib_.phA) < max_dc_calib_)
                       && (abs(DC_calib_.phB) < max_dc_calib_)
                       && (abs(DC_calib_.phC) < max_dc_calib_);

    if (armed_state_ == 1 || armed_state_ == 2) {
        current_meas_ = {0.0f, 0.0f, 0.0f};
        armed_state_ += 1;
    } else if (current.has_value() && dc_calib_valid) {
        current_meas_ = {
            current->phA - DC_calib_.phA,
            current->phB - DC_calib_.phB,
            current->phC - DC_calib_.phC
        };
    } else {
        current_meas_ = std::nullopt;
    }

    // Run system-level checks (e.g. overvoltage/undervoltage condition)
    // The motor might be disarmed in this function. In this case the
    // handler will continue to run until the end but it won't have an
    // effect on the PWM.
    odrv.do_fast_checks();

    if (current_meas_.has_value()) {
        // Check for violation of current limit
        // If Ia + Ib + Ic == 0 holds then we have:
        // Inorm^2 = Id^2 + Iq^2 = Ialpha^2 + Ibeta^2 = 2/3 * (Ia^2 + Ib^2 + Ic^2)
        float Itrip = effective_current_lim_ + config_.current_lim_margin;
        float Inorm_sq = 2.0f / 3.0f * (SQ(current_meas_->phA)
                                      + SQ(current_meas_->phB)
                                      + SQ(current_meas_->phC));

        // Hack: we disable the current check during motor calibration because
        // it tends to briefly overshoot when the motor moves to align flux with I_alpha
        if (Inorm_sq > SQ(Itrip)) {
            disarm_with_error(ERROR_CURRENT_LIMIT_VIOLATION);
        }
    } else if (is_armed_) {
        // Since we can't check current limits, be safe for now and disarm.
        // Theoretically we could continue to operate if there is no active
        // current limit.
        disarm_with_error(ERROR_UNKNOWN_CURRENT_MEASUREMENT);
    }

    if (control_law_) {
        Error err = control_law_->on_measurement(vbus_voltage,
                            current_meas_.has_value() ?
                                std::make_optional(std::array<float, 3>{current_meas_->phA, current_meas_->phB, current_meas_->phC})
                                : std::nullopt,
                            timestamp);
        if (err != ERROR_NONE) {
            disarm_with_error(err);
        }
    }
}

void Motor::dc_calib_cb(uint32_t timestamp, std::optional<Iph_

ABC_t> current) {
    const float dc_calib_period = static_cast<float>(2 * TIM_1_8_PERIOD_CLOCKS * (TIM_1_8_RCR + 1)) / TIM_1_8_CLOCK_HZ;
    TaskTimerContext tmr{axis_->task_times_.dc_calib};

    if (current.has_value()) {
        const float calib_filter_k = std::min(dc_calib_period / config_.dc_calib_tau, 1.0f);
        DC_calib_.phA += (current->phA - DC_calib_.phA) * calib_filter_k;
        DC_calib_.phB += (current->phB - DC_calib_.phB) * calib_filter_k;
        DC_calib_.phC += (current->phC - DC_calib_.phC) * calib_filter_k;
        dc_calib_running_since_ += dc_calib_period;
    } else {
        DC_calib_.phA = 0.0f;
        DC_calib_.phB = 0.0f;
        DC_calib_.phC = 0.0f;
        dc_calib_running_since_ = 0.0f;
    }
}


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

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

相关文章

市场营销新手入门:推荐5本让你快速成长的好书!

我过去面试过数千人&#xff0c;发现了一个非常有趣也让人担忧的现象&#xff1a; 无论是资深还是资浅的市场营销人士&#xff0c;如果被问及什么是市场营销&#xff0c;什么是品牌&#xff0c;什么是整合营销传播&#xff0c;市场营销组合与整合营销传播有什么区别&#xff0…

HippoRAG如何从大脑获取线索以改进LLM检索

知识存储和检索正在成为大型语言模型(LLM)应用的重要组成部分。虽然检索增强生成(RAG)在该领域取得了巨大进步&#xff0c;但一些局限性仍然没有克服。 俄亥俄州立大学和斯坦福大学的研究团队推出了HippoRAG&#xff0c;这是一种创新性的检索框架&#xff0c;其设计理念源于人类…

matlab数值溢出该怎么解决?

&#x1f3c6;本文收录于《CSDN问答解惑》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&…

Backend - C# 的日志Lognet4

目录 一、安装 log4net 插件 &#xff08;一&#xff09;作用 &#xff08;二&#xff09;操作 &#xff08;三&#xff09;注意 二、配置 &#xff08;一&#xff09;配置AssemblyInfo.cs &#xff08;二&#xff09;配置log4net.config 1. 创建log4net.config文件&#xff08…

【京东监控项目分享】JD电商可实现的商品价格SKU实时监控

笔者实现了一个京东商品价格和评论的采集监控系统&#xff0c;它具有以下功能。 可以在任意时间周期内按照一定时间间隔&#xff0c;采集任意指定商品的价格和最新评论&#xff0c;都是网页可见的公开数据&#xff0c;不包含任何隐私数据。 对于消费者来说&#xff0c;如果订阅…

《C++20设计模式》策略模式

文章目录 一、前言二、实现1、UML类图2、实现 一、前言 策略模式和状态模式实现方式一样&#xff0c;只是目的不同&#xff0c;如果会状态模式的这个也就可以随便看看啦。 相关代码可以在这里&#xff0c;如有帮助给个star&#xff01;AidenYuanDev/design_patterns_in_moder…

RocketMQ-六大场景实操指南

RocketMQ-六大场景实操指南 普通消息创建Topic创建Group测试消息收发 定时消息创建Topic创建Group消息发送 事务消息创建Topic创建Group消息收发 顺序消息创建Topic创建Group消息收发 另外两大场景消息异常运维体验感受初次体验给小白新手的建议进阶体验应用场景 关于云消息队列…

Excel第28享:如何新建一个Excel表格

一、背景需求 小姑电话说&#xff1a;要新建一个表格&#xff0c;并实现将几个单元格进行合并的需求。 二、解决方案 1、在电脑桌面上空白地方&#xff0c;点击鼠标右键&#xff0c;在下拉的功能框中选择“XLS工作表”或“XLSX工作表”都可以&#xff0c;如下图所示。 之后&…

持安科技CEO何艺荣获中国信通院2023-2024年度标准卓越贡献奖

近日&#xff0c;由中国信息通信研究院、中国通信标准化协会承办的“全球数字经济大会—云和软件安全论坛”暨“2024第二届SecGo云和软件安全大会”胜利召开&#xff0c;零信任办公安全技术创新企业持安科技创始人兼CEO何艺获评为2023-2024年度零信任领域标准卓越贡献者。 由中…

华盈生物获得美国Akoya认证的PhenoCycler-Fusion(原CODEX)技术服务商

华盈生物获得美国Akoya认证的PhenoCycler-Fusion&#xff08;原CODEX&#xff09;技术服务商 华盈生物获得美国Akoya公司认证的PhenoCycler-Fusion&#xff08;原CODEX&#xff09;空间单细胞蛋白组技术服务商&#xff0c;并进入该技术的全球CRO服务提供者网络&#xff1a;htt…

获超九成Gartner用户力推!FortiGate连续五年斩获“客户之选”称号

近日&#xff0c;Gartner Peer Insights™ 网络防火墙客户之选报告发布&#xff0c;Fortinet 连续第五年荣登这项权威榜单。该评选结果源于广大用户对 Fortinet 防火墙产品的真实反馈&#xff0c;是客户选择 Fortinet 的重要参考依据&#xff0c;也是FortiGate能够占据全球防火…

Spark-RDD和共享变量

概览 每个Spark应用程序都由一个driver program 组成&#xff0c;该驱动程序运行我们编写的main函数&#xff0c;并在集群上执行各种 并行 操作。Spark提供的主要抽象是一个 弹性分布式数据集&#xff08;RDD&#xff09;&#xff0c;它是一个跨集群节点分区的元素集合&#x…

Win-ARM联盟的端侧AI技术分析

Win-ARM联盟&#xff0c;端侧AI大幕将起 微软震撼发布全球首款AI定制Windows PC——Copilot PC&#xff0c;搭载全新NPU与重塑的Windows 11系统&#xff0c;纳德拉盛赞其为史上最快、最强、最智能的Windows PC。该设备算力需求高达40TOPS&#xff0c;支持语音翻译、实时绘画、文…

AI网络爬虫019:搜狗图片的时间戳反爬虫应对策略

文章目录 一、介绍二、输入内容三、输出内容一、介绍 如何批量爬取下载搜狗图片搜索结果页面的图片?以孙允珠这个关键词的搜索结果为例: https://pic.sogou.com/pics? 翻页规律如下: https://pic.sogou.com/napi/pc/searchList?mode=2&start=384&xml_len=48&am…

基于Android平台开发,天气预报APP

1.项目功能思维导图 2. 项目涉及到的技术点 数据来源&#xff1a;和风天气API使用okhttp网络请求框架获取api数据使用gson库解析json数据使用RecyclerViewadapter实现未来7天列表展示和天气指数使用PopupMenu 实现弹出选项框使用动画定时器实现欢迎页倒计时和logo动画使用Text…

常见的过压保护芯片、过压保护的基本参数和选型

过压保护也叫过电压保护&#xff0c;是当电压超过预定的最大值时&#xff0c;使电源断开或使受控设备电压降低的一种保护方式。 过压保护芯片是为了防止输入电压的时候浪涌和波纹过大&#xff0c;导致烧坏后面的元器件芯片。因此过压保护芯片是很有必要的芯片。 常见的过压保护…

CentOS7配置阿里云yum源

前提&#xff1a;确认机器可以连接互联网&#xff0c;且系统已经安装了wget软件 先进入到/etc/yum.repos.d目录下查看是否有原来的yum源配置文件&#xff0c;如果有&#xff0c;就将它们备份一下 用yum repolist命令测试&#xff0c;当前系统已经没有可用yum源 输入命令wget -…

护佑未来!引领儿童安全新时代的AI大模型

引领儿童安全新时代的AI大模型 一. 前言1.1 AI在儿童安全方面的潜在作用1.2 实时监控与预警1.3 个性化安全教育与引导1.4 家长监护与安全意识提升 二. AI大模型的优势2.1. 保护儿童隐私和安全的重要性2.2. AI大模型如何应用于儿童安全领域2.1 儿童内容过滤2.2.1 儿童行为监测 2…

案例分享:Qt modbusTcp调试工具(读写Byte、Int、DInt、Real、DReal)(当前v1.0.0)

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://blog.csdn.net/qq21497936/article/details/140313789 红胖子(红模仿)的博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片…

【Python】已解决:ModuleNotFoundError: No module named ‘pip‘(重新安装pip的两种方式)

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例 四、重新安装pip的两种方式方式一&#xff1a;使用get-pip.py脚本方式二&#xff1a;使用ensurepip模块五、注意事项 已解决&#xff1a;ModuleNotFoundError: No module named ‘pip’&#xff08;重新安装pip的…