RISC-V技术william hill官网
直播中

jf_89761755

4年用户 141经验值
擅长:嵌入式技术
私信 关注

【芯昇科技RISC-V生态开发板试用体验】CM32M4xx 驱动 直线电机

本帖最后由 jf_89761755 于 2022-7-4 20:05 编辑

    之前有个项目中使用了直线电机,正好用CM32M4xx再来实现一下。其实直线电机和普通的旋转电机原理是一样的,可以理解为把旋转电机拍扁拉长了。稍有一点不同的就是直线电机会到头,旋转电机可以一直转下去。简单的看下示意图:
1.gif
    没有什么特别的,只不过真正要想把直线电机用好了应该使用PWM配合霍尔来实现,根据信号来驱动可以达到最大的扭矩和精度,为了省事我只用了IO口+延时来模拟的,霍尔也忽略了,因为这个项目不需要太精确,一切从简。


2.png
    CM32M4xx开发板有Arduino接口,正好我有块SimpleFOCShield的板子,直接插上就能用,非常方便。驱动的时候用到了4个IO口,一个Enable控制,3个高低电平的信号替代PWM输出,另外的就是电机的ABC三相接到驱动板的输出口就OK了。主要三相的顺序,颠倒了电机不会跑起来。


    简单的示意代码如下:
  1. #include "HAL.h"

  2.         CGPIO LED6 = {&(CIO){GPIOB, 5, OUTPP, SLOW}, LOW};
  3.         CGPIO LED7 = {&(CIO){GPIOB, 6, OUTPP, SLOW}, LOW};
  4.         CGPIO LED8 = {&(CIO){GPIOB, 7, OUTPP, SLOW}, LOW};

  5.         CINT KEY_TMP = {&(CIO){GPIOC, 13, IPN, SLOW}, FALL};
  6.         CINT KEY_WKUP = {&(CIO){GPIOA, 0, IPN, SLOW}, FALL};
  7.         CINT KEY_USER = {&(CIO){GPIOB, 4, IPN, SLOW}, FALL};

  8.         CGPIO GPO_MTEN = {&(CIO){GPIOA, 11, OUTPP, FAST}, LOW};
  9.         CGPIO GPO_MTA = {&(CIO){GPIOD, 12, OUTPP, FAST}, LOW};
  10.         CGPIO GPO_MTB = {&(CIO){GPIOC, 12, OUTPP, FAST}, LOW};
  11.         CGPIO GPO_MTC = {&(CIO){GPIOA, 3, OUTPP, FAST}, LOW};

  12.         static bool Working = false;

  13. static void Shot(void)
  14. {
  15.         Working = true;
  16.         GPIO_Set(&GPO_MTEN, HIGH);

  17.         u16 J = 2;
  18.         for (u8 I = 1; I <= 1; I++)
  19.         {
  20.                 GPIO_Set(&GPO_MTA, HIGH);
  21.                 DelayMS(J);
  22.                 GPIO_Set(&GPO_MTB, HIGH);
  23.                 DelayMS(J);
  24.                 GPIO_Set(&GPO_MTA, LOW);
  25.                 DelayMS(J);
  26.                 GPIO_Set(&GPO_MTC, HIGH);
  27.                 DelayMS(J);
  28.                 GPIO_Set(&GPO_MTB, LOW);
  29.                 DelayMS(J);
  30.                 GPIO_Set(&GPO_MTA, HIGH);
  31.                 DelayMS(J);
  32.                 GPIO_Set(&GPO_MTC, LOW);
  33.         }

  34.         GPIO_Set(&GPO_MTA, LOW);
  35.         GPIO_Set(&GPO_MTB, LOW);
  36.         GPIO_Set(&GPO_MTC, LOW);
  37.         GPIO_Set(&GPO_MTEN, LOW);

  38.         Working = false;
  39. }

  40. static void Callback_KEY_TMP(CINT* INTx, bool Level)
  41. {
  42.         if (Working) return ;

  43.         GPIO_Set(&LED6, HIGH);
  44.         Shot();
  45.         GPIO_Set(&LED6, LOW);
  46. }

  47. static void Callback_KEY_WKUP(CINT* INTx, bool Level)
  48. {

  49. }

  50. static void Callback_KEY_USER(CINT* INTx, bool Level)
  51. {

  52. }

  53. int main(void)
  54. {
  55.         SetSysClockToPLL(FREQ_24M, HSE);

  56.         GPIO_InitCM(&LED6);
  57.         GPIO_InitCM(&LED7);
  58.         GPIO_InitCM(&LED8);

  59.         GPIO_Set(&LED6, LOW);
  60.         GPIO_Set(&LED7, LOW);
  61.         GPIO_Set(&LED8, LOW);

  62.         INT_InitCM(&KEY_TMP, Callback_KEY_TMP);
  63.         INT_InitCM(&KEY_WKUP, Callback_KEY_WKUP);
  64.         INT_InitCM(&KEY_USER, Callback_KEY_USER);

  65.         INT_Enable(&KEY_TMP);
  66.         INT_Enable(&KEY_WKUP);
  67.         INT_Enable(&KEY_USER);

  68.         GPIO_InitCM(&GPO_MTEN);
  69.         GPIO_InitCM(&GPO_MTA);
  70.         GPIO_InitCM(&GPO_MTB);
  71.         GPIO_InitCM(&GPO_MTC);

  72.         GPIO_Set(&LED6, HIGH);
  73.         Shot();
  74.         GPIO_Set(&LED6, LOW);

  75.         while (1)
  76.         {

  77.         }
  78. }
   配合我封装的库5分钟搞定。看下效果:
[media]https://www.bilibili.com/video/BV1TB4y1i7et?share_source=copy_web[/media]
[media] [/media]
  CM32M4xx还是挺好用的。

回帖(1)

jf_89761755

2022-7-3 17:48:06
发完了发现视频没有嵌入进来,不知道评论里能不能
1 举报
  • dianzi: 需要内嵌视频的话,需要使用Markdown编辑器。
    另外发帖页面是支持发布视频的,可以直接点击上传。

更多回帖

发帖
×
20
完善资料,
赚取积分