- 2025-02-23
-
回复了主题帖:
>>征集 | 晒电机控制痛点与难题,一起寻求最优解!
在电机控制系统的设计中,往往会因为方方面面的问题导致电机控制电路的设计的不是很完美,这里我结合个人比较常见的问题进行一下分享,主要集中在芯片选型复杂、控制精度不足和外围电路复杂导致的抗干扰与成本问题。同时结合TMC9660的介绍资料分享一下TMC9660的解决方案的优势。
痛点1:芯片选型复杂与系统集成困难
传统伺服驱动系统需要多个分立器件组合:如独立的栅极驱动器、MCU、降压转换器、保护电路等。例如,设计售卖柜推出装置时,工程师需分别选型并验证各器件的兼容性(如驱动电压匹配、通信协议适配),导致开发周期长、BOM表复杂。若选型不当,可能出现驱动能力不足或电源效率低下等问题,甚至需重新设计PCB布局。这一点
TMC9660的解决方案
TMC9660将70V智能栅极驱动、硬件伺服控制器、轨迹曲线控制器和降压转换器集成于单芯片。无需额外MCU或分立电源芯片,简化选型流程,降低兼容性风险。我们在设计电机驱动板时,仅需搭配外部功率MOSFET和少量被动元件,大幅减少PCB面积(尤其适合空间受限场景如小型售卖柜),同时降低供应链管理复杂度。
痛点2:控制精度与动态性能不足
依赖软件实现伺服控制(如PID算法)存在实时性瓶颈。例如,当推出装置遇到负载突变时,软件需中断处理、计算并响应,可能导致控制延迟,引发电机抖动或定位误差。此外,算法调参对工程师经验要求高,调试周期长。
TMC9660的解决方案
通过硬件级伺服控制与预置轨迹算法实现“零延迟”响应:控制逻辑由硬件直接执行,无需软件干预,确保实时性。例如,电机的加减速曲线、位置闭环均通过硬件实现,动态响应速度提升数倍。在高速启停或负载突变的场景中(如自动售货机货架快速推出),电机可精准跟随预设轨迹,避免因延迟导致的机械碰撞或位置超调。
痛点3:外围电路复杂导致抗干扰差与成本高
分立方案需大量外围电路:如栅极驱动的电荷泵、输入滤波电路、过流保护元件等。这些电路不仅增加成本,还引入噪声耦合路径。例如,电机高频开关噪声易通过电源线干扰控制信号,导致系统不稳定,需额外添加滤波器和屏蔽措施。
TMC9660的解决方案
通过高集成度与内置防护功能简化设计:集成智能栅极驱动(支持主动短路保护、死区时间控制)、单电源供电(内置Buck转换器)、以及抗干扰优化设计(如低阻抗电源路径)。PCB布局时可省略传统方案中30%以上的外围元件(如外部LDO、驱动保护二极管),同时芯片内部优化了信号隔离与电源滤波,显著降低EMI辐射,通过工业EMC测试更易。
- 2025-01-22
-
回复了主题帖:
【颁奖】 【回顾2024,展望2025】新年抢楼活动来啦!
个人收件信息已确认
- 2025-01-17
-
回复了主题帖:
【新年新挑战,任务打卡赢好礼!】第一批获奖名单公布
已确认
- 2025-01-15
-
回复了主题帖:
新年新挑战,任务打卡赢好礼!
-
加入了学习《运算放大器视频教程》,观看 OPAMP运算放大器之反相输入端,共射极反相放大电路
-
回复了主题帖:
《Linux内核深度解析》-内存管理
内存管理最重要,要不都找不到目标地址或者内存泄漏
-
回复了主题帖:
[树莓派5测评]⑤安装SSD并从SSD启动+闭坑指南
没有风扇散热,纯被动散热?
-
回复了主题帖:
为什么单片机会有3.3V和5V电压等级的区分?
5V一般都是一些8位16位单片机居多,3.3V是现在最主流的
-
回复了主题帖:
【回家】你们抢到回老家的票了吗?
坚持到最后一班岗然后走回家去
-
回复了主题帖:
DIY 耳机盒爆改随身音响(一)
不如根据开发板从新打印一个结构
-
回复了主题帖:
【回顾2024,展望2025】新年抢楼活动来啦!
⑸立一个新年Flag
新年Flag:在2025年,我将深入学习物联网和边缘计算技术,以提升自己的专业水平和行业影响力。
-
回复了主题帖:
【回顾2024,展望2025】新年抢楼活动来啦!
⑷最想要什么支持?
我最希望得到更多关于物联网安全和边缘计算技术的教程和资料,以及参加相关技术论坛和交流活动的机会,以拓宽视野和深化理解。
-
回复了主题帖:
【回顾2024,展望2025】新年抢楼活动来啦!
⑶在崭新的2025年,最想关注什么技术?
在2025年,我最想关注物联网(IoT)和边缘计算技术
-
回复了主题帖:
【回顾2024,展望2025】新年抢楼活动来啦!
⑵实现了哪些目标,达成了什么成就?
完成了多个硬件开发项目,超额完成业绩指标
-
回复了主题帖:
【回顾2024,展望2025】新年抢楼活动来啦!
⑴遇到过什么技术问题,是否解决了?怎么解决的。没解决需要帮助也可以说说。
在24年的工作中,我遇到过信号干扰问题,通过优化电路布局和增加屏蔽层解决了
- 2024-12-07
-
上传了资料:
【Follow me第二季第4期】代码合集
-
发表了主题帖:
【Follow me第二季第4期】一步一步学习Arduino Nano RP2040 Connect
一、前情介绍
本次活动是DigiKey联合EEWorld发起的Follow me活动的第二季的第四期,本次活动的主角是Arduino® Nano RP2040 Connect搭载功能丰富的Raspberry Pi RP2040微控制器,将其融入到Nano尺寸封装中。充分利用双核32位Arm® Cortex®-M0+处理器,通过U-blox® Nina W102模块实现蓝牙和WiFi连接,集速度计、陀螺仪、RGB LED和麦克风于一体,是物联网应用的不错选择。
二、任务分析
本次必须使用的板卡是Arduino® Nano RP2040 Connect开发板,任务如下:
必做任务一:搭建环境并开启第一步Blink三色LED / 串口打印Hello DigiKey & EEWorld!;
必做任务二:学习IMU基础知识,调试IMU传感器,通过串口打印六轴原始数据;
必做任务三:学习PDM麦克风技术知识,调试PDM麦克风,通过串口打印收音数据和音频波形。
选做任务一(非必做):通过RGB LED不同颜色、亮度显示PDM麦克风收到的声音大小;
选做任务二(非必做):通过IMU数据结合机器学习算法,识别运动状态,并通过串口打印。
通过自身的情况结合任务的难易程度,本次活动选择必做任务三项,接下来我们进行一下整体的任务分析:
任务一是搭建环境和并控制三色LED和和串口打印,这一部分设计到的硬件是板载的RGB和串口接口,任务二是IMU传感器的调试和串口,任务三是PDM麦克风和串口,综合上面的硬件需求都可以通过一块开发板来实现,具体任务的详细分析在下面具体实现时候进行介绍。
三、硬件连接
本次采购的商品除了一个Arduino® Nano RP2040 Connect还有一个扩展板的底座,这个开发板还是太小了,本开发板使用的是个MicroUSB,这个有点跟不上形势了。
四、任务实现
1、任务一:搭建环境并Blink三色LED / 串口打印
环境搭建:
Arduino的官方推荐开发环境是Arduino IDE,推荐下载最新版本,注意可以下载免安装版本,也可以用网页边进行调试,我这里选择的是免安装版本:
注意版本支持!
硬件情况:
咱们先看一下板载的LED情况:
这个是本次任务控制的三色LED,通过查找发现这个LED的控制引脚连接到的是W102模块上,也就是说不是直接通过RP2040进行控制,不过Arduino内的封装控制还是一样的,我们需要额外调用一个 <WiFiNINA.h>的库文件。
串口情况:
串口打印使用的是USB的虚拟串口,这个在我们连接设备上电的时候就能看到开发板的USB串行设备。
任务目标:
本次实现的任务目标是控制三色LED的blink,如果三个灯同步的话实际上就是一个白灯(RGB混合)的亮灭,这里我们将初始状态改为蓝色,让红绿同步,同时通过串口循环打印Hello DigiKey & EEWorld!
软件实现:
首先我们要添加一下板卡支持:
然后就可以开始我们软件编写了,整体的软件流程如下:
具体测试代码如下:
#include <WiFiNINA.h>
void setup() {
Serial.begin(115200);
while (!Serial);
Serial.println("Hello DigiKey & EEWorld!");
pinMode(LEDB,OUTPUT);
pinMode(LEDR,OUTPUT);
pinMode(LEDG,OUTPUT);
digitalWrite(LEDB,LOW);
digitalWrite(LEDR,LOW);
digitalWrite(LEDG,LOW);
}
void loop() {
digitalWrite(LEDB, HIGH);
digitalWrite(LEDR, LOW);
digitalWrite(LEDG, LOW);
delay(1000);
digitalWrite(LEDB, LOW);
digitalWrite(LEDR, HIGH);
digitalWrite(LEDG, HIGH);
delay(1000);
Serial.println("Hello DigiKey & EEWorld!");
}
效果展现:
心得体会:
在初次使用基于RP2040的arduino时,可以感受到其与其他版本的部分差异,就是调试部分,我们下载到开发办的程序并没有直接运行,通过打开串口监视器后才正式运行,目前还不清楚具体原理,不过不影响我们的使用,在下载过程中可以看到像开发板的盘符写文件的操作,这个和我们调试RP2040单片机的效果也很相似的,只不过IDE帮助咱们完成了。初步体验了这款开发板的控制过程,也就是以此开始本次的学习之旅。
2、任务二:调试IMU传感器,通过串口打印六轴原始数据
硬件情况:
IMU,即惯性测量单元(Inertial Measurement Unit),是一种用于测量和报告物体的三个基本线性运动(加速度)和三个基本角运动(角速度)的电子设备,本开发板板载的IMU传感器如下:
这里使用的是ST的 LSM6DSOXTR 6轴惯性测量单元(IMU),IMU 原理是采用惯性定律实现的。本传感器包括一组加速度计和陀螺仪,他们是惯性系统的核心部件,是影响惯性系统性能的主要因素。
任务目标:
本任务主要学习IMU传感器相关知识,并通过arduino的便捷性快速调试IMU传感器,通过串口打印六轴原始数据
软件实现:
需要安装新的库支持:
IMU传感器的应用其实arduino中有详细的例程代码,我们主要学习一下具体的事项方法,软件流程如下:
具体的测试代码:
#include <Arduino_LSM6DSOX.h>
float Ax, Ay, Az;
float Gx, Gy, Gz;
void setup() {
Serial.begin(115200);
while(!Serial);
if (!IMU.begin()) {
Serial.println("Failed to initialize IMU!");
while (1);
}
Serial.print("Accelerometer sample rate = ");
Serial.print(IMU.accelerationSampleRate());
Serial.println("Hz");
Serial.println();
Serial.print("Gyroscope sample rate = ");
Serial.print(IMU.gyroscopeSampleRate());
Serial.println("Hz");
Serial.println();
}
void loop() {
if (IMU.accelerationAvailable()) {
IMU.readAcceleration(Ax, Ay, Az);
Serial.print(' ');
Serial.print(Ax);
Serial.print(' ');
Serial.print(Ay);
Serial.print(' ');
Serial.println(Az);
}
if (IMU.gyroscopeAvailable()) {
IMU.readGyroscope(Gx, Gy, Gz);
Serial.print(' ');
Serial.print(Gx);
Serial.print(' ');
Serial.print(Gy);
Serial.print(' ');
Serial.println(Gz);
}
delay(100);
}
效果展现:
串口打印效果:
心得体会:
6轴IMU中包含了两个3轴传感器,由于IDE的绘图功能最多显示三个数据,我们在进行效果测试的时候需要将两个三轴的数据分别进行效果展示,而且对于姿态的解锁这一部分是不太栋的,只能将动作和数据进行简单的关联,效果还是很明显的。
3、任务三:调试PDM麦克风,通过串口打印收音数据和音频波形,对声音的音量进行一下处理
硬件情况:
Arduino Nano RP2040 Connect 板载了 MP34DT06 PDM 数字麦克风,它是一种基于脉冲密度调制(PDM)的麦克风。通过采样 PDM 信号可以获取音频数据,适用于语音识别、音频采集等场景。PDM(Pulse Density Modulation)是一种以高频率表示声音强度的调制方式,相比于传统的模拟麦克风,PDM 麦克风输出的是数字信号,适合直接处理数字音频。
原理图如下:
任务目标:
本次的任务目标主要是看一下PDM麦克风采集到的声音波形,并通过数学方法岁音量进行一下转化,在这里我们将任务四融合的到了任务三中,毕竟都是对声音数据的处理。
软件实现:
本次一共实现两个数据的波形展示,整体的软件流程如下:
具体测试代码如下:
#include <WiFiNINA.h>
#include <PDM.h>
bool LED_SWITCH = false;
// default number of output channels
static const char channels = 1;
// default PCM output frequency
static const int frequency = 20000;
// Buffer to read samples into, each sample is 16-bits
short sampleBuffer[512];
// Number of audio samples read
volatile int samplesRead;
void onPDMdata() {
// Query the number of available bytes
int bytesAvailable = PDM.available();
// Read into the sample buffer
PDM.read(sampleBuffer, bytesAvailable);
// 16-bit, 2 bytes per sample
samplesRead = bytesAvailable / 2;
}
int16_t getMaxAmplitude(short *buffer, int length) {
int16_t maxAmplitude = 0;
for (int i = 0; i < length; i++) {
int16_t amplitude = abs(buffer[i]);
if (amplitude > maxAmplitude) {
maxAmplitude = amplitude;
}
}
return maxAmplitude; // 返回最大振幅
}
void setup() {
Serial.begin(115200);
while (!Serial);
pinMode(LEDR, OUTPUT); // 设置红色 LED 引脚为输出
pinMode(LEDG, OUTPUT); // 设置绿色 LED 引脚为输出
digitalWrite(LEDG,LOW);
digitalWrite(LEDR,LOW);
// Configure the data receive callback
PDM.onReceive(onPDMdata);
if (!PDM.begin(channels, frequency)) {
Serial.println("Failed to start PDM!");
while (1);
}
}
void loop() {
int16_t maxAmplitude = 0;
// Wait for samples to be read
if (samplesRead) {
// Print samples to the serial monitor or plotter
for (int i = 0; i < samplesRead; i++) {
maxAmplitude = getMaxAmplitude(sampleBuffer, samplesRead);
Serial.print(sampleBuffer[i]);
// Clear the read count
Serial.print(' ');
Serial.println(maxAmplitude);
if(maxAmplitude > 1000)
{
digitalWrite(LEDG,LOW);
digitalWrite(LEDR,HIGH);
}
else
{
digitalWrite(LEDG,HIGH);
digitalWrite(LEDR,LOW);
}
samplesRead = 0;
}
}
}
效果展现:
这里是单声音数据的采集效果展示,IDE自带的显示的不明显。
这是两个数据效果(原始数据+峰值):
心得体会:
可以看到声音波形的效果图,实际上是个类似交流信号的波形,其幅值实际上可以反应音量的大小,原始数据我们用第三方串口工具进行的查看,是在是IDE显示的数据数据量调小的,不过通过两天数据的对比还是效果比较好的。
五、代码合集
六、视频讲解
[localvideo]7265ab4f10cb3af3177ae70fa75f2b01[/localvideo]
- 2024-10-07
-
回复了主题帖:
第一次经历召回(摩托车)
汽车召回也经常是检查一下,换个器件,这还是比较正常的
- 2024-06-22
-
加入了学习《PI PowiGaN 系列视频》,观看 氮化镓进化史 - PI 高层座谈 - PowerUP Expo 2023