汇编语言编写的增量型PID控制程序源代码解析

版权申诉
0 下载量 88 浏览量 更新于2024-11-10 2 收藏 7KB RAR 举报
PID控制算法(比例-积分-微分控制算法)广泛应用于工业控制系统中,用于实现对系统的精确控制。增量型PID算法是PID算法的一种变种,它计算的是控制量的变化量,而不是控制量的绝对值,这使得算法在实现上更为简便,尤其是在需要频繁调整控制量的场合。增量型PID算法相较于位置型PID算法,其特点在于能够减少计算量,并且当控制器停止工作时,能够快速恢复到稳态。汇编语言由于其接近硬件的操作特性,能够提供精细的控制和较高的执行效率,因此在一些对性能要求极高的场景下,使用汇编语言编写PID控制程序是常见的做法。然而,汇编语言编程难度较大,且可移植性差,不利于现代的快速软件开发流程。" 知识点详细说明: 1. PID控制算法基础 PID控制算法是一种反馈控制算法,用于控制系统的动态过程。它通过比例(P)、积分(I)和微分(D)三个参数的调整来控制系统的行为。比例项负责减少系统的偏差,积分项消除静态误差,微分项预测系统的未来行为。 2. 增量型PID算法 增量型PID算法是一种特殊形式的PID控制算法,它计算的是控制量的增量,即每次的调整量。这种方法与传统的位置型PID算法不同,后者直接计算控制量的绝对值。增量型PID算法通常用差分方程表示,它有三个主要的组成部分:比例增量、积分增量和微分增量。 3. 汇编语言编程特点 汇编语言是一种低级语言,它与机器语言非常接近,需要程序员对计算机的硬件架构有深入的理解。汇编语言编写的程序运行效率高,能够实现更精细的控制,但同时也存在编写难度大、可读性差、可维护性低和可移植性差等缺点。 4. PID控制代码的应用 PID控制代码被广泛应用于各种控制系统中,包括但不限于温度控制、速度控制、位置控制等。在自动化领域,PID算法是实现精确控制的重要工具。使用PID控制代码可以使得系统快速响应外部变化,并且能够维持稳定状态。 5. 网络资源的利用 本资源文件名中提到的“***.txt”,表明源代码可能来源于一个名为PUDN(程序员大本营)的网站。PUDN是一个提供程序代码共享的平台,程序员可以在该平台获取各种编程资源,包括源代码、文档以及软件工具等。从网络上获取和分享代码是现代软件开发中的常见做法,有利于资源的优化配置和知识的传播。 6. 文件压缩包的结构 给定的文件名“PID-2.rar”表明这些资源被压缩在一个名为“PID-2”的RAR压缩文件中,而文件名列表中提到的“两个PID控制程序.txt”和“***.txt”,进一步说明了压缩包中包含了两个控制程序的文本文件以及一个可能包含相关链接或说明的文本文件。在处理这种类型的文件时,通常需要先进行解压缩操作才能访问其中的文件内容。

void Motor_Control() { /* switch(uStateSwicth) { case StopSwitch: // 停车 { xStatus = 0; yStatus = 0; xCarParam.Speed_X = 0; xCarParam.Speed_Y = 0; xCarParam.Speed_Z = 0; xCarParam.EncoderSumY = 0; xCarParam.EncoderSumX = 0; xCarParam.CarDistanceX = 0; xCarParam.CarDistanceY = 0; break; } case CascadeSwitch: // 小车控制速度 { SpeedX_Control(); SpeedY_Control(); break; } } */ //=================EndSwitch================================= Position_PID(&IMU,xCarParam.yaw,tarYaw); xCarParam.Speed_Z = IMU.result; xCarParam.Speed_Y = 0; xCarParam.Speed_X = 0; // 三个速度限幅函数 xCarParam.Speed_X = LimitProtect(SpeedMaxX,-SpeedMaxX,xCarParam.Speed_X); xCarParam.Speed_Y = LimitProtect(SpeedMaxY,-SpeedMaxY,xCarParam.Speed_Y); xCarParam.Speed_Z = LimitProtect(SpeedMaxZ,-SpeedMaxZ,xCarParam.Speed_Z); // 计算占空比 motor[0].duty = xCarParam.Speed_Y + xCarParam.Speed_X + xCarParam.Speed_Z; motor[1].duty = xCarParam.Speed_Y - xCarParam.Speed_X + xCarParam.Speed_Z; motor[2].duty = xCarParam.Speed_Y - xCarParam.Speed_X - xCarParam.Speed_Z; motor[3].duty = xCarParam.Speed_Y + xCarParam.Speed_X - xCarParam.Speed_Z; // 增量PID 自己有限幅函数 Increment_PID(&(motor[0].pid),encoder_data_quaddec[0],motor[0].duty); Increment_PID(&(motor[1].pid),encoder_data_quaddec[1],motor[1].duty); Increment_PID(&(motor[2].pid),encoder_data_quaddec[2],motor[2].duty); Increment_PID(&(motor[3].pid),encoder_data_quaddec[3],motor[3].duty); // 电机调速 setMotorDuty(&motor[0],motor[0].pid.result); setMotorDuty(&motor[1],motor[1].pid.result); setMotorDuty(&motor[2],motor[2].pid.result); setMotorDuty(&motor[3],motor[3].pid.result); }

116 浏览量

import numpy as np import torch import torch.nn as nn import torch.nn.functional as F import matplotlib.pyplot as plt # 定义RBF神经网络的类 class RBFNetwork(nn.Module): def __init__(self, input_size, hidden_size, output_size): super(RBFNetwork, self).__init__() # 初始化输入层,隐含层,输出层的节点数 self.input_size = input_size self.hidden_size = hidden_size self.output_size = output_size # 初始化权重矩阵和偏置向量 self.W1 = nn.Parameter(torch.randn(input_size, hidden_size)) # 输入层到隐含层的权重矩阵 self.b1 = nn.Parameter(torch.randn(hidden_size)) # 隐含层的偏置向量 self.W2 = nn.Parameter(torch.randn(hidden_size, output_size)) # 隐含层到输出层的权重矩阵 self.b2 = nn.Parameter(torch.randn(output_size)) # 输出层的偏置向量 def forward(self,x): # 前向传播过程 x = torch.from_numpy(x).float() # 将输入向量转换为张量 x = x.view(-1, self.input_size) # 调整输入向量的形状,使其与权重矩阵相匹配 h = torch.exp(-torch.cdist(x, self.W1.t()) + self.b1) # 计算隐含层的输出值,使用高斯径向基函数作为激活函数 y = F.linear(h, self.W2.t(), self.b2) # 计算输出层的输出值,使用线性函数作为激活函数 return y #定义pid控制器 class Pid(): def __init__(self, exp_val, kp, ki, kd): self.KP = kp self.KI = ki self.KD = kd self.exp_val = exp_val self.now_val = 0 self.sum_err = 0 self.now_err = 0 self.last_err = 0 def cmd_pid(self): self.last_err = self.now_err self.now_err = self.exp_val - self.now_val self.sum_err += self.now_err self.now_val = self.KP * (self.exp_val - self.now_val) \ + self.KI * self.sum_err + self.KD * (self.now_err - self.last_err) return self.now_val def err_pid(self): self.last_err = self.now_err self.now_err = self.exp_val - self.now_val self.sum_err += self.now_err self.p_err = self.exp_val - self.now_val self.i_err = self.sum_err self.d_err = self.now_err - self.last_err self.now_val = self.KP * (self.exp_val - self.now_val) \ + self.KI * self.sum_err + self.KD * (self.now_err - self.last_err) return self.p_err, self.i_err, self.d_err rbf_net = RBFNetwork(3,10,4) pid_val = [] #对pid进行初始化,目标值是1000 ,p=0.1 ,i=0.15, d=0.1 A_Pid = Pid(1000, 0.1, 0.1, 0.1) # 然后循环100次把数存进数组中去 for i in range(0, 100): input_vector = np.array(A_Pid.err_pid()) output_vector = rbf_net(input_vector) output_vector = output_vector.reshape(4,1) A_Pid = Pid(1000, output_vector[0], output_vector[1], output_vector[2]) pid_val.append(A_Pid.cmd_pid())

2023-06-06 上传

static void push_tran_motor_relative_angle_control(Gimbal_Control_t *push_tran_motor,uint8_t Mode)//push点金控制 { if (push_tran_motor == NULL) { return; } switch(Mode) { case 1: { //角度环PID for (int i=0;i<2;i++) { push_tran_motor->shoot_push_motor[i].motor_speed_set = PID_Calc(&push_location_pid, push_tran_motor->shoot_push_motor[i].relative_angle, push_tran_motor->shoot_push_motor[i].relative_angle_set); //push_tran的速度环PID push_tran_motor->shoot_push_motor[i].current_set= PID_Calc(&push_speed_pid, push_tran_motor->shoot_push_motor[i].motor_speed, push_tran_motor->shoot_push_motor[i].motor_speed_set); //控制电流赋值 push_tran_motor->shoot_push_motor[i].given_current = (int16_t)(push_tran_motor->shoot_push_motor[i].current_set); } break; } case 2: { debugcase2++; push_tran_motor->shoot_translate_motor.motor_speed_set =PID_Calc(&translate_location_pid, push_tran_motor->shoot_translate_motor.relative_angle, push_tran_motor->shoot_translate_motor.relative_angle_set); push_tran_motor->shoot_translate_motor.current_set = PID_Calc(&translate_speed_pid, push_tran_motor->shoot_translate_motor.motor_speed, push_tran_motor->shoot_translate_motor.motor_speed_set); push_tran_motor->shoot_translate_motor.given_current = (int16_t)(push_tran_motor->shoot_translate_motor.current_set); break; } } } static void gimbal_motor_raw_angle_control(Gimbal_Motor_t *gimbal_motor) { if (gimbal_motor == NULL) { return; } gimbal_motor->current_set = gimbal_motor->raw_cmd_current; gimbal_motor->given_current = (int16_t)(gimbal_motor->current_set); }我如果要实现push电机持续转动,我到底该怎么做啊

2025-03-10 上传

解释这段代码static void chassis_control_loop(chassis_move_t *chassis_move_control_loop) { fp32 max_vector = 0.0f, vector_rate = 0.0f; fp32 temp = 0.0f; fp32 wheel_speed[4] = {0.0f, 0.0f, 0.0f, 0.0f}; uint8_t i = 0; float position_error, speed_error; float position_output, speed_output; float current_position, current_speed; float target_position, target_speed; chassis_move_control_loop->vx_set=vx_set; chassis_move_control_loop->vy_set=vy_set; chassis_move_control_loop->wz_set=angle_set; chassis_vector_to_mecanum_wheel_speed(chassis_move_control_loop->vx_set, chassis_move_control_loop->vy_set, chassis_move_control_loop->wz_set, wheel_speed); if (chassis_move_control_loop->chassis_mode == CHASSIS_VECTOR_RAW) { for (i = 0; i < 4; i++) { chassis_move_control_loop->motor_chassis[i].give_current = (int16_t)(wheel_speed[i]); } } for (i = 0; i < 4; i++) { chassis_move_control_loop->motor_chassis[i].speed_set = wheel_speed[i]; temp = fabs(chassis_move_control_loop->motor_chassis[i].speed_set); if (max_vector < temp) { max_vector = temp; } } if (max_vector > MAX_WHEEL_SPEED) { vector_rate = MAX_WHEEL_SPEED / max_vector; for (i = 0; i < 4; i++) { chassis_move_control_loop->motor_chassis[i].speed_set *= vector_rate; } } for (i = 0; i < 4; i++) { PID_Calc(&chassis_move_control_loop->motor_speed_pid[i], chassis_move_control_loop->motor_chassis[i].speed, chassis_move_control_loop->motor_chassis[i].speed_set); } for (i = 0; i < 4; i++) { chassis_move_control_loop->motor_chassis[i].give_current = (int16_t)(chassis_move_control_loop->motor_speed_pid[i].out); } }

294 浏览量
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部