个人学习笔记,主要学习课程来源:B站up,铁头山羊和江科大
STM32CubeMX中Clock Configuration配置
前提得先知道定时器属于哪个时钟树(APB1还是APB2)
对于STM32F4xx来说:TIM 1,8,9-11属于APB2
TIM 2-7,12-14属于APB1
在RCC中可以选择HSE和LSE的来源,一般选择外部时钟,即晶振;

之后可以通过Clock Configuration配置时钟,步骤分为以下6步

①处用来设置外部晶振,设置好晶振后,HSE可以去②和③,②处可以选择上方HSI来源的频率,也可以选择HSE来的频率
③处频率来源可以来源于②经过配置到PLLCLK(锁相环时钟),也可以直接来源于HSI和HSE。
具体频率来源需要我们自己设计。
到达④处即系统时钟,继续向后传输到APB2和APB1,最后APB2和APB1想要什么频率需要自己设计好。
(可以结合时钟对照上面时钟树会比较清晰)
STM32cubeMX---定时器学习

Slave Mode:选择从模式控制器的工作模式
Trigger Source:设置从模式控制器触发信号的来源
Clock Source:选择时基单元时钟的来源,来自于RCC(Internal Clock),来自于外部参考信号ETR(ETR2)
Channel1/2/3/4 :通道1-4,用于输入捕获、输出比较
Combined Channels:

Counter Settings分别设置PSC,计数模式,ARR,设置分频系数,RCR,设置ARR寄存器的预加载
ADC
ADC原理
1、采样深度理解

2、ADC类型
单片机所使用的是逐次逼近型ADC
| ADC 类型 | 工作原理 | 优点 | 缺点 | 应用 |
|---|---|---|---|---|
| 逐次逼近型 (SAR) | 逐次逼近算法,每次比较输入电压与内部基准电压,逐步逼近输入电压 | 速度适中,功耗低,分辨率高(8 - 18 位) | 数据采集系统、传感器接口 | |
| 闪存型 (Flash) | 使用并行比较器同时比较输入电压和一组参考电压 | 转换速度非常快(纳秒级) | 电路复杂,成本高,功耗大,分辨率有限(4 - 8 位) | 高速数据采集、视频信号处理 |
| 积分型 (Integrating) | 对输入信号进行积分,然后比较积分结果与参考电压 | 高精度,适合低频信号 | 转换速度慢 | 精密测量仪器,如数字电压表 |
| Σ - Δ (Sigma - Delta) | 利用超采样和数字滤波,通过调制和积分实现高分辨率转换 | 非常高的分辨率(16 - 24 位),噪声性能好 | 转换速度慢,延迟高 | 高精度音频设备、精密测量仪器 |
| 流水线 (Pipeline) | 将转换过程分为多个阶段,每个阶段逐步提高分辨率 | 中高速度和高分辨率,转换速度比逐次逼近型快,分辨率高于闪存型 | 电路复杂,延迟较高 | 通信系统、高性能数据采集 |
| 双积分型 (Dual Slope) | 先对输入信号积分一定时间,然后对基准电压反向积分,比较结果 | 高精度,对电源噪声和信号噪声不敏感 | 转换速度慢 | 精密测量设备,如高精度数字万用表 |
3、STM32F1xx为例,前10路模拟信号通过GPIO口输入,后两个分别是来自于内部的温度计和参考电压的模拟信号

4、实现
例:将一个正弦波模拟信号,通过通道5每1ms输出一次数字信号,首先在常规序列给5,输入脉冲1ms一次,就能实现正弦波没1ms采样一次。
cubemx中配置ADC


USART
USART协议理论内容

传送位数一般选8位无校验位或9位有校验位,一次传输一个字节。

波特率越高,传送速度越快
比如 9600 波特率,意味着每秒传输 9600 个位,那么传输 1 位大约需要 1/9600 秒,约 0.1 毫秒;115200 波特率则是每秒传输 115200 个位,传输 1 位大约需要 1/115200 秒,约 8.7 微秒。
异步模式一条线用于发送,一条用于接收
同步模式要加一条时钟线
CubeMX中配置USART
USART模式选择,一般选择异步模式

基本参数包括波特率,传输字节长度,校验方式和停止位长度
高级参数包括数据传输方向

串口中断解释
UART 接收中断
工作原理:UART通过上位机得到数据,一位一位接收,当接收的位先存在移位寄存器中。当一帧数据完整接收完,硬件会把移位寄存器数据转移到接收缓冲区(RDR),同时,RXNE被置1,中断被触发(接收缓冲区非空标志位)
串口接收中断即每当串口完成一次接收之后触发一次中断。在 STM32 中相应的中断处理函数为 USARTx_IRQHandler,中断回调函数为 HAL_UART_RxCpltCallback。可以通过 USART 状态寄存器中的 UART_FLAG_RXNE 位判断 USART 是否发生了接收中断
串口空闲中断即每当串口接收完一帧数据后又过了一个字节的时间没有接收到任何数据则 触发一次中断,中断处理函数同样为 USARTx_IRQHandler,可以通过 USART 状态寄存器 中的 UART_FLAG_IDLE 判断是否发生了空闲中断
这两种中断都是在串口进行接收时可能会发生的中断

UART 发送中断
①发送缓冲区为空 产生中断:串口发送数据时,数据会被写入发送缓冲区,当发送缓一个字节会送入移位寄存器中冲区数据被取走,缓冲区变空,TXE置1,中断会触发(一个字节一次,即一个字节发送产生一次中断)
②发送完成中断:当一帧数据全部发送完毕,会将TC置1,触发中断
对应的中断回调函数为 HAL_UART_TxCpltCallback。
串口错误相关中断
-
UART_IT_PE:奇偶校验错误中断。当接收数据时检测到奇偶校验错误,会触发该中断,可用于在出现奇偶校验错误时进行相应的错误处理,如提示用户数据可能有误等。 -
UART_IT_ERR:错误中断。这是一个综合的错误中断,包括帧错误、噪声错误等多种错误情况。当检测到任何一种接收错误时,都会触发该中断,可在中断服务函数中根据具体的错误标志位来判断错误类型并进行相应处理。 -
UART_IT_ORE:溢出错误中断。当接收数据寄存器已满,但又有新的数据到来时,会发生数据溢出,此时会触发该中断,可用于在出现溢出错误时进行数据恢复或错误提示等操作。
串口其他中断
-
UART_IT_LBD:LIN 总线中断检测中断。在 LIN 总线通信中,当检测到总线上的特定中断条件时,会触发该中断,用于 LIN 总线的通信控制和错误处理。 -
UART_IT_CTS:CTS 流控制中断。在使用硬件流控制的情况下,当 CTS 引脚状态发生变化时,会触发该中断,可用于根据 CTS 引脚的状态来控制数据的发送,实现流控制功能
串口HAL库相关函数
HAL_UART_Transmit函数

HAL_UART_Receive函数
HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart1,
uint8_t *pData,
uint16_t Size,
uint32_t HAL_MAX_DELAY)
作用:通过串口接收一定数量的数据(会无限期地等待下去,直到接收完成为止)。
参数:
huart:填写串口句柄的指针。pData:指向接收缓冲区的指针。Size:要接收数据的数量,以字节为单位。Timeout:超时时间,单位 ms。
返回值:返回数据发送的结果(成功还是失败),其中HAL_OK表示成功。
__HAL_UART_ENABLE_IT函数
__HAL_UART_ENABLE_IT 是 HAL 库中用于使能 UART(通用异步收发传输器)相关中断的一个宏定义函数。它的主要作用是配置相应的寄存器,来开启指定 UART 模块的特定中断功能。它允许开发者方便地开启 UART 的各种中断功能,从而实现高效的异步通信和事件处理。
第一个参数是UART_HandleTypeDef类型的指针,如&huart6
第二个参数是一个中断类型的枚举值,包括以下多种类型:
HAL_UART_Receive_IT函数
HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
函数用于启动 UART 的中断接收模式,它会使能 UART 的接收数据寄存器非空中断UART_IT_RXNE,并在接收到一个字节的数据后,产生中断请求。
接收到数据后,会将数据存储到pData指向的缓冲区中,并将接收计数器加 1。当接收的字节数达到Size指定的值时,会自动关闭接收中断。
DMA(直接存储器访问)功能
DMA 是在使用串口进行通讯时常用的一个功能,使用该功能能够完成串口和内存之间直接的数据传送,而不需要 CPU 进行控制,从而 节约 CPU 的处理时间
SPI
SPI通信协议理论
SPI四个接口
MISO
MISO

SCK

NSS

传输顺序

数据位长度

时钟极性

时钟相位


CubeMX配置SPI
模式选择



SPI 库函数
SPI是同双工,可同时接收和发送数据

发送数据

接收数据

MPU_NSS_LOW //使能 SPI 选择线(片选信号)
MPU_NSS_HIGH // 禁用 SPI 选择线
这些宏通常用于控制 SPI 片选信号(NSS)。在通信开始前,片选信号拉低,通信完成后拉高。
注意点:
1、SPI 通信的第一个字节是寄存器地址,所以先发送地址,再写发送函数发送数据
2、最高位为 1 表示读取操作。最高位为 0 表示写操作。
I2C
I2C通信协议理论






例子

CAN
can通信接线方式

CAN框图
如果想发出一个报文,把这个报文写入其中一个发送邮箱之后启动寄存器发送即可
报文经过过滤器,在过滤器中我们设置过滤规则,告诉硬件我们想要什么ID报文,通过过滤器报文会存入FIFO0或FIFO1中,等待CPU读取。

CAN发送接收详细解释
发送:想发送一个报文只要把报文的ID、Data、IDE、RTR等写入到其中一个发送邮箱,写一个请求发送命令,然后等待总线空闲,自动把报文发送到总线上。
接收:报文从RX接收后通过接收控制器到过滤器通过ID号对报文进行过滤,是想要的进去FIFO,不想要的丢弃掉。

发送和接收配置位

can异步通信

can收发模式
CAN协议帧格式

CAN数据帧格式
显性(0)隐性(1)
帧起始位为1位显性0开始
报文ID为11位,区分功能同时决定优先级
RTR(远程请求标志位)用于区别是数据帧还是遥控帧,数据帧则为显性0,遥控帧则为隐性1
IDE用于区别是标准格式还是扩展格式,标准格式为显性0,扩展格式为隐性1
r0保留位,为0
DLC表示数据段长度
数据段传输数据可以是0-64bit
CRC表示校验算法
CRC界定符为隐性1
ACK槽表示应答,开始为1,接收方让他变为0,从1变成0,这样发送方就知道数据已经被接收
ACK界定符为隐性1
帧结束用7位隐性1


CAN遥控帧格式

CAN错误帧

CAN过载帧
主要接收方使用

CAN帧间隔

资源分配规则(仲裁)

重要的消息ID号小一点,这样或有高优先级

如果一个发送方发出1读会0,代表这个发送方被其他ID号更低发送方即优先级更高的发送方占了。也就实现了冲裁功能。
其中数据帧和遥控帧id号一样,数据帧优先级高,因为RTR数据帧为显性0,遥控帧为隐性1,数据帧胜出
标准数据帧帧优先级高于扩展数据帧
错误类型

过滤器和掩码

每个标识符代表意思
列表模式是写出所有ID号进行过滤
屏蔽模式是要借助掩码来过滤
掩码配置原则
掩码写1表示与ID的对应位一致才能进入,写0表示ID的对应位0和1都能进来
例如我们要把ID号为0x200-0x20f的报文过滤出,其ID设置为0x200,掩码设置为0x700即可,表示只要ID的前三位一致即可。若掩码设置为0x7ff表示只能进0x200的报文,因为掩码全设置成了1,每一位都对应。
| STID[10] | [9] | [8] | [7] | [6] | [5] | [4] | [3] | [2] | [1] | [0] | RTR | IDE | EXID[17] | [16] | [15] |
| 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |||||
| 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
过滤器和掩码实例解释
1、16位列表模式见上图最后一种,16位列表模式过滤0x234,0x345,0x567,需要把每一个ID都写入,分别在R1[31:0],R2[31:0]配置0x234,0x345,0x567,需要左移5位的原因是过滤器遵循右对齐原则, ID号应该写入STID[10:0]中,把RTR,IDE,EXID[17:15]这5位空出来.
2、16位屏蔽模式见上图第三种,16位屏蔽模式过滤0x200-0x2ff,0x320-0x32f,只需要在R1[31:0],配置0x200和掩码0x700,R2[31:0]0x320和掩码0x7f0。掩码配置见掩码配置原则。
32位列表模式与屏蔽模式和16位类似。

CAN中断

can地址(can ID)
关于ID:
- ID的高位在前,低位在后。
- 基本ID,禁止高7位都为隐性,即不能:ID=1111111XXXX。
- 标准格式的ID共11位,即最大的ID为:0x7ef;
- 扩展格式的ID有29位,即最大的ID为:0x1f bf ff ff;

CubeMX中CAN的配置

PID控制
PID适用二阶以内的线性系统
PID公式
其中e表示误差
比例系数(Kp):一种回复力,跟误差值成正比
Kp决定了输出信号对误差的响应程度。较大的Kp值会加快响应速度,但可能导致系统不稳定或出现振荡。较小的Kp值则会导致响应缓慢,但系统更稳定。
通俗:Kp大,无人机上升快,因此调参Kp一般先给小一点
积分时间(Ki):一种误差的累加,目的是消除稳态误差(静态误差)
Ki决定了积分作用消除系统稳态误差的速度。较大的Ki值会更快地消除误差,但可能导致积分饱和,从而引起系统超调。较小的Ki值则会导致误差消除速度慢。
通俗:只通过Kp调整,无人机可能始终无法到达我们预期位置,只会无限接近。因此引入Ki,通过不断积累误差来实现无人机再上升
微分时间(Kd):误差的变化率,目的让误差值的变化率稳定一点(抵消震荡,抵消惯性)
Kd决定了微分作用对误差变化率的响应程度。较大的Kd值可以抑制振荡,提高响应速度,但可能放大噪声并降低抗干扰能力。较小的Kd值则会降低系统的响应速度。
通俗:通过Kp,Ki调整,无人机可能超出我们预期位置。因此引入Kd,通过微分作用对误差变化率的影响,抵消P,I影响。来实现无人机下降到达期望位置。

例子1---小车
假如只有比例系数P,误差是期望位置-实际位置,误差进入比例控制器,误差如图乘以0.1,给电机以10m/s运动,经过不断闭环小车到达位置。
如果小车要快点,只要把比例系数P调大
图中P可以换成PI,PD,PID控制器,根据实际情况设计。

例子2---无人机
因为每次调参,像P,I,D都是不变的,例如下图通过P让无人机到达99m悬停,但从99m到100m误差为1,通过p=100,进入电机可能升力不够,就要引入积分项 I ,通过不断积累误差来实现上升。
如若上升过大,就又需要引入微分项D,用于抵消P,I持续上升

如果PID参数调的不好会,可能会像蓝色曲线那样。

c620电调用来把pid信号转成电信号

IMU
欧拉角解释

加速度计与姿态测量
例子求了翻转角和俯仰角(通过重力加速度分解求取)

IMU如何得到欧拉角
1、为什么融合
对于六轴数据,计算角度有两种方法,一种是通过对角速度积分得到角度,另一种则是通过对加速度进行正交分解得到角度。但这两种方式均存在不足,通过角速度积分得到角度时,角速度的误差会在积分过程中被不断放大从而影响数据准确性。而加速度计是一种特别敏感的传感器,电机旋转产生的震动会给加速度计的数据中带来高频噪声。
2、加速度计测量和实际误差
设有大地坐标下的重力加速度 g,把 g 通过姿态矩阵(坐标转换矩阵)的逆(意味着从地理坐标系 R 到机体坐标 b 系)变换到机体坐标系,得到其在机体坐标系下的理论重力加速度向量 𝑣^ ,则两者的变换关系可通过前文给出的姿态矩阵得出:

另外,我们还可以通过加速度计测量出实际重力加速度向量𝑣¯ 。
3、具体实现步骤
步骤1
获取加速度计的值(为物体坐标系下对应的值),对其归一化(归一化的原因是因为姿态变化矩阵中的四元数是规范四元数,利用陀螺仪去更新的四元数也要归一化,所以加速度计获得的值也需归一化才能是两者对应)。记从加速度计获得的值为ax、ay、az(分别对应x、y、z轴的值),其归一化方法如下:

步骤2
设有大地坐标下的重力加速度 g,把 g 通过姿态矩阵(坐标转换矩阵)的逆(意味着从地理坐标系 R 到机体坐标 b 系)变换到机体坐标系,得到其在机体坐标系下的理论重力加速度向量 𝑣^ ,则两者的变换关系可通过前文给出的姿态矩阵得出:

另外,我们还可以通过加速度计测量出实际重力加速度向量𝑣¯ 。
显然,这里的理论重力加速度向量 𝑣^ 和实际重力加速度向量𝑣¯ 之间必然存在偏差,而这个偏差很大程度上是由陀螺仪数据产生的角速度误差引起的,所以根据理论向量和实际向量间的偏差,就可以补偿陀螺仪数据的误差,进而解算出较为准确的姿态,即将隐含在四元数中的角速度误差显化。
步骤3
将加速度计获得的重力向量归一化后的值与提取的姿态矩阵的重力向量叉乘获取状态误差,根据叉乘定义,得到状态误差向量:

设ex,ey,ez为误差向量对应三个轴的元素,得:

步骤4
对误差进行积分,从而消除误差,设accex、accey、 accez为x、y、z三轴对应的误差积分结果(对两个重力分量叉乘后的误差进行积分,结果得到角速度值),ki为积分系数。
其中,比例项用于控制传感器的“可信度”,积分项用于消除静态误差。KP越大,意味着通过加速度计得到误差后补偿越显著,即是越信任加速度计。反之KP越小时,加速度计对陀螺仪的补偿作用越弱,也就越信任陀螺仪。而积分项则用于消除角速度测量值中的有偏噪声,故对于经过零篇矫正的角速度测量值,一般选取很小的𝐾𝐼。最后将补偿值补偿给角速度测量值,带入四元数差分方程中即可更新当前四元数。

步骤5
互补滤波,将误差输入Pid控制器与本次姿态更新中陀螺仪测得的角速度相加,得到一个修正的角速度值,获得的修正的角速度值去更新四元素,从而获得准确的姿态角信息。设gx、gy、gz为陀螺仪测得的三个轴的角速度及滤波后的角速度修正值,Kp为互补滤波系数,则修正角速度计算方法如下:

步骤6
解四元数微分方程,其中wx,wy,wz对应gx、gy、gz

步骤7
四元数归一化处理
步骤8
带入公式求出欧拉角

总结示意图

图片来源:https://zhuanlan.zhihu.com/p/505123676
robomasterA板板载IMU介绍
MPU-6500是一款六轴运动处理传感器,集成了 3 轴 MEMS 陀螺仪,3 轴 MEMS加速度计,以及一个数字运动处理器 DMP。还可以通过辅助I2C端口与磁力计进行连接。

1、陀螺仪功能
MPU-6500中的三轴MEMS陀螺仪具有广泛的特性:
·数字输出X、Y和Z轴角速度传感器(陀螺仪),其用户可编程全量程为±250,±500,±1000和±2000°/秒,使用16位ADC采集数据。
·数字可编程低通滤波器
·陀螺仪工作电流:3.2mA
·工厂校准灵敏度标度因子
·自测试
2、加速度计功能
MPU-6500中的三轴MEMS加速度计具有广泛的功能:
·数字输出X-,Y-,Z轴加速度计,可编程全量程为±2g,±4g,+8g和±16g,使用16位ADC采集数据。
·加速度计正常工作电流:450 uA
·低功率加速度计模式电流:0.98Hz为6.37uA,31.25Hz为17.75uA
·用户可编程中断
·用于应用程序处理器低功耗操作的唤醒运动中断
·自测
3、附加功能
MPU-6500包括下列附加功能:
·从外部传感器(例如磁强计)读取数据的辅助IIC总线
·3.4mA工作电流当所有6轴都都工作时
·VDD电源电压范围为1.8~3.3V±5%
·VDDIO基准电压1.8~3.3V±5%提供至辅助IIC设备
·芯片大小:3x3x0.9mm
·加速度计和陀螺仪之间的最小交叉轴灵敏度
·512字节FIFO缓冲器,使应用程序处理器能够读取突发数据。
·数字输出温度传感器
·陀螺仪、加速度计和温度传感器可编程数字滤波器
·400 KHzIIC用于与所有寄存器通信
·1 MHz SPI串行接口用于与所有寄存器通信
·20 MHz SPL串行接口用于读取传感器和中断寄存器(提高读取速度)。
·MEMS结构在硅片级密封和键合
·符合RoHS和绿色标准
4、运动处理
·内部数字运动处理(DMP)引擎支持高级运动处理和低功耗功能,例如使用可编程中断的姿态识别。
·除角速度外,该设备还可以选择输出角度。
·低功率计步器功能允许主机处理器在DMP保持步数计数的同时进入睡眠状态。
DMP数字运动处理器
寄存器 MPU6500_GYRO_CONFIG
uint8_t mpu_set_gyro_fsr(uint8_t fsr)
{
return mpu_write_byte(MPU6500_GYRO_CONFIG, fsr << 3);
}
给MPU6500_GYRO_CONFIG(寄存器)写入fsr值的含义如下:
0:±250 dps(度每秒)1:±500 dps2:±1000 dps3:±2000 dps
一般要把写入的数右移3位,目的是将量程设置写入陀螺仪配置寄存器的相应位置。具体来说,陀螺仪量程的设置位在 GYRO_CONFIG 寄存器的 3-4 位(这些位控制了量程),因此需要左移 3 位以对齐。
寄存器MPU6500_ACCEL_CONFIG
uint8_t mpu_set_accel_fsr(uint8_t fsr)
{
return mpu_write_byte(MPU6500_ACCEL_CONFIG, fsr << 3);
}
给MPU6500_ACCEL_CONFIG(寄存器)写入fsr值的含义如下:
0:±2g(2倍重力加速度)1:±4g2:±8g3:±16g- 通过左移 fsr 3 位,来将量程设置写入加速度计配置寄存器的相应位置。具体来说,加速度计量程的设置位位于
ACCEL_CONFIG寄存器的 3-4 位,因此需要通过左移操作将fsr值写入正确的位置。 MPU6500_ACCEL_CONFIG寄存器的 3-4 位控制加速度计的量程:- 如果
fsr = 0(表示 ±2g),则配置值为0x00。 - 如果
fsr = 1(表示 ±4g),则配置值为0x08(左移 3 位后是0x08)。 - 如果
fsr = 2(表示 ±8g),则配置值为0x10(左移 3 位后是0x10)。 - 如果
fsr = 3(表示 ±16g),则配置值为0x18(左移 3 位后是0x18)。
寄存器MPU6500_USER_CTRL
USER_CTRL 寄存器的配置影响了设备的多个功能,包括如何控制与外部设备的连接、数据流的控制等。

寄存器MPU6500_I2C_MST_CTRL
该寄存器用于控制 MPU6500 的 I2C 主模式的相关设置,特别是当 MPU6500 用作 I2C 主机与外部设备进行通信时。

MPU6500_I2C_SLV1_ADDR 和 MPU6500_I2C_SLV4_ADDR
这两个寄存器分别是 MPU6500 用于配置 I2C 从设备地址的寄存器。SLV1_ADDR 和 SLV4_ADDR 是指示与 I2C 从设备( IST8310 磁力计)通信的设备地址。
mpu_write_byte(MPU6500_I2C_SLV1_ADDR, IST8310_ADDRESS);
MPU_DELAY(10);
mpu_write_byte(MPU6500_I2C_SLV4_ADDR, 0x80 | IST8310_ADDRESS);
MPU_DELAY(10);
IST8310_ADDRESS 是 IST8310 磁力计的 I2C 地址,通常是固定的
- 第一个
mpu_write_byte设置 I2C 设备地址。 - 第二个
mpu_write_byte,这里0x80是与地址进行按位或操作,目的是启用相关的操作模式,启动读操作。
官方示例代码示意图



3326

被折叠的 条评论
为什么被折叠?



