SOPC之NIOS Ⅱ实现电机转速PID控制(调用中断函数)

news2024/11/25 20:51:52

        通过FPGA开发板上的NIOS Ⅱ搭建电机控制的硬件平台,包括电机正反转、编码器的读取,再通过软件部分实现PID算法对电机速度进行控制,使其能够渐近设定的编码器目标值。

一、问题与改进

SOPC之NIOS Ⅱ实现电机转速PID控制_STATEABC的博客-CSDN博客

        在前面用PID实现了基于NIOS Ⅱ的电机转动控制,但是由于用的usleep()函数精度不够,所以会导致有时读取的编码器值不准确,最终发生PID产生振荡现象。

        因此采用中断函数的方式,每10ms调用一次中断服务函数,再中断函数中实现PID控制,从而达到更大的精确度,减少振荡。

二、硬件设计

硬件设计同之前不变

三、软件设计

3.1 中断函数初始化

 void MPU_INT_INIT(void)
  {
  	 IOWR_ALTERA_AVALON_PIO_EDGE_CAP(MPU_INT_BASE,0x00);
  #ifdef ALT_ENHANCED_INTERRUPT_API_PRESENT
       if ((alt_ic_isr_register(MPU_INT_IRQ_INTERRUPT_CONTROLLER_ID,
                                     MPU_INT_IRQ,
                                        MPU_INT_ISR,
                                 NULL,
                                 NULL
                                 )!= 0))

  #else
      if((alt_irq_register(MPU_INT_IRQ,NULL, MPU_INT_ISR  )!= 0))
  #endif
      	{
  			  printf("register irt failed\r\n");
  		  }
  		IOWR_ALTERA_AVALON_PIO_IRQ_MASK(MPU_INT_BASE,0x01);
  }

3.2 中断函数

#ifdef ALT_ENHANCED_INTERRUPT_API_PRESENT //nios2 91 edition or later
void MPU_INT_ISR(void *contex)
#else //before nios2 91 edition
void MPU_INT_ISR(void * contex, alt_u32 id)
#endif
{
	if(!IORD_ALTERA_AVALON_PIO_EDGE_CAP(MPU_INT_BASE)){
		return;
	}else
	{
		IOWR_ALTERA_AVALON_PIO_EDGE_CAP(MPU_INT_BASE,0x00);
		IOWR_ALTERA_AVALON_PIO_IRQ_MASK(MPU_INT_BASE,0x00);

		// 测量当前编码器计数
		//Car.Get_Encode();
		//int currentCountsL = Car.Encode_L;
		//int currentCountsR = abs(Car.Encode_R);

		// 执行插值步骤
		for (int currentstep = 0; currentstep < step; currentstep++) {

			Car.Get_Encode();
			int currentCountsL = Car.Encode_L;

			interpolatedTarget= currentCountsL + (targetDistance - currentCountsL) * currentstep / step;
/*			if(interpolatedTarget<=currentCountsL){
				interpolatedTarget= currentCountsL + (targetDistance - currentCountsL) * currentstep / step;
			}*/

		    // 计算误差
		    error = interpolatedTarget - currentCountsL;

		    // 计算 PID 控制输出
		    float controlOutput = calculatePID(error, integral, prev_error);

		    // 将控制输出限制在电机速度范围内
		    float speed = initialSpeed + controlOutput;
		    speed = fmaxf(-100, fminf(speed, 100));

		    // 更新下次迭代的前一次误差和积分
		    prev_error = error;
		    integral  += error;
		    if (integral >  8000) integral =  8000;
		    if (integral < -8000) integral = -8000;

		    Car.SetSpeed(speed, 0);
		}
	}
	IOWR_ALTERA_AVALON_PIO_IRQ_MASK(MPU_INT_BASE,0x01);
}

3.3 主程序

int main()
{
  	Car.Stop();
  	Car.Start();

  	MPU_INT_INIT();
  	while(1){
  		printf("Enter targetDistance");
  		scanf("%d", &targetDistance);
  	}

   return 0;
}

四、实验结果

每10ms调用一次中断函数,这样也就保证了采样的精度,结果也比之前好了很多,但是还是会有稍微的振荡现象。

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

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

相关文章

【AI模型】ncnn深度学习框架配置与使用

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍ncnn框架配置与使用。 无专精则不能成&#xff0c;无涉猎则不能通。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c;下次…

快速指南:使用Termux SFTP通过远程进行文件传输——”cpolar内网穿透“

文章目录 1. 安装openSSH2. 安装cpolar3. 远程SFTP连接配置4. 远程SFTP访问4. 配置固定远程连接地址 SFTP&#xff08;SSH File Transfer Protocol&#xff09;是一种基于SSH&#xff08;Secure Shell&#xff09;安全协议的文件传输协议。与FTP协议相比&#xff0c;SFTP使用了…

轻松实现文件夹名互换,快速批量改名高手工具助您高效管理!

亲爱的用户们&#xff0c;您是否曾经需要将文件夹的名称进行互换&#xff0c;但手动一个一个改名太过繁琐&#xff1f;现在&#xff0c;我们为您推出一款高效的文件夹批量改名工具&#xff0c;让您轻松实现文件夹名的互换&#xff0c;帮助您更好地管理文件&#xff01; 首先&a…

linux安装部署gitlab全教程,包含配置中文

linux安装部署gitlab全教程&#xff0c;包含配置中文 大家好&#xff0c;我是酷酷的韩~ 1.前期准备 安装包下载地址 https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/ 我这里选择的这个gitlab-ce-15.7.3-ce.0.el7.x86_64.rpm 还有一些相关依赖包(地址等审核过我放到…

Android图片压缩原理分析(三)—— 哈夫曼压缩讲解

前言 前面几篇文章&#xff0c;我们了解了一些关于图片压缩的基础知识以及Android的Bitmap相关的知识&#xff0c;然后也提到的Skia是Android的重要组成部分。在鲁班压缩算法解析中初次提到了哈夫曼压缩&#xff0c;那么他们之间到底是存在什么关系呢&#xff1f;今天我们就来探…

Spring 事务(事务、声明式事务@Transactional、事务隔离级别、事务传播机制)

目录 1.事务的定义 2.Spring中事务的实现 2.1 MySQL中的事务使用 2.2 Spring中编程事务的实现 2.3 Spring中声明式事务 2.3.1 声明式事务的实现 Transactional 2.3.2 Transactional 作用域 2.3.3 Transactional 参数说明 2.3.4 注意事项 &#xff08;1&#xff09;解…

html学习第2篇---标签(1)

html学习第2篇---标签 1、标题标签h1---h62、段落标签p3、换行标签br4、文本格式化标签5、div标签和span标签6、图像标签img6.1、图像属性6.2、相对路径、绝对路径 7、超链接标签a7.1、属性7.2、分类 8、注释标签和特殊字符8.1、注释8.2、特殊字符 1、标题标签h1—h6 为了使网…

【java安全】FastJson反序列化漏洞浅析

文章目录 【java安全】FastJson反序列化漏洞浅析0x00.前言0x01.FastJson概述0x02.FastJson使用序列化与反序列化 0x03.反序列化漏洞0x04.漏洞触发条件0x05.漏洞攻击方式JdbcRowSetImpl利用链TemplatesImpl利用链**漏洞版本**POC漏洞分析 【java安全】FastJson反序列化漏洞浅析 …

网络丢包故障如何定位?如何解决?

引言 本期分享一个比较常见的网络问题--丢包。例如我们去ping一个网站&#xff0c;如果能ping通&#xff0c;且网站返回信息全面&#xff0c;则说明与网站服务器的通信是畅通的&#xff0c;如果ping不通&#xff0c;或者网站返回的信息不全等&#xff0c;则很可能是数据被丢包了…

java8:HashMap的实现原理

一概述 这个哈希表是基于 Map 接口的实现的&#xff0c;它允许 null 值和null 键&#xff0c;它不是线程同步的&#xff0c;同时也不保证有序。 Map 的这种实现方式为 get&#xff08;取&#xff09;和 put&#xff08;存&#xff09;带来了比较好的性能。但是如果涉及到大量的…

C++入门:内联函数,auto,范围for循环,nullptr

目录 1.内联函数 1.1 概念 1.2 特性 1.3 内联函数与宏的区别 2.auto关键字(C11) 2.1 auto简介 2.2 auto的使用细则 2.3 auto不能推导的场景 3.基于范围的for循环(C11) 3.1 范围for的语法 3.2 范围for的使用方法 4.指针空值nullptr(C11) 4.1 C98中的指针空值 1.内联…

开悟Optimization guide for intermediate tracks

目录 认识模型 参考方案&#xff08;按模块拆解&#xff09; 认识模型 模型控制1名英雄进行镜像1 v 1对战 Actor集群资源为64核CPU 问题特点&#xff1a;单一公平对抗场景&#xff08;同英雄镜像对赛&#xff09;&#xff0c;单位时间样本产能低&#xff0c;累计训练资源相…

macOS - 安装 Python 及地址

文章目录 Python 官方安装包Pip3Applications - PythonMiniconda多个python环境有多种方式安装 python,比如 Python 官方包、anaconda、miniconda、brew 等 这里记录使用 Python 官方包进行安装,和 miniconda 安装方式,以及安装后 各执行文件、安装包的地址。 明确这些地址后…

Arduino开发Seeed Studio XIAO RP2040

前言 准备一些硬件设备 Seeed Studio XIAO RP2040 一块电脑——window 或 Mac 一台Type-C数据线 某些USB线只支持充电&#xff0c;无传输数据功能。 连接电脑 按住boot按钮&#xff0c;然后将 Seeed Studio XIAO RP2040 连接到 PC。 2. 如果电脑文件管理器上显示了“RPI-RP2…

一生一芯9——ubuntu22.04安装valgrind

这里安装的valgrind版本是3.19.0 下载安装包 在选定的目录下打开终端&#xff0c;输入以下指令 wget https://sourceware.org/pub/valgrind/valgrind-3.19.0.tar.bz2直至下载完成 解压安装包 输入下面指令解压安装包 tar -xvf valgrind-3.19.0.tar.bz2.tar.bz2注&#xf…

大转盘抽奖活动设计完全指南,轻松打造火爆营销

在如今竞争激烈的商业环境中&#xff0c;如何吸引顾客、提升销售额成为了每个商家都必须面对的问题。而大转盘抽奖活动作为一种互动性强、刺激性高的推广方式&#xff0c;成为了越来越多商家的首选。本文将详细介绍如何通过乔拓云后台制作大转盘抽奖活动&#xff0c;助力商家的…

高压功率放大器在管道损伤检测中的应用有哪些

高压功率放大器管道损伤检测中有着广泛的应用。管道是现代社会中重要的基础设施之一&#xff0c;用于输送各种液体或气体。然而&#xff0c;由于外部因素或长时间使用引起的磨损、腐蚀或撞击等问题&#xff0c;管道可能出现损伤&#xff0c;这可能对环境和人员安全产生严重影响…

【ag-grid-vue】基本使用

ag-grid是一款功能和性能强大外观漂亮的表格插件&#xff0c;ag-grid几乎能满足你对数据表格所有需求。固定列、拖动列大小和位置、多表头、自定义排序等等各种常用又必不可少功能。关于收费的问题&#xff0c;绝大部分应用用免费的社区版就够了&#xff0c;ag-grid-community社…

axios 进阶

axios 进阶 接口传参方式 使用 xhr 原生技术或者是 axios 时&#xff0c;它的 post 传参方式是键值对的形式 keyvalue。但是在实际开发中一般是使用对象的形式定义数据&#xff0c;方便读取和赋值。所以当我们需要发起请求时可以通过 qs 这一款插件将对象转成键值对形式&…

221. 最大正方形 Python

文章目录 一、题目描述示例 1示例 2示例 3 二、代码三、解题思路 一、题目描述 在一个由 0 和 1 组成的二维矩阵内&#xff0c;找到只包含 1 的最大正方形&#xff0c;并返回其面积。 示例 1 输入&#xff1a;matrix [["1","0","1","0&q…