资讯详情

全国大学生电子设计竞赛智能送药小车硬件设计全解析:从CW32主控到K230视觉与3508电机控制

📅 2026/11/3 9:07:09 | 华诺云谱 👁 阅读
全国大学生电子设计竞赛智能送药小车硬件设计全解析:从CW32主控到K230视觉与3508电机控制
1. 项目缘起与整体方案拆解2021年全国大学生电子设计竞赛的赛题里智能送药小车算是当年最有话题度的一道。题目大意是设计一个能自主识别病房号、沿着走廊把药品送到指定房间并返回的小车系统。这个题目看起来是个“小车题”实际上它把嵌入式硬件、电机控制、传感器融合、无线通信全揉在了一起对硬件设计能力的要求相当高。我当年是队里负责硬件和底层驱动的从选型到打板到调参前后折腾了将近两个月踩过的坑比走过的路还多。这篇文章就把硬件部分从头到尾拆一遍包括主控选型、电机驱动、电源架构、无线图传、传感器布局这些核心环节尽量把当时的设计思路和实测经验都写出来给后面要做类似项目的朋友一个能直接抄作业的参考。先说一下这个项目的核心需求。小车要在模拟的医院走廊环境里运行走廊两侧是病房每个病房门口有数字标识。小车需要从药房出发识别目标病房号走到对应房间门口等待取药完成然后原路返回。整个过程要求自主完成不能遥控。这就意味着硬件层面必须解决几个关键问题第一循迹或定位要稳走廊地面通常铺的是白色或浅色地胶黑色引导线是常见方案第二病房号识别要准数字识别可以用摄像头做图像处理也可以用红外对管配合编码标识第三电机控制要精细启停、转弯、微调都需要闭环第四电源要干净且续航够电机启停瞬间的电流冲击很容易把主控拉复位第五无线通信要可靠方便调试和状态回传。我们当时的方案是主控用CW32系列MCU做底层运动控制和传感器采集K230负责视觉识别和无线图传电机用3508无刷电机配合CAN总线驱动循迹用灰度传感器阵列电源用三节18650锂电池组加多路稳压。这个组合在当时算是比较激进的选择CW32是国产新片K230也是刚出不久资料少但性能确实够用。下面我分几个部分详细说。1.1 为什么选CW32而不是STM32很多人第一反应是上STM32F4或者H7毕竟资料多、生态好。我们当时也考虑过但最后选了CW32原因有几个。第一成本。电赛的经费有限一块STM32H7的核心板动辄两三百而CW32F030系列的核心板只要十几块省下来的钱可以多买几个传感器备用。第二供货。2021年那会儿芯片缺货严重STM32的价格被炒上天CW32作为国产替代供货相对稳定。第三性能够用。CW32F030是Cortex-M0内核主频48MHz对于跑电机PID、读灰度传感器、处理串口通信这些任务来说完全够。视觉部分交给K230主控不需要太强的算力。当然选CW32也有代价。最直接的问题就是资料少。官方例程比较基础很多外设的配置需要自己啃参考手册。比如CAN通信的过滤器配置STM32的HAL库有现成的函数CW32得自己算掩码和ID。还有调试工具CW32用的是SWD接口但有些国产下载器兼容性不好我们换了两个才找到稳定的。所以如果你也打算用CW32建议提前把开发环境搭好把GPIO、定时器、串口、CAN这几个外设的例程都跑一遍确认没问题再往下做。1.2 K230在视觉与图传中的角色K230是嘉楠科技出的边缘计算芯片自带NPU能跑轻量级神经网络。我们用它做两件事一是数字识别二是无线图传。数字识别这块最开始想用传统图像处理二值化加轮廓提取但走廊光线变化大阈值不好定后来改成训练一个小的YOLO模型专门识别0到9的数字。K230的NPU跑YOLO11的量化模型帧率能到15帧左右足够用。训练数据是自己拍的每个数字在不同光照下拍几百张标注完大概两千张图训练了四五个小时精度能到95%以上。无线图传这块K230自带WiFi模块可以推RTSP流或者直接传JPEG。我们当时用的是传JPEG的方案每秒钟传5帧上位机用Python接收显示。这样调试的时候能看到小车摄像头的画面方便判断识别有没有问题。不过图传会占带宽如果走廊里WiFi干扰大帧率会掉。后来我们把图传改成按需开启只在调试阶段用比赛时关掉避免影响通信稳定性。1.3 电机选型的纠结3508还是直流减速电机电机这块我们纠结了很久。3508无刷电机是RoboMaster上常用的配套的C620电调支持CAN通信能直接读转速、电流、位置做闭环非常方便。但3508的转速高、扭矩相对小需要配减速箱而且整套下来成本不低。直流减速电机便宜驱动简单但闭环控制需要自己加编码器精度和响应速度都不如3508。最后选3508的原因是控制精度。送药小车在病房门口需要精确停位误差不能超过两厘米。3508配合C620电调转速闭环的稳态误差很小而且CAN通信的实时性好主控能及时拿到反馈。另外3508的机械接口标准方便安装。当然3508也有坑比如CAN通信的波特率要设置对C620默认是1MbpsCW32的CAN配置要匹配。还有电机ID的分配每个电调要单独设置ID不然总线上会冲突。这些细节后面会详细说。2. 硬件架构与核心模块拆解整个小车的硬件架构可以分成五块主控与最小系统、电机驱动与执行机构、电源管理、传感器阵列、无线通信与图传。每一块都有各自的设计要点和踩坑记录我逐个说。2.1 主控最小系统与外围接口分配CW32F030C8T6是48脚封装资源不算多所以引脚分配要提前规划好。我们当时的分配是这样的PA0-PA7接灰度传感器阵列的8路数字输入PA8-PA9做串口1接K230的通信口PA10-PA11做CAN通信接C620电调PA12-PA15和PB0-PB3做电机方向控制和使能PB4-PB7做OLED显示和按键输入PB8-PB9做I2C接陀螺仪PB10-PB11做串口2接蓝牙模块用于调试。剩下的引脚做备用和下载口。这里有个细节要注意CAN通信的引脚要配置成复用推挽输出而且外部要接120欧姆的终端电阻。我们最开始没接通信时好时坏后来在总线两端各加了一个120欧姆电阻就稳定了。还有串口通信的电平K230是3.3V电平CW32也是3.3V可以直接连但如果是5V的设备就要加电平转换。最小系统的晶振我们用的是8MHz无源晶振配合内部PLL倍频到48MHz。CW32的时钟树配置比STM32简单一些但也要注意启动时间晶振的负载电容要匹配不然起振慢或者不起振。我们用的是20pF的电容实测起振时间在5ms左右没问题。2.2 电机驱动3508与C620的CAN总线配置3508电机配C620电调接线很简单电源正负极、CAN_H、CAN_L。但配置有几个关键点。第一电调ID。每个C620出厂默认ID是1如果总线上挂多个电调必须改ID。改ID的方法是用C620的调试板通过USB转CAN连接到电脑用官方软件改。我们当时四个电机ID分别设成1、2、3、4。第二波特率。C620的CAN波特率是1MbpsCW32的CAN配置要设成一样的。CW32的CAN波特率计算是波特率 PCLK / (BRP * (1 BS1 BS2))其中PCLK是APB时钟我们设的是48MHzBRP设成3BS1设成12BS2设成3算下来是48M / (3 * (1 12 3)) 1Mbps正好。第三报文格式。C620接收的CAN报文ID是0x200加上电调ID数据是8字节前两个字节是电流值的高八位和低八位范围是-16384到16384对应-20A到20A。发送频率建议1kHz太低了响应慢太高了总线负载大。我们当时遇到一个坑电机能收到数据但不转。排查了半天发现是使能信号没发。C620需要先发送一个使能报文或者通过CAN发送电流值后自动使能但有些固件版本需要显式使能。后来我们在初始化的时候先发一帧全零的电流报文再发正常的电流值电机就转了。还有一个坑是电源电压C620的输入电压范围是12V到24V我们用的三节18650串联是11.1V满电12.6V接近下限电机大扭矩的时候会掉压导致电调重启。后来换成四节18650串联14.8V就稳定了。2.3 电源管理多路稳压与电流冲击抑制电源是整个系统里最容易出问题的地方。电机启停的瞬间电流能到十几安培如果和主控共用一路电源主控很容易复位。我们的方案是双路电源一路是电池直接给电机电调另一路是电池经过DC-DC降压后给主控和传感器。这样电机的大电流不会影响到主控。具体来说电池组是四节18650串联标称14.8V满电16.8V。电机电调直接接电池中间加一个大容量电解电容1000uF以上用来吸收电机启停的电流尖峰。主控这边用MP1584降压模块输入16.8V输出5V再经过AMS1117-3.3降到3.3V给主控和传感器。MP1584的最大输出电流是3A够用。但要注意散热MP1584在压差大的时候发热厉害我们加了一个小散热片实测温度在50度左右可以接受。还有一个细节是电源监测。我们用了一个电阻分压网络把电池电压降到3.3V以内接到CW32的ADC引脚实时监测电池电压。当电压低于13V的时候OLED上显示低电量警告提醒换电池。这个功能在调试的时候很有用避免因为电池没电导致的各种奇怪问题。2.4 传感器阵列灰度循迹与陀螺仪循迹用的是8路灰度传感器阵列型号是TCRT5000输出数字信号。每个传感器有红外发射和接收管遇到黑色线反射弱输出高电平白色地面反射强输出低电平。8路传感器一字排开间距1.5厘米覆盖12厘米左右的宽度。循迹算法用的是加权平均法每个传感器有一个权重比如最左边是-7最右边是7中间是0根据哪些传感器检测到黑线算加权平均值得到偏差再送给PID控制器调整电机转速。这里有个坑环境光干扰。走廊的灯光如果是日光灯会有50Hz的闪烁影响灰度传感器的读数。我们最开始没注意小车在灯下走的时候会抖。后来在传感器上方加了一个遮光罩用黑色热缩管套住只留底部开口问题就解决了。还有地面反光有些地胶很亮白色地面的反射光太强传感器会误判。我们调了传感器的灵敏度电位器把阈值调高一些让黑色和白色的区分更明显。陀螺仪用的是MPU6050I2C接口读三轴加速度和角速度。主要用来做转向角度积分辅助循迹。比如小车需要转90度弯的时候光靠灰度传感器容易转过头加上陀螺仪的角速度积分能更准确地控制转向角度。MPU6050的零漂比较严重我们用了简单的卡尔曼滤波把加速度计和陀螺仪的数据融合角度估计能稳定在1度以内。2.5 无线通信与图传的硬件选型无线通信我们用了两个模块蓝牙HC-05和WiFi图传。蓝牙用来传调试信息比如当前速度、偏差、电池电压上位机用串口助手接收。HC-05配置成从机模式波特率115200配对密码默认1234。WiFi图传用的是K230自带的模块推JPEG流上位机用Python的OpenCV接收显示。这里有个带宽的问题。WiFi图传如果分辨率太高延迟会很大。我们最开始用640x480延迟有200ms以上后来降到320x240延迟降到80ms左右基本能接受。还有信道干扰走廊里如果有很多WiFi图传会卡。我们后来把图传改成按需开启只在调试的时候开比赛的时候关掉避免影响CAN通信的实时性。3. 实操过程与核心环节实现硬件设计完了接下来是打板、焊接、调试。这部分我按时间顺序说把每个环节的关键操作和注意事项都列出来。3.1 原理图设计与PCB布局要点原理图设计用的是立创EDA免费而且元件库全。设计的时候有几个要点。第一电源部分要加TVS二极管防止电机反电动势打坏主控。我们用的是SMBJ15A钳位电压24V响应时间1ps能有效吸收尖峰。第二CAN总线要加共模电感抑制共模干扰。我们用的是ACM3225100欧姆100MHz效果不错。第三晶振要靠近主控走线尽量短下面不要走其他信号线避免干扰。第四去耦电容每个电源引脚都要加0.1uF的陶瓷电容尽量靠近引脚。PCB布局的时候电机驱动部分和主控部分要分开中间用地平面隔开。电机的大电流走线要粗至少2mm宽或者用铺铜。主控的走线可以细一些0.3mm就行。晶振下面要挖空不要铺铜减少寄生电容。CAN总线的走线要等长差分阻抗控制在120欧姆左右。我们当时没注意等长通信误码率有点高后来重新布线把CAN_H和CAN_L的长度差控制在5mm以内就稳定了。3.2 焊接与组装从贴片到整机焊接这块贴片元件用热风枪吹温度设300度风速中等。先焊主控和电源芯片再焊阻容。CAN收发器和电机驱动接口最后焊避免焊接的时候静电打坏。焊接完了先用万用表测电源和地有没有短路确认没问题再上电。组装的时候电机用金属支架固定在底盘上联轴器要拧紧不然会打滑。灰度传感器装在车头离地1厘米左右太高了灵敏度不够太低了容易刮地。K230摄像头装在车头中间高度20厘米左右视角覆盖前方1.5米。电池放在车尾平衡重心。主控板放在中间方便接线。3.3 电机闭环调试从开环到PID电机调试是硬件里最耗时间的部分。我们分三步走。第一步开环测试。给电机发固定的电流值看轮子转不转转速大概多少。这一步主要是确认CAN通信正常电机ID没冲突。第二步速度闭环。用C620的转速反馈做PID控制。PID参数先调P再调I最后调D。P太大电机会震荡太小响应慢。我们最后用的参数是P8I0.5D0.2转速稳态误差在5rpm以内。第三步位置闭环。用C620的位置反馈做位置控制。位置环的P设成2I0D0因为位置环不需要积分不然会超调。位置控制的精度能到0.1度足够用。这里有个常见问题电机能收到数据但不转。排查思路是这样的先确认CAN通信正常用示波器看CAN_H和CAN_L的波形有没有差分信号。然后确认电调ID和报文ID匹配用CAN分析仪抓包看主控发的ID和电调期望的ID是不是一样。最后确认使能信号有些电调需要先发一帧零电流报文使能再发正常电流。我们当时就是卡在使能这一步折腾了一下午。3.4 循迹与数字识别的联调循迹和数字识别是联调的。小车先循迹走到病房门口然后停下来K230拍照识别数字如果数字匹配就等待取药然后返回。这里的关键是停车位置要准。我们用灰度传感器的全黑状态判断到达横线然后电机刹车位置误差在1厘米以内。K230拍照后用YOLO模型识别数字识别结果通过串口发给CW32CW32判断是否匹配。联调的时候遇到一个时序问题小车停下来后K230需要时间拍照和识别大概200ms。如果CW32等太久小车会抖。后来我们在CW32里加了一个状态机停车后进入等待状态收到K230的识别结果后再决定下一步。这样就不会抖了。4. 常见问题与排查技巧实录硬件调试过程中遇到的问题五花八门我整理了一个速查表把典型问题和解决方法列出来方便对照排查。问题现象可能原因排查方法解决方法电机能收到数据但不转使能信号未发用CAN分析仪抓包先发一帧零电流报文使能CAN通信时好时坏终端电阻未接测总线电阻两端各加120欧姆电阻主控频繁复位电机电流冲击示波器看电源波形电机和主控分开供电加电解电容灰度传感器抖动环境光干扰遮光后测试加遮光罩调灵敏度陀螺仪零漂严重温度变化静止时读数据卡尔曼滤波温度补偿图传延迟大分辨率太高降分辨率测试降到320x240按需开启电池续航短电机效率低测电流换高效率电机减轻重量数字识别率低训练数据少增加样本每个数字拍500张以上数据增强除了表格里的还有几个独家避坑技巧。第一电源监测一定要做电池电压低于13V的时候电机扭矩会下降循迹会跑偏提前换电池能避免很多奇怪问题。第二CAN总线的地线要单独走不要和电机的地线混在一起不然干扰很大。第三K230的散热要注意跑YOLO的时候芯片温度能到70度加个散热片不然会降频。第四灰度传感器的间距要匹配黑线宽度黑线一般2厘米宽传感器间距1.5厘米这样至少有一个传感器能检测到黑线。还有一个调试技巧用蓝牙模块实时传数据到上位机用串口示波器看波形。我们当时用的是一个叫**VOFA**的上位机能同时显示多路数据调PID的时候非常方便。比如看电机的转速反馈和设定值能直观地看到超调和震荡调参数的时候心里有数。5. 硬件设计的经验与后续扩展这个项目做完我对嵌入式硬件设计有了几个比较深的体会。第一电源设计是基础电源不稳后面全是坑。电机和主控一定要分开供电大电容一定要加TVS一定要有。第二通信协议要统一CAN的波特率、报文ID、数据格式提前定好不然后面改起来很麻烦。第三调试工具要趁手CAN分析仪、示波器、逻辑分析仪有条件的都备上能省很多时间。第四资料要提前查CW32和K230的资料少提前把例程跑通把坑踩完后面就顺了。后续如果要扩展有几个方向。一是加超声波或激光雷达做避障走廊里如果有人走动小车能自动绕开。二是加IMU做里程计结合编码器做更精确的定位。三是换更好的电机比如Maxwell电机效率更高扭矩更大。四是优化图传用H.264硬编码降低带宽提高帧率。这些方向都值得试试但前提是先把基础功能做稳。最后分享一个小技巧PCB打板的时候多打几块备用焊接的时候容易焊坏有备用板子不耽误进度。还有元件多买一些尤其是阻容和接插件丢了或者坏了能马上换。电赛的时间很紧提前准备能省很多事。
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑