STM32-笔记20-测量按键按下时间

1、按键按下的时间-思路

        我们先检测下降沿信号,检测到以后,在回调函数里切换成检测上升沿信号,当两个信号都检测到的时候,这段时间就是按键按下的时间,如图所示:=>N*(ARR+1)+CCRx的值

N是在这段时间内,可能会发生的N次溢出。CCRx是寄存器中的计数,ARR打满65536-1

N个重装载值+CCRx的值

 2、实验目的

  • 使 用 定 时 器 2 通 道 2 来 捕 获 按 键 2 按 下 时 间 , 并 通 过 串 口 打 印 。
  • 计 一 个 数 的 时 间:1 u s , P S C = 7 1 , A R R = 6 5 5 3 5
  • 下 降 沿 捕 获 、 输 入 通 道 2 映 射 在 TI2 上 、 不 分 频 、 不 滤 波

为什么要使用定时器2通道2来捕获按键2?

这个板子只有两个按键。一个是key1,一个是key2,分别对应A0和A1引脚

原理图

产品手册(17页)

在这里可以看到,KEY1是接的定时器2通道1的ETR引脚,通过下图我们可以看出来,ETR引脚是作为一个输入源的,而我们这里是想要一个通道,所以这里使用KEY2

中文参考手册(254页)

1s = 1000 000us

P S C = 7 1 

PSC+1=72

72/72MHZ

1个时间周期 = 1/1000 000 = 1us

这里使用1us来表示记一个数的时,也可以更小,A R R = 6 5 5 3 5,直接把ARR拉满

上面是对时基单元配置

下面是对通道的配置

下 降 沿 捕 获 、 输 入 通 道 2 映 射 在 TI2 上 、 不 分 频 、 不 滤 波

滤波器先不要,对边沿检测时,先对下降沿检测,然后迅速在回调函数中对上升沿进行检测。

分频器不分频

3、实现输入捕获功能

复制项目文件19,重命名为20-实现捕获功能

打开项目文件

创建文件夹ic

加载文件

编译

编译

编译

代码如下:

main.c

#include "sys.h"
#include "delay.h"
#include "led.h"
#include "uart1.h"
#include "ic.h"int main(void)
{HAL_Init();                         /* 初始化HAL库 */stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */led_init();//初始化led灯uart1_init(115200);//printf("hello word!\r\n");ic_init(72-1,65536-1);while(1){ }
}

ic.c

#include "ic.h"
#include "stdio.h"TIM_HandleTypeDef ic_handle = {0};//初始化输入捕获函数
void ic_init(uint16_t psc,uint16_t arr)
{TIM_IC_InitTypeDef ic_config = {0};ic_handle.Instance = TIM2;//定时器2ic_handle.Init.Prescaler = psc;ic_handle.Init.Period = arr;ic_handle.Init.CounterMode = TIM_COUNTERMODE_UP;//向上计数模式HAL_TIM_IC_Init(&ic_handle);ic_config.ICFilter = 0;//过滤器0,也就是不要过滤器ic_config.ICPolarity = TIM_ICPOLARITY_FALLING;//下降沿捕获ic_config.ICPrescaler = TIM_ICPSC_DIV1;//每次在捕获输入上检测到边缘时执行捕获ic_config.ICSelection = TIM_ICSELECTION_DIRECTTI;//输入捕获触发信号源直接连接到对应通道的输入捕获引脚,这意味着输入捕获触发信号直接作用于定时器的输入捕获电路,不需要通过其他中间寄存器或外部电HAL_TIM_IC_ConfigChannel(&ic_handle,&ic_config,TIM_CHANNEL_2);__HAL_TIM_ENABLE_IT(&ic_handle,TIM_IT_UPDATE);//更新中断HAL_TIM_IC_Start_IT(&ic_handle,TIM_CHANNEL_2);}//初始化MSP函数
void HAL_TIM_IC_MspInit(TIM_HandleTypeDef *htim)
{if(htim->Instance == TIM2){GPIO_InitTypeDef gpio_initstruct;__HAL_RCC_TIM2_CLK_ENABLE();__HAL_RCC_GPIOA_CLK_ENABLE();gpio_initstruct.Mode = GPIO_MODE_INPUT;//复式推挽输出gpio_initstruct.Pin = GPIO_PIN_1;//引脚1gpio_initstruct.Pull = GPIO_PULLUP;//上拉输出gpio_initstruct.Speed = GPIO_SPEED_FREQ_HIGH;//高速HAL_GPIO_Init(GPIOA,&gpio_initstruct);HAL_NVIC_SetPriority(TIM2_IRQn,2,2);//外部中断号,抢占优先级/响应优先级HAL_NVIC_EnableIRQ(TIM2_IRQn);}}//中断服务函数
void TIM2_IRQHandler(void)
{HAL_TIM_IRQHandler(&ic_handle);
}//回调函数
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{printf("捕获一个下降沿\r\n");
}

ic.h

#ifndef __IC_H__
#define __IC_H__
#include "sys.h"void ic_init(uint16_t psc,uint16_t arr);#endif

 在ic.c函数中

ic_config.ICSelection = TIM_ICSELECTION_DIRECTTI;//输入捕获触发信号源直接连接到对应通道的输入捕获引脚,这意味着输入捕获触发信号直接作用于定时器的输入捕获电路,不需要通过其他中间寄存器或外部电

如果

ic_config.ICSelection =TIM_ICSELECTION_INDIRECTTI;//配置输入捕获通道的输入信号选择为间接定时器输入模式。

TIM Input 1 被选择连接到 IC2。

TIM Input 2 被选择连接到 IC1。

TIM Input 3 被选择连接到 IC4。

TIM Input 4 被选择连接到 IC3。

如果这里的ic_config.ICSelection设置成下面这个参数

ic_config.ICSelection =TIM_ICSELECTION_INDIRECTTI;

则摁KEY1才会响应按键

这是因为定时器2则连接到通道1中

在串口助手中摁KEY2会显示

4、实现一次完整的按键动作

复制项目文件20-实现捕获功能,重命名21-捕获一次完整的按键动作

在上面实现了捕获下降沿,在这里将会实现捕获上升沿,整合就会实现一次完整的按键动作。

具体流程如下:

succeed_flag:是否发生了一次完整的按键动作标志位

falling_flag:下降沿标志,当falling_flag = 0时(默认情况下),代表下降沿捕获成功;

当falling_flag = 1时(默认情况下),代表上升沿捕获成功;

这里用到两个函数

TIM_RESET_CAPTUREPOLARITY(&ic_handle, TIM_CHANNEL_2);//这行代码的作用是重置定时器捕获通道2的触发极性。
TIM_SET_CAPTUREPOLARITY(&ic_handle, TIM_CHANNEL_2, TIM_ICPOLARITY_RISING);//这行代码的意思是:为ic_handle所指向的定时器的第二个通道配置输入捕获极性为上升沿(即输入信号从低电平变为高电平时)。

在STM32的HAL库中,TIM_RESET_CAPTUREPOLARITY函数用于重置定时器的捕获通道的触发极性。具体来说,这个函数会将指定通道的触发极性设置为默认值,通常是上升沿或下降沿。

IM_SET_CAPTUREPOLARITY(&ic_handle, TIM_CHANNEL_2, TIM_ICPOLARITY_RISING); 这行代码是在使用STM32 HAL库(硬件抽象层库)进行定时器(TIM)的输入捕获配置时使用的。

代码流程:定义一个结构体,用于存放标志位和统计时间,在回调函数中,当用户按下按键,最初赋值是下降沿检测,检测到下降沿触发中断,响应回调函数,在回调函数中,初始的相应完整按键的标志位为0,执行if,初始响应上升沿标志位为0,执行else,在else中,将响应上升沿标志位 置1,并且将检测下降沿重置为检测上升沿,则在下次进入回调函数时,由于检测完整按键的标志位依旧为0,进入if,检测上升沿标志位为1,进入if,执行上升沿函数代码段。

代码如下:

ic.c

#include "ic.h"
#include "stdio.h"
#include "string.h"struct
{uint8_t succeed_flag;//完整的按键动作标志位uint8_t rising_flag;//上升标志位uint8_t falling_flag;//下降标志位uint16_t timeout_cnt;//时间统计}capture_status={0};//全部初始化为0TIM_HandleTypeDef ic_handle = {0};//初始化输入捕获函数
void ic_init(uint16_t psc,uint16_t arr)
{TIM_IC_InitTypeDef ic_config = {0};ic_handle.Instance = TIM2;//定时器2ic_handle.Init.Prescaler = psc;ic_handle.Init.Period = arr;ic_handle.Init.CounterMode = TIM_COUNTERMODE_UP;//向上计数模式HAL_TIM_IC_Init(&ic_handle);ic_config.ICFilter = 0;//过滤器0,也就是不要过滤器ic_config.ICPolarity = TIM_ICPOLARITY_FALLING;//下降沿捕获ic_config.ICPrescaler = TIM_ICPSC_DIV1;//每次在捕获输入上检测到边缘时执行捕获ic_config.ICSelection = TIM_ICSELECTION_DIRECTTI;//输入捕获触发信号源直接连接到对应通道的输入捕获引脚,这意味着输入捕获触发信号直接作用于定时器的输入捕获电路,不需要通过其他中间寄存器或外部电HAL_TIM_IC_ConfigChannel(&ic_handle,&ic_config,TIM_CHANNEL_2);__HAL_TIM_ENABLE_IT(&ic_handle,TIM_IT_UPDATE);//更新中断HAL_TIM_IC_Start_IT(&ic_handle,TIM_CHANNEL_2);}//初始化MSP函数
void HAL_TIM_IC_MspInit(TIM_HandleTypeDef *htim)
{if(htim->Instance == TIM2){GPIO_InitTypeDef gpio_initstruct;__HAL_RCC_TIM2_CLK_ENABLE();__HAL_RCC_GPIOA_CLK_ENABLE();gpio_initstruct.Mode = GPIO_MODE_INPUT;//复式推挽输出gpio_initstruct.Pin = GPIO_PIN_1;//引脚1gpio_initstruct.Pull = GPIO_PULLUP;//上拉输出gpio_initstruct.Speed = GPIO_SPEED_FREQ_HIGH;//高速HAL_GPIO_Init(GPIOA,&gpio_initstruct);HAL_NVIC_SetPriority(TIM2_IRQn,2,2);//外部中断号,抢占优先级/响应优先级HAL_NVIC_EnableIRQ(TIM2_IRQn);}}//中断服务函数
void TIM2_IRQHandler(void)
{HAL_TIM_IRQHandler(&ic_handle);
}//回调函数
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{if(htim->Instance == TIM2){if(capture_status.succeed_flag == 0)//完整按键捕获标志位,等于0代表不完整{if(capture_status.rising_flag == 1)//上升沿按键捕获标志,等于1代表捕获到上升沿{printf("捕获一个上升沿\r\n");memset(&capture_status,0,sizeof(capture_status));//对一整个结构体的清零TIM_RESET_CAPTUREPOLARITY(&ic_handle,TIM_CHANNEL_2);//重置捕获通道2TIM_SET_CAPTUREPOLARITY(&ic_handle,TIM_CHANNEL_2,TIM_INPUTCHANNELPOLARITY_FALLING);//配置捕获为下升沿}else{//未捕获到上升沿,现在是下降沿printf("捕获一个下降沿\r\n");memset(&capture_status,0,sizeof(capture_status));//对一整个结构体的清零capture_status.rising_flag = 1;//置位1,表示接下来的边沿检测是上升沿的TIM_RESET_CAPTUREPOLARITY(&ic_handle,TIM_CHANNEL_2);//重置捕获通道2TIM_SET_CAPTUREPOLARITY(&ic_handle,TIM_CHANNEL_2,TIM_INPUTCHANNELPOLARITY_RISING);//配置捕获为上升沿}}}
}

打开串口助手

按下按键2,串口显示

5、测量按键按下时间

回顾:如何测量按键按下的时间计算?

在按键按下的瞬间,检测到下降沿时,立刻把计时器关闭,将计数器置0,再打开(重启一下),使其从头开始计数,在未检测到上升沿之前,计数器中间可能会发生几次溢出,当检测到上升沿时,关闭计数器,查询当前计数器寄存器中的值。

复制项目文件21-捕获一次完整的按键动作,重命名为22-测量按键按下时间

__HAL_TIM_DISABLE(&ic_handle); 这行代码是在使用STM32 HAL库时,用于禁用(或停止)一个定时器的功能

__HAL_TIM_SET_COUNTER(&ic_handle, 0); 这行代码在使用STM32 HAL库时,用于设置定时器的计数器值。

__HAL_TIM_ENABLE(&ic_handle);//用于打开计数器

HAL_TIM_ReadCapturedValue(&ic_handle, TIM_CHANNEL_2); 这行代码在使用STM32 HAL库时,用于读取定时器指定通道的捕获值。

代码如下:

main.c

#include "sys.h"
#include "delay.h"
#include "led.h"
#include "uart1.h"
#include "ic.h"int main(void)
{HAL_Init();                         /* 初始化HAL库 */stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */led_init();//初始化led灯uart1_init(115200);//printf("hello word!\r\n");ic_init(72-1,65536-1);while(1){ pressed_time_get();delay_ms(500);}
}

ic.c

#include "ic.h"
#include "stdio.h"
#include "string.h"struct
{uint8_t succeed_flag;//完整的按键动作标志位uint8_t rising_flag;//上升标志位uint8_t falling_flag;//下降标志位uint16_t timeout_cnt;//时间统计}capture_status={0};//全部初始化为0
uint16_t last_cnt = 0;TIM_HandleTypeDef ic_handle = {0};//初始化输入捕获函数
void ic_init(uint16_t psc,uint16_t arr)
{TIM_IC_InitTypeDef ic_config = {0};ic_handle.Instance = TIM2;//定时器2ic_handle.Init.Prescaler = psc;ic_handle.Init.Period = arr;ic_handle.Init.CounterMode = TIM_COUNTERMODE_UP;//向上计数模式HAL_TIM_IC_Init(&ic_handle);ic_config.ICFilter = 0;//过滤器0,也就是不要过滤器ic_config.ICPolarity = TIM_ICPOLARITY_FALLING;//下降沿捕获ic_config.ICPrescaler = TIM_ICPSC_DIV1;//每次在捕获输入上检测到边缘时执行捕获ic_config.ICSelection = TIM_ICSELECTION_DIRECTTI;//输入捕获触发信号源直接连接到对应通道的输入捕获引脚,这意味着输入捕获触发信号直接作用于定时器的输入捕获电路,不需要通过其他中间寄存器或外部电HAL_TIM_IC_ConfigChannel(&ic_handle,&ic_config,TIM_CHANNEL_2);__HAL_TIM_ENABLE_IT(&ic_handle,TIM_IT_UPDATE);//更新中断HAL_TIM_IC_Start_IT(&ic_handle,TIM_CHANNEL_2);}//初始化MSP函数
void HAL_TIM_IC_MspInit(TIM_HandleTypeDef *htim)
{if(htim->Instance == TIM2){GPIO_InitTypeDef gpio_initstruct;__HAL_RCC_TIM2_CLK_ENABLE();__HAL_RCC_GPIOA_CLK_ENABLE();gpio_initstruct.Mode = GPIO_MODE_INPUT;//复式推挽输出gpio_initstruct.Pin = GPIO_PIN_1;//引脚1gpio_initstruct.Pull = GPIO_PULLUP;//上拉输出gpio_initstruct.Speed = GPIO_SPEED_FREQ_HIGH;//高速HAL_GPIO_Init(GPIOA,&gpio_initstruct);HAL_NVIC_SetPriority(TIM2_IRQn,2,2);//外部中断号,抢占优先级/响应优先级HAL_NVIC_EnableIRQ(TIM2_IRQn);}}//中断服务函数
void TIM2_IRQHandler(void)
{HAL_TIM_IRQHandler(&ic_handle);
}//回调函数
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{if(htim->Instance == TIM2){if(capture_status.succeed_flag == 0)//完整按键捕获标志位,等于0代表不完整{if(capture_status.rising_flag == 1)//上升沿按键捕获标志,等于1代表捕获到上升沿{printf("捕获一个上升沿\r\n");capture_status.succeed_flag = 1;//检测到一个完整的按键动作TIM_RESET_CAPTUREPOLARITY(&ic_handle,TIM_CHANNEL_2);//重置捕获通道2TIM_SET_CAPTUREPOLARITY(&ic_handle,TIM_CHANNEL_2,TIM_INPUTCHANNELPOLARITY_FALLING);//配置捕获为下升沿last_cnt = HAL_TIM_ReadCapturedValue(&ic_handle, TIM_CHANNEL_2);//用于读取定时器指定通道的捕获值。}else{//未捕获到上升沿,现在是下降沿printf("捕获一个下降沿\r\n");memset(&capture_status,0,sizeof(capture_status));//对一整个结构体的清零capture_status.rising_flag = 1;//置位1,表示接下来的边沿检测是上升沿的__HAL_TIM_DISABLE(&ic_handle); //用于禁用(或停止)一个定时器的功能__HAL_TIM_SET_COUNTER(&ic_handle, 0);//用于设置定时器的计数器值。TIM_RESET_CAPTUREPOLARITY(&ic_handle,TIM_CHANNEL_2);//重置捕获通道2TIM_SET_CAPTUREPOLARITY(&ic_handle,TIM_CHANNEL_2,TIM_INPUTCHANNELPOLARITY_RISING);//配置捕获为上升沿__HAL_TIM_ENABLE(&ic_handle);//用于打开计数器}}}
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)//溢出中断回调函数
{if(htim->Instance == TIM2){if(capture_status.succeed_flag == 0)//在没有产生完整按键时{if(capture_status.rising_flag == 1)//边沿检测标志位等于1,代表在产生下降沿之后,上升沿之前这段时间,产生的溢出进行计数{capture_status.timeout_cnt++;}}}
}
void pressed_time_get(void)
{if(capture_status.succeed_flag == 1)//产生完整按键之后,执行下面代码,未产生完整按键,不执行下面代码{printf("按下时间为:%d \r\n",capture_status.timeout_cnt * 65536 + last_cnt);memset(&capture_status,0,sizeof(capture_status));//对一整个结构体的清零}
}

ic.h

#ifndef __IC_H__
#define __IC_H__
#include "sys.h"void ic_init(uint16_t psc,uint16_t arr);
void pressed_time_get(void);#endif

打开串口助手

按下KEY2

可计算按键按下的时间

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

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

相关文章

CPT203 Software Engineering 软件工程 Pt.2 敏捷方法和需求工程(中英双语)

文章目录 3. Aglie methods(敏捷方法)3.1 Aglie methods(敏捷方法)3.1.1 特点3.1.2 优点3.1.3 缺点3.1.4 原则3.1.5 计划驱动与敏捷方法的对比 3.2 Scrum3.2.1 Scrum roles3.2.2 Scrum Activities and Artifacts3.2.2.1 Product B…

攻防靶场(29):目录权限和文件权限 ICMP

目录 1. 侦查 1.1 收集目标网络信息:IP地址 1.2 主动扫描:扫描IP地址段 1.3 搜索目标网站 2. 初始访问 2.1 利用面向公众的应用 3. 权限提升 3.1 有效账户:本地账户 3.2 滥用特权控制机制:Sudo和Sudo缓存 靶场下载地址&#xff1a…

Spring自动化创建脚本-解放繁琐的初始化配置!!!(自动化SSM整合)

一、实现功能(原创,转载请告知) 1.自动配置pom配置文件 2.自动识别数据库及数据表,创建Entity、Dao、Service、Controller等 3.自动创建database.properties、mybatis-config.xml等数据库文件 4.自动创建spring-dao.xml spring-mvc.xml …

【二】arcgis JavaScript api 实现加载不同坐标系的底图和三维服务

提示:如果是天地图底图参考这篇文章 【一】arcgis JavaScript api 实现加载不同坐标系的底图和三维服务_arcgis js api 调用三维地图服务-CSDN博客 需求: 前端开发实现底图(wkid:3857,web墨卡托)&#x…

HTML——46.制作课程表

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>课程表</title></head><body><h3>课程表</h3><table border"1" cellspacing"0"><tr><th colspan"…

ARM64 Windows 10 IoT工控主板运行x86程序效率测试

ARM上的 Windows 10 IoT 企业版支持仿真 x86 应用程序&#xff0c;而 ARM上的 Windows 11 IoT 企业版则支持仿真 x86 和 x64 应用程序。英创推出的名片尺寸ARM64工控主板ESM8400&#xff0c;可预装正版Windows 10 IoT企业版操作系统&#xff0c;x86程序可无需修改而直接在ESM84…

小程序组件 —— 23 组件案例 - 轮播图图片添加

上一节实现了轮播图的最外层结构&#xff0c;但是没有通过轮播图来渲染图片&#xff0c;这一节我们先讲一下小程序中怎么来渲染图片&#xff0c;讲解完之后会通过轮播图来展示图片&#xff1b; 在微信小程序中&#xff0c;如果需要渲染图片&#xff0c;需要使用 image 组件&am…

阿克曼(Ackmann)函数

时间限制&#xff1a;C/C 1000MS&#xff0c;其他语言 2000MS 内存限制&#xff1a;C/C 256MB&#xff0c;其他语言 512MB 难度&#xff1a;中等 分数&#xff1a;100 OI排行榜得分&#xff1a;12(0.1*分数2*难度) 描述 阿克曼(Ackmann)函数A(m&#xff0c;n)中&#xff0c;m&…

自动驾驶新纪元:城区NOA功能如何成为智能驾驶技术的分水岭

目录 一、NOA 的定义 二、NOA 的主要特点 导航集成 场景覆盖 智能决策 高级感知能力 驾驶员参与 三、NOA 的优势 四、NOA的衡量指标 定性评价指标 安全性评价指标定义 可靠性评价指标定义 舒适性评价指标定义 通行效率评价指标 定量评价指标 五、代表厂商的实测…

石岩路边理发好去处

周末带娃去罗租公园玩&#xff0c;罗租公园旁边就是百佳华和如意豪庭小区&#xff0c;发现如意豪庭小区对面挺多路边理发摊点 理发摊点聚焦在这里的原因是刚好前面城管来了暂时避避&#xff0c;例如还有一个阿姨剪到一半就跟着过来。这里的城管只是拍了一处没有摊位的地方&…

STM32-笔记24-智能开关垃圾桶盖

一、模块及接线 二&#xff0c;项目目的 以下几个事件触发时&#xff0c;自动开盖&#xff0c;并伴随蜂鸣器短响一声&#xff0c;同时 LED 灯闪烁一下&#xff0c;2秒后自动关盖&#xff1a; 检测到有人靠近检测到有震动按下按键 KEY1 实验框图如下&#xff1a; 三、项目前期…

从零开始开发纯血鸿蒙应用之UI封装

从零开始开发纯血鸿蒙应用 一、题引二、UI 组成三、UI 封装原则四、实现 lib_comps1、封装 UI 样式1.1、attributeModifier 属性1.2、自定义AttributeModifier<T>类 2、封装 UI 组件 五、总结 一、题引 在开始正文前&#xff0c;为了大家能够从本篇博文中&#xff0c;汲…

使用ArcGIS Pro自带的Notebook计算多个遥感指数

在之前的分享中&#xff0c;我们介绍了如何使用ArcPy将GEE下载的遥感影像转为单波段文件。基于前面创建的单波段文件&#xff0c;我们可以一次性计算多种遥感指数&#xff0c;例如NDVI、EVI、NDSI等。我这里直接在ArcGIS Pro中自带的Notebook进行的运行。如下图所示&#xff0c…

超大规模分类(一):噪声对比估计(Noise Contrastive Estimation, NCE)

NCE损失对应的论文为《A fast and simple algorithm for training neural probabilistic language models》&#xff0c;发表于2012年的ICML会议。 背景 在2012年&#xff0c;语言模型一般采用n-gram的方法&#xff0c;统计单词/上下文间的共现关系&#xff0c;比神经概率语言…

275-增强型多功能数据采集卡PCIe-6251-EX

产品特点&#xff1a; 高速高精度数据采集&#xff0c;16bit10MSPS&#xff0c;32路单端/16路差分高速高精度任意波形发生&#xff0c;14bit165MHz&#xff0c;2路完全独立完全可编程的I/O端口&#xff0c;33个完全可编程的量程选择&#xff0c;0~5V/0~10V/5V/10VPCIe通信接口…

Llama 3 后训练(三)

目录 4. 后训练 4.1 建模 图表解读 4.1.1 聊天对话格式 4.1.2 奖励建模 4.1.3 监督微调&#xff08;Supervised Finetuning&#xff09; 4.1.4 直接偏好优化&#xff08;Direct Preference Optimization&#xff09; 4.1.5 模型平均&#xff08;Model Averaging&#x…

机器人C++开源库The Robotics Library (RL)使用手册(四)

建立自己的机器人3D模型和运动学模型 这里以国产机器人天机TR8为例,使用最普遍的DH运动学模型,结合RL所需的描述文件,进行生成。 最终,需要的有两个文件,一个是.wrl三维模型描述文件;一个是.xml运动学模型描述文件。 1、通过STEP/STP三维文件生成wrl三维文件 机器人的…

Go+chromedp实现Web UI自动化测试

1.为什么使用go进行UI自动化测试&#xff1f; 速度&#xff1a;Go速度很快&#xff0c;这在运行包含数百个UI测试的测试套件时是一个巨大的优势 并发性&#xff1a;可以利用Go的内置并发性(goroutines)来并行化测试执行 简单&#xff1a;Go的简约语法允许您编写可读且可维护…

【LLM综述】29种大模型Prompt Engineering技术

note 从零样本&#xff08;Zero-shot&#xff09;提示到最新进展的各种提示技术&#xff0c;包括推理和逻辑链&#xff08;Chain-of-Thought, CoT&#xff09;提示、自动链式思考&#xff08;Auto-CoT&#xff09;提示、自我一致性&#xff08;Self-Consistency&#xff09;提…

基于SpringBoot的实验室信息管理系统【源码+文档+部署讲解】

系统介绍 视频演示 基于SpringBootVue实现的实验室信息管理系统采用前后端分离的架构方式&#xff0c;系统分为管理员、老师、用户三种角色&#xff0c;实现了用户管理、设备管理、实验室查询、公告、课程、实验室耗材管理、我的等功能 技术选型 开发工具&#xff1a;idea2…