这是第九篇,前面的文章把各个模块的实现都介绍了一轮,本章是从运行的角度结合波形图,把整个流程走一遍。
先看下一运行的配置,我把一些配置关闭了,这样跑起来会好分析一些,不同配置跑起来效果会有差异。使用的ServoPwm信号。
1、运行配置
2、ESC上电启动停止全过程
ESC上焊了很多飞线,用GPIO指示运行的状态
void MX_GPIO_Init(void)
{
gpio_mode_QUICK(GPIOA, GPIO_MODE_OUTPUT, GPIO_PULL_NONE, GPIO_PINS_12);
gpio_mode_QUICK(GPIOA, GPIO_MODE_OUTPUT, GPIO_PULL_NONE, GPIO_PINS_15);
gpio_mode_QUICK(GPIOB, GPIO_MODE_OUTPUT, GPIO_PULL_NONE, GPIO_PINS_2);
gpio_mode_QUICK(GPIOB, GPIO_MODE_OUTPUT, GPIO_PULL_NONE, GPIO_PINS_3);
gpio_mode_QUICK(GPIOB, GPIO_MODE_OUTPUT, GPIO_PULL_NONE, GPIO_PINS_4);
gpio_mode_QUICK(GPIOB, GPIO_MODE_OUTPUT, GPIO_PULL_NONE, GPIO_PINS_5);
gpio_mode_QUICK(GPIOB, GPIO_MODE_OUTPUT, GPIO_PULL_NONE, GPIO_PINS_7);
gpio_mode_QUICK(GPIOB, GPIO_MODE_OUTPUT, GPIO_PULL_NONE, GPIO_PINS_8);
//PA11作为比较器输出
gpio_init_type gpio_init_struct;
crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
gpio_init_struct.gpio_pins = GPIO_PINS_11;
gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
gpio_init(GPIOA, &gpio_init_struct);
gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE11, GPIO_MUX_7);
}
3、ESC上电油门信号检测
先来一个部分发大图
(1)MCU启动
(2)发启动音
然后开启接收油门信号
(3)油门在位检测
detectInput->checkServo
transfercomplete -> inputSet == 1 -> !armed
这个时候油门信号是1001us,是小于启动点的
(4)油门信号置低解锁
油门置低1秒解锁
(5)解锁后发音
发两种频率的声音
4、启动
(1)油门大于启动点
(2)old_routine=1阶段
每隔50us执行tenKhzRoutine->getBemfState读取反电动势
(3)找到过零点则换相
(4)转速达到预期,切无感驱动
5、无感驱动
(1)interruptRoutine
(2)检测到过零点
这里会设置换相等待时间waitTime,然后使能定时器
(3)PeriodElapsedCallback定时器回调
换相,计算换相等待时间,使能比较器中断
(4)下一次interruptRoutine
6、油门减小转速低了
old_routine = 1;//油门低于这个转速,使用同步驱动的方式
7、转速低了油门小于启动点停转