type
slug
status
summary
icon
category
date
tags
password

综设I

  1. 系统总体原理
主要是分为硬件和软件两部分的设计。软件部分分别是GY86模块驱动(IIC协议),蓝牙模块驱动(USART串口通信),电机模块(输出比较),遥控器与接收机模块(PPM波与输入捕获)。硬件部分实现转接板的原理图、PCB图的设计、绘制和实现。
1.1软件
1.2硬件
  1. 攻克的技术难点
  1. 技术创新点
  1. 对下一阶段的展望
GY86:低通滤波过滤噪声参数选择,可配置时钟源和采样传感器分频
电机:控制电机转速的是高电平持续时间而不是占空比,共地(高低电平的相对性),遥控器校准
死区生成:电调自动实现---->三相无刷可能会出现VCC和GND接通的情况
寄存器和汇编(优势相对于库函数,结合计组,说明书使用)
遥控器接收机模块:(中断函数?)一个口来接受PPM(提高寄存器的利用率,25%vsmore)信号,转换为8个口的PWM信号,使用四个口
转接板:引脚分配。
调CNT的值来改变占空比,发现不行,发现决定电机转速的是高电平持续时间。于是改为调整CCR的值

寄存器汇编优势

在我们基础实现库函数驱动代码之后,我们希望用更加直接操作硬件的方式来实现驱动,在四轴这门课上,廖老要求汇编实现代码驱动,然后我们再结合计组的知识来修改寄存器值来实现直接驱动电机,帮助我们对汇编进行进一步的了解,也帮助了我们书写汇编代码。
在 STM32 微控制器中,通过操作寄存器完成电机驱动:是因为这是硬件与软件交互的基础方式。寄存器是 MCU 内部的特定存储单元,直接映射到硬件功能上,通过操作寄存器可以控制硬件的行为。寄存器是微控制器内部的小型存储器,用于存储特定信息(通常是状态或控制信息)。每个外设模块(如 RCC、GPIO、TIM 等)都通过寄存器暴露功能接口。
1. 性能优化
  • 减少开销:直接访问寄存器避免了库函数调用产生的额外开销,例如参数传递、栈操作、上下文切换等。
  • 实时性更高:直接操作硬件能获得更低的延迟,非常适合实时性要求高的场景,如嵌入式系统或硬件控制。

2. 更高的控制灵活性
  • 精确控制硬件:库函数通常封装了常见操作,但其抽象可能掩盖了对硬件底层的控制。通过直接操作寄存器,开发者可以充分利用硬件的每一项功能。
  • 避免功能限制:库函数可能由于通用性设计而限制了某些功能的使用,而直接访问寄存器则可以突破这些限制。

3. 降低对外部依赖的要求
  • 跨平台性:直接操作寄存器避免了对特定厂商库或平台的依赖,代码移植性强。
  • 减少维护成本:在底层开发中,如果使用的库不再更新或版本不兼容,可能会引发额外的适配成本。直接操作寄存器则避免了这些问题。

4. 教育与调试价值
  • 深入理解硬件:直接操作寄存器可以帮助开发者深入理解硬件架构、寄存器配置等底层知识。
  • 精确调试:调试库函数时可能会被封装逻辑掩盖问题,而直接访问寄存器更容易观察硬件的状态。

5. 特定场景的功能实现
  • 自定义功能:某些硬件功能可能无法通过现有库函数实现,此时直接操作寄存器可以满足需求。
  • 实现微调:例如,精确调整时钟频率、控制引脚电平等操作,库函数可能仅支持预设选项,而直接操作寄存器可以更灵活地实现。
notion image
汇编语言实现电机转动
notion image

引脚分配

  • 转接板的设计
notion image
  • GY-86
I2C需要SDA和SCL两个引脚,因为是软件实现I2C通信,故引脚只需满足是GPIO口和支持I2C通信,所以选择PC10和PC12。
  • 蓝牙模块
USART通信需要TX和RX两个引脚,故选择USART1_TX和USART1_RX对应的PA9和PA10引脚。
  • 遥控器接收机
接收机需要4个PWM信号,所以需要4个定时器通道,所以选择通用定时器。
TIM2:PA0、PA1(TIM2的ch1和ch2)(不使用PA2和PA3的原因是:查阅手册得PA2和PA3预留给后期扩展:eg:STLINK(USART通信)
TIM4:PB8、PB9(TIM4的ch3,ch4)(遥控器上还有两个设置通道,留给TIM4ch1,ch2的剩下两个通道,对应引脚也就是PB6 PB7)
notion image
  • 电机电调
每个电机电调需要一个定时器通道,STM32通过输出PWM信号来调节电调,从而控制电机速度,一共有四个电机,需要四个通道,故选择TIM3的四个通道ch1,ch2,ch3,ch4。

电机

电机部分:
电机是由PWM信号来控制,我们最开始认为决定电机转速的是PWM的占空比,于是我们将CCR寄存器和PSC寄存器固定,通过修改CNT的值来改变周期长度,从而改变电机的占空比,但是在这个过程中,高电平持续时间并没有发生改变,于是在我们不断修改占空比的过程中,电机的转速并没有发生任何变化,于是我们查询了电机电调的相关资料,发现决定电机转速的是高电平持续的时间,于是我们将PSC和CNT寄存器的值固定,通过修改CCR寄存器的值来修改高电平持续的时间,从而达到控制电机转速的效果。
notion image
第二个问题就是电机共地的问题。我们最开始的设想是将板子和电机分别使用两块电池进行供电,但是电机总是出现无信号的情况,于是查询了相关资料,高电平和低电平(VCC和GND)其实是相对的两个概念,由于两个模块是相互独立的,那么STM32和电机的高低电平可能会出现不一致的情况,举个例子,假设STM32的GND是0,外接的锂电池是12V,即它的VCC是12V;对于电机而言,假设它的GND是12V,于是我们想通过板子输出一个12V的高电平给电机,输出的电平传到电机中,所对应的是电机的低电平,此时的信号就不能成功解析,两者之间的通信就会出现问题,于是就出现了电机电调无法正常接收信号的情况。于是我们将电调焊在机架上,并通过XT60引出,与STM32接在同一块锂电池上,此时,实现了共地操作,二者的VCC和GND便实现了统一,通过STM32发送的信号可以通过电调被正确地进行解析,数据通信可以正常进行,便可以实现对电机转速的调节。 (明早拍照片:含通路和遥控器的照片1/2?) 我们在使用遥控器同时控制四个电机时,还出现了油门相同但是四个电机转速不一致的情况,最后发现是由于使用前没有进行油门的校准,参考电调的说明书,我们需要先将油门拉到最高,然后上电,听到滴滴两声之后,迅速将油门拉到最低,由此便实现了油门的校准。

PPM

notion image
(创新点)遥控器接收机模块:因为驱动电机需要使用PWM信号,而接收机可以接收的信号有PWM,PPM,S-BUS三种信号,于是我们首先尝试了直接使用接收机接收PWM信号,但随之而来,我们发现,这会导致定时器资源的利用率低。 因为实现对无人机的控制需要接收四路PWM信号,由于一个定时器的所有通道如图所示共享一个CNT,所以,在不做其他处理的情况下,一个定时器只能用于接收一路PWM信号,意味着我们总共需要占用四个定时器。由于STM32F401的定时器资源有限,完整实现无人机功能需要挂载多个外设使用定时器控制,这样就会导致定时器资源不够的情况。 于是我们改变思路,我们利用接收机接收PPM信号,PPM信号可以把多路PWM信号调制到一路通道上,再由定时器输入捕获后还原为多路PWM信号,于是我们便可以只占用一个定时器的一个通道,来实现至少四路PWM信号的接收,这个定时器的剩余三个通道也可以进行其他操作,这样可以大大提高了定时器的利用率,以便实现更多功能。
notion image
演示 GY-86模块和蓝牙模块的核心在于利用特定的通信协议实现数据交换与互联。测试时,我们可以通过调整飞行器的姿态,获取GY-86模块提供的姿态数据,并通过蓝牙将这些数据传输至手机,实现实时显示。

GY-86

  • 1.在四轴项目中,飞行器的稳定性非常重要,寄存器参数配置稍有不慎则可能会导致性能的降低和相应功能无法实现。在设计实现GY-86模块的过程中,通过查阅相关文档我们得知,MPU6050内部有可配置的数字低通滤波器,通过配置相关寄存器可以设置滤波频率,达到一定程度上减少噪声,减少输出数据的抖动,提高信号的稳定性的作用。于是我们查阅了更多相关资料,希望能通过低通滤波器的参数配置提高数据质量,为后续飞行器的平稳飞行打下基础。
notion image
上图为滤波器带宽与延时的对应关系,带宽表示滤波器允许通过的信号频率范围,超过带宽的信号将被滤除。带宽越高,意味着能通过滤波器的信号数目会越多,占用模块的性能越少,延时越低。同时带宽越高,会导致噪声信号被滤除的可能性越低,数据会因此发生抖动,使得信号传输不稳定。
因此,在实际应用中,我们需要根据需求的侧重来选择合适的带宽(即相关寄存器写入的值),高带宽和低延迟的设置适合需要快速响应的应用,而低带宽和高延迟的设置适合需要减少噪声的应用。本项目中由于人肉眼捕获数据速度和反应能力有限,且对数据的更新显示速度没有过高的要求,因此采用较低带宽来增强噪声处理能力,提高信号的稳定性。
由于寄存器的第 0(最高带宽)和第 7 位(最低带宽)被禁用,因此选择写入可以用于滤波设置的第6位。
  • 2.在四轴飞行器项目中,除了稳定性之外,数据的实时性与快速处理能力也是设计中需要权衡的关键因素。MPU6050提供了分频器功能,允许我们通过配置采样率分频寄存器,来控制数据刷新的速率。这一功能的引入,为我们在数据的实时性和硬件有限的处理能力之间找到平衡点提供了可能。
notion image
上图公式可得,分频系数的设定,直接影响着采样频率的高低。较小的分频系数(SMPLRT_DIV)意味着较高的采样频率(Sample Rate),这使得传感器能够快速响应外部的变化,但同时也给数据处理系统带来了更大的负担。相反,较大的分频系数虽然会降低数据的更新速率,却能有效减轻处理器的负担,确保系统稳定运行。
在本项目中,考虑到我们对数据变化的感知有限,且现阶段选用的硬件的数据处理性能不佳,我们选择了较大的分频系数。这样的设置,虽然牺牲了一定的实时性,却显著提高了系统的稳定性和数据处理的效率,更有利于后续的姿态数据读取。
 

综设II

总体设计

本学期我们主要做了三个方面的工作:首先是把 uC/OS-II 操作系统移植到我们的F401开发板上,为后续任务调度提供了系统支持;接着我们对硬件模块进行了重构,优化了驱动和接口,让硬件能更好地配合操作系统稳定运行;最后我们还集成了SystemView工具,用来实时监测系统,方便我们后续分析和整体优化。(27s)

任务实现

接下来我将从事件驱动、时间驱动和任务调度三个方面来介绍我们整个工程的实现。

事件驱动

在裸机中我们原本是靠轮询方式来响应外设,这种方式CPU效率低、实时性差。所以我们重构了硬件模块,引入中断机制,用事件驱动代替轮询。以TIM2输入捕获中断为例,当硬件捕获到上升沿时,立即触发中断通知操作系统,保存上下文后,CPU立即执行TIM2中断处理函数进行有效信号处理。响应延迟从毫秒级的轮询周期压到微秒级的中断响应,中断处理的原子性确保PPM信号采样准确不丢失。在串口接收中,我们也使用了中断,在后续我们会讲到。(45s)

时间驱动

在裸机系统中,我们常用delay循环来实现延时,但它本质是空转占用 CPU,CPU无法同时处理其他任务。同时每个任务自己控制时间,容易出现不同步问题。操作系统使用 SysTick 定时器提供一个统一、稳定的全局节拍,解决了任务时间异步出错的问题。同时每一个节拍会触发Sytick中断,中断服务程序中的OSTimeTick()会检查任务的延时是否到期,OSIntExit()会检查任务就绪情况实现任务切换,执行优先级更高的就绪任务。解决了裸板延时时CPU空转效率不高的问题。同时我们还重写时钟树,让每一步定时都由自己控制。(45s)

任务调度

最后是任务调度部分。任务调度最核心的三部分展示在我们的屏幕上。左下角是任务的调度点,例如我们前面讲到的中断退出时会发生任务的切换。除此之外还有任务调用OSTimDly将自己主动挂起也会导致任务的切换。最上面的是任务切换时上下文的保存过程。发生任务切换时,会保存当前任务上下文于自身任务栈中,同时加载高优先级任务的上下文到CPU相应寄存器中,准备执行。右下角是优先级位图,在 uC/OS中,任务的就绪状态并不是直接使用传统的双向链表,而是通过位图来管理,可以在 O(1) 时间内找到优先级最高的任务。任务切换最关键的两个函数OSStartHighRdy和OS_CPU_PendSVHandler。前者查找当前优先级最高的任务,改变TCB指针和当前优先级。后者执行任务的切换,包括保存当前任务的上下文和恢复高优先级任务的上下文。(1min10s)

创新与难题解决

在这次任务中,我们通过加入信号量的方式来保证系统运行的精准性。在串口通信中,我们使用互斥信号量确保发送和接收操作不被打断,避免多任务竞争导致数据帧交叉混乱。在遥控机-接收机中,通过同步信号量实现PWM捕获中断与电机驱动的时序同步,使电机仅在接收到完整指令后才更新参数,避免数据解析不完整。通过信号量的应用,有效解决了多任务协作中的资源竞争和时序协调问题。(40s)
这是加入了信号量的任务流程图,从左到右依次是:串口发送、电机驱动、串口接收。
可以看到,在串口接收中,我们进一步采用缓冲区+中断的机制(点击),USART1 接收数据时触发中断存入缓冲区主任务可读取完整数据帧,解决传统轮询方式在高波特率下的数据丢失问题,提高系统实时性。(35s)
在完成本学期任务时,我们也遇到了汇编函数开发经验不足、函数执行异常、操作系统与硬件、逻辑的兼容性冲突等难题。通过查阅资料、拆分函数功能、整合多门专业课知识、利用Systemview和调试工具等方式攻克。(20s)

总结展望

在顺利完成本学期任务后,我们规划了后续优化方向:首先进一步优化操作系统,例如利用外设定时器实现微秒级延时等;其次我们将重新设计 PCB,优化元件布局和线路走向;此外,我们将尝试把项目迁移至Linux环境,借此拓展系统功能。
以上就是我们的全部汇报内容,感谢各位的聆听!
3-1 刚体运动与姿态描述第1章:计算机网络概述
Loading...