当前位置:   article > 正文

STM32驱动船模ROV无刷电机马达(新西达无刷电调30A)_stm32驱动马达

stm32驱动马达

文章目录

    • 概要
    • 电机、电调
    • 电机测试
    • 代码
    • 小结

一、概要

        老规矩开头说一下写此文章的原由,Up最近在做一个水下救生包的大创小项目,需要用到船模的ROV无刷电机马达,在淘宝店买了电机,因为手上有一个闲置的新西达30A无刷电调,因此没有买店家配套的电调。等设计的PCB板子打样焊接完成后,开始撸代码。在准备测试无刷电机马达的时候,网上各种查资料,接线这些想必不用我多说了吧【手动小狗头】,做为一个工科生,只要烙铁握的紧,它就烫不到我。扯远了……

        因为之前没玩过穿越机,这算是第一次接触无刷电机。通过各种查资料,了解到无刷电机驱动第一次上电需要油门校准,先满油门等几秒,电机会发出哔哔哔三声,代表满油门校准成功,然后停车等待几秒,电机发出哔一声,代表校准成功。然后就可以玩了,看着简单,到我自己上手的时候,感觉就有点蒙。

        首先是驱动频率,看CSDN上大佬们的帖子,有人说50Hz,也有人说是500Hz,众说不一。而且满油门的参数比和停车的参数不同的电机不一样,我也不确定用哪个,一想先试试再说,我就先用的500Hz驱动频率,看了大佬们满油门和停车的参数,初始化校准油门,结果上电之后ROV马达一直以一定频率哔哔哔的响个不停。重新测试了几组参数,折腾了蛮久(技术太菜,哎),终于转起来了,莫名激动!所以就想记录下来,帮助和我一样遇到相同问题的人。闲话不多说了,上菜!

二、电机、电调

三、电机测试

ROV电机马达调速测试

四、代码

motor.h

  1. #ifndef __MOTOR_DRIVER_H
  2. #define __MOTOR_DRIVER_H
  3. void Motor_PWM_Init(void);
  4. void Motor_Driver_Init(void);
  5. void Motor_Driver_Speed(uint16_t Speed);
  6. #endif

motor.c

  1. #include "stm32f10x.h" // Device header
  2. #include "Delay.h"
  3. void Motor_PWM_Init(void)
  4. {
  5. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
  6. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
  7. /*初始化GPIO口为复用推挽输出模式*/
  8. GPIO_InitTypeDef GPIO_InitStructure;
  9. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  10. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
  11. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  12. GPIO_Init(GPIOB, &GPIO_InitStructure);
  13. /*选择时钟源为系统时钟*/
  14. TIM_InternalClockConfig(TIM3);
  15. /*时基单元初始化*/
  16. TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
  17. TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
  18. TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
  19. TIM_TimeBaseInitStructure.TIM_Period = 20000 - 1;//ARR的值决定PWM的周期50HZ,20ms
  20. TIM_TimeBaseInitStructure.TIM_Prescaler = 72 - 1;//预分频系数给72,主频1MHz
  21. TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 1;
  22. TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure);
  23. TIM_OCInitTypeDef TIM_OCInitStructure;
  24. TIM_OCStructInit(&TIM_OCInitStructure);
  25. TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  26. TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  27. TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  28. TIM_OCInitStructure.TIM_Pulse = 0;//占空比
  29. TIM_OC3Init(TIM3, &TIM_OCInitStructure);
  30. TIM_Cmd(TIM3, ENABLE);
  31. }
  32. void Motor_Driver_Init()
  33. {
  34. Motor_PWM_Init();
  35. PWM_SetCompare3(2000);
  36. Delay_ms(3000);
  37. PWM_SetCompare3(1500);
  38. Delay_ms(3000);
  39. }
  40. void Motor_Driver_Speed(uint16_t Speed)
  41. {
  42. uint16_t temp;
  43. temp = (((float)Speed)/100)*500+1500;
  44. TIM_SetCompare3(TIM3, temp);
  45. }

main.c

  1. #include "stm32f10x.h" // Device header
  2. #include "Delay.h"
  3. #include "Key.h"
  4. #include "Motor_Driver.h"
  5. uint16_t Speed= 0;
  6. uint8_t Key_Num;
  7. int main(void)
  8. {
  9. Key_Init();
  10. Motor_Driver_Init();
  11. while(1)
  12. {
  13. Key_Num = Key_GetNum();
  14. if(Key_Num == 1)
  15. {
  16. if(Speed >99)
  17. {
  18. Speed = 99;
  19. }
  20. Speed++;
  21. }
  22. else if(Key_Num == 2)
  23. {
  24. if(Speed < 1)
  25. {
  26. Speed = 1;
  27. }
  28. Speed--;
  29. }
  30. else
  31. {}
  32. Motor_Driver_Speed(Speed);
  33. }
  34. }

        经过测试,驱动频率取50Hz,油门行程在1.5ms~2ms之间驱动效果比较好,可以看我的测试视频,占空比1.5ms停车,2ms满速跑。Motor_Driver_Speed()函数里面对形参做了范围映射,Speed参数为0~100,对应占空比参数1500~2000。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/960103
推荐阅读
相关标签
  

闽ICP备14008679号