打开客服菜单
STM32 Cubemax(十五) —— 串级PID以控制电机角度值为例
时间 :2024-01-01 01:23:41     安博作者: 小九看球直播网址

  很早前说要补的坑,今天补一下。之前介绍过单级的PID来控制电机的速度值,建议先看下面这篇文章,因为后面代码和这篇文章有关联!

  而这次,我们来讲解一下怎么控制电机的角度,如果用单级PID控制角度会有什么样的问题,为何需要用串级PID。

  当然串级PID不只是能控制电机的角度,如现在诸多的控制管理系统,倒立摆,风力摆,平衡小车等等,都是基于串级PID的控制。

  如果还用我们之前熟知的单级PID来控制角度值,我们很容易的能得出以下框图。

  看上去很完美,没什么问题,但这里面最大的问题就在于单片机给电机的是PWM值(或电压值)并不是直接给定电机旋转的角度值,而可以认为是经过一个函数变换f(PWM)得出的值。

  比如这里以角度为例,PWM输出的值,经过一个g(x)变换得到速度值,速度值经过h(x)(即积分)得到角度值,f(PWM)即为h(g(x))。

  根据上述分析可知,对于简单的系统来说,这个f函数的变换,可以用较好的PID参数来抵消掉其中的误差量。但当系统变的复杂,比如平衡小车中,控制的角度不仅是单纯电机的角度,而是车上的位姿姿态,这种时候f(x)就较为复杂!这种时候,十分难得到一个PID参数来使系统稳定。

  所以当我们遇到控制问题时,先看看这个f函数,是不是属于我上述说的情况,来看看单级PID是不是能够使用。

  以控制角度为例,其中最大的问题不在于h(x),因为h(x)相当于速度对时间的积分,问题就在于g(x)的存在,输出的PWM会经过g(x)得出一个不可控的速度值(因为存在电机阻尼,或者外届阻力等),那么此时经过h(x)得出的角度值,也不会如我们想控制的一样。

  那么解决方案就很简单了,就是去控制这个速度值,使其输出的速度值是我们控制器想要得到的值即可了。我们容易得出下面框图。

  这里我们加了一级速度级PID来控制电机的输出速度,外面外环仍然使用一级角度级PID来控制电机最终速度角度,这就是串级的意义。

  其本质内涵,可以认为速度环的引入,相当于给系统增加了阻尼,即抑制了g(x)中因为电机阻尼,外界阻尼等因素的影响。

  其实如果看懂上面串级PID的框图后,代码编写也十分简单了,就是相当于计算两次单级PID,其中外环角度环的目标值为设定的角度,反馈值为电机反馈的角度值,内环速度环的输入即为外环角度环的输出,反馈为电机反馈的速度值。

  //串级PID计算,参数为串级PID指针,角度目标值,角度返回值,速度返回值

  然后外面只需要把Motor_Send里的单级PID计算更换成我们的串级PID计算,就完成了串级PID的计算,这里要解释一下就是这里我们角度的返回值,填的是totalAngle,即我们编码器总读出来的角度值,所以我们这里targetAngle是基于totalAngle上的累加值。

  我们编写完有关串级PID的代码程序后,就到了最关键的调参环节。我们采用的调参方式是按照内环稳定,再调外环的方式,由我们上述的分析也可知,只有内环速度环稳定后,角度环才有意义!

  这里我们应该先利用上次的程序,把内环调好!!,是利用上次的函数,即只有单级PID控制速度的程序。

  我们把单级速度环调好后,将参数填入串级PID的内环中,然后我们就可以开debug去调外环了。

  外环的调节方式和内环其实是完全一致的,具体就不再阐述了,看上篇文章,先P再I,最后D,这些都是按自己的具体项目需求分析,看看到底用PI控制好,还是PD或者是PID控制效果好。

  如果在调节外环的时候发现,不管怎么调都不理想,其中一个可能就是内环没有调好!!再次去精调内环的值。

  本文是通过你自己的实际使用经历来写的,有可能有些地方表达不是很准确,如果有错误,请指正!关键字:编辑:什么鱼 引用地址:STM32 Cubemax(十五) —— 串级PID以控制电机角度值为例

  stm32编程过程经常定义变量类型,经常担心数据运算过程中 超过变量类型范围。因为在编程过程中,不同的CPU,其数据类型的意义各不相同,所以一定要注意相应变量数据类型的定义和转换,否则在计算中可能会出现不确定的错误。所以下面列出常见数据类型: 在编程过程中,不同的CPU,其数据类型的意义各不相同,所以一定要注意相应变量数据类型的定义和转换,否则在计算中可能会出现不确定的错误。 一、C语言数据类型 stm32使用的数据类型定义在 stm32f4xx.h中 整型定义: #include core_cm4.h /* Cortex-M4 processor and core peripherals */ #include

  关于STM32串口通信USART的一些个人浅见: 1:对STM32中文数据手册解读之后,相信我们大家对USART串行通信有些了解,学习51的时候也都接触过,使用串口只要弄明白原理就很简单了 发送和接收数据的过程从图上可以直观的看出 USART串口通信涉及到几个重要的寄存器 1:)状态寄存器 2)数据寄存器 3)波特比率寄存器 例:若要设置比特率为9600,那么DIV就是468.75,则此寄存器的高12位应存值:468,低4位存值:0.75*16=12(十进制小数换算成十六进制小数);最后将整数和小数拼接:BRR=468 4+12;(详细过程可参照源代码;) 4)控制寄存器1: 5)控制寄存

  串口通信(一) /

  一、前期准备 单片机:STM32F103ZET6 开发环境:MDK5.14 库函数:标准库V3.5 PT2272-M4模块:淘宝有售 二、实验效果 三、驱动原理 PT2272-M4是5V信号输出的,所以必要找到单片机带FT脚的作为接收口。按下按键,对应的输出端口输出高电平,反之输出低电平。A,B,C,D对应D2,D0,D3和D1。 需要完整工程或者有问题的请加,验证:呵呵。 四、驱动代码 wirelesskey.h #ifndef __WIRELESS_KEY_H__ #define __WIRELESS_KEY_H__ #include stm32f10x.h #include gpi

  ) /

  该方法适用于STM32,实现了使用printf等标准C流函数输出数据的办法,极大的减少了输出串口数据时所需要做的数据处理。 实现原理 在C库中,printf()等输出流函数都是通过fputc()这个函数实现的,所以我们通过重映射的方式,修改这个函数的定义使它输出在STM32的寄存器中,便能轻松实现使用printf()函数在STM32串口上输出数据的功能。 Keil环境 重映射 在STM32的Keil开发环境中,C的库函数有两种实现方式 使用标准的C函数库 就是我们平常在PC Window平台上用的C库函数,此库的的优点是实现的功能全面。但是由于这个库绝大多数都是专为PC设计的,故而如果在嵌入式芯片中调用时将会使得工程文件变

  的printf串口数据输出 /

  STM32F103XX的ADC的采样时钟最快14MHz,最快采样率1MHz。 ADC时钟: 这个ADC时钟是从哪来的呢。我们看下面这个STM32的时钟结构图: 我们大多使用STM32的最快PCLK2系统时钟72MHz。 ADCCLK的时钟由72MHz的6分频能瞒住14MHz以下的要求 为12MHz。 RCC_ADCCLKConfig(RCC_PCLK2_Div6); //72M/6=12,ADC最大时间不能超过14M ADC转换时间: 有如下公式: TCONV = 采样时间+ 12.5 个周期 其中12.5个周期是采集12位AD时间是固定的,另外一个采样时间能取下面几个参数由SMPx 寄存器控制,每个通道可以单独配置

  ADC转换时间 /

  最近看了下STM32 CAN 通讯 其中标示符过滤器设置大有讲究。特别是你要使用ST库函数时,当过滤器工作在屏蔽模式下,并且你把屏蔽位设了1也就是标示符对应位必须全部匹配才能通过,这是由其要小心。 举个例子吧,过滤器长度为32位,模式为屏蔽模式,假如我要发送的标示符为0x1314;那过滤器设置如下 一、过滤器完全无效 接收到的标示符全部通过 0x1314 二进制码: 0000 0000 0000 0000 0001 0011 0001 0100 CAN_Filter xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx CAN_FilterMask 0000 0000 0000 0

  低功耗模式 降低系统时钟速度 不使用APBx和AHB外设时,将对应的外设时钟关闭 睡眠模式(Cortex™-M3内核停止,所有外设包括Cortex-M3核心的外设,如NVIC、系统时钟(SysTick)等仍在运行) 停止模式(所有的时钟都已停止) 待机模式(1.8V内核电源关闭) 待机模式配置步骤 1.使能电源时钟 2.设置WKUP引脚为唤醒源 3.进入待机模式 举例 void WKUP_init() { RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); //使能电源时钟 PWR_WakeUpPinCmd(ENABLE); //设置WKUP引脚为唤醒源

  待机模式 /

  功能强大的STM32Cube™ 新软件平台由设计工具、中间件和硬件抽象层组成,让客户能够集中精力创新。 中国,2014年3月10日 ——横跨多重电子应用领域的全球领先的半导体供应商、全球领先的ARM® Cortex™-M-内核微控制器厂商意法半导体针对STM32微控制器推出一套免费的功能强大的设计工具及软件STM32CubeTM。新开发平台可简化客户的开发项目,缩短项目研发周期,并进一步强化STM32在电子设计人员心目中解决创新难题的首选微控制器的地位。 STM32Cube™ 开发平台包括STM32CubeMX图形界面配置器及初始化C代码生成器和很多类型的嵌入式软件。配置初始化工具能够一步一步地引导

  应用设计的新软件 /

  F103传感器驱动代码

  F4差异文档

  的智能手表项目案例源代码(智能穿戴领域应用)

  H7B3I的FFT频谱仪

  使用STM32 Nucleo撬开针对物联网的ARM mbed IDE之门

  解锁【W5500-EVB-Pico】,探秘以太网底层,得捷电子Follow me第4期来袭!

  参赛冲击【万元大奖】啦|2023 DigiKey“智造万物,快乐不停”创意大赛

  【下载】LAT1317 STM32CubeProgrammer和STM32CubeIDE协同调试的方法

  【下载】LAT1334 基于MCSDK5.4.8电机库修改两电阻采样方法

  【直播】轻松使用STM32MP13x如MCU般在Cortex A 核上裸跑应用程序

  【新品】STM32H5-Arm® Cortex®-M33 内核,主频高达250MHz,提升性能与信息安全性

  【新品】STM32MP13X-支持Linux、RTOS和Bare Metal应用,新一代通用工业级MPU

  【新品】Arm® Cortex®-M33处理器内核,运行频率160 MHz,基于Armv8-M架构并带有TrustZone®

  【Matter】康普和意法半导体强强联手,让物联网设备Matter证书管理既安全又简便

  【方案】STM32WLE5 x 利尔达LoRa模组助力亚残会开幕式惊艳秀

  【新品】意法半导体发布远距离无线微控制器,提高智能计量、智能建筑和工业监控的连接能效

  2023年12月20日,中国 - 意法半导体新软件帮助工程师把STM32微控制器应用代码移植到性能更强大的STM32MP1微处理器上,将嵌入式系统模块设计性 ...

  瑞萨推出面向图形显示应用和语音/视觉多模态AI应用的 全新RA8 MCU产品群

  瑞萨基于Arm® Cortex®-M85处理器的产品在优化图形显示功能的同时,为楼宇自动化、智能家居、消费及医疗应用带来超高性能和领先的安全性2 ...

  Microchip推出PIC18-Q24 系列单片机 为增强代码安全性设置新标准

  该系列单片机新增电压电平转换功能,有助于提高灵活性并降低系统成本从手机、汽车到智能恒温器和家用电器,慢慢的变多日常设备与云端相连。随 ...

  今天就分享一个读者问到的关于中断处理的问题。 很多人都知道STM32CubeMX这套工具的一个目的:减少开发者对STM32底层驱动的开发时间,把重 ...

  在万利STM32学习板的USB摇杆例程中,摇杆的按键处理并没有消抖处理,因此重新修改了摇杆的驱动,顺便还增加了两个按键以及摇杆中键下压的驱 ...

  STM32F103+ESP8266接入机智云 实现小型IOT智能家居项目

  stm32mp1 Cortex M4开发篇2:通过GPIO点亮LED灯详解

  消息称阿里云削减政企定制项目和 IoT 硬件集成业务,扩大 AI 部门招聘

  立讯精密 21 亿元投资和硕昆山工厂,成仅次富士康的第二大 iPhone 组装商

  有奖活动|登陆泰克高精度电源测试知识星球,揭开噪声的迷雾,发现真实的信号!

  安森美半导体——FOD83xx/T系列来袭! 答题赢好礼,更可免费申请样片

  直播已结束|浅谈Microchip的FPGA产品与智能嵌入式视觉解决方案

  站点相关:综合资讯51单片机PIC单片机AVR单片机ARM单片机嵌入式系统汽车电子消费电子数据处理视频教程电子百科其他技术STM32MSP430单片机资源下载单片机习题与教程