在电驱动器中调试微控制器软件的方法
如何调试微控制器程序?使用JTAG,示波器是几天/几周,并且已调试程序。这将是一个典型的答案,并且在大多数情况下将是正确的……但并非总是如此。微控制器解决了非常不同的问题,在本文中,我们将考虑如果您需要开发繁琐的低级软件来控制任何电力电气设备,例如电动机的变频器,火车的DC / DC电池电荷转换器,电源校正器,伺服器以及等设备以千安培流量和PWM千伏为单位,对IGBT逆变器按键的每次开关进行计数,微控制器对异常情况的响应时间以微秒为单位进行测量,并且密封外壳中的设备本身已在雅库特工厂安装并运行。如果您想知道这对调试方法具有什么功能,欢迎使用cat。调试控制系统的功能
调试执行此类任务的微控制器(MK)的功能是什么?首先,当MK与动力设备一起使用时,它不能停止。MK在PWM的帮助下控制电源键,调节其通道中的许多值-电机相电流,直流母线电压,速度,工作体位置等。如果您在断点处工作时停止MK,则在最佳情况下,设备将由于硬件保护而关闭,而在最坏的情况下,一切都将爆炸(如果电源开关保持在“一个”位置或一个工作周期打开)。因此,经典的调试方法是在此类任务中“逐步完成调试器的步骤”。因此,您只能在完全包含原始软件模块的表上运行,然后才能将其首次包含在实际设备中。
其次,这就是底层软件的复杂性。 .text程序代码段的大小对于专门控制硬件(没有高级通信驱动程序等)的程序代码为50-200 KB,这是某些工业伺服驱动器的微控制器的典型情况。因此,电机控制系列的微控制器用于此类任务,这些任务同时结合了非常发达的外围设备,高性能和相对较大的内存(对于MK)。作为来自进口MK的示例,可以引用得自NIIET OJSC的国产K1921VK01T芯片的Texas Instruments C2000系列的32位MK Instruments。这种MK的软件通常包含成千上万的行完美的优化C / C ++代码,根本无法通过“闪烁LED”,“ UART中的printfom”或观察外部示波器的支路进行调试。
第三,电驱动控制系统的控制器通常位于功率转换器内部,功率转换器的壳体是封闭的,有时甚至是密封的。因此,如果仅针对固件(关闭电源),通过JTAG访问已经是一个大问题。还有一个更严重的问题是开机时进行JTAG调试。在这里,必须使用必要的电隔离和防噪JTAG(我们将MK TI JTAG SAURIS用于内置电隔离-价格昂贵,但可以使用)。
第四,没有操作系统!我们可以预见有人会怎么想的:“好吧,因为您有如此艰巨的任务,将普通的微控制器安装在Linux上并为其编写常规应用程序,然后从闪存驱动器中更新软件”。电力设备控制系统是非常困难的实时系统。不是说Linux,甚至不是所有专门的实时操作系统都适合于此类任务。例如,通过读取和平均模拟数据来中断ADC可能会导致频率高达100 kHz。同时,它将仅包含十二行或两行代码-模拟通道的数据收集,高速保护的几次检查和退出-一切,无所事事。如果您指示此类中断给某些OS任务计划程序,则仅其自身的执行将占用更多资源。更不用说,对于Linux,您需要在板上再放两个,而不是一个MK芯片-外部RAM和闪存,在它们上分配一堆珍贵的晶体脚,使用六层板进行正确的布线,获得巨大的MK引导时间(有时会出现电源故障或看门狗计时器)在引擎停止之前开始工作!),文件系统完整性问题等等。好吧,第五个特征-电力驱动器和其他电力设备的低级控制系统(与不同接口上的通信任务,PLC,各种警报器的控制器,遥控器等相反)主要实现自动控制系统算法。即:软件半部由各种封闭结构组成,这些结构具有PID控制器,饱和块,死区,彼此依赖的表,过滤器,观察器,强度调节器,运动计划器等。这种软件中的计算以一定的频率执行-例如,在10 kHz的频率下,将触发中断并计算所有列出的模块,这些模块共同构成必要的设备控制结构。在这种算法中,分步调试无济于事-通常,每个步骤的每个模块都会输出对他的期望-实际上,所有这些滤波器,调节器等都已经调试了很多年,并且几乎没有什么惊喜。在整个结构的整体操作过程中会出现问题-每个单元都单独工作,并且期望的调节过程不会如预期的那样发生。问题出在这些块的数百个参数和系数的调整以及由它们组装而成的结构中-可能结果是您需要在某处添加新的稳定电路,添加预测块,约束等。因此,这是逐步调试和printf调试消息的另一个“花园中的石头”:您不仅需要调试程序代码本身,还需要调试更多的调试自动结构,而不仅仅是调试代码本身。如果有人不知道它是什么(结构),那么这是同步电动机的无传感器矢量控制的最简单结构:每个方框有时是一些公式,有时是一打十二或两页代码的模块。该模块具有输入/输出以及一些状态变量(例如,PI控制器的组成部分,依此类推)。那些希望的人也可以在Wikipedia页面上看到类似的结构。由于控制系统是关闭的,一个单元的错误操作(或其设置不正确)会导致整个结构无法使用。并确切地找到问题所在-那是另一项任务。如何调试呢?
那么该怎么做,如何调试呢?外接示波器?不会帮助。当然,示波器对于调试一些纯粹的硬件问题是必需的,但是它们只能看到微控制器的输入和输出值,并且结构中的数百个变量将保留在幕后。好吧,您会看到电动机的相电流奇怪地跳动,而逆变器输出电压奇怪地跳动。以及为什么-MK软件内部的哪个块导致此问题(或电动机或位置传感器或其他原因导致该曲线)-尚不清楚。
型号?是的,这是一个很好的帮助。通常,复杂管理结构的开发始于建模。就TAU而言,并以微分方程的形式描述了控制对象,构造了所提出的控制系统(例如上图所示),然后实现了所有这些...好吧,谁喜欢什么,但事实上标准是Simulink Matlab。在其中,您可以使用积分器,加法器,转换函数等形式的“松散”来“绘制”结构和控制对象的模型。您可以使用其软件包对电路进行建模,其中有现成的IGBT键,电动机,电阻器,电容器等,由matlab程序员摆布以微分方程形式绘制的方程式的实现,并以``松散''形式绘制控制结构本身。您可以在C中的matlab中编写所有必要的块。这种方法很方便,因为可以将Matlab中的调试程序代码简单地复制到微控制器中。通常,这个阶段总是遵循“绘图”的阶段,这是在建模的近似研究工作之后形成控制系统的结构时。但是,对象的参数通常是先验未知的,或者非常不准确地知道-在模型中运行的软件也从未在对象上良好运行过。也不可能在模型中包含“所有内容”-瞬态开关晶体管,磁路饱和,涡流,电容耦合,温度和实例之间的浮动参数,处处干扰……有时控制对象是如此复杂,直接在工厂进行控制结构的开发比较容易。, , () - . , , «» – , , - ? ( – , « », ).
还有许多产品可让您直接为微控制器“绘制”程序。包括同一个Matlab在内,它可以基于Simulink中的模型为MK著名品牌生成C代码。据称,您可以在模型中的计算机上绘制和调试控制系统的绘制结构,然后将其上载到MK-完成后,开始吧!甚至在这样的环境下,您也可以在MK内调试绘制的控制结构,监视变量等,并且在此类产品的站点上有许多针对最复杂系统的演示项目,这些演示项目都通过这种方式进行了“编程”。但是由于所有实际项目由于某种原因仍在用“手”进行编程,因此我们可以猜测“绘图”有问题。但是,在这里甚至很难描述到底是什么,仅此而已。主要反对– 。您可以在这样的“做得好”的环境中按一个按钮,并希望代码生成器为您完成其余的工作。对于某些简单的系统,MK的性能“居于众目,之下”,其开发时间表非常紧迫,而且没人知道如何在启动该项目的公司进行编程……那么,您可能可以尝试“绘制”该程序。但是,如果它无法正常运行,或者出现一些非常具体的故障,那么将不再有任何机会对其进行调试。对于一个复杂的任务,即使使用MK进行手动编程始终是一个问题,但由于资源不足,绘图也不适合使用-任何比其高级(比绘图更高)的编程语言都会生成较少的最佳机器代码。还有C程序员会做的低级优化这样的系统将无法执行(使用不同的时钟来计算相同结构的块,使用正弦和余弦的缓存值,通过乘以预先准备的值来替换除法函数或绝对棘手的事情,例如这样等)。因此,您必须编写软件并使用C编写。一种或另一种方式,您需要调试软件,这对对象是必需的。可能到此为止,本文的每个人都已经了解到,只有通过查看内部变量的波形图(即查看随时间变化的图形,C中的该变量或变量的变化方式-例如,“该块的输出,从左数第五个,同时从右数第三个输入”。获取这样的图片:而且这只能通过微控制器本身来完成。您不能只是采用并放置外部快速通信接口,并尽快“向上”发送某些变量的值,并在顶层系统中构建图形。因为没有通信接口,所以MK将没有时间用调节的瞬变发生的频率来执行此操作。如果成功,则所有MK资源都将用于维护此通信接口。因此,他们这样做- 将波形记录在MK的RAM中只是一个数组。通常,没有很多要点-恰好在恰好写入数据的正确时机:在录制开始时放置正确的触发器。然后,您可以查看在故障发生时控制系统的这些块或这些块所发出的信息,它的发展状况,MK试图做什么。当然,所有变量都不能立即振荡-但是在实践中,根据我们的经验,有足够的数据,例如每个有256个点的四个阵列-一种使用MK工具的四通道示波器。如果设备每周发生超过一次的故障,那么调试就不是问题-在一个实验中,我们查看这四个变量,在下一个实验中,我们将其替换为另一个变量,然后再次查看...,直到找到一个有故障的单元,或者直到我们清除发生的所有故障为止所有的障碍物,不要离开看“脚步”,划伤认为什么的地方...
如何拍摄这样的波形图?哪些软件可以做到这一点?这个转发什么通信接口?实际上,德州仪器(Texas Instruments)因此是电机控制微控制器生产的领导者,因为它为此做了一切:Code Composer Studio(其开发环境)以及实时MK。实时模式是指开发环境通过JTAG可以在不停止的情况下在MK的RAM存储器中请求和写入数据。甚至不仅没有停止,而且丝毫没有中断他的工作。此模式在所有C2000系列MK中都可用,但是需要昂贵且快速的JTAG才能使用它,并为此提供支持。但是,除了模式本身之外,MK的电缆背面还应具有一些对应的东西:Code Composer Studio开发环境能够开箱即用地构建波形。此外,在最简单的模式下,当用户设置C变量的名称并在图形上看到其时间变化时,环境都会以其可以使用的频率(通常是很好的,如果Hertz为10)请求数据,并以在内存中显示数组的模式波形-即就是上面所描述的。 , , , Code Composer Studio JTAG .同时,设备可以继续工作,好像什么都没发生。该工具已经成功使用了十多年,实际上,这种调试思想(看来,但我可能错了)是德克萨斯提出的。在他们所有的演示项目中,都有一个数据记录器模块(用于记录波形阵列),并且手册描述了如何使用它。顺便说一句,在这里您需要在ARM花园中扔石头。它们还具有实时模式,在此体系结构上,有可以控制电动机的MK。但是,在没有开发环境的情况下,即使支持实时模式,我也没有遇到过图形功能。例如,在每个人都钟爱的Keil中,通常无法在正在运行的MK上更改变量的值-它会不断更新,并删除了用户在窗口中输入的新值。更不用说那里的任何图形了。也许有人在评论中会建议一个可行的选择?还是“没人需要”,因此行不通?但是,即使通过Code Composer Studio,这种调试方法也存在问题。而这个问题就是JTAG。如前所述,它的连接器并非总是可用,大多数情况下在运行中的设备上都不可用。坦率地说,离兆瓦转换器几米远,看着它的工作波形,并集中注意力用鼠标绕着微控制器的“停止”按钮,并不是很舒服。您知道使用功能强大的PWM时触摸板有问题吗?如果环境失败了?那JTAG呢?一切,广泛吗?此外,在开发环境中的波形以C的“原样”值显示,没有任何缩放比例,在图表的不同窗口中,没有定制的测量单位(请记住,在该图表中0.342是伏特,必须在头脑中乘以它们乘以540以获得物理单位,此处1.2是800A的安培数)。又不舒服又吓人。但是,并非所有的MK和开发环境都可以观看波形图!突然你不是德克萨斯州吗?因此,我们决定发明另一种方法。我们的决定
其实,如果我们不需要逐步调试,那是什么问题呢?我们将通过JTAG进行的所有操作替换为任何其他通信接口,并创建自己的顶级外壳程序,该外壳程序以所需的方式构建图形。赢利!我们做到了。我们选择的通讯接口为CAN,协议-CANopen。为什么呢CAN是一个非常好的工业通信接口,具有抗噪性,具有硬件仲裁,对总线的无损访问,对软件包的硬件确认,并且同时只有两条线和地线。这比所有RS都要好,并且比以太网要少(在电机控制MK上很奇怪)。为什么可以打开?实际上,CAN有两种通用协议,分别是J1939(“汽车”)和CANopen(机床,自动化,传感器等)。它们之间没有太大区别,但是CANopen在我们看来更加灵活,因此我们在自己的堆栈(驱动程序)中实现了它。谁对CANopen一无所知-像许多MK协议一样,它的主要功能是提供对特定地址处的对象字典(C MK中的变量列表)的访问。可以通过两种主要方式完成此操作:请求-响应类型的SDO消息,以及按计时器或事件(设置发送内容和发送时间的上限)的PDO消息,其形式为恒定发送值。还有各种服务服务,例如紧急消息,有关网络上设备存在的消息(心跳)等。不需要网络上的向导:谁想要-向谁发送,谁想要-向谁接受。
我们不仅为MK制造了CANopen堆栈,还以库的形式为计算机制造了CANopen堆栈。 Windows已经在此基础上编写了自己的顶级环境。首先,他们只是访问对象字典的变量,以便可以查看和更改控制系统的设置(顺便说一下,其中有数百个!),然后他们通过在网络上定期查询对象字典参数来制作图形,然后添加来自MK阵列的波形负载(此外,还可以从字典的可变对象中选择示波器的内容)。我们获得了通过JTAG进行调试的所有功能。还是不行否,因为我还需要通过CAN更新软件的功能。尽管得克萨斯MK中存在CAN引导加载程序,但我们还是决定自行制造,因为标准驱动器不是CANopen,并且在缝制一个时可能会干扰网络上其他设备的运行,并且这些设备也可能会干扰固件。此外,还存在纠错和消息丢失的问题(尽管CAN很好,有时会崩溃,并且固件是非常重要的事情,以便不进行验证或重试发送损坏的文件)。因此,我们在CAN网络上但在CANOpen协议的框架内实现了“编程器”。现在就这些了。现在,我们可以完全放弃JTAG,仅使用一次就可以编写新的MK。同时,这种方法开辟了我们从未见过的新调试视野。由于我们不仅着眼于程序员,而且着眼于“普通人”,因此都选择了顶层环境,因此我们将所有参数设为俄语语言名称,并为每个参数制作了用于安装程序的文档(文档不是环境,而是设备)。这是有益的- 现在,如果驱动器有任何问题,您不必“拉”开发人员-在某些情况下,客户服务人员可以独立诊断问题。现在,我们可以收到一封电子邮件,例如“我们的驱动器有时开始发出奇怪的声音,我看着位置传感器的波形图,这就是我所看到的(图片)。我检查了屏幕接地,它掉下来了,我焊接了,一切都正常了!”而且绝对不需要去任何地方或飞!第二个“发现”-如果有问题,我们要求客户将计算机连接到设备,并通过Internet进行远程桌面控制-我们启动顶层环境,我们自己进行振荡,纠正参数/固件/我们说它坏了-赢利!同样,您也不必走到任何地方(主要是互联网至少应通过蜂窝网络提供)。多年以来,这个顶级程序已经获得了一些小的功能,例如蘑菇(蘑菇使用的自然过程)。这包括使用设备崩溃日志,将所有参数的块保存/加载到计算机上的文件,将设备的控制面板配置为“控制面板”,将网络日志维护到文件,以及通过TCP / IP返回CAN网络流量,并自动对网络上的类似设备进行多重固件/参数化(如果有数十个设备,那么用手刷新所有内容就很懒,需要脚本),等等。
好吧,现在有一些广告。现在,它已经是一个非常强大的工具(我们称其为UniCON),在某些任务上,其功能似乎比知名品牌的类似软件在安装驱动器和设备时更具功能。而且,它并不局限于特定的设备-您可以配置至少一个电驱动器,至少一个炉子,至少一个充电器-仅对象字典会更改。现在在我们公司中,如果没有我们的CANopen调试工具,我们将看不到成功完成新的复杂项目的机会。要使用UniCON,您只需将我们的CANopen堆栈嵌入MK中,之后MK便变成了数字实验室。我们确信所有在MK上构成严格控制系统的公司都具有类似的调试工具。但是,我们以独立软件产品的形式提供我们的CANopen解决方案,因为它在独立于设备功能的方面得到了普遍实施。目前,我们已经为Texas Instruments C2000 MK,其ARM微控制器(例如,Concerto系列)和NIIET OJSC 的K1921VK01T实现了具有上述高级功能的CANopen堆栈。因此,如果您需要开发用于电驱动器或其他复杂控制对象的控制系统,我们邀请您进行合作。
PS在评论中,我们期待批评“这样-***一样而且免费”的形式。由于我们长期以来一直在寻找功能与ARM类似的调试工具,因此我们甚至偶然发现了著名的开发环境。UPD:感谢Indemsys, olekl和 LeonidLenin的评论 通过SWD工作时,我们在ARM Keil和STMStudio的开发环境中发现了图表功能。但是,他们不知道如何以图形形式显示MK存储器中的数据数组,这正是观察控制系统快速移动过程所需要的(但是STMStudio可以使用数据缓存显示图形,采样时间约为1ms)。恩智浦FreeMaster工具也很有趣-在描述和用途上,它与我们的UniCON开发非常相似,但是具有自己的特点。此外,Segger J-Link拥有自己的波形显示工具。Source: https://habr.com/ru/post/zh-CN389123/
All Articles