实践 | 基于Linux的AP3216三合一整合型光感测器实验分享

嵌入式大杂烩 2021-03-25 00:00

点击上方「嵌入式大杂烩」,选择「置顶公众号」第一时间查看嵌入式笔记!

1、前言

开发板上有AP3216三合一整合型光感测器,看了看出厂SDK包中并未添加相关驱动。本次我们就一起来学习一下。

2、AP3216简介

AP3216C 芯片集成了光强传感器( ALS: Ambient Light Sensor),接近传感器( PS: Proximity Sensor),还有一个红外 LED( IR LED)。

这个芯片设计的用途是给手机之类的使用,比如:返回当前环境光强以便调整屏幕亮度;用户接听电话时,将手机放置在耳边后,自动关闭屏幕避免用户误触碰 。

该芯片通过 I2C 接口与主控制器相连, 如:

3、IIC驱动简介

Linux下IIC有两种驱动方式:一种是按照字符设备驱动方式来驱动IIC;另一种是走Linux下IIC的框架。按照字符设备驱动的方式可以查阅这一篇文章:Linux IIC 字符设备 驱动例子。

这里我们浅浅地(真的很浅~~)了解学习一下第二种方式,因为找到的AP3216的驱动就是基于IIC驱动框架的,哈哈。

整个IIC的驱动框架相关代码在drivers\i2c中,包含的内容有:


IIC驱动框架图如(图片来源于网络,链接见文末参考资料):


IIC驱动框架可大体分为两大部分:

①  I2C 总线驱动:SOC 的 I2C 控制器驱动,也叫做 I2C 适配器驱动。

②  I2C 设备驱动:针对具体的 I2C 设备而编写的驱动。

其中,访问抽象层与I2C核心层数据I2C 总线驱动部分;driver驱动层属于I2C设备驱动部分。

上面框图对应的代码调用层次图如:

下面的AP3216驱动可以对照这张图来看看。

4、AP3216实验

我们使用设备树来描述AP3216设备信息,首先我们没有在设备树中添加AP3216相关节点时,我们系统的I2C设备如:


添加I2C pinctrl,板子上AP3216接的是I2C1:


配置寄存器的值都设为0x4001b8b0,这一段是什么意思我们在什么是Pinctrl子系统及GPIO子系统?这篇笔记中也有写到,就是几个寄存器及其配置。

接下来在i2c1节点下添加ap3216节点:


编译设备树,传到开发板上,重启。此时我们系统的I2C设备有:


可见,新增的AP3216 I2C设备名就是我们设备树里设置的。

下面编写AP3216驱动(以下代码来源于网络):

ap3216.c:

#include <linux/types.h>
#include <linux/kernel.h>
#include <linux/delay.h>
#include <linux/ide.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/errno.h>
#include <linux/gpio.h>
#include <linux/cdev.h>
#include <linux/device.h>
#include <linux/of_gpio.h>
#include <linux/semaphore.h>
#include <linux/timer.h>
#include <linux/i2c.h>
#include <asm/mach/map.h>
#include <asm/uaccess.h>
#include <asm/io.h>
#include "ap3216creg.h"
/***************************************************************
文件名  : ap3216c.c
描述     : AP3216C驱动程序
***************************************************************/

#define AP3216C_CNT 1
#define AP3216C_NAME "ap3216c"
 
struct ap3216c_dev {
 dev_t devid;   /* 设备号   */
 struct cdev cdev;  /* cdev  */
 struct class *class; /* 类   */
 struct device *device; /* 设备   */
 struct device_node *nd; /* 设备节点 */
 int major;   /* 主设备号 */
 void *private_data; /* 私有数据 */
 unsigned short ir, als, ps;  /* 三个光传感器数据 */
};
 
static struct ap3216c_dev ap3216cdev;
 
/*
 * @description : 从ap3216c读取多个寄存器数据
 * @param - dev:  ap3216c设备
 * @param - reg:  要读取的寄存器首地址
 * @param - val:  读取到的数据
 * @param - len:  要读取的数据长度
 * @return   : 操作结果
 */

static int ap3216c_read_regs(struct ap3216c_dev *dev, u8 reg, void *val, int len)
{
 int ret;
 struct i2c_msg msg[2];
 struct i2c_client *client = (struct i2c_client *)dev->private_data;
 
 /* msg[0]为发送要读取的首地址 */
 msg[0].addr = client->addr;   /* ap3216c地址 */
 msg[0].flags = 0;     /* 标记为发送数据 */
 msg[0].buf = &reg;     /* 读取的首地址 */
 msg[0].len = 1;      /* reg长度*/
 
 /* msg[1]读取数据 */
 msg[1].addr = client->addr;   /* ap3216c地址 */
 msg[1].flags = I2C_M_RD;   /* 标记为读取数据*/
 msg[1].buf = val;     /* 读取数据缓冲区 */
 msg[1].len = len;     /* 要读取的数据长度*/
 
 ret = i2c_transfer(client->adapter, msg, 2);
 if(ret == 2) {
  ret = 0;
 } else {
  printk("i2c rd failed=%d reg=%06x len=%d\n",ret, reg, len);
  ret = -EREMOTEIO;
 }
 return ret;
}
 
/*
 * @description : 向ap3216c多个寄存器写入数据
 * @param - dev:  ap3216c设备
 * @param - reg:  要写入的寄存器首地址
 * @param - val:  要写入的数据缓冲区
 * @param - len:  要写入的数据长度
 * @return    :   操作结果
 */

static s32 ap3216c_write_regs(struct ap3216c_dev *dev, u8 reg, u8 *buf, u8 len)
{
 u8 b[256];
 struct i2c_msg msg;
 struct i2c_client *client = (struct i2c_client *)dev->private_data;
 
 b[0] = reg;     /* 寄存器首地址 */
 memcpy(&b[1],buf,len);  /* 将要写入的数据拷贝到数组b里面 */
  
 msg.addr = client->addr; /* ap3216c地址 */
 msg.flags = 0;    /* 标记为写数据 */
 
 msg.buf = b;    /* 要写入的数据缓冲区 */
 msg.len = len + 1;   /* 要写入的数据长度 */
 
 return i2c_transfer(client->adapter, &msg, 1);
}
 
/*
 * @description : 读取ap3216c指定寄存器值,读取一个寄存器
 * @param - dev:  ap3216c设备
 * @param - reg:  要读取的寄存器
 * @return    :   读取到的寄存器值
 */

static unsigned char ap3216c_read_reg(struct ap3216c_dev *dev, u8 reg)
{
 u8 data = 0;
 
 ap3216c_read_regs(dev, reg, &data, 1);
 return data;
 
#if 0
 struct i2c_client *client = (struct i2c_client *)dev->private_data;
 return i2c_smbus_read_byte_data(client, reg);
#endif
}
 
/*
 * @description : 向ap3216c指定寄存器写入指定的值,写一个寄存器
 * @param - dev:  ap3216c设备
 * @param - reg:  要写的寄存器
 * @param - data: 要写入的值
 * @return   :    无
 */

static void ap3216c_write_reg(struct ap3216c_dev *dev, u8 reg, u8 data)
{
 u8 buf = 0;
 buf = data;
 ap3216c_write_regs(dev, reg, &buf, 1);
}
 
/*
 * @description : 读取AP3216C的数据,读取原始数据,包括ALS,PS和IR, 注意!
 *    : 如果同时打开ALS,IR+PS的话两次数据读取的时间间隔要大于112.5ms
 * @param - ir : ir数据
 * @param - ps  : ps数据
 * @param - ps  : als数据 
 * @return   : 无。
 */

void ap3216c_readdata(struct ap3216c_dev *dev)
{
 unsigned char i =0;
    unsigned char buf[6];
 
 /* 循环读取所有传感器数据 */
    for(i = 0; i < 6; i++) 
    {
        buf[i] = ap3216c_read_reg(dev, AP3216C_IRDATALOW + i); 
    }
 
    if(buf[0] & 0X80)  /* IR_OF位为1,则数据无效 */
  dev->ir = 0;     
 else     /* 读取IR传感器的数据     */
  dev->ir = ((unsigned short)buf[1] << 2) | (buf[0] & 0X03);    
 
 dev->als = ((unsigned short)buf[3] << 8) | buf[2]; /* 读取ALS传感器的数据     */  
 
    if(buf[4] & 0x40/* IR_OF位为1,则数据无效    */
  dev->ps = 0;                 
 else     /* 读取PS传感器的数据    */
  dev->ps = ((unsigned short)(buf[5] & 0X3F) << 4) | (buf[4] & 0X0F); 
}
 
/*
 * @description  : 打开设备
 * @param - inode  : 传递给驱动的inode
 * @param - filp  : 设备文件,file结构体有个叫做private_data的成员变量
 *        一般在open的时候将private_data指向设备结构体。
 * @return    : 0 成功;其他 失败
 */

static int ap3216c_open(struct inode *inode, struct file *filp)
{
 filp->private_data = &ap3216cdev;
 
 /* 初始化AP3216C */
 ap3216c_write_reg(&ap3216cdev, AP3216C_SYSTEMCONG, 0x04);  /* 复位AP3216C    */
 mdelay(50);              /* AP3216C复位最少10ms  */
 ap3216c_write_reg(&ap3216cdev, AP3216C_SYSTEMCONG, 0X03);  /* 开启ALS、PS+IR   */
 return 0;
}
 
/*
 * @description  : 从设备读取数据 
 * @param - filp  : 要打开的设备文件(文件描述符)
 * @param - buf  : 返回给用户空间的数据缓冲区
 * @param - cnt  : 要读取的数据长度
 * @param - offt  : 相对于文件首地址的偏移
 * @return    : 读取的字节数,如果为负值,表示读取失败
 */

static ssize_t ap3216c_read(struct file *filp, char __user *buf, size_t cnt, loff_t *off)
{
 short data[3];
 long err = 0;
 
 struct ap3216c_dev *dev = (struct ap3216c_dev *)filp->private_data;
 
 ap3216c_readdata(dev);
 
 data[0] = dev->ir;
 data[1] = dev->als;
 data[2] = dev->ps;
 err = copy_to_user(buf, data, sizeof(data));
 return 0;
}
 
/*
 * @description  : 关闭/释放设备
 * @param - filp  : 要关闭的设备文件(文件描述符)
 * @return    : 0 成功;其他 失败
 */

static int ap3216c_release(struct inode *inode, struct file *filp)
{
 return 0;
}
 
/* AP3216C操作函数 */
static const struct file_operations ap3216c_ops = {
 .owner = THIS_MODULE,
 .open = ap3216c_open,
 .read = ap3216c_read,
 .release = ap3216c_release,
};
 
 /*
  * @description     : i2c驱动的probe函数,当驱动与
  *                    设备匹配以后此函数就会执行
  * @param - client  : i2c设备
  * @param - id      : i2c设备ID
  * @return          : 0,成功;其他负值,失败
  */

static int ap3216c_probe(struct i2c_client *client, const struct i2c_device_id *id)
{
 /* 1、构建设备号 */
 if (ap3216cdev.major) {
  ap3216cdev.devid = MKDEV(ap3216cdev.major, 0);
  register_chrdev_region(ap3216cdev.devid, AP3216C_CNT, AP3216C_NAME);
 } else {
  alloc_chrdev_region(&ap3216cdev.devid, 0, AP3216C_CNT, AP3216C_NAME);
  ap3216cdev.major = MAJOR(ap3216cdev.devid);
 }
 
 /* 2、注册设备 */
 cdev_init(&ap3216cdev.cdev, &ap3216c_ops);
 cdev_add(&ap3216cdev.cdev, ap3216cdev.devid, AP3216C_CNT);
 
 /* 3、创建类 */
 ap3216cdev.class = class_create(THIS_MODULEAP3216C_NAME);
 if (IS_ERR(ap3216cdev.class)) {
  return PTR_ERR(ap3216cdev.class);
 }
 
 /* 4、创建设备 */
 ap3216cdev.device = device_create(ap3216cdev.class, NULL, ap3216cdev.devid, NULL, AP3216C_NAME);
 if (IS_ERR(ap3216cdev.device)) {
  return PTR_ERR(ap3216cdev.device);
 }
 
 ap3216cdev.private_data = client;
 
 return 0;
}
 
/*
 * @description     : i2c驱动的remove函数,移除i2c驱动的时候此函数会执行
 * @param - client  : i2c设备
 * @return          : 0,成功;其他负值,失败
 */

static int ap3216c_remove(struct i2c_client *client)
{
 /* 删除设备 */
 cdev_del(&ap3216cdev.cdev);
 unregister_chrdev_region(ap3216cdev.devid, AP3216C_CNT);
 
 /* 注销掉类和设备 */
 device_destroy(ap3216cdev.class, ap3216cdev.devid);
 class_destroy(ap3216cdev.class);
 return 0;
}
 
/* 传统匹配方式ID列表 */
static const struct i2c_device_id ap3216c_id[] = {
 {"iot,ap3216c"0},  
 {}
};
 
/* 设备树匹配列表 */
static const struct of_device_id ap3216c_of_match[] = {
 { .compatible = "iot,ap3216c" },
 { /* Sentinel */ }
};
 
/* i2c驱动结构体 */ 
static struct i2c_driver ap3216c_driver = {
 .probe = ap3216c_probe,
 .remove = ap3216c_remove,
 .driver = {
   .owner = THIS_MODULE,
      .name = "ap3216c",
      .of_match_table = ap3216c_of_match, 
     },
 .id_table = ap3216c_id,
};
     
/*
 * @description : 驱动入口函数
 * @param   : 无
 * @return   : 无
 */

static int __init ap3216c_init(void)
{
 int ret = 0;
 
 ret = i2c_add_driver(&ap3216c_driver);
 return ret;
}
 
/*
 * @description : 驱动出口函数
 * @param   : 无
 * @return   : 无
 */

static void __exit ap3216c_exit(void)
{
 i2c_del_driver(&ap3216c_driver);
}
 
/* module_i2c_driver(ap3216c_driver) */
 
module_init(ap3216c_init);
module_exit(ap3216c_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("pjw");

驱动详解可查阅注释及配合上诉的I2C驱动框架的框图及数据手册理解。

ap3216creg.h:

#ifndef AP3216C_H
#define AP3216C_H
/***************************************************************
文件名  : ap3216creg.h
描述     : AP3216C寄存器地址描述头文件
***************************************************************/

#define AP3216C_ADDR     0X1E /* AP3216C器件地址  */
/* AP3316C寄存器 */
#define AP3216C_SYSTEMCONG 0x00 /* 配置寄存器       */
#define AP3216C_INTSTATUS 0X01 /* 中断状态寄存器   */
#define AP3216C_INTCLEAR 0X02 /* 中断清除寄存器   */
#define AP3216C_IRDATALOW 0x0A /* IR数据低字节     */
#define AP3216C_IRDATAHIGH 0x0B /* IR数据高字节     */
#define AP3216C_ALSDATALOW 0x0C /* ALS数据低字节    */
#define AP3216C_ALSDATAHIGH 0X0D /* ALS数据高字节    */
#define AP3216C_PSDATALOW 0X0E /* PS数据低字节     */
#define AP3216C_PSDATAHIGH 0X0F /* PS数据高字节     */
#endif

ap3216应用:

ap3216cApp.c:

#include "stdio.h"
#include "unistd.h"
#include "sys/types.h"
#include "sys/stat.h"
#include "sys/ioctl.h"
#include "fcntl.h"
#include "stdlib.h"
#include "string.h"
#include <poll.h>
#include <sys/select.h>
#include <sys/time.h>
#include <signal.h>
#include <fcntl.h>
/***************************************************************
文件名  : ap3216cApp.c
描述     : ap3216c设备测试APP。
使用方法  :./ap3216cApp /dev/ap3216c
***************************************************************/

 
/*
 * @description  : main主程序
 * @param - argc  : argv数组元素个数
 * @param - argv  : 具体参数
 * @return    : 0 成功;其他 失败
 */

int main(int argc, char *argv[])
{
 int fd;
 char *filename;
 unsigned short databuf[3];
 unsigned short ir, als, ps;
 int ret = 0;
 
 if (argc != 2) {
  printf("Error Usage!\r\n");
  return -1;
 }
 
 filename = argv[1];
 fd = open(filename, O_RDWR);
 if(fd < 0) {
  printf("can't open file %s\r\n", filename);
  return -1;
 }
 
 while (1) {
  ret = read(fd, databuf, sizeof(databuf));
  if(ret == 0) {    /* 数据读取成功 */
   ir =  databuf[0];  /* ir传感器数据 */
   als = databuf[1];  /* als传感器数据 */
   ps =  databuf[2];  /* ps传感器数据 */
   printf("ir = %d, als = %d, ps = %d\r\n", ir, als, ps);
  }
  usleep(200000); /*100ms */
 }
 close(fd); /* 关闭文件 */ 
 return 0;
}

编写Makefile,从之前的文章=======拷贝过来修改:

KERN_DIR = /home/book/100ask_imx6ull-sdk/Linux-4.9.88

all:
 make -C $(KERN_DIR) M=`pwd` modules 
 $(CROSS_COMPILE)gcc -o ap3216cApp ap3216cApp.c 

clean:
 make -C $(KERN_DIR) M=`pwd` modules clean
 rm -rf modules.order
 rm -f ap3216cApp

#
 参考内核源码drivers/char/ipmi/Makefile
# 要想把a.c, b.c编译成ab.ko, 可以这样指定:
# ab-y := a.o b.o
# obj-m += ab.o

obj-m += ap3216.o


编译得到ap3216.ko及ap3216cApp,传到板子上运行:


以上就是本次的实验分享,如果文章对你有帮助,欢迎转发,谢谢!

参考资料:

1、https://blog.csdn.net/weixin_34032792/article/details/85582751?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.control&dist_request_id=1328690.367.16165120737124801&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.control

2、https://blog.csdn.net/p1279030826/article/details/106459333

3、《嵌入式Linux应用开发完全手册》

温馨提示

由于微信公众号近期改变了推送规则,如果您想经常看到我们的文章,可以在每次阅读后,在页面下方点一个「赞」或「在看」,这样每次推送的文章才会第一时间出现在您的订阅列表里。

猜你喜欢:

实用 | 分享几个非常实用的开源项目

【嵌入式Linux笔记】设备树实例分析

【嵌入式Linux笔记】设备树基础知识

【嵌入式Linux笔记】总线设备驱动模型

2020年精选原创笔记汇总

在公众号聊天界面回复1024,可获取嵌入式资源;回复 ,可查看文章汇总。

文章都看完了不点个

嵌入式大杂烩 专注于嵌入式技术,包括但不限于C/C++、嵌入式、物联网、Linux等编程学习笔记,同时,内包含大量的学习资源。欢迎关注,一同交流学习,共同进步!
评论
  • PLC组态方式主要有三种,每种都有其独特的特点和适用场景。下面来简单说说: 1. 硬件组态   定义:硬件组态指的是选择适合的PLC型号、I/O模块、通信模块等硬件组件,并按照实际需求进行连接和配置。    灵活性:这种方式允许用户根据项目需求自由搭配硬件组件,具有较高的灵活性。    成本:可能需要额外的硬件购买成本,适用于对系统性能和扩展性有较高要求的场合。 2. 软件组态   定义:软件组态主要是通过PLC
    丙丁先生 2025-01-06 09:23 82浏览
  • 随着市场需求不断的变化,各行各业对CPU的要求越来越高,特别是近几年流行的 AIOT,为了有更好的用户体验,CPU的算力就要求更高了。今天为大家推荐由米尔基于瑞芯微RK3576处理器推出的MYC-LR3576核心板及开发板。关于RK3576处理器国产CPU,是这些年的骄傲,华为手机全国产化,国人一片呼声,再也不用卡脖子了。RK3576处理器,就是一款由国产是厂商瑞芯微,今年第二季推出的全新通用型的高性能SOC芯片,这款CPU到底有多么的高性能,下面看看它的几个特性:8核心6 TOPS超强算力双千
    米尔电子嵌入式 2025-01-03 17:04 55浏览
  • 每日可见的315MHz和433MHz遥控模块,你能分清楚吗?众所周知,一套遥控设备主要由发射部分和接收部分组成,发射器可以将控制者的控制按键经过编码,调制到射频信号上面,然后经天线发射出无线信号。而接收器是将天线接收到的无线信号进行解码,从而得到与控制按键相对应的信号,然后再去控制相应的设备工作。当前,常见的遥控设备主要分为红外遥控与无线电遥控两大类,其主要区别为所采用的载波频率及其应用场景不一致。红外遥控设备所采用的射频信号频率一般为38kHz,通常应用在电视、投影仪等设备中;而无线电遥控设备
    华普微HOPERF 2025-01-06 15:29 122浏览
  • 本文介绍Linux系统更换开机logo方法教程,通用RK3566、RK3568、RK3588、RK3576等开发板,触觉智能RK3562开发板演示,搭载4核A53处理器,主频高达2.0GHz;内置独立1Tops算力NPU,可应用于物联网网关、平板电脑、智能家居、教育电子、工业显示与控制等行业。制作图片开机logo图片制作注意事项(1)图片必须为bmp格式;(2)图片大小不能大于4MB;(3)BMP位深最大是32,建议设置为8;(4)图片名称为logo.bmp和logo_kernel.bmp;开机
    Industio_触觉智能 2025-01-06 10:43 87浏览
  • 这篇内容主要讨论三个基本问题,硅电容是什么,为什么要使用硅电容,如何正确使用硅电容?1.  硅电容是什么首先我们需要了解电容是什么?物理学上电容的概念指的是给定电位差下自由电荷的储藏量,记为C,单位是F,指的是容纳电荷的能力,C=εS/d=ε0εrS/4πkd(真空)=Q/U。百度百科上电容器的概念指的是两个相互靠近的导体,中间夹一层不导电的绝缘介质。通过观察电容本身的定义公式中可以看到,在各个变量中比较能够改变的就是εr,S和d,也就是介质的介电常数,金属板有效相对面积以及距离。当前
    知白 2025-01-06 12:04 164浏览
  • By Toradex 秦海1). 简介嵌入式平台设备基于Yocto Linux 在开发后期量产前期,为了安全以及提高启动速度等考虑,希望将 ARM 处理器平台的 Debug Console 输出关闭,本文就基于 NXP i.MX8MP ARM 处理器平台来演示相关流程。 本文所示例的平台来自于 Toradex Verdin i.MX8MP 嵌入式平台。  2. 准备a). Verdin i.MX8MP ARM核心版配合Dahlia载板并
    hai.qin_651820742 2025-01-07 14:52 38浏览
  • 根据环洋市场咨询(Global Info Research)项目团队最新调研,预计2030年全球无人机锂电池产值达到2457百万美元,2024-2030年期间年复合增长率CAGR为9.6%。 无人机锂电池是无人机动力系统中存储并释放能量的部分。无人机使用的动力电池,大多数是锂聚合物电池,相较其他电池,锂聚合物电池具有较高的能量密度,较长寿命,同时也具有良好的放电特性和安全性。 全球无人机锂电池核心厂商有宁德新能源科技、欣旺达、鹏辉能源、深圳格瑞普和EaglePicher等,前五大厂商占有全球
    GIRtina 2025-01-07 11:02 61浏览
  • 村田是目前全球量产硅电容的领先企业,其在2016年收购了法国IPDiA头部硅电容器公司,并于2023年6月宣布投资约100亿日元将硅电容产能提升两倍。以下内容主要来自村田官网信息整理,村田高密度硅电容器采用半导体MOS工艺开发,并使用3D结构来大幅增加电极表面,因此在给定的占位面积内增加了静电容量。村田的硅技术以嵌入非结晶基板的单片结构为基础(单层MIM和多层MIM—MIM是指金属 / 绝缘体/ 金属) 村田硅电容采用先进3D拓扑结构在100um内,使开发的有效静电容量面积相当于80个
    知白 2025-01-07 15:02 65浏览
  • 在智能家居领域中,Wi-Fi、蓝牙、Zigbee、Thread与Z-Wave等无线通信协议是构建短距物联局域网的关键手段,它们常在实际应用中交叉运用,以满足智能家居生态系统多样化的功能需求。然而,这些协议之间并未遵循统一的互通标准,缺乏直接的互操作性,在进行组网时需要引入额外的网关作为“翻译桥梁”,极大地增加了系统的复杂性。 同时,Apple HomeKit、SamSung SmartThings、Amazon Alexa、Google Home等主流智能家居平台为了提升市占率与消费者
    华普微HOPERF 2025-01-06 17:23 141浏览
  • 根据Global Info Research项目团队最新调研,预计2030年全球封闭式电机产值达到1425百万美元,2024-2030年期间年复合增长率CAGR为3.4%。 封闭式电机是一种电动机,其外壳设计为密闭结构,通常用于要求较高的防护等级的应用场合。封闭式电机可以有效防止外部灰尘、水分和其他污染物进入内部,从而保护电机的内部组件,延长其使用寿命。 环洋市场咨询机构出版的调研分析报告【全球封闭式电机行业总体规模、主要厂商及IPO上市调研报告,2025-2031】研究全球封闭式电机总体规
    GIRtina 2025-01-06 11:10 102浏览
  • 自动化已成为现代制造业的基石,而驱动隔离器作为关键组件,在提升效率、精度和可靠性方面起到了不可或缺的作用。随着工业技术不断革新,驱动隔离器正助力自动化生产设备适应新兴趋势,并推动行业未来的发展。本文将探讨自动化的核心趋势及驱动隔离器在其中的重要角色。自动化领域的新兴趋势智能工厂的崛起智能工厂已成为自动化生产的新标杆。通过结合物联网(IoT)、人工智能(AI)和机器学习(ML),智能工厂实现了实时监控和动态决策。驱动隔离器在其中至关重要,它确保了传感器、执行器和控制单元之间的信号完整性,同时提供高
    腾恩科技-彭工 2025-01-03 16:28 170浏览
  • 大模型的赋能是指利用大型机器学习模型(如深度学习模型)来增强或改进各种应用和服务。这种技术在许多领域都显示出了巨大的潜力,包括但不限于以下几个方面: 1. 企业服务:大模型可以用于构建智能客服系统、知识库问答系统等,提升企业的服务质量和运营效率。 2. 教育服务:在教育领域,大模型被应用于个性化学习、智能辅导、作业批改等,帮助教师减轻工作负担,提高教学质量。 3. 工业智能化:大模型有助于解决工业领域的复杂性和不确定性问题,尽管在认知能力方面尚未完全具备专家级的复杂决策能力。 4. 消费
    丙丁先生 2025-01-07 09:25 77浏览
  •     为控制片内设备并且查询其工作状态,MCU内部总是有一组特殊功能寄存器(SFR,Special Function Register)。    使用Eclipse环境调试MCU程序时,可以利用 Peripheral Registers Viewer来查看SFR。这个小工具是怎样知道某个型号的MCU有怎样的寄存器定义呢?它使用一种描述性的文本文件——SVD文件。这个文件存储在下面红色字体的路径下。    例:南京沁恒  &n
    电子知识打边炉 2025-01-04 20:04 98浏览
  • 彼得·德鲁克被誉为“现代管理学之父”,他的管理思想影响了无数企业和管理者。然而,关于他的书籍分类,一种流行的说法令人感到困惑:德鲁克一生写了39本书,其中15本是关于管理的,而其中“专门写工商企业或为企业管理者写的”只有两本——《为成果而管理》和《创新与企业家精神》。这样的表述广为流传,但深入探讨后却发现并不完全准确。让我们一起重新审视这一说法,解析其中的矛盾与根源,进而重新认识德鲁克的管理思想及其著作的真正价值。从《创新与企业家精神》看德鲁克的视角《创新与企业家精神》通常被认为是一本专为企业管
    优思学院 2025-01-06 12:03 113浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦