尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
STM32 GPIO驱动L298N双H桥直流电机正反转与PWM调速
简介面向STM32入门与直流电机控制实践的图文资料围绕STM32F103C8T6配合L298N驱动两路直流电机讲清正转、反转与停止的按键控制思路。压缩包内共1个PDF文件约6.97MB以图文说明和代码片段为主体便于按硬件连接、控制逻辑与程序结构逐段查阅。内容覆盖L298N与主控的引脚连接、共地处理、5V供电与升压注意事项并给出GPIO初始化、按键扫描及电机正反转/停止控制代码读者可据此搭建双电机实验并理解H桥驱动逻辑。文末还提示独立12V供电、中断响应、编码器测速与异常处理等优化方向适合课程设计、毕设前期验证和自学参考。已有939人学习可作为快速上手STM32电机控制的实践样本。1. 手上只有一块 STM32F103C8T6、一个 L298N 和两个小直流电机怎么让它转起来实验室抽屉里翻出来的东西往往是这样的一块 STM32F103C8T6 最小系统板一个红色底板的 L298N 双 H 桥模块两个黄色减速电机再配几根杜邦线。想做的动作也很朴素——按一下正转按一下反转按一下停。真上手才会发现卡住人的从来不是那几行 GPIO 代码而是 L298N 的 12V、GND、5V 三个端子到底怎么接共地为什么不能省以及为什么代码逻辑全对、电机就是纹丝不动。这份资源给的正是一套能跑通的最小闭环PA2PA5 四个 IO 接 L298N 的 IN1IN4开发板板载按键做输入motor.c 里六个动作函数两台电机各正转、反转、停止main.c 里一个 switch 分发。它适合刚摸到 STM32 GPIO 输出这一章、想找个能看见物理反馈的练手项目的人也适合需要给机械结构做快速点动验证的调试场景。下面按接口层、工程层、交互层、排错层、进阶层拆开讲代码可以直接抄。2. L298N 的接口层四个 IN 脚背后的双 H 桥怎么讲理2.1 真值表先立住为什么两个高电平是刹车而不是断电L298N 内部是两组独立的 H 桥每一组由四个功率管组成负载接在桥臂中点。IN1、IN2 这两个逻辑输入并不直接驱动管子而是经过内部逻辑门去分配导通组合IN1 高、IN2 低电流从上桥臂流向负载再回到下桥臂电机朝一个方向转IN1 低、IN2 高桥臂极性翻转电机反向。这两条是最容易理解的。真正容易翻车的是停止。很多人下意识觉得停就是把两个输入都拉低实际效果却是电机惯性滑行——因为四个管子全关电机绕组两端悬空反电动势没有泄放回路转子靠惯性慢慢停。而资源里Motor_1_STOP()把 IN1、IN2 同时置高这在 H 桥里对应的是下桥臂或上桥臂同时导通绕组被短接反电动势在回路里形成制动电流电机是刹住的响应快得多。IN1IN2桥臂状态电机表现00四管全关自由滑行惯性停01反向导通反转10正向导通正转11桥臂短接快速制动这个表决定了后面所有代码的写法。如果做的是小车转弯时需要一侧轮子快速停下配合另一侧转动就该用1/1的制动态如果做的是传送带希望停机时不产生机械冲击那0/0的滑行态反而更合适。资源里选了制动态属于能立刻停住的取向做小车差速转向时这个选择是对的。还有一点要提醒制动态下电机会有一股明显的保持力矩此时如果用手去拧输出轴能感觉到阻力。这个现象可以在调试时用来反推代码有没有生效——不需要接示波器手拧一下就知道 GPIO 到底有没有输出。2.2 3.3V 推挽能不能驱动 5V 逻辑的 L298N这是问得最多的一条。L298N 模块的逻辑供电标称 5V很多人担心 STM32 的 3.3V 高电平不足以被识别成逻辑 1。查 L298N 的数据手册逻辑输入的高电平门限典型值在 2.3V 左右3.3V 是稳稳过线的实际接线中直接连就行不需要加电平转换芯片。真正的隐患在电流和边沿上。STM32 的 GPIO 推挽输出单脚可以灌/拉 20mA 以上驱动 L298N 的逻辑输入输入阻抗很高微安级绰绰有余问题出在速度配置。资源里GPIO_Speed_50MHz是最高档对电机控制这种毫秒级动作来说完全是浪费边沿过陡反而会在杜邦线上产生振铃。我一般会降到GPIO_Speed_2MHz够用且干净。另一个细节是初始化后的默认电平。Motor_12_Config()结尾用GPIO_ResetBits把四个脚一次性拉低此时电机处于滑行态上电瞬间不会突然窜一下。如果不做这一步GPIO 复位后的默认状态虽然是输入浮空但外接模块可能因为上拉把输入拉高出现上电自转的玄学现象。// 初始化时把四个 IN 脚统一拉低保证上电静默 GPIO_ResetBits(GPIOA, GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5);这行代码看着平淡实际是上电不抽风的第一道保险。建议在Motor_12_Config()里保留不要图省事删掉。2.3 电源拓扑共地、升压板与那个不能接的 5V 端子L298N 模块上有三个电源端子12V、GND、5V。这三者不是随便接的。12V是电机功率输入GND是功率地5V是板载 7805 稳压器的输出也可以反过来作为外部 5V 输入取决于板上跳线帽状态。资源里的场景很真实手头没有 12V 电源用升压板把 5V 抬到 12V 喂给 L298N。此时 5V 端子悬空是对的——板载 7805 从 12V 取电自己产生 5V 供内部逻辑使用如果再把外部 5V 灌进去两路电源打架逻辑电平被拉偏表现出来就是电机很难转动甚至完全不转。共地则是另一条硬线。L298N 的 GND 必须和 STM32 的 GND 连在一起因为逻辑电平是相对参考地判断的。不共地的时候STM32 输出 3.3V 高电平但在 L298N 看来这个高相对它自己的地可能是负值或者飘忽不定结果就是按键按下去毫无反应。资源里特意强调引出两条线一接板子 GND二接电源负就是这个道理。提示升压板、开发板、L298N 三者共地且共地点尽量选在电源入口处不要串成一长条。电机启动瞬间的浪涌电流在细杜邦线上会产生毫伏级地弹串链式接地会把这个扰动送进 STM32 的 ADC 和通信口。还有一处常被忽略L298N 内部的功率管是双极型晶体管饱和压降不小12V 供电时电机实际拿到的电压大约只有 10V 出头。如果电机是 12V 额定会感觉转速偏软、带载吃力。这不是代码问题是器件特性想改善只能换 MOSFET 方案的驱动板或者把供电往上提一点注意别超过模块耐压。3. 工程落地从库模板到六个动作函数的完整链路3.1 别从零建工程先找带库的模板STM32F103C8T6 的开发环境里最省事的做法不是新建空工程一个个加文件而是找一份已经配好标准外设库SPL、启动文件、系统时钟配置的模板工程。某家做开发板的厂商提供的库工程模板就是常见选择里面stm32f10x_gpio.c、stm32f10x_rcc.c、system_stm32f10x.c都是齐的main.c里通常还带着 LED 和串口的示例。找到模板之后把motor.c、motor.h、key.c、key.h、delay.c、delay.h这几个文件加进工程组然后在 Keil 的 Options → C/C → Include Paths 里把这些文件所在目录加进去。这一步漏了编译时会报一堆 cannot open source input file看着吓人其实就是头文件路径没配。关于「stm32 软件/插件」这一块实际用到的就三样Keil MDK 本身、器件支持包Device Family Pack装完才能在器件列表里选到 STM32F103C8、以及 ST-Link 或 DAP-Link 的调试驱动。器件包版本不必追新能识别到 C8T6 且带 Flash 算法就行调试驱动装完在 Debug 选项卡里能看到 SWD 识别出 IDCODE 才算通了。3.2 Motor_12_Config 里的三行关键配置初始化函数看着长真正决定行为的只有三行时钟使能、引脚模式、输出速度。void Motor_12_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; // 1) 开 GPIOA 的 APB2 时钟漏了这行后面所有配置都无效 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 2) 四个 IN 脚一组配置避免重复写四遍 GPIO_InitStructure.GPIO_Pin GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5; GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP; // 推挽输出能主动拉高拉低 GPIO_InitStructure.GPIO_Speed GPIO_Speed_2MHz; // 电机控制不需要高速边沿 GPIO_Init(GPIOA, GPIO_InitStructure); // 3) 初始电平拉低上电不转 GPIO_ResetBits(GPIOA, GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5); }第一行的时钟使能是新手第一大坑。STM32 的外设默认全部关时钟以省电不给 GPIOA 开时钟后面GPIO_Init写寄存器全部落空程序不报错、就是没反应属于典型的黑匣子故障。第二行的模式选择里GPIO_Mode_Out_PP是推挽能输出强高和强低如果误选成GPIO_Mode_Out_OD开漏高电平只能靠外部上拉而 L298N 模块的输入端未必带上拉结果就是只能拉低不能拉高电机永远单方向转或者不转。速度参数从 50MHz 改成 2MHz 是我的习惯不是硬性要求。高频边沿在长杜邦线上更容易串扰而电机控制的时序余量是毫秒级的慢一点更稳。3.3 宏封装 IN1(a) 的写法与它的代价motor.h里用宏把电平操作包了一层#define High 1 #define Low 0 #define IN1(a) if (a) \ GPIO_SetBits(GPIOA, GPIO_Pin_2); \ else \ GPIO_ResetBits(GPIOA, GPIO_Pin_2)好处是动作函数读起来像伪代码Motor_1_PRun()里直接写IN1(Low); IN2(High);一眼能对上真值表。代价是宏展开没有类型检查且if...else不带花括号一旦写成if (x) IN1(High); else ...这种嵌套else 会跟内层 if 配对产生悬垂 else 问题。我一般会在宏里补上do { ... } while (0)的壳或者干脆改成static inline函数。后者更安全编译器还能做内联优化代码体积不会变大static inline void IN1(uint8_t level) { if (level) GPIO_SetBits(GPIOA, GPIO_Pin_2); else GPIO_ResetBits(GPIOA, GPIO_Pin_2); }六个动作函数本身没有任何玄机就是把真值表翻译成两次电平写操作。需要注意的是两台电机的引脚分配电机 1 用 PA2/PA3IN1/IN2电机 2 用 PA4/PA5IN3/IN4中间不要交叉。交叉了会出现按正转时一个轮子正转另一个反转看起来像代码有 bug其实是接线或宏定义写串了。如果发现某个电机方向与预期相反最省事的修正不是改代码而是把 L298N 上 OUT1、OUT2 这两根线对调——资源正文里也是这么建议的。改线比改代码直观而且不会影响其他逻辑。4. 按键接管电机扫描、消抖与主循环的组织4.1 上拉与下拉WK_UP 为什么要单独配KEY_Init()里对两组按键用了不同的输入模式这个区别值得说清楚。KEY0 接 PE4、KEY1 接 PE3都配成GPIO_Mode_IPU上拉输入WK_UP 接 PA0配成GPIO_Mode_IPD下拉输入。原因在于按键的硬件接法。KEY0、KEY1 一端接 IO、另一端接 GND平时没按下时 IO 悬空必须靠内部上拉拉成高电平按下后 IO 被短到地读到 0所以判断条件是KEY0 0。WK_UP 反过来一端接 IO、另一端接 VCC通常是 3.3V平时靠内部下拉保持低电平按下后读到 1判断条件是WK_UP 1。这个区别如果搞反表现是按键一直处于按下状态或者完全没反应。资源里KEY_Scan的判断条件KEY00 || KEY10 || WK_UP1正是按这个接法写的抄代码时千万别把这三个条件统一成一种。// 两组按键两种上下拉别合并成一次 GPIO_Init GPIO_InitStructure.GPIO_Pin GPIO_Pin_4 | GPIO_Pin_3; GPIO_InitStructure.GPIO_Mode GPIO_Mode_IPU; // KEY0/KEY1 上拉 GPIO_Init(GPIOE, GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode GPIO_Mode_IPD; // WK_UP 下拉 GPIO_Init(GPIOA, GPIO_InitStructure);另外PE3、PE4 和 PA0 分属两个端口时钟使能时要同时开 GPIOA 和 GPIOERCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOE, ENABLE)这一句两个都不能少。4.2 KEY_Scan 的优先级与那个 key_up 标志KEY_Scan函数不长但有两个设计点值得拆开看。第一个是静态变量key_up。它的作用是记录上一次是不是已经松手了。没有它按住按键不放时主循环会以极高频率反复触发同一个动作电机控制上表现为反复重入虽然本例只是设电平看不出问题但一旦后面加了计数、加了状态切换就会乱套。加上key_up之后一次按下只返回一次有效键值松手后才复位。第二个是mode参数。传 0 表示不支持连按传 1 表示支持连按。资源里main调用的是KEY_Scan(0)即点动式按一下正转松手后电机保持正转因为电平状态被保持住了再按反转才换向。这个行为是符合电机控制的直觉的如果改成 1按住正转键电机会一直转、松手就停那就变成了按住才动的遥控模式需求不同选不同。优先级方面函数里的判断顺序是 KEY0 → KEY1 → WK_UP同时按下时只有 KEY0 生效。这在单键操作场景里问题不大但如果后面要扩展成组合键比如同时按两个键做校准这个顺序就得重新设计。消抖用的是delay_ms(10)的软件延时。这个方法简单有效缺点是阻塞——这 10ms 里 CPU 什么都干不了。做单一按键控制够用一旦系统里还有串口收数据、定时器计数就会丢事件。这是后面进阶章节要处理的问题。4.3 main 里的 switch 与那个 10 秒延时主循环的结构很直白扫描按键拿到键值就进 switch分三路调用对应的电机函数末尾delay_ms(1)或者delay_ms(10)让出一点时间。while (1) { key KEY_Scan(0); if (key) { switch (key) { case WKUP_PRES: Motor_1_PRun(); Motor_2_PRun(); break; case KEY1_PRES: Motor_1_NRun(); Motor_2_NRun(); break; case KEY0_PRES: Motor_1_STOP(); Motor_2_STOP(); break; default: break; } } else { delay_ms(10); } }这里有个细节switch里每个 case 末尾的delay_ms(1)其实没有太大意义因为动作函数只写两次寄存器耗时在微秒级。真正需要延时的是else分支作用是没按键时降低循环频率、减少无谓的 CPU 占用。我一般会把这个值设成 1020ms和按键消抖的时间尺度对齐。还有一处要单独拎出来说main函数开头有一句delay_ms(10000)也就是上电后先等 10 秒才进主循环。这在调试阶段是作者留的观察窗口——上电后有时间看电源指示灯、看升压板输出是否稳定、用万用表量一下 12V 轨。但正式使用时这 10 秒会让人觉得板子坏了建议改成 500ms 以内或者直接删掉。注意如果保留长延时务必确认延时函数本身依赖的 SysTick 已经初始化。delay_init()必须排在所有delay_ms()之前顺序反了会直接卡死在延时里现象是程序一下载就不动调试器暂停后停在delay的循环里。5. 避坑与排查电机不转、只转一个、按键乱跳的现场记录5.1 现象程序下载成功按键按下电机完全没动静原因通常有两个方向。一是电源L298N 的12V没上电或者升压板输出没到 12V此时逻辑电路可能靠 STM32 的 IO 漏电流勉强工作但 H 桥没有功率输出。二是共地缺失STM32 的 GND 和 L298N 的 GND 没连逻辑电平没有共同参考点。排查顺序我一般是先万用表量 L298N 的12V与GND之间是不是真有 12V再量 STM32 的 GND 与 L298N 的 GND 之间是不是通的断电状态下量通断最后才怀疑代码。用调试器在Motor_1_PRun()里下断点能进去说明按键链路没问题进不去就往KEY_Scan和按键接线上找。5.2 现象只有一个电机转另一个毫无反应先看 L298N 上的 ENA、ENB 两个使能跳线帽。这两个跳线帽短接时对应通道才使能出厂时通常装着但拆装过程中容易掉。掉了一个那一路就彻底不输出代码写得再对也没用。如果跳线帽都在再查motor.h里的宏定义有没有写串。IN3、IN4 应该对应 PA4、PA5如果误写成 PA3、PA4就会出现两个通道抢同一个引脚表现是一个转一个不转。这种错误编译器不会报只能靠对引脚表。5.3 现象电机转但方向反了或者两个轮子转向相反方向反了是最容易解决的把 L298N 上对应通道的 OUT1、OUT2或 OUT3、OUT4两根线对调即可不用改代码。两个轮子转向相反说明其中一个通道的接线顺序和另一个不一致同样用对调输出的方式统一。有一种情况不能靠对调解决如果正转时两个轮子都往前反转时一个往前一个往后那说明两台电机的安装方向本身就是镜像的常见于差速小车左右轮这时要么在代码里给其中一个通道反向要么在机械上把电机转 180 度装。5.4 现象按一下键电机转一下又停或者按一次触发多次典型的消抖不足或者key_up标志失效。先确认KEY_Scan里的delay_ms(10)还在有人为了提高响应速度把它删了机械按键的抖动时间通常在 520ms删掉必然重复触发。另一种可能是电源纹波干扰。电机启动瞬间的浪涌会拉低电源轨如果按键的上下拉电阻较大、走线又长干扰会耦合进 IO 造成误判。解决办法是给按键并联 0.1μF 电容做硬件滤波或者在软件里把消抖延时加到 20ms。5.5 现象上电瞬间电机猛转一下然后停住GPIO 在复位后的默认状态是浮空输入此时引脚电平由外部决定。如果 L298N 的输入端有上拉或者杜邦线感应到了干扰四个 IN 脚可能短暂处于某个有效组合造成功率管误导通。Motor_12_Config()里的GPIO_ResetBits是在配置完成后立刻拉低但配置到拉低之间仍有微秒级窗口。更稳的做法是在配置成输出之前先把输出数据寄存器ODR写 0再切模式GPIO_ResetBits(GPIOA, GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5); // 先写 ODR GPIO_Init(GPIOA, GPIO_InitStructure); // 再切输出模式这样引脚一变成输出就是低电平中间没有跳变。属于血泪经验一次上电抽风可能烧掉一个电机驱动通道。5.6 现象接上电机后 STM32 复位或程序跑飞电机是感性负载换向和断电瞬间会产生反电动势尖峰沿着电源线回灌。如果 STM32 和 L298N 共用一路 5V尖峰很容易把 MCU 拉复位。解决方式是电源分离STM32 单独用一路 5VUSB 供电即可L298N 的功率电源单独走升压板两者只共地不共电源。同时在电机输出端并一个续流二极管组或者在 L298N 的电源入口并 100μF 以上的电解电容吸收浪涌。6. 进阶把点动开关换成 PWM 调速加死区保护点动控制能验证链路但实际项目里几乎都要调速。L298N 的 ENA、ENB 两个使能脚就是为此准备的拔掉跳线帽把 ENA 接到 STM32 的定时器 PWM 输出脚比如 TIM3_CH1 对应的 PA6用占空比控制平均电压IN1/IN2 仍然负责方向。配置上要注意两点。一是 PWM 频率电机驱动一般选 1020kHz低于人耳听觉下限会听到啸叫太高则开关损耗增加、L298N 这种双极型器件跟不上。二是占空比不要给到 100%留 5% 余量让自举电路如果有维持工作同时避免长时间满占空导致模块过热。参数推荐值说明PWM 频率15kHz避开听觉敏感区兼顾开关损耗占空比范围5%95%留余量避免满占空过热死区时间视驱动方案而定换向前先制动 1050ms防直通加减速斜率每 10ms 变化 5%防止电流冲击触发过流保护换向时的死区是必须加的。如果从正转直接切到反转H 桥在切换瞬间可能出现上下桥臂同时导通形成直通短路轻则触发模块保护重则烧管。稳妥做法是换向流程走三步先置制动态IN1IN21保持 20ms 让电机停稳再把方向脚翻转最后重新给 PWM。这三步封装成一个Motor_ChangeDir()函数调用方就不需要关心时序了。void Motor_1_ChangeDir(uint8_t dir, uint8_t duty) { Motor_1_STOP(); // 先制动等绕组电流泄放 delay_ms(20); // 死区时间不能省 if (dir) Motor_1_PRun(); else Motor_1_NRun(); TIM_SetCompare1(TIM3, duty); // 重新给占空比 }验证调速是否真的生效别只看转速。用示波器量 PA6 的波形看占空比是否随按键变化或者用万用表直流档量电机两端电压读数应该约等于 12V 乘以占空比。如果占空比改了电压不变多半是 ENA 的跳线帽没拔PWM 信号被硬短接到高电平了。从那以后我每次调电机项目都强制先走一遍断电测通断、上电量电压、空载试方向、带载试调速这四步不管板子是不是刚焊好的。省下的那几分钟往往要用一晚上去查一个共地没接的问题。希望帮到你。本文还有配套的精品资源点击获取
RELATED

相关推荐

华为eNSP网络仿真平台:从入门到实战指南

华为eNSP网络仿真平台:从入门到实战指南

1. 华为eNSP概述:网络工程师的虚拟实验室作为一名网络工程师,我深知实验环境的重要性。华为eNSP(Enterprise Network Simulation Platform)正是为解决这个问题而生的利器。这个全功能的网络仿真平台可以完美模拟华为路由器和交换机…

📅 2026/11/6 4:13:24
MyBatis Plus动态SQL拼接问题解析与解决方案

MyBatis Plus动态SQL拼接问题解析与解决方案

1. 问题背景与现象还原最近在项目中使用MyBatis Plus的QueryWrapper构建动态SQL时,遇到了一个典型的拼接问题。具体场景是在自定义XML映射文件中使用Param(Constants.WRAPPER)注解配合${ew.customSqlSegment}时,生成的SQL语句出现了AND条件衔接错误。这个…

📅 2026/11/6 4:08:24
JMeter分布式压力测试实战指南与优化技巧

JMeter分布式压力测试实战指南与优化技巧

1. 压力测试基础概念解析压力测试(Stress Test)作为性能测试的重要组成部分,主要目的是评估系统在极端条件下的表现。在实际工作中,我们通常需要模拟超出正常操作条件的负载,以确定系统的瓶颈和失效点。这种测试方法在…

📅 2026/11/6 4:08:24
MORE NEWS

更多资讯

📰

拆解MGM-Omni-TTS-2B-0927的语音Token机制:6563个token、25Hz帧率与4并行生成的实现原理

人工智能大模型语音音频多模态 【免费下载链接】MGM-Omni-TTS-2B-0927 项目地址: https://ai.gitcode.com/hf_mirrors/wcy1122/MGM-Omni-TTS-2B-0927 点击查看 免费下载 MGM-Omni-TTS-2B-0927 是开源全模态大模型 MGM-Omni 的语音生成(TTS)组…

📰

深入理解Scala可变Map:动态构建场景下的性能与设计权衡

上一篇我们聊了不可变Map——它O(1)的查找、它的函数式操作,在大数据开发里无处不在。但有个问题:如果你要在一个循环里不断往Map里加key-value对,用不可变Map就会很别扭。这时候你需要的就是可变Map。很多人学Scala的时候,记住了…

📰

Wan2.2 开源视频模型:电影级画质 AI 视频生成,普通创作者也能上手

Wan2.2 开源视频模型:电影级画质 AI 视频生成,普通创作者也能上手 【免费下载链接】Wan2.2-T2V-A14B 项目地址: https://ai.gitcode.com/hf_mirrors/Wan-AI/Wan2.2-T2V-A14B Wan2.2 是一个支持文本到视频与图像到视频的开源 AI 视频生成模型系列…

📰

Scrapling Agent Skill 完整指南:一条命令给你的 AI Agent 装上免猜手册

Scrapling Agent Skill 完整指南:一条命令给你的 AI Agent 装上免猜手册 【免费下载链接】Scrapling 🕷️ The BEST Web Scraping framework that handles everything from a single request to a full-scale crawl! Dont be shy, join here: https://di…

📰

Obsidian Arc安全加固清单:TOTP两步验证、Turnstile、PoW工作量证明与审计日志

【免费下载链接】ObsidianArc A self-hosted AI platform with a Go server, multi-provider routing, usage tracking and an admin console, with chat and agentic work modes. 项目地址: https://gitcode.com/gh_mirrors/ob/ObsidianArc 点击查看 免费下载 Obs…

📰

相干长度详解

说白光干涉仪最重要的三个物理量,那就是:一、什么叫相干(Coherence)为什么激光可以一直干涉,而白光只能在很短距离干涉?原因就在于:两束光还能不能保持稳定的相位关系。例如:第一束光 E1Acos…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬