长文干货预警|单片机常用的9种软件架构!

原创 无际单片机编程 2024-04-29 14:32

你点击蓝字关注,回复“入门资料”获取单片机入门到高级开挂教程

 开发板带你入门,我们带你飞

文 | 无际(微信:2777492857)

全文约6326字,阅读大约需要 15 分钟


长文预警,肝了4个多小时,消耗一杯瑞幸,盘软件架构,这篇文章就够了!


可能很多工程师,工作了很多年,都不会有软件架构的概念。
 
因为我在做研发工程师的第6年,才开始意识到这个东西,在此之前,都是做一些比较简单的项目,一个main函数干到底,架构复杂了反而是累赘。

后面有幸,接触了稍微复杂点的项目,感觉以前水平Hold不住,然后借着项目需求,学习了很多优秀的代码架构,比如以前同事的,一些模组厂的SDK,还有市面上成熟的系统。

说出来可能有点夸张,一个好项目带来的成长,顶你做几年小项目。

在一个工程师从入门到成为高级工程师,都会经历哪些软件架构?
         

 

下面给大家盘点一下,每个都提供了简易的架构模型代码,难度循环渐进。

1.线性架构
这是最简单的一种程序设计方法,也就是我们在入门时写的,下面是一个使用C语言编写的线性架构示例:
#include   // 包含51系列单片机的寄存器定义
// 延时函数,用于产生一定的延迟void delay(unsigned int count) { unsigned int i; while(count--) { for(i = 0; i < 120; i++) {} // 空循环,用于产生延迟 }}
void main() { // 初始设置P1端口为输出模式,用于控制LED P1 = 0xFF; // 将P1端口设置为高电平,关闭所有LED
while(1) { // 无限循环 P1 = 0x00; // 将P1端口设置为低电平,点亮所有LED delay(500000); // 调用延时函数,延迟一段时间
P1 = 0xFF; // 将P1端口设置为高电平,关闭所有LED delay(500000); // 再次调用延时函数,延迟相同的时间 }}


2.模块化架构
模块化架构是一种将程序分解为独立模块的设计方法,每个模块执行特定的任务。
这种架构有助于代码的重用、维护和测试。
下面是一个使用C语言编写的模块化架构示例,该程序模拟了一个简单的交通信号灯控制系统。
#include   // 包含51系列单片机的寄存器定义
// 定义信号灯的状态typedef enum { RED_LIGHT, YELLOW_LIGHT, GREEN_LIGHT} TrafficLightState;
// 函数声明void initializeTrafficLight(void);void setTrafficLight(TrafficLightState state);void delay(unsigned int milliseconds);
// 信号灯控制主函数void main(void) { initializeTrafficLight(); // 初始化交通信号灯
while(1) { setTrafficLight(RED_LIGHT); delay(5000); // 红灯亮5秒
setTrafficLight(YELLOW_LIGHT); delay(2000); // 黄灯亮2秒
setTrafficLight(GREEN_LIGHT); delay(5000); // 绿灯亮5秒 }}
// 初始化交通信号灯的函数void initializeTrafficLight(void) { // 这里可以添加初始化代码,比如设置端口方向、默认状态等 // 假设P1端口连接了信号灯,初始状态为熄灭(高电平) P1 = 0xFF;}
// 设置交通信号灯状态的函数void setTrafficLight(TrafficLightState state) { switch(state) { case RED_LIGHT: // 设置红灯亮,其他灯灭 P1 = 0b11100000; // 假设低电平有效,这里设置P1.0为低电平,其余为高电平 break; case YELLOW_LIGHT: // 设置黄灯亮,其他灯灭 P1 = 0b11011000; // 设置P1.1为低电平,其余为高电平 break; case GREEN_LIGHT: // 设置绿灯亮,其他灯灭 P1 = 0b11000111; // 设置P1.2为低电平,其余为高电平 break; default: // 默认为熄灭所有灯 P1 = 0xFF; break; }}
// 延时函数,参数是毫秒数void delay(unsigned int milliseconds) { unsigned int delayCount = 0; while(milliseconds--) { for(delayCount = 0; delayCount < 120; delayCount++) { // 空循环,用于产生延时 } }}
 

 

3.层次化架构
层次化架构是一种将系统分解为多个层次的设计方法,每个层次负责不同的功能。
         

 

着以下是一个使用C语言编写的层次化架构示例,模拟了一个具有不同权限级别的嵌入式系统。
#include   // 包含51系列单片机的寄存器定义
// 定义不同的操作级别typedef enum { LEVEL_USER, LEVEL_ADMIN, LEVEL_SUPERUSER} OperationLevel;
// 函数声明void systemInit(void);void performOperation(OperationLevel level);void displayMessage(char* message);
// 系统初始化后的主循环void main(void) { systemInit(); // 系统初始化
// 模拟用户操作 performOperation(LEVEL_USER); // 模拟管理员操作 performOperation(LEVEL_ADMIN); // 模拟超级用户操作 performOperation(LEVEL_SUPERUSER);
while(1) { // 主循环可以是空闲循环或者处理其他低优先级任务 }}
// 系统初始化函数void systemInit(void) { // 初始化系统资源,如设置端口、中断等 // 这里省略具体的初始化代码}
// 执行不同级别操作的函数void performOperation(OperationLevel level) { switch(level) { case LEVEL_USER: //用户操作具体代码 break; case LEVEL_ADMIN: //管理员操作具体代码 break; case LEVEL_SUPERUSER: //超级用户操作具体代码 break; }}
// 显示消息的函数void displayMessage(char* message) { // 这里省略了实际的显示代码,因为单片机通常没有直接的屏幕输出 // 消息可以通过LED闪烁、串口输出或其他方式展示 // 假设通过P1端口的LED展示,每个字符对应一个LED闪烁模式 // 实际应用中,需要根据硬件设计来实现消息的显示}


4.事件驱动架构         

 

事件驱动架构是一种编程范式,其中程序的执行流程由事件(如用户输入、传感器变化、定时器到期等)触发。

在单片机开发中,事件驱动架构通常用于响应外部硬件中断或软件中断。

以下是一个使用C语言编写的事件驱动架构示例,模拟了一个基于按键输入的LED控制。
#include   // 包含51系列单片机的寄存器定义
// 定义按键和LED的状态#define KEY_PORT P3 // 假设按键连接在P3端口#define LED_PORT P2 // 假设LED连接在P2端口
// 函数声明void delay(unsigned int milliseconds);bit checkKeyPress(void); // 返回按键是否被按下的状态(1表示按下,0表示未按下)
// 定时器初始化函数void timer0Init(void) { TMOD = 0x01; // 设置定时器模式寄存器,使用模式1(16位定时器) TH0 = 0xFC; // 设置定时器初值,用于产生定时中断 TL0 = 0x18; ET0 = 1; // 开启定时器0中断 EA = 1; // 开启总中断 TR0 = 1; // 启动定时器}
// 定时器中断服务程序void timer0_ISR() interrupt 1 { // 定时器溢出后自动重新加载初值,无需手动重置 // 这里可以放置定时器溢出后需要执行的代码}
// 按键中断服务程序bit keyPress_ISR(void) interrupt 2 using 1 { if(KEY_PORT != 0xFF) // 检测是否有按键按下 { LED_PORT = ~LED_PORT; // 如果有按键按下,切换LED状态 delay(20); // 去抖动延时 while(KEY_PORT != 0xFF); // 等待按键释放 return 1; // 返回按键已按下 } return 0; // 如果没有按键按下,返回0}
// 延时函数,参数是毫秒数void delay(unsigned int milliseconds) { unsigned int i, j; for(i = 0; i < milliseconds; i++) for(j = 0; j < 1200; j++); // 空循环,用于产生延时}
// 主函数void main(void) { timer0Init(); // 初始化定时器 LED_PORT = 0xFF; // 初始LED熄灭(假设低电平点亮LED)
while(1) { if(checkKeyPress()) { // 检查是否有按键按下事件 // 如果有按键按下,这里可以添加额外的处理代码 } }}
// 检查按键是否被按下的函数bit checkKeyPress(void) { bit keyState = 0; // 模拟按键中断触发,实际应用中需要连接硬件中断 if(1) // 假设按键中断触发 { keyState = keyPress_ISR(); // 调用按键中断服务程序 } return keyState; // 返回按键状态}

事实上,真正的事件型驱动架构,是非常复杂的,我职业生涯的巅峰之作,就是用的事件型驱动架构。

         

 

5.状态机架构
在单片机开发中,状态机常用于处理复杂的逻辑和事件序列,如用户界面管理、协议解析等。
以下是一个使用C语言编写的有限状态机(FSM)的示例,模拟了一个简单的自动售货机的状态转换。
#include   // 包含51系列单片机的寄存器定义
// 定义自动售货机的状态typedef enum { IDLE, COIN_INSERTED, PRODUCT_SELECTED, DISPENSE, CHANGE_RETURNED} VendingMachineState;
// 定义事件typedef enum { COIN_EVENT, PRODUCT_EVENT, DISPENSE_EVENT, REFUND_EVENT} VendingMachineEvent;
// 函数声明void processEvent(VendingMachineEvent event);void dispenseProduct(void);void returnChange(void);
// 当前状态VendingMachineState currentState = IDLE;
// 主函数void main(void){ // 初始化代码(如果有) // ...
while(1) { // 假设事件由外部触发,这里使用一个模拟事件 VendingMachineEvent currentEvent = COIN_EVENT; // 模拟投入硬币事件
processEvent(currentEvent); // 处理当前事件 }}
// 处理事件的函数void processEvent(VendingMachineEvent event){ switch(currentState) { case IDLE: if(event == COIN_EVENT) { // 如果在空闲状态且检测到硬币投入事件,则转换到硬币投入状态 currentState = COIN_INSERTED; } break; case COIN_INSERTED: if(event == PRODUCT_EVENT) { // 如果在硬币投入状态且用户选择商品,则请求出货 currentState = PRODUCT_SELECTED; } break; case PRODUCT_SELECTED: if(event == DISPENSE_EVENT) { dispenseProduct(); // 出货商品 currentState = DISPENSE; } break; case DISPENSE: if(event == REFUND_EVENT) { returnChange(); // 返回找零 currentState = CHANGE_RETURNED; } break; case CHANGE_RETURNED: // 等待下一个循环,返回到IDLE状态 currentState = IDLE; break; default: // 如果状态非法,重置为IDLE状态 currentState = IDLE; break; }}
// 出货商品的函数void dispenseProduct(void){ // 这里添加出货逻辑,例如激活电机推出商品 // 假设P1端口连接了出货电机 P1 = 0x00; // 激活电机 // ... 出货逻辑 P1 = 0xFF; // 关闭电机}
// 返回找零的函数void returnChange(void){ // 这里添加找零逻辑,例如激活机械臂放置零钱 // 假设P2端口连接了找零机械臂 P2 = 0x00; // 激活机械臂 // ... 找零逻辑 P2 = 0xFF; // 关闭机械臂}

         

 

         

 

6.面向对象架构
STM32的库,就是一种面向对象的架构。

不过在单片机由于资源限制,OOP并不像在高级语言中那样常见,但是一些基本概念如封装和抽象仍然可以被应用。


虽然C语言本身并不直接支持面向对象编程,但可以通过结构体和函数指针模拟一些面向对象的特性。

下面是一个简化的示例,展示如何在C语言中模拟面向对象的编程风格,以51单片机为背景,创建一个简单的LED类。
#include 
// 定义一个LED类typedef struct { unsigned char state; // LED的状态 unsigned char pin; // LED连接的引脚 void (*turnOn)(struct LED*); // 点亮LED的方法 void (*turnOff)(struct LED*); // 熄灭LED的方法} LED;
// LED类的构造函数void LED_Init(LED* led, unsigned char pin) { led->state = 0; // 默认状态为熄灭 led->pin = pin; // 设置LED连接的引脚}
// 点亮LED的方法void LED_TurnOn(LED* led) { // 根据引脚状态点亮LED if(led->pin < 8) { P0 |= (1 << led->pin); // 假设P0.0到P0.7连接了8个LED } else { P1 &= ~(1 << (led->pin - 8)); // 假设P1.0到P1.7连接了另外8个LED } led->state = 1; // 更新状态为点亮}
// 熄灭LED的方法void LED_TurnOff(LED* led) { // 根据引脚状态熄灭LED if(led->pin < 8) { P0 &= ~(1 << led->pin); // 熄灭P0上的LED } else { P1 |= (1 << (led->pin - 8)); // 熄灭P1上的LED } led->state = 0; // 更新状态为熄灭}
// 主函数void main(void) { LED myLed; // 创建一个LED对象 LED_Init(&myLed, 3); // 初始化LED对象,连接在P0.3
// 给LED对象绑定方法 myLed.turnOn = LED_TurnOn; myLed.turnOff = LED_TurnOff;
// 使用面向对象的风格控制LED while(1) { myLed.turnOn(&myLed); // 点亮LED // 延时 myLed.turnOff(&myLed); // 熄灭LED // 延时 }}

这段代码定义了一个结构体LED,模拟面向对象中的“类。
这个示例仅用于展示如何在C语言中模拟面向对象的风格,并没有使用真正的面向对象编程语言的特性,如继承和多态,不过对于单片机的应用,足以。

7.基于任务的架构
这种我最喜欢用,结构,逻辑清晰,每个任务都能灵活调度。

基于任务的架构是将程序分解为独立的任务,每个任务执行特定的工作。

在单片机开发中,如果没有使用实时操作系统,我们可以通过编写一个简单的轮询调度器来模拟基于任务的架构。

以下是一个使用C语言编写的基于任务的架构的示例,该程序在51单片机上实现。

为了简化,我们将使用一个简单的轮询调度器来在两个任务之间切换:一个是按键扫描任务,另一个是LED闪烁任务。
#include 
// 假设P1.0是LED输出sbit LED = P1^0;
// 全局变量,用于记录系统Tickunsigned int systemTick = 0;
// 任务函数声明void taskLEDBlink(void);void taskKeyScan(void);
// 定时器0中断服务程序,用于产生Tickvoid timer0_ISR() interrupt 1 using 1 { // 定时器溢出后自动重新加载初值,无需手动重置 systemTick++; // 更新系统Tick计数器}
// 任务调度器,主函数中调用,负责任务轮询void taskScheduler(void) { // 检查系统Tick,决定是否执行任务 // 例如,如果我们需要每1000个Tick执行一次LED闪烁任务 if (systemTick % 1000 == 0) { taskLEDBlink(); } // 如果有按键任务,可以类似地检查Tick并执行 if (systemTick % 10 == 0) { taskKeyScan(); }}
// LED闪烁任务void taskLEDBlink(void) { static bit ledState = 0; // 用于记录LED的当前状态 ledState = !ledState; // 切换LED状态 LED = ledState; // 更新LED硬件状态}
// 按键扫描任务(示例中省略具体实现)void taskKeyScan(void) { // 按键扫描逻辑}
// 主函数void main(void) { // 初始化LED状态 LED = 0;
// 定时器0初始化设置 TMOD &= 0xF0; // 设置定时器模式寄存器,使用模式1(16位定时器/计数器) TH0 = 0x4C; // 设置定时器初值,产生定时中断(定时周期取决于系统时钟频率) TL0 = 0x00; ET0 = 1; // 允许定时器0中断 EA = 1; // 允许中断 TR0 = 1; // 启动定时器0
while(1) { taskScheduler(); // 调用任务调度器 }}
这里只是举个简单的例子,这个代码示例,比较适合51和stm8这种资源非常少的单片机。

         

 

8.代理架构
这个大家或许比较少听到过,但在稍微复杂的项目中,是非常常用的。

在代理架构中,每个代理(Agent)都是一个独立的实体,它封装了特定的决策逻辑和数据,并与其他代理进行交互。

在实际项目中,需要创建多个独立的任务或模块,每个模块负责特定的功能,并通过某种机制(如消息队列、事件触发等)进行通信。

这种方式可以大大提高程序可扩展性和可移植性。

以下是一个LED和按键代理的简化模型。
#include   // 包含51系列单片机的寄存器定义
// 假设P3.5是按键输入,P1.0是LED输出sbit KEY = P3^5;sbit LED = P1^0;
typedef struct { unsigned char pin; // 代理关联的引脚 void (*action)(void); // 代理的行为函数} Agent;
// 按键代理的行为函数声明void keyAction(void);// LED代理的行为函数声明void ledAction(void);
// 代理数组,存储所有代理的行为和关联的引脚Agent agents[] = { {5, keyAction}, // 按键代理,关联P3.5 {0, ledAction} // LED代理,关联P1.0};
// 按键代理的行为函数void keyAction(void) { if(KEY == 0) // 检测按键是否被按下 { LED = !LED; // 如果按键被按下,切换LED状态 while(KEY == 0); // 等待按键释放 }}
// LED代理的行为函数void ledAction(void) { static unsigned int toggleCounter = 0; toggleCounter++; if(toggleCounter == 500) // 假设每500个时钟周期切换一次LED { LED = !LED; // 切换LED状态 toggleCounter = 0; // 重置计数器 }}
// 主函数void main(void) { unsigned char agentIndex; // 主循环 while(1) { for(agentIndex = 0; agentIndex < sizeof(agents) / sizeof(agents[0]); agentIndex++) { // 调用每个代理的行为函数 (*agents[agentIndex].action)(); // 注意函数指针的调用方式 } }}

         

 

         

 

9.组件化架构
组件化架构是一种将软件系统分解为独立、可重用组件的方法。

将程序分割成负责特定任务的模块,如LED控制、按键处理、传感器读数等。

每个组件可以独立开发和测试,然后被组合在一起形成完整的系统。

以下是一个简化的组件化架构示例,模拟了一个单片机系统中的LED控制和按键输入处理两个组件。

为了简化,组件间的通信将通过直接函数调用来模拟。
#include   // 包含51系列单片机的寄存器定义
// 定义组件结构体typedef struct { void (*init)(void); // 组件初始化函数 void (*task)(void); // 组件任务函数} Component;
// 假设P3.5是按键输入,P1.0是LED输出sbit KEY = P3^5;sbit LED = P1^0;
// LED组件void LED_Init(void) { LED = 0; // 初始化LED状态为关闭}
void LED_Task(void) { static unsigned int toggleCounter = 0; toggleCounter++; if (toggleCounter >= 1000) // 假设每1000个时钟周期切换一次LED { LED = !LED; // 切换LED状态 toggleCounter = 0; // 重置计数器 }}
// 按键组件void KEY_Init(void) { // 按键初始化代码}
void KEY_Task(void) { if (KEY == 0) // 检测按键是否被按下 { LED = !LED; // 如果按键被按下,切换LED状态 while(KEY == 0); // 等待按键释放 }}
// 组件数组,存储系统中所有组件的初始化和任务函数Component components[] = { {LED_Init, LED_Task}, {KEY_Init, KEY_Task}};
// 系统初始化函数,调用所有组件的初始化函数void System_Init(void) { unsigned char componentIndex; for (componentIndex = 0; componentIndex < sizeof(components) / sizeof(components[0]); componentIndex++) { components[componentIndex].init(); }}
// 主循环,调用所有组件的任务函数void main(void) { System_Init(); // 系统初始化 while(1) { unsigned char componentIndex; for (componentIndex = 0; componentIndex < sizeof(components) / sizeof(components[0]); componentIndex++) { components[componentIndex].task(); // 调用组件任务 } }}

以上几种,我都整理到单片机入门到高级资料+工具包了,大家可自行在朋友圈找我安排,老规矩,无偿无套路,先安排三连,再来取         

 

         

 

当然,以上都是最简易的代码模型,如果想用于实际项目,很多细节还要优化。

后面为了适应更复杂的项目,我基于以上这几种编程思维,重构了代码,使OS变得移植性和扩展性更强,用起来也更灵活。

我在2019年,也系统录制过关于这套架构的教程,粉丝可找我安排。
         

 

目前我们无际单片机特训营项目3和6就是采用这种架构,稳的一批。
         

 

如果想系统提升编程思维和代码水平,还是得从0到1去学习我们项目,并不是说技术有多难,而是很多思维和实现细节,没有参考,没人指点,靠自己需要摸索很久。

除了以上架构,更复杂的就是RTOS了。
不过一般对于有架构设计能力的工程师来说,更习惯于使用传统的裸机编程方式,这种方式可能更直观且可控。


end


下面是更多无际原创个人成长经历、行业经验、技术干货

1.电子工程师是怎样的成长之路?10年5000字总结

2.如何快速看懂别人的代码和思维

3.单片机开发项目全局变量太多怎么管理?

4.C语言开发单片机为什么大多数都采用全局变量的形式

5.单片机怎么实现模块化编程?实用程度让人发指!

6.c语言回调函数的使用及实际作用详解

7.手把手教你c语言队列实现代码,通俗易懂超详细!

8.c语言指针用法详解,通俗易懂超详细!



无际单片机编程 单片机编程、全栈孵化。
评论 (0)
  • 及时生产 JIT(Just In Time)的起源JIT 起源于 20 世纪 70 年代爆发的全球石油危机和由此引发的自然资源短缺,这对仰赖进口原物料发展经济的日本冲击最大。当时日本的生产企业为了增强竞争力、提高产品利润,在原物料成本难以降低的情况下,只能从生产和流通过程中寻找利润源,降低库存、库存和运输等方面的生产性费用。根据这种思想,日本丰田汽车公司创立的一种具有特色的现代化生产方式,即 JIT,并由此取得了意想不到的成果。由于它不断地用于汽车生产,随后被越来越多的许多行业和企业所采用,为日
    优思学院 2025-04-07 11:56 103浏览
  • 在人工智能技术飞速发展的今天,语音交互正以颠覆性的方式重塑我们的生活体验。WTK6900系列语音识别芯片凭借其离线高性能、抗噪远场识别、毫秒级响应的核心优势,为智能家居领域注入全新活力。以智能风扇为起点,我们开启一场“解放双手”的科技革命,让每一缕凉风都随“声”而至。一、核心技术:精准识别,无惧环境挑战自适应降噪,听懂你的每一句话WTK6900系列芯片搭载前沿信号处理技术,通过自适应降噪算法,可智能过滤环境噪声干扰。无论是家中电视声、户外虫鸣声,还是厨房烹饪的嘈杂声,芯片均能精准提取有效指令,识
    广州唯创电子 2025-04-08 08:40 129浏览
  • 引言:POPO声的成因与影响在语音芯片应用中,WT588F08A作为一款支持DAC+功放输出的高集成方案,常因电路设计或信号处理不当,在音频播放结束后出现POPO声(瞬态噪声)。这种噪声不仅影响用户体验,还可能暴露电路设计缺陷。本文将基于实际案例,解析POPO声的成因并提供系统化的解决方案。一、POPO声的根源分析1. 功放电路状态切换的瞬态冲击当DAC输出的音频信号突然停止时,功放芯片的输入端若处于高阻态或无信号状态,其内部放大电路会因电源电压突变产生瞬态电流,通过喇叭表现为POPO声。关键因
    广州唯创电子 2025-04-07 09:01 107浏览
  • 在追求环境质量升级与产业效能突破的当下,温湿度控制正成为横跨多个行业领域的核心命题。作为环境参数中的关键指标,温湿度的精准调控不仅承载着人们对舒适人居环境的期待,更深度关联着工业生产、科研实验及仓储物流等场景的运营效率与安全标准。从应用场景上看,智能家居领域要求温湿度系统实现与人体节律的协同调节,半导体洁净车间要求控制温湿度范围及其波动以保障良品率,而现代化仓储物流体系则依赖温湿度的实时监测预防各种产品的腐损与锈化。温湿度传感器作为实现温湿度监测的关键元器件,其重要性正在各行各业中凸显而出。温湿
    华普微HOPERF 2025-04-07 10:05 121浏览
  • 在万物互联时代,智能化安防需求持续升级,传统报警系统已难以满足实时性、可靠性与安全性并重的要求。WT2003H-16S低功耗语音芯片方案,以4G实时音频传输、超低功耗设计、端云加密交互为核心,重新定义智能报警设备的性能边界,为家庭、工业、公共安防等领域提供高效、稳定的安全守护。一、技术内核:五大核心突破,构建全场景安防基座1. 双模音频传输,灵活应对复杂场景实时音频流传输:内置高灵敏度MIC,支持环境音实时采集,通过4G模块直接上传至云端服务器,响应速度低至毫秒级,适用于火灾警报、紧急呼救等需即
    广州唯创电子 2025-04-08 08:59 108浏览
  • HDMI从2.1版本开始采用FRL传输模式,和2.0及之前的版本不同。两者在物理层信号上有所区别,这就需要在一些2.1版本的电路设计上增加匹配电路,使得2.1版本的电路能够向下兼容2.0及之前版本。2.1版本的信号特性下面截取自2.1版本规范定义,可以看到2.1版本支持直流耦合和交流耦合,其共模电压和AVCC相关,信号摆幅在400mV-1200mV2.0及之前版本的信号特性HDMI2.0及之前版本采用TMDS信号物理层,其结构和参数如下:兼容设计根据以上规范定义,可以看出TMDS信号的共模电压范
    durid 2025-04-08 19:01 91浏览
  • 文/Leon编辑/cc孙聪颖‍转手绢、跳舞、骑车、后空翻,就在宇树、智元等独角兽企业率领“机器人大军”入侵短视频时,却有资本和科技大佬向此产业泼了一盆冷水。金沙江创投管理合伙人朱啸虎近日突然对人形机器人发难,他表示“最近几个月正在批量退出人形机器人公司”。“只是买回去做研究的,或者买回去做展示的,这种都不是我们意义上的商业化,谁会花十几万买一个机器人去干这些活?”朱啸虎吐槽。不过,朱啸虎的观点很快就遭到驳斥,众擎机器人的创始人、董事长赵同阳回怼道:“(朱啸虎)甚至问出了人形机器人在这个阶段有什么
    华尔街科技眼 2025-04-07 19:24 118浏览
  • 贞光科技作为三星电机车规电容代理商,针对电动汽车领域日益复杂的电容选型难题,提供全方位一站式解决方案。面对高温稳定性、高可靠性、高纹波电流和小型化等严苛要求,三星车规电容凭借完整产品矩阵和卓越技术优势,完美满足BMS、电机控制器和OBC等核心系统需求。无论技术选型、供应链保障、样品测试还是成本优化,贞光科技助力客户在电动汽车产业高速发展中占据技术先机。在电动汽车技术高速发展的今天,作为汽车电子系统中不可或缺的关键元器件,电容的选型已成为困扰许多工程师和采购人员的难题。如何在众多参数和型号中找到最
    贞光科技 2025-04-07 17:06 59浏览
  • 在全球电子产业面临供应链波动、技术迭代和市场需求变化等多重挑战的背景下,安博电子始终秉持“让合作伙伴赢得更多一点”的核心理念,致力于打造稳健、高效、可持续的全球供应链体系。依托覆盖供应商管理、品质检测、智能交付的全链路品控体系,安博电子不仅能确保电子元器件的高可靠性与一致性,更以高透明的供应链管理模式,助力客户降低风险、提升运营效率,推动行业标准升级,与全球合作伙伴共同塑造更具前瞻性的产业生态。动态优选机制:构建纯净供应链生态安博电子将供应商管理视为供应链安全的根基。打造动态优选管控体系,以严格
    电子资讯报 2025-04-07 17:06 72浏览
  • 医疗影像设备(如CT、MRI、超声诊断仪等)对PCB的精度、可靠性和信号完整性要求极高。这类设备需要处理微伏级信号、高频数据传输,同时需通过严格的EMC/EMI测试。制造此类PCB需从材料选择、层叠设计、工艺控制等多维度优化。以下是关键技术与经验分享。 1. 材料选择:高频与生物兼容性优先医疗影像设备PCB常采用 Rogers RO4000系列 或 Isola FR4高速材料,以降低介电损耗并保证信号稳定性。例如,捷多邦在客户案例中曾为某超声探头厂商推荐 Rogers RO4350B
    捷多邦 2025-04-07 10:22 101浏览
  •     根据 IEC术语,瞬态过电压是指持续时间几个毫秒及以下的过高电压,通常是以高阻尼(快速衰减)形式出现,波形可以是振荡的,也可以是非振荡的。    瞬态过电压的成因和机理,IEC 60664-1给出了以下四种:    1. 自然放电,最典型的例子是雷击,感应到电力线路上,并通过电网配电系统传输,抵达用户端;        2. 电网中非特定感性负载通断。例如热处理工厂、机加工工厂对
    电子知识打边炉 2025-04-07 22:59 92浏览
  •     在研究Corona现象时发现:临界电压与介电材料表面的清洁程度有关。表面越清洁的介电材料,临界电压越高;表面污染物越多的地方,越容易“爬电”。关于Corona现象,另见基础理论第007篇。    这里说的“污染物”,定义为——可能影响介电强度或表面电阻率的固体、液体或气体(电离气体)的任何情况。    IEC 60664-1 (对应GB/T 16935.1-2023) 定义了 Pollution Degree,中文术语是“污染等
    电子知识打边炉 2025-04-07 22:06 76浏览
  • 曾几何时,汽车之家可是汽车资讯平台领域响当当的“扛把子”。2005 年成立之初,它就像一位贴心的汽车小助手,一下子就抓住了大家的心。它不仅吸引了海量用户,更是成为汽车厂商和经销商眼中的“香饽饽”,广告投放、合作推广不断,营收和利润一路高歌猛进,2013年成功在纽交所上市,风光无限。2021年更是在香港二次上市,达到了发展的巅峰,当年3月15日上市首日,港股股价一度高达184.6港元,市值可观。然而,如今的汽车之家却陷入了困境,业务下滑明显。业务增长瓶颈从近年来汽车之家公布的财报数据来看,情况不容
    用户1742991715177 2025-04-07 21:48 82浏览
  •   工业自动化领域电磁兼容与接地系统深度剖析   一、电磁兼容(EMC)基础认知   定义及关键意义   电磁兼容性(EMC),指的是设备或者系统在既定的电磁环境里,不但能按预期功能正常运转,而且不会对周边其他设备或系统造成难以承受的电磁干扰。在工业自动化不断发展的当下,大功率电机、变频器等设备被大量应用,现场总线、工业网络等技术也日益普及,致使工业自动化系统所处的电磁环境变得愈发复杂,电磁兼容(EMC)问题也越发严峻。   ​电磁兼容三大核心要素   屏蔽:屏蔽旨在切断电磁波的传播路
    北京华盛恒辉软件开发 2025-04-07 22:55 143浏览
我要评论
0
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦