基于 FPGA 的电机控制

news2025/1/12 12:21:03

fe084edf700224190dcd6ab61635970c.png

FPGA 非常适合精密电机控制,在这个项目中,我们将创建一个简单的电机控制程序,在此基础上可以构建更复杂的应用。

64fcd8c7ac162241558c57d30add7192.png

需要的硬件

Digilent Pmod HB3

faf8a7eab06da283285587ff425da3da.png

介绍

我们可以用一个简单的 8 位微控制器来控制电机,输出一个简单的脉宽调制波形。然而,当想要进行精密或高级电机控制时,没有什么比 FPGA 的确定性和实时响应更好的了。接口的灵活性还使得可以通过单个设备控制多个电机,从而提供更加集成的解决方案。

首先,我们将学习一些有关电机控制理论的知识,并创建一个简单的示例。我们都知道,我们可以通过PWM信号来驱动直流电机并控制其速度。然而,高效、精确地驱动它需要对电机控制理论有更多的了解。

电机

297022e1cf599bcc9325d5fdf86452ea.png

不管你信不信,我在大学最喜欢的课程之一是控制理论。在该模块中,我们研究了交流电机和直流电机,了解理论和实际用例。有多种类型的交流电机由交流电源供电,可分为同步电机和感应电机。例如,交流电机通常用于泵和压缩机。

直流电机分为有刷电机和无刷电机两种。在两种类型中,有刷是最容易驱动的,因为它们只需要一个电源。在有刷直流电机中,电刷向连接有转子和线圈的换向器提供电流。电流在线圈中感应出电场,该电场被外部磁体(定子)排斥。为了确保旋转,换向器的设计使得电流反向流动以确保连续旋转。

第二种类型的直流电机是无刷电机,它们的驱动稍微复杂一些,因为它们没有换向器。相反,磁体安装在转子上,线圈缠绕在定子周围,这样线圈的电流就可以从外部控制和排序。

两者中最容易控制的是有刷直流电机,所以我们就以这类电机为例。

脉宽调制驱动

使用 PWM 驱动电机的理论是,可以控制电机得到的平均电压,从而控制其速度。在 PWM 信号占空比为 100% 时,电机处于满电压并全速运行。如果提供 10% 的占空比,电机就会以其全速的 10% 运行。

然而,为了有效地运行电机,我们需要正确确定 PWM 周期。直流电机具有串联电感和串联电阻,这意味着电机将充当低通滤波器。频率削减为

3143a995dda7d176ca62422a53f44102.png

其中时间常数由 L/R 给出 - 我们可以从电机数据表中获得这些值。

因此,为了确保稳定的速度,我们需要选择高于电机频率截止的 PWM 频率,以确保观察到直流分量。

因此,我们要选择一个至少是截止频率 5 倍的频率。

FPGA

为了开始这个项目,我们首先要创建一个针对 FPGA 板的硬件设计。

开始创建一个新项目

0813b144fa479ba9861e21a895fefe56.png

为项目命名

56e459416471ded8c1c75d13349fa8b9.png

选择 RTL 项目但不指定来源

9a863f5a1e528ae586ac9a8467d3074f.png

创建项目后,创建一个新的框图

1a1a657f22813734ee7428910a5d0cc5.png

从“板”选项卡将系统时钟拉到框图上

5cd2872c93e0ac3306d241c330f11da0.png

对 USB UART 也执行相同操作

e5fb41a880f0a33bc99e69ebaf330fe2.png

从 IP 库添加 MicroBlaze 处理器

31bd8e04981e1ffbcb20b33c4c18eca1.png

运行块自动化连接,选择本地内存大小为32KB并取消选中中断控制器

d61002db6c8238be90a9756cb93f1d0b.png 137b3fdd8d22cedf32515f43b6d7a9fe.png

添加 AXI 定时器

427f6147fbb1dda99db550ecdfff7301.png

运行连接自动化

73c2e5513946dcf99508870a7a2a93f2.png

打开时钟向导并取消选择复位输入

5a8979af35d5f641a9522c1da752e99b.png

添加 GPIO

4850a2485be0df73681728ac57643075.png

重新定制GPIO为1位宽,仅输出

6b338b8f4207629dc8266f7f6c4d05fc.png

选择 GPIO 输出和 AXI 定时器 PWM 并将其设引出

63b09f9237f1830bc13c92d9a02ddee7.png

完成后应如下所示。

6c61412308aff03d2159b82de13a3735.png

综合完成后,我们可以打开综合视图并将 IO 分配给 GPIO 和定时器输出 - 对于 GPIO,引脚是 J1,对于 PWM,引脚是 L2

3911a163df03407dc655e127584addc5.png

构建比特流并导出平台

23931ef276e444e54be5c4fa5f5fa94d.png

vitis设计

打开Vitis创建一个新的应用程序项目并选择刚刚导出的XSA。

b7af1857dfd13cebac072bee9c294522.png

输入项目名称

7ac52f5f322c802e308455640995440e.png

选择独立

db67714ba3a0b7ca26fb097bcfca4404.png

创建一个新的 hello world 应用程序

60ebe7a61042ba03d27bf1118dddd7f5.png

应用软件非常简单,我们将根据所需的 PWM 周期以及所需的占空比配置 AXI 定时器。

#include <stdio.h>
#include "platform.h"
#include "xil_printf.h"

#include "xtmrctr.h"

#define TMRCTR_DEVICE_ID        XPAR_TMRCTR_0_DEVICE_ID
#define PWM_PERIOD              1000000    /* PWM period in (500 ms) */
#define TMRCTR_0                0            /* Timer 0 ID */
#define TMRCTR_1                1            /* Timer 1 ID */
#define CYCLE_PER_DUTYCYCLE     10           /* Clock cycles per duty cycle */
#define MAX_DUTYCYCLE           100          /* Max duty cycle */
#define DUTYCYCLE_DIVISOR       2            /* Duty cycle Divisor */

XTmrCtr TimerCounterInst;

void display_menu()
{
//Clear the screen
xil_printf("\033[2J");
//Display the main menu
xil_printf("*******************************************\n\r");
xil_printf("****      www.adiuvoengineering.com    ****\n\r");
xil_printf("****      Motor Control Example        ****\n\r");
xil_printf("*******************************************\n\r");
xil_printf("\n\r");
xil_printf("   MM10 Motor Control   \n\r");
xil_printf("------------------------------------------\n");
xil_printf("\n\r");
xil_printf("Select a Speed:\n\r");
xil_printf("  (1)   - Stop\n\r");
xil_printf("  (2)   - 25 % \n\r");
xil_printf("  (3)   - 33 % \n\r");
xil_printf("  (4)   - 50 % \n\r");
xil_printf("  (5)   - 66 % \n\r");
xil_printf("  (6)   - 75 % \n\r");
xil_printf("  (7)   - 100 % \n\r");
xil_printf("\n");
}

void set_pwm(u32 cycle)
{
 u32 HighTime;
 XTmrCtr_PwmDisable(&TimerCounterInst);
 HighTime = PWM_PERIOD * (( float) cycle / 100.0 );
 XTmrCtr_PwmConfigure(&TimerCounterInst, PWM_PERIOD, HighTime);
 XTmrCtr_PwmEnable(&TimerCounterInst);
}

int main()
{
 u8  Div;
 u32 Period;
 u32 HighTime;
 char key_input;
 u8 DutyCycle;
    init_platform();

    print("Hello World\n\r");
    print("Successfully ran Hello World application");

    XTmrCtr_Initialize(&TimerCounterInst, TMRCTR_DEVICE_ID);


    Div = DUTYCYCLE_DIVISOR;
    XTmrCtr_PwmDisable(&TimerCounterInst);
 Period = PWM_PERIOD;
 HighTime = PWM_PERIOD / Div--;
 XTmrCtr_PwmConfigure(&TimerCounterInst, Period, HighTime);
 XTmrCtr_PwmEnable(&TimerCounterInst);
 while(1){
  display_menu();
  read(1, (char*)&key_input, 1);
  xil_printf("Echo %c\n\r",key_input);
  switch (key_input) {
  case '1': //stop
  XTmrCtr_PwmDisable(&TimerCounterInst);
  break;
  case '2': //25%
   xil_printf("25%\n\r");
  DutyCycle = 25;
  set_pwm(DutyCycle);
  break;
  case '3': //33%
  DutyCycle = 33;
  set_pwm(DutyCycle);
  break;
  case '4': //50%
  DutyCycle = 50;
  set_pwm(DutyCycle);
  break;
  case '5': //66%
  DutyCycle = 66;
  set_pwm(DutyCycle);
  break;
  case '6': //75%
  DutyCycle = 75;
  set_pwm(DutyCycle);
  break;
  case '7': //100%
  DutyCycle = 100;
  set_pwm(DutyCycle);
  break;
  }
 }

    cleanup_platform();
    return 0;
}

当然,我选择的电机包含两个霍尔效应传感器.旋转方向可以通过一个霍尔效应传感器位于另一个霍尔效应传感器前面的输出来确定。

顺时针旋转

aabcc36bd220ac1f40deaa7f5ba1dda1.png

逆时针旋转

a8c189b01960ef38c0e9d7416b31cf4e.png

我们可以使用脉冲频率来确定电机的速度,我们将在后面项目中更详细地研究这一点。

演示

3312168b207caa07c5bc54ac952b321e.gif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/870325.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

201、仿真-基于51单片机PT100测温设计铂电阻温度计设计Proteus仿真(程序+Proteus仿真+原理图+流程图+元器件清单+配套资料等)

毕设帮助、开题指导、技术解答(有偿)见文未 目录 一、设计功能 二、Proteus仿真图 三、原理图 四、程序源码 资料包括&#xff1a; 方案选择 单片机的选择 方案一&#xff1a;STM32系列单片机控制&#xff0c;该型号单片机为LQFP44封装&#xff0c;内部资源足够用于本次设…

Linux学习之sed保持空间

echo 1#sed#s >> holdSpaceTest.txt echo 2#deep#d >> holdSpaceTest.txt echo 3#good#g >> holdSpaceTest.txt echo 4#hood#h >> holdSpaceTest.txt把下边的内容写入到holdSpaceTest.txt中&#xff1a; 1#sed#s 2#deep#d 3#good#g 4#hood#htac holdS…

windows任务栏右下角不显示网络图标解决方法

1、背景 我运行windows诊断服务之后&#xff0c;然后重启了一把电脑&#xff0c;结果发现电脑无法上网了&#xff0c;进一步发现任务栏右下角的网络显示图标也没有了&#xff0c;网络状态显示也是一条横线。 几经折腾终于给解决了&#xff0c;遇到了不少坑&#xff0c;记录一…

2022年09月 C/C++(一级)真题解析#中国电子学会#全国青少年软件编程等级考试

第1题:指定顺序输出 依次输入3个整数a、b、c,将他们以c、a、b的顺序输出。 时间限制:1000 内存限制:65536 输入 一行3个整数a、b、c,以空格分隔。 0 < a,b,c < 108 输出 一行3个整数c、a、b,整数之间以一个空格分隔。 样例输入 1 2 3 样例输出 3 1 2 以下是使用C语言…

腾讯出品Pag动画框架在Android端的使用-初级

Pag动画框架作为一个第三方框架&#xff0c;它的优缺点与Lottie是相似&#xff0c;此处不过多赘述。如果你们的项目中打算用了&#xff0c;肯定是经过了一定的调研的。Pag动画框架分几个版本&#xff0c;有免费的有收费的。我们目前用的社区免费版&#xff0c;只用来展示Pag动画…

Vue2到3 Day5 全套学习内容,众多案例上手(内付源码)

简介&#xff1a; Vue2到3 Day1-3 全套学习内容&#xff0c;众多案例上手&#xff08;内付源码&#xff09;_星辰大海1412的博客-CSDN博客本文是一篇入门级的Vue.js介绍文章&#xff0c;旨在帮助读者了解Vue.js框架的基本概念和核心功能。Vue.js是一款流行的JavaScript前端框架…

工单管理系统哪家好?如何让学校后勤报修更方便?

随着互联网的高速发展&#xff0c;学校宿舍管理也必须随之向数字化方向迈进。越来越多的企业利用云计算服务的优势&#xff0c;使后勤维护整个流程实现数字化、自动化运行以及资源共享。这些技术创新的运用&#xff0c;大大提高了学校宿舍的后勤维修管理水平&#xff0c;同时&a…

WinForm内嵌Unity3D

Unity3D可以C#脚本进行开&#xff0c;使用vstu2013.msi插件&#xff0c;可以实现在VS2013中的调试。在开发完成后&#xff0c;由于项目需要&#xff0c;需要将Unity3D嵌入到WinForm中。WinForm中的UnityWebPlayer Control可以载入Unity3D。先看效果图。 一、为了能够动态设置ax…

MYSQL幻读问题

幻读是什么&#xff1f; “Phantom Problem是指在同一事务下&#xff0c;连续执行两次同样的SQL语句可能导致不同的结果&#xff0c;第二次的SQL语句可能会返回之前不存在的行。”摘录来自 MySQL技术内幕&#xff1a;InnoDB存储引擎(第2版) (数据库技术丛书) ​ 通俗来说就是&a…

WebStorm

WebStorm 介绍下载安装Activation 介绍 WebStorm是由JetBrains公司开发的一款集成开发环境&#xff08;IDE&#xff09;&#xff0c;主要专注于前端开发和Web开发。它旨在提供一套强大的工具和功能&#xff0c;以支持开发者在前端项目中编写、调试和维护代码。 JetBrains官网: …

泛微E-Office任意文件上传漏洞复现(HW0day)

0x01 产品简介 泛微E-Office是一款标准化的协同 OA 办公软件&#xff0c;泛微协同办公产品系列成员之一,实行通用化产品设计&#xff0c;充分贴合企业管理需求&#xff0c;本着简洁易用、高效智能的原则&#xff0c;为企业快速打造移动化、无纸化、数字化的办公平台。 0x02 漏…

Python(八十三)字符串的比较操作

❤️ 专栏简介&#xff1a;本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中&#xff0c;我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 &#xff1a;本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…

【Linux初阶】进程间通信介绍 管道

&#x1f31f;hello&#xff0c;各位读者大大们你们好呀&#x1f31f; &#x1f36d;&#x1f36d;系列专栏&#xff1a;【Linux初阶】 ✒️✒️本篇内容&#xff1a;进程间通信介绍&#xff0c;管道概述&#xff0c;匿名管道应用&#xff0c;命名管道应用 &#x1f6a2;&#…

7-1 输出倒三角

题目描述&#xff1a; 本题要求编写程序&#xff0c;输出指定的由“*”组成的倒三角图案。 输入格式: 本题目没有输入。 输出格式: 按照下列格式输出由“*”组成的倒三角图案。 * * * ** * ** **代码长度限制 16 KB 时间限制 400 ms 内存限制 64 MB 源代码&#xf…

Postman

Postman 简介下载安装 简介 Postman 是一款用于测试和开发 API&#xff08;应用程序编程接口&#xff09;的工具&#xff0c;它提供了用户友好的界面和丰富的功能&#xff0c;帮助开发者轻松地创建、测试、调试和文档化各种类型的 API。无论是在构建 Web 应用、移动应用还是其…

fork函数和exec族函数的结合使用 的案例

首先回顾之前所讲&#xff0c;在说明“为什么要创建进程”的时候&#xff0c;提到过以下两个原因&#xff1a; 其中第一个原因很好理解&#xff0c;而第二个原因就包含了上节所讲的exec族函数的知识点&#xff0c;并且不管是之前的博文还是上节的exec&#xff0c;都提到了一点“…

数据结构笔记--二叉树经典高频题

1--二叉树的最近公共祖先 主要思路&#xff1a; 最近祖先只有两种情况&#xff1a;① 自底向上&#xff0c;当两个目的结点分别在当前结点的左右子树时&#xff0c;当前结点为两个目的结点的最近祖先&#xff1b;② 最近祖先与其中一个目的结点相同&#xff0c;则另一个目的结点…

【C++】内存管理与模板

目录 一、内存管理 1.new与delete基本用法 (1) 内置类型 (2) 自定义类型 2.new, delete与malloc, free对比 (1) 内置类型 (2) 自定义类型 (3)综合特点 3.new与delete的底层实现 4. 定位new表达式 二、模板 1.引入机制 2. 基本使用 (1) 函数模板 ①概念&#xff1a…

【C语言】每日一题---1

大家好&#xff0c;我是苏貝&#xff0c;本篇博客是系列博客每日一题的第一篇&#xff0c;本系列的题都不会太难&#xff0c;如果大家对这种系列的博客感兴趣的话&#xff0c;可以给我一个赞&#x1f44d;吗&#xff0c;感谢❤️ 下面代码的结果是&#xff1a; #include <…

203、仿真-基于51单片机6自由度机械手金属液体控制报警Proteus仿真设计(程序+Proteus仿真+配套资料等)

毕设帮助、开题指导、技术解答(有偿)见文未 目录 一、硬件设计 二、设计功能 三、Proteus仿真图 四、程序源码 资料包括&#xff1a; 需要完整的资料可以点击下面的名片加下我&#xff0c;找我要资源压缩包的百度网盘下载地址及提取码。 方案选择 单片机的选择 方案一&a…