【S32K3 RTD LLD篇5】K344 ADC SW+HW trigger

news2024/10/4 5:08:17

【S32K3 RTD LLD篇5】K344 ADC SW+HW trigger

  • 一,文档简介
  • 二,ADC SW HW 触发
    • 2.1 软硬件平台
    • 2.2 SW+ADC 软件触发
    • 2.3 SW+BCTU+ADC 软件BCTU触发
    • 2.4 PIT+TRIGMUX+ADC 硬件PIT TRIGUMX触发
    • 2.5 EMIOS+BCTUHW+ADC硬件EMIOS BCTU触发
    • 2.6 EMIOS+BCTUHW LIST+ADC硬件EMIOS BCTU触发LIST采集

一,文档简介

S32K344的ADC是一款分辨率高达14位的SAR ADC,拥有丰富的软件以及硬件触发方式,支持多样的外部触发源,并且引入BCTU使得触发资源可以外联到多通道的EMIOS以及TRIGMUX,增加了更多的ADC触发源。本文主要讲解如下几种方式的ADC软硬件触发情况,并且配套给出代码。

在这里插入图片描述

图 1

主要分为5部分:
(1) SW+ADC: 软件触发,通过添加定时器PIT,定时调用软件触发ADC完成通道采样,并且通过UART printf打印出采集值。
(2) SW+BCTU+ADC: 软件触发, 通过添加定时器PIT,定时调用软件触发BTCU, 完成ADC通道采样,并且通过UART printf打印出采集值。
(3) PIT+TRIGMUX+ADC: 硬件触发, 通过TRIGMUX连接PIT到ADC,通过PIT硬件触发ADC通道采样,并且在采样转换完成后打印转换值。
(4) EMIOS+BCTUHW+ADC: 硬件触发,通过EMIOS定时触发BCTU完成对应ADC单通道采样,由于采样速率较高,所以只是定时打印BCTU采样值。
(5) EMIOS+BCTUHWLIST+ADC: 硬件触发,通过EMIOS定时触发BCTU完成ADC列表通道采样,由于采样速率较高,所以定时打印BCTU 采样到的列表通道值。

二,ADC SW HW 触发

2.1 软硬件平台

软件: RTD400 LLD,S32DS3.5
硬件:S32K3X4EVB-T172

2.2 SW+ADC 软件触发

实际上,原始的RTD400自带的ADC demo已经有了ADC 软件以及BCTU的软件触发,本文是在该功能的基础上添加了PIT定时软件触发,并且通过UART printf打印出来,让检查ADC的测试值通过串口打印变的更加方便。
本文软件触发ADC的框图结构如下:

在这里插入图片描述

图 2

S32K344EVB板载有一个电位器,接到了ADC1_S10, PTA11:
在这里插入图片描述

图 3

所以,本节软件触发主要用于采集ADC1_S10。 UART 打印端口使用的是板载仿真器自带的串口:LPUART6_RX PTA15, LPUART6_TX PTA16,波特率为115200.
对于本文软件触发demo,主要配置涉及如下模块:
(1)Pins:
在这里插入图片描述

图 4

ADC1_s10, PTA11是当前要测试板载电位器电压,可调。
PTA29:连接板载D13红灯,用于测试PIT定时器中断进入闪烁,作为PIT的呼吸灯使用。
PTA16: UART6_TX, 用于发送采集到的ADC值。
(2)clocks
用于配置系统时钟,需要关注UART6时钟源为40Mhz,ADC1时钟源为160Mhz,PIT0时钟源为40Mhz
(3)Peripherals
涉及外设模块Siul2_Port,Siul2_Dio, Pit, Lpuart_Uart, Adc_Sar_Ip, IntCtrl_Ip.
Siul2_Port: 添加4个引脚ADC PTA11 MSCR 11, RED LED PTA29 MSCR 29,UART6_RX PTA15 MSCR 15, UART6_RX PTA16 MSCR 16.
Siul2_Dio:添加模块主要是为了让相关的API函数进来,便于控制GPIO引脚。
Pit: 用于生成1S的定时,主要配置如下:
在这里插入图片描述

图 5

在这里插入图片描述

图6

Lpuart_Uart:
在这里插入图片描述

图7

Adc_Sar_Ip:
在这里插入图片描述

图8

在这里插入图片描述

图9

这里需要注意的是ADC calibration prescale,以及Adc prescaler vale,需要满足如下条件,这点可以在S32K3RM上找到:
在这里插入图片描述

图 10

由于ADC1的时钟源是160MHz, 所以配置校准分频为4分频,转换分频为2分频。
IntCtrl_Ip:
在这里插入图片描述

图 11

旨在打开PIT, LPUART6的中断,并且注册对应的handler.
CT配置完成,生成代码,下一步,移步main函数,添加代码如下:

void AdcEndOfChainNotif1(void)
{
    notif_triggered1 = TRUE;
    data1 = Adc_Sar_Ip_GetConvData(ADCHWUNIT_1_BOARD_INITPERIPHERALS_INSTANCE, 34);
    /* Checks the measured ADC data conversion */
   // while (ADC_TOLERANCE(data, ADC_BANDGAP));
}
void Pit0ch0Notification(void)
{
    toggleLed = 1U;
    Siul2_Dio_Ip_TogglePins(LED_Q172_PORT, (1<<LED_Q172_PIN));
}
int main(void)
{
    StatusType status;
    uint8 Index;
    Clock_Ip_StatusType clockStatus;

    /* Initialize and configure drivers */
    clockStatus = Clock_Ip_Init(&Clock_Ip_aClockConfig[0]);
    while (clockStatus != CLOCK_IP_SUCCESS)
    {
        clockStatus = Clock_Ip_Init(&Clock_Ip_aClockConfig[0]);
    }
    Siul2_Port_Ip_Init(NUM_OF_CONFIGURED_PINS_PortContainer_0_BOARD_InitPeripherals, g_pin_mux_InitConfigArr_PortContainer_0_BOARD_InitPeripherals);


    /* set PIT 0 interrupt */
    IntCtrl_Ip_Init(&IntCtrlConfig_0);
IntCtrl_Ip_EnableIrq(PIT0_IRQn);

    status = (StatusType) Adc_Sar_Ip_Init(ADCHWUNIT_1_BOARD_INITPERIPHERALS_INSTANCE, &AdcHwUnit_1_BOARD_InitPeripherals);
    while (status != E_OK);

IntCtrl_Ip_InstallHandler(ADC1_IRQn, Adc_Sar_1_Isr, NULL_PTR);

IntCtrl_Ip_EnableIrq(ADC1_IRQn);

    for(Index = 0; Index <= 5; Index++)
    {
        status = (StatusType) Adc_Sar_Ip_DoCalibration(ADCHWUNIT_1_BOARD_INITPERIPHERALS_INSTANCE);
        if(status == E_OK)
        {
            break;
        }
}

    Adc_Sar_Ip_EnableNotifications(ADCHWUNIT_1_BOARD_INITPERIPHERALS_INSTANCE, ADC_SAR_IP_NOTIF_FLAG_NORMAL_ENDCHAIN | ADC_SAR_IP_NOTIF_FLAG_INJECTED_ENDCHAIN);

    /* Initialize PIT instance 0 - Channel 0 */
    Pit_Ip_Init(PIT_INST_0, &PIT_0_InitConfig_PB_BOARD_InitPeripherals);
    /* Initialize channel 0 */
    Pit_Ip_InitChannel(PIT_INST_0, PIT_0_CH_0);
    /* Enable channel interrupt PIT_0 - CH_0 */
    Pit_Ip_EnableChannelInterrupt(PIT_INST_0, CH_0);
    /* Start channel CH_0 */
    Pit_Ip_StartChannel(PIT_INST_0, CH_0, PIT_PERIOD);

    Lpuart_Uart_Ip_Init(UART_LPUART_INTERNAL_CHANNEL, &Lpuart_Uart_Ip_xHwConfigPB_6_BOARD_INITPERIPHERALS);
    printf("S32K344 PIT TRIGMUX ADC demo RTD400.\r\n");
    while(1)
    {
#if 1
      if( toggleLed == 1)
      {
    	  toggleLed = 0;
        /* Start a SW triggered normal conversion on ADC_SAR */

        Adc_Sar_Ip_StartConversion(ADCHWUNIT_1_BOARD_INITPERIPHERALS_INSTANCE, ADC_SAR_IP_CONV_CHAIN_NORMAL);

        /* Wait for the notification to be triggered and read the data */
        while (notif_triggered1 != TRUE);
        notif_triggered1 = FALSE;
        printf("ADC1_s10 ch34 data = %d .\r\n", data1);
      }
#endif

 }
}

测试结果打印如下:
在这里插入图片描述

图 12

本节内容配套代码:S32K344_PIT_SW_ADC_RTD400.zip

2.3 SW+BCTU+ADC 软件BCTU触发

基于SW+ADC触发,添加BCTU,并且使用BCTU软件触发完成ADC采样。框图结构如下:
在这里插入图片描述

图 13

本节功能是使用BCTU软件触发ADC0采样,采样通道并没有真实的使用外部的引脚输入,而是采集ADC0 的bandgap的值。软件触发通过PIT 1S周期调用软件触发函数,完成后打印ADC采样转换值到UART。
CT工具中,主要修改点为peripherals, adc_sar_lp中添加ADC0,并且配置为BCTU触发。
在这里插入图片描述

图 14

在这里插入图片描述

图 15

这里可以看到,图14中 adc ctu mode为:trigger mode.
添加Bctu_Ip模块,并且配置如下:
在这里插入图片描述

图 16

对应选择的BCTU的通道为48,该通道对应内部的bandgap模块。
在这里插入图片描述

图 17

典型值是1.2V,所以参考电压为5V,对应的14位ADC的bandgap期望值为:
(2^14)*1.2/5=3932周围。
完成CT配置生成代码后,在main.c里面添加如下代码:

void AdcEndOfChainNotif(void)
{
    notif_triggered = TRUE;
    data = Adc_Sar_Ip_GetConvData(ADCHWUNIT_0_BOARD_INITPERIPHERALS_INSTANCE, ADC_SAR_USED_CH);
}
void Pit0ch0Notification(void)
{
    toggleLed = 1U;
    Siul2_Dio_Ip_TogglePins(LED_Q172_PORT, (1<<LED_Q172_PIN));
}

void BctuWatermarkNotif(void)
{
    uint8 idx;
    notif_triggered = TRUE;
    for (idx = 0u; idx < BCTU_FIFO_WATERMARK; idx++)
    {
    	data_bctu = Bctu_Ip_GetFifoData(BCTUHWUNIT_0_BOARD_INITPERIPHERALS_INSTANCE, BCTU_USED_FIFO_IDX);
    }
}

int main(void)
{
    StatusType status;
    uint8 Index;
    Clock_Ip_StatusType clockStatus;

    /* Initialize and configure drivers */
    clockStatus = Clock_Ip_Init(&Clock_Ip_aClockConfig[0]);
    while (clockStatus != CLOCK_IP_SUCCESS)
    {
        clockStatus = Clock_Ip_Init(&Clock_Ip_aClockConfig[0]);
    }
    Siul2_Port_Ip_Init(NUM_OF_CONFIGURED_PINS_PortContainer_0_BOARD_InitPeripherals, g_pin_mux_InitConfigArr_PortContainer_0_BOARD_InitPeripherals);

    Bctu_Ip_Init(BCTUHWUNIT_0_BOARD_INITPERIPHERALS_INSTANCE, &BctuHwUnit_0_BOARD_INITPERIPHERALS);

    status = (StatusType) Adc_Sar_Ip_Init(ADCHWUNIT_0_BOARD_INITPERIPHERALS_INSTANCE, &AdcHwUnit_0_BOARD_InitPeripherals);
while (status != E_OK);

    /* set PIT 0 interrupt */
    IntCtrl_Ip_Init(&IntCtrlConfig_0);
    IntCtrl_Ip_EnableIrq(PIT0_IRQn);
    /* Install and enable interrupt handlers */
    IntCtrl_Ip_InstallHandler(ADC0_IRQn, Adc_Sar_0_Isr, NULL_PTR);
    IntCtrl_Ip_InstallHandler(BCTU_IRQn, Bctu_0_Isr, NULL_PTR);

    IntCtrl_Ip_EnableIrq(ADC0_IRQn);
    IntCtrl_Ip_EnableIrq(BCTU_IRQn);

    /* Call Calibration function multiple times, to mitigate instability of board source */
    for(Index = 0; Index <= 5; Index++)
    {
        status = (StatusType) Adc_Sar_Ip_DoCalibration(ADCHWUNIT_0_BOARD_INITPERIPHERALS_INSTANCE);
        if(status == E_OK)
        {
            break;
        }
}

    Adc_Sar_Ip_EnableNotifications(ADCHWUNIT_0_BOARD_INITPERIPHERALS_INSTANCE, ADC_SAR_IP_NOTIF_FLAG_NORMAL_ENDCHAIN | ADC_SAR_IP_NOTIF_FLAG_INJECTED_ENDCHAIN);
    /* Start a SW triggered conversion on BCTU using a single trigger */
    Bctu_Ip_SetGlobalTriggerEn(BCTUHWUNIT_0_BOARD_INITPERIPHERALS_INSTANCE, TRUE);
Bctu_Ip_EnableNotifications(BCTUHWUNIT_0_BOARD_INITPERIPHERALS_INSTANCE, BCTU_IP_NOTIF_FIFO1);

    /* Initialize PIT instance 0 - Channel 0 */
    Pit_Ip_Init(PIT_INST_0, &PIT_0_InitConfig_PB_BOARD_InitPeripherals);
    /* Initialize channel 0 */
    Pit_Ip_InitChannel(PIT_INST_0, PIT_0_CH_0);
    /* Enable channel interrupt PIT_0 - CH_0 */
    Pit_Ip_EnableChannelInterrupt(PIT_INST_0, CH_0);
    /* Start channel CH_0 */
    Pit_Ip_StartChannel(PIT_INST_0, CH_0, PIT_PERIOD);

    Trgmux_Ip_Init(&Trgmux_Ip_xTrgmuxInitPB);//
    Lpuart_Uart_Ip_Init(UART_LPUART_INTERNAL_CHANNEL, &Lpuart_Uart_Ip_xHwConfigPB_6_BOARD_INITPERIPHERALS);


    printf("S32K344 PIT TRIGMUX ADC demo RTD400.\r\n");

    while(1)
    {
      if( toggleLed == 1)
      {
    	  toggleLed = 0;
    	  Bctu_Ip_SwTriggerConversion(BCTUHWUNIT_0_BOARD_INITPERIPHERALS_INSTANCE, BCTU_USED_SINGLE_TRIG_IDX);
    	  while (notif_triggered != TRUE);
    	  notif_triggered = FALSE;
    	  printf("ADC0_bandgap ch48 data_bctu = %d .\r\n", data_bctu);
      }

    }
}

测结果如下:
在这里插入图片描述

图18

和典型期望值接近,说明已经成功运行。
配套代码:S32K344_PIT_TRIGMUX_BCTUSW_ADC_printf_RTD400.zip

2.4 PIT+TRIGMUX+ADC 硬件PIT TRIGUMX触发

本节为硬件触发,使用PIT结合TRIGMUX直接触发ADC1 通道34即ADC1_S10采样,触发结构框图如下:
在这里插入图片描述

图19

同样在之前代码的基础上,需要在CT的peripherals中额外添加模块Trgmux_Ip,其余配置不变。
在这里插入图片描述

图 20

这里选择了Trigmux的输入为PIT0_CH0, 输出为ADC1.
代码也简单很多,在main里面添加如下代码:

Trgmux_Ip_Init(&Trgmux_Ip_xTrgmuxInitPB);//
    while(1)
    {
      if(notif_triggered1 == TRUE)
      {
    	  notif_triggered1 = FALSE;
    	  printf("ADC1_s10 ch34 data = %d .\r\n", data1);
      }
    }

While(1)中,可以看到,已经没有软件触发的调用,直接判别ADC1转换完成的标志,然后打印数据,测试结果如下:
在这里插入图片描述

图 21

可以看到,随着外部电位器的改变,采样得到的ADC1_S10的值也在改变。
本节代码:S32K344_PIT_TRIGMUX_ADC_printf_RTD400.zip

2.5 EMIOS+BCTUHW+ADC硬件EMIOS BCTU触发

本节框图结构如下:

在这里插入图片描述

图 22

使用eMIOS0_CH0,生成10Khz的时钟,去触发BCTU完成ADC0_48通道,即bandgap的采样。
在CT工具中,添加Emios_Mcal_Ip,配置如下:
在这里插入图片描述

图 23

BCTU配置改成使能HW triggering,配置如下:

在这里插入图片描述

图24

Main代码相关代码如下:

Emios_Mcl_Ip_Init(EMIOS_INST0, &Emios_Mcl_Ip_0_Config_BOARD_INITPERIPHERALS);

while(1)
{
  if( toggleLed == 1)
  {
	  toggleLed = 0;
	  printf("ADC0_bandgap ch48 data_bctu = %d .\r\n", data_bctu);

  }
}

由于采样率是按照10Khz的频率去触发,频率较快,这里打印还是按照1s打印,打印结果如下:

在这里插入图片描述

图 25

可以看到,得到的结果也是一个可以变动的bandgap值。
本节代码:S32K344_PIT_TRIGMUX_BCTUHW_EMIOS_ADC_printf_RTD400.zip

2.6 EMIOS+BCTUHW LIST+ADC硬件EMIOS BCTU触发LIST采集

本节和上面的EMIOS BCTU硬件触发类似,只是在BCTU中配置使用LIST的形式,可以一次触发转换多个通道。主要修改点为BCTU模块:

在这里插入图片描述

图 26

添加对应的main代码如下:

#define BCTU_FIFO_WATERMARK             3U
void BctuWatermarkNotif(void)
{
    uint8 idx;
    notif_triggered = TRUE;
    for (idx = 0u; idx < BCTU_FIFO_WATERMARK; idx++)
    {
    	data_bctu[idx] = Bctu_Ip_GetFifoData(BCTUHWUNIT_0_BOARD_INITPERIPHERALS_INSTANCE, BCTU_USED_FIFO_IDX);
    }
}
    while(1)
    {
      if( toggleLed == 1)
      {
    	  toggleLed = 0;
    	  printf("ADC0_bandgap    ch48 data_bctu = %d .\r\n", data_bctu[0]);
    	  printf("ADC0_vrefl       ch54 data_bctu = %d .\r\n", data_bctu[1]);
    	  printf("ADC0_vrefh       ch55 data_bctu = %d .\r\n", data_bctu[2]);

      }
    }

测试结果如下:
在这里插入图片描述

图 27

可以看到,结果和采集的bandgap,VREFL,VREFH还是吻合的,说明代码功能正常运行。
本节代码:
S32K344_PIT_TRIGMUX_BCTUHWLIST_EMIOS_ADC_printf_RTD400.zip
代码链接:
https://community.nxp.com/t5/S32K-Knowledge-Base/RTD400-K344-ADC-SW-HW-trigger/ta-p/1966179

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2187396.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【计算机毕业设计】springboot游戏分享网站

摘 要 网络的广泛应用给生活带来了十分的便利。所以把游戏分享管理与现在网络相结合&#xff0c;利用java技术建设游戏分享网站&#xff0c;实现游戏分享的信息化。则对于进一步提高游戏分享管理发展&#xff0c;丰富游戏分享管理经验能起到不少的促进作用。 游戏分享网站能够…

Oracle架构之物理存储中各种文件详解

文章目录 1 物理存储1.1 简介1.2 数据文件&#xff08;data files&#xff09;1.2.1 定义1.2.2 分类1.2.2.1 系统数据文件1.2.2.2 撤销数据文件1.2.2.3 用户数据文件1.2.2.4 临时数据文件 1.3 控制文件&#xff08;Control files&#xff09;1.3.1 定义1.3.2 查看控制文件1.3.3…

【重学 MySQL】五十五、浮点和定点数据类型

【重学 MySQL】五十五、浮点和定点数据类型 种类选择数据精度说明浮点数据精度定点数据精度总结 精度误差说明浮点数据精度误差定点数据精度误差总结 示例注意事项开发中经验 在MySQL中&#xff0c;浮点和定点数据类型用于存储小数和实数。 种类 MySQL提供了两种主要的浮点数…

SuiteCRM系统 responseEntryPoint SQL注入复现(CVE-2024-36412)

0x01 产品描述&#xff1a; SuiteCRM是一款开源的CRM&#xff08;客户关系管理&#xff09;系统&#xff0c;它致力于为世界各地的用户提供高效、灵活和可定制的CRM解决方案。它为企业和组织提供了一套完整的客户关系管理解决方案&#xff0c;无论是中小型企业还是大型企业&…

Python和R及Julia妊娠相关疾病生物剖析算法

&#x1f3af;要点 算法使用了矢量投影、现代优化线性代数、空间分区技术和大数据编程利用相应向量空间中标量积和欧几里得距离的紧密关系来计算使用妊娠相关疾病&#xff08;先兆子痫&#xff09;、健康妊娠和癌症测试算法模型使用相关性投影利用相关性和欧几里得距离之间的关…

linux第二课:常用命令

Kali Linux&#xff0c;黑客必备神器。跟着我&#xff0c;带你从入门到入狱&#xff01; 第二课&#xff0c;常用命令。 1.whoami 翻译为中文&#xff1a;我是谁 用途&#xff1a;输出现在自己的用户身份(用户名) 参数&#xff1a;无参数 好吧&#xff0c;这透明度一调都不…

基于SpringBoot+Vue的汽车保险理赔系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

mysql UDF提权(实战案例)

作者&#xff1a;程序那点事儿 日期&#xff1a;2024/09/29 16:10 什么是UDF? 全称 User Define Function &#xff08;用户自定义函数&#xff09;UDF提权&#xff0c;就是通过自定义函数&#xff0c;实现执行系统的命令。 dll&#xff08;windows&#xff0c;dll文件是c语…

10.1 10.3 图DFS 中等 207 Course Schedule 210 Course Schedule Ⅱ

207 Course Schedule class Solution { public:bool hasCycle(int course ,unordered_map<int,vector<int>>& graph,vector<int>& visitStatus){//正在访问的结点再次被访问&#xff0c;存在环if(visitStatus[course] 1)return true;//该结点已经被…

【CViT】Deepfake Video Detection Using Convolutional Vision Transformer

文章目录 Deepfake Video Detection Using Convolutional Vision Transformerkey points**卷积视觉变压器**FLViT实验总结Deepfake Video Detection Using Convolutional Vision Transformer 会议/期刊:2021 作者: key points 提出了一种用于检测深度伪造的卷积视觉变压器…

Linux学习之路 -- 线程 -- 死锁及线程安全相关问题

在上文中&#xff0c;我们已经介绍了线程池的编写&#xff0c;下面补充一下线程的相关知识。 目录 1、线程安全与可重入 <1>概念 <2>区别联系 <3>常见线程不安全的情况 <4>常见的不可重入情况 2、死锁问题 <1>死锁概念 <2>死锁四…

sql-labs靶场第二关测试报告

目录 一、测试环境 1、系统环境 2、使用工具/软件 二、测试目的 三、操作过程 1、寻找注入点 2、注入数据库 ①Order by判断列数 ②判断回显地方 ③爆库&#xff0c;查看数据库名称 ④爆表&#xff0c;查看security库的所有表 ⑤爆列&#xff0c;查看users表的所有…

Redis-哨兵

概念 Redis Sentinel 相关名词解释 注意: 哨兵机制不负责存储数据,只是对其它的redis-server进程起到监控的作用哨兵节点,也会搞一个集合,防止一个挂了 ⼈⼯恢复主节点故障 用户监控: 实际开发中,对于服务器后端开发,监控程序,是很重要的 服务器长期运行,总会有一些意外,…

16.数据结构与算法-串,数组与广义表(串,BF算法,KMP算法)

串&#xff08;String&#xff09; 串的定义 关于串的术语 串的案例引入 串的类型定义 串的顺序存储结构 串的链式存储结构-块链结构 串的模式匹配算法&#xff08;BF算法与KMP算法&#xff09; BF算法 BF算法时间复杂度 KMP算法

CSS滚动条

通过《CSS盒子模型》一节的学习我们知道&#xff0c;页面中的每个元素都可以看作是一个矩形的盒子&#xff0c;我们可以使用 CSS 来控制盒子的大小、位置等等信息。默认情况下&#xff0c;当元素中的内容超出盒子的大小时&#xff0c;例如元素内容区的宽度和高度所组成的矩形区…

Django连接Dify、ChatGPT4o并计算tokens数量方法

通过Dify可以连接很多模型国内、国外的都可以进行选择可以到Dify里创建一个空白应用&#xff0c;然后点击进入就可以看到API了api_url "http://192.168.15.131/v1/chat-messages" api_key "app-UtzTpVNwpTLUcGvRNnnK9QNY" headers {"Authorization…

网站开发基础:JavaScript

前端开发主要使用的技术如 HTML、CSS 和 JavaScript 等。 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><style>.myDivClass{border: solid red 1px;width: 50px;height:…

python如何查询函数

1、通用的帮助函数help() 使用help()函数来查看函数的帮助信息。 如&#xff1a; import requests help(requests) 会有类似如下输出&#xff1a; 2、查询函数信息 ★查看模块下的所有函数&#xff1a; dir(module_name) #module_name是要查询的函数名 如&#xff1a; i…

【D3.js in Action 3 精译_027】3.4 让 D3 数据适应屏幕(下)—— D3 分段比例尺的用法

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第一部分 D3.js 基础知识 第一章 D3.js 简介&#xff08;已完结&#xff09; 1.1 何为 D3.js&#xff1f;1.2 D3 生态系统——入门须知1.3 数据可视化最佳实践&#xff08;上&#xff09;1.3 数据可…

PCL 点云统计滤波

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 2.1.1 统计滤波实现 2.1.2 可视化函数 2.2完整代码 三、实现效果 PCL点云算法汇总及实战案例汇总的目录地址链接&#xff1a; PCL点云算法与项目实战案例汇总&#xff08;长期更新&#xf…