没有合适的资源?快使用搜索试试~ 我知道了~
首页ESC32源码分析流程图解析
资源详情
资源推荐
![](https://csdnimg.cn/release/download_crawler_static/12587238/bg1.jpg)
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
请不要以任何方式拿此文档赚取积分商用等,仅供学习,后果自负
![](https://csdnimg.cn/release/download_crawler_static/12587238/bg2.jpg)
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
请不要以任何方式拿此文档赚取积分商用等,仅供学习,后果自负
![](https://csdnimg.cn/release/download_crawler_static/12587238/bg3.jpg)
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页未读,继续阅读
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://profile-avatar.csdnimg.cn/97071d134a7e4ba78de609ca98390cf9_u013636775.jpg!1)
逗倪豌儿
- 粉丝: 115
- 资源: 18
上传资源 快速赚钱
我的内容管理 收起
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![](https://csdnimg.cn/release/wenkucmsfe/public/img/voice.245cc511.png)
会员权益专享
最新资源
- 基于单片机的瓦斯监控系统硬件设计.doc
- 基于单片机的流量检测系统的设计_机电一体化毕业设计.doc
- 基于单片机的继电器设计.doc
- 基于单片机的湿度计设计.doc
- 基于单片机的流量控制系统设计.doc
- 基于单片机的火灾自动报警系统毕业设计.docx
- 基于单片机的铁路道口报警系统设计毕业设计.doc
- 基于单片机的铁路道口报警研究与设计.doc
- 基于单片机的流水灯设计.doc
- 基于单片机的时钟系统设计.doc
- 基于单片机的录音器的设计.doc
- 基于单片机的万能铣床设计设计.doc
- 基于单片机的简易安防声光报警器设计.doc
- 基于单片机的脉搏测量器设计.doc
- 基于单片机的家用防盗报警系统设计.doc
- 基于单片机的简易电子钟设计.doc
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035111.png)
安全验证
文档复制为VIP权益,开通VIP直接复制
![](https://csdnimg.cn/release/wenkucmsfe/public/img/green-success.6a4acb44.png)