没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
runWatchDog()
t = timerMicros; 当前时间戳
d = detectedCrossing; 过零时间戳
p = pwmValidMicros; 油门输入时间戳
否
是
state ==
ESC_STATE_STARTING
&& fetGoodDetects >
fetStartDetects
是
state >=
ESC_STATE_STOP
PED
否
异常状态,每隔100检测下,
state==ESC_STATE_DISARMED
&& !(runMilis % 100)
是启动状态.切换到 运行状态
state =ESC_STATE_RUNNING;
digitalHi(statusLed); // turn off
得到时间差d = (t >= d) ? (t - d) : (TIMER_MASK - d + t);
油门输入模式是PWM模式
inputMode == ESC_INPUT_PWM
得到没有油门输入的时间间隔p
p = (t >= p) ? (t - p) : (TIMER_MASK - p + t)
是
丢失油门信号
p > PWM_TIMEOUT
runDisarm(REASON_PWM_TIMEOUT);
//pwm输入超时
是
State>=ESC_STATE_STARTING&&
d>ADC_CROSSING_TIMEOUT
否
adcAmpsOffset = adcAvgAmps;得到偏执电流
digitalTogg(errorLed);
是
否
占空比大于0
fetDutyCycle > 0
是
runDisarm(REASON_CROSSING_TIME
OUT); 过零超时
是
runArm();//手动运行起来
pwmIsrRunOn();//PWM开启输入比较
否
State>=ESC_STATE_STARTING &&
fetBadDetects>fetDisarmDetects)
否
是
占空比大于0
fetDutyCycle > 0
runDisarm(REASON_BAD_DETECTS);
//错误停止
是
否
否
停止状态
state == ESC_STATE_STOPPED
adcAmpsOffset =
adcAvgAmps; 得到
零偏
是
否
结束
Start阶段且好的过零检测大于
启动检测值才切换到run阶段
自动换向 Start run
得到当前离上次过零时间间隔
即 离过零过了d时间
Start 或者 run状态且 过零时间超过了
ADC_CROSSING_TIMEOUT
Start 或者 run状态且 坏的检测超了
电子频率 f = 1/(6 * t ) 其中:t过零时间单位s f单位hz
电子转速 v = f * 60 其中:v单位 erpm
机械转速 w = v / 极对数 其中 w 单位是rpm
否
ESC_STATE_DISARMED = 0, //非正常停止状态
ESC_STATE_STOPPED, //停止状态
ESC_STATE_NOCOMM, //强拖状态
ESC_STATE_STARTING, //启动状态
ESC_STATE_RUNNING //运行状态
到这肯定是
ESC_STATE_DISARMED 状态
BLHeli_S 开源电调 群号:189030589
请不要以任何方式拿此文档赚取积分商用等,仅供学习,后果自负
runRpm()
正常运行状态
state >
ESC_STATE_STARTING
否
Rpm = 0.0f;
rpm = p[RPM_MEAS_LP] * rpm + ((32768.0f * runRPMFactor) / (float)adcCrossingPeriod) *(1.0f - p[RPM_MEAS_LP]);
是
是速度闭环
runMode ==
CLOSED_LOOP_RPM
是
fetSetDutyCycle(runRpmPID(rpm, targetRpm));
是推力模式
runMode ==
CLOSED_LOOP_THRUS
T
否
是
fetSetDutyCycle(runRpmPID(rpm, targetRpm));
否
Return 0; Return 1;
PRM = a*上次的rpm + (1-a)*本次的rpm 加了个滤波算法
这里的a = p[RPM_MEAS_LP ]
速度PID
int32_t runRpmPID(float rpm, float target)
ff = ( target^2 * p[FF1] +target *p[FF2] )/ avgVolts * fetPeriod
error = target – rpm 计算偏差
限制error在 1000内
如果error 大于0的时候
rpmP = error * p[PTERM]; 计算加速PID的P相
rpmI += error * p[ITERM]; 计算加速PID的I相
否则如果error 小于0的时候
rpmP = error * p[PTERM] * p[PNFAC]; 计算减速PID的P相
rpmI += error * p[ITERM] * p[INFAC]; 计算减速PID的I相
以下如果制动模式开启的时候才执行:
如果速度小于 300 执行 fetSetBraking(0);
否则如果Error <= -100.0f 执行 fetSetBraking(1)
否则如果 fetBraking && error > -25.0f 执行 fetSetBraking(0);
计算最后的输出
output = ff + (rpmP + rpmI) * (1.0f / 1500.0f) * fetPeriod;
if (output >= fetPeriod) 如果最大输出了 就不允许积分还在累积
rpmI = iTerm;
Return output;
fetSetDutyCycle(int32_t requestedDutyCycle)
限幅requestedDutyCycle在0到fetPeriod之间
fetDutyCycle = requestedDutyCycle;
BLHeli_S 开源电调 群号:189030589
请不要以任何方式拿此文档赚取积分商用等,仅供学习,后果自负
runThrotLim(fetDutyCycle)
p[MAX_CURRENT] > 0.0f
否
fetActualDutyCycle = duty;
_fetSetDutyCycle(fetActualDutyCycle);
p[CL1TERM] != 0.0f
是
maxVolts=p[CL1TERM]+p[CL2TERM]*rpm+p[CL3TERM]*p[MAX_CURREN
T] + p[CL4TERM]*rpm*maxCurrentSQRT+p[CL5TERM]*maxCurrentSQRT;
maxDuty = maxVolts * (fetPeriod / avgVolts);
是
fetActualDutyCycle限幅
fetActualDutyCycle += fetPeriod * (RUN_MAX_DUTY_INCREASE * 0.01f);
限制fetActualDutyCycle 在duty以内
fetActualDutyCycle = runCurrentPID(fetActualDutyCycle);
否
如果电流限制校准过,使用以下公式对占空比进行限制,效果比较好
最大电压maxVolts = p1 + p2*rpm + p3*最大电流 + p4*rpm*maxCurrentSQRT + p5*maxCurrentSQRT
最大占空比maxDuty = maxVolts * PWM周期 /avgvolts
如果电流限制没有校准过,用pid对占空比进行限制,效果有点差
如果是异常停止状态,tmp=0,否则tmp= fetActualDutyCycle
设置上桥PWM
FET_H_TIMER->FET_A_H_CHANNEL = tmp;
FET_H_TIMER->FET_B_H_CHANNEL = tmp;
FET_H_TIMER->FET_C_H_CHANNEL = tmp;
如果开启制动模式
Tmp = fetActualDutyCycle+fetPeriod / 8
设置下桥的PWM
FET_MASTER_TIMER->FET_A_L_CHANNEL = tmp;
FET_MASTER_TIMER->FET_B_L_CHANNEL = tmp;
FET_MASTER_TIMER->FET_C_L_CHANNEL = tmp;
电流环 PID
static int32_t runCurrentPID(int32_t duty)
计算电流偏差
error = avgAmps - p[MAX_CURRENT];
currentIState += error; 且限幅currentIState必须>=0
计算电流环PI
iTerm = currentIState * RUN_CURRENT_ITERM;
pTerm = error * RUN_CURRENT_PTERM;
且限幅pTerm 必须>=0
计算占空比 duty = duty - iTerm - pTerm;
限幅duty >=0
Return duty;
maxDuty
速度环的输出
实际占空比
fetActualDutyCycle
maxDuty
duty
fetActualDutyCycle
fetActualDutyCycle
duty
duty 是速度环的输出
其中 斜坡1公式如下:
fetActualDutyCycle += fetPeriod * (RUN_MAX_DUTY_INCREASE * 0.01f);
然后把 fetActualDutyCycle 传入到电流环PID中,经过计算,得到最后的
fetActualDutyCycle
BLHeli_S 开源电调 群号:189030589
请不要以任何方式拿此文档赚取积分商用等,仅供学习,后果自负
剩余10页未读,继续阅读
资源评论
- 贼仙呐2023-07-28这份文件对ESC32源码的分析提供了很好的指导,让人能够更加清晰地了解其工作流程。
- 杜拉拉到杜拉拉2023-07-28作者在解析流程图时,用简洁明了的语言,让读者可以轻松理解每个步骤的含义。
- 萱呀2023-07-28通过这份文件的学习,读者能够对ESC32源码有一个全面的了解,是值得推荐的学习资料。
- lirumei2023-07-28文档不仅覆盖了基础知识,还深入探讨了一些高级概念,适合不同层次的读者。
- 山林公子2023-07-28文件中的实例和案例非常实用,能够帮助读者更好地掌握ESC32源码的原理。
逗倪豌儿
- 粉丝: 111
- 资源: 18
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功