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

这篇具有很好参考价值的文章主要介绍了SOPC之NIOS Ⅱ实现电机转速PID控制(调用中断函数)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

一、问题与改进

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

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

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

二、硬件设计

硬件设计同之前不变

SOPC之NIOS Ⅱ实现电机转速PID控制(调用中断函数),一般人学不会的FPGA,fpga开发,嵌入式硬件,FPGA,SOPC,PID,NIOS

三、软件设计

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调用一次中断函数,这样也就保证了采样的精度,结果也比之前好了很多,但是还是会有稍微的振荡现象。文章来源地址https://www.toymoban.com/news/detail-673583.html

到了这里,关于SOPC之NIOS Ⅱ实现电机转速PID控制(调用中断函数)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • tb6612电机驱动软件开发(代码pid实现,调试,控制实现)

    代码工程 https://download.csdn.net/download/weixin_52849254/87879043?spm=1001.2014.3001.5501 这段代码是一个PID算法的实现,用于控制电机的位置和速度。代码中包含了以下主要内容: 定义了全局变量,包括四个PID结构体变量,分别用于左电机的位置控制、左电机的速度控制、右电机的速度控

    2024年02月08日
    浏览(53)
  • 无刷电机FOC控制------转速计算、载波频率相关

      假设一个极对数为1的电机正在以转速为N运行,电机的某一相正弦电流的一个周期T表示于电机旋转了一圈,所以电机转速n = 1/T 转/s,即电流频率,实际常用的电机转速为rpm(转/min),算1对极的电机转速N = 60 f。   对于多对极(p)电机而言,电机机械角转了360°,电角度转了

    2024年02月14日
    浏览(50)
  • OpenMV数字识别进而控制直流电机转速【小白篇】

    第一次接触OpenMV也是第一次将理论用于实践,是老师让我实现的一个小测验,这几天完成后决定写下完整的过程。本文主要是当缝合怪,借鉴和参考了其他人的代码再根据我个人设备进行了一定的调整,此外还包括了我自身实践过程中的一些小意外。 !!!一定要根据个人器

    2024年02月14日
    浏览(34)
  • 基于51单片机直流电机转速数码管显示控制系统

    一、系统方案 本文主要研究了利用MCS-51系列单片机控制PWM信号从而实现对直流电机转速进行控制的方法。本文中采用了三极管组成了PWM信号的驱动系统,并且对PWM信号的原理、产生方法以及如何通过软件编程对PWM信号占空比进行调节,从而控制其输入信号波形等均作了详细的

    2024年02月12日
    浏览(49)
  • STM32 HAL库PID控制电机 第三章 PID控制双电机

    注:本文含全部PID控制代码,保证可以运行,如不能运行可以留言回复 1 基础配置 1.1 编码器电路图及配置 引脚 定时器通道 PA0 TIM2_CH1 PA1 TIM2_CH2 PB6 TIM4_CH1 PB7 TIM4_CH2 因此需要把TIM2、TIM4配置为编码器模式。在STM32CubeIDE中找到定时器2与定时器4,进行模式配置。以下以定时器2为

    2024年02月16日
    浏览(38)
  • STM32CubeMX 直流电机串级PID位置速度控制、HAL库、cubemx、PID、串级PID、位置控制、速度控制、双环控制

    提示:本文章的串级PID位置速度控制,是在前两篇文章速度控制,位置控制的基础上实现的,这一章节中不需要额外的cubemx的配置,只需要写简单的代码即可,复杂的地方在于串级pid的调试过程。 pid是我们在学习单片机中首先要学会的控制算法,而串级pid又是在单pid的基础上

    2024年02月14日
    浏览(53)
  • 【RoboMaster】从零开始控制RM电机(4)-单环PID控制

    硬件以及软件环境: STM32Cube_FW_F4_V1.26.2 MDK-ARM 5.29.0.0 大疆RoboMaster开发板A型开发板(STM32F427IIHx)/C型开发板(STM32F407IGTx) 源码: RM_ctrl 本系列文章目录: 【RoboMaster】从零开始控制RM电机(2)-CAN通信原理及电调通信协议 【RoboMaster】从零开始控制RM电机(3)- 建立与电调的通

    2024年02月01日
    浏览(32)
  • 基于单片机PID电机控制系统设计

    ** 单片机设计介绍,基于单片机PID电机控制系统设计   基于单片机PID电机控制系统设计是一个综合性的工程任务,旨在通过单片机实现电机的精确控制。以下是该设计的一个概要: 一、系统概述 基于单片机PID电机控制系统利用PID(比例-积分-微分)控制算法,通过单片机

    2024年04月25日
    浏览(35)
  • QT上位机控制stm32,并利用PID控制编码电机旋转

    QT上位机控制stm32,并利用PID控制编码电机旋转             由于最近在学习电机控制算法之类的东西,看到论文大多使用PID、或以PID衍生的ADRC作为电机的主流控制,于是自己也写了一个stm32控制L298N以驱动直流电机的程序,并用QT做了一个上位机实现了用软件改变PID的参数

    2023年04月09日
    浏览(45)
  • 基于stm32的减速直流电机PID算法控制

    本例程采用了HAL库进行项目开发(主要使用软件CubexMX和keil5),文章末尾会有代码开源,欢迎各位对文章进行指正和探讨。         硬件组成:stm32f103c8t6最小系统板;0.96寸LED12864(I2C通讯模式);智能小车12v移动电源;25GA370直流减速电机(带霍尔编码器);JDY-31蓝牙模块

    2024年02月20日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包