当前位置: 首页 > news >正文

乡土文化网站怎么做5118素材网站

乡土文化网站怎么做,5118素材网站,县信用平台网站建设情况,怎样做团购网站目录 概述 1 系统硬件框架 1.1 框架介绍 1.2 硬件实物图 2 STM32Cub生成工程 2.1 软件版本信息 2.2 配置参数 ​编辑2.3 生成项目 3 PID算法实现 3.1 概念 3.2 代码实现 4 其他功能实现 4.1 设置电机速度 4.2 PID算法控制电机 4.3 功能函数的调用 5 测试 5.1 …

目录

概述

1 系统硬件框架

1.1 框架介绍

1.2 硬件实物图

2 STM32Cub生成工程

2.1 软件版本信息

2.2  配置参数

​编辑2.3 生成项目

3 PID算法实现

3.1 概念

3.2 代码实现

4 其他功能实现

4.1 设置电机速度

4.2 PID算法控制电机

4.3 功能函数的调用

5 测试

5.1 测试案例1

5.2 测试案例2


源代码下载地址:

PID算法在电机速度控制上的应-测试源码资源-CSDN文库

概述

本文主要介绍使用PID算法实现电机速度的控制,笔者使用IO外部中断测试码盘的脉冲实现测速功能,通过该速度值,应用PID算法实现调制PWM的占空比,以实现电机速度的控制。

1 系统硬件框架

1.1 框架介绍

1) 系统使用光电编码器进行速度测试,具体实现方式可以参看原文:

电机转速计算(基于码盘和IO外部中断)-CSDN博客

2) TIMER7实现定时器功能,其会产生10us的定时器中断,为系统工作提供基准时钟。

3)TIMER8用于产生PWM实现电机速度控制,系统通过电机速度的反馈值以调节PWM的脉冲宽度,以实现电机速度的闭环控制。

1.2 硬件实物图

 使用STM32F103RC作为主控芯片,LN298N用于驱动电机,光电码盘用于测试电机转速。具体的测试实物图如下:

2 STM32Cub生成工程

2.1 软件版本信息

软件名称版本信息
STM32CubeSTM32CubeMX 6.11
STM32 HALSTM32Cube_FW_F1_V1.8.5

2.2  配置参数

1)配置EXTI IO中断,其用测监测编码器的冲击脉冲,选择PC0接口,同时要使能外部中断函数

 使能中断函数

2)配置Timer7,中断间隔为10us,其具体配置参数如下:

 使能中断函数

 3)配置PWM相关的参数和使能通道

定时器相关的参数配置如下,计数周期为10ms

 

 PWM通道相关的参数:

各个通道对应的IO接口如下:

2.3 生成项目

配置完成各个参数后,就可以生成项目,打开项目后,其结构如下:

3 PID算法实现

3.1 概念

PID是一种常用的控制算法,全名为比例-积分-微分控制算法(Proportional-Integral-Derivative Control)。它通过对系统的误差进行比例、积分和微分运算,从而对系统进行控制。

PID控制算法的基本原理是:根据当前系统的误差,分别计算比例、积分和微分项,并将它们加权叠加作为最终的控制量。

具体来说,比例项(Proportional)是根据误差的大小与比例系数的乘积来计算的,它决定了控制量与误差之间的直接关系。比例项越大,控制量的调整越快。

积分项(Integral)是根据误差的累积进行计算的,它可以消除系统存在的静态误差,并且对于系统的稳定性有所影响。积分项越大,控制量的调整越缓慢。

微分项(Derivative)是根据误差的变化率进行计算的,它可以预测误差的未来变化趋势,并提前调整控制量。微分项越大,控制量的调整越灵敏。

PID算法的最终控制量是比例项、积分项和微分项的加权叠加,其中比例系数、积分系数和微分系数可以根据实际需求进行调整,以达到最佳的控制效果。

理想的PID控制算法:

• Kp     ——  比例增益, Kp 与比例度成倒数关系
• Tt      ——  积分时间常数
• TD     ——  微分时间常数
• u(t)——  PID 控制器的输出信号
• e(t)——  给定值 r(t)与测量值误差

3.2 代码实现

代码117行: 计算目标值与实际值的误差

代码124行:累计误差值

代码127行:实现PID的功能

代码130行: 传递误差值

实际代码:

typedef struct
{float target_val;       //目标值float actual_val;       //实际值float err;              //定义偏差值float err_last;         //定义上一个偏差值float Kp,Ki,Kd;         //定义比例、积分、微分系数float integral;         //定义积分值
}_pid;/*** @brief  速度PID算法实现* @param  actual_val:实际值@note   无* @retval 通过PID计算后的输出*/
float pid_speed_realize(_pid *pid, float actual_val)
{/*计算目标值与实际值的误差*/pid->err = pid->target_val - actual_val;if((pid->err<0.2f )&& (pid->err>-0.2f)){pid->err = 0.0f;}pid->integral += pid->err;    // 误差累积/*PID算法实现*/pid->actual_val = pid->Kp*pid->err+pid->Ki*pid->integral+pid->Kd*(pid->err-pid->err_last);/*误差传递*/pid->err_last=pid->err;/*返回当前实际值*/return pid->actual_val;
}

4 其他功能实现

4.1 设置电机速度

代码80行: 设置通道1的占空比值

代码81行: 设置通道2的占空比值为0,用于控制方向

实际代码:

void set_motor_speed( uint16_t actual_speed )
{HAL_TIM_SetPWM_Pulse( actual_speed, TIM_CHANNEL_1);HAL_TIM_SetPWM_Pulse( 0, TIM_CHANNEL_2);
}

4.2 PID算法控制电机

代码195行:获取当前电机的转速

代码198行:比较实际值和期望值的差值,便于将实际值控制在一定的范围之内

代码201行:使用实际值进行PID运行,计算出占空比的值,以调节转速

代码205行:设置电机速度

 实际代码:

void motor_pid_control(void)
{float actual_speed, cal_speed ;uint8_t value;bool is_match;uint8_t buff[16];uint32_t delta_value;actual_speed = get_motor_speed();cal_speed = pid_get_target(&pid_speed);is_match = abs((int)((actual_speed- cal_speed)*10)) > 10 ? false : true;if( !is_match ){cal_speed = pid_speed_realize( &pid_speed,actual_speed);    // 进行 PID 计算cal_speed = convet_speed( cal_speed );cal_speed = (cal_speed > PWM_PERIOD_MAX_COUNT) ? PWM_PERIOD_MAX_COUNT : cal_speed;    // 速度上限处理set_motor_speed(cal_speed);                                 // 设置 PWM 占空比}#if defined(PID_ASSISTANT_EN)value = (uint8_t)actual_speed;buff[0] =  value;protocol_computer_value(SEND_FACT_CMD, CURVES_CH1, buff, 1);               // 给通道 1 发送实际值#elseprintf("实际值:%.02f 目标值:%.0f\n", actual_speed, pid_get_target(&pid_speed));      // 打印实际值和目标值#endif
}

4.3 功能函数的调用

代码211行:计算电机的转速

代码217行:电机PID控制函数

 实际源码:

void motor_pid_control(void)
{float actual_speed, cal_speed ;uint8_t value;bool is_match;uint8_t buff[16];uint32_t delta_value;actual_speed = get_motor_speed();cal_speed = pid_get_target(&pid_speed);is_match = abs((int)((actual_speed- cal_speed)*10)) > 10 ? false : true;if( !is_match ){cal_speed = pid_speed_realize( &pid_speed,actual_speed);    // 进行 PID 计算cal_speed = convet_speed( cal_speed );cal_speed = (cal_speed > PWM_PERIOD_MAX_COUNT) ? PWM_PERIOD_MAX_COUNT : cal_speed;    // 速度上限处理set_motor_speed(cal_speed);                                 // 设置 PWM 占空比}#if defined(PID_ASSISTANT_EN)value = (uint8_t)actual_speed;buff[0] =  value;protocol_computer_value(SEND_FACT_CMD, CURVES_CH1, buff, 1);               // 给通道 1 发送实际值#elseprintf("实际值:%.02f 目标值:%.0f\n", actual_speed, pid_get_target(&pid_speed));      // 打印实际值和目标值#endif
}

5 测试

5.1 测试案例1

PID参数设置如下类型,观察速度值的变化(Expect value: speed = 50

    pid_speed.Kp = 7.0;pid_speed.Ki = 20.0;pid_speed.Kd = 14.0;

串口log如下,在5s左右就完成速度定速功能

5.2 测试案例2

PID参数设置如下类型,观察速度值的变化(Expect value: speed = 50

    pid_speed.Kp = 7.0;pid_speed.Ki = 2.0;pid_speed.Kd = 4.0;

串口log如下,在2min左右才完成速度定速功能

 

http://www.zhongyajixie.com/news/61985.html

相关文章:

  • 中小企业网络营销的发展现状佛山百度seo代理
  • 广州网站建设-信科分公司seo是什么意思
  • 做网站一般几个人网站产品怎么优化
  • 上海网站建设开发公百度网址浏览大全
  • 用cms做网站的缺点计算机基础培训机构
  • 帝国cms怎么做网站品牌运营中心
  • 万网域名网站建设怎样做竞价推广
  • wordpress建站linux百度公司的发展历程
  • 哪些网站可以做设计软件怎样自己开发一款软件
  • 邢台建设局网站湖南网站托管
  • 做一个电商网站seo关键词排名怎么优化
  • 杭州网站建设有限公司北京seo公司网站
  • 网络平台推广哪个好网站优化流程
  • 四川建设网中标候选人公示武汉seo系统
  • 新疆生产建设兵团第六师网站seo就业前景如何
  • 做企业培训的网站快速网站
  • wordpress批量修改内容seo能从搜索引擎中获得更多的
  • 网站如何做搜索引擎优化排名第一的玉米品种
  • 网站开发需求文档模板电池优化大师下载
  • 学做网站需要什么条件游戏推广代理
  • 网站换模板百度网盘客户端下载
  • 深圳网站定制建设网站优化排名软件网站
  • 购物网站的页面设计搜索引擎优化排名优化培训
  • 深圳网站设计联系电话实事新闻热点
  • 公司网站如何做公安部备案百度网址大全 官网
  • google网站登录入口seo外包公司多吗
  • 网站快照倒退可怕吗seo运营经理
  • 织梦网站面包屑导航怎么做常用的seo工具推荐
  • 多语言网站如何做网站建设方案及报价
  • 西安网络公司做网站外贸网站推广与优化