有刷直流电机控制笔记

目标: 实现通过电脑点击按钮控制电机转速 (可以通过逻辑分析仪实时查看发送的PWM波形).
电机转速控制

设备型号

  1. 开发板: TMS320F28069M (TI, 这个用Arduino, STM32都差不多)
  2. 驱动板: L298N (ST意法半导体, 淘宝5.8元)
  3. CAN控制器: GCAN USBCAN-Ⅱpro (广成科技)
  4. 直流有刷电机: 365马达电机 (淘宝6.57元)
  5. 电源: GS40006S30 (电压至少是6V就能用, 买几个电池串联下也行)
  6. 面包板 (有4路就能用)
  7. 一堆公对母, 公对公的杜邦线, 一些夹子
  8. USB拓展坞 (有3个口就行)

可选:

  1. 一个电源开关, 避免被电到了
  2. 电压表 (测下驱动板输出的电压大小)
  3. 逻辑分析仪: LA1010 (青岛金斯特)

思路

用开发板的两个GPIO接口(pin40, pin39)控制驱动板输出电压的正反, 通过PWM波(pin38)控制电压大小(调速), 电脑通过CAN想开发板发送PWM占空比大小, 从而进行转速控制. (逻辑分析仪可有可无, 可以用来检测PWM型号的频率与占空比)

简化连线图 实际连线图
简化连线图
实际连线图

代码

开发板CCS代码

参考MyBlog - F28069M开发板笔记中GPIO, CAN, ePWM部分, 通过接收CAN传过来L值, 对CMPA即占空比进行调整从而控制转速, 需要注意, L298N接收的频率不能太高, 需要自己测试PWM频率大小 (这里频率仅有94Hz, 能够比较好的在电压3~6V下, 电机稳定工作, 如果频率太高, 虽然输出电压很高, 但是工作电流非常低, 可能导致低压无法工作的问题),

用到的链接库有:

  1. ${C2000_f28069m}/common/include
  2. ${C2000_f28069m}/headers/include
  3. ${C2000_math}/IQmath/c28/include
  4. ${C2000_math}/FPUfastRTS/c28/include
    其中环境变量在Resource -> Linked Resources中修改(c2000\表示在C2000的安装路径下)
  • C2000_f28069m = c2000\C2000Ware_5_02_00_00\device_support\f2806x
  • C2000_math = c2000\C2000Ware_5_02_00_00\libraries\math
    用到的相关代码文件有:
  1. 28069_RAM_lnk.cmd: 写到RAM中执行 (写Flash请用F28069M.cmd)
  2. F2806x_DefaultIsr.c, F2806x_GlobalVariableDefs.c, F2806x_Headers_nonBIOS.cmd: 基础文件
  3. F2806x_ECan.c: CAN通讯
  4. F2806x_EPwm.c: PWM波
  5. F2806x_PieCtrl.c, F2806x_PieVect.c: PIE中断处理
  6. F2806x_SysCtrl.c: 初始化内外设
  7. F2806x_usDelay.asm: 延迟函数 DELAY_US

主程序main.c实现如下

#include "DSP28x_Project.h"

#define EPWM2_TBPRD 60000
#define MIN_CMPA 2000
#define MAX_CMPA 8000

Uint32 mailbox_read_low(Uint8 id) {
    volatile struct MBOX *mailbox;
    mailbox = &ECanaMboxes.MBOX0 + id;
    return mailbox->MDL.all;
}

interrupt void ecan_receive_and_control_CA(void) {
    ECanaRegs.CANRMP.all = 0x00000001;  // receive flag
    PieCtrlRegs.PIEACK.bit.ACK9 = 1;
    Uint32 msg_l = mailbox_read_low(0);
    if (msg_l >= MIN_CMPA && msg_l <= MAX_CMPA) {
        EPwm2Regs.CMPA.half.CMPA = msg_l;  // update duty
        GpioDataRegs.GPBTOGGLE.bit.GPIO34 = 1;  // toggle LED
    }
}

void main(void) {
    // Initialization
    InitSysCtrl();
    DINT;
    IER = 0x0000;
    IFR = 0x0000;
    InitPieCtrl();
    InitPieVectTable();
    InitECanGpio();
    InitECana();
    InitEPwm2Gpio();

    // ECanA receive
    ECanaMboxes.MBOX0.MSGID.all = 0x00000000;
    ECanaRegs.CANMD.all = 0x00000001;
    ECanaRegs.CANME.all = 0x00000001;
    EALLOW;
    ECanaRegs.CANMIM.all = 0x00000001;
    ECanaRegs.CANGIM.bit.I0EN = 1;
    PieVectTable.ECAN0INTA = &ecan_receive_and_control_CA;
    EDIS;

    // GPIO0,1 and red LED
    EALLOW;
    GpioCtrlRegs.GPADIR.bit.GPIO0 = 1;
    GpioCtrlRegs.GPADIR.bit.GPIO1 = 1;
    GpioCtrlRegs.GPBDIR.bit.GPIO34 = 1;
    EDIS;
    GpioDataRegs.GPASET.bit.GPIO0 = 1;    // set 1
    GpioDataRegs.GPACLEAR.bit.GPIO1 = 1;  // set 0

    // ePWM
    EALLOW;
    SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;
    EDIS;
    EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;
    EPwm2Regs.TBPRD = EPWM2_TBPRD;
    EPwm2Regs.TBCTL.bit.HSPCLKDIV = TB_DIV4;  // freq / 4
    EPwm2Regs.TBCTL.bit.CLKDIV = TB_DIV4;  // freq / 4
    EPwm2Regs.CMPA.half.CMPA = MIN_CMPA;
    EPwm2Regs.AQCTLA.bit.ZRO = AQ_SET;    // 1
    EPwm2Regs.AQCTLA.bit.CAU = AQ_CLEAR;  // 0
    EALLOW;
    SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;
    EDIS;


    // Start Interrupt
    IER |= M_INT9;
    PieCtrlRegs.PIEIER9.bit.INTx5 = 1;
    EINT;
    ERTM;
}

CAN通讯

这里对官网给的Python二次开发样例进行的修改, 注意Python版本为3.7 (因为Tkinter版本问题), 界面效果如下
Python的GUI界面(加入了右边三个按钮用来对电机速度进行调整)


有刷直流电机控制笔记
https://wty-yy.github.io/posts/64702/
作者
wty
发布于
2024年9月7日
许可协议