吊哥FOC学习笔记---第二步开环FOC驱动
吊哥FOC学习笔记第二步—开环FOC驱动
在前面我们讲解了移植吊哥FOC的代码,点亮LED灯的程序,接下来就要正式进入FOC开环驱动了~
我们赋值上次的工程文件,并将其修改成FOC_OpenLoopRun。我们在原来的基础上添加开环所需要的代码。
1、开环所需添加的文件
在原有的点灯文件中添加如下所示的文件:
关于程序具体功能,我们在函数介绍部分讲解,这里有个感性认识即可。
2、编译所遇问题和解决办法
初次编译,会出现如下所示的错误信息:
问题所在就是说我们没有添加math库文件,接下来我们解决这个问题:
第一步:在魔法棒中的Define中,将原有的替换成:
USE_HAL_DRIVER,STM32F407xx,__FPU_PRESENT=1,__FPU_USED=1,ARM_MATH_CM4,__CC_ARM
如下图所示:
第二步:添加math库文件:其具体路径如下所示:
第三步:添加指定头文件路径,如下图所示
再次编译,会发现还有一个错误,如下所示:
问题的原因是我们没有添加Timer.c文件,这个文件是实现微妙延时函数,因为我们在别的程序中用到了,所有他找不到的话就会报错。
最后编译,即没有错误了,如下所示:
有了前面2步,我们的开环所需要配置的都弄完了,接下来就是对程序进行一定的修改,即可完成FOC开环系统的移植程序~~~
第一步,我们使用的是绝对式编码器,使用的是TLE5012B E1000巨磁角度传感器,其通讯方式是CSS,也就是特殊的SPI同学,MOSI和MISO连接在一起,成为数据端。
好了,不多说了。具体还是代码分析的时候再看吧。
代码分析
Framework中的代码
1、GetElectricalAngle(PFOC_Struct pFOC)
1、static void GetElectricalAngle(PFOC_Struct pFOC):获取电角度
#define FOC_SQRT_3 1.73205f //根号3的值#define FOC_ANGLE_TO_RADIN 0.01745f//角度转弧度值->Π=180°->那么1°=pFOC->mAngle = pFOC->GetEncoderAngle();//编码器获取的角度值,是机械角度值,我们程序中需要使用电角度,也就是电角度=机械角度×极对数pFOC->angle = pFOC->mAngle * pFOC->polePairs;//将机械角度转换成电角度pFOC->radian = pFOC->angle * FOC_ANGLE_TO_RADIN;//将电角度角度值变成弧度制.
也就是该函数的功能就是将通过磁编码器TLE5012B E1000获取到的角度值(机械角度),转换成电角度值(机械角度×极对数)(因为在Park变换和Anti-Park变换中需要角度值,这个角度值是电角度值),将获取到的电角度值转换成弧度制。
2、CurrentReconstruction(PFOC_Struct pFOC)
2、static void CurrentReconstruction(PFOC_Struct pFOC):电流重构。
至于为什么要重构这个问题,当初我想了好久,一直想不通,后来有一天在bilibili看到一家直播FOC的,就懂了。
电流采样我们使用的是三电阻采样,下桥臂采样,也就是说只有下桥臂关闭,才能采取到电流。而在第一象限和第六象限中电流ia是采样采取不到电流的、第二象限和第象限中的电流ib是采样不到电流的、在第四象限和第五象限中的电流ic是采样不到电流的,所以才需要电流重构,比如在第一象限中采样电路ib、ic,根据KCL方程可以求出ia的电流~其他象限是同样的方法。
static void CurrentReconstruction(PFOC_Struct pFOC)
{pFOC->GetPreCurrent(&pFOC->ia,&pFOC->ib,&pFOC->ic);if (pFOC->iNum < 3) { //如果采样电阻小于3,则不运行任何代码.return;}switch (pFOC->GetSVPWMSector()) {case 1:pFOC->ia =0.0f - pFOC->ib - pFOC->ic;break;case 2:pFOC->ib =0.0f - pFOC->ia - pFOC->ic;break;case 3:pFOC->ib =0.0f - pFOC->ia - pFOC->ic;break;case 4:pFOC->ic =0.0f - pFOC->ia - pFOC->ib;break;case 5:pFOC->ic =0.0f - pFOC->ia - pFOC->ib;break;case 6:pFOC->ia =0.0f - pFOC->ib - pFOC->ic;break;default:break;}
}
3、ClarkeTransform(PFOC_Struct pFOC)
static void ClarkeTransform(PFOC_Struct pFOC):Clark变换。
{pFOC->iα = pFOC->ia;pFOC->iβ = (pFOC->ia + 2.0f * pFOC->ib) / FOC_SQRT_3;
}
4、ParkTransform(PFOC_Struct pFOC)
static void ParkTransform(PFOC_Struct pFOC):Park变换。
static void ParkTransform(PFOC_Struct pFOC)
{pFOC->id = pFOC->iα * arm_cos_f32(pFOC->radian) + pFOC->iβ * arm_sin_f32(pFOC->radian);pFOC->iq = -pFOC->iα * arm_sin_f32(pFOC->radian) + pFOC->iβ * arm_cos_f32(pFOC->radian);
}
5、ParkAntiTransform(PFOC_Struct pFOC)
static void ParkAntiTransform(PFOC_Struct pFOC):反Park变换。
static void ParkAntiTransform(PFOC_Struct pFOC)
{pFOC->iαSVPWM = pFOC->idPID.out * arm_cos_f32(pFOC->radian) - pFOC->iqPID.out * arm_sin_f32(pFOC->radian);pFOC->iβSVPWM = pFOC->idPID.out * arm_sin_f32(pFOC->radian) + pFOC->iqPID.out * arm_cos_f32(pFOC->radian);
}
6、CurrentPIControlID(PFOC_Struct pFOC)
static void CurrentPIControlID(PFOC_Struct pFOC):D轴电流PID环。
static void CurrentPIControlID(PFOC_Struct pFOC)
{//获取实际值pFOC->idPID.pre = pFOC->id ;//目标值为id,与实际的id做对比,然后进入PID闭环系统,输出电压ualpha//获取目标值pFOC->idPID.tar = pFOC->tarid;//计算偏差pFOC->idPID.bias = pFOC->idPID.tar - pFOC->idPID.pre;//计算PID输出值pFOC->idPID.out += pFOC->idPID.kp * (pFOC->idPID.bias - pFOC->idPID.lastBias) + pFOC->idPID.ki * pFOC->idPID.bias;//保存偏差pFOC->idPID.lastBias = pFOC->idPID.bias;if (pFOC->idPID.out > fabs(pFOC->idPID.outMax)) {pFOC->idPID.out = fabs(pFOC->idPID.outMax);}if (pFOC->idPID.out < -fabs(pFOC->idPID.outMax)) {pFOC->idPID.out = -fabs(pFOC->idPID.outMax);}
}
7、CurrentPIControlIQ(PFOC_Struct pFOC)
static void CurrentPIControlIQ(PFOC_Struct pFOC):Q轴电流PID环。
static void CurrentPIControlIQ(PFOC_Struct pFOC)
{//获取实际值pFOC->iqPID.pre = pFOC->iq;//获取目标值pFOC->iqPID.tar = pFOC->tariq;//计算偏差pFOC->iqPID.bias = pFOC->iqPID.tar - pFOC->iqPID.pre;//计算PID输出值pFOC->iqPID.out += pFOC->iqPID.kp * (pFOC->iqPID.bias - pFOC->iqPID.lastBias) + pFOC->iqPID.ki * pFOC->iqPID.bias;//保存偏差pFOC->iqPID.lastBias = pFOC->iqPID.bias;if (pFOC->iqPID.out > fabs(pFOC->iqPID.outMax)) {pFOC->iqPID.out = fabs(pFOC->iqPID.outMax);}if (pFOC->iqPID.out < -fabs(pFOC->iqPID.outMax)) {pFOC->iqPID.out = -fabs(pFOC->iqPID.outMax);}
}
有了以上的7个基本函数,那么FOC控制的大致框图流程就能形成了,如下图所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1vuXtAfD-1636120515830)(C:\Users\asus\Desktop\FOC开发\吊哥FOC资料\吊哥FOC学习过程总结资料\吊哥FOC学习笔记—第二步开环FOC驱动相关图片\图17:开环框图.png)]
步骤:通过编码器获取电角度->>>电流重构(获取ia、ib、ic)->>>Clark变换->>>Park变换输出->>>D轴和Q轴进行PID计算->>>反Park变换->SVPWM产生驱动电机。
8、FocContorl(PFOC_Struct pFOC)
void FocContorl(PFOC_Struct pFOC):FOC控制流程
void FocContorl(PFOC_Struct pFOC)
{//0.获取电气角度GetElectricalAngle(pFOC);//1计算实际电流值//1.0电流重构CurrentReconstruction(pFOC);//1.1Clarke变换ClarkeTransform(pFOC);//1.2Park变换ParkTransform(pFOC);//2.做电流环PID闭环CurrentPIControlID(pFOC);CurrentPIControlIQ(pFOC);pFOC->idPID.out = 0.0;pFOC->iqPID.out = 2.0;//3.计算输出值iα i贝塔ParkAntiTransform(pFOC);//4.输出SVPWMpFOC->SvpwmGenerate(pFOC->iαSVPWM,pFOC->iβSVPWM);return;
}
9、SetCurrentPIDTar(PFOC_Struct pFOC,float tarid,float tariq)
void SetCurrentPIDTar(PFOC_Struct pFOC,float tarid,float tariq):设置D轴和Q轴的目标值,也就是设置目标iq、id值,与实际值作差进入PID闭环计算。
void SetCurrentPIDTar(PFOC_Struct pFOC,float tarid,float tariq)
{pFOC->tarid = tarid;pFOC->tariq = tariq;
}
10、SetCurrentPIDParams(PFOC_Struct pFOC,float kp,float ki,float kd,float outMax)
void SetCurrentPIDParams(PFOC_Struct pFOC,float kp,float ki,float kd,float outMax):对电流环PID进行参数赋值。特别注意其中outMax的值等于:Udc/根号3,这是矢量圆规定的,不能超过,超过的话要限幅。
void SetCurrentPIDParams(PFOC_Struct pFOC,float kp,float ki,float kd,float outMax)
{pFOC->idPID.kp = kp;pFOC->idPID.ki = ki;pFOC->idPID.kd = kd;pFOC->idPID.outMax = outMax;pFOC->iqPID.kp = kp;pFOC->iqPID.ki = ki;pFOC->iqPID.kd = kd;pFOC->iqPID.outMax = outMax;
}
11、SetFocEnable(PFOC_Struct pFOC,uint8_t isEnable)
void SetFocEnable(PFOC_Struct pFOC,uint8_t isEnable):设计电机使能,后面通过M1_Enable进行调用~
void SetFocEnable(PFOC_Struct pFOC,uint8_t isEnable)
{pFOC->isEnable = isEnable;pFOC->SetEnable(pFOC->isEnable);
}
12、FOCPrintf(PFOC_Struct pFOC)
void FOCPrintf(PFOC_Struct pFOC) :FOC打印函数,答应相关数据内容。
void FOCPrintf(PFOC_Struct pFOC)
{printf("1:%f\r\n",pFOC->ia);printf("2:%f\r\n",pFOC->ib);printf("3:%f\r\n",pFOC->ic);printf("4:%f\r\n",pFOC->angle);printf("5:%f\r\n",pFOC->id);printf("6:%f\r\n",pFOC->iq);printf("7:%f\r\n",pFOC->idPID.tar);printf("8:%f\r\n",pFOC->iqPID.tar);
}
13、GetFocAngle(PFOC_Struct pFOC)
float GetFocAngle(PFOC_Struct pFOC):获取FOC机械角度,后面通过TLE5012B E1000中的SPI函数进行读取。
float GetFocAngle(PFOC_Struct pFOC)
{return pFOC->mAngle;
}
以上就算最基本的框图,我们会发现,其中的SVPWM调用了,但是没有具体的函数内容,所以接下来就算该SVPWM的内容了。
14、 SvpwmSectorJudgment(PSvpwm_Struct pSvpwm)
void SvpwmSectorJudgment(PSvpwm_Struct pSvpwm):扇区判断,用ualpha、ubeta判断扇区的位置
#define SVPWM_SQRT3_2 0.866f
#define SVPWM_SQRT3 1.732f
void SvpwmSectorJudgment(PSvpwm_Struct pSvpwm)
{uint8_t a;uint8_t b;uint8_t c;uint8_t sector;pSvpwm->u1 = pSvpwm->uβ;pSvpwm->u2 = pSvpwm->uα * SVPWM_SQRT3_2 - pSvpwm->uβ / 2.0f;pSvpwm->u3 = -pSvpwm->uα * SVPWM_SQRT3_2 - pSvpwm->uβ / 2.0f;if (pSvpwm->u1 > 0) {a = 1;} else {a = 0;}if (pSvpwm->u2 > 0) {b = 1;} else {b = 0;}if (pSvpwm->u3 > 0) {c = 1;} else {c = 0;}sector = 4*c + 2*b + a;switch (sector) {case 3:pSvpwm->sector = 1;break;case 1:pSvpwm->sector = 2;break;case 5:pSvpwm->sector = 3;break;case 4:pSvpwm->sector = 4;break;case 6:pSvpwm->sector = 5;break;case 2:pSvpwm->sector = 6;break;}
}
15、GetVectorDuration(PSvpwm_Struct pSvpwm)
void GetVectorDuration(PSvpwm_Struct pSvpwm):获取矢量作用时长
void GetVectorDuration(PSvpwm_Struct pSvpwm)
{switch (pSvpwm->sector) {case 1:pSvpwm->t4 = SVPWM_SQRT3 * pSvpwm->ts / pSvpwm->udc * pSvpwm->u2;pSvpwm->t6 = SVPWM_SQRT3 * pSvpwm->ts / pSvpwm->udc * pSvpwm->u1;pSvpwm->t0 = pSvpwm->t7 = (pSvpwm->ts - pSvpwm->t4 - pSvpwm->t6) / 2.0f;break;case 2:pSvpwm->t2 = -SVPWM_SQRT3 * pSvpwm->ts / pSvpwm->udc * pSvpwm->u2;pSvpwm->t6 = -SVPWM_SQRT3 * pSvpwm->ts / pSvpwm->udc * pSvpwm->u3;pSvpwm->t0 = pSvpwm->t7 = (pSvpwm->ts - pSvpwm->t2 - pSvpwm->t6) / 2.0f;break;case 3:pSvpwm->t2 = SVPWM_SQRT3 * pSvpwm->ts / pSvpwm->udc * pSvpwm->u1;pSvpwm->t3 = SVPWM_SQRT3 * pSvpwm->ts / pSvpwm->udc * pSvpwm->u3;pSvpwm->t0 = pSvpwm->t7 = (pSvpwm->ts - pSvpwm->t2 - pSvpwm->t3) / 2.0f;break;case 4:pSvpwm->t1 = -SVPWM_SQRT3 * pSvpwm->ts / pSvpwm->udc * pSvpwm->u1;pSvpwm->t3 = -SVPWM_SQRT3 * pSvpwm->ts / pSvpwm->udc * pSvpwm->u2;pSvpwm->t0 = pSvpwm->t7 = (pSvpwm->ts - pSvpwm->t1 - pSvpwm->t3) / 2.0f;break;case 5:pSvpwm->t1 = SVPWM_SQRT3 * pSvpwm->ts / pSvpwm->udc * pSvpwm->u3;pSvpwm->t5 = SVPWM_SQRT3 * pSvpwm->ts / pSvpwm->udc * pSvpwm->u2;pSvpwm->t0 = pSvpwm->t7 = (pSvpwm->ts - pSvpwm->t1 - pSvpwm->t5) / 2.0f;break;case 6:pSvpwm->t4 = -SVPWM_SQRT3 * pSvpwm->ts / pSvpwm->udc * pSvpwm->u3;pSvpwm->t5 = -SVPWM_SQRT3 * pSvpwm->ts / pSvpwm->udc * pSvpwm->u1;pSvpwm->t0 = pSvpwm->t7 = (pSvpwm->ts - pSvpwm->t4 - pSvpwm->t5) / 2.0f;break;default:break;}
}
16、SvpwmGenerate(PSvpwm_Struct pSvpwm)
void SvpwmGenerate(PSvpwm_Struct pSvpwm):SVPWM生成周期函数
void SvpwmGenerate(PSvpwm_Struct pSvpwm)
{float ta;float tb;float tc;switch (pSvpwm->sector) {case 1:ta = pSvpwm->t4 + pSvpwm->t6 + pSvpwm->t7;tb = pSvpwm->t6 + pSvpwm->t7;tc = pSvpwm->t7;break;case 2:ta = pSvpwm->t6 + pSvpwm->t7;tb = pSvpwm->t2 + pSvpwm->t6 + pSvpwm->t7;tc = pSvpwm->t7;break;case 3:ta = pSvpwm->t7;tb = pSvpwm->t2 + pSvpwm->t3 + pSvpwm->t7;tc = pSvpwm->t3 + pSvpwm->t7;break;case 4:ta = pSvpwm->t7;tb = pSvpwm->t3 + pSvpwm->t7;tc = pSvpwm->t1 + pSvpwm->t3 + pSvpwm->t7;break;case 5:ta = pSvpwm->t5 + pSvpwm->t7;tb = pSvpwm->t7;tc = pSvpwm->t1 + pSvpwm->t5 + pSvpwm->t7;break;case 6:ta = pSvpwm->t4 + pSvpwm->t5 + pSvpwm->t7;tb = pSvpwm->t7;tc = pSvpwm->t5 + pSvpwm->t7;break;}pSvpwm->SetChannelAHighLeaveTime_us(ta);pSvpwm->SetChannelBHighLeaveTime_us(tb);pSvpwm->SetChannelCHighLeaveTime_us(tc);
}
有了14、15、16三个函数,我们就可以构成SVPWM函数了,其操作流程为:扇区判断,判断转子目前的位子->>>计算矢量在该扇区的作用时长—>SVPWM周期生成.
17、SvpwmContorol(PSvpwm_Struct pSvpwm,float uα,float uβ)
void SvpwmContorol(PSvpwm_Struct pSvpwm,float uα,float uβ):Svpwm控制
void SvpwmContorol(PSvpwm_Struct pSvpwm,float uα,float uβ)
{pSvpwm->uα = uα;pSvpwm->uβ = uβ;//1.扇区判断SvpwmSectorJudgment(pSvpwm);//2.计算矢量作用时长GetVectorDuration(pSvpwm);//3.SVPWM生成SvpwmGenerate(pSvpwm);
}
18、GetSVPWMSector(PSvpwm_Struct pSvpwm)
uint8_t GetSVPWMSector(PSvpwm_Struct pSvpwm):获取扇区信息
uint8_t GetSVPWMSector(PSvpwm_Struct pSvpwm)
{return pSvpwm->sector;
}
FOC框图中,目前就差角度信息了,角度信息我们是通过TLE5012B E1000巨磁角度传感器获取的,所以还差一个通过TLE5012B E1000获取角度信息的函数。
19、ReadTLE5012BAngle(PTLE5012B_Struct pTLE5012B)
float ReadTLE5012BAngle(PTLE5012B_Struct pTLE5012B):获取角度值
float ReadTLE5012BAngle(PTLE5012B_Struct pTLE5012B)
{uint16_t data = 0xffff;float angle;pTLE5012B->SetCSLeave(0);pTLE5012B->Delay_us(1);//这里的延时1us,是通过后面调用Timer.c文件实现的.pTLE5012B->SPIWrite(0x8021);data = pTLE5012B->SPIRead();pTLE5012B->SetCSLeave(1);data &= 0x7fff;angle = data / 32767.0f * 360.0f;angle = angle - pTLE5012B->angleOffect;if (angle < 0) {angle = angle + 360.0f;}return angle;
}
在Framework中的函数都是脱离硬件层的,相当于一个接口函数,我们以后使用它就是在PeripheralDriver文件(Framework文件+MCUDriver)中调用它实现相关功能的。MCUDriver文件是硬件层函数。
MCUDriver中的代码
1、MCUDriverMain_Init(void)
void MCUDriverMain_Init(void):MCU驱动主函数,进行电机定时器初始化功能,芯片级的,硬件层相关。
void MCUDriverMain_Init(void)
{Motor1TIM1_Init();
}
2、MCUDriverMain_Loop(void)
void MCUDriverMain_Loop(void):芯片循环
void MCUDriverMain_Loop(void)
{}
3、Motor1TIM1_Init(void)
void Motor1TIM1_Init(void):电机1定时器初始化
void Motor1TIM1_Init(void)
{HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_2);HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_3);__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,0);__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_2,0);__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_3,0);SetMotor1ChannelAHighLeaveTime_us(0);//设置高电平时间为0s,也就是关断SetMotor1ChannelBHighLeaveTime_us(0);//设置高电平时间为0s,也就是关断SetMotor1ChannelCHighLeaveTime_us(0);//设置高电平时间为0s,也就是关断HAL_TIM_Base_Start_IT(&htim1);
}
4、SetMotor1ChannelAHighLeaveTime_us(float time)
void SetMotor1ChannelAHighLeaveTime_us(float time):设置电机1通道A高电平时间(中央对齐模式二)
void SetMotor1ChannelAHighLeaveTime_us(float time)
{uint32_t ccr;if (time < 0) {time = 0;}if (time > 100) {time = 100;}ccr = 42 * time;__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1, ccr);
}
5、SetMotor1ChannelBHighLeaveTime_us(float time)
void SetMotor1ChannelBHighLeaveTime_us(float time):设置电机1通道A高电平时间(中央对齐模式二)
void SetMotor1ChannelBHighLeaveTime_us(float time)
{uint32_t ccr;if (time < 0) {time = 0;}if (time > 100) {time = 100;}ccr = 42 * time;__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_2, ccr);
}
6、SetMotor1ChannelCHighLeaveTime_us(float time)
void SetMotor1ChannelCHighLeaveTime_us(float time):设置电机1通道A高电平时间(中央对齐模式二)
void SetMotor1ChannelCHighLeaveTime_us(float time)
{uint32_t ccr;if (time < 0) {time = 0;}if (time > 100) {time = 100;}ccr = 42 * time;__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_2, ccr);
}
7、Motor1SetEnable(uint8_t isEnable)
void Motor1SetEnable(uint8_t isEnable):设置电机1使能标志,通过设置M1_Enable引脚。
void Motor1SetEnable(uint8_t isEnable)
{HAL_GPIO_WritePin(M1_Enable_GPIO_Port,M1_Enable_Pin, (GPIO_PinState)isEnable);
}
8、Motor1SPI1WriteData(uint16_t data)
void Motor1SPI1WriteData(uint16_t data):SPI1写数据
void Motor1SPI1WriteData(uint16_t data)
{HAL_SPI_Transmit(&hspi1,(uint8_t *)&data,1,1000);
}
9、Motor1SPI1ReadData(void)
uint16_t Motor1SPI1ReadData(void):SPI1读数据
void Motor1SPI1WriteData(uint16_t data)
{HAL_SPI_Transmit(&hspi1,(uint8_t *)&data,1,1000);
}
10、Motor1SPI1SetCS(uint8_t leave)
void Motor1SPI1SetCS(uint8_t leave):设置SPI1 片选1引脚电平
void Motor1SPI1SetCS(uint8_t leave)
{HAL_GPIO_WritePin(M1_SPI_CS_GPIO_Port,M1_SPI_CS_Pin, (GPIO_PinState)leave);
}
上述的8、9、10函数主要是用于设置SPI写、读取、设置片选引脚的功能,结合Framework中的代码,在PeriphalDriver中,调用两者,使其结合,最后驱动无刷直流电机。
11、rt_hw_us_delay(uint32_t us)
void rt_hw_us_delay(uint32_t us):设置us延时功能,注意其中的us值不能大于1000!!!切记
void rt_hw_us_delay(uint32_t us)
{uint32_t start, now, delta, reload, us_tick;start = SysTick->VAL;reload = SysTick->LOAD;us_tick = SystemCoreClock / 1000000UL;do {now = SysTick->VAL;delta = start > now ? start - now : reload + start - now;} while(delta < us_tick * us);
}
上面就是MCUDriver中的代码函数,这个里面的函数主要是硬件层的函数,通过不同的MCU实现功能。最后在PeriphalDriver中结合,实现脱离硬件层的Framework中的代码与MCUDriver中的代码相结合,最后实现函数功能!!!
PeriphalsDriver中的代码
1、PerDriverMain_Init(void)
void PerDriverMain_Init(void):外设初始化
void PerDriverMain_Init(void)
{LEDConfig_Init();Motor1FOCConfig_Init();
}
2、PerDriverMain_Loop(void)
void PerDriverMain_Loop(void):外设循环
void PerDriverMain_Loop(void)
{LEDConfig_Loop();
}
3、GetMotor1PreCurrent(float *ua,float *ub,float *uc)
void GetMotor1PreCurrent(float *ua,float *ub,float *uc):获取电机1的3相电流值
#define AD_TO_CURRENT 0.00032 //电流值×电阻值×放大倍数➗3.3×4096的结果。
//其中4096是因为ADC是12位的精度,2^12=4096;#define M1_OUTMAX 12.0f * 0.577f
#define M1_KP 0.018f
#define M1_KI 0.018f
#define M1_KD 0.0f
void GetMotor1PreCurrent(float *ua,float *ub,float *uc)
{//*ua = GetMotor1ADC1PhaseXValue(0) * AD_TO_CURRENT * 1.5;//*ub = GetMotor1ADC1PhaseXValue(1) * AD_TO_CURRENT * 1.5;//*uc = GetMotor1ADC1PhaseXValue(2) * AD_TO_CURRENT * 1.5;*ua = 0;*ub = 0;*uc = 0;
}
//调用Framework中的函数,用于连接脱离层代码。
FOC_EXPORT(gMotor1FOC,7.0f,3,Motor1SetEnable,Motor1TLE5012BReadAngel,Motor1GetSVPWMSector,GetMotor1PreCurrent,Motor1SvpwmGenerate)
4、Motor1FOCConfig_Init(void)
void Motor1FOCConfig_Init(void):电机1FOC初始化
void Motor1FOCConfig_Init(void)
{//设置电机1参数SetFocEnable(&gMotor1FOC,1);SetCurrentPIDParams(&gMotor1FOC,M1_KP,M1_KI,M1_KD,M1_OUTMAX);//设置目标电流SetCurrentPIDTar(&gMotor1FOC,0,0);
}
5、Motor1FOCConfig_Printf(void)
void Motor1FOCConfig_Printf(void):电机1FOC打印函数
void Motor1FOCConfig_Printf(void)
{FOCPrintf(&gMotor1FOC);
}
6、Motor1FocControl(void)
void Motor1FocControl(void):电机1FOC控制函数
void Motor1FocControl(void)
{FocContorl(&gMotor1FOC);
}
7、Motor1SetTarIDIQ(float id,float iq)
void Motor1SetTarIDIQ(float id,float iq):设置电机1目标电流
void Motor1SetTarIDIQ(float id,float iq)
{SetCurrentPIDTar(&gMotor1FOC,id,iq);
}
8、Motor1GetAngle(void)
float Motor1GetAngle(void):获取电机1机械角度
float Motor1GetAngle(void)
{return GetFocAngle(&gMotor1FOC);
}
9、Motor1SvpwmGenerate(float uα,float uβ)
void Motor1SvpwmGenerate(float uα,float uβ):电机一SVPWM生成
void Motor1SvpwmGenerate(float uα,float uβ)
{SvpwmContorol(&gMotor1,uα,uβ);
}
10、Motor1GetSVPWMSector(void)
uint8_t Motor1GetSVPWMSector(void):获取电机1的扇区
uint8_t Motor1GetSVPWMSector(void)
{return GetSVPWMSector(&gMotor1);
}
11、Motor1TLE5012BReadAngel(void)
float Motor1TLE5012BReadAngel(void):获取电机1角度值
TLE5012B_EXPORT(gMorot1Encoder,14.073915f,Motor1SPI1SetCS,Motor1SPI1WriteData,Motor1SPI1ReadData,rt_hw_us_delay)
float Motor1TLE5012BReadAngel(void)
{return ReadTLE5012BAngle(&gMorot1Encoder);
}
Function中的代码
1、FunctionMain_Init(void)
void FunctionMain_Init(void):功能初始化
void FunctionMain_Init(void)
{AngleCalibrationFunc_Init();
}
2、FunctionMain_Loop(void)
void FunctionMain_Loop(void):功能初始化
void FunctionMain_Loop(void)
{
}
3、Motor1AngleCalibration(void)
void Motor1AngleCalibration(void):电机一角度校准
float calAngle;
void Motor1AngleCalibration(void)
{//1.使能电机Motor1SetEnable(1);//2.电机旋转至a轴SetMotor1ChannelAHighLeaveTime_us(70);SetMotor1ChannelBHighLeaveTime_us(40);SetMotor1ChannelCHighLeaveTime_us(40);HAL_Delay(500);//3.读取角度for (uint8_t i = 0; i < 10; i++) {calAngle = Motor1TLE5012BReadAngel();HAL_Delay(100);// printf("1:float%f\r\n",calAngle);}//4.电机失能SetMotor1ChannelAHighLeaveTime_us(0);SetMotor1ChannelBHighLeaveTime_us(0);SetMotor1ChannelCHighLeaveTime_us(0);Motor1SetEnable(0);while(1){HAL_Delay(10);Motor1SetEnable(0);}
}
3、AngleCalibrationFunc_Init(void)
void AngleCalibrationFunc_Init(void):编码器角度校准
void AngleCalibrationFunc_Init(void)
{//Motor1AngleCalibration();//Motor2AngleCalibration();
}
如何开启FOC开环运动呢?
第一步:校验编码器的初始角度。那怎么做呢?
首先,打开PeriphalsDriver中的Motor1TLE5012BConfig.c文件,找到这个函数:TLE5012B_EXPORT(gMorot1Encoder,14.073915f,Motor1SPI1SetCS,Motor1SPI1WriteData,Motor1SPI1ReadData,rt_hw_us_delay)
然后把第二项中的14.073915f,改成0.0
TLE5012B_EXPORT(gMorot1Encoder,0.0f,Motor1SPI1SetCS,Motor1SPI1WriteData,Motor1SPI1ReadData,rt_hw_us_delay)其次,关闭系统定时器中断,因为定时器中断中调用了FOCControl函数,这个函数也获取了电角度,而我们又在function中获取了角度,这样容易产生误差,因此直接关闭定时器中断算了。也就是把MCUDriver的Motor1TIM1PWM.c中的HAL_TIM_Base_Start_IT(&htim1)屏蔽掉。再其次,把Framework的FOC.c中的FocControl函数中的pFOC->idPID.out = 0.0;pFOC->iqPID.out = 2.0;屏蔽掉。最后,取消Function中的AngleCalibrationFunc.c中的角度//Motor1AngleCalibration();中的注释。
这样就可以debug,然后把calAngle放在watch中观看角度值。你转动电机,这个角度会变~找到一个较小的值就行。找到这个值后,替换PeriphalsDriver中的Motor1TLE5012BConfig.c文件,找到这个函数:TLE5012B_EXPORT(gMorot1Encoder,0.0f,Motor1SPI1SetCS,Motor1SPI1WriteData,Motor1SPI1ReadData,rt_hw_us_delay)
替换里面的0.0f,保留6位小数即可。
第二步,角度校验好了,关闭Function中的AngleCalibrationFunc.c中的角度//Motor1AngleCalibration();,也就是把这个函数继续屏蔽掉。
开启定时器中断,把MCUDriver的Motor1TIM1PWM.c中的HAL_TIM_Base_Start_IT(&htim1)打开。其次,把Framework的FOC.c中的FocControl函数中的pFOC->idPID.out = 0.0;pFOC->iqPID.out = 2.0;打开。
经过上面2步,开环FOC就完成了。你的电机就能顺利跑起来了~
遇到的问题
1、电机上电后,它不跑,原因:磁编码器没有角度校验(也就是第一次角度校验没有做)
2、电机上电后,角度也校验了,他没跑,而且你扭电机,扭不动,一卡一卡地走,原因:更换三相相序中任意二相相序。
3、角度校验时,角度值不变,原因:磁编码器TLE5012B E1000有问题~
,rt_hw_us_delay)
其次,关闭系统定时器中断,因为定时器中断中调用了FOCControl函数,这个函数也获取了电角度,而我们又在function中获取了角度,这样容易产生误差,因此直接关闭定时器中断算了。也就是把MCUDriver的Motor1TIM1PWM.c中的HAL_TIM_Base_Start_IT(&htim1)屏蔽掉。
再其次,把Framework的FOC.c中的FocControl函数中的pFOC->idPID.out = 0.0;pFOC->iqPID.out = 2.0;屏蔽掉。
最后,取消Function中的AngleCalibrationFunc.c中的角度//Motor1AngleCalibration();中的注释。
这样就可以debug,然后把calAngle放在watch中观看角度值。你转动电机,这个角度会变~找到一个较小的值就行。找到这个值后,替换PeriphalsDriver中的Motor1TLE5012BConfig.c文件,找到这个函数:TLE5012B_EXPORT(gMorot1Encoder,0.0f,Motor1SPI1SetCS,Motor1SPI1WriteData,Motor1SPI1ReadData,rt_hw_us_delay)替换里面的0.0f,保留6位小数即可。---第二步,角度校验好了,关闭Function中的AngleCalibrationFunc.c中的角度//Motor1AngleCalibration();,也就是把这个函数继续屏蔽掉。```c开启定时器中断,把MCUDriver的Motor1TIM1PWM.c中的HAL_TIM_Base_Start_IT(&htim1)打开。其次,把Framework的FOC.c中的FocControl函数中的pFOC->idPID.out = 0.0;pFOC->iqPID.out = 2.0;打开。
经过上面2步,开环FOC就完成了。你的电机就能顺利跑起来了~
遇到的问题
1、电机上电后,它不跑,原因:磁编码器没有角度校验(也就是第一次角度校验没有做)
2、电机上电后,角度也校验了,他没跑,而且你扭电机,扭不动,一卡一卡地走,原因:更换三相相序中任意二相相序。
3、角度校验时,角度值不变,原因:磁编码器TLE5012B E1000有问题~
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
相关文章
- C++ map与unordered_map使用和区别
转至:https://blog.csdn.net/BillCYJ/article/details/78985895 https://www.cnblogs.com/langyao/p/8823092.html 需要引入的头文件不同 map: #include < map > unordered_map: #include < unordered_map > 内部实现机理不同 map: map内…...
2024/4/28 5:52:02 - 数据结构——图
一、图的基本概念 图(Graph)——图G是由两个集合 V(G) 和E(G) 组成的,记为 G(V,E),其中:V(G) 是顶点的非空有限集, E(G) 是边的有限集合,边是顶点的无序对或有序对。 图不能是空图 1.图的术语和定义 1)有…...
2024/4/14 23:23:50 - 2021年全球与中国电动辅助轮椅行业市场规模及发展前景分析
2021年全球与中国电动辅助轮椅行业市场规模及发展前景分析 本报告研究全球与中国市场电动辅助轮椅的发展现状及未来发展趋势,分别从生产和消费的角度分析电动辅助轮椅的主要生产地区、主要消费地区以及主要的生产商。重点分析全球与中国市场的主要厂商产品特点、产品…...
2024/4/28 11:52:24 - 【Vue】使用this.$parent.变量名获取父组件的数据得到undefined【解决办法】
vue使用this.$parent.变量名获取父组件的数据得到undefined_韩大璐-CSDN博客 如果你使用【uni-app框架】基本都会包裹一层 API — Vue.jshttps://cn.vuejs.org/v2/api/#parentVue官方不建议使用$parent或$children来获取属性方法【因为页面的组件顺序的变化,会导致某些方法无法…...
2024/4/28 10:59:26 - JavaScript关于如何实现点击即可获取属性值。
JavaScript关如何获取所点击元件的属性值 事件背景:百度不到如何解决此类问题,于是运用自己的小脑袋及所学基本js知识来解决(某度真的垃圾) 1.事件 以获取标签内的id值为例,代码如下: //这里编写一个事件…...
2024/4/14 23:24:36 - 数据库实验一:创建CAP数据库
实验目的和要求 熟悉SQL Server 2008 中SQL Server Management Studio(SSMS)的环境了解SQL Server 2008数据库的逻辑结构和物理结构掌握创建和删除数据库的方法掌握创建和删除表的方法掌握简单查询 实验内容 设有一商品订购管理系统,其数据…...
2024/4/14 23:24:31 - thinkbook 15p安装ubuntu16.04 触摸板+无线网卡不能用问题解决
2021 thinkbook安装ubuntu16.04后触摸板无法使用,无线网卡无法使用的问题解决方法。 安装ubuntu20.04可正常使用,但由于需要16.04,故而必须解决不能使用的问题。 thinkbook 15p通过windows查看无线网卡的型号为 Intel Wi-Fi 6 AX201 160MHz触…...
2024/4/16 0:11:07 - 四、数据校验与去重
为何需要数据校验 在上一篇博客中,我们加入了元数据服务作为存储对象的全局唯一标识,并在测试时留下了一个伏笔,查看 hello 文件的版本时可以看到这两个版本的 size 一致,都是 14 。其实是上传了同一个 hello 文件但每次请求的散…...
2024/4/18 3:05:57 - Java 继承和多态之接口
任务描述相关知识 接口的定义实现接口接口的特点编程要求任务描述 本关任务:编写程序,实现两个数的求和运算和比较。 相关知识 Java 接口(Interface),是一系列方法的声明,是一些方法特征的集合,…...
2024/4/16 7:13:09 - 学习HCIA的第三天
OSI/RM七层参考模型——开放式系统互联参考模型 1979年—ISO—国际标准化组织 OSI的核心思想——分层 属于同一层面的不同功能,其目的和作用是相似或者相近的;属于不同层面的不同功能,其目的和作用存在明显的差异。每一层都在下层的基础上提…...
2024/4/18 12:40:55 - MySQL日志15连问
1. redo log是什么? 为什么需要redo log? redo log 是什么呢? redo log 是重做日志。它记录了数据页上的改动。它指事务中修改了的数据,将会备份存储。发生数据库服务器宕机、或者脏页未写入磁盘,可以通过redo log恢复。它是Innodb存储引…...
2024/4/19 8:05:42 - 初来乍到,先分享一下使自己自律学习的方法
自我介绍 大家好,我是木鱼,一个刚上大学的小白 因为学的软件工程,自然就来到CSDN(床上等你)这个圈子了ᶘ ͡ᴥ͡ᶅ。 分享经历 高中没咋努力,考到了长理。。。的一个三本学院,学历这块可以慢慢…...
2024/4/15 5:33:17 - 使用Ansible部署K8S服务
软件环境: 操作系统:CentOS-7 HostNameIP配置K8S-master10.211.55.20CPU:2 Memory: 4GK8S-node0110.211.55.21CPU:2 Memory: 4GK8S-node0210.211.55.22CPU:2 Memory: 4G 软件版本: 软件名称版本kubeadmV1.21.1kubectlV1.21.1kubeletV1.21.1…...
2024/4/14 23:24:11 - Linux常见指令
文章目录ls 指令pwd命令whoami命令cd 指令clear指令touch指令mkdir指令rmdir指令 && rm 指令man指令cp指令mv指令cat指令tac指令more指令less指令head指令tail指令date指令cal指令find指令which指令alias指令grep指令zip/unzip指令tar指令file指令bc指令uname指令几个重…...
2024/4/14 23:24:11 - (测试计划,测试用例,缺陷报告,测试报告,接口测试用例)总结
测试计划 测试计划包含什么? 测试背景、测试范围、测试目的、人员安排、时间分配、测试环境、风险评估等 测试环境: 服务器IP CPU 内存 虚拟机IP CPU 内存 操作系统 游览器 风险评估: 测试计划不充分测试方法有误测试过程偏离&…...
2024/4/14 23:24:36 - Windows下Python-openCV学习(四)-------色彩空间与通道
本章简明 色彩空间:GRAY色彩空间:cv2.COLOR_BGR2GRAYHSV色彩空间: cv2.COLOR_BGR2HSV 、cv2.COLOR_HSV2BGR通道:拆分通道:split()方法合并通道:merge()方法综合运用拆分通道和合并通道alpha通道色彩空间转换方法 dst=cv2.cvtColor(src,code) 参数:src : 转换前的初始图…...
2024/4/16 0:26:52 - Mybatis学习笔记:CRUD
文章目录一、namespace二、select三、insert四、update五、提交事务六、Map的使用七、如何实现模糊查询?一、namespace 配置文件中namespace中的名称为对应Mapper接口或者Dao接口的完整包名,必须一致! 二、select 需求:根据id查询用户 在…...
2024/4/14 23:25:32 - 利用python将PDF转为Excel并去掉换行符
PDF转Excel 文章目录PDF转Excel前言一、PDF转Excel二、去掉Excel的换行符不完善的地方前言 突然来的任务,时间紧,PDF内容为表格,有水印 一、PDF转Excel 提示:我比较笨,所以分了两步完成,第一步转为Excel…...
2024/4/5 5:51:36 - JavaScript实现贪吃蛇小游戏
JavaScript实现贪吃蛇小游戏 功能概述 本程序实现了如下功能: 贪吃蛇的基本功能 统计得分 开始与暂停 选择难度等级 设置快捷键 5.1 通过ijkl,wsad也能实现方向的切换 5.2 通过“P” 表示暂停,“C”表示开始或继续,"R&…...
2024/4/14 23:24:26 - 【补题日记】2018 CCPC桂林站
Pro 2018 China Collegiate Programming Contest - Guilin Site Sol A. Array Merge 贪心,如果没有顺序的限制,数字大的越靠前越优,而现在有顺序,所以把前i个元素综合考虑。 设前i个元素的平均值为a,则当新的值A[…...
2024/4/19 14:43:06
最新文章
- Pytorch或Tensorflow 深度学习库安装 (简易版)
Tensorflow 2.X安装 0、 pytorch 支持 conda虚拟环境 cuda 和 cudnn1、创建conda环境2、测试GPU是否可用3、在机器上安装cuda 和 cudnnCUDA 安装cudnn 安装 0、 pytorch 支持 conda虚拟环境 cuda 和 cudnn 如果只用pytorch, 只需在虚拟环境安装cuda 和 cudnn即可&am…...
2024/4/28 12:48:28 - 梯度消失和梯度爆炸的一些处理方法
在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...
2024/3/20 10:50:27 - 图像处理相关知识 —— 椒盐噪声
椒盐噪声是一种常见的图像噪声类型,它会在图像中随机地添加黑色(椒)和白色(盐)的像素点,使图像的质量降低。这种噪声模拟了在图像传感器中可能遇到的问题,例如损坏的像素或传输过程中的干扰。 椒…...
2024/4/23 15:25:06 - AI小程序的创业方向:深度思考与逻辑引领
随着人工智能技术的快速发展,AI小程序逐渐成为创业的新热点。在这个充满机遇与挑战的时代,我们有必要深入探讨AI小程序的创业方向,以把握未来的发展趋势。 一、目标市场定位 首先,我们要明确目标市场。针对不同的用户需求&#x…...
2024/4/27 11:03:33 - 【外汇早评】美通胀数据走低,美元调整
原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...
2024/4/26 18:09:39 - 【原油贵金属周评】原油多头拥挤,价格调整
原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...
2024/4/28 3:28:32 - 【外汇周评】靓丽非农不及疲软通胀影响
原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...
2024/4/26 23:05:52 - 【原油贵金属早评】库存继续增加,油价收跌
原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...
2024/4/27 4:00:35 - 【外汇早评】日本央行会议纪要不改日元强势
原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...
2024/4/27 17:58:04 - 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响
原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...
2024/4/27 14:22:49 - 【外汇早评】美欲与伊朗重谈协议
原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...
2024/4/28 1:28:33 - 【原油贵金属早评】波动率飙升,市场情绪动荡
原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...
2024/4/27 9:01:45 - 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试
原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...
2024/4/27 17:59:30 - 【原油贵金属早评】市场情绪继续恶化,黄金上破
原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...
2024/4/25 18:39:16 - 【外汇早评】美伊僵持,风险情绪继续升温
原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...
2024/4/28 1:34:08 - 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势
原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...
2024/4/26 19:03:37 - 氧生福地 玩美北湖(上)——为时光守候两千年
原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...
2024/4/28 1:22:35 - 氧生福地 玩美北湖(中)——永春梯田里的美与鲜
原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...
2024/4/25 18:39:14 - 氧生福地 玩美北湖(下)——奔跑吧骚年!
原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...
2024/4/26 23:04:58 - 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!
原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...
2024/4/27 23:24:42 - 「发现」铁皮石斛仙草之神奇功效用于医用面膜
原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...
2024/4/28 5:48:52 - 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者
原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...
2024/4/26 19:46:12 - 广州械字号面膜生产厂家OEM/ODM4项须知!
原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...
2024/4/27 11:43:08 - 械字号医用眼膜缓解用眼过度到底有无作用?
原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...
2024/4/27 8:32:30 - 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...
解析如下:1、长按电脑电源键直至关机,然后再按一次电源健重启电脑,按F8健进入安全模式2、安全模式下进入Windows系统桌面后,按住“winR”打开运行窗口,输入“services.msc”打开服务设置3、在服务界面,选中…...
2022/11/19 21:17:18 - 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。
%读入6幅图像(每一幅图像的大小是564*564) f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...
2022/11/19 21:17:16 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...
win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面,在等待界面中我们需要等待操作结束才能关机,虽然这比较麻烦,但是对系统进行配置和升级…...
2022/11/19 21:17:15 - 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...
有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows,请勿关闭计算机”的提示,要过很久才能进入系统,有的用户甚至几个小时也无法进入,下面就教大家这个问题的解决方法。第一种方法:我们首先在左下角的“开始…...
2022/11/19 21:17:14 - win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...
置信有很多用户都跟小编一样遇到过这样的问题,电脑时发现开机屏幕显现“正在配置Windows Update,请勿关机”(如下图所示),而且还需求等大约5分钟才干进入系统。这是怎样回事呢?一切都是正常操作的,为什么开时机呈现“正…...
2022/11/19 21:17:13 - 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...
Win7系统开机启动时总是出现“配置Windows请勿关机”的提示,没过几秒后电脑自动重启,每次开机都这样无法进入系统,此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一:开机按下F8,在出现的Windows高级启动选…...
2022/11/19 21:17:12 - 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...
有不少windows10系统用户反映说碰到这样一个情况,就是电脑提示正在准备windows请勿关闭计算机,碰到这样的问题该怎么解决呢,现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法:1、2、依次…...
2022/11/19 21:17:11 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...
今天和大家分享一下win7系统重装了Win7旗舰版系统后,每次关机的时候桌面上都会显示一个“配置Windows Update的界面,提示请勿关闭计算机”,每次停留好几分钟才能正常关机,导致什么情况引起的呢?出现配置Windows Update…...
2022/11/19 21:17:10 - 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...
只能是等着,别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚,只能是考虑备份数据后重装系统了。解决来方案一:管理员运行cmd:net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...
2022/11/19 21:17:09 - 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?
原标题:电脑提示“配置Windows Update请勿关闭计算机”怎么办?win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢?一般的方…...
2022/11/19 21:17:08 - 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...
关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!关机提示 windows7 正在配…...
2022/11/19 21:17:05 - 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...
钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...
2022/11/19 21:17:05 - 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...
前几天班里有位学生电脑(windows 7系统)出问题了,具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面,长时间没反应,无法进入系统。这个问题原来帮其他同学也解决过,网上搜了不少资料&#x…...
2022/11/19 21:17:04 - 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...
本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法,并在最后教给你1种保护系统安全的好方法,一起来看看!电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中,添加了1个新功能在“磁…...
2022/11/19 21:17:03 - 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...
许多用户在长期不使用电脑的时候,开启电脑发现电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机。。.这要怎么办呢?下面小编就带着大家一起看看吧!如果能够正常进入系统,建议您暂时移…...
2022/11/19 21:17:02 - 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...
配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!配置windows update失败 还原更改 请勿关闭计算机&#x…...
2022/11/19 21:17:01 - 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...
不知道大家有没有遇到过这样的一个问题,就是我们的win7系统在关机的时候,总是喜欢显示“准备配置windows,请勿关机”这样的一个页面,没有什么大碍,但是如果一直等着的话就要两个小时甚至更久都关不了机,非常…...
2022/11/19 21:17:00 - 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...
当电脑出现正在准备配置windows请勿关闭计算机时,一般是您正对windows进行升级,但是这个要是长时间没有反应,我们不能再傻等下去了。可能是电脑出了别的问题了,来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...
2022/11/19 21:16:59 - 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...
我们使用电脑的过程中有时会遇到这种情况,当我们打开电脑之后,发现一直停留在一个界面:“配置Windows Update失败,还原更改请勿关闭计算机”,等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢࿰…...
2022/11/19 21:16:58 - 如何在iPhone上关闭“请勿打扰”
Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...
2022/11/19 21:16:57