AC7811-BLDC无感控制代码调试与测试记录

news2024/9/21 15:52:53

接线注意

供电

对于 AC781x 电机 Demo 板,其 MCU 控制板和功率板的 12V 输入只需接一路即可,如果电机额定电压为 12V,那么将功率板中的功率管供电模式选择跳点(靠近 D5)短接即可,不需要再额外供电;如果电机的额定电压大 12V,那么功率管就需要单独供电:需要将功率板上的功率管供电模式选择跳点(靠近 D5)断开,电源从 J15 端输入。

一定要注意:驱动板12V的输入不要忘记,预取芯片都是12V供电的。

跳帽

控制模式选择

这个跳帽我试了,全部不接,对电机运转没什么影响。

保护策略调试

过压

修改MAX_BUS_VOLTAGE为25,同时调大输入电压,使其超过25V,看看会不会保护

#define MAX_BUS_VOLTAGE              25             /*!< Maximum operating voltage of the controller.Unit:V */

测试正常,电机立马停转。

欠压

#define MIN_BUS_VOLTAGE              9              /*!< Minimum operating voltage of the controller.Unit:V */

调小输出电压使其小于9V,电机停转

过流

#define BLDC_OVER_CURRENT_THRESHOLD     20                   /*!< Bus current overcurrent protection threshold, unitS: A*/

可以调整为0.1A试一试,不行

空载下,电流太小了,而电流阈值设置最小为1A,没法弄。

波形测试

PWM互补通道输出波形

反电动势波形

启动的电流波形

串口打印调试 

功能测试

在测试的时候,发现串口打印printf不能用。

经过查找,发现忘记引用debugout文件:

文件中有对串口2(USB接口)的printf重定向

这些都配置完之后,又发现打印出来乱码,怀疑波特率不对,查找到串口初始化里,设置的是115200,修改之后,打印出来还是乱的。

怀疑是不是波特率设置的太低,于是改成230400,打印成功

操作提示打印

在按键操作时,可实时反馈电机的变化

一些参数的观察

换相30°延迟时间

随着速度的增加,换相延时时间明显减小:

速度斜坡

似乎明白了一点,这个g_bldc_speedCmd.speedTargetRamp,其实就是在你设定完目标转速之后逐渐变化的速度值

就像下面这个例子,按下加速按钮,设定转速720r/m,然后速度斜坡开始从初始的655,逐渐增加直到设定的720。

速度反馈值

通过反电动势获得电机的电频率:

/*!
* @brief get motor elec freq in bldc control with sensorless.
*
* @param[in] motorDir: motor run direction
* @return elec freq in Q15
*/
int16_t BLDC_Bemf_SpeedGet(int16_t motorDir)
{
    uint32_t s_elecFreq = 0;
    uint32_t s_elecFreqPu = 0;

    if (g_bemfControl.aveChangePhaseTime)//只要平均换相时间不为0
    {
        s_elecFreq = 166667 / (int32_t)(g_bemfControl.aveChangePhaseTime * TIMER_XUS);   
        /* 166667 refers 6 sector time in us, 166667 = (6 / 10^-6) */
        //这个也比较好理解 aveChangePhaseTime是平均换相间隔(其实是一个次数值) 所以要乘以时间单元TIMER_XUS
        //得到的才是换一次相,费的时间(单位是us)
        //转一圈6次换相 所以还要*6,再把us转化成s  就是上面这个公式
    }

    s_elecFreqPu = motorDir * MATH_IQ(s_elecFreq * 1.0 / BASE_FREQ);//转化成Q15格式*2^15

    return s_elecFreqPu;
再把电频率转化成转速。

void BLDC_ASR_FbkUpdate(SPEED_RAMP_TYPE *command)
{
#if (defined BLDC_HALL)
    command->speedFbk = BLDC_Hall_SpeedGet(pBldcVarsCfg->motorDir);
#elif (defined BLDC_SENSORLESS)
    command->speedFbk = BLDC_Bemf_SpeedGet(pBldcVarsCfg->motorDir);
#else

#endif
    command->speedFbkRpm = MATH_Mpy(command->speedFactor, command->speedFbk);
	printf("speedFbkRpm:%f \r\n", (float)command->speedFbkRpm);
}

所以这里的速度反馈值来自于反电动势的平均换相时间。

但测试中发现,你设置的是1310r/m,可稳定之后,反馈回来的速度值确是1199r/m

所以很有可能是PI控制器那里出现问题

PI参数

在速度环中:

void BLDC_SpeedLoop_Calculate(SPEED_RAMP_TYPE *speed, PID_TYPE *pid, BLDC_VARS_CTRL *bldcCtrl)
{
    Set_BLDC_PidRef(pid, speed->speedTargetRamp);
	printf("speedTargetRamp:%f \r\n",  (float)speed->speedTargetRamp / 10);
    Set_BLDC_PidFbk(pid, speed->speedFbk);
	printf("speedFbk:%f \r\n",  (float)speed->speedFbk / 10);
    bldcCtrl->ibusRefPu = PID_Calculate(pid);
}

设定目标准苏720,速度斜坡与速度反馈都开始逐渐增加,直到设定的转速。

但同时发现,这个速度反馈值确实不是很稳定:有时候会与速度斜坡出现差异。

在电流环中:

速度环输出的ibusRefPu,其实就是电流环输入的参考值

void BLDC_SpeedLoop_Calculate(SPEED_RAMP_TYPE *speed, PID_TYPE *pid, BLDC_VARS_CTRL *bldcCtrl)
{
    Set_BLDC_PidRef(pid, speed->speedTargetRamp);
	//printf("speedTargetRamp:%f \r\n",  (float)speed->speedTargetRamp / 10);
    Set_BLDC_PidFbk(pid, speed->speedFbk);
	//printf("speedFbk:%f \r\n",  (float)speed->speedFbk / 10);
    bldcCtrl->ibusRefPu = PID_Calculate(pid);
	printf("ibusRefPu:%f \r\n",  (float)bldcCtrl->ibusRefPu);
}

观察ibusRefPu这个参数

你会发现这个数值的变化非常奇怪,我简单处理了一下数据:

你会发现,稳定之后(稳定之后,不包括预定位、启动、开环的过程,那一段数值更奇怪)这个电流是在不断变化的,慢慢的往上升,又忽然下来,再升,再下来……

后来我又测试了一下,在运行的过程中加速:

参考电流的变化速度更快了,

明显在设定一个更高的转速之后,电流参考值有一个过调制,

并且速度越快,电流参考值也越来越稳稳定

ACMP反电动势

发现一个问题,用来和三相反电动势进行轮询比较,进行hall输出的对象是谁?

代码里:直接整了一个BEMF_REF

而它对应GPIO_PA10,也就是ADC_IN3这个通道

 

可我死活找不到这个AD的采样电路(在原理图中)

但我在PCB图里面找到了:也就是这个V_REF

而且反电动势采样这部分的电路,原理图里好像都没有!!!

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

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

相关文章

配置磁盘多路径聚合

一 安装多路径软件 yum install -y device-mapper device-mapper-multipath 二 配置多路径聚合 在每个节点上都需要配置下多路径聚合。 /* 注意事项&#xff1a; 新添加盘后要扫描下&#xff0c;才能识别到(如果已经看到盘了&#xff0c;即执行multipath -ll能看到&#…

《收获,不止Oracle》读书笔记之性能提升千倍

体系学习让SQL语句性能提升千倍 未优化前&#xff0c;单车速度 drop table t purge; create table t(x int);create or replace procedure proc1 as beginfor i in 1..100000loopexecute immediateinsert into t values (||i||);commit;end loop; end; / /*这里要记得预先执行…

linux下常用调试技巧

1 linux下如何查看静态库和动态库都链接了那些库 1.1 静态库.a是没有指令可以看到其在生成过程中链接了那些库的 1.2 动态库.so可以通过ldd指令查看其在生成过程中链接了那些库 还有一种简单直观的方法,我们可以在编译过程中看到所生成的二进制文件,链接了那些库: 平时编译…

[阶段4 企业开发进阶] 7. 微服务--SpringCloud Alibaba

文章目录1 服务注册和配置中心Nacos1.1 Nacos简介1.2 Nacos作为服务注册中心服务提供者注册服务消费者注册和负载服务注册中心对比1.3 Nacos作为服务配置中心基础配置分类配置DataID方案配置Group方案配置Namespace方案配置1.4 Nacos集群和持久化配置2 服务熔断和限流SentinelS…

指针仪表读数识别系统 yolov7

指针仪表读数识别系统通过 yolov7opencv计算机视觉分析技术,利用现场摄像头可以自动识别指针型仪表读数并将读数回传给平台节省人工巡检读表的时间。YOLOv7 在 5 FPS 到 160 FPS 范围内&#xff0c;速度和精度都超过了所有已知的目标检测器&#xff0c;并在V100 上&#xff0c;…

【日常系列】LeetCode《24·贪心1》

数据规模->时间复杂度 <10^4 &#x1f62e;(n^2) <10^7:o(nlogn) <10^8:o(n) 10^8<:o(logn),o(1) 内容 lc 455 &#xff1a;分发饼干 - 贪心思想 https://leetcode.cn/problems/assign-cookies/ 提示&#xff1a; 1 < g.length < 3 * 10^4 0 < s.len…

配置双网卡聚合

一 服务器多网卡聚合的意义 1、多网卡聚合&#xff0c;可以起到网络链路冗余作用&#xff0c;当故障发生时&#xff0c;网络自动切换&#xff0c;保证业务数据不中断。 2、多网卡聚合成一条虚拟链路&#xff0c;可实现网络带宽提升&#xff0c;如2个1000Mbps的网卡聚合&#…

【收藏】使用Google Colab随时随地运行Python代码

Colab官网 什么是 Colab? Colab,或“Colaboratory”,允许您在浏览器中编写和执行 Python,不需要依赖本地资源。具有以下优势: 需要零配置免费使用GPU轻松分享几大非常方便的特性: 和Google Drive无缝融合 可以将文件存储在Google Drive里面,同时也可以从Google Driv…

TiDB性能调优

文章目录一、 TiDB 常见配置优化1.1 限制 SQL 内存使用和执行时间1.1.1 执行时间限制1.1.2 内存使用限制1.2 事务重试设置1.3 Join 算子优化1.4 常见 Mysql 兼容问题1.5 其他优化项二、TiKV优化2.1 TiKV 线程池优化2.1.1 GRPC2.1.2 Scheduler2.1.3 Raftstore2.1.4 UnifyReadPoo…

对象存储服务MinIO

1. MinIO简介 对象存储的方式对比 分布式文件系统 MinIO概述: 1.MinIO基于Apache License v2.0开源协议的对象存储服务&#xff0c;可以做为云存储的解决方案用来保存海量的图片&#xff0c;视频&#xff0c;文档。 2.Golang语言实现&#xff0c;配置简单&#xff0c;单行命令…

学习css3,使用代码实现一根心爱的二踢脚

2023春节快到了&#xff0c;虽然还在上班&#xff0c;但心情早已开始激动&#xff0c;感叹2022终将过去&#xff0c;喜迎2023兔年吧。让我以激动的心情&#xff0c;利用所学css3代码知识&#xff0c;实现一根心爱的二踢脚吧。 目录 1、实现思路 2、实现二踢脚的主体圆柱部分…

数据的存储(1)数据类型,整型在内存中的存储

TIPS 1. 函数递归必须存在限制条件。 2. 一维数组与二维数组在内存当中是连续存放的&#xff0c;二维数组的话反正也是一行一行往下走。如果能知道起始地址的话&#xff0c;后面顺藤摸瓜会很容易。 3. 数组越界的话&#xff0c;C语言本身是不做检查的。数组传参传的是数组首…

【跟学C++】面向对象三大特征——继承(Study20)

文章目录1、了解继承2、基类与派生类(父类与子类)2.1、概念2.2、案例展示3、构造顺序与析构顺序4、继承种类4.1、私有继承4.2、保护继承4.3、多继承5、总结 【说明】 大家好&#xff0c;本专栏主要是跟学C内容&#xff0c;自己学习了这位博主【 AI菌】的【C21天养成计划】&…

十五、类加载器、反射

类加载器 1类加载器【理解】 作用 负责将.class文件&#xff08;存储的物理文件&#xff09;加载在到内存中 2类加载的过程【理解】 类加载时机 创建类的实例&#xff08;对象&#xff09;调用类的类方法访问类或者接口的类变量&#xff0c;或者为该类变量赋值使用反射方式来…

excel制表基础:规范的制表理念和思路让效率提升 下篇

在日常工作中我们会构建很多的表格&#xff0c;其实这些表格无论多少&#xff0c;都可以归结为三大类&#xff0c;分别为“源数据表”、“关系信息表”和“统计分析表”。上次我们提到了一套表格“统计的核心”——“源数据表”&#xff0c;今天继续为大家分享“关系信息表”和…

力扣(LeetCode)1802. 有界数组中指定下标处的最大值(C++)

贪心二分查找 贪心性质&#xff1a;对于数组中确定位置index的数&#xff0c;要使nums[index]最大&#xff0c;等于使得整个数组之和最小。 提示 &#xff1a;数组相邻元素之差的绝对值小于1&#xff0c;为了数组之和最小&#xff0c;从index往左&#xff0c;形成公差为1的递减…

python实现多张多格式图片转PDF并打包成exe

目录 主要思路 转PDF初始代码 转PDF最终代码 GUI界面设计代码 打包成可执行文件 完整代码 附录 主要思路 从文件夹中读取图片数据&#xff0c;然后将他们保存为PDF格式。 转PDF初始代码 不长&#xff0c;大概10行代码。 from PIL import Image from os import *def …

Stardust 案例:制作散景光斑

本文介绍使用 Ae 插件 Stardust 制作散景光斑的一般方法与步骤。效果视频1、新建合成。持续时间&#xff1a;10 秒。2、新建纯色图层&#xff0c;命名为“散景光斑”&#xff0c;然后添加 Stardust 效果。3、设置 Emitter&#xff08;发射器&#xff09; 。用一个长方形的发射器…

2023外贸人出国抢单攻略(附带2023年全球重要展会)

自11月底以来&#xff0c;全国陆续传来政府带团出国抢单的消息&#xff0c;让沉寂了3年之久的外贸行业热情高涨。这不仅预示着3年抗疫斗争的胜利&#xff0c;更意味着中国三驾马车之一的外贸行业开启了高速运转的车轮。“浙江带领万家企业去欧洲抢单&#xff01;”“福建省商务…

少儿Python每日一题(10):手机键盘

原题解答 本次的题目如下所示(原题出处:NOC) 一般的手机的键盘是这样的: 要按出英文字母就必须要按数字键多下。例如要按出 x 就得按 9 两下,第一下会出 w,而第二下会把 w 变成 x。0 键按一下会出一个空格。 你的任务是读取若干句只包含英文小写字母和空格的句子,求出要…