STM32-SPI1控制AD7705(Sigma-Delta-ADC芯片)
STM32-SPI1控制AD7705(Sigma-Delta-ADC芯片)
- 原理图
- 手册说明
- 功能方框图
- 引脚功能
- 片内寄存器
- 通信寄存器(RS2、RS1、RS0=0、0、0)
- 设置寄存器
- 时钟寄存器
- 数据寄存器(RS2、RS1、RS0=0、1、1)
- 测试寄存器(RS2、RS1、RS0=1、0、0);上电/复位状态:00Hex
- 零标度校准寄存器(RS2、RS1、RS0=1、1、0);上电/复位状态:1F4000Hex
- 满标度校准寄存器(RS2、RS1、RS0=1、1、1);上电/复位状态:5761ABHex
- 校准过程
- 代码部分
原理图

该芯片需要晶振(Y2)和参考电源电压(U3)
手册说明
AD7705与国产TM7705型号差不多,也就是可以参考国产的手册。
AD7705利用 Σ-Δ 转换技术实现了 16 位无丢失代码性能。选定的输入信号被送到一个基于模拟调制器的增益可编程专用前端。片内数字滤波器处理调制器的输出信号。通过片内控制寄存器可调节滤波器的截止点和输出更新速率,从而对数字滤波器的第一个陷波进行编程。
TM7705 是双通道全差分模拟输入,带有一个差分基准输入。当电源电压为 5V、基准电压为 2.5V 时,该器件都可将输入信号范围从 0~+20mV 到 0~+2.5V 的信号进行处理。还可处理±20mV~±2.5V 的双极性输入信号,对于 TM7705 是以 AIN(-)输入端为参考点。
功能方框图

引脚功能


片内寄存器

通信寄存器(RS2、RS1、RS0=0、0、0)




设置寄存器


时钟寄存器



数据寄存器(RS2、RS1、RS0=0、1、1)

测试寄存器(RS2、RS1、RS0=1、0、0);上电/复位状态:00Hex

零标度校准寄存器(RS2、RS1、RS0=1、1、0);上电/复位状态:1F4000Hex

满标度校准寄存器(RS2、RS1、RS0=1、1、1);上电/复位状态:5761ABHex

校准过程


代码部分
以STM32F103和标准库作为底板
main.c
#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "usart.h"#include "bsp_spi.h"#define CS_ADC_LOW() GPIO_ResetBits(GPIOA,GPIO_Pin_4)
#define CS_ADC_HIGH() GPIO_SetBits(GPIOA,GPIO_Pin_4)
/************************************************ALIENTEK精英STM32开发板实验4串口 实验 技术支持:www.openedv.com淘宝店铺:http://eboard.taobao.com 关注微信公众平台微信号:"正点原子",免费获取STM32资料。广州市星翼电子科技有限公司 作者:正点原子 @ALIENTEK
************************************************/u8 num1[6];float l_ncm1;u8 num2[6];float l_ncm2;//写数据
void AD7705_WriteByte(u8 Dst_Addr)
{ CS_ADC_LOW();//使能器件 delay_us(20);Spi1_readwritebyte(Dst_Addr);delay_us(100);CS_ADC_HIGH();//使能器件
}
/********AD7705初始化函数***********/void Init_AD7705(u8 chnanel)
{u8 i;for(i=0;i<150;i++)/* 多于连续32个 DIN=1 使串口复位 */{AD7705_WriteByte(0xff);//持续DIN高电平写操作,恢复AD7705接口} delay_ms(1);switch(chnanel){case 1:AD7705_WriteByte(0x20); /* 写时钟寄存器选中ch1*/AD7705_WriteByte(0x0C); /* 4.9152MHz时钟,250Hz数据更新速率 */AD7705_WriteByte(0x10); /*选择设置寄存器,使用chnanel 1*/AD7705_WriteByte(0x47); //写设置寄存器 ,设置成双极性、无缓冲、增益为2、滤波器工作、自校准break;/*有更改,时钟寄存器设为0x0a,4.9152MHz时钟,500Hz数据更新速率,*/case 2:AD7705_WriteByte(0x21); /* 写时钟寄存器选中ch2 */AD7705_WriteByte(0x0f); /* 4.9152MHz时钟,500Hz数据更新速率 */AD7705_WriteByte(0x11); /*选择设置寄存器,使用chnane 2*/AD7705_WriteByte(0x46); //写设置寄存器,设置成双极性、无缓冲、增益为2、滤波器工作、自校准break;default: break;}
}/* 读AD7705转换数据 输入通道channel */
u16 GetData7705_CH1(void)
{u16 temp1 = 0;u16 DataL = 0;u16 DataH = 0;Init_AD7705(1); //初始化通道1delay_ms(1);AD7705_WriteByte(0x39); //选中CH1数据寄存器读 while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_2==0)){}//待数据准备好AdDrdy=0 CS_ADC_LOW(); //使能器件 delay_us(20);DataH = Spi1_readwritebyte(0xff);DataL = Spi1_readwritebyte(0xff);delay_us(100);CS_ADC_HIGH(); //取消片选 DataH = DataH << 8;temp1 = DataH | DataL;return temp1;
}/* 读AD7705转换数据 输入通道channel */
u16 GetData7705_CH2(void)
{u16 temp2 = 0;u16 DataL = 0;u16 DataH = 0;Init_AD7705(2); //初始化通道2delay_ms(1);AD7705_WriteByte(0x38); //选中CH2数据寄存器读 while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_2==0)); //待数据准备好AdDrdy=0 CS_ADC_LOW(); //使能器件 delay_us(20);DataH = Spi1_readwritebyte(0xff);DataL = Spi1_readwritebyte(0xff);delay_us(100);CS_ADC_HIGH(); //取消片选 DataH = DataH << 8;temp2 = DataH | DataL;return temp2;
}
//数据处理void ADC_7705(void)
{ u16 RCH1_16bit,RCH2_16bit; RCH1_16bit = GetData7705_CH1(); l_ncm1 = (float)(RCH1_16bit*(2.5/65535)); //算出通道1电压RCH2_16bit = GetData7705_CH2();l_ncm2 = (float)(RCH2_16bit*(2.5/65535)); //算出通道2电压// num1[0] = l_ncm1/10000+'0';
// num1[2] = (l_ncm1%10000)/1000+'0';
// num1[3] = (l_ncm1%1000)/100+'0';
// num1[4] = (l_ncm1%100)/10+'0';
// num1[5] = l_ncm1%10+'0';// num2[0] = l_ncm2/10000+'0';
// num2[2] = (l_ncm2%10000)/1000+'0';
// num2[3] = (l_ncm2%1000)/100+'0';
// num2[4] = (l_ncm2%100)/10+'0';
// num2[5] = l_ncm2%10+'0';printf("buff1:%f\n",l_ncm1);printf("buff2:%f\n",l_ncm2);if(l_ncm2>8500|l_ncm2<8200){delay_ms(10);l_ncm2=0;}else{}}int main(void){ delay_init(); //延时函数初始化 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级uart_init(115200); //串口初始化为115200LED_Init(); //LED端口初始化KEY_Init(); //初始化与按键连接的硬件接口Spi1_init(); //SPI 初始化GPIO_SetBits(GPIOA,GPIO_Pin_0);Init_AD7705(1);delay_ms(250);Init_AD7705(2);while(1){
// Spi1_readwritebyte(0xAA);
// printf("buff1:%X\n",GetData7705_CH1());
// delay_ms(100);
// printf("buff2:%X\n",GetData7705_CH2());ADC_7705(); delay_ms(250);} }
bsp_spi.c
#include "bsp_spi.h"/*** 函数功能: SPI 读写一个字节* 输入参数: 要写入的字节* 返 回 值: 读取到的字节* 说 明:无*/
void Spi1_init(void)
{GPIO_InitTypeDef GPIO_InitStructure;SPI_InitTypeDef SPI_InitStructure;/* 使能GPIO和SPI时钟 */RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE );//PORTB时钟使能 RCC_APB2PeriphClockCmd( RCC_APB2Periph_SPI1, ENABLE );//SPI2时钟使能 /* 配置SPI功能引脚:SCK 时钟引脚 */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化GPIO/* 配置SPI功能引脚:MISO 主机输出从机输入引脚 */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;GPIO_Init(GPIOA, &GPIO_InitStructure);/* 配置SPI功能引脚:MOSI 主机输入从机输出引脚 */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;GPIO_Init(GPIOA, &GPIO_InitStructure);/* SPI外设配置 --NSS 引脚由软件控制以及 MSB 先行模式*/SPI_Cmd(SPI1, DISABLE); //失能能SPI外设SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //设置SPI工作模式:设置为主SPISPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //设置SPI的数据大小:SPI发送接收8位帧结构SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; //选择了串行时钟的稳态:时钟悬空高SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //数据捕获于第二个时钟SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; //定义波特率预分频的值:波特率预分频值为256SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始SPI_InitStructure.SPI_CRCPolynomial = 7; //CRC值计算的多项式SPI_Init(SPI1, &SPI_InitStructure); //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器/* 配置SPI功能引脚:CS 串行Flash片选引脚 */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);/* 配置SPI所用的引脚:默认高电平 */ GPIO_SetBits(GPIOA,GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7);SPI_Cmd(SPI1, ENABLE); //使能SPI外设/* RES */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //复用推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化GPIO
/* CS */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //复用推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化GPIO
/* DRDY */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //复用推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化GPIOGPIO_SetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_4|GPIO_Pin_2);
}/*** 函数功能: SPI 速度设置函数* 输入参数: SPI_BaudRatePrescaler_2 2分频 SPI_BaudRatePrescaler_8 8分频 SPI_BaudRatePrescaler_16 16分频 SPI_BaudRatePrescaler_256 256分频 * 返 回 值: 无* 说 明:*/
void Spi1_SetSpeed(u8 Spi_baudrateprescaler)
{assert_param(IS_SPI_BAUDRATE_PRESCALER(SPI_BaudRatePrescaler));SPI1->CR1&=0XFFC7;SPI1->CR1|=Spi_baudrateprescaler; //设置SPI1速度 SPI_Cmd(SPI1,ENABLE);
} /*** 函数功能: SPI 读写一个字节* 输入参数: 要写入的字节* 返 回 值: 读取到的字节* 说 明:无*/
u8 Spi1_readwritebyte(u8 Txdata)
{ u8 retry=0; while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET) //检查指定的SPI标志位设置与否:发送缓存空标志位{retry++;if(retry>200)return 0;} SPI_I2S_SendData(SPI1, Txdata); //通过外设SPIx发送一个数据retry=0;while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET) //检查指定的SPI标志位设置与否:接受缓存非空标志位{retry++;if(retry>200)return 0;}return SPI_I2S_ReceiveData(SPI1); //返回通过SPIx最近接收的数据
}相关文章:
STM32-SPI1控制AD7705(Sigma-Delta-ADC芯片)
STM32-SPI1控制AD7705(Sigma-Delta-ADC芯片) 原理图手册说明功能方框图引脚功能 片内寄存器通信寄存器(RS2、RS1、RS00、0、0)设置寄存器时钟寄存器数据寄存器(RS2、RS1、RS00、1、1)测试寄存器(…...
13年老鸟总结,性能测试方法汇总+性能响应很慢排查方法(详全)
目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 1、性能测试包含哪…...
[网络] 3. HTTP 3 与 HTTP 2 有什么区别
协议不同 HTTP2 是基于 TCP 协议实现的 HTTP3 是基于 UDP 协议实现的QUIC HTTP3 新增了 QUIC 协议来实现可靠性的传输握手次数 HTTP2 是基于 HTTPS 实现的,建立连接需要先进行 TCP 3次握手,然后再进行 TLS 3次握手,总共6次握手。 HTTP3 只需要…...
IDEA中的Postman?完全免费!
Postman是大家最常用的API调试工具,那么有没有一种方法可以不用手动写入接口到Postman,即可进行接口调试操作?今天给大家推荐一款IDEA插件:Apipost Helper,写完代码就可以调试接口并一键生成接口文档!而且还…...
用JAVA编程解决数位和相等问题
如果一个正整数转化成二进制与转换成八进制后所有数位的数字之和相等,则称为数位和相等的数。 前几个数位和相等的正整数为 1, 8, 9, 64, …… 请问第 23 个数位和相等的正整数是多少?用JAVA编程解决 可以通过编程计算第 23 个数位和相等的正整…...
Kotlin学习——kt中的类,数据类 枚举类 密封类,以及对象
Kotlin 是一门现代但已成熟的编程语言,旨在让开发人员更幸福快乐。 它简洁、安全、可与 Java 及其他语言互操作,并提供了多种方式在多个平台间复用代码,以实现高效编程。 https://play.kotlinlang.org/byExample/01_introduction/02_Functio…...
XUbuntu22.04之解决gpg keyserver receive failed no data(一百九十三)
简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生…...
Hibernate 脏检查和刷新缓存机制
刷新缓存: Session是Hibernate向应用程序提供的操作数据库的主要接口,它提供了基本的保存,更新,删除和加载java对象的方法,Session具有一个缓存,可以管理和追踪所有持久化对象,对象和数据库中的相关记录对应,在某些时间点,Session会根据缓存中对象的变化来执行相关SQL语句,将对…...
蓝桥杯每日一题2023.11.25
题目描述 “蓝桥杯”练习系统 (lanqiao.cn) 题目分析 对于此题目最开始是递归想法,但发现题意中的匹配次数实际上是指在这8个字母中这8个字母每个字母对应的个数是否相同,如果相同则匹配。 此处我们可以使用subsrtr函数,每次循环截取8个字…...
深度学习第3天:CNN卷积神经网络
☁️主页 Nowl 🔥专栏《机器学习实战》 《机器学习》 📑君子坐而论道,少年起而行之 文章目录 介绍 CNN的主要结构 卷积层 激励层 池化层 Kears搭建CNN 搭建代码 直观感受卷积的作用 结语 介绍 卷积神经网络(Convol…...
# Panda3d 碰撞检测系统介绍
Panda3d 碰撞检测系统介绍 文章目录 Panda3d 碰撞检测系统介绍碰撞几何体的介绍碰撞球体碰撞胶囊反碰撞球体碰撞平面碰撞多边形碰撞射线碰撞直线碰撞段碰撞抛物线碰撞长方体碰撞系统图碰撞处理器碰撞处理器队列碰撞处理器事件碰撞处理器回退模型(CollisionHandlerPusher)物理…...
leetcode面试经典150题——31 无重复字符的最长子串(方法二极简代码!!!)
题目: 无重复字符的最长子串 描述: 给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: s “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。 leetcode链接 方法…...
Kafka(一):在WSL单机搭建Kafka伪集群
目录 1 运行Kafka单实例1.1 Windws1.1.1 安装包下载1.1.2 修改环境变量1.1.3 修改配置文件1.1.4 启动Kafka单机版 1.2 Linux1.2.1 安装包下载1.2.2 创建目录1.2.3 添加环境变量1.2.4 修改配置文件1.2.5 运行Kafka1.2.6 停止Kafka 2 搭建Kafka集群2.1 搭建Zookeeper集群2.2 搭建…...
mysql1124实验七索引管理
实验任务七 索引管理实验任务书 1. 实验目的 掌握在MySQL中使用MySQL Workbench或者SQL语句创建和使用索引的方法(以SQL命令为重点)。 掌握在MySQL中使用MySQL Workbench或者SQL语句查看和删除索引的方法(以SQL命令为重点)。 …...
[带余除法寻找公共节点]二叉树
二叉树 题目描述 如上图所示,由正整数1, 2, 3, ...组成了一棵无限大的二叉树。从某一个结点到根结点(编号是1的结点)都有一条唯一的路径,比如从10到根结点的路径是(10, 5, 2, 1),从4到根结点的路径是(4, 2, 1)&#x…...
详解Rust编程中的生命周期
1.摘要 生命周期在Rust编程中是一个重要概念, 它能确保引用像预期的那样一直有效。在Rust语言中, 每一个引用都有其生命周期, 通俗讲就是每个引用在程序执行的过程中都有其自身的作用域, 一旦离开其作用域, 其生命周期也宣告结束, 值不再有效。幸运的是, 在绝大多数时间里, 生…...
【实践】Deployer 发布到search head : local OR default
1: 背景: search head deployer 上的 /opt/splunk/etc/schcluster/apps 下面的local, 还有default 派发到 search head 到app 下面是怎么工作的,这个过程,实践了一下: 参考Use the deployer to distribute apps and configuration updates - Splunk Documentation 2: 实…...
U盘报错无法访问文件或目录损坏且无法读取的解决办法
使用电脑打开U盘的部分文件时提示无法访问,文件或目录损坏且无法读取 报错内容如下图: 因为我这个U盘是那种双接口的 Type-C和USB,前段时间被我摔了一下 看网上说这种双接口的U盘USB接口容易坏掉 尝试在手机上使用OTG打开,先测试…...
【MySQL】数据库基础操作
👑专栏内容:MySQL⛪个人主页:子夜的星的主页💕座右铭:前路未远,步履不停 目录 一、数据库操作1、创建数据库2、查看所有数据库3、选定指定数据库4、删除数据库 二、数据表操作1、创建数据表2、查看所有表3、…...
2023年微软开源八个人工智能项目
自2001年软件巨头微软前首席执行官史蒂夫鲍尔默对开源(尤其是Linux)发表尖刻言论以来,微软正在开源方面取得了长足的进步。继ChatGPT于去年年底发布了后,微软的整个2023年,大多数技术都是面向开发人员和研究人员公开发…...
SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...
【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...
屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 定向转发机制
目录 节点的功能承载层(GATT/Adv)局限性: 拓扑关系定向转发机制定向转发意义 CG 节点的功能 节点的功能由节点支持的特性和功能决定。所有节点都能够发送和接收网格消息。节点还可以选择支持一个或多个附加功能,如 Configuration …...
零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程
STM32F1 本教程使用零知标准板(STM32F103RBT6)通过I2C驱动ICM20948九轴传感器,实现姿态解算,并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化,适合嵌入式及物联网开发者。在基础驱动上新增…...
