AC7811-FOC无感控制代码详解

news/2024/4/28 0:39:54/文章来源:https://blog.csdn.net/weixin_43824188/article/details/130139943

目录

矢量控制原理

矢量控制框图

电流采样方式

电流在整个控制过程中的传递

采样关键点

三电阻

双电阻

单电阻

三者对比

坐标变换

dq轴电流的PI控制

启动方式

启动波形

脉冲注入

高频注入

Startup

预定位到指定角度

PulseInject_api

hfi_api

Speed loop

speed_angle

Protector

Phase_Over_Current_Check 相电流过流保护

Bus_Over_Current_Check 母线电流过流保护

Vbus_OverVoltage_Check 过压保护

Vbus_UnderVoltage_Check 欠压保护

LoseSpeed_Check 失速保护

ZeroSpeed_Check 零速保护

Stall_Check_Sensorless 堵转保护(无位置传感器)

Current_Sensor_Check 相电流中点检测保护


矢量控制原理

矢量控制框图

PMSM 的矢量控制也称为磁场定向控制(Field Oriented Control,FOC) 。在 FOC 中,电机的定子电流被分解为用于产生磁场的直流电流(励磁电流)与用于控制转矩的交轴电流(转矩电流),通过对转速和电流的双环控制实现电机的高性能运行。

PMSM 矢量控制算法中,除角度变量为 Q16(0~65535)格式外,其余算法中控制参数均为 Q15(-32768~32767)格式。

可以说矢量控制的前提就在三相电流的采样上,采样之后经过Clarke和Park变换,变成便于控制的D、Q轴坐标系。

所以三相电流采样是矢量控制的核心!

电流采样方式

电流在整个控制过程中的传递

采样关键点

采样的关键是需要在三相逆变器高端关闭,低端打开的情况下进行采样,这是整体的采样点。

因此,采样会存在窗口时间,因为ADC转换完成需要一定数量级的时间,也就是说,在ADC转换完成之前,桥低端是不能关闭的,在这里,双电阻和单电阻采样需要考虑窗口时间的限制,而三电阻采样则不存在窗口时间(PWM占空比接近100%),可以根据SVPWM当前所在象限,进行分类,只需要采集其中不受窗口时间限制的两相电流,然后根据 Ia+Ib+Ic=0,进行电流的重构。

所以,电流采样的核心在:硬件电路的设计与采样时机的把握。

三电阻

在三个桥臂的下臂MOS管基极串分流器再用运放放大

这种方法主要是为了节省隔离器件成本。并且需要在固定时刻采样的值才有效。

什么时候采样合适?

如下图所示,在不同扇区需要采样的相电流,共同点是避免去采样PWM占空比接近100%的那一相电流。

怎么采样?

ST的电机库的做法,通过TIMER_CH4作为ADC采样的触发信号,而采样则可以通过修改TIM_CCR4寄存器去改变采样点,相当灵活的做法。

双电阻

三电阻可减小至两个 (母线电流检测不可少),缺少的一相由计算得出。

根据基尔霍夫电流定律,Ic=-Ia-Ib。

怎么采样?

双电阻采样无法避免窗口时间,所以需要限制最终PWM的占空比,为ADC转换预留足够的时间

单电阻

为进一步节省成本发展出直接在母线电阻上检测三相电流的方法。

这种方法需要分时采样,不同时刻的电流代表不同相的电流

为了便于理解整个采样的过程,为了表示逆变器的开关管的状态,

Sa表示A相的上下管,同理Sb表示B相的上下管;

这里规定:

  • Sa = 1表示上管导通,下管断开;
  • Sa = 0表示下管导通,上管断开;

Sb和Sc以此类推;

Sa Sb Sc:100

Sa Sb Sc:110

SVPWM不同扇区做成对应表格就是:

开关状态

AH

BH

CH

电流

0

0

0

0

0

1

1

0

0

IA

2

1

1

0

−IC

3

0

1

0

IB

4

0

1

1

−IA

5

0

0

1

IC

6

1

0

1

−IB

7

1

1

1

0

因此,单电阻采样,需要在一个PWM周期内进行两次采样,具体如下图所示:

图中的SAL,SBL,SCL分别对应整流桥的下管,因此在一个周期内分别进行了Sample 1和Sample 2这两次采样,对照上表可以推出;

  • Sample 1:采集了开关管状态为SAL SBL SCL:101==>SAH SBH SCH:010,此时采样电流为 IB;
  • Sample 2:采集了开关管状态为SAL SBL SCL:100==>SAH SBH SCH:011,此时采样电流为 −IA;

搞懂原理了,那么什么时候去采?

三者对比

电流采样

成本

算法

单电阻

复杂

双电阻

适中

适中

三电阻

简单

参考网址:

FOC 电流采样方案对比(单电阻/双电阻/三电阻) - 小麦大叔 - 博客园

坐标变换

Clark变换:把ADC采集到的三相定子电流从三轴(相差120°)定子坐标系转化成两轴(相差90°)定子坐标系。

Park变换:把Iα与Iβ从两轴(相差90°)定子坐标系 转化成 两轴转子旋转坐标系(相对于转自来说是静止的)。

电流变化:

dq轴电流的PI控制

P就是比例,误差信号err*比例因子Kp,但P的影响会随着误差err逐渐接近于0而减小,导致系统始终存在一个微小的静态误差。

I(积分)就是用来消除静态误差的,I对静态误差进行连续的积分。随着时间的推移,静态误差不断的累积变大,再将这个累积误差*Ki,作为I的输出。

在FOC的算法里,我们可能会用到PI控制器的地方:

  • 电流环的Q轴(控制转子的转矩)
  • 电流环的D轴(控制转子磁通)
  • 速度环(控制转速)
  • 位置环(控制位置)
  • 电流观测器PLL(转速及角度估算)

串联PI、并联PI、位置式、增量式PI等。

启动方式

I/F电流/频率、V/F电压/频率、HF、DIRECT

I/F电流/频率:根据永磁同步电机负载特性,给变频器设置合适的电流-频率比,使得电机输出转矩与不同转速下的负载相匹配,以达到较高的运行效率。I/F控制策略运行在速度开环、电流闭环的状态。

启动波形

绿色线-相电流、黄色线-估计的电角度

1是初始位置识别,脉冲注入法,无抖动启动。

2开环运行,IF与VF开环运行

3开环到闭环的切换

4闭环运行

脉冲注入

根据定子铁芯非线性饱和效应的特征,当向定子绕组施加一系列等宽的短时检测电压矢量,可通过母线响应电流的大小来辨别转子初始位置区间。

高频注入

高频注入算法作用:用于无传感模式静止及低速情况下电机的位置识别。

高频注入算法通过向定子线圈注入特定的电压载波信号,藉由电机d-g轴电感的差异特性,进而产生与转子角度误差相关的电流信号,再依此电流信号进行估测角度的修正以达到无感测启动之目的。

高频注入算法利用电机d-g轴电感的差异特性,适合凸极特性较好的内嵌式永磁同步电机(IPMSM)使用。(因为内嵌式的PMSM两个轴电感值差距较大,而表贴式两者相近)

其实没太明白它们的区别?

Startup

这个模块主要提供无感FOC开环启动的一些函数。

感觉启动方面特别的乱,捋一捋:

问题一:高频注入和vf,if这些启动方式的关系是啥?

问题二:FOC开环启动曲线,到底是个啥子?

预定位到指定角度

预定位到指定角度上 FOC的预定位不再是六步换相那样通电流,而设置iqRef。

问题是,开环阶段怎么能直接设置iqRef呢?

 

看不懂进行不下去了……感觉都是参数的互相传递。

PulseInject_api

脉冲注入的五种状态机,分别对应着不同的函数

而且发现只有PulseInject_api这个文件,却找不到PulseInject这个文件,但有PulseInject.h头文件。

同时在PulseInject_api里面有很多函数,应该是在PulseInject里面的,也没办法具体的观察。

/*!
* @brief Pre_positioning motor to an expected angle.
*预定位到指定角度上  FOC的预定位不再是六步换相那样通电流,而设置iqRef
* @param[in] focVarsCtrl: pointer to FOC_VARS_CTRL structure
* @param[in] startUp: pointer to START_UP structure
* @return none
*/
void Angle_Prepositioning_Process(FOC_VARS_CTRL *focVarsCtrl, START_UP *startUp)
{static uint32_t s_timeBase = 0;++s_timeBase;if (s_timeBase <= startUp->pStCfg->alignTime){startUp->pStCtrl->startUpElecTheta = startUp->pStCfg->alignAngle;focVarsCtrl->elecAngle = startUp->pStCtrl->startUpElecTheta;focVarsCtrl->idRef = 0;if (s_timeBase <= startUp->pStCfg->slopeDuration1){focVarsCtrl->iqRef = (startUp->pStCfg->curRamp1Init + Math_Mpy(s_timeBase, startUp->pStCtrl->curAddSlope1)) * pFocVarsCfg->motorDir;//iqRef,q轴参考电流}else{focVarsCtrl->iqRef = startUp->pStCfg->alignCur * pFocVarsCfg->motorDir;}}else{
#if (defined MOTOR_POLES_OBTAIN)startUp->pStCtrl->startUpFlag = 2;
#elses_timeBase = 0;startUp->pStCtrl->alignState = 1;startUp->pStCtrl->startUpFlag = 3;
#endif}

脉冲注入其实有两部份工作要做:1脉冲宽度的自识别(PulseInject_SelfLearn());2脉冲注入。

脉冲注入后,得到六向母线电流,根据电感的饱和特性,计算转子的初始位置。

PulseInject_DataHandle()该函数处理数据只需要总线电流,因此初始位置检查功能也适用于bldc控制。

void PulseInject_DataHandle(PULSE_INJECT_DATA *pulseInj);

hfi_api

和脉冲注入一样都是只有头文件,找不到源文件。

但通过头文件也可以简单了解到那些函数用于高频注入。

能了解到的就这么多……

Speed loop

speed_angle

这个模块主要提供速度斜坡与速度环的一些功能参数。

和BLDC里面的一些函数与配置很相似,但也有一些不同的点:

PI:Speedloop变量PI参数计算,它根据速度将速度环路PI参数分为三个部分,低速时使用低速PI,高速时使用高速PI,中间速度线性过渡。

/*!
* @brief Speedloop variable PI parameters calculate, it divides the speed loop PI parameters into three sectionsaccording to the speed, low speed PI is used at low speed, high speed PI is used at high speed, and theintermediate speed is linearly transitioned.
*Speedloop变量PI参数计算,它根据速度将速度环路PI参数分为三个部分,低速时使用低速PI,高速时使用高速PI,中间速度线性过渡。
* @param[in] freq: motor electrical frequency pu value in Q15
* @param[in] asrVarPI: pointer to ASR_SPEEDVARPI structure
* @param[in] asrPidCof: pointer to PID_REGULATOR_COF structure
* @return none
*/
void ASR_SpeedVarPICalc(int16_t freq, ASR_SPEEDVARPI *asrVarPI, PID_REGULATOR_COF *asrPidCof)
{uint16_t s_absFre = 0;s_absFre = Math_Qabs(freq);if (s_absFre > asrVarPI->frepuH){asrPidCof->kpPu = asrVarPI->kpH;asrPidCof->kiPu = asrVarPI->kiH;}else if (s_absFre > asrVarPI->frepuL){asrPidCof->kpPu = asrVarPI->kpL + Math_Mpy((s_absFre - asrVarPI->frepuL), asrVarPI->kpGain);asrPidCof->kiPu = asrVarPI->kiL + Math_Mpy((s_absFre - asrVarPI->frepuL), asrVarPI->kiGain);}else{asrPidCof->kpPu = asrVarPI->kpL;asrPidCof->kiPu = asrVarPI->kiL;}
}

而且还提到了一个新的控制对象:S curve .

我推测应该是速度曲线的意思,有很多的函数是围绕它来写的。

Protector

电机保护策略功能函数,相比于BLDC控制多了很多功能。

Phase_Over_Current_Check 相电流过流保护

电机相电流超过设定阈值,且连续达到设定次数(防误报)时,上报相电流过流故障

/*!
* @brief Phase over current protection. When the amplitude of the phase current
*        synthesis vector exceeds the threshold value, phase over current fault is reported.
*
* @param[in] focVars: pointer to FOC_VARS_CTRL structure
* @return status: fault diagnosis status, 0 OK; 1 fault; 2 unknown
*/
int16_t Phase_Over_Current_Check(FOC_VARS_CTRL *focVars)
{static int16_t cnta = 0;int16_t status = DIAGNOSTIC_OK;uint16_t statusTemp = 0;if (focVars->idq > MAX_IPHASE_THRESHOLD){statusTemp |= 0x1;if (cnta < IPHASE_DBC){cnta++;}else{cnta = 0;Fault_Report(OVER_CURRENT_PHASE_FAILURE);}}else{cnta = 0;}if (statusTemp != 0){status = DIAGNOSTIC_FAIL;}return status;
}

Bus_Over_Current_Check 母线电流过流保护

Vbus_OverVoltage_Check 过压保护

Vbus_UnderVoltage_Check 欠压保护

LoseSpeed_Check 失速保护

失速,指的就是速度控制不住了,忽然加速

/*!
* @brief Motor Lose Speed protection.
*
* @param[in] speed: speed feedback pu value
* @return none
*/
void LoseSpeed_Check(int16_t speed)
{static int16_t oldSpeed = 0;static uint16_t cntLoseSpeed = 0;if (g_startUpCtrl.startUpFlag > 3){if ((Math_Qabs(speed) > LOSE_SPEED_THRESHOLD) || ((int16_t)Math_Mpy(pFocVarsCfg->motorDir, speed) < 0) || (Math_Qabs(speed - oldSpeed) > LOSE_SPEED_ERR_THRESHOLD))//转速超过设定阈值或当前转速与上一次转速差值大于设定阈值,且连续达到 10 次时上报失速故障(LOSE_SPEED_FAILURE)。{if (cntLoseSpeed < LOSE_SPEED_DBC){cntLoseSpeed++;}else{cntLoseSpeed = 0;oldSpeed = 0;g_protector.loseSpeedProFlag = 1;#if (defined STARTUP_CHECK_RESTART_ENABLE)#elseFault_Report(LOSE_SPEED_FAILURE);//上报失速错误#endif}}else{cntLoseSpeed = 0;
//            Fault_Clear(LOSE_SPEED_FAILURE);}oldSpeed = speed;}
}

ZeroSpeed_Check 零速保护

/*!
* @brief Motor Zero Speed protection.
*转速低于设定阈值,且连续达到 2 次时上报零速故障(ZERO_SPEED_FAILURE)。
* @param[in] none
* @return none
*/
void ZeroSpeed_Check(int16_t speed)
{static uint16_t s_zeroSpeedCnt = 0;if (g_startUpCtrl.startUpFlag >= 6){if (Math_Qabs(speed) < ZERO_SPEED_THRESHOLD){if (s_zeroSpeedCnt < ZERO_SPEED_DBC){s_zeroSpeedCnt++;}else{s_zeroSpeedCnt = 0;g_protector.zeroSpeedProFlag = 1;#if (defined STARTUP_CHECK_RESTART_ENABLE)#elseFault_Report(ZERO_SPEED_FAILURE);#endif}}else{s_zeroSpeedCnt = 0;
//            Fault_Clear(ZERO_SPEED_FAILURE);}}}

Stall_Check_Sensorless 堵转保护(无位置传感器)

可通过两种方式判断无传感模式下发生堵转情况:

1. 方差与平均转速平方的比例超过设定阈值。

2. 反电动势幅值与当前估算转速的比例超过设定阈值。

/*!
* @brief Motor stall protection detection for position sensorless application.
*
* @param[in] pHandle: pointer to SPEED_RAMP_HANDLE structure
* @param[in] smc: pointer to SMC_ESTIMATOR structure
* @return status: fault diagnosis status, 0 OK; 1 fault; 2 unknown
*/
int16_t Stall_Check_Sensorless(SPEED_RAMP_HANDLE *pHandle, SMC_ESTIMATOR *smc)
{int16_t status = DIAGNOSTIC_OK;static int16_t bemfReliableCnt = 0;int32_t avgSquareSpeed = 0;int32_t bemfReliableThreshold = 0;#if ((defined FLUX_OBSERVE) || (defined MRAS_OBSERVE))int32_t estBemfSq = 0;#endifif ((g_startUpCtrl.startUpFlag >= 3) && (g_startUpCtrl.startUpFlag < 6)){//ASR_AvgSpeedCalc(pHandle);avgSquareSpeed = (int32_t)(pHandle->avgSpeedFbk) * (int32_t)(pHandle->avgSpeedFbk);bemfReliableThreshold = avgSquareSpeed;g_bemfReliableThreshold = bemfReliableThreshold;#if (defined SMC_OBSERVE)Smc_GetBemfSq(smc);
//        g_estBemfDebug = (smc->estBemfSq * BEMF_CONSISTENT_THRESHOLD) >> 4;if ((((smc->estBemfSq * BEMF_CONSISTENT_THRESHOLD) >> 4) < bemfReliableThreshold)){if (++bemfReliableCnt >= BEMF_DBC){status = DIAGNOSTIC_FAIL;bemfReliableCnt = 0;g_protector.stallProFlag = 1;#if (defined STARTUP_CHECK_RESTART_ENABLE)#elseFault_Report(MOTOR_STALL_FAILURE);#endif}}else{bemfReliableCnt=0;}#elif (defined FLUX_OBSERVE)//磁链观测estBemfSq = (g_fluxObserver.emfAlpha * g_fluxObserver.emfAlpha + g_fluxObserver.emfBeta * g_fluxObserver.emfBeta) >> 8;g_estBemfDebug = estBemfSq * BEMF_CONSISTENT_THRESHOLD;if (((estBemfSq * BEMF_CONSISTENT_THRESHOLD) < bemfReliableThreshold) && (pHandle->varianceSpeed < 500000))//保护方差与反电动势{if (++bemfReliableCnt >= BEMF_DBC){status = DIAGNOSTIC_FAIL;bemfReliableCnt = 0;g_protector.stallProFlag = 1;#if (defined STARTUP_CHECK_RESTART_ENABLE)#elseFault_Report(MOTOR_STALL_FAILURE);#endif}}else{bemfReliableCnt = 0;}#elif (defined MRAS_OBSERVE)estBemfSq = (g_mrasObserver.vdFilter * g_mrasObserver.vdFilter + g_mrasObserver.vqFilter * g_mrasObserver.vqFilter) >> 8;
//        g_estBemfDebug = estBemfSq * BEMF_CONSISTENT_THRESHOLD;if (((estBemfSq * BEMF_CONSISTENT_THRESHOLD) < bemfReliableThreshold) && (pHandle->varianceSpeed < 500000)){if (++bemfReliableCnt >= BEMF_DBC){status = DIAGNOSTIC_FAIL;bemfReliableCnt = 0;g_protector.stallProFlag = 1;#if (defined STARTUP_CHECK_RESTART_ENABLE)#elseFault_Report(MOTOR_STALL_FAILURE);#endif}}else{bemfReliableCnt = 0;}#endif}else{
//        g_estBemfDebug = 0;
//        g_bemfReliableThreshold = 0;}return status;
}

Current_Sensor_Check 相电流中点检测保护

上电初始化阶段调用,获取三相电流中点偏移大小,超过 5%中点偏移电压

#if (CUR_SAMPLE_MODE == THREE_SHUNT_SAMPLE) //电流传感器采样零点漂移检查,电流采样ADC零漂移值超过限制,这是故障。/* 2048 *5% = 102 */if (Math_Qabs(adcSampleReal->icOffset - 2048) > 102){Fault_Report(PHASEC_CURRENT_MIDPOINT_FAILURE);}else{Fault_Clear(PHASEC_CURRENT_MIDPOINT_FAILURE);}
#else
#endif

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

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

相关文章

前端学习:HTML块、类、Id

目录 快 一、块元素、内联元素 二、HTML 元素 三、HTML元素 类 一、分类块级元素 二、分类行内元素 Id 一、使用 id 属性 二、 class与ID的差异 三、总结 快 一、块元素、内联元素 大多数HTML元素被定义为块级元素或内联元素。 块级元素在浏览器显示时&#xff0c;通常会…

FTP-----局域网内部传输文件(1)

在日常工作中&#xff0c;如果需要跨设备的传输文件&#xff0c;您需要借助USB数据线或者借助应用实现无线互联&#xff0c;将所需文件传输到对应设备&#xff0c;这一来一去&#xff0c;花费的时间与精力变多了&#xff0c;那么&#xff0c;怎么实现不使用第三方软件来实现跨设…

3-5年以上的功能测试如何进阶自动化?【附学习路线】

做为功能测试人员来讲&#xff0c;从发展方向上可分两个方面&#xff1a; 1、业务流程方向 2、专业技能方向。 当确定好方向后&#xff0c;接下来就是如何达到了。(文末自动化测试学习资料分享) 一、业务流程方向 1、熟悉底层的业务 作为功能测试工程师来讲&#xff0c;了解…

【C++高级】手写线程池项目-经典死锁问题分析-简历项目输出指导

作为五大池之一&#xff0c; 线程池的应用非常广 泛&#xff0c;不管是客户端程序&#xff0c;还是后台服务程序&#xff0c;掌握线程池&#xff0c;是提高业务处理能力的必备模块 本课程将带你从零开始&#xff0c;设计一个支持fixed和cached模式的线程池&#xff0c;玩转C11、…

IGA_PLSM3D的理解1

文章目录前言一、IgaTop3D_FAST.m给的参数二、Material properties 材料特性对Geom_Mod3D的理解对Pre_IGA3D的理解 输出1-----CtrPts&#xff1a; 输出2-----Ele&#xff1a; 输出3-----GauPts&#xff1a;前言 只是为方便学习&#xff0c;不做其他用途 一、IgaTop3D_FAST.m给的…

Python爬虫-某跨境电商(AM)搜索热词

前言 本文是该专栏的第42篇,后面会持续分享python爬虫干货知识,记得关注。 关于某跨境电商(AM),本专栏前面有单独详细介绍过,获取配送地的cookie信息以及商品库存数据,感兴趣的同学可往前翻阅。 1. python爬虫|爬取某跨境电商AM的商品库存数据(Selenium实战) 2. Seleni…

5.39 综合案例2.0 - STM32蓝牙遥控小车1(手机APP遥控)

综合案例2.0 - 蓝牙遥控小车1- 手机APP遥控成品展示案例说明器件说明连线小车源码手机遥控APPAPP使用说明成品展示 案例说明 用STM32单片机做了一辆蓝牙控制的麦轮小车&#xff0c;分享一下小车的原理和制作过程。 控制部分分为手机APP&#xff0c;语音模块控制&#xff0c;Ha…

15-721 chapter2 内存数据库

Background 随着时代的发展&#xff0c;DRAM可以容纳足够的便宜&#xff0c;容量也变大了。对于数据库来说&#xff0c;数据完全可以fit in memory&#xff0c;但同时面向disk的数据库架构不能很好的发挥这个特性 这张图是disk database的cpu instruction cost 想buffer pool…

第5章 继承-Java核心技术·卷1

文章目录Java与C不同基本概念继承&#xff1a;基于已有的类创建新的类。构造器多态定义超类变量可以引用所有的子类对象&#xff0c;但子类变量不能引用超类对象。子类引用的数组可以转换成超类引用的数组覆写返回子类型强制类型转换阻止继承&#xff1a;final类和方法多态 vs …

ROS学习-ROS简介

文章目录1.ROS1.1 ROS概念1.2 ROS特征1.3 ROS特点1.4 ROS版本1.5 ROS程序其他名词介绍1. 元操作系统2. IDL 接口定义语言一些网站1.ROS 1.1 ROS概念 ROS(Robot Operating System&#xff0c;机器人操作系统) ROS 是一个适用于机器人的开源的元操作系统&#xff0c;提供一系列…

linux驱动开发 - 04_Linux 设备树学习 - DTS语法

文章目录Linux 设备树学习 - DTS语法1 什么是设备树&#xff1f;2 DTS、DTB和DTC3 DTS 语法3.1 dtsi 头文件3.2 设备节点3.3 标准属性1、compatible 属性2、model 属性3、status 属性4、#address-cells 和#size-cells 属性5、reg 属性6、ranges 属性7、name 属性8、device_type…

人工智能专题-知识表示

文章目录人工智能专题-知识表示大纲2.1 知识表示的概念2.1.1 知识表示观点2.1.2 知识表示的要求2.2 一阶谓词逻辑表示法2.2.1 一阶谓词概念2.2.2 谓词逻辑表示方法2.3 产生式表示法2.4 语义网络表示法2.5 框架表示法人工智能专题-知识表示 大纲 大纲&#xff1a;掌握知识表示方…

思科路由器发现重大漏洞,解决方法是……

晚上好&#xff0c;我是老杨。 思科知名度高&#xff0c;待遇也好&#xff0c;很多网工心生向往&#xff0c;也有很多人考过思科认证的相关证书&#xff0c;对思科的印象还是不错吧&#xff1f; 而且&#xff0c;作为美国著名的网络设备厂商&#xff0c;思科是全球路由器巨头…

【面试】如何设计SaaS产品的数据权限?

文章目录前言数据权限是什么&#xff1f;设计原则整体方案RBAC模型怎么控制数据权限&#xff1f;1. 数据范围权限控制2. 业务对象操作权限控制3. 业务对象字段权限控制总结前言 一套系统的权限可以分为两类&#xff0c;数据权限和功能权限&#xff0c;今天我们从以下几个点&am…

【RabbitMQ】初识消息中间件MQ

目录 一、什么是MQ 二、MQ的优缺点 1、MQ的优点 1.应用解耦 2.削峰填谷 3.异步提速 2、MQ的缺点 1.可用性低 2.系统复杂度高 3.数据一致性问题 三、MQ使用场景 四、常见的MQ 一、什么是MQ MQ&#xff08;Message Queue&#xff09;&#xff1a;消息队列&#xff0c…

代码随想录_二叉树_leetcode654 617

leetcode654 最大二叉树 654. 最大二叉树 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点&#xff0c;其值为 nums 中的最大值。递归地在最大值 左边 的 子数组前缀上 构建左子树。递归地在最大值 右边 的 子数组后缀上 …

【FPGA实验4】举重比赛机制

举重比赛有三名裁判&#xff0c;当运动员将杠铃举起后&#xff0c;须有两名或两名以上裁判认可&#xff0c;方可判定试举成功&#xff0c;若用A、B、C分别代表三名裁判的意见输入&#xff0c;同意为1&#xff0c;否定为0;F为裁判结果输出&#xff0c;试举成功时F1&#xff0c;试…

iPhone如何不用iTunes将视频传输到电脑上?

随着智能手机的普及&#xff0c;iPhone已经成为了人们生活中必不可少的一部分。而随着iPhone摄像功能的逐渐完善&#xff0c;越来越多的用户开始将iPhone作为拍摄视频的工具。 但是&#xff0c;将iPhone中的视频传输到电脑并进行后续编辑处理或者备份储存&#xff0c;对于许多…

社科院与杜兰大学中外合作办学金融管理硕士项目——比起过往,前路更值得期待

当结束一天工作陷入沉思时&#xff0c;你有没有特别遗憾的事情呢&#xff0c;人生有太多的不确定性&#xff0c;比起过往&#xff0c;未知的人生更值得我们期待。与其懊恼没完成的遗憾&#xff0c;不如珍惜当下&#xff0c;努力创造未来。人生没有太晚的开始&#xff0c;在职读…

人工智能发展到GPT4经历了什么,从专家系统到机器学习再到深度学习,从大模型到现在的GPT4

大家好&#xff0c;我是微学AI&#xff0c;今天给大家讲一下人工智能的发展&#xff0c;从专家系统到机器学习再到深度学习&#xff0c;从大模型到现在的GPT4&#xff0c;讲这个的目的是让每个人都懂得人工智能&#xff0c;每个人都懂得人工智能的发展&#xff0c;未来人工智能…