STM标准库-TIM旋转编码器

news2025/6/9 6:00:38

文章目录

  • 一、编码器接口
    • 1.1简介
    • 1.2正交编码器
    • 1.3编码器接口基本结构
      • **1. 模块与 STM32 配置的映射关系**
      • **2. 设计实现步骤(核心流程)**
        • **① 硬件规划**
        • **② 时钟使能**
        • **③ GPIO 配置(对应架构图 “GPIO” 模块)**
        • **④ 时基单元配置(对应架构图 “时基单元”)**
        • **⑤ 输入滤波 + 极性配置(对应架构图 “滤波器、边沿 / 极性选择”)**
        • **⑥ 编码器接口模式(对应架构图 “编码器接口”)**
        • **⑦ 使能定时器,开始计数**
        • **⑧ 数据读取(轮询 / 中断)**
      • **3. 关键逻辑说明**
    • 1.4工作模式
    • 1.5实例(均不反相)
    • 1.6实例(TI1反相)
  • 二、编码器接口测速
    • 2.1接线图
    • 2.2相关API
      • 一、编码器接口配置 API
        • 1. `TIM_EncoderInterfaceConfig()`
      • 二、计数器操作 API
        • 2. `TIM_SetCounter()`
        • 3. `TIM_GetCounter()`
      • 三、编码器方向控制 API
        • 4. `TIM_GetCounterMode()`
      • 四、编码器溢出标志 API
        • 5. `TIM_GetFlagStatus()`
      • 五、编码器中断配置 API
        • 6. `TIM_ITConfig()`
      • 六、编码器接口状态读取 API
        • 7. `TIM_GetCapture1()` / `TIM_GetCapture2()`
    • 2.3代码
    • 2.4现象

一、编码器接口

1.1简介

  • Encoder Interface 编码器接口
  • 编码器接口可接收增量(正交)编码器的信号,根据编码器旋转产生的正交信号脉冲,自动控制CNT
  • 自增或自减,从而指示编码器的位置、旋转方向和旋转速度
  • 每个高级定时器和通用定时器都拥有1个编码器接口
  • 两个输入引脚借用了输入捕获的通道1和通道2

1.2正交编码器

在这里插入图片描述

  • 正交编码器:两个方波信号相位相差90°,超前90°或者滞后90°,分别代表正转和反转。
  • 工作流程:根据编码器旋转产生的正交信号脉冲自动控制CND自增或自减,从而指示编码器的位置、旋转方向和旋转速度。

1.3编码器接口基本结构

在这里插入图片描述

  • 编码器测速实际上就是测频法测正交脉冲的频率。

  • 要基于该架构图设计实现编码器接口,可按 “模块映射→配置步骤→代码实现” 逻辑展开,核心是将架构图的功能模块对应到 STM32的寄存器配置:

1. 模块与 STM32 配置的映射关系

架构图模块STM32 功能配置关键 API / 参数
GPIO编码器信号输入引脚初始化(上拉输入)GPIO_Mode_IPU
滤波器输入信号滤波(抗抖动)TIM_ICFilter = 0xF(高滤波)
边沿 / 极性选择信号边沿检测与极性反转TIM_ICPolarity_Rising/Falling
编码器接口正交信号计数模式(双相 / 单相)TIM_EncoderMode_TI12
时基单元计数器范围(ARR)和预分频(PSC)TIM_Period=65535TIM_Prescaler=0

2. 设计实现步骤(核心流程)

① 硬件规划
  • 选定定时器(如 TIM3),其 CH1(PA6)、CH2(PA7) 引脚连接编码器 A 相、B 相
② 时钟使能

c

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);   // 使能TIM3时钟  
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  // 使能GPIOA时钟  
③ GPIO 配置(对应架构图 “GPIO” 模块)

c

GPIO_InitTypeDef GPIO_InitStructure;  
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;          // 上拉输入,稳定信号  
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7; // PA6(CH1)、PA7(CH2)  
GPIO_Init(GPIOA, &GPIO_InitStructure);  
④ 时基单元配置(对应架构图 “时基单元”)

c

TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;  
TIM_TimeBaseInitStructure.TIM_Period = 65535;          // ARR=65535(最大计数范围)  
TIM_TimeBaseInitStructure.TIM_Prescaler = 0;           // PSC=0(计数器由外部信号驱动,预分频无实际作用)  
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; // 初始方向(编码器会覆盖)  
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure);  
⑤ 输入滤波 + 极性配置(对应架构图 “滤波器、边沿 / 极性选择”)

c

TIM_ICInitTypeDef TIM_ICInitStructure;  
TIM_ICStructInit(&TIM_ICInitStructure);                // 结构体默认值初始化  
TIM_ICInitStructure.TIM_ICFilter = 0xF;                // 最高滤波等级,抗抖动  
TIM_ICInit(TIM3, &TIM_ICInitStructure);                // 配置CH1  
TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;       // 切换到CH2  
TIM_ICInit(TIM3, &TIM_ICInitStructure);                // 配置CH2  
⑥ 编码器接口模式(对应架构图 “编码器接口”)

c

TIM_EncoderInterfaceConfig(  
    TIM3,                      // 定时器  
    TIM_EncoderMode_TI12,      // 双相计数(TI1、TI2边沿均响应,精度×2)  
    TIM_ICPolarity_Rising,     // CH1不反相(上升沿触发)  
    TIM_ICPolarity_Rising      // CH2不反相(上升沿触发)  
);  
⑦ 使能定时器,开始计数

c

TIM_Cmd(TIM3, ENABLE);  // 启动计数器,响应编码器信号  
⑧ 数据读取(轮询 / 中断)

c

// 轮询方式:直接读取计数值  
int16_t encoderValue = TIM_GetCounter(TIM3);  

// 中断方式:配合TIM2定时中断(如题目代码),周期性读取增量  

3. 关键逻辑说明

  • 架构图的信号流
    编码器 A/B 相 → GPIO 输入 → 滤波器(TIM_ICFilter)→ 边沿 / 极性处理(TIM_ICPolarity)→ 生成 TI1FP1/TI2FP2 → 编码器接口 → 驱动时基单元 CNT 计数。
  • 计数方向自动控制
    编码器接口根据 TI1、TI2 的边沿跳变顺序,自动控制 CNT 向上 / 向下计数(正转 / 反转),无需软件判断方向。

1.4工作模式

在这里插入图片描述

1.5实例(均不反相)

在这里插入图片描述

1.6实例(TI1反相)

在这里插入图片描述

二、编码器接口测速

2.1接线图

在这里插入图片描述

  • 编码器需要接入两路正交信号(A 相和 B 相),对应定时器的 通道 1(CH1)和通道 2(CH2)。
  • CH1 对应 PA6,CH2 对应 PA7(参考 STM32F103C8T6 数据手册)。
    TIM3 作为 通用定时器,支持编码器接口模式(基本定时器 TIM6/7 不支持),而高级定时器 TIM1 虽支持但通常用于更复杂功能(如互补 PWM 输出)。
  • 编码器接口模式下,TIM3 可通过硬件自动处理正交信号的计数方向(自增 / 自减),无需软件干预,符合 “节约 CPU 资源” 的设计目标。
  1. 若选用其他定时器(如 TIM2)
  • 引脚映射:TIM2 的 CH1/CH2 对应 PA0/PA1,若 PA0/PA1 已被其他外设(如 PWM 输出)占用,则优先选择 TIM3 的 PA6/PA7。
  • 功能冲突:若项目中 TIM2 用于 PWM(如电机驱动),则 TIM3 更适合编码器接口,避免资源冲突。
  1. 高级定时器 TIM1 的局限性
  • TIM1 虽支持编码器接口,但其引脚(如 PA8/PA9)常作为高级 PWM 输出(如三相电机控制),且配置复杂(需额外使能 APB2 时钟),不如通用定时器 TIM3。

2.2相关API

一、编码器接口配置 API

1. TIM_EncoderInterfaceConfig()

运行

void TIM_EncoderInterfaceConfig(TIM_TypeDef* TIMx, uint16_t TIM_EncoderMode, uint16_t TIM_IC1Polarity, uint16_t TIM_IC2Polarity);
  • 功能:配置定时器为编码器接口模式

  • 参数:

    • TIMx:定时器选择(如TIM3

    • TIM_EncoderMode
      

      :编码器模式

      • TIM_EncoderMode_TI1:仅 TI1 计数(A 相)
      • TIM_EncoderMode_TI2:仅 TI2 计数(B 相)
      • TIM_EncoderMode_TI12:TI1 和 TI2 同时计数(双相计数,精度 ×2)
    • TIM_IC1Polarity
      

      :TI1 极性配置

      • TIM_ICPolarity_Rising:不反相(上升沿触发)
      • TIM_ICPolarity_Falling:反相(下降沿触发)
    • TIM_IC2Polarity:TI2 极性配置(同上)

  • 示例

    运行

    TIM_EncoderInterfaceConfig(TIM3, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);
    

二、计数器操作 API

2. TIM_SetCounter()

运行

void TIM_SetCounter(TIM_TypeDef* TIMx, uint16_t Counter);
  • 功能:直接设置定时器计数器值(CNT)

  • 参数:

    • TIMx:定时器选择
    • Counter:目标计数值(0~65535)
  • 示例:

    运行

    TIM_SetCounter(TIM3, 0);  // 清零计数器(常用于读取增量值后复位)
    
3. TIM_GetCounter()

运行

uint16_t TIM_GetCounter(TIM_TypeDef* TIMx);
  • 功能:获取当前计数器值(CNT)

  • 参数 :

    • TIMx:定时器选择
  • 返回值:当前计数值(0~65535)

  • 示例

    运行

    uint16_t count = TIM_GetCounter(TIM3);  // 读取当前计数值
    

三、编码器方向控制 API

4. TIM_GetCounterMode()

运行

uint16_t TIM_GetCounterMode(TIM_TypeDef* TIMx);
  • 功能:获取计数器计数模式(向上 / 向下)

  • 参数 :

    • TIMx:定时器选择
  • 返回值 :

    • TIM_CounterMode_Up:向上计数(编码器正转)
    • TIM_CounterMode_Down:向下计数(编码器反转)
  • 示例

    运行

    uint16_t mode = TIM_GetCounterMode(TIM3);  // 获取当前计数方向
    

四、编码器溢出标志 API

5. TIM_GetFlagStatus()

运行

FlagStatus TIM_GetFlagStatus(TIM_TypeDef* TIMx, uint16_t TIM_FLAG);
  • 功能:检查定时器标志位状态(如溢出标志)

  • 参数:

    • TIMx:定时器选择

    • TIM_FLAG
      

      :标志位选择

      • TIM_FLAG_Update:更新事件标志(计数器溢出 / 下溢)
  • 返回值 :

    • SET:标志位被置位
    • RESET:标志位未被置位
  • 示例:

    运行

    if (TIM_GetFlagStatus(TIM3, TIM_FLAG_Update) == SET) {
        // 处理计数器溢出/下溢事件
        TIM_ClearFlag(TIM3, TIM_FLAG_Update);  // 清除标志位
    }
    

五、编码器中断配置 API

6. TIM_ITConfig()

运行

void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState);
  • 功能:使能或禁用定时器中断

  • 参数 :

    • TIMx:定时器选择

    • TIM_IT
      

      :中断源选择

      • TIM_IT_Update:更新中断(计数器溢出 / 下溢)
    • NewState
      

      :使能状态

      • ENABLE:使能中断
      • DISABLE:禁用中断
  • 示例 :

    c

    运行

    TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);  // 使能TIM3更新中断
    

六、编码器接口状态读取 API

7. TIM_GetCapture1() / TIM_GetCapture2()

运行

uint16_t TIM_GetCapture1(TIM_TypeDef* TIMx);
uint16_t TIM_GetCapture2(TIM_TypeDef* TIMx);
  • 功能:获取编码器接口的捕获值(CCR 寄存器)

  • 参数 :

    • TIMx:定时器选择
  • 返回值 :

    • 通道 1/2 的捕获值(编码器接口中较少使用,主要用于输入捕获模式)

2.3代码

main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "Timer.h"
#include "Encoder.h"

int16_t Speed;			//定义速度变量

int main(void)
{
	/*模块初始化*/
	OLED_Init();		//OLED初始化
	Timer_Init();		//定时器初始化
	Encoder_Init();		//编码器初始化
	
	/*显示静态字符串*/
	OLED_ShowString(1, 1, "Speed:");		//1行1列显示字符串Speed:
	
	while (1)
	{
		OLED_ShowSignedNum(1, 7, Speed, 5);	//不断刷新显示编码器测得的最新速度
	}
}

/**
  * 函    数:TIM2中断函数
  * 参    数:无
  * 返 回 值:无
  * 注意事项:此函数为中断函数,无需调用,中断触发后自动执行
  *           函数名为预留的指定名称,可以从启动文件复制
  *           请确保函数名正确,不能有任何差异,否则中断函数将不能进入
  */
void TIM2_IRQHandler(void)
{
	if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)		//判断是否是TIM2的更新事件触发的中断
	{
		Speed = Encoder_Get();								//每隔固定时间段读取一次编码器计数增量值,即为速度值
		TIM_ClearITPendingBit(TIM2, TIM_IT_Update);			//清除TIM2更新事件的中断标志位
															//中断标志位必须清除
															//否则中断将连续不断地触发,导致主程序卡死
	}
}

Encoder.c

#include "stm32f10x.h"                  // Device header

/**
  * 函    数:编码器初始化
  * 参    数:无
  * 返 回 值:无
  */
void Encoder_Init(void)
{
	/*开启时钟*/
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);			//开启TIM3的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);			//开启GPIOA的时钟
	
	/*GPIO初始化*/
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);							//将PA6和PA7引脚初始化为上拉输入
	
	/*时基单元初始化*/
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;				//定义结构体变量
	TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;     //时钟分频,选择不分频,此参数用于配置滤波器时钟,不影响时基单元功能
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; //计数器模式,选择向上计数
	TIM_TimeBaseInitStructure.TIM_Period = 65536 - 1;               //计数周期,即ARR的值
	TIM_TimeBaseInitStructure.TIM_Prescaler = 1 - 1;                //预分频器,即PSC的值
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;            //重复计数器,高级定时器才会用到
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure);             //将结构体变量交给TIM_TimeBaseInit,配置TIM3的时基单元
	
	/*输入捕获初始化*/
	TIM_ICInitTypeDef TIM_ICInitStructure;							//定义结构体变量
	TIM_ICStructInit(&TIM_ICInitStructure);							//结构体初始化,若结构体没有完整赋值
																	//则最好执行此函数,给结构体所有成员都赋一个默认值
																	//避免结构体初值不确定的问题
	TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;				//选择配置定时器通道1
	TIM_ICInitStructure.TIM_ICFilter = 0xF;							//输入滤波器参数,可以过滤信号抖动
	TIM_ICInit(TIM3, &TIM_ICInitStructure);							//将结构体变量交给TIM_ICInit,配置TIM3的输入捕获通道
	TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;				//选择配置定时器通道2
	TIM_ICInitStructure.TIM_ICFilter = 0xF;							//输入滤波器参数,可以过滤信号抖动
	TIM_ICInit(TIM3, &TIM_ICInitStructure);							//将结构体变量交给TIM_ICInit,配置TIM3的输入捕获通道
	
	/*编码器接口配置*/
	TIM_EncoderInterfaceConfig(TIM3, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);
																	//配置编码器模式以及两个输入通道是否反相
																	//注意此时参数的Rising和Falling已经不代表上升沿和下降沿了,而是代表是否反相
																	//此函数必须在输入捕获初始化之后进行,否则输入捕获的配置会覆盖此函数的部分配置
	
	/*TIM使能*/
	TIM_Cmd(TIM3, ENABLE);			//使能TIM3,定时器开始运行
}

/**
  * 函    数:获取编码器的增量值
  * 参    数:无
  * 返 回 值:自上此调用此函数后,编码器的增量值
  */
int16_t Encoder_Get(void)
{
	/*使用Temp变量作为中继,目的是返回CNT后将其清零*/
	int16_t Temp;
	Temp = TIM_GetCounter(TIM3);
	TIM_SetCounter(TIM3, 0);
	return Temp;
}

模块作用
TIM3编码器接口,硬件自动计数(自增 / 自减),记录编码器旋转的增量值
TIM2定时器,周期性触发中断(如 100ms),在中断中读取 TIM3 的计数值并更新 Speed
主函数循环显示 Speed 值,依赖 TIM2 中断更新数据

Encoder.h

#ifndef __ENCODER_H
#define __ENCODER_H

void Encoder_Init(void);
int16_t Encoder_Get(void);

#endif

2.4现象

  • OLED 显示内容

初始状态:OLED 第一行显示 Speed:0,表示编码器未旋转时速度为 0。
旋转编码器时:实时显示速度值,格式为 Speed:±XXXX(± 表示方向,XXXX 为数值)。

  • 旋转方向与数值正负

正转(向右旋转):Speed 显示正数值,旋转越快数值越大(如 Speed:+120)。
反转(向左旋转):Speed 显示负数值,旋转越快数值越小(如 Speed:-80)。
停止旋转:Speed 逐渐归零(取决于编码器机械特性和滤波配置)。

  • 旋转速度与数值大小

慢速旋转:数值绝对值小(如 ±10~±50)。
快速旋转:数值绝对值大(如 ±100~±200)。

  • 编码器接口连接

PA6(TIM3_CH1)接编码器 A 相,PA7(TIM3_CH2)接 B 相,若接线反相:
正转显示负数值,反转显示正数值(方向相反)。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【原创】基于视觉模型+FFmpeg+MoviePy实现短视频自动化二次编辑+多赛道

AI视频处理系统功能总览 🎯 系统概述 这是一个智能短视频自动化处理系统,专门用于视频搬运和二次创作。系统支持多赛道配置,可以根据不同的内容类型(如"外国人少系列"等)应用不同的处理策略。 &#x1f3d…

C++----剖析list

前面学习了vector和string,接下来剖析stl中的list,在数据库中学习过,list逻辑上是连续的,但是存储中是分散的,这是与vector这种数组类型不同的地方。所以list中的元素设置为一个结构体,将list设计成双向的&…

纳米AI搜索与百度AI搜、豆包的核心差异解析

一、技术定位与设计目标 1、纳米AI搜索:轻量化边缘计算导向
专注于实时数据处理与资源受限环境下的高效响应,通过算法优化和模型压缩技术,实现在物联网设备、智能终端等低功耗场景的本地化部署。其核心优势在于减少云端依赖,保障…

不到 2 个月,OpenAI 火速用 Rust 重写 AI 编程工具。尤雨溪也觉得 Rust 香!

一、OpenAI 用 Rust 重写 Codex CLI OpenAI 已用 Rust 语言重写了其 AI 命令行编程工具 Codex CLI,理由是此举能提升性能和安全性,同时避免对 Node.js 的依赖。他们认为 Node.js “可能让部分用户感到沮丧或成为使用障碍”。 Codex 是一款实验性编程代理…

Python60日基础学习打卡Day46

一、 什么是注意力 注意力机制的由来本质是从onehot-elmo-selfattention-encoder-bert这就是一条不断提取特征的路。各有各的特点,也可以说由弱到强。 其中注意力机制是一种让模型学会「选择性关注重要信息」的特征提取器,就像人类视觉会自动忽略背景&…

WEB3全栈开发——面试专业技能点P1Node.js / Web3.js / Ethers.js

一、Node.js 事件循环 Node.js 的事件循环(Event Loop)是其异步编程的核心机制,它使得 Node.js 可以在单线程中实现非阻塞 I/O 操作。 🔁 简要原理 Node.js 是基于 libuv 实现的,它使用事件循环来处理非阻塞操作。事件…

Vscode下Go语言环境配置

前言 本文介绍了vscode下Go语言开发环境的快速配置,为新手小白快速上手Go语言提供帮助。 1.下载官方Vscode 这步比较基础,已经安装好的同学可以直接快进到第二步 官方安装包地址:https://code.visualstudio.com/ 双击一直点击下一步即可,记…

Go语言--语法基础5--基本数据类型--输入输出(1)

I : input 输入操作 格式化输入 scanf O : output 输出操作 格式化输出 printf 标准输入 》键盘设备 》 Stdin 标准输出 》显示器终端 》 Stdout 异常输出 》显示器终端 》 Stderr 1 、输入语句 Go 语言的标准输出流在打印到屏幕时有些参数跟别的语言…

永磁同步电机无速度算法--自适应龙贝格观测器

一、原理介绍 传统龙伯格观测器,在设计观测器反馈增益矩阵K时,为简化分析与设计,根据静止两相坐标系下的对称关系,只引入了K、K,两个常系数,且在实际应用时,大多是通过试凑找到一组合适的反馈增益系数缺乏…

LangChain工具集成实战:构建智能问答系统完整指南

导读:在人工智能快速发展的今天,如何构建一个既能理解自然语言又能调用外部工具的智能问答系统,成为许多开发者面临的核心挑战。本文将为您提供一套完整的解决方案,从LangChain内置工具包的基础架构到复杂系统的工程实践。 文章深…

【razor】x264 在 的intra-refresh和IDR插帧

你提到的是这样一个情况: 使用 DirectShow 采集,帧率稳定(如回调了20帧)使用 x264 的 total intra refresh 模式(intra-refresh=1) 进行编码但编码过程中「隔几十秒才有一帧intra(关键帧)」这不正常,具体分析如下: 🎯 一、问题核心 x264 的 intra refresh 模式(特…

随机算法一文深度全解

随机算法一文深度全解 一、随机算法基础1.1 定义与核心特性1.2 算法优势与局限 二、随机算法经典案例2.1 随机化快速排序原理推导问题分析与策略代码实现(Python、Java、C) 2.2 蒙特卡罗方法计算 π 值原理推导问题分析与策略代码实现(Python…

在 Conda 环境下配置 Jupyter Notebook 环境和工作目录

作为数据科学家或Python开发者,Jupyter Notebook 是我们日常工作的得力工具。本文将详细介绍如何在 Conda 环境中配置 Jupyter Notebook,包括环境设置和工作目录管理,帮助你打造高效的工作流程。 为什么要在 Conda 环境中使用 Jupyter Noteb…

MS39531N 是一款正弦驱动的三相无感直流电机驱动器,具有最小振动和高效率的特点

MS39531N 是一款正弦驱动的三相无感直流电机驱动器,具有最小振动和高效率的特点 简述 MS39531 是一款正弦驱动的 三相无感直流电机驱动器 ,具有最小振动和高效率的特点。该驱动器内部集成了基本的闭环速度控制功能,能够根据特定的应用定制电…

web3-基于贝尔曼福特算法(Bellman-Ford )与 SMT 的 Web3 DeFi 套利策略研究

web3-基于贝尔曼福特算法(Bellman-Ford )与 SMT 的 Web3 DeFi 套利策略研究 如何找到Defi中的交易机会 把defi看做是一个完全开放的金融产品图表,可以看到所有的一切东西;我们要沿着这些金融图表找到一些最优的路径,就…

分析 java 的 Map<String,Map<String, List<Map<String,Integer>>>>

import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map;public class Test02 {public static void main(String[] args) {//分析方法:由外层向内层逐渐拆解要定义的变量。再由内向外进行变量赋值//外层第一层&#x…

ChatterBox - 轻巧快速的语音克隆与文本转语音模型,支持情感控制 支持50系显卡 一键整合包下载

ChatterBox 是一个近期备受关注的开源语音克隆与文本转语音(TTS)模型,由 Resemble AI 推出,具备体积轻巧及超快的推理速度等特色。它也是首个支持情感夸张控制的开放源代码 TTS 模型,这一强大功能能让您的声音脱颖而出…

前端开发面试题总结-HTML篇

文章目录 HTML面试高频问答一、HTML 的 src 和 href 属性有什么区别?二、什么是 HTML 语义化?三、HTML的 script 标签中 defer 和 async 有什么区别?四、HTML5 相比于 HTML有哪些更新?五、HTML行内元素有哪些? 块级元素有哪些? 空(void)元素有哪些?六、iframe有哪些优点…

嵌入式学习--江协stm32day4

只能说拖延没有什么好结果,欠下的债总是要还的。 ADC 模拟信号转化为数字信号,例如温度传感器将外部温度的变化(模拟信号),转换为内部电压的变化(数字信号) IN是八路输入,下方是选择…

【Matlab】连接SQL Server 全过程

文章目录 一、下载与安装1.1 SQL Server1.2 SSMS1.3 OLE DB 驱动程序 二、数据库配置2.1 SSMS2.2 SQL Server里面设置2.3 设置防火墙2.4 设置ODBC数据源 三、matlab 链接测试 一、下载与安装 微软的,所以直接去微软官方下载即可。 1.1 SQL Server 下载最免费的Ex…