本帖最后由 大衍嵌入式 于 2025-8-31 23:01 编辑
一、来源和简介 很荣幸从CW32社区申请到此驱动板。实物有精美的外壳,下述图片是我测试的时候拍的实物图(上盖子已拆)。 CW32L011是Arm® Cortex®-M0+ 内核,32pin,这个驱动板把32个脚全部用上了,非常赞。 项目开源链接: https://oshwhub.com/beauty_light/cw32l011-dian-ji-qu-dong 软硬件都是开源的,官方例程序分为有霍尔和无霍尔两种,由于时间关系,本人重点测试了有霍尔的方案。 一、原理简述 有霍尔的方案采用的是六步换相的原理实现的控制。可参考这个帖子。https://blog.csdn.net/weixin_66732375/article/details/144739335 这种方案是方波控制,整体而言效率较低,电机转5分钟不到就非常烫手了。硬件我给满分,但是软件还是有优化空间的,后续有时间我会考虑改为FOC控制,可用参考simpleFoc这个开源项目,B站有个Up主就是搞这个的。 二、代码结构拆解 下面就相关代码实现原理做简要分析。 1.初始化 首先是时钟、LED、方向控制、使能控制、速度反馈脉冲、三相ADC、控制电位计ADC、供电电压ADC、三相控制、定时器、霍尔等GPIO和内部功能的初始化。并且完成A相零电流的ADC值读取, 时钟配置的是96Mhz;5路ADC读取用了中断,并且对数据进行了平均值法滤波;电机MOS管是用PWM控制,且默认状态下桥全部导通;配置了一个ms定时器,霍尔的电平读取用的也是中断的方案。 2.主循环 每20ms进入一次读取电位器控制电压,并且根据输入电压和设定电机最大转速和最小转速算出了一个加速斜率,ADC小于150时不响应,大于200以上才响应。最后得到一个目标转速。 每2ms进入累加一次ADC读取的电流,每100ms进入判断一次母线电压,母线电压小于10V或高于28V都报警。每100ms进入计算一次相线电流,相电流的计算方法没完全看懂,注释写的也不是很清楚,大体意思就是相电流超过30A就报警了。 霍尔用的是中断的方案,转速是计算1分钟的脉冲数量除3个霍尔乘2,也就是一相一圈霍尔触发中断的次数,最后除以极对数,就能得出当前的转速。 如果电机转速低于5且持续5S就报堵转。 再下面就是一个状态机。第一个状态机包括电位器电压、使能和方向等是否符合预期。然后进入第二个状态机,等待控制信号持续200ms以上就开始进入启动状态,防止误触发。第三个状态机是进入启动流程,先给一个60的目标转速,然后每间隔20ms读取一次转速,然后每间隔10ms增加60的转速,直到实际转速大于等于目标转速后停止加速,并进入下一个状态机;第四个状态就是稳定的每间隔20ms读取一次转速并进行一次PID运算。期间还有监测使能端是否有效,如果使能断开且持续一定时间就进入停止模式。 另外一个关键点就是PID控制了,此处只是用到了PI功能,也就是比例和积分功能,主要以比例为主,积分值较小,微分为0。 由于时间关系,其他功能不在此啰嗦了。 三、结论 本次测评发现CW32的技术还是非常过硬的,自己做了驱动器并且开源,能够大大降低开发者的上手难度。上手比较快,开发者友好。MCU也非常好,麻雀虽小五脏俱全。另外例程的485功能应该是空白,但是硬件预留了端口,等有时间我自己来写写。而且这个软件最好是FOC的,目前的六步换相控制效率比较低,电机很容易发热。 最后由衷的感谢CW社区提供的驱动器,我又获得了一项新技能。 项目开源地址: https://gitee.com/Dayan_Embedded/CW32L011.git
|