• 1
    回复
  • 收藏
  • 点赞
  • 分享
  • 发新帖

【你买套件我买单】stm32有刷直流电机PID开发板

1.开箱清点搭建环境

开箱时间到啦!我收到了一个神秘的快递,打开一看,哇塞!这是一个装有电机、STM32最小系统和TB6612驱动芯片的学习套件!首先,我们来看看这个电机。它是中小功率的伺服电机或马达,可以用来做很多好玩的东西!然后,我们来认识一下STM32最小系统。它是一块功能强大、性价比高的微处理器开发板,可以帮助我们实现很多有趣的项目!接着,我们看看这个TB6612驱动芯片。它可以帮助我们控制电机的转速和方向,让我们的学习变得更有趣!最后,我告诉你一个小秘密,这个学习套件可以帮助我们构建一个PID控制电机转速的实验,让我们更深入地了解电机和控制系统!所以,现在,你已经知道了这个学习套件都有什么内容,接下来就是动手的时候啦!

哦哦哦,这个小家伙还配备了一个OLED液晶屏啊,分辨率128*64,使用iic接口的,快来修改一下你的项目,把这个香香脆脆的小屏幕加上吧!

2.直流电机速度控制原理

2.1电机等效电路测量

当我们获得一款电机时,通常可以采用等效模型来测量它的性能。对于直流电机而言,其可以被等效为串联电枢电阻Ra、电枢电感La和感应电动势电压源Ea,如下图所示:

我们可以使用万用表来测量电机的电枢电阻Ra,同时需要多次转动电机,并对测量结果取平均值以提高准确性。电枢电感La则可以通过使用LCR仪器来测量,同样也需要多次转动电机并取平均值。请注意,由于LCR测量频率对结果影响很大,所以我们默认使用1kHz的频率。

此外,一些电机的静态特性,例如端电压Va和转速N的关系,需要通过实际加压进行测量。电机转速N和感应电动势Em之间的关系可以通过电动机带动电机的方式来测量。

这是我总结的电机参数测量方法。如果各位坛友有其他方法,欢迎补充。

2.2控制器环境配置

要编写一个带有PID控制的电机程序,需要进行如下软件环境的配置:

      1.Keil软件:Keil是一款常用的嵌入式开发工具,可以用来编写C/C++语言程序。首先,需要从Keil官网上下载并安装Keil软件。

      2.ST-Link驱动程序:ST-Link是ST公司推出的一种仿真器,可用于对STM32单片机进行仿真调试。需要在电脑上安装ST-Link的驱动程序,并将ST-Link连接到电脑和开发板之间。

      3.串口驱动程序:串口是一种常用的通信接口,用于实现电脑与单片机之间的通信。需要在电脑上安装串口驱动程序。在Keil软件中,使用串口时需要配置串口的通信参数,包括波特率、数据位、校验位等。

      4.OLED模块驱动程序:OLED模块是一种显示设备,常用于显示程序的运行状态。需要在Keil软件中编写相应的OLED模块驱动程序,并将其与程序进行链接。

      5.编码器驱动程序:编码器是一种用于测量位置和速度的设备,可以与电机一起使用。需要在Keil软件中编写相应的编码器驱动程序,并将其与程序进行链接。

打开套件提供的软件包,观察c文件目录可以看到整个程序的组织架构如下图所示:

在配置软件环境时,需要注意以下几点:

      1.确认开发板的型号和芯片型号,并选择相应的编译选项。

      2.注意代码的可移植性,尽可能使用标准的C/C++语法和库函数。

      3.在编写程序时,需要考虑程序的实时性和稳定性,尽量避免死循环等编程错误。

      4.在Keil软件中进行程序调试时,需要设置断点和观察变量,以便更好地了解程序的运行情况。

2.3电机驱动芯片选择

驱动芯片模块TB6612,这是一款功能强大的双H桥驱动芯片,常用于控制直流电机、步进电机和伺服电机等电机类型。TB6612芯片内部集成了两组H桥电路,在控制电机方向和转速时非常方便。它可以使用PWM控制电机的转速,并支持双向电流驱动,具有高效率、高可靠性和低功耗的特点。此外,TB6612还具有过热保护、欠压保护、过流保护等安全保护功能,让用户的电机驱动更加安全可靠。TB6612芯片的型号有很多种,例如L298N、L293D等。这些型号虽然并不完全相同,但是它们都属于双H桥驱动芯片,可以用于控制直流电机、步进电机等电机类型。因此,这些芯片都是可以,对驱动芯片没有严格要求,下图是TB6612的电路图:

2.4 PID控制算法:正转、反转、定速、定位

PID控制算法可以实现正转、反转、定速、定位的功能。其具体实现方法如下:

      1.正转功能:对于正转功能,需要将目标转速设定为正数,并使用PI或PID控制器控制电机的转速。当电机转速达到设定值时,控制器会保持电机的转速不变,从而实现正转功能。

      2. 反转功能:反转功能与正转功能类似,只需要将目标转速设定为负数,控制器会控制电机反向转动,从而实现反转功能。

      3. 定速功能:定速功能即使在负载有变化的情况下,电机转速也能够稳定地保持在设定值。这可以通过使用PID控制器来实现,将速度误差作为PID控制器的输入,根据PID输出调节电机的转速,不断调节以保持稳定的转速。

      4. 定位功能:定位功能通常需要使用闭环控制器,例如位置PID控制器。在定位过程中,将目标位置设定为电机需要到达的位置,使用PID控制器计算出控制信号(通常是电机的转速),并控制电机驱动器以实现电机的转动,直到电机达到目标位置为止。

电机控制的主程序代码如下所示:

      这是一段嵌入式C语言主程序,包含了一个PI控制器和一些初始化函数。具体来说,程序通过调用get_encoder_val()函数获取电机转子的位置,然后使用Incremental_PI()函数计算出相应的PWM信号,控制电机的转速。另外,还包括了一些初始化函数,例如motor_init、encoder_init、key_init、IIC_Init和OLED_Init等,用于初始化电机、编码器、按键、I2C总线以及OLED显示屏等外设。

      在程序的主函数中,首先初始化了一些外设,并在OLED屏幕上显示了目标转速(target_v)的数值。然后,在while循环中,通过调用Incremental_PI()函数计算出PWM信号,同时将该信号通过set_motor_pwm()函数输出到电机驱动器中。另外,程序还通过UART方式接收外部设备的指令,并在回调函数中进行处理。

从主程序中可以看出,对实时性要求较高的PID算法部分未被放置在主程序中执行,主程序只负责液晶屏的刷新工作。

      这里中断函数的书写方式和通常写在NVIC.c文件中的处理方法不同,它是使用了回调的方式。

      进入被回调的函数timer3如下图所示:

这个程序是一个中断服务函数,用于响应TIM3定时器的定时中断。在中断服务函数内部,程序首先通过TIM_GetITStatus函数判断是否发生了TIM3的更新中断。如果更新中断发生,则执行以下操作:

      1.调用get_encoder_val()函数获取当前编码器值,并将其存储在encoder_v变量中。

      2. 使用Incremental_PI()函数计算出对应的PWM信号,并将其存储在SPWM变量中。

      3. 对SPWM进行限幅操作,如果超过PWM_MAX则将其限制在PWM_MAX以内。

      4. 调用set_motor_pwm()函数将PWM信号输出到电机驱动器中。

      5. 在OLED屏幕上打印出encoder_v和target_v的值,并在key_deal()函数中处理按键事件。

      6. 最后,通过调用TIM_ClearITPendingBit()函数清除更新中断的标志位。

      总体来说,这个程序的功能是实现PID控制器对电机转速的控制,定时读取编码器值并计算对应的PWM信号,通过限幅和输出函数控制电机的转速,并在OLED屏幕上显示当前的编码器值和目标转速。

2.5 套件的一些电机测试结果汇总展示

      上图是卖家提供的上位机调试程序,可以用来设置PID参数以及最大最小转速,需要用自己的串口线和模块相连接。连接的时候在端口控制里面选择串口号,并确认。

      P表示控制力的比例放大,比例放大只能根据误差产生呈比例的控制力,假如比例系数不够电机永远达不到设定的转速。如下图所示。

      由于采用的是增量式PID算法,所以即使堵转,控制力也不会突变,如下图所示:

      I表示控制力根据误差的累积进行放大,比如P设置为0,把I设置成10,再将电机堵转一定时间后放开的图如下:

      可见堵转时间越长,误差累积越大,控制力越强,电机的转速也越高。高到大约90转左右,由于PWM最大占空比限制就全速运行。

      综合看来,直流电机的特性还是相对比较线性的,因此转速控制的PI参数选取范围较为宽松。

2.6 光栅编码器电机控制尝试

      光电编码器和电机的连接如下图所示:

      M+和M-端接电机的正负极(接反了也没关系),蓝色三条线的是光电对射管模块,它用+3.3到+5V供电,我用热熔胶棒将它固定在电机上。

      这个模块通过发光二极管和接收三极管之间的光遮挡来探测物体是否存在于槽内,并输出相应的TTL开关信号。当有物体遮挡住光线时,模块会输出高电平信号,否则输出低电平信号。通过将模块的D0输出口与单片机IO口连接,可以实现简单快速地检测物体遮挡状态,结合电机码盘还可以实现电机转速检测等应用。这个模块的原理非常简单,使用方便。

      在测量速度的应用中,光电测速码盘的栅格越多,轮子每转一周获得的上升沿或下降沿会更多,当然这样精度更高,上图的只有20格,精度一般。

      这里参考了一段小车测速的常用代码:

      使用光电传感器来检测物体的遮挡状态,当有物体遮挡时,传感器会输出高电平,否则输出低电平。通过计数程序统计每秒钟传感器输出低电平的次数,每当计数器累加到20时,就认为轮子转了一圈,将计数器的值除以20即可得到每秒钟轮子转的圈数。利用了1个定时器和1个外部中断来实现。其中,一个定时器用于计时,外部中断用于按键输入来控制电机转动。定时器定时1ms,每隔1秒计算一下累计的脉冲数并将转速,使用串口输出。

3.总结分享心得

      通过本次对PID电机套件的学习,了解了有刷直流电机的控制方法,通过对PI参数的实际调试,对直流电机控制有了一定入门。我将有用的PID速度控制程序,电路原理图,以及上位机程序打包在压缩包中供各位参考学习。谢谢!

链接:https://pan.baidu.com/s/1I0pBx-zYs6g4R7cPDWccuA?pwd=1234 提取码:1234

全部回复(1)
正序查看
倒序查看
王总666
LV.1
2
2023-05-11 19:37

6666666

1
回复