STM32-输入捕获模式测频率&PWMI模式测频率占空比(十五)

输入捕获模式测频率

目前我们这个测量信号的输入引脚啊是 PA6,信号从 PA6 进来,待测的 PWM 信号也是 STM32 自己生成的,输出引脚是 PA0。所以接线这里,直接用一根线把 PA0 引到 PA6 就行了。如果你有信号发生器的话,也可以设置成方波信号输出,高电平 3.3 伏,低电平 0 伏,然后直接接到 PA6。另外也别忘了共地,这样接线也行。那这就是接线图。目前我们这两个代码的接线都是一样的哈,都是接一根线从 PA0 到 PA6。来看一下面包板,硬件电路这里直接找一根面包板飞线,一端接在 PA6,另一端接在 PA0,这样接线就完成了。然后回到工程文件夹。

之前的这些代码先删掉。

然后 PWM 模块这里,我们还要再进行一些改进。

目前这个代码的逻辑是,初始化 TIM2 的通道 1,产生一个 PWM 波形,输出引脚是 PA0 哈。然后通过下面这个 SetCompare1 的函数,可以调节 CCR1 寄存器的值,从而控制 PWM 的占空比。

但是目前 PWM 的频率啊,是在初始化里写好了的,是固定的,运行的时候调节不太方便。所以我们在最后再加一个函数用来便捷的调节 PWM 频率哈。如何调节 PWM 频率呢?

通过公式我们知道 PWM 频率等于更新频率等于 72 兆除以 PSC 加一除 AR 加一。

所以 PSC 和 AR 都可以调节频率,但是占空比等于 CCR 除以 AR 加一。

所以通过调节 AR R调节频率,还同时会影响到占空比。而通过 PSC 调节频率不会影响占空比啊,显然比较方便。

所以我们的计划是固定 AR R为 100-1,通过调节 PSC 来改变 PWM 频率。另外, ARR 为 100-1, CCR 的数值直接就是占空比啊,用起来比较直观。所以可以看出这个 PWM 模块还是比较复杂的啊,频率和占空比都需要计算,并不是我们想象的那样,初始化好了一个寄存器控制频率,另一个寄存器控制占空比。其实读多少就是多少,没那么方便啊。当然实际使用也是有技巧的,一般我们可以根据分辨率的要求先确定好 ARR, 比如分辨率 1% 就足够了,那 ARR 给 100-1,这样 PSC 决定频率, CCR 决定占空比,这就好算了是吧?

如果我们想要更高的分辨率,比如 0.1%,那 ARR 就先固定 1000-1,这样频率就是 72 兆除以分频除 1000,占空比就是 CCR 除 1000,这样也好算啊。

好在这里,目前 ARR 我们固定给 100-1, PSC 初始化这里的哈就先不管,我们后面再写一个函数,在初始化之后单独修改 PSC。

void PWM_ Set_ Prescaler, uint16_ t Prescaler。 在这里面我们就要调用库函数里单独写入 PSC 的函数了。

在 TIM 点 H 里找一下。这里这个 TIM_ PSC_ Config 就是单独写入 PSC 的函数。因为这个函数还有一个重装模式的参数啊,所以它并不叫 Set_ PSC,而叫 PSC_ Config。这是这个库的命名规范啊,就是写入 PSC。

我们复制这个函数,然后放到这里。参数第一个 TIMX,我们使用的是定时器 2,所以给 TIM2。第二个 PSC 就是要写入 PSC 的值,我们直接把外层函数的这个参数传进去。第三个 reload mode 就是重装模式,我们转到定义看一下解释哈。这里的参数解释是指定定时器预分频器的重装模式,这个参数可以是下面的其中一个值。第一个 update 预分频器在更新事件重装,第二个 immediate, 预分频器立即重装。说白了就还是影子寄存器预装载这个问题啊,就是你写入的值是立刻生效,还是在更新事件生效。立刻生效可能会在值改变时产生切断波形的现象,比如你 PWM 一个周期刚过去一半,立刻生效了,那就立刻切断当前波形,开始新的一个周期。在频率变化时哈,这里会出现一个不完整的周期。

那在更新事件生效呢,就是会有个缓存器延迟参数的写入时间,等一个周期结束了。在更新事件时再统一改变参数,保证每个周期的完整啊。那目前我们这个程序使用哪个参数呢?其实无所谓,我们要求不高,哪个都行啊。这里就选择立刻生效吧,复制,然后放在第三个参数的位置。这样我们这个 SetPSC 的函数就写好了

我们把它放到头文件声明一下啊。这样这个模块就改造好了,

通过 SetPrescale 改变频率,通过 Set Compare1 改变通道一的占空比,编译一下。

使用一下,先按 PWM 一例的初始化,再调用 PWM Set Prescaler, 参数给个 720-1。计算频率的公式放在右边啊,频率, FREQ 等于 72 兆除以 PSC 加一,再除 ARR 加一。目前 ARR 加一是 100,所以目前频率经过计算是 1000 赫兹。

然后调用 PWM Set Compare1,参数给 50。计算占空比的公式也放到右边啊。占空比 DUTY 等于 CCR 除以 AR 加一, ARR 加一是 100,所以目前占空比是 50%。这样调用之后 PA0 引脚就能输出一个频率 1000 赫兹、占空比 50% 的带磁信号了。编一下。没问题啊,下载看一下

。当然现在直接看是看不出什么现象的哈,如果你有示波器的话,可以先验证一下 PA0 的波形,看一下是不是符合要求。

那接下来我们回到程序,开始写输入捕获的代码哈,自己测自己,看一下 PA0 口的频率和占空比是多少。那还是先建一个模块

初始化的步骤呢,也是对照着 PPT 的这个基本结构来。目前我们需要配置电路连接成图四的这个样子啊

所以步骤就是,第一步 RCC 开启时钟,把 GPIO 和 TIM 的时钟打开。

第二步 GPIO 初始化,把 GPIO 配置成输入模式,一般选择上拉输入或者浮空输入模式啊。

第三步配置时基单元,让 CNT 计数器在内部时钟的驱动下自增运行,这一步和之前的代码是一样的。

第四步配置输入捕获单元,包括滤波器啊、极性啊。直连通道还是交叉通道分频器这些参数用一个结构体就可以统一进行配置了哈。

第五步,选择同模式的触发源,触发源选择为 TI1FP1 啊,这里调用一个库函数,给个参数就行了。

第六步,选择触发之后执行的操作,执行 Reset 操作,这里也是调用一个库函数就行了

最后,当这些电路都配置好之后,调用 TIM cmd 函数开启定时器,这样所有的电路就能配合起来,按照我们的要求工作了。当我们需要读取最新一个周期的频率时,直接读取 CCR 寄存器,然后按照 FC 除 N 计算一下就行了。

这就是整个程序的思路。那思路清楚了,我们回到 Keil 来看一下库函数。

打开 TIM 点 h 的文件看一下。首先 TIM_ IC_ Init, 这个根据以往的经验一看就知道,肯定就是用结构体配置输入捕获单元的函数。第一个参数选择哪个定时器,第二个参数就是包含各个配置的结构体。另外注意啊,输入捕获和输出比较都有四个通道, OC_ IT 四个通道,像这样每个通道单独占一个函数。而 IC_ IT 呢,四个通道是共用一个函数的,在结构体里会额外有个参数,可以用来选择具体是配置的哪个通道。因为可能有交叉通道的配置哈,所以函数合在一起比较方便。

然后继续,下面还有一个输入捕获的初始化函数, TIM_ InputCapture_ 初始化。这个函数和上一个函数类似哈,都是用于初始化输入捕获单元的。但是上一个函数只是单一的配置一个通道,而这个函数可以快速配置两个通道,把外侧电路结构配置成我们 PPT 这里展示的 PWM I 模式,这个等会我们写第二个代码的时候会用到啊。

然后往下看, TIM ICStruct_ IT 可以给输入捕获结构体赋一个初始值。

然后继续往下看, TIM SelectInputTrigger 选择输入触发源 TRGI,这个函数就对应 PPT 的这里,重模式的触发源选择,调用这函数就能选择重模式的触发源了,比如我们本节要用的 TR1FP1

然后继续看,这个 TIM_ Select_ Output_ Trigger 选择输出触发源 TRGO, 这个应该好理解吧?它对应的就是 PPT 的这里,选择主模式输出的触发源。

然后继续, TIM_ Select_ Slave_ Mode 选择从模式,好这下三兄弟就凑齐了,这个函数对应的就是 PPT 这里的从模式选择的部分,三个函数对应这三个需要选择的部分,使用还是比较简单明了的哈,

然后继续往下看。这里, TIM_ SetIC1234,波形发生器。分别单独配置通道 1234 的分频器哈,这个参数结构体里也可以配置,是一样的效果。

最后就是 TIM_ GetCapture1234,分别读取四个通道的 CCR。这四个函数和上面的 SET_ Compare1234 是对应的,读写的都是 CCR 寄存器。输出比较模式下, CCR 是只写的,要用 SET_ Compare 写入。输入捕获模式下, CCR 是只读的,要用 GET_ Capture 读出。这就是这函数。好到这里函数介绍就完成了。

现在思路有了,函数也有了,我们就来开始写程序。首先前面几步,开启时钟啊,配置 GPIO 啊,配置时基单元啊,我们之前已经写过很多次了哈,所以就直接到之前的代码复制一下。我们打开这个 PWM 点 C, 把这前面的三部分代码复制一下哈。

之后回到 IC 一的这里,粘贴。这三行删掉哈。那这些就也是我们本次代码的前三步,开启时钟配置 GPIO 配置时基单元。接着我们来一一修改一下,

第一个开启时钟,这里开启的是 TIM2,我们这个代码还需要 TI+M2 输出 PWM 哈,所以输入捕获的定时器要换一个,我们就换到 TIM3, TIM3 也是 APB1 的外设,所以函数还是 APB1 的这个。

之后 GPIO 的时钟啊,这个就要查一下引脚定义表了,我们看一下引脚定义。在这里可以看到, TIM3 的通道一和通道二对应 PA6 和 PA7,通道三和通道四对应 PB0 和 PB1。

所以引脚需要根据实际需求来哈,我们本次代码计划用 TIM3 的通道一引脚,所以引脚就是 PA6。如果你选择其他通道或者其他定时器,那这个引脚就需要变了哈。回到代码,我们计划用 PA6 的通道一,所以开启 GPIOA 的时钟,没问题啊。然后 GPIO 初始化,我们要用 PA6 引脚,所以 GPIO pin 0 改成 pin 6,下面初始化 GPIOA, 没问题啊。之后是 GPIO 模式,这里需要 GPIO mode IPU 上拉输入,那这样 GPIO 配置就完成了。

接下来就是时基单元,选择内部时钟没问题,但是这里定时器要换成 TIM3 啊,别忘了。然后是时基单元的参数, ARR 自动重装载值,根据上一小节的分析啊,我们最好要设置大一些,防止计数溢出。这里我们就给最大值,65536-1,也就是 16 位的寄存器可以满量程计数哈。之后是 PSC 预分频器,根据上一小节的分析啊,这个值决定了测周法的标准频率 FC。 72 兆除预分频就是计数器自身的频率,就是计数标准频率。这个呢需要根据你信号频率的分布范围来调整哈,我们暂时先给 72-1,这样标准频率就是 72 兆除 72 等于 1 兆赫兹,比较方便计算哈。然后计数器还是采用向上计数的模式。下面时基单元初始化改成 TIM3,把这些参数配置到 TIM3 的时基单元哈,这样时基单元就配置好了。

那接下来按照流程,我们进入第四步,初始化输入捕获单元。

那接下来按照流程我们进入第四步,初始化输入 5 个单元,到 TIM 点去里看一下。我们要用这个 TIMIC _Init函数,复制,然后放到这里。第一个参数给 TIM3,第二个参数是结构体。我们跳转到函数的定义哈,在上面这里有结构体的类型名,复制。

在这上面粘贴,起个变量名叫 TIM_ IC_ Init_ Structure,复制一下。然后把结构体成员都引出来。最后把这个结构体的地址放到 IC_ Init 函数里面。

好,我们来看一下参数,第一个 TIM_ Channel,这个就是我们刚才说的选择通道的那个参数哈,因为 IC_ Init 函数只有一个,所以要靠结构体的这个参数来指定是配置哪个通道。转到定义看一下,这里干啥?

我们 CTRL + F 搜索下这个参数列表,这里通道一二三四四个参数,需要配置哪个通道就选哪个参数。目前我们计划使用的是 TIM3 的通道一

所以选择 TIM_ Channel1 复制,放到这里。接着继续看下一个,

TIM_ IC_ Filter, 这个参数用来选择输入捕获的滤波器哈,也就是 PPT 这里这个滤波器。

如果你信号有毛刺和噪声哈,就可以增大滤波器参数可以有效避免干扰。那在程序这里我们转到定义。

右边的解释是这个参数可以是 0X0 到 0XFF 之间的一个数,数越大滤波效果越好。每个数值对应的采样频率和采样次数啊,在参考手册里有,我们上小节讲过哈。那这里呢我们就给点滤波吧,就给 0XFF 放到这里。注意滤波器和分频器的区别哈,虽然它俩都是计数的东西,但是滤波器计数并不会改变信号的原有频率。一般滤波器的采样频率都会远高于信号频率,所以它只会滤除高频噪声,使信号更平滑。1 千赫兹滤波之后仍然是 1000 赫兹,信号频率不会变化。而分频器就是对信号本身进行计数,会改变频率。1000 赫兹,二分频之后就是 500 赫兹,四分频就是 250 赫兹。这个注意下。然后继续

下一个参数, TIM IC polarity。 极性,这个对应的就是图里的这个边沿检测极性选择的部分了。

选择是上升沿触发还是下降沿触发。转到定义看一下。这里参数列表,搜索,看一下,这里有三个参数

第一个 rising 上升沿触发,第二个 falling 下降沿触发,第三个 both edge 上升沿下降沿都触发。这里我们需要上升沿触发啊,所以复制第一个。放到这里。

接着继续, TIM IC 分频器,这个参数配置的是我们结构里的这个啊,触发信号分频器。

不分频就是每次触发都有效,二分频就是每隔一次有效一次,以此类推啊。那我们转到定义看一下,这里搜索一下参数列表。可以看到有这些参数啊, DIV1 就是不分频, DIV2 二分频,之后四分频,八分频。这个分频值并不能任意指定啊,只能选择这四种。

那我们目前需要每次触发都有效,所以选择 DIV1 不分频,复制,放到这里。

接着最后一个参数, TIMICSELECTION,选择触发信号从哪个引脚输入。看一下 PPT 啊,显然这个参数是配置这个数据选择器的,可以选择直连通道或者是交叉通道,我们看一下。

转到定义。然后右边搜索一下参数列表,下面这里可以看到, Direct 的 TI 就是直连通道的输入, Indirect 的 TI 就是交叉通道的输入。当然还有个 TRC 引脚哈,这个我们暂时不用。

那对于这个代码来说,我们需要选择直连通道,所以复制第一个参数,放到这里。

好,到这里我们输入捕获的通道就配置完了。对应这个图来看,是不是每一部分都对应一个结构体参数啊?不多不少,参数配置完了,这个通道的电路就连接好了。

然后呢,继续按照流程来,把主从模式的这两个东西配置好。

第五步,配置 T R G I 的触发源为 T I E M P 一。那回到代码,找一下函数啊。触发源选择,要用这个 TIM_ Select_ InputTrigger 复制,

放在这下面。第一个参数给 TIM3,第二个参数就是要选择哪个触发源。转到定义看一下,可以看到这里给出了 8 个可选的触发源,这 8 个触发源就对应我们 PPT 的这里啊,

具体的解释可以看看手册。那我们要选的很显然是这个 TIMTS_ TI1FP1,复制,放到这第二个参数的位置。这样触发源就选择好了。

之后继续,第六步,配置从模式为 reset。找一下函数啊,使用这个 TIM_ SelectSlaveMode 选择从模式,复制。

放在这里,参数还是类似的,第一个给 TIM3,第二个看下定义,这里给出了这四种从模式,就对应 PPT 这里的下面四个从模式,

上面这三个 input 的从模式是给编码器接口用的哈,还会另外有函数进配置,所以这个函数的参数就没有给出。那在这里我们需要选择 reset 这个参数,复制。放到这里,这样从模式就配置好了。

接下来最后一步,我们调用 TIMCmd, 参数给 TIM3, ENABLE, 启动定时器,这样整个电路的配置就完成了。

电路的配置就完成了。当我们启动定时器之后, CNT 就会在内部时钟的驱动下不断自增,即使信号没有过来哈,它也会不断自增。不过这也没关系,因为有信号来的时候,它就会在从模式的作用下自动清 0,并不会影响测量。好,那初始化之后,整个电路就能全自动测量了。

当我们想要查看频率时,需要读取 CCR 进行计算,所以我们在下面再写个函数, UINT32 杠 7, IC_ Get_ Freq, void。 在里面我们需要执行 PPT 这里的公式, FX 等于 FC 除 N。FC 呢之前说过,等于 72 兆除 PSC 加一,目前 PSC 是 72 减一,所以 FC 等于一兆赫兹。所以下面这里直接 return 一零零零零零零,这是一兆。然后除以 N,N 就是读取 CCR 的值,我们到 TIM 点去找一下函数啊,需要用这个 TIM Get Capture 1 复制,放到这里,参数给 TIM3 这样就行了。目前我们这个函数返回的是最新一个周期的频率值啊,单位是赫兹。

那我们来测试一下,先把这两个函数放到头文件声明一下,编译看一下。

PWM 模块已经将待测信号输出到 PA0 了, PA0 又通过导线输入到 PA6, PA6 是 TIM3 的通道一,通道一通过输入捕获模块测量得到频率。然后在主循环里我们不断刷新显示频率, OLED Show Number 一行 6 列,显示 IC_ Get_ Freq。 长度为 5 啊,这样就行了。

我们测试一下下载看一下。可以看到目前测量得到的频率是 1001,但是我们输出的是 1000 赫兹啊,多了一点点。按理说自己输出自己测应该不会有误差呀,但是这确实很稳定的多了一点啊。据我个人推测吧,可能是计数刚到 1000 赫兹的那个数时,信号也刚好跳变,因为电路结构啊或者其他什么原因,导致这一个数刚好没记到,才会有一点误差哈。不过这个也属于正负一误差的范畴。

目前这个误差也是符合要求的,但是总是差那么一点,逼死强迫症啊。所以我决定还是在程序上给它补回来。那么回到程序,在这里加个括号,给计数值加一,给它补一个数啊。

这样再试一下,下载看一下,现在测量 1000 赫兹没有问题啊,凑个整现在就舒服多了啊。好到这里第一个程序就完成了。

PWMI测频率占空比

我们来看一下啊。首先开启时钟, GPIO 和实际单元都不需要更改。

然后这里输入捕获初始化的部分需要进行一下升级,配置成两个通道同时捕获同一个引脚的模式。怎么配置呢?一个简单的想法就是把这个通道初始化的部分复制一份。这个结构体定义的不要复制了哈。然后呢,通道一是直连输入,上升沿触发,这个还沿用这个配置。接着下面,通道一改成通道二,直连输入改成这个交叉输入,上升沿触发改成下降沿触发。这样看一下,是不是就对应我们 PPT 的这个结构了?通道一直连输入上升沿触发,通道二交叉输入下降沿触发。这样就完事了。

回到代码哈,这样配置是可行的,没问题。但是呢,还是建议公司他们给麻烦,还专门给我们封装了一个函数来快捷的完成这个配置。到 TIM 点 h 里看一下,这个函数就是我们之前说过的 TIM PWMConfig

我们复制一下。然后在这里,下面这一大段都不需要了,直接调用 PWMConfig,第一个参数 TIM3,第二个参数举例子,把结构体变量放过来。这样就行了。目前演示的这个代码就和刚才那个代码的效果是一样的哈。使用这个函数,你只需要传入一个通道的参数就行了。在函数里会自动把剩下的一个通道初始化成相反的配置。比如我这里传入通道一直连上升沿,那函数里面就会顺带配置通道二交叉下降沿。如果我传入通道二直连上升沿呢,函数就会顺带配置通道一交叉下降沿。这就是这个函数的操作,可以快捷的把电路配置成 PWMI 模式的标准结构。

那我是咋知道的呢?转到一。分析下源码就知道了。这里可以看到它会进行判断哈,如果我传入的是 Rising, 则对象就是 falling, 否则我传入 falling, 对象就是 rising。 然后如果我选择的是直连,对象就是交叉,否则我选择交叉,对象就是直连。

最后如果我选择配置通道一,则结构体参数配置到 TIM1,对象参数配置到 TIM2。如果我选择配置通道二,则结构体参数配置到 TIM2,对象参数配置到 TIM1。

总之就是一堆 if 进行判断,以传入任意一个通道的参数都会顺带把另一个通道配置成相反的参数,这就是这个函数的操作逻辑哈。当然这里也可以看出,这个函数只支持通道一和通道二的配置,不要传入通道三和通道四哈。那返回到这里,执行完这个函数,我们的 PWM I电路就配置好了。接着主从模式啊,启动定时器,这些都不需要更改。最后获取频率的函数不用改

我们再写一个获取占空比的函数。高电平的计数值存在 CCR2 里,整个周期的计数值存在 CCR1 里,我们用 CCR2 除 C CR 1就能得到占空比了。所以这里直接 return T M get capture 2( T M 3)除以 T M get capture 1( T M 3)。这样就得到占空比。显然这个数的范围是 0~1 啊,我们要显示整数的话,可以在这里给它乘个 100,扩大 100 倍。这样返回值的范围就是 0~100,对应占空比 0%~100%。另外还是那个问题啊,经过实测这个 CC R 总会少一数,所以我们给它各加一个数补回来哈,看着舒服些。好,

我们来测试一下,把这个函数放到头文件声明一下。编译,没问题。

然后 main 点 c 这里,先显示一下固定的字符串,复制一下,二行一列,显示 D U T Y 冒号 00 百分号。之后 show number 也复制一下。二行六列,显示 IC get duty,长度为二。这样程序就完成了,我们测试一下,编译。

我们修改一下看看。比如预分频改成 7200,频率就是 100 赫兹, CCR1 改成 80,占空比就是 80%。再试一下,下载看看,也没问题啊。

大家可以自行更改参数尝试一下。那到这里我们第二个代码就写完了。

最后我们来研究一下这个测频率的性能哈。首先是测频率的范围,目前我们给的标准频率是 1 兆赫兹,计数器最大只能记到 655·35,所以所测量的最低频率是一兆除 65535 这个值算下大概是 15 赫兹。如果信号频率再低,计数器就要溢出了,所以最低频率就是 15 赫兹左右。

那如果想再降低一些最低频率的限制呢,我们可以把这个预分频再加大点,这样标准频率就更低,所支持测量的最低频率也就更低。这是测量频率的下限

然后是测量频率的上限,就是支持的最大频率。这个最大频率哈,并没有一个明显的界限,因为随着待测频率的增大,误差也会逐渐增大。如果非要找一个频率上限,那应该就是标准频率一兆赫兹。超过一兆赫兹,信号频率比标准频率还高,那肯定测不了了。但是这个一兆赫兹的上限并没有意义啊,因为信号频率接近一兆赫兹时,误差已经非常大了。所以最大频率要看你对误差的要求。上一小节我们说到了正负一误差,记 100 个数误差 1 个,相对误差就是百分之一。记 1000 个数误差 1 个,相对误差就是 千分之一。所以正负一误差可以认为是 1 除计数值。

在这里,如果你要求误差等于千分之一时,频率为上限,那这个上限就是 1 兆/ 1000 等于 1000 赫兹。

如果要求误差可以到 百分之一,那频率上限就是 1 兆除/100 等于 10 千赫兹。这就是频率的上限。

如果想提高频率的上限,那我们在这里就要把 PSC 给降低一些,提高标准频率上限就会提高。除此之外,如果频率还要更高呢,那我们就要考虑一下测频法了。

测频法适合高频,测周法适合低频。我们这里是测周法,所以对于非常高的频率还是交给测频法来解决吧。

然后呢还有一个就是误差分析,除了我们之前说的正负一误差外,在实际测量的时候还会有晶振误差,比如我们 STM32 的晶振不是那么准,在计数几百几万次之后,误差积累起来也会造成一些影响。当然目前我们这个现象哈是自己测量自己,不存在晶振误差,所以数值还是非常稳定的。如果你要测量别的信号那数值可能就会有些抖动了哈,后期可以再做一些滤波处理。

好,那这些就是对这个数模转换和测频率的性能评估哈,其他更深入的内容就需要大家在实践中不断研究总结了。

相关推荐
济6171 小时前
ROS开发专栏---基于图像视觉的目标追踪实验--适配Ubuntu 22.04
嵌入式硬件·嵌入式·ros2·机器人开发·机器人方向
济6172 小时前
ROS开发专栏---视觉图像数据的获取实验--适配Ubuntu 22.04
嵌入式硬件·嵌入式·ros2·机器人开发·机器人方向
kebidaixu2 小时前
SPI四种模式
stm32
俊基科技2 小时前
矿用对讲降噪改造实战|A-68 语音模块解决井下高噪回音、啸叫难题
嵌入式硬件·语音识别·ai降噪·回声消除·矿用通信·语音 dsp
Hall_IC2 小时前
STM32F407VGT6产线急需?粤科源兴现货库存随时调拨,保障交期不延误
stm32·单片机·嵌入式硬件
Wxinxiaozhang2 小时前
GD32L235 更换外部晶振(8M → 16M)导致 MCU 无法启动的原因分析与解决方法
单片机·嵌入式硬件
嵌入式ZYXC2 小时前
第8章:PCB Layout基础与实物打样——把你的设计变成一块真正的板子
stm32·单片机·嵌入式硬件·物联网
zlinear数据采集卡2 小时前
模拟输入限流保护电路深度解析:从理论原理到ZLinear采集卡的实战设计
c语言·单片机·嵌入式硬件·fpga开发·自动化
踏着七彩祥云的小丑2 小时前
嵌入式测试学习第 27 天:网络基础:IP、子网掩码、TCP/UDP基础
单片机·嵌入式硬件