打印

【凌鸥创芯电机开发板LKS32MC071CBT8评测报告】无刷直流电机控制全能王

[复制链接]
4102|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 北方西门吹雪 于 2023-6-29 16:36 编辑

无刷直流电机控制全能王

1. 凌鸥创芯电机开发板LKS32MC071CBT8
    LKS07系列MCU是凌鸥创芯针对电机驱动市场,推出的高性能电机运动控制系列芯片,相比LKS08系列升级,flash/RAM容量更大。这个芯片的设计高度集成了面向电机控制痛点的多种功能,实现高度集成,相比很多国际大牌提供的电机控制解决方案,首先的感觉是怎么这么不高大上,没有堆一堆高级的DA/AD芯片和保护芯片。    但是,只有攻城狮才会窃喜,这么摸鱼划水不要太爽,整个核心板只有若干标准精度的电阻,连常见的各种晶振都找不到,

为毛线呢?因为,
  • 集成仪表级全差分可编程增益放大器+差分ADC,不需要电压偏置就可以处理正负信号;
  • 集成同步双采样3Msps 12BIT高速ADC,集成全温度范围千分之五电压基准源;
  • 集成96MHz 32BIT MCU+DSP,自主指令集DSP可作为异构独立核心运行程序,三角函数运算、开方运算100ns内完成;
  • 工作温度范围-40~105℃。内部RC全温度范围时钟偏差±1%以内。
  • 芯片引脚通过6KV人体模型引脚接触放电,通过15KV非触式空气静电放电测试。
  • 集成度高、节约BOM成本,丰富的模拟运放和比较器资源,可满足单电阻/双电阻/三电阻电流采样拓扑架构的不同需求;
  • 内部集成高压钳位网络,允许高压共模信号直接输入,轻松实现MOSFET内阻直接电流采样,节省了昂贵的电流采样电阻并降低了系统功耗。

但是,但是没有板载调试器啊。那么看一看下面的这个,9块9包邮,不仅有SWO,还同时支持UART,当然,这个是范例,其实各种CMSIS-DAP调试器都完美支持,

加上顶配的功率驱动板,

组合起来就是无敌全能电机开发平台,专治虚假宣传,高价兜售,

要好不好,更重要是看疗效,备好了这带三相霍尔传感器的直流无刷电机就可以开搞了。

整个产品线完整,精准满足各种要求

2. 凌鸥创芯电机开发板LKS32MC071CBT8核心板和功率驱动板解析
2.1 LKS32MC071CBT8核心板
因为这个核心板高度集成化,这样使用起来极方便,这样就不详解了。面向电机控制应用的专用处理器,集成了常用电机控制系统所需要的所有模块。关键点如下,
⚫ 性能
➢ 96MHz 32 位 Cortex-M0 内核 , 超低功耗休眠模式,低功耗休眠电流 10uA
➢ 2.5V~5.5V 电源供电,内部集成 1 个 LDO,为数字部分电路供电
➢ 内置 8MHz 高精度 RC 时钟,-40~105℃范围内精度在±1%之内 ; 内置低速 32KHz 低速时钟,供低功耗模式使用;内部 PLL 可提供最高 96MHz 时钟
➢ 内置 flash 包括 32KB/64kB/128kB 主存储区,1.5kB NVR 信息存储区
⚫ 外设模块
➢ 两路 UART ; 一路 SPI,支持主从模式 ; 一路 IIC,支持主从模式 ; 一路 CAN(部分型号不带 CAN),须使用外部晶体作为参考时钟
➢ 2 个通用 16 位 Timer,支持捕捉和边沿对齐 PWM、中心对齐 PWM 功能; 2 个通用 32 位 Timer,支持捕捉和边沿对齐 PWM、中心对齐 PWM 功能
➢ 电机控制专用 PWM 模块,支持 2 组各 6 路 PWM 输出,死区可配置
➢ Hall 信号专用接口,支持测速、去抖功能➢
⚫ 模拟模块
➢ 集成 2 路 12bit SAR ADC,同步双采样,3Msps 采样及转换速率,最多支持 16 通道
➢ 集成 4 路运算放大器,可设置为差分 PGA 模式
➢ 集成 3 路比较器,可设置滞回模式
➢ 集成 2 路 12bit DAC 数模转换器
➢ 内置±2℃温度传感器
➢ 内置 1.2V 0.8%精度电压基准源
➢ 内置 1 路低功耗 LDO 和电源监测电路
➢ 集成高精度、低温飘高频 RC 时钟
➢ 集成晶体起振电路

   直接上核心逻辑图,一目了然。

2.2 LKS32MC071CBT8功率板
   其实这个功率板,已经把上面的优势表现得淋漓尽致,电路图如下,

这个功率板只有和核心板一起读才能完全读懂。- Hall传感器是直接输入到核心板的Hall接口,有上拉电阻,而且还通过一组R15,R16,R17进行了电平转换,起到保护和限流的作用;
- 电流采用,选择了分相的跳线选择,可以支持外置的采样电阻和直接采样MOSFET的内置源漏极电阻,这个采样点取自功率板,但是通过选择跳线;
- 采用三相反电动势检测的FOC控制的时候,在核心板还有一个放大倍数的匹配电阻,采用了1%精度的较高精度电阻,适配对应PGA引脚的放大回路;
这个功率板为了增加使用难度(主要是秀肌肉的意思),还使用了ADC,差模PGA,内置互锁MOSFET驱动等多种玩法,很需要对着核心板的原理图,兼带范例代码,才能发现,这个组合确实比较强,功能丰富,但是外面还看不出来,以为就是简简单单打酱油的,其实是扫地僧。
    还有容易漏掉的看点是用来功率控制的LKS620,这个电源芯片直接可以上DC20~265AC的全电压动态输入,这个用在12~24V的小电机上,就是要大炮打蚊子。
    另一个就是LKS560驱动芯片,只有配合这个芯片,才能轻松完成过流保护,过压保护等功能,这里提取出的引脚,就可以直接实现高级电机控制中必不可少的OV,OI功能。

3. 开发环境和配置
3.1 本开发最丝滑的就是使用Keil,这里提供了全套的package files。以及最近免费的Keil Community版本,这样就和且战且退的光刻机战术异曲同工。当你没有光刻机的时候,我们就全部禁运;当你28nm的刚出样品的时候,我就解禁到14nm,并且大幅降价;卷死免费的Eclipse GCC 等东东。但是妍儿总之,现在很好用。

下载后,双击就直接自动安装,随后就可以正确访问对应的驱动

3.2  然后就是打开范例工程,可以选择CMSIS-DAP的,

然后,可以看到,调试器正确连接

并正确识别了这个芯片。


4. 凌鸥创芯电机开发板核心竞争力
4.1 虽然前面秀了很久的硬实力,但是,最重要的实力是头脑。在这里就是软件。结果,是这样的,

   最核心的代码库,其实是经过加密和编译过的lib库,直接提供免费使用,但是不让大家白piao。对于好奇心很强大的同学来说就是不能摸只能看。可以看到这个版本迭代到了LIB-05,并且在电动自行车上用得六六六,我们都知道,现在的电动车可以搞到48V直流,无极丝滑变速调速,这里面的核心控制逻辑就是很有技术含量的。其实,这样的配置还是比较适合懒狗的,拿来就用不香吗,就用LKS的不香吗?只是现在的API还要从范例代码中去扒,参数还有自己猜的成分,如果有专门出一个文档,用来指导躺平狗就更好了。

5.2 在这个核心库之外,其实也还是有高科技的,就是kenal目录下的三大锤子,

   各位看官了,克拉克变换和反变换,PID自动控制,以及SVPWM这三个函数,在当年的自控专业挂科排行榜上分别是三门让菜鸟瑟瑟发抖的科目的当家花旦,《电磁学》《自控原理》《电力电子》三门课的考试到现在还能进入很多人的梦中,迷迷糊糊中还以为没有pass,半夜惊出一身冷汗。如果,有人封装到函数里,我们是连看都不想看一下的。
    还觉得上学受虐不够的看后面的附录7.4永磁无刷直流电机BLDC(一) - 知乎 (zhihu.com), 这里就不搬家了。
   基本上,对于小学水平的可以这么理解。
  • 通过对称120度分布的霍尔传感器,识别每一次电机主磁场旋转过的位置,因为电机是变速的,所以,不能用一个代替对称性
  • 或者用电流驱动磁场后,感性分量阻滞运动的反向感生电动势,来大致感知主磁场的选择位置,
  • 读取电机最终的机端电压和回路电流,如果想省银子,电流可以利用三相的对称性只读取2相,第三项用矢量计算得出,其实,如果系统资源充分,直接读取更省事,这些是反馈分量的输入,
  • 最后,用这两类输入参数,把三相的输入感知,转换成一个合成的总磁场,这个总磁场从理解上是一个正交的,所以需要三相变换为两相,然后需要让这个驱动磁场旋转起来,就是带动了电机荷载选择,用控制调整这个磁场大小方向,就是实现了电机的调速调向。这个理论的旋转磁场,最后还要反变换为三相的,这样才能驱动3个桥臂,6个MOSFET通断,最后实现120度三相——两相正交——120度三相的变换。采用简单通断,就是方波控制,采用变换占空比变换的PWM控制就是静音高效的正弦波控制。
有好看的动图,不过可以自己去找。


5. 电机控制逻辑和开发秘技
5.1 凌鸥创芯电机开发板开发逻辑
这里的代码使用了一个状态机的模式,在这个状态机中,采用扫描的方式访问,可以在主程序的while loop中访问,也可以自定采用RTOS的实时操作系统来启动线程访问。这里设定了不同的标志位,
  • 通过标志位的置位,清除,互锁,参数的更新,保持电机始终在一个唯一确定的状态运行,
  • 同时可以轻松加入保护功能,如过流保护,过压保护,欠压保护等等,
  • 可以轻松扩展新的功能和运行状态,只需要在现有的状态机模式加入新的switch-case选项,确定新的状态,轻松实现新功能

void Sys_State_Machine(void)
{
    switch (struFOC_CtrProc.eSysState)
    {
                case IDLE:   
                {
                        if ((struFOC_CtrProc.bMC_RunFlg) && (stru_Faults.R == 0) && (strubreak_eabs.break_flg == 0))
                        {
                                struFOC_CtrProc.eSysState = INIT;
                        }

                        struFOC_CtrProc.nQVoltageFir = 0;

                        break;
                }

                case INIT:
                {
                        if(stru_BEMF_Check.nBemf_Speed > -10)
                        {
                                struHallProcess.id_close_time = 1500;
                        }
                        else
                        {
                                struHallProcess.id_close_time = 27500;
                        }
               
                        if((stru_Faults.R == 0) && (strubreak_eabs.eabs_flg == 0) && (stru_mos_selfinspection.single_start_self_flg == 0))
                        {
#if (ROTOR_SENSOR_TYPE == ROTOR_HALL_SENSOR)                        
                                if(struHallProcess.nRotorFreqDpp == 3)
                                {
                                        self_inspection_pro(&stru_mos_selfinspection);        /* ×Ô¼ì */
                                       
                                        stru_mos_selfinspection.single_start_self_flg++;
                                }
#else
                        if(struHallProcess.nRotorFreqDpp == 0)
            {
                                struHallProcess.BMEFdelayCnt = 0;
                self_inspection_pro(&stru_mos_selfinspection);        // ×Ô¼ì³ÌÐò
                                stru_mos_selfinspection.single_start_self_flg++;
                                
                                if(stru_mos_selfinspection.self_inspection_result == 0)
                                {
                                        EN_HPWM_FUNC();
                                        StatePosSeek();
                                }
            }
#endif
                                stru_mos_selfinspection.single_start_self_flg++;
                        }
                        
                        if(stru_mos_selfinspection.single_start_self_flg == 2)
                        {
                                struHallProcess.BMEFdelayCnt = 0;
                        }

#if (ROTOR_SENSOR_TYPE == ROTOR_HALL_SENSOR)                        
                        if(struHallProcess.stru_HallRepare.bBrokenHallFlg)
                        {
                                hall_repare_process(&struHallProcess);
                                SetSeekAngleThd(&struHallProcess);
                        }
#endif
                        MCL_Init(&struFOC_CtrProc);
                        
                        struHallProcess.stru_HallRepare.bCommErrCnt = 0;

                        if(stru_mos_selfinspection.self_inspection_result == 0) /* ×Ô¼ìÓдíÎó²»ÄÜÆô¶¯ */
                        {
                                PWMOutputs(ENABLE);
                                struFOC_CtrProc.eSysState = RUN;
                                
#if (ROTOR_SENSOR_TYPE == ROTOR_SENSORLESS)        
                                struHallProcess.BMEFdelayCnt = 0;
#endif
                        }
                        else
                        {
                                struFOC_CtrProc.eSysState = STOP;
                        }

                        break;
                }
                case RUN:   
                {
                        if(((struFOC_CtrProc.bMC_RunFlg | strubreak_eabs.eabs_flg) == 0) || (stru_Faults.R))
                        {
                                struFOC_CtrProc.eSysState = STOP;
                        }

                        break;
                }
                case STOP:   
                {
                        StopMotorImmdly();

                        struFOC_CtrProc.eSysState = WAIT;

                        SetTime_TimeOut_Counter(300);
                        
                        break;
                }
                case WAIT:   
                {
                        if (SetTime_IsElapsed() == TRUE)
                        {
                                struFOC_CtrProc.eSysState = IDLE;
                        }

                        break;
                }
               
                default:
                        break;
    }
}
5.2 完备的参数设置,都集中在一个配置文件中

对于电机的参数,如极对数,旋转速度,最大电压,比速KV值等,都是需要正确配置才能启动的。对于自动控制的参数和系数,也是需要及时校正的,应对不用的操控设备,需要即使调整和变换。
这个问题,对于凌鸥创芯电机开发板LKS32MC071CBT是采用一个公共的应用配置入口实现的,一个模型,适用多种控制方式,丰富的电机旋转,这个参数的调整和选择,是不同应用中,需要深刻理解和反复试验的关键点。
所以,这个开发模型中,虽然提供了丰富的功能和负责的逻辑,但是落实到应用上,却亲切可人,让那些烦人的控制逻辑彻底消失。也可以把专注点都放到应用上。

5.3 在线监测和交流功能
   在其他厂家的电机控制中,有一个非常重要组成部分就是在线采样和在线控制的。通常都有定制的控制软件来和核心控制相交互。在凌鸥创芯电机开发板LKS32MC071CBT中也没有缺位,不过,只是采用了公版的工具RTT 

启动rtt Viewer

同样可以实现在线监测。

6. 小结
   整体来看,这个开发工具比较完美地实现了快速开发高性能直流电机的控制器工具,充分体现了这款芯片的高性能和良好的成本控制能力,是国产芯片差异化竞争的经典艺术品。美中不足的是电机调试中的专有图形化工具还是有所欠缺,不过,攻城狮们都是专业,没有花活也以一样能搞,只有包RTT的数据通道调通了,什么参数搞不过来呢?
  总之,赞一个。

7. 参考资料7.1 LKS官网主页资料 LKS07系列-南京凌鸥创芯电子有限公司-LINKO SEMICONDUCTOR CO.,LTD (lksmcu.com)
7.2 驱动板资料 Gate Driver-南京凌鸥创芯电子有限公司-LINKO SEMICONDUCTOR CO.,LTD (lksmcu.com)
7.3 电源芯片资料 Power-南京凌鸥创芯电子有限公司-LINKO SEMICONDUCTOR CO.,LTD (lksmcu.com)
7.4 BLDC 原理
7.5 BLDC 控制算法


#申请原创#
@21小跑堂






使用特权

评论回复
沙发
yangxiaor520| | 2023-7-1 11:32 | 只看该作者
还带驱动板,这个开发板不错。

使用特权

评论回复
板凳
jiangyimfs| | 2023-7-1 20:28 | 只看该作者
能问一下群主的电机转起来了吗

使用特权

评论回复
地板
tpgf| | 2023-7-7 14:20 | 只看该作者
请问什么是全差分增益放大器?他和普通的增益放大器有什么不同呢

使用特权

评论回复
5
晓伍| | 2023-7-7 14:49 | 只看该作者
可以直接把负值电压接进来进行采集?

使用特权

评论回复
6
wakayi| | 2023-7-7 15:46 | 只看该作者
没有外部晶振是因为内部rc就可以满足要求?

使用特权

评论回复
7
木木guainv| | 2023-7-7 19:15 | 只看该作者
这里的可编程放大器是通过对单片机进行寄存器配置就可以改变的吗

使用特权

评论回复
8
paotangsan| | 2023-7-7 19:46 | 只看该作者
这种在线控制是通过什么数据接口实现的呢

使用特权

评论回复
9
renzheshengui| | 2023-7-7 20:17 | 只看该作者
我们在控制无刷直流电机的时候还需要实时采集电机参数吗

使用特权

评论回复
10
a275124790| | 2023-7-9 20:20 | 只看该作者
楼主这套LKS07x_FOC程序是开源的吗?在哪边可以下载到?

使用特权

评论回复
11
chenjun89| | 2023-7-10 08:17 | 只看该作者
楼主这个是什么电机?

使用特权

评论回复
12
北方西门吹雪|  楼主 | 2023-7-31 16:49 | 只看该作者
wakayi 发表于 2023-7-7 15:46
没有外部晶振是因为内部rc就可以满足要求?

是的,可选外部的

使用特权

评论回复
13
北方西门吹雪|  楼主 | 2023-7-31 16:50 | 只看该作者
chenjun89 发表于 2023-7-10 08:17
楼主这个是什么电机?

t宝上的一个二手电机,汽车拆下来的

使用特权

评论回复
14
北方西门吹雪|  楼主 | 2023-7-31 16:50 | 只看该作者
a275124790 发表于 2023-7-9 20:20
楼主这套LKS07x_FOC程序是开源的吗?在哪边可以下载到?

官方网站可以下载

使用特权

评论回复
15
一路寻你| | 2023-8-8 11:30 | 只看该作者
tpgf 发表于 2023-7-7 14:20
请问什么是全差分增益放大器?他和普通的增益放大器有什么不同呢

你好,差分运算放大器是差分信号输入差分信号输出,配合LINKO芯片的ADC模块可实现正负信号的采集,增强抗干扰性,比如相电流采样,可省略偏置电压;普通运放输出是对地的一个电压信号。

使用特权

评论回复
16
一路寻你| | 2023-8-8 11:33 | 只看该作者
renzheshengui 发表于 2023-7-7 20:17
我们在控制无刷直流电机的时候还需要实时采集电机参数吗

一般应用不需要对电机的参数实时修改,用固定值即可,特殊应如高温,大电流情况下需要对电机参数进行调整,可以是实时监测,也可以根据电机特性进行查表(电机手册提供)。

使用特权

评论回复
17
一路寻你| | 2023-8-8 11:34 | 只看该作者
木木guainv 发表于 2023-7-7 19:15
这里的可编程放大器是通过对单片机进行寄存器配置就可以改变的吗

是的,可以设置运放的增益(放大增益可调),使能(选择是否启动该运放)。

使用特权

评论回复
18
步之道| | 2023-8-25 21:12 | 只看该作者
请问你这个例程电机能动起来吗?我是一样的电机,但是下载进去后动不起来,电机参数也修改了。

使用特权

评论回复
19
zhuhuis| | 2023-8-25 21:46 | 只看该作者
96MHz 32 位 Cortex-M0 内核 ,棒

使用特权

评论回复
20
gfjshenglei| | 2023-10-8 09:03 | 只看该作者
民用电机控制的农民工,哈哈哈

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

33

主题

109

帖子

1

粉丝