0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于IHM16M1开发板调节电机转速

易络盟电子 来源:电子工程世界 2025-05-26 10:12 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

01测试介绍

本次测试使用MC SDK提供的API函数调节电机的转速。

测试硬件:

IHM16M1 +NUCLEO-G431RB 电机套件

SSD1306 OLED IIC接口显示屏·

EC1 旋转编码器

RED LED

ZD2808-V1.9 BLDC 电机

杜邦线+万用板+Type-C连接线

12V 1A开关电源

测试使用EC1旋转编码器调节电机的目标转速,使用开发板user1按钮启动/停止电机。OLED显示电机转速和调节转速设置,LED指示电机状态

89deddbc-36a2-11f0-afc8-92fbcf53809c.png

02开发板资源分配

SSD1306 OLED使用 I2C1 接口,引脚 PB9 =>SDA ,PB8 => SCL

EC1旋转编码器 使用 TIM3定时器 ,引脚 PC6 => TIM3_CH1,PC7 => TIM3_CH2

RED LED ,引脚 PB7 => LED

8d045ddc-36a2-11f0-afc8-92fbcf53809c.png

LED需要串接 2K 电阻R,不可以直接接入MCU引脚。

03程序设置与引脚分配

1、旋转编码设置

8d2289ec-36a2-11f0-afc8-92fbcf53809c.png

EC1旋转编码器,使用TIM3定时器,模式设置为:ENCoder MODE,引脚PC6 => EC1_CLK, PC7 => EC1_DT

输入过滤值选择:15,其它默认。如果EC1旋转时跳动厉害,可以降低TIM3预分频器。

2、SSD1306 128*64 OLED

8dca3138-36a2-11f0-afc8-92fbcf53809c.png

OLED使用I2C1作为控制,引脚PB9 =>OLED_SDA ,PB8 => OLED_SCL

3、RED LED

8dec26da-36a2-11f0-afc8-92fbcf53809c.png

LED使用GPIO PB8引脚,将引脚设置上拉和输出模式。

04程序与工作原理

1、EC1是一种简易的旋转编码器,可以生产两路脉冲CLK、DT,该组脉冲相差90度,编码器作为机械部件其输出的波形不如磁编的好,所以输出引脚需要上拉电阻和103的电容滤波

编码器可以使用__HAL_TIM_GET_COUNTER(&htim3)获得编码的计数累加值。__HAL_TIM_SetCounter(&htim3,0);设置编码器的初始值。

向上滑动阅览

 /* Configure the system clock */
  SystemClock_Config();


  /* USER CODE BEGIN SysInit */


  /* USER CODE END SysInit */


  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_ADC1_Init();
  MX_ADC2_Init();
  MX_CORDIC_Init();
  MX_TIM1_Init();
  MX_USART2_UART_Init();
  MX_MotorControl_Init();
  MX_I2C1_Init();
  MX_TIM3_Init();


  /* Initialize interrupts */
  MX_NVIC_Init();
  /* USER CODE BEGIN 2 */
  
  rspeed = MC_GetMecSpeedReferenceMotor1();
  HAL_TIM_Encoder_Start(&htim3,TIM_CHANNEL_ALL);
  ssd1306_Init();
  ssd1306_Fill(Black);
  
  ssd1306_SetCursor(0, 0);
  ssd1306_WriteString("EEWORLD", Font_11x18, White);
  
  
  ssd1306_UpdateScreen();
  /* USER CODE END 2 */


  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    if (IDLE == MC_GetSTMStateMotor1())
    {
       /* Ramp parameters should be tuned for the actual motor */
       HAL_GPIO_WritePin(Mstatus_GPIO_Port,Mstatus_Pin,GPIO_PIN_RESET);
       speed = 0;
       counter = __HAL_TIM_GET_COUNTER(&htim3);
       
       if(counter != counter_old)
       {
         //rspeed = MC_GetMecSpeedReferenceMotor1(); 
         rspeed += counter/2;
         if( rspeed <0)
         { 
           rspeed=0; 
           __HAL_TIM_SetCounter(&htim3,0);
         }
         if( rspeed > 420)
         { 
            rspeed=420; 
           __HAL_TIM_SetCounter(&htim3,0);
         }  
         MC_ProgramSpeedRampMotor1(rspeed, 1000);
        
       }
       counter_old = counter;
   
    }
    else
    {
       HAL_GPIO_WritePin(Mstatus_GPIO_Port,Mstatus_Pin,GPIO_PIN_SET); 
       speed = MC_GetMecSpeedAverageMotor1();
    }
    ssd1306_Fill(Black);
    
    ssd1306_SetCursor(0, 0);
    ssd1306_WriteString("SPEED TEST", Font_11x18, White);
  
    ssd1306_SetCursor(0, 20);
    memset(MessageStr,'�',sizeof(MessageStr));
    sprintf(MessageStr,"%d RPM",speed * 6);
    ssd1306_WriteString(MessageStr, Font_11x18, White);
    
    ssd1306_SetCursor(0, 40);
    memset(MessageStr,'�',sizeof(MessageStr));
    sprintf(MessageStr,"%d R",rspeed * 6);
    ssd1306_WriteString(MessageStr, Font_11x18, White);
    ssd1306_UpdateScreen();
    /* USER CODE END WHILE */


    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}



2、电机的状态使用MC_GetSTMStateMotor1()函数返回,IDLE状态为电机停止且准备好状态,在该状态下可以调节参数和设置电机启动。本例将电机参数设置放在该状态下完成。

向上滑动阅览

if (IDLE == MC_GetSTMStateMotor1())
  {
    /* Ramp parameters should be tuned for the actual motor */
    HAL_GPIO_WritePin(Mstatus_GPIO_Port,Mstatus_Pin,GPIO_PIN_RESET);
    speed = 0;
    counter = __HAL_TIM_GET_COUNTER(&htim3);
    
    if(counter != counter_old)
    {
     //rspeed = MC_GetMecSpeedReferenceMotor1(); 
     rspeed += counter/2;
     if( rspeed <0)
         { 
           rspeed=0; 
           __HAL_TIM_SetCounter(&htim3,0);
         }
         if( rspeed > 420)
     { 
      rspeed=420; 
      __HAL_TIM_SetCounter(&htim3,0);
     } 
     MC_ProgramSpeedRampMotor1(rspeed, 1000);
    
    }
    counter_old = counter;
  
  }
  else
  {
    HAL_GPIO_WritePin(Mstatus_GPIO_Port,Mstatus_Pin,GPIO_PIN_SET); 
    speed = MC_GetMecSpeedAverageMotor1();
  }

参数设置:MC_ProgramSpeedRampMotor1(rspeed, 1000);该函数可以设置从上一个状态到目标状态需要持续的时间,其时间斜率需要根据电机的性能参数而定。

05测试

修改转速过程,使用旋转编码器进行参数的调节,顺时针:增加转速,逆时针:降低转速

以上测评内容撰写自电子工程世界(EEWORLD)用户:bigbat。感谢这位小伙伴对测评活动的大力支持!

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • OLED
    +关注

    关注

    121

    文章

    6333

    浏览量

    232556
  • 编码器
    +关注

    关注

    45

    文章

    3905

    浏览量

    141467
  • 电机
    +关注

    关注

    143

    文章

    9488

    浏览量

    153212
  • 开发板
    +关注

    关注

    25

    文章

    6132

    浏览量

    113509

原文标题:【测评分享】IHM16M1开发板电机调速攻略

文章出处:【微信号:易络盟电子,微信公众号:易络盟电子】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    Nucleo-F446RE+X-NUCLEO-IHM07M1生成的应用为什么启动设置参数无效?

    开发板Nucleo-F446RE+X-NUCLEO-IHM07M1工具版本MC6.1.2,通过profiler测得电机参数转速最高4200以及霍尔角120度+303度。用workben
    发表于 03-07 08:03

    X-NUCLEO-IHM16M1驱动上三电阻采样和单电阻采样是怎么切换的?

    由于没有实物,没有详细图片介绍,想了解一下 X-NUCLEO-IHM16M1 驱动上怎么切换三电阻和单电阻?想买块开发板来用,官方规格书没明说这个,说是在板子背面,具体是需要焊接还是可以通过跳帽?因为 X-NUCLEO-
    发表于 03-12 06:26

    STM32F103RB+IHM07M1 SDK中显示Feedback Error是哪里的问题?

    我购买了F103RB开发板,以及IHM07M1, 用SDK 5.2 新建工程,选择了这2个,以及Bull电机。 产生了代码,编译通过。 串口建立连接,可以看到部分参数在变化。但是
    发表于 04-25 07:46

    X-NUCLEO-IHM07M1电机调速降不了是什么原因导致的?

    电源{:2:}P-NUCLEO-IHM002)套件 电源(12V 2A) 主控:Nucleo-F303RE 驱动:X-NUCLEO-IHM7M1
    发表于 04-25 07:51

    《电子发烧友电子设计周报》聚焦硬科技领域核心价值 第13期:2025.05.26--2025.05.30

    内存映射 5、基于IHM16M1开发板调节电机转速 6、如何借助NVIDIA ARC-Compact在基站部署AI-RAN 7、中微爱芯触摸芯片注入电流提高指南 8、飞凌i.MX935
    发表于 05-30 19:39

    转:P-NUCLEO-IHM001 电机开发板串口调试指南

    前言P-NUCLEO-IHM001 是一款功能强大,且小巧的针对永磁同步电机开发板。本文介绍如何通过该套件上的虚拟串口来实现串口调试电机
    发表于 07-15 17:16

    怎么制作一个用PWM调节电机转速的程序

    你好!我想制作一个用PWM调节电机转速的程序,但是我不知道如何让PWM工作。我用的是PIC32MX270F256B。我做了一些研究,但没有成功。一些示例代码会很好,谢谢!
    发表于 09-06 14:27

    请问F28027F控制无刷电机转速的函数是什么?

    \boostxldrv8301_revB\f28x\f2802xF\projects\ccs5\proj_lab05b例子,如果在运行中想随时调节电机转速用哪个函数?还是改变CTRL object的值?
    发表于 06-02 11:47

    如何通过PWM调节电机的PWM?

    的高低电平来实现PWM信号的输出,从而控制电机的速度。  三、测试  将代码下载到主控上,点击BOOT按键,观察电机转速。  四、总结  本节我们通过简单的一个实验学习了如何通过PW
    发表于 03-27 16:36

    Explorer 16开发板用户指南

    Explorer 16开发板用户指南 本章包含使用Explorer 16 开发板前需要了解的有用的一般信息。内容包括:• 文档编排• 本指南中使用的约定
    发表于 04-15 09:42 25次下载

    Cepark AVR M16开发板原理图

    本内容向大家提供了Cepark AVR M16开发板原理图 希望对大家学习上有所帮助
    发表于 04-11 17:06 179次下载
    Cepark AVR <b class='flag-5'>M16</b><b class='flag-5'>开发板</b>原理图

    STEVAL-IHM042V1原理图

    STEVAL-IHM042V1 电机驱动DEMO的原理图
    发表于 11-11 16:34 12次下载

    IHM01A1步进电机驱动的电路原理图免费下载

    本文档的主要内容详细介绍的是IHM01A1步进电机驱动的电路原理图免费下载。
    发表于 03-09 08:00 5次下载
    <b class='flag-5'>IHM01A1</b>步进<b class='flag-5'>电机</b>驱动<b class='flag-5'>板</b>的电路原理图免费下载

    无刷电机开发板资料

    无刷电机开发板资料(内含开发板电路文件,程序)
    发表于 03-11 15:17 0次下载

    X-NUCLEO-IHM09M2电机控制扩展板技术解析与应用指南

    morpho和电机控制连接器连接STM32 Nucleo开发板与外部ST电机控制电源。该款34引脚电机控制连接器与众多ST
    的头像 发表于 10-29 10:26 2553次阅读
    X-NUCLEO-<b class='flag-5'>IHM09M</b>2<b class='flag-5'>电机</b>控制扩展板技术解析与应用指南