基于ESP32-C6的SDIO接口AT通讯应用

原创 嵌入式Lee 2025-03-06 15:08

.前言    

  乐鑫的ESP32系列芯片是项目中扩展WIFI和蓝牙通讯连接的不错的选择,一般我们使用官方的AT固件通过UART通讯开发,比较简单。但是UART一般速度较低,在有更高速度要求的场景时希望使用更快的SDIO或者SPI接口,官方是支持不同接口方式的。ESP32的芯片一般都有SDIO SPI从接口所以除了可以使用UART还可以使用SDIOSPI进行通讯。ESP32可以使用两种方式接入,一种还是传统的AT模式,协议栈运行在ESP32上,接口可以选择UARTSDIOSPI; 还有一种是ESP32作为网卡的模式,透传以太网包,协议栈跑在主机上,接口也可以使用UARTSDIOSPI。两者官方都在githun上有开源项目。这一篇就来分享使用SDIO接口的AT模式将ESP32接入自己的项目中,以ESP32-C6为例。后面再分享ESP32使用SDIO接口作为网卡模式接入的方式。

.固件准备

2.1环境搭建

下载源码

git clone --recursive https://gitee.com/EspressifSystems/esp-at.git

打开ESP-IDF 5.4 PowerShell  (ESP-IDF的开发环境搭建可以参考官方论坛)

进入到上述下载的项目中cd D:\BOARD\esp32-c6\esp32-at\esp-at

安装开发环境,python build.py install

按照如下选择

5 PLATFORM_ESPC6

选择ESP32C6-4MB

0 NO 先不silence,即有打印方便调试,调试没问题关闭日志设置为1,减少打印

此时开始自动clone esp-idf和其他模块

完成后如下

配置

python build.py menuconfig

配置为SDIO接口

Component config -> AT -> communicate method for AT command -> AT throughSDIO 

s回车,保存

q退出

2.2编译


python build.py build

2.3烧录


按住boot不松,按下rst松开复位。

实际上上述操作可以不需要,直接输入以下命令会重启进入下载模式。

下载时注意如果已经有其他串口助手连接该串口需要先断开。

其中COM167USB枚举出的串口号.

python build.py -p COM167 flash

如果提示

File "D:\BOARD\esp32-c6\esp32-at\esp-at\esp-idf\tools\idf_py_actions\tools.py", line 267, in generate_hints

yield from generate_hints_buffer(file.read(), hints)

UnicodeDecodeError: 'gbk' codec can't decode byte 0x82 in position 2869: illegal multibyte sequence

修改文件

D:\BOARD\esp32-c6\esp32-at\esp-at\esp-idf\tools\idf_py_actions\tools.py

如果无法运行可以尝试擦除

python build.py -p (PORT) erase_flash 

接上ESP32的串口(USB枚举的串口)

回车可以看到

Help可以查看命令,ps可以查看任务信息

此时可以查看SDIO的寄存器

寄存器基地址如下

如果要看寄存器SLCHOST_PKT_LEN_REG的内容

printmem hex 60018060 1 32 0

偏移0x58的中断ST状态寄存器,可以看到如下

esp32c6> printmem hex 60018058 1 32 0

[60018058]:00800000 

esp32c6> 

偏移0xD4寄存器是清除标志,setmem 600180d4 800000再回读,看到标志被清除

2.4添加调试功能


为了方便调试,比如查看SDIO的寄存器,这里添加一个shell任务,实现任意地址的内存读写功能,以及任务信息查看的功能,

添加以下文件

app_shell.c

#include #include #include "esp_system.h"#include "esp_log.h"#include "esp_console.h"#include "esp_vfs_dev.h"#include "esp_vfs_fat.h"#include "freertos/FreeRTOS.h"static const char* TAG = "shell";#define PROMPT_STR CONFIG_IDF_TARGETstatic int ps_command(int argc, char **argv){  uint32_t total_time;    uint32_t task_cnt = uxTaskGetNumberOfTasks();    TaskStatus_t * p_task_array = pvPortMalloc(sizeof(TaskStatus_t) * task_cnt);    if (NULL == p_task_array) {        return -1;    }    task_cnt = uxTaskGetSystemState(p_task_array, task_cnt, &total_time);  printf("name            id\tpri\tts\tsta\tsbase\t   smark\r\n");    for (uint32_t i = 0; i < task_cnt; i++) {        TaskStatus_t * p_task = p_task_array + i;    printf("%-16s%-8u%-8u%-8lu%-8u%-8lx%8lu\r\n",p_task->pcTaskName,p_task->xTaskNumber,p_task->uxCurrentPriority,p_task->ulRunTimeCounter,            p_task->eCurrentState,(uint32_t)(p_task->pxStackBase),p_task->usStackHighWaterMark);    }    vPortFree(p_task_array);    return 0;}static int printmem_command(int argc, char **argv){    uint32_t addr;    uint32_t len;    uint8_t mode[64];    int datasize;    uint8_t* tmp8_u;    uint16_t* tmp16_u;    uint32_t* tmp32_u;    int8_t* tmp8_i;    int16_t* tmp16_i;    int32_t* tmp32_i;      int sig;    sscanf((const char*)argv[1], "%s", mode);    sscanf((const char*)argv[2], "%lx",&addr);    sscanf((const char*)argv[3], "%ld",&len);    sscanf((const char*)argv[4], "%d", &datasize);    sscanf((const char*)argv[5], "%d", &sig);    if(6 == argc)    {      if(strncmp((const char*)mode,"hex"3) == 0)      {        if(datasize == 8)        {          tmp8_u = (uint8_t*)addr;          for(uint32_t i=0; i          {            if(i%16 == 0)            {              printf("\r\n[%08lx]:",addr+i*1);            }            printf("%02x ",tmp8_u[i]);          }          printf("\r\n");        }        else if(datasize == 16)        {          tmp16_u = (uint16_t*)addr;          for(uint32_t i=0; i          {            if(i%16 == 0)            {              printf("\r\n[%08lx]:",addr+i*2);            }            printf("%04x ",tmp16_u[i]);          }          printf("\r\n");        }        else if(datasize == 32)        {          tmp32_u = (uint32_t*)addr;          for(uint32_t i=0; i          {            if(i%16 == 0)            {              printf("\r\n[%08lx]:",addr+i*4);            }            printf("%08lx ",tmp32_u[i]);          }          printf("\r\n");        }        else        {          printf("datasize must be 8/16/32\r\n");        }      }      else if(strncmp((const char*)mode,"dec"3) == 0)      {        if(datasize == 8)        {          if(sig == 0)          {            tmp8_u = (uint8_t*)addr;            for(uint32_t i=0; i            {              if(i%16 == 0)              {                printf("\r\n");              }              printf("%d ",tmp8_u[i]);            }            printf("\r\n");          }          else          {            tmp8_i = (int8_t*)addr;            for(uint32_t i=0; i            {              if(i%16 == 0)              {                printf("\r\n");              }              printf("%d ",tmp8_i[i]);            }            printf("\r\n");          }        }        else if(datasize == 16)        {          if(sig == 0)          {            tmp16_u = (uint16_t*)addr;            for(uint32_t i=0; i            {              if(i%16 == 0)              {                printf("\r\n");              }              printf("%d ",tmp16_u[i]);            }            printf("\r\n");          }          else          {            tmp16_i = (int16_t*)addr;            for(uint32_t i=0; i            {              if(i%16 == 0)              {                printf("\r\n");              }              printf("%d ",tmp16_i[i]);            }            printf("\r\n");          }        }        else if(datasize == 32)        {          if(sig == 0)          {            tmp32_u = (uint32_t*)addr;            for(uint32_t i=0; i            {              if(i%16 == 0)              {                printf("\r\n");              }              printf("%ld ",tmp32_u[i]);            }            printf("\r\n");          }          else          {            tmp32_i = (int32_t*)addr;            for(uint32_t i=0; i            {              if(i%16 == 0)              {                printf("\r\n");              }              printf("%ld ",tmp32_i[i]);            }            printf("\r\n");          }        }        else        {          printf("datasize must be 8/16/32\r\n");        }      }      else      {        printf("mode must be [hex/dec]\r\n");      }    }    else    {        printf("param err\r\n");    }    return 0;}static int setmem_command(int argc, char **argv){    uint32_t addr;    uint32_t val;    if(3 == argc){      sscanf((const char*)argv[1], "%lx", &addr);      sscanf((const char*)argv[2], "%lx", &val);       printf("setmem  %lx %lx\r\n",addr,val);      if((addr % 4) ==0)      {        *(volatile uint32_t*)addr = val;        printf("%lx\r\n",*(volatile uint32_t*)addr);      }      else      {        printf("addr must be mul of 4\r\n");      }    }else{        printf("param err\r\n");    }    return 0;}esp_err_t esp_console_register_ps_command(void){    esp_console_cmd_t command = {        .command = "ps",        .help = "Print Task Information",        .func = &ps_command,        .argtable = NULL    };    return esp_console_cmd_register(&command);}esp_err_t esp_console_register_printmem_command(void){    esp_console_cmd_t command = {        .command = "printmem",        .help = "printmem mode[hex/dec] addr[hex] len datasize[8/16/32] sig[1/0]",        .func = &printmem_command,        .argtable = NULL    };    return esp_console_cmd_register(&command);}esp_err_t esp_console_register_setmem_command(void){    esp_console_cmd_t command = {        .command = "setmem",        .help = "setmem addr[hex] val[hex]",        .func = &setmem_command,        .argtable = NULL    };    return esp_console_cmd_register(&command);}void app_shell_init(void){    esp_console_repl_t *repl = NULL;    esp_console_repl_config_t repl_config = ESP_CONSOLE_REPL_CONFIG_DEFAULT();    /* Prompt to be printed before each line.     * This can be customized, made dynamic, etc.     */    repl_config.prompt = PROMPT_STR ">";    repl_config.max_cmdline_length = 1024;    ESP_LOGI(TAG, "shell init");    /* Register commands */    esp_console_register_help_command();  esp_console_register_ps_command();  esp_console_register_printmem_command();  esp_console_register_setmem_command();  #if defined(CONFIG_ESP_CONSOLE_UART_DEFAULT) || defined(CONFIG_ESP_CONSOLE_UART_CUSTOM)    esp_console_dev_uart_config_t hw_config = ESP_CONSOLE_DEV_UART_CONFIG_DEFAULT();    ESP_ERROR_CHECK(esp_console_new_repl_uart(&hw_config, &repl_config, &repl));#elif defined(CONFIG_ESP_CONSOLE_USB_CDC)    esp_console_dev_usb_cdc_config_t hw_config = ESP_CONSOLE_DEV_CDC_CONFIG_DEFAULT();    ESP_ERROR_CHECK(esp_console_new_repl_usb_cdc(&hw_config, &repl_config, &repl));#elif defined(CONFIG_ESP_CONSOLE_USB_SERIAL_JTAG)    esp_console_dev_usb_serial_jtag_config_t hw_config = ESP_CONSOLE_DEV_USB_SERIAL_JTAG_CONFIG_DEFAULT();    ESP_ERROR_CHECK(esp_console_new_repl_usb_serial_jtag(&hw_config, &repl_config, &repl));#else#error Unsupported console type#endif    ESP_ERROR_CHECK(esp_console_start_repl(repl));}

app_shell.h

#ifndef __APP_SHELL__H#define __APP_SHELL__H void app_shell_init(void); #endif

清除

python build.py clean

配置

(Top) → Component config → Console Library 

[*] Enable sorted help 

(Top) → Component config → FreeRTOS → Kernel 

下配置

s保存

q退出

重新编译

python build.py build

重新下载运行

python build.py -p COM167 flash

三. HOST环境测试


3.1 主机工程


先以官方支持的STM32为例,先跑一遍,然后再移植到自己的项目。

打开esp-at\examples\at_sdio_host\STM32\MDK-ARM\sdio_at.uvprojx

我这里选择编译器版本6

需要替换port.cportmacro.h

FreeRTOS-Kernel\portable\GCC\ARM_CM3下的文件

这里是V10.0.1版本,可以从https://sourceforge.net/projects/freertos/下载对应的版本。

3.2编译运行问题


1.如果下载后进入0x1fffxxx位置,注意BOOT的电平是否为进入了bootrom模式,

2.如果不能运行,配置使用微库

Printf使用fputc

3.3引脚


STM32引脚

ESP32-C6引脚

3.4打印等级


修改如下打印等级,开始可以多打印一些调试信息


3.5配置ESP32-C6SDIO时序


如下位置,有4种组合,通讯异常时可异常时不同配置,配置使能内部上拉

STM32端配置时钟速率,总线位宽,时钟边沿

我这里使用逻辑分析仪,抓了STM32下的包,可以参考,抓包可以看到CMD5并没有响应,说明SDIO时序还是有点不问题,这里到时再调试。

对应的波形文件如下

通过网盘分享的文件:esp32-c6-at-sdio

链接: https://pan.baidu.com/s/1rkLlNP_HJXA-EMJp3TclQg?pwd=sffg 提取码: sffg 

--来自百度网盘超级会员v3的分享

3.6通讯测试


具体可以参考官方AT手册

AT+RESTORE 恢复出厂默认值

AT+CWMODE=1 设置station模式

AT+CWJAP="wifi","wifi密码" 连接wifi

AT+CIPSTA? 查看IP地址

AT+CIPSTART="TCP","172.16.11.72",8080 连接tcp服务端

AT+CIPSEND=4 准备发送4字节数据

再发送1234

接收

进入透传接收模式

AT+CIPMODE=1

关闭回显

ATE0

透传发送模式

AT+CIPSEND

3.7 ESP32-C6 SDIO时序测试


测试ESP32C6的输出边沿,可以用逻辑分析仪抓到。

ESP32C6的采样边沿不能直接测量到,只能修改host那边看它是否能接收来判定。

SDIO_SLAVE_TIMING_NSEND_NSAMPLE


下降沿发送数据

SDIO_SLAVE_TIMING_PSEND_NSAMPLE


上升沿发送数据

SDIO_SLAVE_TIMING_NSEND_PSAMPLE


下降沿发送数据

SDIO_SLAVE_TIMING_PSEND_PSAMPLE


上升沿发送数据

3.8 HOST端 SDIO时序


这里需要根据不同平台进行配置和ESP32C6那边对应。

.HOST移植


4.1代码移植


官方的基于STM32做了Demo,但是说实话代码有电乱可移植性不怎么好,这类进行了重构,将需要移植的接口单独拿出,只需要适配即可。命名也加了前缀避免冲突。

其中esp_host_port.h/c实现信号量等接口,sdio_itf.h/c实现SDIO的接口,主要是初始化,CMD52读写寄存器,CMD53读写数据。

4.2收发数据协议


4.2.1中断


F10x50 RAW寄存器

F10x58 ST寄存器

F10xD4 CLR寄存器

比如

wifirddat 1 58 4

rddat fn:1,addr:0x58,len:4

00 00 80 00

Bit231表示用新的包待读

4.2.2获取待读数据大小


比如

wifirddat 1 60 4

rddat fn:1,addr:0x60,len:4

09 00 90 00 

表示有9字节待读取。

CHECK也为9.

4.2.3读数据


F1的地址0x1F800 往前偏移待读取的数据大小

前面待读取数据为9字节,所以从0x1F800-0x09开始读

所以

wifirddat 1 1f7f7 12

rddat fn:1,addr:0x1f7f7,len:12

0d 0a 72 65 61 64 79 0d 0a 00 00 00 :- - r e a d y - - - - - 

其中最后3字节是填充0,需要按照4字节对齐读。

读到的即为ready

对应的是slave的如下代码

Slave发送readyMaster读出之后,slave打印done

4.3.4获取可写空间大小


F10x44寄存器

4.2.4写数据


调用接口sdio_host_send_packet

先获取可写大小

然后CMD530x1F800(这是结束地址,往前偏移指定位置为开始地址)

4.3速度优化


参考https://docs.espressif.com/projects/esp-at/zh_CN/latest/esp32/Compile_and_Develop/How_to_optimize_throughput.html

4.4 速度测试


这里使用25MHz频率,1bit模式,

进入透传模式,不断发送数据,上位机接收数据,简单测试下速率。

实际和上位机,发送模式,esp32那边的配置等都有影响。

static void wifitxtestfunc(uint8_t* param){  int plen;  int pnum;  uint8_t* buffer;  if(2 == sscanf((const char*)param, "%*s %d %d", &plen, &pnum))  {    xprintf("plen:%d pnum:%d\r\n",plen,pnum);    buffer = os_mem_malloc(0,plen);    if(buffer == NULL){      xprintf("malloc %d err\r\n",plen);      return;    }    for(int i=0; i      buffer[i] = i;    }    uint32_t t0;    uint32_t t1;    uint32_t diff;    long len = (long)plen*(long)pnum;    os_delay(100);    //os_task_suspend_all();    t0 = os_get_ticks();    for(int i=0; i      sdio_host_send_packet(buffer, plen);    }    t1 = os_get_ticks();    os_mem_free(buffer);    if(t1 >= t0){      diff = t1 - t0;    }else{      diff = 0xFFFFFFFF - t0 + t1 +1;    }    //os_task_resume_all();    xprintf("send len %ld\r\n",len);    xprintf("used %dmS\r\n",diff);    xprintf("%dkB/S\r\n",(int)((len*1.000f)/(1.024f*diff)));   }  else  {    xprintf("param err\r\n");  }}

.总结


    最主要的需要注意SDIO时序的配置,可以先使能ESP32-C6的内部上拉,为了可靠最好硬件上加上拉。 然后注意HOSTESP32的时序匹配,比如HOST上升沿发送数据则ESP32下降沿采集数据,反之亦然,这一步一定要使用逻辑分析仪抓包看,调整到采样边沿到数据的正中央是最理想的,这样setup和hold时间都是半个bit宽,冗余度最高。个人调试来看感觉ESP32SDIO不是很健壮,这里需要HOST时序一定要调整到最优,如果HOST硬件支持turning可以微调CLK和数据的相位的话会更容易适配。




评论 (0)
  • 行业痛点:电动车智能化催生语音交互刚需随着全球短途出行市场爆发式增长,中国电动自行车保有量已突破3.5亿辆。新国标实施推动行业向智能化、安全化转型,传统蜂鸣器报警方式因音效单一、缺乏场景适配性等问题,难以满足用户对智能交互体验的需求。WT2003HX系列语音芯片,以高性能处理器架构与灵活开发平台,为两轮电动车提供从基础报警到智能交互的全栈语音解决方案。WT2003HX芯片技术优势深度解读1. 高品质硬件性能,重塑语音交互标准搭载32位RISC处理器,主频高达120MHz,确保复杂算法流畅运行支持
    广州唯创电子 2025-04-10 09:12 163浏览
  •     前几天同事问我,电压到多少伏就不安全了?考虑到这位同事的非电专业背景,我做了最极端的答复——多少伏都不安全,非专业人员别摸带电的东西。    那么,是不是这么绝对呢?我查了一下标准,奇怪的知识增加了。    标准的名字值得玩味——《电流对人和家畜的效应》,GB/T 13870.5 (IEC 60749-5)。里面对人、牛、尸体分类讨论(搞硬件的牛马一时恍惚,不知道自己算哪种)。    触电是电流造成的生理效应
    电子知识打边炉 2025-04-09 22:35 175浏览
  •   卫星故障预警系统软件:卫星在轨安全的智能护盾   北京华盛恒辉卫星故障预警系统软件,作为确保卫星在轨安全运行的关键利器,集成前沿的监测、诊断及预警技术,对卫星健康状况予以实时评估,提前预判潜在故障。下面将从核心功能、技术特性、应用场景以及发展走向等方面展开详尽阐述。   应用案例   目前,已有多个卫星故障预警系统在实际应用中取得了显著成效。例如,北京华盛恒辉和北京五木恒润卫星故障预警系统。这些成功案例为卫星故障预警系统的推广和应用提供了有力支持。   核心功能   实时状态监测:
    华盛恒辉l58ll334744 2025-04-09 19:49 159浏览
  • 什么是车用高效能运算(Automotive HPC)?高温条件为何是潜在威胁?作为电动车内的关键核心组件,由于Automotive HPC(CPU)具备高频高效能运算电子组件、高速传输接口以及复杂运算处理、资源分配等诸多特性,再加上各种车辆的复杂应用情境等等条件,不难发见Automotive HPC对整个平台讯号传输实时处理、系统稳定度、耐久度、兼容性与安全性将造成多大的考验。而在各种汽车使用者情境之中,「高温条件」就是你我在日常生活中必然会面临到的一种潜在威胁。不论是长时间将车辆停放在室外的高
    百佳泰测试实验室 2025-04-10 15:09 70浏览
  • 由西门子(Siemens)生产的SIMATIC S7 PLC在SCADA 领域发挥着至关重要的作用。在众多行业中,SCADA 应用都需要与这些 PLC 进行通信。那么,有哪些高效可行的解决方案呢?宏集为您提供多种选择。传统方案:通过OPC服务器与西门子 PLC 间接通信SIMATIC S7系列的PLC是工业可编程控制器,能够实现对生产流程的实时SCADA监控,提供关于设备和流程状态的准确、最新数据。S7Comm(全称S7 Communication),也被称为工业以太网或Profinet,是西门
    宏集科技 2025-04-10 13:44 76浏览
  • 文/Leon编辑/侯煜‍关税大战一触即发,当地时间4月9日起,美国开始对中国进口商品征收总计104%的关税。对此,中国外交部回应道:中方绝不接受美方极限施压霸道霸凌,将继续采取坚决有力措施,维护自身正当权益。同时,中国对原产于美国的进口商品加征关税税率,由34%提高至84%。随后,美国总统特朗普在社交媒体宣布,对中国关税立刻提高至125%,并暂缓其他75个国家对等关税90天,在此期间适用于10%的税率。特朗普政府挑起关税大战的目的,实际上是寻求制造业回流至美国。据悉,特朗普政府此次宣布对全球18
    华尔街科技眼 2025-04-10 16:39 81浏览
  •   海上电磁干扰训练系统:全方位解析      海上电磁干扰训练系统,作为模拟复杂海上电磁环境、锻炼人员应对电磁干扰能力的关键技术装备,在军事、科研以及民用等诸多领域广泛应用。接下来从系统构成、功能特点、技术原理及应用场景等方面展开详细解析。   应用案例   系统软件供应可以来这里,这个首肌开始是幺伍扒,中间是幺幺叁叁,最后一个是泗柒泗泗,按照数字顺序组合就可以找到。   一、系统构成   核心组件   电磁信号模拟设备:负责生成各类复杂的电磁信号,模拟海上多样
    华盛恒辉l58ll334744 2025-04-10 16:45 91浏览
  •   天空卫星健康状况监测维护管理系统:全方位解析  在航天技术迅猛发展的当下,卫星在轨运行的安全与可靠至关重要。整合多种技术,实现对卫星的实时监测、故障诊断、健康评估以及维护决策,有力保障卫星长期稳定运转。  应用案例       系统软件供应可以来这里,这个首肌开始是幺伍扒,中间是幺幺叁叁,最后一个是泗柒泗泗,按照数字顺序组合就可以找到。  一、系统架构与功能模块  数据采集层  数据处理层  智能分析层  决策支持层  二、关键技术  故障诊断技术  
    华盛恒辉l58ll334744 2025-04-10 15:46 62浏览
  • 行业变局:从机械仪表到智能交互终端的跃迁全球两轮电动车市场正经历从“功能机”向“智能机”的转型浪潮。数据显示,2024年智能电动车仪表盘渗透率已突破42%,而传统LED仪表因交互单一、扩展性差等问题,难以满足以下核心需求:适老化需求:35%中老年用户反映仪表信息辨识困难智能化缺口:78%用户期待仪表盘支持手机互联与语音交互成本敏感度:厂商需在15元以内BOM成本实现功能升级在此背景下,集成语音播报与蓝牙互联的WT2605C-32N芯片方案,以“极简设计+智能交互”重构仪表盘技术生态链。技术破局:
    广州唯创电子 2025-04-11 08:59 121浏览
  • 技术原理:非扫描式全局像的革新Flash激光雷达是一种纯固态激光雷达技术,其核心原理是通过面阵激光瞬时覆盖探测区域,配合高灵敏度传感器实现全局三维成像。其工作流程可分解为以下关键环节:1. 激光发射:采用二维点阵光源(如VCSEL垂直腔面发射激光器),通过光扩散器在单次脉冲中发射覆盖整个视场的面阵激光,视场角通常可达120°×75°,部分激光雷达产品可以做到120°×90°的超大视场角。不同于传统机械扫描或MEMS微振镜方案,Flash方案无需任何移动部件,直接通过电信号控制激光发射模式。2.
    robolab 2025-04-10 15:30 87浏览
  • 背景近年来,随着国家对资源、能源有效利用率的要求越来越高,对环境保护和水处理的要求也越来越严格,因此有大量的固液分离问题需要解决。真空过滤器是是由负压形成真空过滤的固液分离机械。用过滤介质把容器分为上、下两层,利用负压,悬浮液加入上腔,在压力作用下通过过滤介质进入下腔成为滤液,悬浮液中的固体颗粒吸附在过滤介质表面形成滤饼,滤液穿过过滤介质经中心轴内部排出,达到固液分离的目的。目前市面上的过滤器多分为间歇操作和连续操作两种。间歇操作的真空过滤机可过滤各种浓度的悬浮液,连续操作的真空过滤机适于过滤含
    宏集科技 2025-04-10 13:45 69浏览
  • 政策驱动,AVAS成新能源车安全刚需随着全球碳中和目标的推进,新能源汽车产业迎来爆发式增长。据统计,2023年中国新能源汽车渗透率已突破35%,而欧盟法规明确要求2024年后新能效车型必须配备低速提示音系统(AVAS)。在此背景下,低速报警器作为车辆主动安全的核心组件,其技术性能直接关乎行人安全与法规合规性。基于WT2003H芯片开发的AVAS解决方案,以高可靠性、强定制化能力及智能场景适配特性,正成为行业技术升级的新标杆。WT2003H方案技术亮点解析全场景音效精准触发方案通过多传感器融合技术
    广州唯创电子 2025-04-10 08:53 188浏览
我要评论
0
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦