本帖最后由 木木guainv 于 2021-12-27 11:22 编辑
五、程序工作流程
为了更清楚的表达起工作流程,整个项目的软件流程绘制了几张流程图,同时也加以文字说明。
1、主函数工作流程
▲ 图2.5.1 主函数工作流程
主函数主要的作用是初始化各种外设以及一些软件资源,然后在主循环中持续的发送电机信息到虚拟示波器,便于观察电机运行情况。
2、ADC中断工作流程
▲ 图2.5.2 ADC中断流程图
ADC中断是无刷电机的核心中断,ADC触发采集是由定时器1的通道4占空比更新事件进行触发的,因此ADC中断频率与TIMER1输出的PWM频率是一致的。PWM频率是40KHz,因此ADC的中断频率也是40KHz。
在中断内主要是获取母线电流、相电流、电源电压。母线电流在之后做电流环的时候需要使用到,也可以用于做故障检测,当检测到电流过大的时候,及时关闭输出以保护硬件,相电流可以用于之后做FOC驱动方案的时候提供支持。
扫描霍尔这个流程块中,主要是统计每次换相的时间,如果换相时间过长则认为出现故障此时应该及时关闭输出。当电机正常运行的时候将每次换相的时间都保存在数组内,当得到最近6次的换相时间之后,我们就能知道电机转动一圈所花费的时间,从而就能够计算出电机的转速了。在每次换相的时候速度输出引脚进行电平翻转,这样外部控制器也能轻松的检测到电机的转速,而无需外加编码器。然后根据读取到的霍尔值计算出下次期望的霍尔值。
霍尔扫描结束之后,开始检查延时换相时间是否到,时间没有到则延时时间减一,延时时间为0的时候开始进行换相动作,这里延时换相的原因是因为在电机高速运转的时候霍尔有滞后导致的,可能有人问为什么霍尔滞后了,你还要延时换相呢,因为我们采用的方法是,当霍尔出现滞后之后,我们换相的时候并不是换到下一相,而是换到了下下相,这样就相当于超前换相了,所以我们需要加一定的延时去匹配,从而得到一个最佳的换相点。
3、定时器3中断工作流程
▲ 图2.5.3 定时器3中断工作流程 定时器3中断频率为1KHz,主要用于根据DIR引脚设置电机是正转还是反转,然后计算速度曲线,用于实现电机缓慢加速(此功能可关闭),缓慢加速降低电机加速时功率,在调试阶段可以尽量保护车模以及硬件电路。然后进行PI闭环调节,这里主要实现是将我们采集到的电机速度与设置的电机速度求差,将得到的偏差×系数KP得到比例输出Pout,然后对偏差×系数KI并将每次计算出的结果进行求和得到Iout,最终将Pout与Iout相加,然后将相加之后的和输出到占空比寄存器驱动电机运转。其中KP、KI系数可能需要自己在多多调试,以找到更加完美的参数,使得电机运行更加迅速且稳定。 4、定时器16中断工作流程 定时器16中断主要作用是用来接收外部PWM信号的周期与高电平时间,然后计算信号的占空比,根据占空比的大小设置电机的转速,从而实现外部控制器来控制电机的转速。
▲ 图2.5.4 定时器16中断工作流程
5、定时器1工作流程
▲ 图2.5.5 定时器1中断工作流程 定时器1的中断,主要用于判断当前是否出现了刹车信号,通过查看原理图我们可以知道,母线电流经过运放放大之后,连接到比较器,比较器的输出直接连接到了内部引脚,我们在比较器的初始化中能够看到,比较器最终的输出是连接到了定时器1的break信号上,当电流超过我们设置的阈值之后,比较器会输出有效信号,定时器收到了break信号之后就会及时关闭输出,当信号消失之后定时器会从新输出控制信号驱动电机运转。从而实现了自动堵转保护功能。我们在中断内点亮了一个LED,在使用的工程中如果这个LED点亮了则说明系统的电流已经超过了设置的阈值。
逐飞会对本开源项目进行持续更新和维护,预计功能上还会继续添加串级闭环的功能、刹车力度可调节,速度环作为外环,电流环作为内环,这样可以不需要曲线计算即可实现电机缓慢加速的功能,通过内部电流环限定电流大小也能更好的保护硬件电路。之后也会尝试使用FOC方案驱动电机。当然,对这些功能有兴趣的同学可以自己提前研究尝试一下,听灵动的电机专家说,这些东西完全搞明白之后,都足够找一份相对不错的工作了。
|