基于STM32与PWM的二维机械臂精准控制与多模式交互实现

双自由度机械臂的嵌入式控制原理与STM32实现 机械臂控制是机电一体化系统的核心实践,其本质在于将物理空间运动约束映射为微控制器可执行的实时信号。从基础概念看,自由度(DOF)决定了机构的空间操作能力;在原理层面,双自由度结构通过正向运动学实现二维平面内的末端位姿解算,依赖舵机PWM脉宽调制实现角度精控。该技术具备低硬件开销、高确定性响应等工程价值,广泛适用于教育平台、轻量级自动化抓取及ROS底层执行器开发。本文聚焦双自由度机械臂这一典型入门构型,结合SG90舵机驱动特性与STM32F103C8T6的TIMx PWM配置要点,详解如何构建稳定可靠的嵌入式 阅读详情

1. 项目概述与核心思路

大家好,今天我想和大家分享一个非常实用的STM32项目——如何用STM32的PWM功能精准控制一个二维机械臂,并且实现摇杆控制和上位机控制两种模式。我自己在做这个项目的过程中踩了不少坑,也积累了一些经验,希望通过这篇文章能帮助大家少走弯路。

这个项目的核心思路其实很简单:我们使用STM32的定时器生成PWM信号来控制舵机,通过数学建模计算出机械臂末端要达到指定坐标时各个关节应该转动的角度,然后结合AD转换读取摇杆信号,再加上串口通信实现上位机控制。最终实现的效果就是,你可以用摇杆实时控制机械臂的运动,也可以通过电脑发送指令让机械臂自动移动到指定位置。

我选择的是STM32F103C8T6这款芯片,也就是我们常说的"蓝色药丸",因为它价格便宜、功能强大,而且资料丰富,非常适合初学者使用。机械臂结构方面,我用了两个舵机(MG996和MG90S)来实现二维平面的运动,再加上一个舵机控制电磁铁的升降,这样就可以实现抓取功能了。

2. 硬件搭建与电路设计

2.1 元器件选择与电源管理

在做这个项目时,元器件的选择真的很重要。我最初用的电源模块功率不够,导致舵机在运动时会出现电压跌落,机械臂就会抖动。后来换了一个DC电源模块,可以同时输出3.3V、5V和12V,问题就解决了。

关键元器件清单:

  • STM32F103C8T6最小系统板 x1
  • MG996舵机 x2(用于机械臂关节)
  • MG90S舵机 x1(用于电磁铁升降)
  • PS2摇杆模块 x1
  • 12V电磁铁 x1
  • 3.3V继电器 x1
  • 12V锂电池 x1
  • DC电源模块(多路输出)x1

电源部分要特别注意:STM32需要3.3V供电,舵机需要5V,电磁铁需要12V。我建议用锂电池接DC电源模块,然后分别给各个部分供电。千万不要尝试用STM32的GPIO直接给舵机供电,那样肯定会烧芯片的!

2.2 电路连接细节

接线时我建议先用面包板做原型,确认一切正常后再焊接。STM32的引脚分配很重要,我的是这样安排的:

PWM输出引脚:

  • PA1 - TIM2_CH2 - 控制第一个关节舵机
  • PA2 - TIM2_CH3 - 控制第二个关节舵机
  • PA3 - TIM2_CH4 - 控制电磁铁升降舵机

AD转换引脚:

  • PA6 - ADC1_CH6 - 读取摇杆X轴
  • PA7 - ADC1_CH7 - 读取摇杆Y轴

串口通信:

  • PA9 - USART1_TX
  • PA10 - USART1_RX

继电器控制:

  • PB12 - 控制电磁铁开关

实际接线时,舵机的信号线(一般是橙色或白色)接STM32的PWM输出引脚,电源正极接5V,负极接地。摇杆模块的X、Y输出分别接PA6和PA7,电源接3.3V。电磁铁通过继电器控制,继电器线圈用3.3V驱动,触点端控制12V电磁铁。

3. 位置解算算法实现

3.1 数学模型建立

要让机械臂末端到达指定的(x,y)坐标,我们需要知道两个舵机应该转动的角度。这就用到了逆运动学算法。我把机械臂简化成了两个连杆:L1是第一个关节到第二个关节的长度,L2是第二个关节到末端的长度。

在我的项目中,L1=9.6cm,L2=11.0cm。根据三角几何关系,我们可以推导出角度计算公式:

// 计算末端到原点的距离
L = sqrt(x*x + y*y);

// 使用余弦定理计算角度
Ib = (L1*L1 + L*L - L2*L2) / (2*L1*L);
Ic = (L*L + L2*L2 - L1*L1) / (2*L*L2);

a = atan2(y, x);  // 基础角度
b = acos(Ib);     // 第一个关节角度
c = acos(Ic);     // 第二个关节角度

Angle1 = a - b;   // 最终第一个关节角度
Angle2 = b + c;   // 最终第二个关节角度

这里有个特殊情况需要处理:当机械臂完全伸直时(L1+L2 = L),上面的公式会出现除零错误,需要单独处理。

3.2 算法验证与调试

我强烈建议先在电脑上验证算法再写到STM32中。我用Visual Studio写了一个测试程序,输入坐标计算出角度,然后再用这些角度计算回坐标,看是否一致。

// 验证函数
C_AStruct Check_Angle(float Angle1, float Angle2)
{
    C_AStruct result;
    // 将角度转换为弧度
    float rad1 
STM32电位器与舵机联动:打造可编程示教机械臂 本文详细介绍了如何利用STM32微控制器实现电位器与舵机的联动,打造可编程示教机械臂。通过硬件选型、电路设计、软件编程及功能扩展,展示了从手动操控到智能示教的完整实现过程。重点解析了PWM控制、动作记录与回放等关键技术,并提供了实用的调试经验和性能优化技巧,适用于教育、工业及智能家居等多个领域。 阅读详情

相关推荐

用STM32F103和电位器DIY一个会“记忆”的机械臂:从ADC采集到PWM控制的保姆级教程

本文详细介绍了如何利用STM32F103开发板和电位器DIY一个具有记忆功能的机械臂,从ADC采集到PWM控制的完整实现过程。通过保姆级教程,读者可以学习到硬件设计、软件架构、记忆功能实现及系统优化等关键技术,适用于创客和自动化爱好者。

weixin_33719619的博客 499

从零到一:基于STM32与OpenCV的智能物料搬运机械臂实战开发

本文详细介绍了基于STM32与OpenCV的智能物料搬运机械臂开发全流程,涵盖硬件选型、视觉识别、运动控制及系统优化等关键环节。通过实战案例解析如何实现精准抓取与高效搬运,特别针对STM32F407的硬件控制优化和OpenCV的多特征融合检测技术进行深入探讨,为工业自动化应用提供可靠解决方案。

weixin_28278377的博客 268

从零搭建低成本桌面机械臂:Arduino与舵机协同控制实践

舵机作为机器人关节的核心执行器,通过PWM信号实现精确角度控制,其工作原理基于脉冲宽度与旋转位置的线性映射。在机器人学中,多自由度系统的协调运动依赖于逆运动学算法,该算法将末端执行器的空间坐标转换为各关节的角度指令,是实现机械臂指哪打哪的关键技术。对于快速原型开发,Arduino UNO凭借其成熟的舵机控制库和丰富的社区资源,成为入门级机器人项目的理想控制器。结合SG90和MG996R舵机的特性搭配,可以平衡扭矩、精度与成本,适用于桌面级抓取、搬运等轻量级自动化场景。本文通过一个完整的机械臂搭建实例,详细阐

weixin_34354945的博客 394

给STM32机械臂加上‘记忆’功能:手把手教你用外部中断实现动作录制与回放

本文详细介绍了如何为STM32机械臂添加‘记忆’功能,通过外部中断实现动作录制与回放。从硬件选型到中断系统设计,再到数据采集与存储机制,手把手教你打造完整的动作录制系统。文章还提供了动作回放优化方案和系统扩展功能,帮助开发者提升机械臂的智能化水平。

weixin_30383279的博客 126

智能追踪新篇章:OpenMV与STM32的PID云台实战

本文详细介绍了OpenMV与STM32的协同应用,通过PID算法实现高精度云台追踪系统。OpenMV作为视觉传感器识别目标坐标,STM32作为控制器处理数据并驱动舵机,完成自动追踪功能。项目涵盖硬件连接、软件实现和参数整定,适合嵌入式视觉与自动控制入门。

h9j8k7l6m5n的博客 813

【花雕学编程】Arduino FOC 之二维平面机械臂轨迹跟踪

在Arduino平台上实现FOC可以提供平滑的运行和高度的扭矩、速度和位置控制,它通过精确控制电机的电流和电压来实现高效率、高精度和低噪声的操作。5、创新:Arduino可以让你用电子的方式来表达你的创意和想象,你可以用Arduino来制作各种有趣和有用的项目,如机器人、智能家居、艺术装置等。1、高性能电机控制:FOC是一种高级的电机控制算法,可以精准控制PMSM(永磁同步电机)和BLDC(无刷直流)电机,实现平滑的转速和扭矩输出。在各个运动示例中,通过延迟控制了机械臂的运动速度,确保运动过程的平滑性。

雕爷学编程 978

STM32与OpenMV视觉机械臂:从颜色识别到精准抓取全流程解析

机器视觉是赋予机器“感知”能力的关键技术,其核心原理是通过图像传感器获取环境信息,并利用算法进行处理与识别。在嵌入式与自动化领域,这项技术的价值在于实现设备的智能感知与自主决策,广泛应用于工业分拣、自动化装配、服务机器人等场景。本文聚焦于一个典型的工程实践案例:基于STM32微控制器与OpenMV摄像头模组构建的六轴视觉机械臂系统。该系统通过串口通信协议实现视觉感知与运动控制的解耦,其中涉及的关键技术点包括颜色识别算法、图像坐标到世界坐标的转换(坐标映射),以及机械臂的逆运动学解算。通过剖析这一集成项目,可

weixin_30872577的博客 304

STM32四轴机械臂调试代码:PWM驱动、逆运动学与RTOS任务架构详解

在嵌入式机械臂开发中,舵机控制与运动学解算往往是两个最基础也最关键的环节。舵机的PWM占空比映射决定了关节能否精准定位,而逆运动学解算则负责将末端坐标转换为各关节角度。STM32凭借FPU与丰富的定时器资源,能高效完成浮点运算和多路PWM输出,配合FreeRTOS的任务调度,可实现串口指令解析、角度插补与状态监控的并行处理。这种软硬件结合的设计,不仅让桌面级四轴机械臂具备可重复的轨迹执行能力,也为后续扩展五轴或加入轨迹预计算提供了清晰的工程框架。本文围绕一套STM32四轴机械臂调试代码,解析其从底层PWM映

weixin_29159127的博客 301

STM32+OpenMV视觉机械臂:从颜色识别到运动控制的嵌入式实战

机器视觉是赋予机器感知环境能力的关键技术,其核心原理是通过图像传感器采集信息,并利用算法提取特征、识别目标。这项技术为自动化系统带来了“眼睛”,其核心价值在于实现精准的定位、识别与引导,广泛应用于工业分拣、质量检测、服务机器人等领域。本文聚焦于一个典型的嵌入式机器视觉应用场景:基于OpenMV摄像头模块的颜色识别与STM32微控制器的六轴机械臂运动控制。通过剖析视觉引导机械臂的系统架构,深入讲解了如何利用OpenMV进行鲁棒的颜色阈值设定与图像预处理,以及如何通过自定义串口通信协议实现与STM32的稳定数据

weixin_29168813的博客 230

STM32智能分拣小车:颜色识别、五路循迹与机械臂抓取综合实践

嵌入式系统开发的核心在于实现感知、决策与执行的闭环控制。其原理是通过微控制器采集传感器数据,经过算法处理,最终驱动执行机构完成特定任务。这项技术的价值在于将软件算法与硬件电路紧密结合,构建出能自主交互的智能体,是自动化与机器人领域的基础。在工业自动化、智能物流及教育实训等场景中,基于微控制器的运动控制与机器视觉集成应用广泛。本文聚焦于STM32平台,深入探讨如何综合运用颜色传感器进行目标识别,并结合五路循迹传感器实现精准导航,最终通过舵机机械臂完成抓取任务,为构建完整的嵌入式智能系统提供实践参考。

weixin_34262482的博客 1162

STM32F103二维云台PWM精准控制实战:TIM2+TIM3同步方案

舵机控制本质是高精度PWM时序系统,其核心在于周期绝对稳定与占空比线性可调——这直接决定角度重复精度和动态响应。STM32F103的定时器资源需严格匹配RC伺服协议(20ms周期、0.5~2.5ms脉宽),而TIM2与TIM3协同架构可实现纳秒级相位同步,规避TIM1硬件限制导致的异步抖动。结合电源滤波、地线单点设计及IO驱动优化,能将SG90/MG996R舵机控制误差压缩至±0.8°以内。该方案适用于嵌入式新手快速落地二维云台,也支撑工业级稳定运行需求。

weixin_29185493的博客 241

STM32F103二维云台设计:从PWM控制到平滑算法的完整实现

舵机控制是嵌入式系统和机器人领域的基础技术,其核心原理是通过PWM信号精确控制电机转动角度。在工程实践中,为实现更复杂的指向功能,常需将多个舵机组合成多自由度云台。本文聚焦于二维云台系统,深入探讨了其硬件设计与控制逻辑。针对舵机同时动作时常见的电源抖动问题,提出了分路供电与电容储能的解决方案,有效提升了系统稳定性。在软件层面,通过引入线性插值等平滑运动算法,解决了舵机直接阶跃响应带来的抖动问题,使云台转动更为柔顺。这些技术对于目标追踪、摄像头稳像等应用场景具有重要价值,为基于STM32的嵌入式运动控制项目提

weixin_34364071的博客 375

Camera ITS测试

一、手机端设置: 将 CtsVerifier.apk 安装到设备上, 连接上linux主机。 二、主机端设置: 基础:CTS测试运行环境 然后,主机安装python2.7,及numpy/scipy/matplotlib/opencv 栈和 python 成像库。按照下面的命令依次安装: sudo apt­-get install python-­numpy sudo apt-­g...

wangubuntu的专栏 7784

地震勘探原理---地震预处理

3.1 为什么说要对数据进行振幅补偿?具体来说,地震波在传播过程中会遇到各种各样的地质条件,例如不同的岩层、土壤、水层等,这些介质的密度、速度等特性不同,因而对地震波的能量消耗也有所不同。在传播距离较远的情况下,能量损失可能会导致接收到的地震信号振幅变小。相反,在传播距离较近的情况下,能量损失可能较小,导致接收到的地震信号振幅变大。如果不对数据进行振幅补偿,这种振幅不均衡会导致地震数据分析和解释的误差和不确定性增加,可能产生错误的结论。

DARRENANJIAN的博客 3272

飞腾D2000 BIOS编译避坑指南:PCIE拆分、S3电源与过温保护配置详解

本文详细解析飞腾D2000 BIOS编译中的关键配置技巧,包括PCIE拆分模式优化、S3电源管理适配及过温保护设置。通过实战案例和参数调优建议,帮助开发者规避常见陷阱,充分发挥国产高性能计算平台的硬件潜力。特别针对BIOS编译过程中的隐蔽问题提供解决方案。

weixin_33704234的博客 534

GPS数据处理必备:IGS精密星历下载与使用全攻略(附武汉大学/CDDIS/CODE/GFZ地址)

本文为GPS/GNSS数据处理者提供了IGS精密星历的完整下载与使用指南。详细解析了最终、快速、超快速三种精密星历产品的区别与选择策略,并手把手教学如何从武汉大学、CDDIS、CODE、GFZ四大主流数据中心高效获取数据,涵盖文件命名规则解析及自动化下载脚本,助力科研与工程应用。

weixin_29234239的博客 679

C#上位机实战:手把手搭智慧工业数字孪生系统,从设备建模到实时联动全落地

字段长度(字节)说明起始标识2固定为0xAA55,用于判断数据包开始设备ID4唯一标识设备(比如1001代表电机1)数据类型10=布尔(启停),1=浮点数(转速/温度)数据长度4数据字节数(布尔1字节,浮点数4字节)数据内容N实际数据(按数据长度读取)校验位1前面所有字节的异或校验,防止数据篡改结束标识2固定为0x55AA,用于判断数据包结束。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 967

uniapp [全端兼容] - 实现接入使用天地图及卫星视图切换功能,在国家天地图上自由切换地图显示类型(卫星视图/地形视图/卫星混合/地形混合/普通视图)天地图切换视图显示改成卫星风格,切换地图图层

uni-app,h5移动端网页,微信小程序,支付宝小程序,Android安卓,苹果ios,app,nvue,天地图,视图,卫星,地图类型切换,uniAPP天地图,改成卫星视角,在线地图切换,来回切换卫星图,天地图如何实现来回切换卫星图,地形图,卫星视图,VUE3引入天地图卫星版,详细教程示例源码代码,天地图切换卫星用什么api,卫星视角API方法,vue3卫星天地图,能改地图的显示方式,vue3中使用天地图自定义样式切换地图图层,切换报错,加载出错,卫星图太卡,地图图层更换,vue3安装集成天地图详细示例源

🏆 前端领域优质创作者 1万+

Midscene.js(3):手把手教你用 YAML 脚本实现 AI 驱动的 Web UI 自动化「喂饭教程」

Midscene.js是一款开源的AI驱动UI自动化工具,通过自然语言描述即可控制浏览器或Android设备执行操作。它支持YAML脚本编写测试用例,降低了自动化测试门槛。

blues_C的博客 3241

Qt代码-无人机地面站系统

无人机地面站系统是无人机与操作员交互的核心枢纽,需实现**无人机状态监控**(位置、姿态、电池等)、**实时通信**(基于MAVLink协议)、**任务规划**(航点编辑、航线生成)、**地图显示**(无人机位置与航迹)、**参数配置**(传感器校准、飞行模式设置)等核心功能。地面站作为`MAV_COMP_ID_GCS`(地面控制站组件ID=255),无人机通常为`MAV_COMP_ID_AUTOPILOT1`(组件ID=1)。// 航点/盘旋指令。// 北京坐标(示例)

寒寒豆豆软件公司的博客 320

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

上一篇: 模块化供电的艺术:TB6612驱动电路与系统电源架构的协同设计
下一篇: 从零构建嵌入式启动镜像:揭秘Boot.bin背后的组件协作与PMU固件关键作用
lambda
博客等级 码龄23年 49粉丝 1303原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值