APM32芯得EP.36|APM32F4实现用U盘记录LOG信息

极海Geehy 2024-07-30 17:30


《APM32芯得》系列内容为用户使用APM32系列产品的经验总结,均转载自21ic论坛极海半导体专区,全文未作任何修改,未经原文作者授权禁止转载。




# 01 前言


MCU 组成的系统在实际应用中,经常需要记录系统 LOG 信息,可以是系统不同任务执行情况的 LOG 信息,也可以是内核寄存器等便于维护调试的信息,或者是传感器的信息等。

上述的这些 LOG 信息,如果在能联网的系统中,那么直接传输回服务器即可,但如果是离线的系统,那么就需要一个存储设备来记录这些 LOG 信息。一般有以下几种方式:

- 记录到 Nor  Flash 等板载存储器

- 记录到可移动的存储器,比如 U 盘等存储设备


本文提供后一种方式,即数据记录到 U 盘,这种方式方便进行现场维护,但实际应用中,可以结合 Nor Flash 加 U 盘的方式,避免读写 U 盘频率过快导致损坏。以下内容利用 APM32F407xx 的 OTG Host 和 Fatfs 文件系统,加上 RTC 功能来实现数据记录,包括以下功能。


- 按日期自动创建文件夹存放 `LOG.xls` 文件

- 按 1 秒的记录频率往 `LOG.xls` 文件写入带时间戳的数据

- 在 U 盘存储空间使用超过 90%时,删除日期最早的文件夹及 LOG 文件


# 02 外设和组件配置


下面简单介绍一下所用到的外设和组件的配置。

## OTG Host

OTG Host 的配置比较简单,配置为普通 FS 速度和 MSC Class 类即可。 


void USB_HostInitalize(void)

{

    /* USB host and class init */

    USBH_Init(&gUsbHostFS, USBH_SPEED_FS, &USBH_MSC_CLASS, USB_HostUserHandler);

}


U 盘在枚举完成后,需要获取 `LUN` 的信息,以便后续对特定 `LUN` 进行命令和数据读写等操作。 



有关 MSC Class 的处理在 `usbh_msc.c/h` 文件中的 `USBH_MSC_CLASS` 结构体句柄,其包含以下处理函数:

- `USBH_MSC_ClassInitHandler`:Class 初始化函数。

- `USBH_MSC_ClassDeInitHandler`:Class 解初始化函数。

- `USBH_MSC_ClassReqHandler`:Class 特定请求处理函数,用于处理 `MASS_STORAGE_RESET`、`GET_MAX_LUN` 等特定请求。

- `USBH_MSC_CoreHandler`:Class 内核处理函数,包括 BOT 命令、SCSI 命令的处理。

- `USBH_MSC_SOFHandler`:SOF 事件处理函数。

/* MSC class handler */

USBH_CLASS_T USBH_MSC_CLASS =

{

    "Class MSC",

    USBH_CLASS_MSC,

    NULL,

    USBH_MSC_ClassInitHandler,

    USBH_MSC_ClassDeInitHandler,

    USBH_MSC_ClassReqHandler,

    USBH_MSC_CoreHandler,

    USBH_MSC_SOFHandler,

};


下面的 `USBH_MSC_Handler` 状态机由 `USBH_MSC_CoreHandler` 函数调用,包含常见的 BOT 命令、SCSI 命令的处理。 


/* USB host MSC state handler function */

USBH_MscStateHandler_T USBH_MSC_Handler[] =

{

    USBH_MSC_InitHandler,

    USBH_MSC_IdleHandler,

    USBH_MSC_InquiryHandler,

    USBH_MSC_TestUnitReadyHandler,

    USBH_MSC_RequestSenseHandler,

    USBH_MSC_ReadCapacityHandler,

    USBH_MSC_ErrorUnrecoveredHandler,

    USBH_MSC_ReadHandler,

    USBH_MSC_WriteHandler,

    USBH_MSC_RWRequestSenseHandler,

};


BOT SCSI 命令处理。



OTG Host 部分还需要了解以下 API 函数,因为后续需要应用到 FatFs 文件系统中。

- `USBH_MSC_ReadDevInfo()`:用于获取所枚举成功的 `MSC` 设备信息,比如 `LUN` 逻辑单元是否准备完毕、多媒体设备是否存在、扇区数、block 数等。

- `USBH_MSC_DevStatus()`:获取 `LUN` 是否准备就绪的状态。

- `USBH_MSC_ReadDevWP()`:获取 `LUN` 写保护状态。

- `USBH_MSC_DevRead()`:读取 `LUN` 数据。

- `USBH_MSC_DevWrite()`:往 `LUN` 写入数据。 


USBH_STA_T USBH_MSC_ReadDevInfo(USBH_INFO_T* usbInfo, uint8_t lun, USBH_MSC_STORAGE_INFO_T* device);

uint8_t USBH_MSC_DevStatus(USBH_INFO_T* usbInfo, uint8_t lun);

uint8_t USBH_MSC_ReadDevWP(USBH_INFO_T* usbInfo, uint8_t lun);

USBH_STA_T USBH_MSC_DevRead(USBH_INFO_T* usbInfo, uint8_t lun, uint32_t address, \

                            uint8_t* buffer, uint16_t cnt);

USBH_STA_T USBH_MSC_DevWrite(USBH_INFO_T* usbInfo, uint8_t lun, uint32_t address, \

                             uint8_t* buffer, uint16_t cnt);


## RTC

APM32F4xx 的 RTC 是一个独立的 BCD 定时计数器,提供完整的日历时钟功能。不像 F1 系列的 RTC 只是个计数器,需要自行设定元年,然后换算日期和时间。RTC 的配置比较简单,配置时钟源为 LSE,24 小时制即可,然后利用 RTC 的备份寄存器来判断是否需要配置日历和时间。


void RTC_CalendarConfig(void)

{

    RTC_DateTypeDef Date_Structure;

    RTC_TimeTypeDef Time_Structure;


    /* Configure the Date */

    Date_Structure.Year = 0x23;

    Date_Structure.Month = RTC_MONTH_NOVEMBER;

    Date_Structure.Date = 0x22;

    Date_Structure.WeekDay = RTC_WEEKDAY_MONDAY;

    if(DAL_RTC_SetDate(&hrtc,&Date_Structure,RTC_FORMAT_BCD) != DAL_OK)

    {

        DAL_ErrorHandler(); 

    }


    /* Configure the Time */

    Time_Structure.Hours = 0x00;

    Time_Structure.Minutes = 0x00;

    Time_Structure.Seconds = 0x00;

    Time_Structure.TimeFormat = RTC_HOURFORMAT12_AM;

    Time_Structure.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;

    Time_Structure.StoreOperation = RTC_STOREOPERATION_RESET;

    if(DAL_RTC_SetTime(&hrtc,&Time_Structure,RTC_FORMAT_BCD) != DAL_OK)

    {

        DAL_ErrorHandler(); 

    }

    DAL_RTCEx_BKUPWrite(&hrtc,RTC_BKP_DR0, RTC_BKP_VALUE);

}


## TMR

APM32F4xx 系列的 RTC 没有秒中断,这里我们实现一秒记录一次数据到 U 盘,则开启一个定时为 1 秒的定时器中断来实现。


void DAL_TMR3_Config(void)

{

    htmr3.Instance = TMR3;


    htmr3.Init.Period = 10000 - 1;

    htmr3.Init.Prescaler = 8400 - 1;

    htmr3.Init.ClockDivision = 0;

    htmr3.Init.CounterMode = TMR_COUNTERMODE_UP;

    htmr3.Init.AutoReloadPreload = TMR_AUTORELOAD_PRELOAD_DISABLE;

    if(DAL_TMR_Base_Init(&htmr3) != DAL_OK)

    {

       DAL_ErrorHandler();

    }

}


## FatFs

使用 FatFs 文件系统前,要重新实现 `diskio.c` 及配置 `ffconf.h` 文件。


其中在 `diskio.c` 文件中,要利用 OTG Host 章节最后提到的 `MSC Class` 的 API ,重新实现以下函数。

`DSTATUS disk_status()`

`DSTATUS disk_initialize()`

`DRESULT disk_read()`

`DRESULT disk_write()

`DRESULT disk_ioctl()`


另外,简单介绍下后面应用代码中用到的几个 API,详细的使用方法,大家可以参考 FatFs 官方文档。


### f_opendir

该 API 用于打开一个已存在的目录文件夹。


FRESULT f_opendir (

  DIR* dp,           /* [OUT] Pointer to the directory object structure */

  const TCHAR* path  /* [IN] Directory name */

);


### f_readdir

该 API 用于读取目录项,后续用于筛选所有的有效目录。 


FRESULT f_readdir (

  DIR* dp,      /* [IN] Directory object */

  FILINFO* fno  /* [OUT] File information structure */

);


### f_mkdir

该 API 用于创建一个新的目录文件夹。 


FRESULT f_mkdir (

  const TCHAR* path /* [IN] Directory name */

);


### f_open

该 API 用于打开一个文件。要注意的是参数 `mode flags` 需要使用 `FA_OPEN_ALWAYS`,避免文件内容被覆盖。 


FRESULT f_open (

  FIL* fp,           /* [OUT] Pointer to the file object structure */

  const TCHAR* path, /* [IN] File name */

  BYTE mode          /* [IN] Mode flags */

);


### f_unlink

该 API 用于删除文件或子目录。 


FRESULT f_unlink (

  const TCHAR* path  /* [IN] Object name */

);


### f_close

该 API 用于关闭一个文件。 


FRESULT f_close (

  FIL* fp     /* [IN] Pointer to the file object */

);


### f_lseek

该 API 用于移动被打开的文件对象的文件读或写指针,后面应用时,需要用来将写指针移动到文件末,以添加新的 LOG 信息。 


FRESULT f_lseek (

  FIL*    fp,  /* [IN] File object */

  FSIZE_t ofs  /* [IN] Offset of file read/write pointer to be set */

);


### f_printf

该 API 用于将格式化的字符串写入文件。使用该 API,我们可以方便的将各种数据类型,转换为字符串,再写入文件中。 


int f_printf (

  FIL* fp,          /* [IN] File object */

  const TCHAR* fmt, /* [IN] Format stirng */

  ...

);


### f_getfree

该 API 用于获取 volume 中的剩余空间。使用该 API,我们可以知道 U 盘剩余空间是多少,从而对老旧的 LOG 数据进行处理。 


FRESULT f_getfree (

  const TCHAR* path,  /* [IN] Logical drive number */

  DWORD* nclst,       /* [OUT] Number of free clusters */

  FATFS** fatfs       /* [OUT] Corresponding filesystem object */

);


# 03 实现数据记录

## 定义参数结构体

定义 `rtcInfo` 和 `diskInfo` 来记录应用过程中的信息。 


/* 记录 RTC 时间信息 */

typedef struct

{

    uint16_t year;

    uint8_t month;

    uint8_t day;

    uint8_t hour;

    uint8_t minute;

    uint8_t second;

} RTC_TIME_INFO_T;


/* 记录 U 盘和文件系统信息 */

typedef struct

{

    char dirPath[512];

    uint16_t dirNum;

    uint32_t totSect;

    uint32_t freSect;

    double usedPercent;

} DISK_INFO_T;


RTC_TIME_INFO_T rtcInfo;

DISK_INFO_T diskInfo;


## 获取时间参数

在 TMR3 回调函数中获取 RTC 当前时间,并使能数据更新标志。 


void RTC_Application(void)

{

    char strBuf[50];


    RTC_GetCalendar(&rtcInfo.year, &rtcInfo.month, &rtcInfo.day, &rtcInfo.hour, &rtcInfo.minute, &rtcInfo.second);


    /* Display time */

    sprintf(strBuf, "20%02d-%02d-%02d %02d:%02d:%02d", rtcInfo.year, rtcInfo.month, rtcInfo.day, rtcInfo.hour, rtcInfo.minute, rtcInfo.second);

    DAL_LOGI(tag, "%s", strBuf);

}


void DAL_TMR_PeriodElapsedCallback(TMR_HandleTypeDef *htmr)

{

    if(htmr->Instance == TMR3)

    {

        RTC_Application();

        dataUpdate = 1;

    }

}


## 记录数据

### 提供日期和时间给 FatFs

FatFs 系统的文件和目录的日期、时间信息由 `get_fattime` 函数提供。该函数为 `__weak` 定义,我们在应用文件中重新实现即可,这里要注意 APM32F4xx 的 RTC 日历的起始年份和 FatFs 的不一致,做好偏移即可。 


DWORD get_fattime(void)

{

    return (DWORD)(rtcInfo.year + 20) << 25 |

           (DWORD)rtcInfo.month << 21 |

           (DWORD)rtcInfo.day << 16 |

           (DWORD)rtcInfo.hour << 11 |

           (DWORD)rtcInfo.minute << 5 |

           (DWORD)rtcInfo.second >> 1;

}


### 创建和写数据到 Excel 文件

下面这个函数中,首先创建一个目录,然后创建或打开一个 `.xls` 文件,接着打开文件并用 `f_lseek` 函数移动写指针到文件末,最后用 ` f_printf ` 函数写入格式化后的字符串数据。


void FATFS_WriteXlsFile(FIL* file, const TCHAR *path, char *dir, char *fileName, char* logInfo, char* timeStamp)

{

    FRESULT status;

    char filePath[32];

    char fileDir[20];

    

    /* Write file */

    sprintf(fileDir, "%s", dir);

    status = f_mkdir(fileDir);

    if (status == FR_OK)

    {

        DAL_LOGI(tag, ">>> Create direction success");

    }

    

    /* Open or create file */

    sprintf(filePath, "%s%s%c%s.xls", path, fileDir, '/', fileName);


    status = f_open(file, filePath, FA_OPEN_ALWAYS | FA_WRITE);

    if (status == FR_OK)

    {

        DAL_LOGI(tag, ">>> Open or create %s %s file success", fileDir, fileName);

        

        /* Move the file pointer to the end */

        f_lseek(file, f_size(file));

        

        f_printf(file, "%s + %s + %s\n", fileName, logInfo, timeStamp);

    }

    else

    {

        DAL_LOGE(tag, ">>> Open or create file fail, status is %d", status);

    }


    /* Close file */

    f_close(file);

}


### 获取 U 盘剩余空间信息

Volume 的剩余空间,从之前 FatFs 章节中知道,可以用 `f_getfree` 函数来获取 U 盘剩余空间信息,并转换为使用率。


void MSC_Application(void)

{

        ...

        

        res = f_getfree(USBHPath, &freClust, &fs);

        diskInfo.totSect = (fs->n_fatent - 2) * fs->csize;  

        diskInfo.totSect /= 2;

        

        diskInfo.freSect = freClust * fs->csize;

        diskInfo.freSect /= 2;

        

        diskInfo.usedPercent = (1.0 - (double)diskInfo.freSect / diskInfo.totSect) * 100.0;

        

        ...

}


### 删除旧文件夹

以下代码,使用 `FATFS_ViewRootDir()` 函数获取目录文件夹信息,并按日期进行排序输出。最后由 `sscanf()` 来找到第一个目录,然后删除目录和文件。


void MSC_Application(void)

{

        ...

        

        /* Get dir information */

        DAL_LOGI(tag, "------> Get dir information");

        FATFS_ViewRootDir(&USBHFatFS, USBHPath, diskInfo.dirPath, &diskInfo.dirNum);

        

        DAL_LOGI(tag, ">>> dir path :%s", diskInfo.dirPath);

        DAL_LOGI(tag, ">>> dir number :%d", diskInfo.dirNum);

        

        /* Used percent > 90% and dir number > 1 */

        if((diskInfo.usedPercent - DISK_SPACE_MAX_PERCENT) > EPS && (diskInfo.dirNum > 1))

        {

                DAL_LOGW(tag, "<<< Disk space is not enough");

        

                /* Delete first dir */

                sscanf(diskInfo.dirPath, "/%8[^/]", delectDirName);

        

                FATFS_DelectDir(USBHPath, delectDirName);

        }

        ...

}


# 04 下载验证

经过之前几节的组件的配置,实现数据记录的 API 函数后,最后下载到 APM32F4xx 开发板看下应用的过程。


从下面 LOG 信息可以看到,插入 U 盘后,从 UART1 输出了 `MSC device is ready` 的 LOG 信息,这表明开发板已完成 U 盘的枚举识别。


同时可以看到 LOG 中带有时间戳信息,证明 RTC 已经开发工作,并按每秒打印一次的频率输出时间戳 LOG 信息。 


...

[main] 2023-11-22 00:00:37

[main] 2023-11-22 00:00:38

[main] 2023-11-22 00:00:39

[main] 2023-11-22 00:00:40

USB Device Reset Completed

USB device speed is FS

PID: 0x1234

VID: 0x048D

Endpoint 0 max packet size if 64

USB device address: 1

Manufacturer: USB

Product: Disk 2.0k

SerialNumber: 9207156342331724518

USB device enumration ok

This is a Mass Storage device

Use 2 endpoint:

Endpoint 0x01: max packet size is 64 bytes

Endpoint 0x82: max packet size is 64 bytes

USB device has only one configuration

Set to default configuration

Inquiry Revision :2.00

Inquiry Product  :ProductCode

Inquiry Vendor   :VendorCo

MSC device is ready

MSC device capacity     : 1006390784 bytes

MSC device block number : 1965607

MSC device block size   : 512

Class is ready


紧接着,就会进行 LOG 信息的记录,从下面 LOG 可以看到,FatFs 的操作过程。首先在 U 盘加载文件系统,然后创建或打开以 `20231122` 日期命名的文件夹并写入数据。接着获取 U 盘剩余空间,获取目录信息,最后卸载文件系统。


[main] 2023-11-22 00:01:12

[main] ------> Update information

[main] ------> Mount U disk file system

[main] ------> Write xls file

[fatfs] >>> Open or create 20231122 LOG file success

[main] ------> Get volume information

[main] >>> (964657 / 966404) KiB Used 0.18 %

[main] ------> Get dir information

[fatfs] >>> View Directory

[fatfs] >>> 20231122, (0x10)

[fatfs] >>> 20231031, (0x10)

[fatfs] >>> 20231030, (0x10)

[fatfs] >>> 20231101, (0x10)

[fatfs] >>> Sort Directory

[main] >>> dir path :/20231030/20231031/20231101/20231122

[main] >>> dir number :4

[main] ------> Unmount U disk file system

[main] >>> U disk file system unmounted ok


我们打开 U 盘可以看到已经在设定的文件夹中创建了一个命名为 `LOG.xls` 的 Excel 文件。 



以 LOG + RTC 时间戳为内容写入到 Excel 文件中。实际应用时记录的信息可以是系统不同任务执行情况,也可以是内核寄存器等便于维护调试的信息,或者是传感器的信息等。



以上,就是用 U 盘记录系统 LOG 信息的一些简单步骤和方法,实际应用中还要考虑更多情况,附件是源码,供大家参考。


# 参考资料

http://elm-chan.org/fsw/ff/00index_e.html



注:文章作者在原帖中提供了工程文件,有需要请至原文21ic论坛下载


原文地址:https://bbs.21ic.com/icview-3342856-1-1.html

或点击下方 阅读原文 跳转


↑↑↑ 点击上方卡片关注极海 ↑↑↑

极海Geehy 极海半导体是一家致力于开发工业级/车规级MCU、模拟与混合信号IC及系统级芯片的集成电路设计型企业
评论 (0)
  • 两轮电动车在满足短途交通需求方面具有明显优势。据相关数据显示,中国两轮电动车的保有量已经突破3.25亿辆,是人们日常生活出行、通勤的主要交通工具之一。随着两轮电动车的应用不断增长,如何高效、安全的充电成为电动车制造商亟需解决的关键议题。瑞萨500W车载电池充电器采用先进的氮化镓(GaN)技术,包括两个功率级:用于交流到直流转换的功率因数校正(PFC)级和用于直流到直流转换的LLC级,能够实现超过95%的峰值效率。在器件的选择上,此方案集成低功耗微控制器RL78/F14、GaN FET TP65H
    丙丁先生 2024-09-20 12:22 35浏览
  •     FPC 的含义是 Flexible Printed Circuit,柔性/挠性印制板。        (图来自网络,侵删)    FPC使用的基本材料有3种——聚酰亚胺(PI, Polyimide),铜和胶。    制作FPC时,和刚性PCB相似,也是对基本材料进行堆叠,然后热压成型。对于单面FPC,需要用两层PI分别作为载板和盖板,然后在二者之间加一层铜,铜与载板、盖板之间再各
    电子知识打边炉 2024-09-18 22:26 127浏览
  • 概述       为有效利用海量的路试数据并发挥其价值,经纬恒润推出了OrienLink路试数据分析及开环/闭环回灌测试系统。该系统采用统一的数据存储标准平台,基于云计算技术提供的大规模存储、高带宽和高算力,能够对路试数据进行深入的场景挖掘。通过软件在环(SiL)和硬件在环(HiL)回灌验证,该系统能够充分评估和优化算法性能,发挥数据价值。可解决智能驾驶测试过程中的几类问题:    · 实车测试效率低,无法
    经纬恒润 2024-09-18 18:40 100浏览
  • 可穿戴设备市场一直在寻找下一个风口。站在2024年来看,智能戒指似乎更有机会。市场调研机构 GMI 最新数据报告显示,2023年智能戒指市场规模达到2.1亿美元,预测2024~2032年将以24.1%的市场复合增长率增长,至2032年达到10亿美元市场规模。图片来源:GMInsights1、走向C位Galaxy Ring,一个曾经的小众品类,却在三星发布会上稳稳占据C位。图片来源网络基于加速度计、光学心率传感器和皮肤温度传感器,Galaxy Ring支持睡眠监测、全天候心率监测、压力水平、身体和
    艾迈斯欧司朗 2024-09-19 15:30 87浏览
  • 下载视频投屏复制链接笔记记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习习笔记&记学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习笔记&记录学习习笔记&记学习
    youyeye 2024-09-19 10:56 85浏览
  •     DFx是 Design for X(面向产品生命周期各/某环节的设计)的缩写。这个概念是1994年由SMTA(SMT Association)组织提出的,在2000年左右开始在大型公司中应用。    DFA,Assembly 可装配性    DFC,Cost 成本    DFD,Diagnosibility 可诊断分析性    DFE,Enviroment 为环保性着想  &nb
    电子知识打边炉 2024-09-18 21:43 107浏览
  • 在ADTF (Automotive Data and Time-Triggered Framework)中,过滤器(Filter)扮演着数据处理的核心角色。过滤器是处理数据流的基本单元,它们接收、处理并发送数据。接下来,将分享ADTF中创建和使用过滤器,包括设置输入输出针脚(Pins)、配置触发器(Triggers)以及处理数据样本(Samples)。一、过滤器基础过滤器是ADTF中用于数据处理和转换的小型处理单元,可以通过特定的接口接收和发送数据,如图1所示。图1 Filter过滤器
    康谋 2024-09-19 09:10 132浏览
  • 键盘与鼠标是系统上最通用的周边装置,这些装置过往多半采有线方式做连接,目前已逐渐大量采用无线连接为主流,无线键盘和鼠标通常使用蓝牙技术或无线射频(RF)技术,然而这些技术也可能面临一些无线干扰的问题,进而造成使用者体验不佳影响品牌形象,甚至产生退货问题,这也成为采购商在采购询价(RFQ)时需留意的要点。无线键盘鼠标的无线干扰风险与解决方法近年来无线传输技术在键盘鼠标上已相当普及,市场上我们可以看到各种形形色色的无线键盘鼠标,包括了:针对特定消费族群的静音键盘鼠标、低延迟的电竞键盘鼠标。不论是何用
    百佳泰测试实验室 2024-09-20 13:29 45浏览
  • 应用环境与市场需求随着科技不断进步,6K与8K显示器逐渐成为趋势,重新定义了我们对影像质量的期待。6K与8K显示器之所以备受瞩目,主要是因为它们提供了极高的分辨率。举例来说,6K显示器拥有超过6,000像素的水平分辨率,显著提升了影像的细节和清晰度,使用户能够更真实地体验影像的震撼效果;而8K显示器则更进一步将细节度推向新境界,带给用户身临其境般的感受。但随着高分辨率显示器的普及,也带来了挑战,首先是硬件需求的提升,高分辨率需要更强大的处理器和显示适配器来支持,目前6K/8K显示器主要采用最新的
    百佳泰测试实验室 2024-09-19 12:27 113浏览
  •  在现代电子设备的设计与应用中,光电耦合器(简称光耦)作为重要的元器件,扮演着不可或缺的角色。无论是工业控制、智能家居,还是消费类电子产品,光耦的应用都随处可见。那么,为什么需要光耦呢?下面让我们从几个关键方面来解答。 连接具有不同接地电位的电路在许多实际应用中,常常需要将不同接地电位的电路进行信号传输。例如,当需要在使用交流电源的电路与电话电路之间交换信号时,由于这两类电路的接地电位不同,直接连接会产生风险,甚至引发故障。在这种情况下,光耦可以有效隔离不同电位的电路,同时实
    晶台光耦 2024-09-20 10:28 19浏览
  • 故障现象 一辆2013款宝马116i车,搭载N13B16A 发动机,累计行驶里程约为12.1万km。车主反映,该车行驶中偶尔加速无反应,且发动机故障灯异常点亮。 故障诊断接车后试车,故障现象无法再现。用故障检测仪检测,发动机控制单元(DME)中存储有多个与节气门相关的故障代码(图1),分析故障代码,推断故障可能是由节气门翻板过脏,偶尔卡滞引起的。 图1 DME中存储的故障代码拆下节气门总成检查,并不算脏;反复多次直接给节气门电动机短暂供电,节气门翻板打开及回位均无明显异常。用
    虹科Pico汽车示波器 2024-09-19 16:48 102浏览
  • 近年来,中国经济正处于转型升级的关键时期,高质量发展成为经济发展的重要目标。在这一伟大征程中,光耦作为一种关键性的电子元器件,正在发挥着重要的作用,助力中国经济迈向更加光明的未来。光耦概念及工作原理▲光耦(光电耦合器)光耦,全称为光电耦合器,是一种将电信号转换为光信号,再由光信号转换回电信号的器件。它由发光器件(通常是LED)和光敏器件(如光敏二极管或光敏晶体管)两部分组成,两者被隔离,以实现输入和输出电路之间的电气隔离。当LED接收到正向电流时,它会发出光线,这些光线通过透明介质照射到对面的光
    晶台光耦 2024-09-19 10:29 74浏览
  • 缓冲反向转换器是一种在电源设计中常用的技术,用于控制和减少由于变压器漏极电感引起的过电压应力。以下是对缓冲反向转换器的详细介绍: 1. 缓冲反向转换器的基本概念   定义:缓冲反向转换器主要用于在MOSFET关断时,通过特定的电路来吸收存储在变压器漏极电感中的能量,从而防止过电压对MOSFET造成损害。    重要性:在反向转换器中,当MOSFET关闭时,变压器的漏极电感会导致漏电压升至反射输出电压以上,可能引发MOSFET的雪崩现象,因此需要使用缓冲器
    丙丁先生 2024-09-20 10:28 23浏览
  • Adaptive-Sync是什么?近年来电竞屏幕随着电竞产业的蓬勃发展以及游戏玩家对于更高画质、更流畅游戏体验的需求,电竞屏幕成为游戏设备中不可或缺的一环。电竞屏幕市场的概况与发展中,其中很重要的亮点就是高刷新率跟Adaptive-Sync技术的导入,美国视讯电子标准协会(VESA)在推出DisplayPort 1.4 规格标准时,针对电竞产品新增了Adaptive-Sync(可变更新频率)功能,让用户在玩游戏时可以减少画面的撕裂与延迟等现象,提供更平滑的游戏体验,这项功能对于不同刷新率的显示适
    百佳泰测试实验室 2024-09-19 12:29 95浏览
  • 以下是关于如何设置TI的ADS8353性能演示套件的详细步骤: 1. 了解套件组件:ADS8353 ADC 性能演示套件包括一个16位、双通道、同步采样的精密ADC,每秒可同时采集600千赫样本。该套件还配备了微控制器(MCU)和处理器、数据转换器以及电机驱动器等关键组件。 2. 连接硬件:首先,确保所有硬件组件正确连接。这包括将ADS8353 ADC与评估板连接,并将评估板连接到电源和计算机。 3. 安装软件:接下来,需要在计算机上安装TI提供的软件工具,以便与评估板进行通信和配置。
    丙丁先生 2024-09-20 10:55 35浏览
我要评论
0
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦