本帖最后由 jf_89761755 于 2022-7-4 20:05 编辑
之前有个项目中使用了直线电机,正好用CM32M4xx再来实现一下。其实直线电机和普通的旋转电机原理是一样的,可以理解为把旋转电机拍扁拉长了。稍有一点不同的就是直线电机会到头,旋转电机可以一直转下去。简单的看下示意图:
没有什么特别的,只不过真正要想把直线电机用好了应该使用PWM配合霍尔来实现,根据信号来驱动可以达到最大的扭矩和精度,为了省事我只用了IO口+延时来模拟的,霍尔也忽略了,因为这个项目不需要太精确,一切从简。
CM32M4xx开发板有Arduino接口,正好我有块SimpleFOCShield的板子,直接插上就能用,非常方便。驱动的时候用到了4个IO口,一个Enable控制,3个高低电平的信号替代PWM输出,另外的就是电机的ABC三相接到驱动板的输出口就OK了。主要三相的顺序,颠倒了电机不会跑起来。
简单的示意代码如下:
- #include "HAL.h"
- CGPIO LED6 = {&(CIO){GPIOB, 5, OUTPP, SLOW}, LOW};
- CGPIO LED7 = {&(CIO){GPIOB, 6, OUTPP, SLOW}, LOW};
- CGPIO LED8 = {&(CIO){GPIOB, 7, OUTPP, SLOW}, LOW};
- CINT KEY_TMP = {&(CIO){GPIOC, 13, IPN, SLOW}, FALL};
- CINT KEY_WKUP = {&(CIO){GPIOA, 0, IPN, SLOW}, FALL};
- CINT KEY_USER = {&(CIO){GPIOB, 4, IPN, SLOW}, FALL};
- CGPIO GPO_MTEN = {&(CIO){GPIOA, 11, OUTPP, FAST}, LOW};
- CGPIO GPO_MTA = {&(CIO){GPIOD, 12, OUTPP, FAST}, LOW};
- CGPIO GPO_MTB = {&(CIO){GPIOC, 12, OUTPP, FAST}, LOW};
- CGPIO GPO_MTC = {&(CIO){GPIOA, 3, OUTPP, FAST}, LOW};
- static bool Working = false;
- static void Shot(void)
- {
- Working = true;
- GPIO_Set(&GPO_MTEN, HIGH);
- u16 J = 2;
- for (u8 I = 1; I <= 1; I++)
- {
- GPIO_Set(&GPO_MTA, HIGH);
- DelayMS(J);
- GPIO_Set(&GPO_MTB, HIGH);
- DelayMS(J);
- GPIO_Set(&GPO_MTA, LOW);
- DelayMS(J);
- GPIO_Set(&GPO_MTC, HIGH);
- DelayMS(J);
- GPIO_Set(&GPO_MTB, LOW);
- DelayMS(J);
- GPIO_Set(&GPO_MTA, HIGH);
- DelayMS(J);
- GPIO_Set(&GPO_MTC, LOW);
- }
- GPIO_Set(&GPO_MTA, LOW);
- GPIO_Set(&GPO_MTB, LOW);
- GPIO_Set(&GPO_MTC, LOW);
- GPIO_Set(&GPO_MTEN, LOW);
- Working = false;
- }
- static void Callback_KEY_TMP(CINT* INTx, bool Level)
- {
- if (Working) return ;
- GPIO_Set(&LED6, HIGH);
- Shot();
- GPIO_Set(&LED6, LOW);
- }
- static void Callback_KEY_WKUP(CINT* INTx, bool Level)
- {
- }
- static void Callback_KEY_USER(CINT* INTx, bool Level)
- {
- }
- int main(void)
- {
- SetSysClockToPLL(FREQ_24M, HSE);
- GPIO_InitCM(&LED6);
- GPIO_InitCM(&LED7);
- GPIO_InitCM(&LED8);
- GPIO_Set(&LED6, LOW);
- GPIO_Set(&LED7, LOW);
- GPIO_Set(&LED8, LOW);
- INT_InitCM(&KEY_TMP, Callback_KEY_TMP);
- INT_InitCM(&KEY_WKUP, Callback_KEY_WKUP);
- INT_InitCM(&KEY_USER, Callback_KEY_USER);
- INT_Enable(&KEY_TMP);
- INT_Enable(&KEY_WKUP);
- INT_Enable(&KEY_USER);
- GPIO_InitCM(&GPO_MTEN);
- GPIO_InitCM(&GPO_MTA);
- GPIO_InitCM(&GPO_MTB);
- GPIO_InitCM(&GPO_MTC);
- GPIO_Set(&LED6, HIGH);
- Shot();
- GPIO_Set(&LED6, LOW);
- while (1)
- {
- }
- }
复制代码
配合我封装的库5分钟搞定。看下效果:
https://www.bilibili.com/video/BV1TB4y1i7et?share_source=copy_web
CM32M4xx还是挺好用的。
|