7ADC模数转换器

一.模数转换原理

ADC模拟-数字转换器可以将引脚上连续变化的模拟电压转换成内存中存储的数字变量,建立模拟电路到数字电路的桥梁。另外一种是DAC既是与前面相反,如PWM波,由于PWM电路简单且没有额外的功率损耗,更适用于惯性系统的场景

以下呢是ADC的STM32介绍:

  • 12位逐次逼近型ADC,1us转换时间(信号频率较高时需要注意)。
  • 输入电压范围:0~3.3V,转换结果范围:0~4095。
  • 18个输入通道,可测量16个外部(GPIO口)和2个内部信号源(内部温度传感器和内部参考电压)。
  • 内部温度传感器:可以测量芯片温度,比如电脑CPU的温度显示。
  • 内部参考电压:是一个1.2V左右的基准电压,不随外部供电电压变化。如果外部供电电压不是3.3V,那读取GPIO口的电压就不对,此时就可以通过读取这个基准电压来校准。
  • 规则组和注入组两个转换单元,是stm32的ADC增强功能。
  • 模拟看门狗自动监测输入电压范围,当AD值高于上阈值或低于下阈值时,就会申请中断,可减轻软件负担。
  • STM32F103C8T6 ADC资源:ADC1、ADC2,10个外部输入通道。
     

1.1 ADC电路结构

stm32采用逐次逼近型ADC结构,现用ADC0809介绍这种结构

 

  • ADC0809是一个独立的8位逐次逼近型ADC,单片机内部没有集成ADC时需要外挂ADC芯片,ADC0809就是这么一款经典的ADC芯片。现在很多单片机内部已经集成了ADC外设,就不需要外挂芯片,可以直接测量电压。
  • IN7~IN0:8路模拟输入。
  • ADDA、ADDB、ADDC、ALE:地址锁存,选择当前的模拟输入引脚。相当于38译码器。
  • CLOCK:时钟线。
  • START:开始AD转换。
  • EOC:转换结束标志位。
  • 内部DAC:加权电阻网络,用于产生和输入模拟信号进行比较的模拟信号。
  • OE:输出使能,控制三态门输出。
  • D7~D0:输出的8位数字信号。
  • VREF(+)、V~REF(-):参考电压。

单个ADC框图

 

  • ADCx_IN0~ADCx_IN15、温度传感器、VREFINT:ADC的16个输入通道。
  • 注入通道【使用不多】:最多一次性选4路通道,配合4个16位寄存器,就可以一次性转换4路模拟数据。
  • 规则通道【常用】:最多一次性选16路通道,但只有1个16位寄存器,存在新来的数据覆盖上一个数据的问题,此时要么尽快将数据取走,要是使用DMA帮助转运数据,进而可以实现一次性转换16路模拟数据。当然,一次就选一个通道,就是普通的ADC功能。
  • 触发转换电路:stm32中的ADC触发方式:
  • 软件触发:在程序中手动调一句代码。
  • 硬件触发:上图所示的触发源。主要来自于定时器TIMx,也可以外部中断引脚EXTI。正常思路是:定时器每隔1ms产生一次中断 --> 中断函数中开启触发转换信号 --> ADC完成一次转换。缺点是需要频繁进入中断,消耗软件资源。但是得益于上图的硬件电路设计,stm32可以直接使用定时器主模式触发ADC转换,硬件全自动无需申请中断,可以极大地减轻CPU负担。
  • VDDA、VSSA:ADC的供电引脚。
  • VREF+、VREF-:ADC的参考电压,决定了ADC的输入电压的范围。stm32内部已经和VDDA、VSSA连接在一起了。
  • ADCCLK:来自ADC的预分频器,这个ADC的预分频器则来自于“RCC时钟树”。具体可以查看时钟树的电路,默认情况就是对72MHz进行ADC预分频,由于ADCCLK最大18MHz,所以只能选择6分频/8分频。
  • DMA请求:触发DMA进行数据转运。下一章讲。
  • 注入通道数据寄存器、规则通道数据寄存器:用于存放转换结果。
  • 模拟看门狗:一旦高于上阈值或低于下阈值,就会申请模拟看门狗的中断,最终进入NVIC。
  • 转换结束EOC:规则通道转换完成,会在状态寄存器置标志位。
  • 注入转换结束JEOC:注入通道转换完成,会在状态寄存器置标志位。
  • NVIC:嵌套向量中断控制器,控制是否响应上面这三个中断。

1.2引脚复用关系 

其中ADC1和ADC2功用引脚,不仅可以单独使用,可以组成更加复杂的双ADC模式,通过配合可以组成同步模式,交叉模式(ADC1和ADC2交叉对同一个通道进行采样,以提高采样率)

 1.3规则组的转换模式

stm32的ADC最多同时支持16个通道,那么ADC每次扫描1个通道还是多个通道,便是选择 非扫描模式/扫描模式;而对于单个通道的ADC转换来说,触发一次ADC是只转换一次,还是自动的进行连续转换,便是选择 单次转换/连续转换。上面这两种选择进行组合,便产生了 规则组的4种转换模式:

1:单次转换,非扫描模式:

触发一次仅转换一次;仅序列1有效,但可以任意指定需要转换的通道。此时ADC选择一组的方式退化成只能选择一个。读取数据时,需要等待EOC标志位置1,然后从数据寄存器读取结果。如要再进行转换,就需要再次触发转换。

2:连续转换,非扫描模式:

 

相比于上一个模式,仅需要一次触发,ADC就会在一次转换完成后立刻进入下一次转换,实现不断地自动进行转换。此时就不需要读EOC看转换是否完成,直接想读数据的时候就读。

3:单次扫描,扫描模式:

相比于第一种模式,可以一次性转换多个通道,不过还是触发一次、所有通道只转换一次。

 4:连续转换,扫描模式:
 

不仅可以一次性转换多个通道,还可以实现触发一次、自动不间断转换。

1.4触发转换信号

 

上一小节提到,要想ADC进行转换,还需要完成 触发 这个操作。触发信号可以是 软件触发、硬件触发。软件触发可以由ADC的库函数完成;硬件触发见上图。

1.5数据对齐

 

因为ADC是12位的,而寄存器宽度为16位,所有便有了数据对齐方式的选择。

  1. 右对齐【常用】:读出的值就是实际值。
  2. 左对齐:有时候不需要太大的分辨率,便将12位ADC的转换数据左对齐,然后只取高8位。

 

1.6转换时间

 

低速采样可以忽略转换频率,高速采样必须考虑转换时间 的损耗。AD转换的步骤主要为:采样,保持,量化,编码。“采样”时间越长,越可以消除一些毛刺信号的干扰;而“量化、编码”消耗的时间则比“采样、保持”更长。在STM32中,ADC的总转换时间 为:
T C O N V = 采样时间 + 12.5 个 A D C 周期 T_{CONV} = 采样时间 + 12.5个ADC周期

CONV

 =采样时间+12.5个ADC周期

采样时间:在配置ADC的多路选择开关时可选,是ADC采样周期的倍数,如1.5倍、7.5倍、13.5倍、……、239.5倍。
ADC周期:就是从RCC分频过来的RCCCLK(最高14MHz),总采样时间不会小于1 μ s 1\mu s1μs。

1.7校准

ADC有一个内置自校准模式。校准可大幅减小因内部电容器组的变化而造成的准精度误差。校准期间,在每个电容器上都会计算出一个误差修正码(数字值),这个码用于消除在随后的转换中每个电容器上产生的误差。

  • 建议在每次上电后执行一次校准。
  • 启动校准前, ADC必须处于关电状态超过至少两个ADC时钟周期。
  • 校准过程的代码是固定的,只需要在ADC初始化之后加几句代码即可。

1.8外围电路设计

 

  • 在设计ADC的模拟输入源时,为确保电路安全,可选择以下几种方案:
  • 电位器产生可调电压:注意阻值不要太小(最少为kΩ级),以防烧毁电位器。
  • 传感器输出电压:如光敏电阻、热敏电阻、红外接收管、麦克风等,都可以等效为一个可变电阻。通过与一个固定电阻(应于传感器阻值相近)进行分压,从而输出可调电压,此电路图中输出电压与传感器阻值成正比。比如本节就直接用传感器模块的AO引脚。
  • 简易电压转换电路:经过分压后就可以采集05V、010V的输入电压值,但是若电压再高,建议使用专用的采集芯片,如隔离放大器等,做好高低电压的隔离进而保护电路安全。

 

二.ADC单通道 

main.c

#include "stm32f10x.h"                  // Device header
#include "OLED.h"
#include "ADC_User.h"int main(void){//OLED显示屏初始化OLED_Init();OLED_ShowString(1,1,"Voltage-PA0:");OLED_ShowString(2,1,"+00.00 V");    //ADC初始化ADC_User_Init();ADC_User_Start();while(1){OLED_ShowFloat(2,1,(float)ADC_User_Get()*3.3/4095,2,2);};
}

 - ADC_User.h

#ifndef __ADC_USER_H
#define __ADC_USER_Hvoid ADC_User_Init(void);
void ADC_User_Start(void);
uint16_t ADC_User_Get(void);#endif

- ADC_User.c

#include "stm32f10x.h"                  // Device header//ADC初始化-规则组PA0
void ADC_User_Init(void){//1.开启外设时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);RCC_ADCCLKConfig(RCC_PCLK2_Div6);//6分频使得ADC时钟为12MHz//2.配置GPIOGPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AIN;//模拟输入GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_0;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);//3.配置多路开关,选择通道进入规则组ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_1Cycles5);//4.配置ADC转换器ADC_InitTypeDef ADC_InitStructure;ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//连续转换ADC_InitStructure.ADC_DataAlign          = ADC_DataAlign_Right;//数据右对齐ADC_InitStructure.ADC_ExternalTrigConv   = ADC_ExternalTrigConv_None;//不使用外部触发(软件触发)ADC_InitStructure.ADC_Mode               = ADC_Mode_Independent;//独立模式ADC_InitStructure.ADC_NbrOfChannel       = 1;//只有1个通道(非扫描模式,参数不起作用)ADC_InitStructure.ADC_ScanConvMode       = DISABLE;//非扫描模式(因为是单通道)ADC_Init(ADC1, &ADC_InitStructure);//5.配置开关控制ADC_Cmd(ADC1, ENABLE);//6.进行ADC校准ADC_ResetCalibration(ADC1);while(ADC_GetResetCalibrationStatus(ADC1)==SET);ADC_StartCalibration(ADC1);while(ADC_GetCalibrationStatus(ADC1)==SET);
}//对ADC进行一次软件触发
void ADC_User_Start(void){ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}//获取ADC转换结果
uint16_t ADC_User_Get(void){//等待转换完成并读取while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC) == RESET);return ADC_GetConversionValue(ADC1);//硬件会自动清除EOC标志位
}
  • GPIO配置成模拟输入AIN模式。AIN模式下,GPIO口无效,可以防止GPIO的输入输出对模拟电压造成干扰。AIN模式是ADC的专属模式。实际测试中,浮空输入、上拉输入、模拟输入的展示效果几乎没有区别(但是硬件原理完全不同)。
  • 函数提示设置:找到扳手图标—->Text Completion栏—->把Show Code Completion List For下面的框全部勾上。
  • 读取规则组数据后,无需软件清除EOC标志位。参考手册中说明,读取ADCC_DR就会自动清除EOC标志位。所以参考手册还是非常重要!!
  • 关于数据抖动。实测发现ADC转换后的结果会抖动,若想消除这种现象,可以有以下几种方法:
  • 迟滞比较:设置两个阈值,低于下阈值执行操作,高于上阈值执行操作。
  • 滤波:如均值滤波(LPF)。
  • 裁剪分辨率:去除转换结果的最后抖动的几位。
     

三。ADC多通道

 同时获取电位器、光敏电阻模块、热敏电阻模块、反射红外模块共四组数字量。

  main.c

#include "stm32f10x.h"                  // Device header
#include "OLED.h"
#include "ADC_User.h"int main(void){int i = 0;//OLED显示屏初始化OLED_Init();OLED_ShowString(1,1,"C0:00.00 V");OLED_ShowString(2,1,"C1:00.00 V");OLED_ShowString(3,1,"C2:00.00 V");OLED_ShowString(4,1,"C3:00.00 V");//ADC初始化ADC_User_InitMuti();while(1){for (i=0;i<4;i++){ADC_User_MutiSel(i);ADC_User_Start();OLED_ShowFloat(i+1,4,(float)ADC_User_Get()*3.3/4095,2,2);}};
}

ADC_User.c

//ADC多通道初始化-ADC1的通道0~3-PA0~PA3共四个通道
void ADC_User_InitMuti(void){//1.开启外设时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);RCC_ADCCLKConfig(RCC_PCLK2_Div6);//6分频使得ADC时钟为12MHz//2.配置GPIOGPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AIN;//模拟输入GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);//3.配置多路开关,选择通道进入规则组ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_1Cycles5);//4.配置ADC转换器ADC_InitTypeDef ADC_InitStructure;ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;//单次转换ADC_InitStructure.ADC_DataAlign          = ADC_DataAlign_Right;//数据右对齐ADC_InitStructure.ADC_ExternalTrigConv   = ADC_ExternalTrigConv_None;//不使用外部触发(软件触发)ADC_InitStructure.ADC_Mode               = ADC_Mode_Independent;//独立模式ADC_InitStructure.ADC_NbrOfChannel       = 1;//只有1个通道(非扫描模式,参数不起作用)ADC_InitStructure.ADC_ScanConvMode       = DISABLE;//非扫描模式(因为是单通道)ADC_Init(ADC1, &ADC_InitStructure);//5.配置开关控制ADC_Cmd(ADC1, ENABLE);//6.进行ADC校准ADC_ResetCalibration(ADC1);while(ADC_GetResetCalibrationStatus(ADC1)==SET);ADC_StartCalibration(ADC1);while(ADC_GetCalibrationStatus(ADC1)==SET);
}//使用ADC的多路开关,选择哪个通道
//通道范围0~3
void ADC_User_MutiSel(uint16_t channelx){switch(channelx){case 0: ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_1Cycles5); break;case 1: ADC_RegularChannelConfig(ADC1,ADC_Channel_1,1,ADC_SampleTime_1Cycles5); break;case 2: ADC_RegularChannelConfig(ADC1,ADC_Channel_2,1,ADC_SampleTime_1Cycles5); break;case 3: ADC_RegularChannelConfig(ADC1,ADC_Channel_3,1,ADC_SampleTime_1Cycles5); break;default: ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_1Cycles5); break;}
}
//注意别忘了在ADC_User.h头文件中声明

 

up感言:

如何实现多通道ADC。若使用扫描模式实现多通道ADC,需要考虑数据覆盖的问题。下面是几种实现ADC多通道的思路:
扫描模式+DMA转运数据:DMA是转运多通道数据的最优解,但下节才学DMA,本节用不了。
扫描模式+手动转运数据:存在两个问题,一个是ADC在最后一个通道转换完成后才会产生EOC标志位,此时,数据寄存器早就被覆盖成最后一个通道的数据了,所以无法确定某个通道的转运时刻;ADC转换速度非常快,对于手动转运数据的要求非常高。解决思路就是使用间断模式,可以使ADC每转换一个通道就暂停一次,等待下一次触发才进行下一个通道的转换。于是便可以:触发–>Delay一段足够长的时间–>手动转运完数据–>触发……不难发现,效率极低。
非扫描模式+“时分复用”【本节思路】:还是采用“单次转换、非扫描模式”的单路ADC,但是可以不断第更换通道–>触发ADC–>读取数据,以软件完成扫描模式,进而实现多路ADC“单次转换、扫描模式”的功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/222707.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于博弈树的开源五子棋AI教程[4 静态棋盘评估]

引子 静态棋盘的评估是棋力的一个很重要的体现&#xff0c;一个优秀的基于博弈树搜索的AI往往有上千行工作量&#xff0c;本文没有做深入讨论&#xff0c;仅仅写了个引子用来抛砖引玉。 评估一般从两个角度入手&#xff0c;一个是子力&#xff0c;另一个是局势。 1 评估维度 …

R语言贝叶斯网络模型、INLA下的贝叶斯回归、R语言现代贝叶斯统计学方法、R语言混合效应(多水平/层次/嵌套)模型

目录 ㈠ 基于R语言的贝叶斯网络模型的实践技术应用 ㈡ R语言贝叶斯方法在生态环境领域中的高阶技术应用 ㈢ 基于R语言贝叶斯进阶:INLA下的贝叶斯回归、生存分析、随机游走、广义可加模型、极端数据的贝叶斯分析 ㈣ 基于R语言的现代贝叶斯统计学方法&#xff08;贝叶斯参数估…

微信小程序promise封装

一. 在utils文件夹内创建一个request.js 写以下封装的 wx.request() 方法 const baseURL https:// 域名 ; //公用总路径地址 export const request (params) > { //暴露出去一个函数&#xff0c;并且接收一个外部传入的参数let dataObj params.data || {}; //…

数字化生活:数据可视化的力量

数据可视化已经逐渐渗透到我们的日常生活中&#xff0c;并在许多方面为我们提供了便利与启发。它不仅仅是数据的图形展示&#xff0c;更是一种改变我们对信息理解方式的工具。下面我就以可视化从业者的角度出发&#xff0c;简单聊聊如何让数据可视化为我们的生活服务。 首先&am…

Baumer工业相机堡盟工业相机如何通过BGAPI SDK实现Raw格式的图像保存(C#)

Baumer工业相机堡盟工业相机如何通过BGAPI SDK实现Raw格式的图像保存&#xff08;C#&#xff09; Baumer工业相机Baumer工业相机通过SDK实现Raw格式的图像保存的技术背景通过SDK获取相机信息的代码分析Baumer工业相机回调函数里保存原始图像数据Baumer保存Raw图像格式重要核心代…

[BackdoorCTF 2023] pwn

一个国外小比赛&#xff0c;还好能下载附件。 Baby Formatter 一连3道格式化字符串&#xff0c;但都不难 有两个菜单&#xff0c;一个是泄露栈地址和libc&#xff0c;另一个是格式化字符串但过滤掉了pudx&#xff0c;好在还有大量可用的符号。比如li 以长整型的方式输出。 …

华为全屋wifi6蜂鸟套装标准

华为政企42 华为政企 目录 上一篇华为安防监控摄像头下一篇华为企业级无线路由器

<JavaEE> 网络编程 -- 网络编程和 Socket 套接字

目录 一、网络编程的概念 1&#xff09;什么是网络编程&#xff1f; 2&#xff09;网络编程中的基本概念 1> 收发端 2> 请求和响应 3> 客户端和服务端 二、Socket套接字 1&#xff09;什么是“套接字”&#xff1f; 2&#xff09;Socket套接字的概念 3&…

案例135:基于微信小程序的房屋租赁管理系统的设计与实现

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…

RIPV1配置实验

查看路由器路由表&#xff1a; 删除手工配置的静态路由项&#xff1a; Route1->Config->static Remove删除路由项 删除Route3的路由项&#xff0c;方法同上删除Route2的路由项&#xff0c;方法同上 完成路由器RIP配置&#xff1a; Route1->Config->RIP->Ne…

软件渗透测试有哪些测试流程?权威安全测试报告的重要性

软件渗透测试也是安全测试的一种&#xff0c;是通过模拟恶意黑客的攻击方法&#xff0c;来评估计算机网络系统安全的一种评估方法。作为网络安全防范的一种新技术&#xff0c;对于网络安全组织具有实际应用价值。 一、软件渗透测试的过程   软件渗透测试的过程通常包括四个主…

使用bs4 分析html文件

首先需要 pip install beautifulsoup4安装 然后为了方便学习此插件&#xff0c;随便打开一个网页&#xff0c;然后鼠标右键&#xff0c;打开源网页&#xff0c;如下图片 这样就可以获得一个网页源码&#xff0c;全选复制粘贴到本地&#xff0c;存储为 .html 文件&#xff0c;…

案例101:基于微信小程序的停车共享小程序

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…

【网络安全】学习Web安全必须知道的一本书

【文末送书】今天推荐一本网络安全领域优质书籍。 目录 正文实战案例1&#xff1a;使用Docker搭建LAMP环境实战案例2&#xff1a;使用Docker搭建LAMP环境文末送书 正文 学习Web安全离不开Web&#xff0c;那么&#xff0c;需要先来学习网站的搭建。搭建网站是每一个Web安全学习…

项目中webpack优化配置(1)

项目中webpack优化配置 一. 开发效率&#xff0c; 体验 1. DLL&#xff08;开发过程中减少构建时间和增加应用程序的性能&#xff09; 使用 DllPlugin 进行分包&#xff0c;使用 DllReferencePlugin(索引链接) 对 manifest.json 引用&#xff0c;让一些基本不会改动的代码先…

【Java JMM】编译和优化

1 前端编译 在 Java 技术下, “编译期” 是一个比较含糊的表述, 因为它可能指的是 前端编译器 (“编译器的前端” 更准确一些) 把 *.java 文件转变成 *.class 文件的过程Java 虚拟机的即时编译器 (常称 JIT 编译器, Just In Time Compiler) 运行期把字节码转变成本地机器码的过…

Ubuntu 常用命令之 chown 命令用法介绍

&#x1f4d1;Linux/Ubuntu 常用命令归类整理 chown 命令在 Ubuntu 系统中用于改变文件或目录的所有者和组。这个命令的基本格式是 chown [选项]... [所有者][:[组]] 文件...。 chown 命令的主要参数有 -c 或 --changes&#xff1a;类似 verbose&#xff0c;但只在发生改变时…

【泛型中K T V E? Object等分别代表什么含 义】

✅ 泛型中K T V E? Object等分别代表什么含义 ✅ 典型解析✅代码示例 ✅ 典型解析 E - Element (在集合中使用&#xff0c;因为集合中存放的是元素) T-Type (Java 类) K- Key (键) V - Value (值) N - Number (数值类型) ? - 表示不确定的iava类型 (无限制通配符类型) …

树莓派-Pico控制舵机

目录 前言一、SG90舵机是什么&#xff1f;参数介绍工作原理 二、与舵机信号线的接线图三、给树莓派Pico注入灵魂&#xff08;代码&#xff09;总结 前言 这价格便宜的树莓派Pico总觉得应该拿来做点什么&#xff0c;它总不能只用来点亮几个灯就没别的用途了吧&#xff0c;所以就…

自制数据库空洞率清理工具-C版-01-EasyClean-V1.0(支持南大通用数据库Gbase8a)

目录 一、环境信息 二、简述 三、支持功能 四、空洞率 五、工具流程图 六、安装包下载地址 七、参数介绍 1、命令模板 2、命令样例 3、参数表格 八、安装步骤 1、配置环境变量 2、生效环境变量 3、检验动态链接是否正常 九、运行效果 一、环境信息 名称值CPUInt…