资讯动态

基于PIC18F4458与DRV8818的双极步进电机轴控制器设计

发布时间:2026/10/2 13:26:46 来源:尧图企业网站定制
做工业设备或者机器人关节驱动的朋友应该对步进电机都不陌生。一提到步进电机控制很多人第一反应是拿A4988模块配Arduino接两根线就让电机转起来。但我最近在一个设备改造项目里换了一条更偏工业的路线用PIC18F4458作为主控搭配DRV8818PWPR驱动芯片重新做了一版完整的双极步进电机轴控制器。这套组合在非标自动化、机器人外部轴、小型变位机这类场景里比那些消费级模块可靠得多而且从电流设置到加减速曲线到故障处理全部可控。这套方案能做什么最直接的事情就是驱动一个双极步进电机把方向、速度、细分、电流上限全部做成可配置的同时支持限位开关接入、故障信号上报还能通过USB在电脑上随时改参数和读取运行状态。放在工业现场里它可以当一个单轴步进控制板放到机器人项目里它就是第七轴导轨、转台、送料机构这类外部轴的驱动单元哪怕只是自己做一个云台或者管道爬行器这套设计思路也完全适用。这篇文章我尽量把从选型、硬件设计到固件调试的完整路径讲清楚适合正在做类似驱动板、或者想搞明白工业级步进驱动到底怎么工作的工程师和爱好者。1. 方案定位与选型逻辑1.1 为什么要拆成MCU计算驱动芯片出力两层步进电机本身只是一个执行机构要让它在指定位置停下、用指定速度运行必须解决两个层面的问题逻辑层要生成步进脉冲、判断方向、响应限位和故障功率层要把逻辑信号变成能驱动电机线圈的电流同时承担过流、过热的自我保护。如果把这两个层面揉进一颗芯片里市面上确实有集成方案比如一些SoC级别的步进驱动模块用起来省事但代价是灵活性差。电流纹波、衰减模式、细分档位这些在工业现场很影响运行效果的参数往往被模块厂商固化掉了出了问题你只能换模块没法调。所以我的做法是逻辑层用PIC18F4458功率层用DRV8818PWPR。打个比方MCU是大脑负责决定走多少步、多快走、什么时候停驱动芯片是肌肉负责把指令变成实实在在的电流同时自带抽搐保护。两层之间只通过几个逻辑引脚交互STEP、DIR、ENABLE、M1/M2外加一个故障输出nFAULT。这个架构的好处是每一层都可以独立替换也方便在不同项目中复用固件和电路。1.2 DRV8818PWPR选型理由从A4988模块说起很多入门玩家对步进驱动的印象就是A4988、DRV8825那种小模块。它们确实便宜好用3D打印机里到处都是但拿到工业环境里就有问题。首先是供电范围A4988最高到35VDRV8825到45V左右其次是封装散热这两种模块上的芯片都是无散热焊盘的QFN或者SOP封装长时间满电流跑很容易触发过热保护。DRV8818PWPR不一样。它的封装是HTSSOP-16底部带PowerPAD散热焊盘这个焊盘一旦通过过孔阵列接到大面积铜皮上散热能力完全不是那些小模块能比的。供电范围是8.2V到45V能满足24V这个工业现场最常见的电机母线电压峰值输出电流到2.5A级别驱动常见的57系列、86系列步进电机都没问题连续运行电流留出余量后大概在1.5A上下。还有一个很关键的点DRV8818内置了微步进译码器MCU不需要自己产生相位时序只需要给STEP引脚一个脉冲芯片内部就会按设定的细分档位自动切换两个H桥的电流方向。这大大降低了MCU的负担。芯片还提供V3P3引脚内部带一个3.3V稳压输出可以用来给逻辑电路供电虽然电流不大但省一路电源设计。相比之下A4988模块还需要额外接逻辑电源。1.3 PIC18F4458选型理由一颗带USB的8位机选择PIC18F4458很多人会问这个年代为什么不用STM32答案其实是使用场景决定的。我需要的不多几个定时器产生脉冲一组GPIO控制驱动芯片一路ADC读电流或限位信号再加上USB接口方便现场调试。这些活一颗8位单片机完全能胜任。PIC18F4458主频最高48MHz指令周期4分频后是12MHz算下来12MIPS的处理能力做步进控制绰绰有余。这芯片还有个明显的工业优势5V供电。DRV8818的逻辑电平也兼容5V两块芯片直连不需要做电平转换。PIC虽然外设不算豪华但13通道10位ADC、5个定时器、两个CCP/PWM模块、USB 2.0全速控制器都配齐了。更重要的是Microchip单片机在工业设备里的存量非常大很多产线维护人员都用MPLAB X加XC8编译器上手和后期维护成本比切到ARM低很多。再加上ICSP在线调试接口现场改固件十分方便。下表是我当时在几个候选MCU之间做的简单对比候选型号内核优势劣势最终取舍PIC18F44588位5V逻辑、内置USB、工具链成熟算力一般、无硬件正交解码采用STM32F10332位性能强、外设丰富3.3V需电平转换、现场维护不熟杀鸡用牛刀ATMEGA328P8位资料多无USB、RAM小缺USB不好现场调参2. 硬件电路设计要点2.1 DRV8818外围电路先处理好电源、采样与电流限制DRV8818的电源引脚VM和地之间必须做好储能与去耦。工业环境里电机母线往往来自开关电源距离稍长线感就明显所以我在电路板入口放了100uF电解电容靠近芯片VM脚又放了一颗100nF陶瓷电容用来吸收高频开关电流。电荷泵引脚CP1和CP2之间按数据手册典型值放置0.1uF电容这个电容负责内部高边驱动供电太小会不稳定太大起振都成问题。电流采样是整套电路的核心。DRV8818通过SENSE引脚外接采样电阻配合VREF引脚的参考电压共同决定峰值电流限制。我的设计流程是这样先确定应用需要的额定电流比如电机铭牌标1.5A那电流限制就设在1.5A到1.8A留出余量。采样电阻选0.22Ω功率选1W级别用合金电阻而不是绕线电阻因为绕线电阻的感抗在高频斩波下会带来额外压降。VREF的设定需要做个小计算。假设目标峰值电流ITRIP1.5A采样电阻RS0.22Ω按照部分同类芯片常用的电流限制公式ITRIP VREF / (K × RS)来估算系数K取5左右那么VREF ITRIP × K × RS 1.5 × 5 × 0.22 ≈ 1.65V。这个电压既可以用电阻分压固定生成也可以用PWM加RC滤波动态调整。我最终选择了后者原因后面软件部分会展开。需要强调的是不同批次芯片与不同温度下实际触发电流会有偏差所以我保留了板上一个可调电位器的位置量产调试时用钳形电流表实测电机相电流再微调VREF分压值。2.2 步进模式配置与输出端细节DRV8818的微步进模式由M1、M2两个引脚的逻辑电平组合决定我按数据手册真值表最终选择了1/8细分档位。为什么不选全步或半步全步模式下电机在低速时震动非常明显因为每走一步都是90度电角度的大跳变半步虽然好一些但噪音和共振仍然存在。1/8细分下每个整步被切成8个小步电流波形更接近正弦低速运行明显更平稳。对于大多数工装和机器人应用1/8细分已经足够细腻如果你需要更丝滑的效果可以换用同系列最高支持1/32细分的DRV8825引脚兼容性很好PCB几乎不用大改。输出端AOUT1/AOUT2、BOUT1/BOUT2直接接到电机。在靠近输出端的地方我对地各放了一颗小电容用来抑制电机线缆耦合进来的共模噪声。还有一个容易被忽略的细节ENABLE引脚是低电平有效上电瞬间必须保证它是高电平否则驱动芯片会提前使能电机在系统初始化完成前就可能僵住发出嗡嗡声。我用一颗10k电阻把ENABLE上拉到5V等MCU跑起来再主动拉低。2.3 PIC资源分配与接口连接PIC18F4458的I/O资源很充裕我做了这样的分配STEP信号用RB0输出DIR用RB1ENABLE用RB2M1、M2接RB3和RB4nFAULT接RB5的外部中断引脚另外两个普通IO接限位开关每个限位开关输入都加了RC滤波和施密特整形避免机械触点抖动触发误动作。STEP信号线是整套系统里最容易受干扰的线路之一。工业现场电机线、电源线经常与控制线走在一起如果STEP线上叠了毛刺就相当于多发了脉冲位置就错了。我在MCU的STEP引脚上串了一个330Ω电阻靠近DRV8818一侧对地并一颗100pF电容形成一个简单的低通滤波器。这个阻容参数不是随便选的100pF电容配合330Ω电阻截止频率大约在4.8MHz既能滤掉高频毛刺又不会把正常几十到几百kHz的脉冲信号峰压坏。实际测试下来这个措施让脉冲误触发概率明显下降。2.4 PowerPAD散热焊盘不处理好的话芯片就是暖手宝DRV8818PWPR这个型号后缀里的PWPR指的就是HTSSOP封装带PowerPAD。这个底部焊盘是整套硬件设计中成败的关键我一开始在这上面栽过跟头。第一次打样时我偷懒按普通TSSOP的焊盘去做只焊接了四周的引脚底部PowerPAD没有做有效散热连接结果芯片空载跑几分钟表面就烫得不能用手摸满载更是直接触发热保护。正确处理方法是PCB封装里必须包含底部的大焊盘焊盘上开阵列过孔孔径建议0.3mm间距1mm左右过孔打到背面之后背面的整片铜皮作为散热区。钢网开孔要保证合适的焊料量既不能太少导致虚焊也不能太多导致芯片被顶起。焊接时最好用回流焊手工贴片的话用热风枪配合助焊剂要确保底部焊盘确实吃到锡。判断焊接有没有到位最直接的办法是看芯片满载工作一段时间后的温度如果散热路径通了温升应该在可接受范围内而不是很快烫手。需要特别提醒一点PowerPAD焊盘的电气连接关系要以具体型号的数据手册为准。有的芯片内部将PowerPAD接地有的则要求接特定电位甚至允许悬空。我在设计时专门翻手册确认了这一项没有想当然地直接把焊盘接GND。3. 软件控制逻辑与关键算法3.1 固件整体结构中断只管转脉冲主循环处理通信固件架构我划分得比较清楚中断负责一切和时间强相关的事情主循环只处理不敏感的逻辑。具体来说定时器中断负责翻转STEP引脚和更新步数计数器外部中断负责响应nFAULT故障和限位开关主循环则轮询USB接收缓冲区、解析命令、更新参数、刷新状态信息。这种分工的理由很实际。步进电机的脉冲频率一旦被中断服务程序里的耗时操作拖慢电机会立刻表现出转速不均甚至丢步。我曾经在调试USB时发现电机速度忽快忽慢查到最后是USB协议处理占用时间太长挤占了定时器中断的响应。现在的做法是USB数据只在中断里填充缓冲区协议解析放到主循环彻底解决了这个问题。3.2 细分模式下的步数与位置计算选择1/8细分之后位置数据的计算基准就确定了。一个标准的两相双极步进电机步距角为1.8度也就是200个整步转一圈在1/8细分下每个STEP脉冲对应0.225度转一圈需要1600个脉冲。固件里我用一个有符号32位整数保存位置计数值正方向每收到一个STEP脉冲事件就加1反方向就减1。这个计数值就是后续位置控制和原点回归的核心数据。速度控制的实现也不复杂。设目标速度为每秒脉冲数PPS那么相邻两个STEP脉冲之间的时间就是1/PPS秒。在定时器中断里我需要根据这个时间间隔计算定时器重载值。举个例子如果系统主频48MHz指令周期约83.3ns目标是1000PPS那么脉冲间隔是1ms定时器计数约12000次。把定时器设置为16位模式重载到相应的计数值即可。速度变化时只需要修改定时器重载值。3.3 梯形加减速让电机不丢步的关键如果直接把目标速度一步到位步进电机在高速应用里十有八九会丢步。原因很简单步进电机的输出力矩随转速升高而下降突然从静止跳到1000PPS电机根本反应不过来转子滞后于定子磁场太多就直接失步了。解决方法是引入加减速曲线最常用的是梯形曲线。我的实现思路是这样的设定一个起始速度VS比如200PPS这个速度既不能太低也不能太高——太低意味着第一步的脉冲间隔特别长加速过程拖沓太高会让起步瞬间力矩不足。然后设定加速度a比如4000PPS/s电机从VS开始每走一步速度就按加速度提高一点直到达到目标速度VT。定时器重载值不是线性变化的因为在恒定加速度下速度和时间是线性关系但脉冲间隔时间是速度的倒数所以每次进入中断时要计算当前速度对应的脉冲间隔再换算成定时器重载值。减速过程类似只是从目标速度VT逐渐降到停止速度。为了让梯形曲线对称我在固件里用了一个状态机分成加速段、匀速段、减速段三个阶段。加速段的步数足够多时进入匀速段当剩余步数小于减速所需步数时自动切到减速段。这个什么时候开始减速的判断是梯形加减速里最容易犯错的地方我见过不少实现因为减速点判断太迟直接冲出去丢步。我的做法是提前预判每步更新位置计数时同时计算剩余步数如果剩余步数等于或小于减速距离就立即开始减速。3.4 原点回归与限位处理在机器人或者自动化设备里上电后第一件事通常是回原点。步进电机是开环定位系统断电后位置信息就丢了不回原点就无法知道机械当前到底在什么位置。我的回零流程是上电后以较慢速度向原点方向移动碰到原点限位开关后先不急着停而是继续慢速走一段等离开限位开关再反向找一次直到第二次稳定触发限位才把位置计数值清零。这个二次找零的做法是为了消除限位开关机械触点的重复精度误差。第一次碰到时可能因为速度过快或者弹跳触点位置与真正的机械原点有偏差用低速第二次找零重复精度会高得多。除此之外正负两个方向还要分别设置软件限位一旦位置计数超过允许范围就主动停止发脉冲并向上位机报错防止机构撞到硬限位。3.5 USB CDC通信与自定义协议PIC18F4458自带USB 2.0全速控制器这是它在这个项目里最大的加分项。我用Microchip官方USB CDC框架把设备枚举成虚拟串口PC上一个普通串口软件就能直接收发数据不需要装额外的驱动。对于现场设备来说这意味着调试时只要一根USB线就能在线修改速度、位置、电流等参数比老式设备用拨码开关或电位器调节要方便一个时代。自定义协议我做得尽量简洁。数据帧结构为帧头0xAA 0x55、命令字、数据区、CRC8校验。常用命令包括设置目标速度、设置目标位置、启动归零、查询状态、设置电流档位、读取故障码。状态回复包含当前实际位置、目标速度、限位电平、故障标志和芯片温度估算值。这套协议在后续接入上位机或者PLC时也很好扩展比如增加CAN总线桥接时直接把USB的数据帧映射到CAN报文即可。3.6 动态电流调节与运行状态监控前面提到VREF是通过PWM加RC滤波生成的这给了固件一个很实用的能力运行中动态调整电流。低速大扭矩时把电流设置在额定值保证输出力矩高速时由于反电动势影响电机相电流会自然下降这时适当抬高电流上限可以补偿一部分力矩跌落同时也要注意温升不能让芯片持续工作在极限电流下。监控逻辑放在主循环里周期性地通过ADC读取采样电阻上的电压波形平均值结合VREF设定值估算当前实际负载情况。如果发现电流异常偏高持续一段时间就主动降低PWM占空比回退电流相当于做了一个软件层面的过载保护。这套保护逻辑虽然不能替代芯片的硬件保护但能减少因长期过载导致的老化问题。4. 工业与机器人应用中的工程化处理4.1 典型应用场景从第七轴外部轴到管道爬行器在做这个项目时我参考了几个典型的机器人应用方向。最常见的是一台六轴工业机器人旁边加装一条地轨也就是所谓的外部轴。外部轴多数不需要伺服那么高的动态精度但要求负载能力大、成本可控这时候步进电机加闭环编码器是最划算的方案。类似的还有变位机、转台、自动送料机构本质上都是一个能精确走位置的单轴系统。除了工业机器人我之前接触过的管道爬行器、云台摄像机、小型机械臂也都可以套用这套驱动方案。这些设备的共同特点是主控制器只负责顶层规划和运动学解算把目标位置或速度通过总线发给各个轴控制器轴控制器再独立完成加减速和闭环调节。这和机器人圈里常提到的ROS2框架下高层规划底层执行的层次划分是一个道理只不过我这里做的是最底层执行器这一环。4.2 长距离信号的隔离与布线实战如果控制板与上位机之间的距离比较长或者电机功率较大导致电缆耦合噪声严重那么STEP、DIR信号不能直连必须做隔离。我在一块远程扩展板上用了光耦隔离把上位机PLC发来的脉冲信号隔离后再送入DRV8818的STEP/DIR引脚。光耦建议选高速型的比如6N137这级别普通PC817根本跟不上几十kHz的脉冲频率会直接把脉冲削成方波都算不上的形状。布线上还要注意一点电机线要使用屏蔽双绞线屏蔽层单端接地最好接在驱动器侧的电源地上。控制器到驱动器之间的信号线尽量远离电机线或者走不同的线槽。电源入口处我加了共模电感和磁珠实测能明显减少高频传导干扰。这些看似零散的措施在长期运行稳定性的贡献上比在代码里做任何滤波算法都更直接。4.3 安全回路与故障保护机制DRV8818本身有硬件过流保护和过热保护故障时nFAULT引脚会拉低MCU接这个引脚的IO配置为外部中断下降沿触发。收到故障信号后的第一件事是停止产生STEP脉冲同时把ENABLE引脚置为无效让驱动芯片的输出级进入高阻状态电机完全断电。这个动作必须在中断服务函数里完成不能等主循环慢悠悠地跑。然后把故障码记录到EEPROM同时向上位机发送故障状态。光靠驱动芯片的保护还不够。我还把整个系统的急停回路单独做了硬件处理急停按钮串在24V电机电源和驱动芯片VM引脚之间与任何固件逻辑无关。也就是说不管固件死机还是跑飞只要操作员按下急停电机电源直接断开从物理上保证安全。这个设计在机器人应用中尤其重要因为固件保护永远存在失效的可能而安全回路必须独立于软件存在。4.4 从开环到闭环的扩展路径开环步进系统在负载突变或者高速运行时还是有失步风险这对机器人应用是不可接受的。我的扩展方案是在电机尾部加磁编码器比如AS5047这类TMR角度传感器或者增量编码器配合一根正交解码线。由于PIC18F4458没有硬件QEI正交解码模块我在扩展板方案里选用了一颗LS7366R正交解码计数芯片通过SPI接口读取位置数据。它的内部计数器是32位的溢出概率极低而且可以通过硬件信号线实现位置触发非常契合运动控制场景。加了编码器反馈后固件层面就可以做半闭环每次发完目标步数后读取编码器实际位置与理论位置比较。如果偏差超过一个允许阈值就判定发生了失步立即停止运行并报警。进一步做闭环伺服则需要改造成位置环PID让编码器位置实时跟随目标位置。DRV8818本身没有电流环接口但步进电机可以通过电压占空比调节来近似控制力矩这部分我还在迭代但整体框架已经预留好了。5. 调试实录与常见问题排查5.1 问题一电机嗡嗡响但是不转这是最常见的现象尤其第一次上电时。我先说结论多半是驱动没有真正使能或者电流设置太低。ENABLE低电平有效如果MCU复位期间引脚电平被默认上拉驱动内部是无效状态电机线圈没有走电流但PWM电路已经在工作所以会听到高频嗡声。排查方法按顺序来先用示波器测量ENABLE引脚确认低电平是否稳定再测VREF电压如果目标电流1.5A而VREF只有0.2V那电流太小根本克服不了摩擦力最后测STEP引脚确认脉冲确实在送。还有一个隐蔽的问题STEP脉冲的高电平时间太短低于DRV8818手册要求的最小脉宽芯片可能根本不识别。我在调试时把STEP脉冲宽度放宽到10us这是非常安全的余量实测从未因此出问题。5.2 问题二驱动芯片严重发烫芯片烫到手不能碰大概率不是芯片本身的问题而是PowerPAD散热焊盘虚焊。前面提到HTSSOP封装底部的散热焊盘必须通过过孔阵列把热量导到背面铜皮。我第一次打样时PowerPAD基本没吃到焊料芯片表面温度轻松超过70度重新焊接后同样电流下温度降了差不多20度。排除散热问题后再看电流设置和衰减模式。电流设置得比电机额定高太多芯片自然会烫。衰减模式如果配置不当会导致续流期间电流纹波很大斩波频率变得很低开关损耗剧增。大多数场景下把衰减配置成混合衰减模式都是稳妥的但具体管脚接法要按数据手册来。建议用热电偶或者红外测温枪实测芯片表面温度不要只靠手感至少留20度以上的温升裕量。5.3 问题三高速运行丢步丢步在高速度下最明显表现为咔咔的抖动声电机的实际位置与计数位置逐渐偏离。我的排查结论是三个原因叠加加速度过陡、起步速度过高、电压偏低。最初我设起步速度800PPS加速度拉满结果电机基本每两百步就丢一次改成300PPS起步加速度放缓后问题消失。另一个重要因素是电机母线电压。同样的目标速度12V供电下的高速能力远不如24V。这是因为步进电机的反电动势与转速成正比电源电压越高能维持电流的时间越长高速力矩就越大。如果系统支持尽量把VM电压放到24V甚至更高对高速表现有明显帮助。方向切换时也要注意最好先减速到接近停止再反向直接正转切反转会瞬间需要极大电流极易丢步。5.4 问题四USB设备无法识别PIC18F4458的USB枚举失败最常见的是时钟问题。USB要求48MHz的时钟输入如果外部晶振没接好或者振荡器模式配置错误设备插上电脑就完全没反应。我的排查流程是先不管USB让MCU驱动一个LED闪烁确认主频和固件正常再用示波器测USB D/D-线上是否有枚举时的电平变化最后才考虑固件中USB相关寄存器配置。还有一个容易被忽略的点USB D/D-走线的等长和阻抗。因为是全速USB不像高速USB那样严格但也不能随意拉很长或者绕大圈。ESD保护芯片要加但要注意它的寄生电容不能太大否则会衰减USB信号幅度。我遇到过加了一颗寄生电容过大的保护管导致枚举失败的情况换成低电容型号后就好了。5.5 问题五细分模式下定位精度不稳定1/8细分模式下单步是0.225度理论上定位精度应该很高但实际测量时发现重复定位精度不如整步模式稳定。原因在于微步进的电流波形不会像理论那样完美正弦相邻微步的实际角度并不完全均匀这和电流的衰减模式、采样电阻精度、VREF的纹波都有关系。所以我在项目文档里强调了一个观点细分是为了让运行更平滑而不是为了提高定位精度。如果应用对重复定位精度有硬性要求应该以整步作为定位基准配合机械限位或者编码器反馈。我在固件里特意留了一个参数可以切换运行模式和定位模式定位模式下自动使用整步运行模式使用1/8细分两边兼顾。5.6 常见问题速查表现象可能原因检查方法解决措施电机嗡嗡响不转ENABLE未拉低、VREF过低、STEP脉宽不足示波器测ENABLE/VREF/STEP确认逻辑电平、提高VREF、放宽脉宽芯片过热PowerPAD虚焊、电流过大、衰减不当测温、检查焊盘焊接重新焊接、降低电流、调整衰减高速丢步加速度过陡、起步速度高、电压低逐步降低速度测试缓起缓停、提高VM电压USB无法识别晶振频率异常、USB走线问题、ESD电容过大LED验证、示波器测D/D-检查振荡器配置、优化走线细分定位漂移细分电流波形非理想编码器重复定位测试定位用整步、闭环反馈写在最后这套组合还能走多远如果让我总结这次项目的最大体会那就是每个环节都透明的价值。用DRV8818PWPR和PIC18F4458这套方案电机的电流是怎么限的、加速曲线是什么形状、故障从哪里来每一个细节都能用示波器和源码解释清楚。集成驱动器模块虽然省事但出了问题只能当黑盒处理在工业设备维护里是很被动的。给后来者的建议是第一版固件先别急着上USB协议和加减速曲线用最简的定时器产生固定频率的脉冲通过硬件调试器单步看STEP波形先把电机的方向、使能、电流这几件事彻底跑明白再逐步叠加梯形加减速、位置闭环和上位机通信。这样即使后面出了问题也能快速缩小排查范围。以后想继续扩展的方向我认为有三条路值得走一是加CAN总线把多个轴组成分布式控制网络让PIC18F4458作为CAN节点上层可以直接用CANopen或者自定义协议调度多轴协调运动二是在闭环反馈成熟后把电流环参数也做成可配置让这套板卡能适应不同惯量和不同扭矩特性的机械结构三是把这个轴控制逻辑移植到其他系列MCU或者封装成独立的SPI/UART从机模块嵌入到更大系统里。这个方案的潜力比我最初设想的要大得多。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑