• 【一】工程配置与电机控制part1


    前言

    关于电机的选择。
    学校发的无刷电机:

    我们准备的有刷电机:

    带霍尔编码器!

    电机参数:
    名称:驰名电机(直流减速电机)

    型号:JGA25-370

    电压:12V

    转数:1360r/min

    既然做云台,那么核心是PID控制。PID以后再讲。本期先讲电机的部分内容。

    无刷or有刷?

    无刷电机需要foc控制与SVPWM调制,算法较为繁琐。捣鼓期间也遇到不少bug,故舍弃无刷电机,选择有刷电机。为啥?代码简单呗!

    (补充:若无刷电机用PWM而不是SVPWM,则会很烫很烫,烧起来也说不定~)

    一、硬件准备

    • stm32F401/411开发版(SAST)
    • J-LINK/ST-LINK下载器
    • 直流有刷电机JGA25-370(带编码器
    • 电机驱动板L298N/TB6612
    • 12V锂电池

    二、工程配置

    新建stm32工程,这里采用的是cubmx+keil5方式。(不会还用人用标准库吧:-))

    我用的是F411。

    1、尝龟配置

    使用外部高速晶振、Debug选Serial Wire。(我用的是J-LINK下载器)时钟树开HCLK为100MHz。(F411最大HCLK)

    2、设置PWM输出

    TIM5设置为内部时钟—CH3—PWM Generation。命名为PWM。

    一般而言,给电机的PWM波大约2kHz

    配置HCLK=100MHz(F411最大HCLK),PSC=50-1,ARR=1000-1。

    由频率计算公式可得:

    f=freq(HCLK)(PSC+1)(ARR+1)=100,000,000501000=2kHz

    其余默认配置即可。
    (注:因为是PWM输出,所以没必要使能NVIC中断)

    3、设置两个IO口输出

    用于控制电机转动方向,命名为DIR1和DIR2。

    设置PA3—Output与PA4—Output。其余默认配置即可。

    4、设置编码器模式

    关于编码器模式,很多人可能不李姐。详细的会在以后的文章里写。这里先粗略写一下。

    电机工作时,通过霍尔编码器输出AB相脉冲,单片机读取脉冲数以得到转速与角度等信息,我们还要对采集到的数据进行处理。而stm32定时器正好有个编码器模式,我们只需读取定时器计数值就能知道脉冲数为多少。

    TIM2—Combined Channels—Encoder Mode

    下面的都不用设置。

    把图中的三个(TIM2_CH1和TIM2_CH2和PWM)Signal Pinning一下。

    5、设置中断

    打开一个定时器更新中断,在这个中断里我们处理编码器的数据以得到转速、角度等信息,并进行PID控制。

    TIM4设置为内部时钟即可。

    配置HCLK=100MHz(F411最大HCLK),PSC=1000-1,ARR=1000-1。

    中断一般为100Hz

    f=freq(HCLK)(PSC+1)(ARR+1)=100,000,00010001000=100Hz

    别忘了在NVIC Settings使能中断。

    6、打开一个串口

    用于调试。

    尝龟设置,设置设置MODE为异步通信(Asynchronous)。其余的默认即可。(波特率为115200)

    别忘了在keil里写串口重定向。

    7、生成keil工程

    尝龟配置。

    设置工程名称、路径(不要有中午路径),

    配置IDE为MDK-ARM。代码生成配置勾选图中红框处。

    点击GENERATE CODE生成工程!

    8、keil配置

    打开工程配置,勾选“use MicroLIB”,Debug选择J-LINK,并在Settings-Flash-Download勾选“Reset and Run”,然后编译一次。

    接下来加上串口重定向:

    先包含头文件#include<stdio.h>,在/* USER CODE BEGIN 4 // USER CODE END 4 */之间添加以下代码:

    int fputc(int ch, FILE *f)
    {
      HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
      return ch;
    }
    
    int fgetc(FILE *f)
    {
      uint8_t ch = 0;
      HAL_UART_Receive(&huart1, &ch, 1, 0xffff);
      return ch;
    }
    

    工程基本配置ok!

    三、驱动板L298N/TB6612

    电机驱动需要驱动板,直接用单片机驱动是不行的。我们比赛时用的是L298N。

    1、L298N

    L298N驱动模块,可以驱动2个直流电机,可分别实现正转,反转功能。

    供电:L298N的12V和5V都接5V供电,GND不但要接驱动电源的GND。这里要和单片机连接在一起,要从这里再引出一根GND和单片机的GND相连(共地)。

    OUT1、OUT2和OUT3、OUT4分别接两个直流电机Motor1两脚、Motor2两脚,IN1、IN2、IN3、IN4引脚从单片机接入控制电平,控制电机的正反转,ENA、ENB接控制使能端,控制电机调速,L298N控制逻辑关系图如下:

    对于ENA通道使能引脚,若不考虑电机的转速,可接为高电平或低电平控制接通还是关断。

    若需要控制电机的转速,则需要拔掉跳线帽,将其连接在单片机PWM输出上,通过调节PWM的占空比,以此来达到控制转速的目的。

    转速控制原理:利用STM32 的IO输出不同占空比的脉冲信号来达到调速的过程,当占空比大的时候就表明在一个脉冲周期内高电平的时间越长,而脉冲信号输出频率极快,高电平的时间越长就表明在一段时间内IO口输出的控制电压越高,控制电压越高使得L298N输出的电压越高,这样就使得车轮的转速越快。

    接线:

    这里我们因为只要一个电机转,故OUT3、OUT4接电机的两脚,IN3、IN4分别接PA3、PA4控制转动方向,ENB接PA2输出PWM,12V供电脚和GND接12V锂电池,GND和单片机共地。

    2、TB6612

    原理、接线类似于L298N。此处不再赘述。

    接下来是代码部分。

    首先我们让电机转起来!

    四、PWM控制

    先写定时器PWM输出启动函数:

    /* USER CODE BEGIN 2 */
    HAL_TIM_PWM_Start(&htim5, TIM_CHANNEL_3);
    /* USER CODE END 2 */
    

    然后写一个PWM调制函数void set_pwm(int pwm);

    int型变量pwm的范围应在-100~100之间(ARR设定的值为100),将它赋值给CRR(通过调节CRR的值来调节PWM波占空比,进而实现转速控制)。pwm的正负表示转动方向,分别使PA3和PA4输出不同电平来控制方向(见逻辑表)。

    /* USER CODE BEGIN 4 */
    void set_pwm(int pwm)
    {
        //限定pwm范围
        if(pwm > 1000)pwm = 1000;
    
        if(pwm < -1000)pwm = -1000;
    
        //转速控制
        if(pwm < 0)
        {
            HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, 1);
            HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, 0);
        }
    
        if(pwm > 0)
        {
            HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, 0);
            HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, 1);
        }
    
        //写CRR的值调节占空比
        TIM5->CCR3 = (int)fabs((float)pwm);   //记得#include<math.h>
    }
    /* USER CODE END 4 */
    

    比如,输出一个占空比50%的PWM波控制电机正转:

    set_pwm(500);
    

    OK本期就到这里。往后还有电机控制part2、3,分别分享PID、编码器相关。还有MPU6050移植从入坑到入坟。


    __EOF__

  • 本文作者: Loafing日寄
  • 本文链接: https://www.cnblogs.com/qhwyx/p/16019021.html
  • 关于博主: I am a college student who is good at loafing.
  • 版权声明: 版权所有,侵权必究
  • 声援博主: 如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。
  • 相关阅读:
    2024华为OD机试真题-伐木工-(C++/Python)-C卷D卷-200分
    最长递增子序列及最优解、动物总重量问题
    JAVA:实现将位置 i 处的字符与位置 j 处的字符交换的函数算法(附完整源码)
    Spring boot测试找不到SpringRunner.class的问题
    SD00HA 80mΩ,可调快速响应限流功率开关芯片IC
    前端面试问题(3)
    备战金九银十!!! 互联网Java岗面试手册,收藏=offer拿到手软!!
    【定时开关机】windows 10 如何设置定时开关机
    激活函数(机器学习)
    18105 银行的叫号顺序
  • 原文地址:https://www.cnblogs.com/qhwyx/p/16019021.html