基于DSP28335的直流伺服电机转速控制

目录

一、设计任务

1.1、任务

1.2系统参数

二、总体设计思路

2.1硬件结构

三、转速或位置测量的计算方法

3.1转速测量方法

3.2具体参数计算

控制算法的选择

4.1PID算法(位置式与增量式)

4.1.1位置式PID算法

4.1.2增量式PID算法

4.2专家PID算法

五、系统工作流程

六、实验测试结果

七、分析讨论

八、总结

8.1总结

附录


一、设计任务

1.1任务

28335DSC设计一个直流伺服电机的伺服控制系统,利用电机上光电编码器所提供的位置脉冲信号,通过合适的计算方法、提取速度或转角位置信号,并选择恰当的控制算法,实现对转速或位置的准确控制。设计完成后需进行实验演示,并提交一份实验报告,其中包含的主要内容:总体设计思路,转速或位置测量的计算方法,控制算法的选择,系统工作流程(包括人机交互),实验测试结果,分析讨论,程序源代码(附录)。

1.2系统参数

(1)   28335DSC开发板:利用DSC的EQEP模块来捕捉电机的光电编码器脉冲、并估算速度/位置信号;利用EPWM模块来产生电机驱动所需的占空比信号、实现调速或位置控制;

(2)   L298N电机驱动模块;

(3)   直流伺服电机(三选一):

a.   美国Pittman伺服电机8214C113-R8(双路QEP,512线光电编码器,可做位置和速度控制);

(4)   直流稳压电源(可提供12V输出);

(5)   连接线:杜邦线,鳄鱼夹线,等。

二、总体设计思路

2.1硬件结构

系统的硬件结构:

三、转速或位置测量的计算方法

TMS28335芯片将常用的转速测量电路集成于芯片内部,组成了增强型正交编码模块eQEP。当工作在正交计数模式下,正交解码单元可对正交信号进行4倍频处理,为位置计数器寄存器的计数提供时钟频率。

增量式编码器是将设备运动时的位移信息变成连续的脉冲信号,脉冲个数表示位移量的大小。只有当设备运动的时候增量式编码器才会输出信号。编码器一般会把这些信号分为通道A和通道B 两组输出,并且这两组信号间有90° 的相位差。同时采集这两组信号就可以知道设备的运动和方向。除了通道A、通道B 以外,很多增量式编码器还会设置一个额外的通道Z 输出信号,用来表示编码器特定的参考位置,传感器转一圈Z 轴信号才会输出一个脉冲。增量式编码器只输出设备的位置变化和运动方向,不会输出设备的绝对位置。

增量式编码器都有A、B 两通道信号输出,这是因为增量式编码器的码盘上有两圈线槽,两圈线槽的之间会错开一定的角度,这个角度会使得光电检测装置输出的两相信号相差1/4 周期(90°)。码盘的具体工作方式如下图所示。图中黑色代表透光,白色代表遮光。当码盘转动时,内圈和外圈的线槽会依次透过光线,光电检测装置检测到光线通断的变化,就会相应的输出脉冲信号,因为内外圈遮光和透光时候存在时间差,所以也就有了A、B 两通道信号的相位差。

分辨率:指编码器能够分辨的最小单位。对于增量式编码器,其分辨率表示为编码器转轴旋转一圈所产生的脉冲数,即脉冲数/转(Pulse Per Revolution 或PPR)。码盘上透光线槽的数目其实就等于分辨率,也叫多少线,较为常见的有5-6000线。

精度:精度是指编码器每个读数与转轴实际位置间的最大误差,通常用角度、角分或角秒来表示。

最大响应频率:指编码器每秒输出的脉冲数,单位是Hz。计算公式:最大响应频率= 分辨率* 轴转速/60。

3.1转速测量方法

M法又称之为测频法,其原理是先设定一定的时间,然后在这段时间TC内,对光电码盘输出的信号的个数进行计数。在测量过程中,计取的脉冲数M1不一定正好是整数,M1可能存在±1的误差。计取的M1的值越大,所得的误差越小,因此M法适用于高速转速的测量。

T法又称之为测周法,此测量原理是在一个脉冲周期内对高频脉冲数进行计数。为了减小误差,计得的高频脉冲M2应尽量大,因此T法测量适用于低速测量。

M/T法是将M法和T法两种方法结合起来,即在一定的时间范围TC内,计取光电码盘输出的脉冲数M1的同时,也对高频脉冲M2进行计数。TC时间到来后,再计取­T时间内的高频脉冲数m,­T是时间TC结束后到码盘信号下一个脉冲上升沿的时间间隔。

二阶Lagrange插值多项式估值法。

其关于时间t的导数如下:

式中:t 0,t1,t 2,f (t0),f (t1),f (t2)分别为离当前时刻t最近的3个位置事件对应的时间和位置。假定在t0,t1,t2这3个时间点对应的位置增量相等,即

其中N为一个位置事件所对应的编码器脉冲数。令△t1 = t1 - t0,△t2 = t2 - t1,△t3 = t - t2,则可利用式(17)来估计当前时刻t的瞬时转速(rad/s):

3.2具体参数计算

M法:

T法:

控制算法的选择

4.1PID算法(位置式与增量式)

4.1.1位置式PID算法

位置式PID

在控制信号幅值受限、且给定目标出现大跳变的情况下,积分控制容易产生积分器饱和(integrator windup)的现象,使系统出现大超调和低频震荡,甚至导致不稳定。

课上所学两种抗积分饱和方法:遇限消弱积分法,反馈抑制抗饱和PID

4.1.2增量式PID算法

增量式PID

• 增量式算法不需要对积分项累加,控制量增量只与近几次的误差有关,计算误差对控制量计算的影响较小。而位置式算法要对近几次的偏差的进行积分累加,容易产生较大的累加误差;

• 增量式算法得出的是控制量的增量,例如在阀门控制中,只输出阀门开度的变化部分,误动作影响小,必要时还可通过逻辑判断限制或禁止本次输出,不会严重影响系统的工作;而位置式的输出直接对应对象的输出,因此对系统影响较大;

• 增量式算法控制输出的是控制量增量,并无积分作用,因此该方法适用于执行机构带积分部件的对象,如步进电机等,而位置式算法适用于执行机构不带积分部件的对象,如电液伺服阀;

积分饱和现象是位置式PID 算法应用常见的一种现象,因此对于位置式PID 算法除了需要对输出进行限幅外还需要对积分输出进行限幅,而增量式算法很好地避免了积分饱和现象,因此在增量式PID 控制算法中只需要对输出限幅,而无需积分限幅。

4.2专家PID算法

​专家PID 控制主要是利用受控对象和控制规律的知识进行控制,对被控制的对象不需要精确的模型,使用专家经验来对系统模型进行设计控制。对于系统模型的控制专家PID 具有灵活性、适应性和鲁棒性。可根据系统的工作状态及误差情况去灵活的选择相应的控制规律去控制,并根据专家知识和经验,能动性的去调整控制器的参数,适应对象特性及环境的变化,通过利用专家规则,控制系统模型可以在非线性、大偏差下进行可靠地工作。

专家PID 主要由五个控制律组成,通过工作状态及误差去选择相应的控制律去稳定数据,并对参数进行调节达到对控制系统稳定的作用。其控制结构如图 所示。

 设定偏差的一个极大值,记为Mmax;设定一个偏差较大的中间值,记为Mmid;设定一个偏差的极小值,记为Mmin。根据以上偏差、偏差增量以及偏差极值的设定,我们分析如下:

(1)如果|e(k)|>Mmax (规则一)

这种情况说明偏差的绝对值已经很大了,不论偏差变化趋势如何,都应该考虑控制器的输入应按最大(或最小)输出,以达到迅速调整偏差的效果,使偏差绝对值以最大的速度减小。同时避免超调,此时相当于开环控制。

(2)当e(k)*∆e(k)>0或者∆e(k)=0时(规则二)

这种情况说明偏差在朝向偏差绝对值增大的方向变化,或者偏差为某一固定值,此时我们再判断偏差的绝对值与偏差的中间值Mmid之间的关系。

(2.1)此时如果|e(k)|>Mmid

说明偏差也较大,可考虑由控制器实施较强的控制作用,以达到扭转偏差绝对值向减小的方向变化,并迅速减小偏差的绝对值。

(2.2)此时如果|e(k)|≤Mmid

说明尽管偏差是向绝对值增大的方向变化,但是偏差绝对值本身并不是很大,可以考虑控制器实施一般的控制作用,只需要扭转偏差的变化趋势,使其向偏差绝对值减小的方向变化即可。

​​​​​​

(3)当e(k)*∆e(k)<0∆e(k)*∆e(k-1)>0或者e(k)=0

说明偏差的绝对值向减小的方向变化,或者已经达到平衡状态,此时保持控制器输出不变即可。

(4)当e(k)*∆e(k)<0∆e(k)*∆e(k-1)<0

说明偏差处于极限状态。

(4.1)如果此时偏差的绝对值较大,|e(k)|>Mmid

可以考虑实施较强控制作用。

(4.2)如果此时偏差绝对值较小,|e(k)|<Mmid

可以考虑实施较弱控制作用。

​​​​​​​

其中,k1为增益放大系数,k1取大于1的值;k2为增益抑制系数,取大于0而小于1的值。

(5)如果|e(k)|<Mmin

这种情况实际上说明偏差绝对值很小,这种偏差有可能是系统静差引起的,此时必须要引入积分作用,减小系统的稳态误差。

​​​​​​​

五、系统工作流程

采用TMS320F28335DSC 作为控制的主芯片,伺服系统采用基于L298N 的功率驱动模块和12V 稳压直流电源。伺服电动机的双路正交脉冲信号由DSC 的eQEP 模块进行使用M法户主T法等方法解码处理,计算出角位置\就速度; 位置\速度控制器输出的控制量转换为对应占空比的PWM 信号,去驱动L298N 的功率开关,从而控制电机转速。

为方便实验的连续进行,把目标转速设置为每隔1.5s在2500 r/min与3600 r/min之间阶跃跳变的方波信号。

六、实验测试结果

增量式PID控制电压曲线

增量式PID误差曲线

专家PID控制曲线

专家PID误差曲线

七、分析讨论

从图中可以看出,当给定速度发生大范围阶跃跳变时,各种控制方案下电机都能够快速、准确、平稳、无超调地跟踪给定速度。

与增量式PID相比,专家PID的控制曲线更加平稳,上升时间更短,超调量更少,调节时间更短,鲁棒性更好,当然专家PID的知识库的设计显得尤为重要,知识库设计不当,很可能效果不如增量式PID,所以设计更加繁琐,另外专家PID需要推理,推理消耗的计算资源远大于增量式PID。

增量式PID

专家PID

鲁棒性

略差

更优

参数整定(规则设计)

方便

繁琐

计算资源

时域指标

略差

更优

表  增量式PID与专家PID对比

所以,在小型嵌入式系统,计算资源比较紧缺的单片机(C51、Arduino、MSP430等),可以采用增量式PID,在计算资源比较强的嵌入式系统(如STM32、C2000系列的DSP等)可以采用专家PID从而获得更好的性能。此外还要考虑经济效益的问题,当控制器的成本在项目中成本占用不高是,应当选用更优的方案去获得更鲁棒的性能。

八、总结

8.1总结

在此次课程实践当中,我运用了计算机控制所学的增量式PID与智能控制所学的专家PID,给出PID控制方案的具体设计,并应用于直流伺服电机的转速调节,利用TMS320F2808DSP进行了实验研究。结果表明,用这2种PID的方案设计的速度控制系统都可以在大的目标转速范围内实现快速、平稳和无静差的伺服跟踪,相比较之下专家PID的效果更好。从控制算法实现和参数整定的复杂度来看,专家PID参数整定更加繁琐,增量式PID参数整定简单。但对实际系统而言,要考虑经济效益,确定控制方案。

附录

  1. #ifndef EH_PID_H_
  2. #define EH_PID_H_
  3. typedef  struct {
  4.     float32  Ref;           // 输入:参考输入  Input: Reference input
  5.     float32  Fdb;           // 输入:反馈输入  Input: Feedback input
  6.     float32  Err;            //变量:误差信号e(k)
  7.     float32  Err_1;          // 变量:误差信号e(k-1)   Variable: Error
  8.     float32  Err_2;          // 变量:误差信号e(k-2)   Variable: Error
  9.     float32  umax;          // 参数:控制量的饱和限幅值
  10.     float32  Ts;            // 控制周期
  11.     float32  Kp;            // 参数:比例增益  Parameter: Proportional gain
  12.     float32  Ki;            // 参数:积分增益 Parameter: Integral gain
  13.     float32  Kd;            // 参数:微分增益Parameter: Derivative gain
  14.     float32  OutPreSat;     // 变量:饱和输出  Variable: Pre-saturated output
  15.     float32  OutMax;        // 参数:最大输出  Parameter: Maximum output
  16.     float32  OutMin;        // 参数:最小输出  Parameter: Minimum output
  17.     float32  Out;           // 输出:SP_PID输出  Output: SP_PID output
  18.     void  (*calc)();        // 计算函数指针  Pointer to calculation function
  19.     } EH_PID;
  20. typedef   EH_PID*  EH_PID_handle;
  21. #define  EH_PID_DEFAULTS { 0, 0, 0, 0, 0, 0, 0,\
  22.                            0, 0, 0, \
  23.                            0, 0, 0, 0, \
  24.                     (void (*)(Uint32)) eh_pid_calc }
  25. void eh_pid_calc(EH_PID_handle);
  26. #endif /* EH_PID_H_ */

eh_pid.c

  1. #include "dmctype.h"
  2. #include "eh_pid.h"
  3. void eh_pid_calc(EH_PID * v)
  4. {
  5.     float32 Delta_Err;                  //e(k)-e(k-1)
  6.     float32 Last_Delta_Err;             //e(k-1)-e(k-2)
  7.     float32 uk;                         //本次调节输出值
  8.     v->Err = v->Ref - v->Fdb;
  9.     Delta_Err=v->Err-v->Err_1;
  10.     Last_Delta_Err=v->Err_1-v->Err_2;
  11.     uk=v->Out+v->Kp*Delta_Err+v->Ki* v->Err +v->Kd*(Delta_Err-Last_Delta_Err);
  12.     v->OutPreSat = uk;
  13.     if (v->OutPreSat > v->OutMax)
  14.         v->Out =  v->OutMax;
  15.     else if (v->OutPreSat < v->OutMin)
  16.         v->Out =  v->OutMin;
  17.     else
  18.         v->Out = v->OutPreSat;
  19.     v->Err_2=v->Err_1;
  20.     v->Err_1= v->Err ;
  21. }

sp_pid.h

  1. #ifndef INCLUDE_SP_PID_H_
  2. #define INCLUDE_SP_PID_H_
  3. typedef  struct {
  4.     float32  Ref;           // 输入:参考输入  Input: Reference input
  5.     float32  Fdb;           // 输入:反馈输入  Input: Feedback input
  6.     float32  Err;            //偏差
  7.     float32  Err_1;          // 变量:误差信号e(k-1)   Variable: Error
  8.     float32  Err_2;          // 变量:误差信号e(k-2)   Variable: Error
  9.     float32  Ts;            // 控制周期
  10.     float32  Kp;            // 参数:比例增益  Parameter: Proportional gain
  11.     float32  Ki;            // 参数:积分增益 Parameter: Integral gain
  12.     float32  Kd;            // 参数:微分增益Parameter: Derivative gain
  13.     float32 ErrorAbsMax;            /*偏差绝对值最大值*/
  14.     float32 ErrorAbsMid;            /*偏差绝对值中位值*/
  15.     float32 ErrorAbsMin;            /*偏差绝对值最小值*/
  16.     float32  OutPreSat;     // 变量:饱和输出  Variable: Pre-saturated output
  17.     float32  OutMax;        // 参数:最大输出  Parameter: Maximum output
  18.     float32  OutMin;        // 参数:最小输出  Parameter: Minimum output
  19.     float32  Out;           // 输出:SP_PID输出  Output: SP_PID output
  20.     void  (*init)();         // Pointer to the init funcion
  21.     void  (*calc)();        // 计算函数指针  Pointer to calculation function
  22.     } SP_PID;
  23. typedef   SP_PID*  SP_PID_handle;
  24. #define  SP_PID_DEFAULTS { 0, 0, 0, 0, 0, 0,\
  25.                            0, 0, 0, \
  26.                            0, 0, 0,\
  27.                            0, 0, 0, 0, \
  28.                            (void (*)(Uint32)) sp_pid_init,\
  29.                            (void (*)(Uint32)) sp_pid_calc }
  30. void sp_pid_init(SP_PID_handle);
  31. void sp_pid_calc(SP_PID_handle);
  32. #endif /* INCLUDE_SP_PID_H_ */

sp_pid.c

  1. #include "dmctype.h"
  2. #include "sp_pid.h"
  3. void sp_pid_init(SP_PID * v){
  4.     //以下初始化时针对阶跃输入而言
  5.     v->ErrorAbsMax = v->Ref *0.30;
  6.     v->ErrorAbsMid = v->Ref *0.15;
  7.     v->ErrorAbsMin = v->Ref *0.08;
  8. }
  9. void sp_pid_calc(SP_PID * v){
  10.     float32 Delta_Err;                  //e(k)-e(k-1)
  11.     float32 Last_Delta_Err;             //e(k-1)-e(k-2)
  12.     float32 uk;                         //本次调节输出值
  13.     v->Err = v->Ref - v->Fdb;
  14.     Delta_Err=v->Err-v->Err_1;
  15.     Last_Delta_Err=v->Err_1-v->Err_2;
  16.     if(abs(v->Err)>=v->ErrorAbsMax){
  17.      /*执行规则1*/
  18.         if(v->Err>0){
  19.             uk=v->OutMax;
  20.         }
  21.         if(v->Err<0){
  22.             uk=v->OutMin;
  23.         }
  24.     }
  25.     if((v->Err*Delta_Err>0)||(Delta_Err==0)){
  26.      /*执行规则2*/
  27.         if(abs(v->Err)>=v->ErrorAbsMid){
  28.             uk=v->Out+1.5*(v->Kp*Delta_Err+v->Ki*v->Err+v->Kd*(Delta_Err-Last_Delta_Err));
  29.         }
  30.         else{
  31.             uk=v->Out+0.3*(v->Kp*Delta_Err+v->Ki*v->Err+v->Kd*(Delta_Err-Last_Delta_Err));
  32.         }
  33.     }
  34.     if(((v->Err*Delta_Err<0)&&(Delta_Err*Last_Delta_Err>0))||(v->Err==0)){
  35.     /*执行规则3*/
  36.         uk=v->Out;
  37.     }
  38.     if((v->Err*Delta_Err<0)&&(Delta_Err*Last_Delta_Err<0)){
  39.     /*执行规则4*/
  40.         if(abs(v->Err)>=v->ErrorAbsMid){
  41.             uk=v->Out+1.5*v->Kp*v->Err;
  42.         }
  43.         else{
  44.             uk=v->Out+0.4*v->Kp*v->Err;
  45.         }
  46.     }
  47.     if((abs(v->Err)<=v->ErrorAbsMin)&&(abs(v->Err)>0)){
  48.     /*执行规则5*/
  49.         uk=v->Out+0.5*v->Kp*Delta_Err+0.3*v->Ki*v->Err;
  50.     }
  51.     v->OutPreSat = uk;
  52.     if (v->OutPreSat > v->OutMax)
  53.         v->Out =  v->OutMax;
  54.     else if (v->OutPreSat < v->OutMin)
  55.         v->Out =  v->OutMin;
  56.     else
  57.         v->Out = v->OutPreSat;
  58.     v->Err_2=v->Err_1;
  59.     v->Err_1=v->Err;
  60. }

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

一站式知识库服务平台真的有那么好用吗?看完你就懂了

在快速发展的信息化社会&#xff0c;我们经常会听到“知识就是力量”的这句话&#xff0c;而一个一站式的知识库服务平台就是这样一把“开启力量之门”的钥匙。那么&#xff0c;这把钥匙真的有那么好用吗&#xff1f;让我们一起探讨一下。 首先&#xff0c;“一站式”可能已经解…

计算机服务器中了helper勒索病毒怎么办,helper勒索病毒解密流程步骤

随着网络技术在企业中的不断应用&#xff0c;越来越多的企业离不开网络&#xff0c;网络为企业提供了极大便利&#xff0c;大大提升了生产运营效率&#xff0c;由此而产生的网络数据安全问题也成为了企业关心的主要话题。近期&#xff0c;云天数据恢复中心接到多家企业的求助&a…

Github 2024-04-05Java开源项目日报Top9

根据Github Trendings的统计,今日(2024-04-05统计)共有9个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Java项目9TypeScript项目1OpenAPI 生成器:基于规范自动生成API工具 创建周期:2155 天开发语言:Java协议类型:Apache License 2.0Star数量:1…

Kafka参数介绍

官网参数介绍:Apache KafkaApache Kafka: A Distributed Streaming Platform.https://kafka.apache.org/documentation/#configuration

第14章 数据结构与集合源码

一 数据结构剖析 我们举一个形象的例子来理解数据结构的作用&#xff1a; 战场&#xff1a;程序运行所需的软件、硬件环境 战术和策略&#xff1a;数据结构 敌人&#xff1a;项目或模块的功能需求 指挥官&#xff1a;编写程序的程序员 士兵和装备&#xff1a;一行一行的代码 …

Docker 容器编排技术解析与实践

探索了容器编排技术的核心概念、工具和高级应用&#xff0c;包括 Docker Compose、Kubernetes 等主要平台及其高级功能如网络和存储管理、监控、安全等。此外&#xff0c;文章还探讨了这些技术在实际应用中的案例&#xff0c;提供了对未来趋势的洞见。 一、容器编排介绍 容器编…

各种滤波算法

各种滤波算法 1. 半径离群点去除(Radius Outlier Removal&#xff0c;半径滤波)2. 统计离群点剔除(Statistical Outlier Removal, 统计滤波)3. 体素网格将采样(voxel grid downsampling)4. 最远点采样(Farthest Point Sampling, FPS)5. 正态空间将采样(Normal Space Sampling, …

最优算法100例之30-表示数值的字符串

专栏主页&#xff1a;计算机专业基础知识总结&#xff08;适用于期末复习考研刷题求职面试&#xff09;系列文章https://blog.csdn.net/seeker1994/category_12585732.html 题目描述 请实现一个函数用来判断字符串是否表示数值&#xff08;包括整数和小数&#xff09;。例如&a…

【35分钟掌握金融风控策略3】场景概述3

目录 ​编辑 场景概述 贷前、贷中、贷后的划分及对应的风控场景 贷前风控场景简介 预授信 授信审批 定额 定价 人工审核 场景概述 贷前、贷中、贷后的划分及对应的风控场景 在金融风控全生命周期中&#xff0c;贷前主要是指授信成功及之前的阶段、贷中主要是指授信成…

链表的应用

⽬录 1. 单链表经典算法OJ题⽬ 1.1 单链表相关经典算法OJ题1&#xff1a;移除链表元素 203. 移除链表元素 - 力扣&#xff08;LeetCode&#xff09; /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ typedef …

基于opencv的猫脸识别模型

opencv介绍 OpenCV的全称是Open Source Computer Vision Library&#xff0c;是一个跨平台的计算机视觉库。OpenCV是由英特尔公司发起并参与开发&#xff0c;以BSD许可证授权发行&#xff0c;可以在商业和研究领域中免费使用。OpenCV可用于开发实时的图像处理、计算机视觉以及…

ctf刷题记录2(更新中)

因为csdn上内容过多编辑的时候会很卡&#xff0c;因此重开一篇&#xff0c;继续刷题之旅。 NewStarCTF 2023 WEEK3 Include &#x1f350; <?phperror_reporting(0);if(isset($_GET[file])) {$file $_GET[file];if(preg_match(/flag|log|session|filter|input|data/i, $…

解锁金融数据中心场景,实现国产化AD替代,宁盾身份域管为信创电脑、应用提供统一管理

随着信创国产化改造持续推进&#xff0c;越来越多的金融机构不断采购信创服务器、PC、办公软件等&#xff0c;其 IT 基础设施逐渐迁移至国产化 IT 架构下。为支撑国产化 IT 基础设施的正常使用和集中管理运维&#xff0c;某金融机构数据中心的微软Active Directory&#xff08;…

二、GitLab相关操作

GitLab相关操作 一、组、用户、项目管理1.创建组2.创建项目3.创建用户并分配组3.1 创建用户3.2 设置密码3.3 给用户分配组 二、拉取/推送代码1.配置ssh(第一次需要)1.1 创建一个空文件夹1.2 配置本地仓账号和邮箱1.3 生成ssh公钥密钥1.4 gitlab配置公钥 2.拉取代码3.推送代码3.…

FastAPI Web框架教程 第10章 APIRouter

10-1 APIRouter基本使用 需求场景 如果我们写一个网站&#xff0c;或者写一个APP&#xff0c;那整个项目应该是比较复杂的&#xff0c;此时不应该把所有代码放在一个文件中。 前几节课&#xff0c;我们通过把代码拆分到不同文件的方式&#xff0c;可以解决一些代码混乱的问题…

SD-WAN帮助企业实现对分布式网络的集中管理和控制

在当今数字化时代&#xff0c;企业网络越来越分散和复杂&#xff0c;分布在全球不同地点的分支机构和远程办公地点需要高效的网络连接来支持业务运营。传统的广域网&#xff08;WAN&#xff09;架构已经无法满足企业对网络灵活性、可靠性和安全性的需求。而SD-WAN的出现为解决这…

Phpstorm配置Xdebug

步骤 1、先去官网找到对应的php xdebug的版本 2、配置phpstorm断点调试 网址&#xff1a;https://xdebug.org/ 查看php对应的xdebug版本&#xff1a;Xdebug: Support — Tailored Installation Instructions 1.1查看对应php xdebug版本 全选&#xff0c;复制到目标网址 我…

C++要点细细梳理(上)(函数与面向对象)

之前我们讨论了C语言一些基础的细节&#xff0c;下面我们开始讨论C&#xff0c;&#xff0c;后面我打算接着谈C&#xff0c;也就是C#&#xff0c;先在此留个坑。 注意&#xff0c;本文有素材来自中国大学MOOC的C课程&#xff0c;本文也是该课程的听课笔记【这是链接】 1. 从C…

【HarmonyOS】ArkUI - 动画

利用属性动画、显示动画、组件转场动画实现组件动画效果。 一、属性动画 属性动画是通过设置组件的 animation 属性来给组件添加动画&#xff0c;当组件的 width、height、Opacity、backgroundColor、scale、rotate、translate 等属性变更时&#xff0c;可以实现渐变过渡效果。…

模块化编程:AMD 和 CMD 的魅力

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…