移植micropython到MCU-新增pyb-LED模块

原创 嵌入式Lee 2024-12-19 08:03

工程源码

通过网盘分享的文件:fr30xxc_sdk__202411(1).zip

链接: https://pan.baidu.com/s/1XyNkwqjrxEVSexzCbyYooQ?pwd=tmri 提取码: tmri 

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


一. 前言

前面我们分享了micropython的移植,至此还只有一些内置的模块,我们现在开始就来移植平台相关的模块,先以最简单IO驱动LED为例。

以下是前文一些补充

修改输出不对齐问题

遇到\n输出为\r\n

这样原来只有\n换行的地方,可以回车到行首再换行就会对齐了。

uint32_t uart_send(uint8_t* buffer, uint32_t len){    g_data_transmit_flag = false;    for(uint32_t i=0;i<len;i++)    {      if(buffer[i]=='\n'){        putchar('\r');      }      putchar(buffer[i]);    }    return len;}

大数据支持

mpconfigport.h中配置

#define MICROPY_LONGINT_IMPL MICROPY_LONGINT_IMPL_MPZ

原来1<<32不支持

现在1<<32可以正常输出,甚至1<<160都可以

支持复数

mpconfigport.h中配置

#define MICROPY_PY_BUILTINS_COMPLEX (1)


查看math支持的运算

import math

math.tab按键

配置

#define MICROPY_PY_MATH (1)

#define MICROPY_PY_CMATH (1)

#define MICROPY_PY_BUILTINS_FLOAT (1)

#define MICROPY_FLOAT_IMPL (MICROPY_FLOAT_IMPL_DOUBLE)

genhdr\moduledefs.h中可以看到注册了math模块。

#define MICROPY_REGISTERED_MODULES \

MODULE_DEF_BUILTINS \

MODULE_DEF_CMATH \

MODULE_DEF_GC \

MODULE_DEF_MATH \

MODULE_DEF_MICROPYTHON \

MODULE_DEF_SYS \

MODULE_DEF___MAIN__ \

extern const struct _mp_obj_module_t mp_module_math;

#undef MODULE_DEF_MATH

#define MODULE_DEF_MATH { MP_ROM_QSTR(MP_QSTR_math), MP_ROM_PTR(&mp_module_math) },

mp_module_math

py\modmath.c中实现

一. 关键词hash值计算

前文我们看到需要genhdr下自动生成的头文件,之前是通过从其他已经构建的地方复制过来的。其中genhdr/qstrdefs.generated.h定义了关键词对应的hash值,通过hash值来快速索引关键词,这个文件是通过python脚本生成的,对于支持的构建环境是自动调用脚本生成。而我们移植到MDK目前还没去添加对应的脚本(MDK也是可以配置执行脚本的,后面可以再完善),我们这一小节就来介绍下在新增关键词后如何手动更新该文件。

参考docs\develop\qstr.rst

从支持的构建环境的构建过程可以看到它是通过脚本命令生成的,参考

ports\windows\msvc\genhdr.targets可以看到其具体生成过程

其中如下位置指定文件qstrdefscollected.h

 <QstrDefsCollected>$(DestDir)qstrdefscollected.hQstrDefsCollected>

该文件由以下命令产生

 <Exec Command="$(PyPython) $(PySrcDir)makeqstrdefs.py split qstr $(DestDir)qstr.i.last $(DestDir)qstr _"/>

 <Exec Command="$(PyPython) $(PySrcDir)makeqstrdefs.py cat qstr _ $(DestDir)qstr $(QstrDefsCollected)"/>

对应

python makeqstrdefs.py split qstr genhdr/qstr.i.lastgenhdr/qstr _

makeqstrdefs.py使用格式如下usage: makeqstrdefs.py command mode input_filename output_dir output_file

即将genhdr/qstr.i.last文件生成到qstr下,使用split命令qstr模式。

qstr.i.last先使用基础版本,最后再手动添加新内容。

python makeqstrdefs.py cat qstr _ genhdr/qstr genhdr/qstrdefscollected.h

 <Exec Command="$(PyClTool) /nologo /I@(PyIncDirs, ' /I') /D@(PreProcDefs, ' /D') /E $(PyQstrDefs) $(QstrDefs) > $(DestDir)qstrdefs.preprocessed.h"/>

 

 <Exec Command="type $(QstrDefsCollected) >> $(DestDir)qstrdefs.preprocessed.h"/>

 <Exec Command="$(PyPython) $(PySrcDir)makeqstrdata.py $(DestDir)qstrdefs.preprocessed.h > $(TmpFile)"/>

对应

type genhdr/qstrdefscollected.h >> genhdr/qstrdefs.preprocessed.h

python makeqstrdata.py genhdr/qstrdefs.preprocessed.h > genhdr/qstrdefs.generated.h

前面原始输入文件是genhdr\qstr.i.last该文件由编译器产生,格式类似于

(# n "file") GCC产生的

(#line n "file") MSVC产生的

那么如何产生这个文件呢,qstr.i.last由编译器的预处理器产生,

if等条件编译删除,宏展开,添加行信息

需要添加-DNO_QSTR编译选项

py\mkrules.mkqstr.i.last

如下命令生成

$(HEADER_BUILD)/qstr.i.last:$(SRC_QSTR) $(QSTR_GLOBAL_DEPENDENCIES) |$(QSTR_GLOBAL_REQUIREMENTS)

 $(ECHO) "GEN$@"

 $(Q)$(PYTHON) $(PY_SRC)/makeqstrdefs.py pp$(CPP) output$(HEADER_BUILD)/qstr.i.last cflags$(QSTR_GEN_CFLAGS) cxxflags$(QSTR_GEN_CXXFLAGS) sources$^ dependencies$(QSTR_GLOBAL_DEPENDENCIES) changed_sources$?

我们无需从头开始,只需要修改原来的

genhdr\qstrdefs.preprocessed.h添加

新的字符串


然后执行python makeqstrdata.py genhdr/qstrdefs.preprocessed.h > genhdr/qstrdefs.generated.h生成即可。

整个过程如下,我们手动修改qstrdefs.preprocessed.h执行最后一步生成genhdr/qstrdefs.generated.h

.添加LED模块

我们参考参考已有的示例去做,参考

ports\stm32\modpyb.c

ports\stm32\led.h

ports\stm32\led.c

Io控制驱动

这一部分和具体的硬件平台相关,我们这里由两个LED


先实现LED控制IO的初始化

app_micropython.c

#include "fr30xx.h"#include "FreeRTOS.h"#include "task.h"#include "app_micropython.h"TaskHandle_t micropython_task_handle;extern int py_main(int argc, char **argv);static void micropython_task(void *arg);static void led_init(void){  GPIO_InitTypeDef gpio_config;  __SYSTEM_GPIOD_CLK_ENABLE();  gpio_config.Pin = GPIO_PIN_14 | GPIO_PIN_15;  gpio_config.Mode = GPIO_MODE_OUTPUT_PP;  gpio_config.Pull = GPIO_PULLUP;  gpio_config.Alternate = GPIO_FUNCTION_0;  gpio_init(GPIOD, &gpio_config);}void app_micropython_init(void){    xTaskCreate(micropython_task, "micropython"2048*2NULL3, µpython_task_handle);}static void micropython_task(void *arg){   led_init();   py_main(0,0);}

然后实现LED的控制接口

py_port\mphalport.c

#include "py/runtime.h"#include "py/mphal.h"#include "mphalport.h"#include "fr30xx.h"void mp_hal_pin_low(mp_uint_t id){  if(id==1)  {    gpio_write_pin(GPIOD,GPIO_PIN_14,GPIO_PIN_CLEAR);  }  else if(id == 2)  {    gpio_write_pin(GPIOD,GPIO_PIN_15,GPIO_PIN_CLEAR);  }  else  {    }}void mp_hal_pin_high(mp_uint_t id){  if(id==1)  {    gpio_write_pin(GPIOD,GPIO_PIN_14,GPIO_PIN_SET);  }  else if(id == 2)  {    gpio_write_pin(GPIOD,GPIO_PIN_15,GPIO_PIN_SET);  }  else  {    }}void mp_hal_pin_toogle(mp_uint_t id){  if(id==1)  {    if(gpio_read_pin(GPIOD,GPIO_PIN_14))    {       gpio_write_pin(GPIOD,GPIO_PIN_14,GPIO_PIN_SET);    }    else    {       gpio_write_pin(GPIOD,GPIO_PIN_14,GPIO_PIN_CLEAR);    }  }  else if(id == 2)  {    if(gpio_read_pin(GPIOD,GPIO_PIN_15))    {       gpio_write_pin(GPIOD,GPIO_PIN_14,GPIO_PIN_SET);    }    else    {       gpio_write_pin(GPIOD,GPIO_PIN_15,GPIO_PIN_CLEAR);    }  }  else  {    }}

py_port\mphalport.h

#ifndef MICROPY_MPHALPORT_H#define MICROPY_MPHALPORT_Hstatic inline mp_uint_t mp_hal_ticks_ms(void) {    return 0;}static inline void mp_hal_set_interrupt_char(char c) {}void mp_hal_pin_low(mp_uint_t id);void mp_hal_pin_high(mp_uint_t id);void mp_hal_pin_toogle(mp_uint_t id);#endif 

Led实例

构建实例

static MP_DEFINE_CONST_FUN_OBJ_1(led_obj_on_obj, led_obj_on);static MP_DEFINE_CONST_FUN_OBJ_1(led_obj_off_obj, led_obj_off);static MP_DEFINE_CONST_FUN_OBJ_1(led_obj_toggle_obj, led_obj_toggle);static const mp_rom_map_elem_t led_locals_dict_table[] = {    { MP_ROM_QSTR(MP_QSTR_on), MP_ROM_PTR(&led_obj_on_obj) },    { MP_ROM_QSTR(MP_QSTR_off), MP_ROM_PTR(&led_obj_off_obj) },    { MP_ROM_QSTR(MP_QSTR_toggle), MP_ROM_PTR(&led_obj_toggle_obj) },};static MP_DEFINE_CONST_DICT(led_locals_dict, led_locals_dict_table);MP_DEFINE_CONST_OBJ_TYPE(    pyb_led_type,    MP_QSTR_LED,    MP_TYPE_FLAG_NONE,    make_new, led_obj_make_new,    print, led_obj_print,    locals_dict, &led_locals_dict);

led.c

#include #include "py/runtime.h"#include "py/mphal.h"#include "led.h"/// \moduleref pyb/// \class LED - LED object////// The LED object controls an individual LED (Light Emitting Diode).// the default is that LEDs are not inverted, and pin driven high turns them on#ifndef MICROPY_HW_LED_INVERTED#define MICROPY_HW_LED_INVERTED (0)#endiftypedef struct _pyb_led_obj_t {    mp_obj_base_t base;    mp_uint_t led_id;} pyb_led_obj_t;static const pyb_led_obj_t pyb_led_obj[] = {    {{&pyb_led_type}, 1},    {{&pyb_led_type}, 2},    {{&pyb_led_type}, 3},    {{&pyb_led_type}, 4},};#define NUM_LEDS MP_ARRAY_SIZE(pyb_led_obj)void led_init(void) {    /* Turn off LEDs and initialize */    for (int led = 0; led < NUM_LEDS; led++) {    }}void led_state(pyb_led_t led, int state) {    if (led < 1 || led > NUM_LEDS) {        return;    }    mp_uint_t led_id = pyb_led_obj[led].led_id-1;    if (state == 0) {        // turn LED off        mp_hal_pin_low(led_id);    } else {        // turn LED on        mp_hal_pin_high(led_id);    }}void led_toggle(pyb_led_t led) {    if (led < 1 || led > NUM_LEDS) {        return;    }    mp_uint_t led_id = pyb_led_obj[led].led_id-1;    // toggle the output data register to toggle the LED state    mp_hal_pin_toogle(led_id);}void led_set_intensity(pyb_led_t led, mp_int_t intensity) {    // intensity not supported for this LED; just turn it on/off    led_state(led, intensity > 0);}void led_debug(int n, int delay) {    led_state(1, n & 1);    led_state(2, n & 2);    led_state(3, n & 4);    led_state(4, n & 8);    //mp_hal_delay_ms(delay);}/******************************************************************************//* MicroPython bindings                                                       */void led_obj_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind) {    pyb_led_obj_t *self = MP_OBJ_TO_PTR(self_in);    mp_printf(print, "LED(%u)", self->led_id);}/// \classmethod \constructor(id)/// Create an LED object associated with the given LED://////   - `id` is the LED number, 1-4.static mp_obj_t led_obj_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) {    // check arguments    mp_arg_check_num(n_args, n_kw, 1, 1, false);    // get led number    mp_int_t led_id = mp_obj_get_int(args[0]);    // check led number    if (!(1 <= led_id && led_id <= NUM_LEDS)) {        mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("LED(%d) doesn't exist"), led_id);    }    // return static led object    return MP_OBJ_FROM_PTR(&pyb_led_obj[led_id - 1]);}/// \method on()/// Turn the LED on.mp_obj_t led_obj_on(mp_obj_t self_in) {    pyb_led_obj_t *self = MP_OBJ_TO_PTR(self_in);    led_state(self->led_id, 1);    return mp_const_none;}/// \method off()/// Turn the LED off.mp_obj_t led_obj_off(mp_obj_t self_in) {    pyb_led_obj_t *self = MP_OBJ_TO_PTR(self_in);    led_state(self->led_id, 0);    return mp_const_none;}/// \method toggle()/// Toggle the LED between on and off.mp_obj_t led_obj_toggle(mp_obj_t self_in) {    pyb_led_obj_t *self = MP_OBJ_TO_PTR(self_in);    led_toggle(self->led_id);    return mp_const_none;}static MP_DEFINE_CONST_FUN_OBJ_1(led_obj_on_obj, led_obj_on);static MP_DEFINE_CONST_FUN_OBJ_1(led_obj_off_obj, led_obj_off);static MP_DEFINE_CONST_FUN_OBJ_1(led_obj_toggle_obj, led_obj_toggle);static const mp_rom_map_elem_t led_locals_dict_table[] = {    { MP_ROM_QSTR(MP_QSTR_on), MP_ROM_PTR(&led_obj_on_obj) },    { MP_ROM_QSTR(MP_QSTR_off), MP_ROM_PTR(&led_obj_off_obj) },    { MP_ROM_QSTR(MP_QSTR_toggle), MP_ROM_PTR(&led_obj_toggle_obj) },};static MP_DEFINE_CONST_DICT(led_locals_dict, led_locals_dict_table);MP_DEFINE_CONST_OBJ_TYPE(    pyb_led_type,    MP_QSTR_LED,    MP_TYPE_FLAG_NONE,    make_new, led_obj_make_new,    print, led_obj_print,    locals_dict, &led_locals_dict    );

Led.h

#ifndef MICROPY_INCLUDED_XX_LED_H#define MICROPY_INCLUDED_XX_LED_Htypedef enum {    PYB_LED_RED = 1,    PYB_LED_GREEN = 2,    PYB_LED_YELLOW = 3,    PYB_LED_BLUE = 4,} pyb_led_t;void led_init(void);void led_state(pyb_led_t led, int state);void led_toggle(pyb_led_t led);void led_debug(int value, int delay);extern const mp_obj_type_t pyb_led_type;#endif 

注册pyb模块,绑定LED实例

py_port\modpyb.c中,绑定led实例pyb_led_typepyb模块

#include #include #include "py/runtime.h"#include "py/mphal.h"#include "shared/runtime/pyexec.h"#include "led.h"//#include "portmodules.h"//#include "modmachine.h"//#include "extmod/modmachine.h"//#include "extmod/modnetwork.h"//#include "extmod/vfs.h"//#include "extmod/modtime.h"MP_DECLARE_CONST_FUN_OBJ_KW(pyb_main_obj); // defined in main.c// Provide a no-op version of pyb.country for backwards compatibility on// boards that don't support networking.static mp_obj_t pyb_country(size_t n_args, const mp_obj_t *args) {    (void)n_args;    (void)args;    return mp_const_none;}static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mod_network_country_obj, 0, 1, pyb_country);static const mp_rom_map_elem_t pyb_module_globals_table[] = {    { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_pyb) },    { MP_ROM_QSTR(MP_QSTR_LED), MP_ROM_PTR(&pyb_led_type) },};static MP_DEFINE_CONST_DICT(pyb_module_globals, pyb_module_globals_table);const mp_obj_module_t pyb_module = {    .base = { &mp_type_module },    .globals = (mp_obj_dict_t *)&pyb_module_globals,};MP_REGISTER_MODULE(MP_QSTR_pyb, pyb_module);

py\genhdr\moduledefs.h中注册pyb模块

extern const struct _mp_obj_module_t pyb_module;#undef PYB_BUILTIN_MODULE_CONSTANTS#define PYB_BUILTIN_MODULE_CONSTANTS \    { MP_ROM_QSTR(MP_QSTR_pyb), MP_ROM_PTR(&pyb_module) },#define MICROPY_REGISTERED_MODULES \    MODULE_DEF_BUILTINS \    MODULE_DEF_CMATH \    MODULE_DEF_GC \    MODULE_DEF_MATH \    MODULE_DEF_MICROPYTHON \    MODULE_DEF_SYS \    MODULE_DEF___MAIN__ \    PYB_BUILTIN_MODULE_CONSTANTS// MICROPY_REGISTERED_MODULES

.测试

见视频

https://mp.weixin.qq.com/s/JdFb3x7KOag114Fb72URGA?token=1312261758&lang=zh_CN

import pyb

led1 = pyb.LED(1)

led2 = pyb.LED(2)

led1.on()

led2.on()

led1.off()

led2.off()

led1.toggle()

led2.toggle()

五. 总结

可以看到micropython新增模块支持比较简单,只需要按照模板注册模块,绑定对应的驱动即可。后续就可以不断添加新的模块支持使更具备实用性。








评论
  •  2024年下半年,接二连三的“Duang Duang”声,从自动驾驶行业中传来:文远知行、黑芝麻、地平线、小马智行等相继登陆二级市场,希迪智驾、Momenta、佑驾等若干家企业在排队冲刺IPO中。算法模型的历史性迭代与政策的不断加码,让自动驾驶的前景越来越清晰。由来只有新人笑,有谁听到旧人哭。在资本密集兑现的自动驾驶小元年里,很多人可能都已经遗忘,“全球自动驾驶第一股”的名号,曾经属于一家叫做图森未来的公司。曾经风光无两的“图森”,历经内讧与退市等不堪往事之后,而今的“未来”似乎被锚
    锦缎研究院 2024-12-18 11:13 87浏览
  • 户外照明的“璀璨王者”,艾迈斯欧司朗OSCONIQ® C3030降临啦全球领先的光学解决方案供应商艾迈斯欧司朗(瑞士证券交易所股票代码:AMS)近日宣布,推出新一代高性能LED——OSCONIQ® C 3030。这款尖端LED系列专为严苛的户外及体育场照明环境而设计,兼具出色的发光强度与卓越的散热效能。其支持高达3A的驱动电流及最大9W的功率输出,以紧凑扁平封装呈现卓越亮度和可靠性,确保高强度照明持久耐用且性能出众。应用领域01体育场及高杆照明OSCONIQ® C 3030以卓越的光通量密度、出
    艾迈斯欧司朗 2024-12-18 14:25 87浏览
  • 2003年买的电子管功放机,俗称胆机,坏过几次,咨询厂家,购买零件,自己修理,干中学,学中干。有照片记录的是2011年3月,一天,发现整流管比之前红亮了很多,赶紧关机,想找原因,反反复复折腾了几个月,搞好了。就此,还在网上论坛咨询和讨论,欧博Rererence 5.0电子管发粉红色光,何故?-『胆艺轩音响技术论坛』-胆艺轩[Tubebbs]论坛 发表于2011-5-7同时与厂家联系得到支持,见文:29kg胆机修理之联想——环保简易,做到真难!-面包板社区 发表于2011-6-13又继续使用了多年
    自做自受 2024-12-17 22:18 173浏览
  • 以人形机器人和通用人工智能为代表的新技术、新产品、新业态蓬勃发展,正成为全球科技创新的制高点与未来产业的新赛道。01、Optimus-Gen 2来了,人形机器人管家还远吗?没有一点点防备,特斯拉人形机器人Optimus-Gen 2来了!12月13日,马斯克于社交媒体上公布了特斯拉第二代人形机器人的产品演示,并预计将于本月内发布。在视频中,Optimus-Gen 2相比上一代有了大幅改进,不仅拥有AI大模型的加持,并在没有其他性能影响的前提下(相比上一代)将体重减少10kg,更包含:由特斯拉设计的
    艾迈斯欧司朗 2024-12-18 12:50 91浏览
  • You are correct that the length of the via affects its inductance. Not only the length of the via, but also the shape and proximity of the return-current path determines the inductance.   For example, let's work with a four-layer board h
    tao180539_524066311 2024-12-18 15:56 91浏览
  • 【富芮坤FR3068x-C】+开发环境疑问非常荣欣参加了这次《富芮坤FR3068x-C》评测活动,在搭建开发环境时,本人就遇到很大问题,主要有3个。第1个问题:本人按照《FR306x开发环境说明书》中的1章安装软件,keil5.36版本以上,并且打开sdk中uart工程,按照要求设置了Device配置如下: ARM Compiler选项链接文件配置但是编译结果如下:有23个warning,都是连接脚本中找不到,请问这样工程是否有问题?第2个问题:按照《FR306x开发环境说明书》中要求,需要电脑
    shenwen2007_656583087 2024-12-17 00:59 120浏览
  •   前言  作为一名电子专业的学生,半导体存储显然是绕不过去的一个坎,今天聊一聊关于Nand Flash的一些小知识。  这里十分感谢深圳雷龙发展有限公司为博主提供的两片CS创世SD NAND的存储芯片,同时也给大家推荐该品牌的相关产品。  一、定义  存储芯片根据断电后是否保留存储的信息可分为易失性存储芯片(RAM)和非易失性存储芯片(ROM)。  非易失性存储器芯片在断电后亦能持续保存代码及数据,分为闪型存储器 (Flash Memory)与只读存储器(Read-OnlyMemory),其中
    雷龙发展 2024-12-17 17:37 69浏览
  • 习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习笔记&记录学习习笔记&记学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记
    youyeye 2024-12-18 14:02 96浏览
  • 上汽大通G90是一款集豪华、科技与舒适于一身的中大型MPV,号称“国产埃尔法”。在国内市场,作为“卷王”的G90主要面向中大型MPV市场,满足家庭出行、商务接待和客运租赁等多元化场景需求,在国内市场上取得了不错的销售成绩。在海外市场,上汽大通G90也展现出了强大的竞争力,通过技术创新和品质提升,上汽大通的产品在国际市场上获得了广泛认可,出口量持续增长,如果你去过泰国,你就应该可以了解到,上汽的品牌出海战略,他们在泰国有建立工厂,上汽大通G90作为品牌的旗舰车型之一,自然也在海外市场上占据了重要地
    lauguo2013 2024-12-18 10:11 97浏览
  • 1. 磁性材料的磁化曲线磁性材料是由铁磁性物质或亚铁磁性物质组成的,在外加磁场H 作用下,必有相应的磁化强度M 或磁感应强度B,它们随磁场强度H 的变化曲线称为磁化曲线(M~H或B~H曲线)。磁化曲线一般来说是非线性的,具有2个特点:磁饱和现象及磁滞现象。即当磁场强度H足够大时,磁化强度M达到一个确定的饱和值Ms,继续增大H,Ms保持不变;以及当材料的M值达到饱和后,外磁场H降低为零时,M并不恢复为零,而是沿MsMr曲线变化。材料的工作状态相当于M~H曲线
    锦正茂科技 2024-12-17 10:40 126浏览
  • 随着国家对环保要求日趋严格。以铅酸电池为动力的电动自行车、电动摩托车,将逐渐受到环保管制。而能量密度更高的磷酸铁锂等锂电池成为优先的选择,锂电池以其高能量密度、快速充电、轻量化等特点,已经大量应用于电动车领域。光耦在锂电池系统PMU中的应用,能提供完善的安全保护和系统支撑。BMS和电池被封装成安装所需要的尺寸外形,高速的CAN以及RS-485等通信总线,被应用在与控制器、中控之间通信。晶台光耦,被广泛应用于通信隔离、双MCU系统应用地隔离、电机驱动隔离等。下图例举在电动摩托车上的应用中包含的部件
    晶台光耦 2024-12-17 13:47 65浏览
  •        随着对车载高速总线的深入研究,以电信号为媒介的传输方式逐渐显露出劣势,当传输速率超过25Gbps时,基于电信号传输已经很难保证长距离传输下的信号质量与损耗。在这样的背景下,应用于工业领域的光通信技术因其高带宽、长距离、低电磁干扰的特点得到了密切的关注,IEEE在2023年发布了802.3cz[1]协议,旨在定义一套光纤以太网在车载领域的应用标准。MultiGBASE-AU总览       以下是Mult
    经纬恒润 2024-12-17 17:29 81浏览
  • 随着现代汽车工业的不断发展,驾驶安全与舒适性成为消费者关注的焦点。在这个追求极致体验的时代,汽车ASF随动转向LED大灯技术应运而生,它不仅代表了车辆操控辅助系统的最新进展,更是对未来智能安全出行愿景的一次大胆探索。擎耀将深入探讨ASF随动转向技术的原理及落地方案,旨在为汽车LED照明升级行业提供一份详尽且实用的参考。首先,ASF随动转向技术不是什么高精尖的技术,一般的汽车大灯制造厂商都可能完成,通过软硬件的逻辑加上传感器,基本就可以实时监测车辆的行驶状态,包括但不限于车速、转向角度等关键参数。
    lauguo2013 2024-12-17 14:43 66浏览
  • 车载光纤通信随着ADAS(高阶驾驶辅助系统)、汽车智能网联、V2X和信息娱乐技术的不断发展,车载电子系统和应用数量迅速增加。不断增长的车内传输数据量对车载通信网络造成了巨大的数据带宽和安全性需求,传统的车载总线技术已经不能满足当今高速传输的要求。铜缆的广泛使用导致了严重的电磁干扰(EMI),同时也存在CAN、LIN、FlexRay等传统总线技术不太容易解决的问题。在此背景下,车载光纤通信技术逐渐受到关注和重视,除了大大提高数据传输率外,还具有抗电磁干扰、减少电缆空间和车辆质量等优点,在未来具有很
    广电计量 2024-12-18 13:31 85浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦