cubemx stm32 pca9685pw模块 16路PWM 可用于舵机驱动 驱动代码

硬PWM与软PWM:语音模块控制舵机的稳定之道 PWM(脉宽调制)是嵌入式控制中常用的模拟信号输出方式,通过改变脉冲宽度控制舵机、电机等执行器。根据波形生成机制,PWM分为硬PWM与软PWM:前者由定时器硬件产生,时序精确且不占CPU;后者依赖GPIO翻转和软件延时,灵活但易受任务调度影响。在语音模块控制场景中,软PWM的脉宽抖动常导致舵机抖动、角度不准甚至系统复位,而硬PWM凭借微秒级稳定性和多通道扩展能力,成为机械臂、仿生手等项目的首选。STM32、ESP32等主控的硬件定时器可输出多路稳定PWM,配合PCA9685驱动板进一步扩展通道。理解硬PWM 阅读详情
AI摘要

PCA9685是一个I2C控制的16通道PWM模块,适用于舵机和其他需要PWM控制的设备。该模块具有12位分辨率,支持统一频率设置,但每个通道的占空比可独立调整。PCA9685的地址包括R/W位,需注意读写操作的不同地址。硬件连接涉及OE、SDA、SCL等引脚,软件部分提供了初始化、设置PWM频率和占空比的函数。适于对舵机精度要求不高的场景。

资料

淘宝链接请点这里
淘宝资料资料:
链接:https://pan.baidu.com/s/1Kda-c7QdZdQ03FBMa0zeRA
提取码:1234

pca9685pw介绍

这个模块是 I2C 通信控制 16 路 PWM 的模块。
所有路的 频率 是统一设置的,所以每一路的频率都一样,但是每一路可以设置不同的占空比。

  1. PCA9685的分辨率是12位,即占空比控制时,0-4096对应的占空比为0-100,在控制舵机的时候,控制信号是0.5ms-2.5ms,周期 20ms,所以控制舵机角度不会有太高的分辨率,对舵机控制精度较高的地方不建议使用。
  2. PCA9685地址位和很多描述的不一样,根据芯片手册,地址位的寄存器一共 8 位,其中最高位固定是1,A0-A5这六位是用户可更改的,而其中最关键的一位是 R/W 位,这一位主要是决定了读还是写,置1时为读,置0时为写,所以我们在写程序的时候,PCA9685 的地址应把 R/W位加上,是 0x80,而不是 0x40,在写的时候,发送地址位是 0x80,在读的时候,发送的地址位是0x81。

iic地址

硬件

硬件连接

  • OE,低电平有效输出使能。
  • SDA,I2C 的 SDA 引脚。
  • SCL,I2C 的 SCL 引脚。
  • V+,接入 5V 电源,若是驱动的 16 路全是舵机,这个电源的电流就要求很大了(不晓得这个模块到底能不能承受这么多舵机的电流)。
  • VCC,单片机 3V3 电源。
  • GND,对于 V+ 的地平面。

原理图截屏如下:
pca9685pw模块原理图

软件编写

pca9685pw.c

#include "pca9685pw.h"
#include <math.h>
#include <stdio.h>

#define min(_X_, _Y_)	(_X_>=_Y_?_Y_:_X_)

static uint8_t read16(uint8_t addr);
static void write16(uint8_t addr, uint8_t d);


// 设置为true可打印一些调试消息,设置为false可禁用这些消息。
#define ENABLE_DEBUG_OUTPUT false

// 初始化。频率,转动角度(0~360)
void pca9685_init(float hz, uint16_t angle)
{
	uint32_t off = 0;
	// 这一步很关键,如果没有这一步PCA9685就不会正常工作。
	pca9685_reset();
	
	write16(PCA9685_MODE1,0x00);
	pca9685_setPWMFreq(hz);
	off = (uint32_t)(102.4+angle*1.14);
	
	pca9685_setPWM(0,0,off);
	pca9685_setPWM(1,0,off);
	pca9685_setPWM(2,0,off);
	pca9685_setPWM(3,0,off);
	pca9685_setPWM(4,0,off);
	pca9685_setPWM(5,0,off);
	pca9685_setPWM(6,0,off);
	pca9685_setPWM(7,0,off);
	pca9685_setPWM(8,0,off);
	pca9685_setPWM(9,0,off);
	pca9685_setPWM(10,0,off);
	pca9685_setPWM(11,0,off);
	pca9685_setPWM(12,0,off);
	pca9685_setPWM(13,0,off);
	pca9685_setPWM(14,0,off);
	pca9685_setPWM(15,0,off);
	
	HAL_Delay(100);
}

// 软件复位
void pca9685_reset(void)
{
	write16(PCA9685_MODE1, 0x0);
}

// 设置PCA9685的输出频率,
// PCA9685的16路PWM输出频率是一致的,
// 所以是不能实现不同引脚不同频率的。
void pca9685_setPWMFreq(float freq)
{
	//printf("Attempting to set freq ");
	//printf(freq);
	// 输出周期实际是有误差的,对于20ms(50Hz)的周期来说这里乘个0.94为20ms
	// 可以用示波器观看调试
	freq *= 0.942;
	double prescaleval = 25000000;
	prescaleval /= 4096;
	prescaleval /= freq;
	prescaleval -= 1;

	if (ENABLE_DEBUG_OUTPUT)
	{
		printf("Estimated pre-scale: %f\r\n", prescaleval);
	}
	// floor()总是返回小于等于一个给定数字的最大整数。
	// 这里是四舍五入
	uint8_t prescale = floor(prescaleval + 0.5);
	
	if (ENABLE_DEBUG_OUTPUT)
	{
		printf("Final pre-scale: %d\r\n", prescale);
	}

	uint8_t oldmode = read16(PCA9685_MODE1);
	uint8_t newmode = (oldmode&0x7F) | 0x10; // sleep
	write16(PCA9685_MODE1, newmode); // go to sleep
	write16(PCA9685_PRESCALE, prescale); // set the prescaler
	write16(PCA9685_MODE1, oldmode);
	HAL_Delay(5);
	write16(PCA9685_MODE1, oldmode | 0xa1);  //  This sets the MODE1 register to turn on auto increment.
										  // This is why the beginTransmission below was not working.
	//  printf("Mode now 0x"); printf(read16(PCA9685_MODE1), HEX);
}

// 输出PWM占空比的调节。通常on都设为0,改变off即可。
// 因为PCA9685是12位分辨率,所以off的值0~4096就代表了占空比0-100.
void pca9685_setPWM(uint8_t num, uint16_t on, uint16_t off)
{
	//printf("Setting PWM "); printf(num); printf(": "); printf(on); printf("->"); printf(off);
	uint8_t d[4] = {(on&0xFF), (on>>8), (off&0xFF), (off>>8)};
	
	HAL_I2C_Mem_Write(&PCA9685_HI2C, PCA9685_IIC_ADDR_W, (LED0_ON_L+4*num), 1, d, 4, 0xff);
}

// num:序号;angle:角度
void setAngle(uint8_t num, uint16_t angle)
{
	// 补误差
//	angle /= 2;
	uint32_t off = 0;

	// off范围是:0~4096
	// 舵机占空比范围是:0.5~2.5ms
	// 所以设置off在 102.4~512范围内
	// x/(512-102.4) = 1/360
	// 所以每一度步进值为:1.137777 约等于 1.14
	off = (uint32_t)(102.4+angle*1.14);
	pca9685_setPWM(num, 0, off);
}

static uint8_t read16(uint8_t addr)
{
	uint8_t d;
	HAL_I2C_Mem_Read(&PCA9685_HI2C, PCA9685_IIC_ADDR_R, addr, 1, &d, 1, 0xff);
	return d;
}

static void write16(uint8_t addr, uint8_t d)
{
	HAL_I2C_Mem_Write(&PCA9685_HI2C, PCA9685_IIC_ADDR_W, addr, 1, &d, 1, 0xff);
}

pca9685pw.h

#ifndef _PCA9685_PW_H
#define _PCA9685_PW_H

#include "stdbool.h"
#include "main.h"
#include "i2c.h"

// I2C 句柄,用户自己修改
#define PCA9685_HI2C	hi2c1
// I2C 地址
#define PCA9685_IIC_ADDR_W	0x80
#define PCA9685_IIC_ADDR_R	0x81


// 寄存器地址
#define PCA9685_SUBADR1 0x2
#define PCA9685_SUBADR2 0x3
#define PCA9685_SUBADR3 0x4

#define PCA9685_MODE1 0x0
#define PCA9685_PRESCALE 0xFE

#define LED0_ON_L 0x6
#define LED0_ON_H 0x7
#define LED0_OFF_L 0x8
#define LED0_OFF_H 0x9

#define ALLLED_ON_L 0xFA
#define ALLLED_ON_H 0xFB
#define ALLLED_OFF_L 0xFC
#define ALLLED_OFF_H 0xFD



// 函数
void pca9685_reset(void);
void pca9685_setPWMFreq(float freq);
void pca9685_setPWM(uint8_t num, uint16_t on, uint16_t off);
void pca9685_setPin(uint8_t num, uint16_t val, bool invert);// =false


// 初始化。频率,转动角度(0~360)
void pca9685_init(float hz, uint16_t angle);
// num:序号;angle:角度(0~360)
void setAngle(uint8_t num,uint16_t angle);

#endif	/* _PCA9685_PW_H */

main

void main(void)
{
	uint16_t xxx = 0;
	// 初始50Hz,角度 180 度
	pca9685_init(50, 180);

	while(1)
	{
		// 设置 1 号口输出
		setAngle(1, xxx);
		xxx += 10;
		xxx>360?xxx=0:xxx;
		HAL_Delay(10);
	}
}

参考

PCA9685模块使用(Arduino和STM32)

stm32中如何使用PCA9685控制舵机(详解) PCA9685是一个基于IIC通信的16路PWM输出模块,可以在单片机资源不足的情况下进行扩展使用。i2c通信,只需要2根i2c线就可以控制16路pwm,周期和占空比都可控。可以多个模块级联。箭头部分可以更改设备id。可以控制16路输出端的开、关、pwm以及占空比。在datasheet 文件中可以看到地址定义信息表,这里剪一页到这里作为参考。 阅读详情

相关推荐

pca9685的舵机控制

舵机角度 一个周期为20ms的脉冲里面高电平持续的时间决定了舵机转动的角度,180度舵机对应关系如下:0.5ms--0度,1ms--45度,1.5ms--90度,2ms--135度,2.5ms--180度。   16路舵机驱动控制模块pca9685pw通过IIC(内置PWM驱动和一个时钟)协议可以控制16个舵机   pca9685设备地址 其地址的分配是通过模块右上方的短接焊盘来确定的...

九幽小班的博客 2万+

基于STM32与PCA9685制作四足机器人(代码开源)

基于STM32与PCA9685制作蓝牙控制四足机器人项目,超详细教学完成制作出自己的机器人(包含机器人3D打印文件以及HAL库版本代码)。

black_sneak的博客 3万+

【PCA 9685学习笔记进阶版】——16路PWM舵机驱动板+ Arduino

这是我学习自己写程序的版本。之前的【PCA 9685学习笔记初级版】https://blog.youkuaiyun.com/qq_42807924/article/details/82229997 /*************************************************** 这是16通道PWM和伺服驱动器的一个例子,驱动16个伺服电机 ****************...

云敬山 1万+

树莓派4B-PCA9685驱动舵机

前言 不知道你们有没有遇到过这么一种情况,直接用树莓派的引脚输出PWM控制舵机,舵机是会出现抖动的。就算代码进行一定的时延迟优化还是会有影响的。 现在我们可以使用PCA9685这个模块去驱动舵机。 PCA9685 是一种常用的 PWM(脉冲宽度调制)驱动器芯片,通常用于控制舵机、电机和其他需要精确控制的设备。该芯片可以通过 I2C 总线与微控制器或单片机通信,以实现对多路 PWM 信号的生成和控...

weixin_33329305的博客 1321

【雕爷学编程】Arduino动手做(161)---16路PWM Servo舵机驱动板 PCA9685

鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来—小小的进步或是搞不掂的问题,希望能够抛砖引玉。如果必须,您可以提高到 12VDC,但如果您搞砸并将 VCC 连接到 V+,您可能会损坏您的电路板!也就是说,对于 LED,您可能需要 1.0 KHz,但伺服系统需要 60 Hz - 因此您不能将一半用于 LED @ 1.0 KHz,一半用于 @ 60 Hz。当引脚为高电平时,输出被禁用。

雕爷学编程 5091

STM32--PCA9685驱动(16路舵机驱动模块)

PCA9685接线、PCA9685简介、PCA9685地址位寄存器、MODE1寄存器,地址0x00,可读、可写、寄存器地址、PCA9685代码注解、PCA9685数据写入、PCA9685数据读取、PCA9685的频率设置、PCA9685的PWM设置、舵机转动角度置换、PCA9685驱动代码:

dengn191020的博客 3万+

使用 CubeIDE 开发 PCA9685 舵机控制板:基于 STM32C8T6 的实践

在机器人控制、模型制作等领域,舵机控制是一个常见的需求。PCA9685 是一款常用的 PWM 扩展芯片,它可以同时控制多个舵机,非常适合多舵机系统。Servo_SetAngle可以添加第几个板子使用,setAngle就是默认你传入的i2c句柄,大家可以看看PCA9685.c和.h文件如何实现的。特别说明,如果你要像这样串联控制板,只需要修改i2c的句柄,比如第一个板子地址是0x40,第二个就是0x41,第三个就是0x42,以此类推。这个源文件实现了 PCA9685 的读写操作、初始化和舵机角度控制功能。

m0_59977790的博客 1526

PCA9685 PWM控制器应用与STM32F407开发套件

本文还有配套的精品资源,点击获取 简介:PCA9685是一款支持16通道PWM控制的模块,适用于多种设备,特别是与Arduino、Raspberry Pi等微控制器平台配合使用。STM32F407是一款高性能ARM Cortex-M4内核的32位微控制器。本压缩包提供了PCA9685与STM32F407结合应用的完整开发套件,包括用户代码、硬件配置、固件库、核心代码、系统配...

weixin_33506815的博客 2778

【学习笔记】——16路PWM舵机驱动板(PCA 9685) + Arduino

16路PWM舵机驱动板 先对每个舵机尝试一下,了解以下PWM 一个非常简单的舵机例子: #include &amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;Servo.h&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt; #define PIN_SERVO 10 Servo myservo; void setup() { myserv

云敬山 7万+

STM32 DMA串口重定向printf:高效调试与性能优化实战

本文详细介绍了STM32 DMA串口重定向printf的实现方法与性能优势。通过对比传统方式的CPU高占用问题,阐述了DMA技术如何实现高效数据传输,大幅降低CPU负载。文章包含完整的代码实现、缓冲区管理技巧及实战调试方案,帮助开发者优化嵌入式系统调试效率。

lake5的博客 98

Shell编程规范及变量

文章目录一.Shell脚本1.1Shell概述1.2Shell脚本 一.Shell脚本 1.1Shell概述 Shell是Linux系统中开机自动加载的一个特殊程序,它将用户输入的指令,转换成Linux内核可以识别的语言,从而让内核执行调用硬件。 Bash是Linux系统中默认使用shell的程序,它位于/bin/bash。 1.2Shell脚本 将需要执行的命令保存到一个文件中,按照顺序执行,它不需要编译,它是解释型的 ...

夏颜的博客 3673

STM32 (STM32F103C8T6) 用PCA9685控制舵机和Led,代码极简可用

  我缺少积分,请各位下载此代码给点积分。     我的博客:https://blog.youkuaiyun.com/seatest     STM32F103C8T6  专用。使用IIC1通道,对应针脚:PA6,PA7     其他STM32板子,请修改默认针脚     代码自改,简单方便,亲测可用,不仅可以控制舵机,还可以直接控制Led亮度     stm32_pca9685只有一个c文件和h文件,不...

seatest的专栏 5693

SLAM轨迹评估神器evo实战:从GPS到TUM格式的完整转换指南(附Python代码)

本文详细介绍了如何使用evo工具将GPS数据转换为TUM格式,以便进行SLAM轨迹评估。通过Python代码实现GPS到笛卡尔坐标的精确转换,并提供了完整的处理流程和实战案例,帮助开发者轻松完成从原始GPS数据到精确轨迹评估的全过程。特别适用于ORB-SLAM等视觉SLAM算法的性能验证。

weixin_29074295的博客 292

树莓派16路PWM舵机驱动板(PCA9685)

16路PWM舵机驱动板(PCA9685)PCA9685板卡图驱动板与树莓派连接树莓派下运行PCA9685的例子 PCA9685板卡图 驱动板与树莓派连接 GND -> RPi GND SCL -> RPi SCL1 SDA -> RPi SDA1 VCC -> RPi 3.3V或5V 树莓派下运行PCA9685的例子 #pip install adafruit-pca9685 import Adafruit_PCA9685 #这里只给函数不讲原理了,大部分人只是用不用懂。要了解

cwdelphi的博客 5332

EtherCAT-1 技术概述

1.EtherCAT简介①开放的技术EtherCAT全称EtherNet Control Automation Technology,是由德国倍福(Beckhoff)公司提出的一种实时以太网技术。EtherCAT是一种开放但不开源的技术,意味着您可以任意使用这项技术,但若要进行相关设备的开发,则需要向倍福公司获取相关授权。②快速性相比传统现场总线,EtherCAT的数据传输速率有了极大的提升,可选10Mbit/s或100Mbit/s,甚至依托补充

tianya_xuan的博客 3543

强网杯Web题ezphp解题全记录:利用PHP反序列化与条件竞争拿下服务器

本文详细解析了强网杯Web题目ezphp的解题过程,通过PHP反序列化与条件竞争漏洞的组合利用,成功获取服务器权限。文章深入剖析了反序列化链的构造、文件上传绕过技巧以及条件竞争的实际应用,为CTF选手和Web安全研究者提供了宝贵的实战经验。

weixin_29006187的博客 376

PCA9685--16路 PWM模块舵机驱动板--STM32 IIC接口模块

目录 一、概述和硬件 1、概述 2、硬件 1、电压 2、i2c地址 3、使能脚 二、寄存器功能  MODE1寄存器 外面调用的接口     PCA9685是一款基于IIC总线通信的12位精度16通道PWM波输出的芯片,该芯片最初由NXP推出时主要面向LED开关调光, 16路12位PWM信号发生器,可用于控制舵机、led、电机等设备,i2c通信,节省主机资源。就是想控制好几...

c1063891514的博客 2万+

智能化教育改革中的教师角色转变:AI应用架构师如何设计“人机协同”系统?

个性化与规模化的矛盾:如何用AI实现规模化的个性化学习,同时保留教师的“人文温度”?自动化与自主性的矛盾:如何用AI自动化流程(如批改),同时避免教师沦为“AI操作工人”?数据驱动与经验驱动的矛盾:如何平衡AI的“数据决策”与教师的“经验决策”,避免“算法偏见”或“经验固化”?在智能化教育改革中,教师始终是教育的核心——AI系统是“辅助工具”,而非“替代者”。

小白菜的博客 1269

cubemx配置STM32H745控制PCA9685

本次文章参考和借鉴了两篇文章的代码以及内容,感谢大佬的开源。 (26条消息) pca9685的舵机控制_九幽小班的博客-优快云博客_pca9685 (26条消息) 【SG90模拟舵机控制及PCA9685模块的使用】_默默无闻小菜鸡的博客-优快云博客_pca9685接线图 STM32v双核MCU,本次舵机控制实验采用了M4内核,cubemx配置STM32H745的i2c4进行控制PCA9685。 cubemx配置图片如下 仅选择i2c以及更改了speed mode调整成了高速模式。 此为.

weixin_51471432的博客 2265

【异常】OpenClaw对接钉钉/飞书配对成功但无响应 全流程排查指南(适配阿里轻量服务器+OpenClaw)

下面按「先快速定位根因→通用核心排查→平台专属排查→兜底方案」的顺序,一步步解决,新手也能跟着操作。

奶爸的编程之路,也就一周冷个三天 696

RT-DETR改进策略【Neck】| GFPN 超越BiFPN 通过跳层连接和跨尺度连接改进RT-DETR颈部网络

本文记录的是利用颈部结构优化RT-DETR的目标检测网络模型。利用改进后的颈部网络,通过跳层连接,避免了在进行反向传播时的梯度消失问题,并且引入跨尺度连接,可以实现不同级别和层次的特征充分融合,获取足够的高层语义信息和低层空间信息交换,从而在大规模变化场景下提高检测性能。GIRAFFEDET: A HEAVY-NECK PARADIGM FOR OBJECT DETECTION-GFPN包含了上述的跳层连接(dense-link和log2nlog _{2} nlog2​n-link)以及跨尺度连接(Quee

Limiiiing的博客 2228

【CW32模块使用】16路舵机驱动模块

地址选择引脚使你可以把62个驱动板挂在单个l2C总线上,总共有992路PWM输出,那将是非常庞大的资源,约1.6Khz可调频PWM输出,为步进电机准备输出12位分辨率,可配置的推拉输出或开路输出,输出使能引脚能够快速禁用所有输出。两个寄存器都将保存从0到4095的值。ON时间是可编程的,它是PWM输出ON的时间,OFF时间也是可编程的,它是PWM输出OFF的时间。整个周期为4095, LED_ON 和 LED_OFF 2个的设定值确定脉宽,在后面的代码里,LED_ON 设为0, LED_OFF就是脉宽了。

2302_81038468的博客 907

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

PCA9685 16路12位pwm信号发生器

原文地址:http://nicekwell.net/blog/20161213/pca9685-16lu-12wei-pwmxin-hao-fa-sheng-qi.html 一、概述和硬件 1、概述2、硬件 1、电压2、i2c地址3、使能脚 二、寄存器功能 MODE1寄存器各个通道的ON和OFF寄存器PRE_SCALE寄存器 三、驱动 树莓

nicekwell的专栏 2万+

深度学习工具包 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")

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

STM32F103控制PCA9685产生16路PWM波控制SG90舵机

STM32控制PCA9685产生16路PWM波控制SG90舵机 如果你能点开这篇文章,说明你已经知道PCA9685是多么强大,NXP公司原本做这片芯片是为了提供给LED使用,在其官方文档里也能看到所有PWM输出都是写着LED,但是PWM波形不仅仅能够控制一个简单的LED,PWM应用很广泛的一个方面就是电机调速,以及部分舵机控制角度就是通过调节PWM波的占空比来实现,因此本篇博客就来介绍一下这块如何使用这块芯片。 博主采用的是下面这款模块,淘宝上很容易买到。 这款芯片通过IIC总线来控制,如果你想很快上手,

波波的博客 4378

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

PCA9685模块使用(Arduino和STM32)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、PCA9685简介二、Arduino使用PCA96851.硬件连接2.Adafruit库安装3.示例程序解析三、STM32使用PCA9685总结(程序代码下载) 前言 最近要用到PCA9685控制多路舵机,就买了一块PCA9685模块试验,刚开始参照淘宝店铺给的例程写代码,结果PCA9685完全没反应,经过几天的摸索终于搞明白PCA9685的用法,在这里给大家分享一下PCA9685的使用方法。 提示:以下是本篇文章正文.

weixin_43242118的博客 3万+

LED PWM控制芯片PCA9685的Linux 驱动

本文目的在调试PCA9685的Linux设备驱动过程中, 发现有值得记录和备忘的点. 特写此文,方便自己查阅. PCA9685简介PCA9685是NXP生产的一款LED驱动芯片, 其主要特性: 1. 16通道, 即能够提供16个GPIO控制管脚,相应能够控制16个LED; 2. PWM控制. 通过PWM机制来控制LED的亮度; 亮度的控制寄存器12bit,即亮度的取值范围为: 0~4095;其他

dylanZheng的博客 7263
上一篇: 直接带你使用 FreeRTOS 的 API 函数(基于 CubeMX 生成)(不断更新)
下一篇: cubemx hal stm32 atgm336h GPS 北斗 定位 模块 驱动代码
嵌入一下?
博客等级 码龄6年 324粉丝 66原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入一下?

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值