MSP432自主开发笔记6:定时器多通道捕获多条编码器线脉冲数

news2024/11/24 14:22:47

所用开发板:MSP432P401R

今日在此更新一下编码器测速的定时器捕获写法,之前学习时竟然忘记更新了~~

本文讲如何用定时器的通道来 捕获编码器的脉冲信号数量,不提供速度路程的计算方式,

文章提供源码,测试工程下载;

实践内容:

1.使用定时器TA2捕获四个轮子编码器的信号

2.上升下降沿都捕获

3.串口定时反馈捕获值

程序编写:

程序设计方面十分简单,分为以下步骤,每个步骤有一些注意点:

一、初始化定时器:

            1.关闭定时溢出中断,开启捕获事件的中断

            2.选择合适的定时器频率,略高于编码器最大频率即可

            3.四个通道除了引脚不同,初始化基本一样,结构体名称改改就行

            4.设置为上升沿、下降沿、上升下降沿,三种捕获模式之一,(本文设置为上升下降都捕获    )

二、捕获事件中断服务函数:

            1.因为之前关闭了 定时溢出中断,所以void TA2_N_IRQHandler(void)的进入条件只有捕获事件到来时:(本文捕获事件为:上升下降都是捕获事件    ),就会进一次中断

             2.定时器配置捕获后,可以通过读取TAxIV寄存器来判断是哪个通道传来的捕获事件,借此对其计数。(本文是定时器2,因此读取TA2IV)

             3.     

 有关TAxIV寄存器介绍在801页

 1.初始化定时器TA2四条通道的捕获:

注意点在之前说过了:

开启定时器计时,但关闭计时溢出中断

选择合适的计时溢出频率,这决定了捕获的采样率,比编码器脉冲频率快就行,当然,直接定时器48M也是没有问题的

四条通道初始化相同的

开启TA2端口中断     MAP_Interrupt_enableInterrupt(INT_TA2_N);

//定时器TA2捕获初始化:
void TA2_CAP_init(void)
{
	//四个通道初始化输入
		MAP_GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P5,GPIO_PIN6,GPIO_PRIMARY_MODULE_FUNCTION);	
		MAP_GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P5,GPIO_PIN7,GPIO_PRIMARY_MODULE_FUNCTION);	
		MAP_GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P6,GPIO_PIN6,GPIO_PRIMARY_MODULE_FUNCTION);	
		MAP_GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P6,GPIO_PIN7,GPIO_PRIMARY_MODULE_FUNCTION);	
	
	//定时器连续计数模式初始化,关闭定时溢出中断
			const Timer_A_ContinuousModeConfig continuousModeConfig =
		{
						TIMER_A_CLOCKSOURCE_SMCLK,
						TIMER_A_CLOCKSOURCE_DIVIDER_1,  //1分频,分辨率最高48M
						TIMER_A_TAIE_INTERRUPT_DISABLE, 
						TIMER_A_SKIP_CLEAR
		};
//初始化通道1:
				const Timer_A_CaptureModeConfig captureModeConfig_1 =
		{
						TIMER_A_CAPTURECOMPARE_REGISTER_1, 
						TIMER_A_CAPTUREMODE_RISING_AND_FALLING_EDGE,
						TIMER_A_CAPTURE_INPUTSELECT_CCIxA,
						TIMER_A_CAPTURE_SYNCHRONOUS,
						TIMER_A_CAPTURECOMPARE_INTERRUPT_ENABLE,
						TIMER_A_OUTPUTMODE_OUTBITVALUE
		};
//初始化通道2:
				const Timer_A_CaptureModeConfig captureModeConfig_2 =
		{
						TIMER_A_CAPTURECOMPARE_REGISTER_2, 
						TIMER_A_CAPTUREMODE_RISING_AND_FALLING_EDGE,
						TIMER_A_CAPTURE_INPUTSELECT_CCIxA,
						TIMER_A_CAPTURE_SYNCHRONOUS,
						TIMER_A_CAPTURECOMPARE_INTERRUPT_ENABLE,
						TIMER_A_OUTPUTMODE_OUTBITVALUE
		};
//初始化通道3:
				const Timer_A_CaptureModeConfig captureModeConfig_3 =
		{
						TIMER_A_CAPTURECOMPARE_REGISTER_3, 
						TIMER_A_CAPTUREMODE_RISING_AND_FALLING_EDGE,
						TIMER_A_CAPTURE_INPUTSELECT_CCIxA,
						TIMER_A_CAPTURE_SYNCHRONOUS,
						TIMER_A_CAPTURECOMPARE_INTERRUPT_ENABLE,
						TIMER_A_OUTPUTMODE_OUTBITVALUE
		};
//初始化通道4:
				const Timer_A_CaptureModeConfig captureModeConfig_4 =
		{
						TIMER_A_CAPTURECOMPARE_REGISTER_4, 
						TIMER_A_CAPTUREMODE_RISING_AND_FALLING_EDGE,
						TIMER_A_CAPTURE_INPUTSELECT_CCIxA,
						TIMER_A_CAPTURE_SYNCHRONOUS,
						TIMER_A_CAPTURECOMPARE_INTERRUPT_ENABLE,
						TIMER_A_OUTPUTMODE_OUTBITVALUE
		};		
		
		
	  MAP_Timer_A_initCapture(TIMER_A2_BASE, &captureModeConfig_1);
	  MAP_Timer_A_initCapture(TIMER_A2_BASE, &captureModeConfig_2);
	  MAP_Timer_A_initCapture(TIMER_A2_BASE, &captureModeConfig_3);
	  MAP_Timer_A_initCapture(TIMER_A2_BASE, &captureModeConfig_4);

    MAP_Timer_A_configureContinuousMode(TIMER_A2_BASE, &continuousModeConfig);
    MAP_Interrupt_enableInterrupt(INT_TA2_N);
    MAP_Timer_A_startCounter(TIMER_A2_BASE, TIMER_A_CONTINUOUS_MODE);
}

 2.编写定时器 中断服务函数:

代码中的 Wheel[x].CAPTURE 无须在意,是我给每个轮子定义的结构体,换成普通变量一样用的,这种高速计数脉冲,需要大家时刻注意溢出问题,以下代码段的意思就是防止数据溢出不被记录:

if(Wheel[1].CAPTURE==62700)
					{Wheel[1].CAPTURE=0;Wheel[1].CAT_OUT_TIME++;}

 


//这是捕获事件中断服务函数(因为定时器溢出中断已关闭)
//注意对照引脚看通道,这里通道情况与PWM控制不一样
void TA2_N_IRQHandler(void)
{
    uint16_t captureSource = TA2IV;
// 根据捕获通道来源进行适当的处理
//脉冲计数到62700时刚好车轮转95圈
//大电机减速比30编码器11线
    switch (captureSource) 
			{
        case 0x02:
            // 处理TA2 CCR1通道的捕获中断
						Wheel[1].CAPTURE++;
					if(Wheel[1].CAPTURE==62700)
					{Wheel[1].CAPTURE=0;Wheel[1].CAT_OUT_TIME++;}
            break;
        case 0x04:
            // 处理TA2 CCR2通道的捕获中断
						Wheel[2].CAPTURE++;
					if(Wheel[2].CAPTURE==62700)
					{Wheel[2].CAPTURE=0;Wheel[2].CAT_OUT_TIME++;}		
            break;
        case 0x06:
            // 处理TA2 CCR3通道的捕获中断
						Wheel[3].CAPTURE++;
					if(Wheel[3].CAPTURE==62700)
					{Wheel[3].CAPTURE=0;Wheel[3].CAT_OUT_TIME++;}					
            break;
        case 0x08:
            // 处理TA2 CCR4通道的捕获中断
						Wheel[4].CAPTURE++;
					if(Wheel[4].CAPTURE==62700)
					{Wheel[4].CAPTURE=0;Wheel[4].CAT_OUT_TIME++;}					
            break;
        default: break;	
}
}			

3.32定时器初始化为1s周期,通过串口反馈捕获情况:

//此句放在初始化,主函数开头,初始化32定时器为1s周期
 Tim32_0_Int_Init(47999999,1);


//32定时器初始化函数,传入的aar psc决定了其周期
void Tim32_0_Int_Init(uint32_t aar, uint8_t psc)
{
    MAP_Timer32_initModule(TIMER32_0_BASE, psc, TIMER32_32BIT, TIMER32_PERIODIC_MODE);
    MAP_Timer32_setCount(TIMER32_0_BASE, aar);
    MAP_Timer32_enableInterrupt(TIMER32_0_BASE);
    MAP_Timer32_startTimer(TIMER32_0_BASE, false); //连续计数模式 false
    MAP_Interrupt_enableInterrupt(INT_T32_INT1);
}




/* Timer32 ISR 中断服务函数,1s进一次*/
void T32_INT1_IRQHandler(void)
{
    MAP_Timer32_clearInterruptFlag(TIMER32_0_BASE);
		  printf("W1_CAP=%d\r\n",Wheel[1].CAPTURE);
			printf("W2_CAP=%d\r\n",Wheel[2].CAPTURE);
			printf("W3_CAP=%d\r\n",Wheel[3].CAPTURE);
			printf("W4_CAP=%d\r\n",Wheel[4].CAPTURE);
}

整体代码:

#include "main.h"

//单个车轮状态与参数结构体:
Wheel_dat Wheel[5];


int main(void)
{
	  inint_all();   //初始化所有模块
    while (1)
    {  }
}

/* Timer32 ISR */
void T32_INT1_IRQHandler(void)
{
    MAP_Timer32_clearInterruptFlag(TIMER32_0_BASE);
		  printf("W1_CAP=%d\r\n",Wheel[1].CAPTURE);
			printf("W2_CAP=%d\r\n",Wheel[2].CAPTURE);
			printf("W3_CAP=%d\r\n",Wheel[3].CAPTURE);
			printf("W4_CAP=%d\r\n",Wheel[4].CAPTURE);
}


//初始化所有模块
void inint_all(void)
{
    SysInit();                                  //时钟配置    
    delay_init();								 								//delay_ms函数配置
		uart_init(115200);	
	  TA2_CAP_init();
	  Tim32_0_Int_Init(47999999,1);
	  printf("Hello,MSP432!\r\n");								//串口打印测试字符
		MAP_Interrupt_enableMaster();               // 开启总中断
}


//串口0服务函数
//串口0接收命令,存在数组中
void EUSCIA0_IRQHandler(void)
{
	uint32_t status = UART_getEnabledInterruptStatus(EUSCI_A0_BASE);
	if(status & EUSCI_A_UART_RECEIVE_INTERRUPT_FLAG)      //接收中断
	{
		USART0_save[USART0_xb++]=MAP_UART_receiveData(EUSCI_A0_BASE);
		if(USART0_xb== 20){USART0_xb=0;	}							      //下标最大不超过20
		if(USART0_save[USART0_xb-1]=='\0'){USART0_flag=1;}  //命令以\0结尾
	}
}


//这是捕获事件中断服务函数(因为定时器溢出中断已关闭)
//注意对照引脚看通道,这里通道情况与PWM控制不一样
void TA2_N_IRQHandler(void)
{
    uint16_t captureSource = TA2IV;
// 根据捕获通道来源进行适当的处理
//脉冲计数到62700时刚好车轮转95圈
//大电机减速比30编码器11线
    switch (captureSource) 
			{
        case 0x02:
            // 处理TA2 CCR1通道的捕获中断
						Wheel[1].CAPTURE++;
					if(Wheel[1].CAPTURE==62700)
					{Wheel[1].CAPTURE=0;Wheel[1].CAT_OUT_TIME++;}
            break;
        case 0x04:
            // 处理TA2 CCR2通道的捕获中断
						Wheel[2].CAPTURE++;
					if(Wheel[2].CAPTURE==62700)
					{Wheel[2].CAPTURE=0;Wheel[2].CAT_OUT_TIME++;}		
            break;
        case 0x06:
            // 处理TA2 CCR3通道的捕获中断
						Wheel[3].CAPTURE++;
					if(Wheel[3].CAPTURE==62700)
					{Wheel[3].CAPTURE=0;Wheel[3].CAT_OUT_TIME++;}					
            break;
        case 0x08:
            // 处理TA2 CCR4通道的捕获中断
						Wheel[4].CAPTURE++;
					if(Wheel[4].CAPTURE==62700)
					{Wheel[4].CAPTURE=0;Wheel[4].CAT_OUT_TIME++;}					
            break;
        default: break;	
}
}			


//定时器TA2捕获初始化:
void TA2_CAP_init(void)
{
	//四个通道初始化输入
		MAP_GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P5,GPIO_PIN6,GPIO_PRIMARY_MODULE_FUNCTION);	
		MAP_GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P5,GPIO_PIN7,GPIO_PRIMARY_MODULE_FUNCTION);	
		MAP_GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P6,GPIO_PIN6,GPIO_PRIMARY_MODULE_FUNCTION);	
		MAP_GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P6,GPIO_PIN7,GPIO_PRIMARY_MODULE_FUNCTION);	
	
	//定时器连续计数模式初始化,关闭定时溢出中断
			const Timer_A_ContinuousModeConfig continuousModeConfig =
		{
						TIMER_A_CLOCKSOURCE_SMCLK,
						TIMER_A_CLOCKSOURCE_DIVIDER_1,  //1分频,分辨率最高48M
						TIMER_A_TAIE_INTERRUPT_DISABLE, 
						TIMER_A_SKIP_CLEAR
		};
//初始化通道1:
				const Timer_A_CaptureModeConfig captureModeConfig_1 =
		{
						TIMER_A_CAPTURECOMPARE_REGISTER_1, 
						TIMER_A_CAPTUREMODE_RISING_AND_FALLING_EDGE,
						TIMER_A_CAPTURE_INPUTSELECT_CCIxA,
						TIMER_A_CAPTURE_SYNCHRONOUS,
						TIMER_A_CAPTURECOMPARE_INTERRUPT_ENABLE,
						TIMER_A_OUTPUTMODE_OUTBITVALUE
		};
//初始化通道2:
				const Timer_A_CaptureModeConfig captureModeConfig_2 =
		{
						TIMER_A_CAPTURECOMPARE_REGISTER_2, 
						TIMER_A_CAPTUREMODE_RISING_AND_FALLING_EDGE,
						TIMER_A_CAPTURE_INPUTSELECT_CCIxA,
						TIMER_A_CAPTURE_SYNCHRONOUS,
						TIMER_A_CAPTURECOMPARE_INTERRUPT_ENABLE,
						TIMER_A_OUTPUTMODE_OUTBITVALUE
		};
//初始化通道3:
				const Timer_A_CaptureModeConfig captureModeConfig_3 =
		{
						TIMER_A_CAPTURECOMPARE_REGISTER_3, 
						TIMER_A_CAPTUREMODE_RISING_AND_FALLING_EDGE,
						TIMER_A_CAPTURE_INPUTSELECT_CCIxA,
						TIMER_A_CAPTURE_SYNCHRONOUS,
						TIMER_A_CAPTURECOMPARE_INTERRUPT_ENABLE,
						TIMER_A_OUTPUTMODE_OUTBITVALUE
		};
//初始化通道4:
				const Timer_A_CaptureModeConfig captureModeConfig_4 =
		{
						TIMER_A_CAPTURECOMPARE_REGISTER_4, 
						TIMER_A_CAPTUREMODE_RISING_AND_FALLING_EDGE,
						TIMER_A_CAPTURE_INPUTSELECT_CCIxA,
						TIMER_A_CAPTURE_SYNCHRONOUS,
						TIMER_A_CAPTURECOMPARE_INTERRUPT_ENABLE,
						TIMER_A_OUTPUTMODE_OUTBITVALUE
		};		
		
		
	  MAP_Timer_A_initCapture(TIMER_A2_BASE, &captureModeConfig_1);
	  MAP_Timer_A_initCapture(TIMER_A2_BASE, &captureModeConfig_2);
	  MAP_Timer_A_initCapture(TIMER_A2_BASE, &captureModeConfig_3);
	  MAP_Timer_A_initCapture(TIMER_A2_BASE, &captureModeConfig_4);

    MAP_Timer_A_configureContinuousMode(TIMER_A2_BASE, &continuousModeConfig);
    MAP_Interrupt_enableInterrupt(INT_TA2_N);
    MAP_Timer_A_startCounter(TIMER_A2_BASE, TIMER_A_CONTINUOUS_MODE);
}

#ifndef _main_h_
#define _main_h_

#include <ti/devices/msp432p4xx/driverlib/driverlib.h>
#include "string.h"				   	//C标准库、字符串处理库
#include "sysinit.h"			   	//时钟配置
#include "delay.h"				   	//滴答定时器初始化(提供delay_ms延时)
#include "Public.h"
#include "DATA.h"

//单个车轮状态与参数结构体:
typedef struct wheel_data
{
	uint16_t Sta;            //正反转状态,0不转,2正,1反
	uint16_t PWM_DIV;        //车轮电机占空比6 - 99
  uint32_t CAT_OUT_TIME;   //编码器 脉冲溢出次数,溢出一次就加一,记录有几个65530
  uint32_t CAPTURE;        //编码器 外部中断次数记录最大65530次脉冲,溢出后CAT_OUT_TIME会加一,CAPTURE归零
	uint32_t CAPTURE_LAST;   //上一次外部中断次数记录
  uint32_t CAPTURE_NEW;    //最新外部中断次数记录
	uint32_t DISTANCE;       //单轮行驶总路程长度单位cm,最大65535cm
  uint32_t SPEED;          //瞬时速度值存储,单位cm/s
}Wheel_dat;


void inint_all(void);               //初始化所有模块
//定时器TA2捕获初始化:
void TA2_CAP_init(void);

#endif

 测试工程下载:

https://download.csdn.net/download/qq_64257614/88214201?spm=1001.2014.3001.5503

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

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

相关文章

手动实现 Spring 底层机制【初始化 IOC容器+依赖注入+BeanPostProcessor 机制+AOP】之实现任务阶段 5- bean 后置处理器

&#x1f600;前言 手动实现 Spring 底层机制【初始化 IOC容器依赖注入BeanPostProcessor 机制AOP】的第五篇具体实现了任务阶段 5- bean 后置处理器 &#x1f3e0;个人主页&#xff1a;尘觉主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是尘觉&#xff0c;希…

ModaHub魔搭社区:从OpenAI实践看分工必要性,核心关注工作流相关的基础软件工具栈

从OpenAI实践看分工必要性,核心关注工作流相关的基础软件工具栈 参考海外OpenAI的率先尝试,工作流分工、点工具加持助力成功。一方面,OpenAI在《GPT-4 Technical Report》论文中[1]中披露了参与GPT 4开发的人员分工,共249人,角色分工明确,预训练、强化学习和对齐、部署等…

时间序列去趋势化和傅里叶变换

在计算傅里叶变换之前对信号去趋势是一种常见的做法&#xff0c;特别是在处理时间序列时。在这篇文章中&#xff0c;我将从数学和视觉上展示信号去趋势是如何影响傅里叶变换的。 这篇文章的目的是让介绍理解什么是常数和线性去趋势&#xff0c;为什么我们使用它们&#xff0c;…

CRM系统如何搭建?流程是什么样的?

CRM系统可以提高企业的销售效率和客户满意度&#xff0c;从而增加企业的收入和利润。但是&#xff0c;要想成功地上线CRM系统&#xff0c;需要经过一系列的步骤和流程&#xff0c;下面说说&#xff0c;企业如何上线CRM系统&#xff1f;CRM系统搭建流程。 1、需求分析 需求分析…

记一次物理机安装centos7遇到的问题

首先制作U盘镜像&#xff08;之前装windows的大白菜之类的就没用了&#xff09; 用的这个UltraISO制作U盘镜像 然后从U盘启动开始安装&#xff0c; 问题一 安装时报错 dracut-pre-udev[351]:modprobe :ERROR:could not insert ‘floppy’ dracut-pre-udev[351]:modprobe…

Nacos源码 (3) 注册中心

本文将从一个服务注册示例入手&#xff0c;通过阅读客户端、服务端源码&#xff0c;分析服务注册、服务发现原理。 使用的2.0.2的版本。 返回目录 客户端 创建NacosNamingService对象 NacosNamingService nacosNamingService new NacosNamingService(NACOS_HOST);NacosNami…

华为OD机试 - 最长的连续子序列 (Java 2022Q4 100分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷&#xff09;》…

ISIS技术(第三十七课)

1 分享一下华为官网上的一张地图 官网地址:https://support.huawei.com/hedex/hdx.do?docid=EDOC1000105967&id=ZH-CN_CONCEPT_0000001501534705 2 路由的分类 -直连路由 直接连接的路由,且配置了IP地址之后(在同一网段内),就是直连路由。 -非直连路由 -静态路由…

如何在金属制品业运用IPD?

金属制品行业是指以金属材料为原料&#xff0c;通过加工、制造、加工等工艺制造出各种金属制品的企业和产业。这些金属制品包括但不限于机械设备、工具、建筑材料、家具、电子产品、交通运输设备等。金属制品加工业是机械装备行业的一个子行业&#xff0c;包括结构性金属制品制…

SpringBoot对一个URL通过method(GET、POST、PUT、DELETE)实现增删改查操作

目录 1. rest风格基础2. 开启方法3. 实战练习 1. rest风格基础 我们都知道GET、POST、PUT、DELETE分别对应查、增、改、删除 虽然Postman这些工具可以直接发送GET、POST、PUT、DELETE请求。但是RequestMapping并不支持PUT和DELETE请求操作。需要我们手动开启 2. 开启方法 P…

ModaHub魔搭社区:Milvus Cloud素材集合帖,等你查收

Hi~Milvus Cloud 的各位朋友,这是一期 Milvus Cloud 素材弹药库的集中汇总帖。随着向量数据库的火爆,越来越多的伙伴开始关注到向量数据库并开始使用 Milvus Cloud 。 考虑到目前信息获取的渠道多且分散,我们专门为大家整理了一期 Milvus Cloud 信息集合帖,让大家可以在快…

iPhone苹果手机触屏失灵无法关机,如何强制重启

参考:https://zhuanlan.zhihu.com/p/615223121 1&#xff0c;只轻按一下音量上键后快速松开 2&#xff0c;只轻按一下音量下键后快速松开 3&#xff0c;只按住右侧电源键长按不松手&#xff0c;直到手机关机。

Tomcat的多实例和动静分离

目录 一、多实例 二、 nginxtomcat的负载均衡和动静分离 三、Tomcat 客户端->四层代理->七层代理->tomcat服务器 实验&#xff1a; 问题总结&#xff1a; tomcat日志文件&#xff1a;/usr/local/tomcat/logs/catalina.out 一、多实例 在一台服务器上有多个tomc…

python——案例19:九九乘法表

案例19&#xff1a;九九乘法表for i in range(1,10): #i是行&#xff0c;j是列for j in range(1,i1): #确保内循环中的列小于等于列print(%d*%d%2ld%(i,j,i*j),end ) #计算方法&#xff0c;并且确保内容连续print()

2023.8.14论文阅读

文章目录 ESPNet: Efficient Spatial Pyramid of Dilated Convolutions for Semantic Segmentation摘要本文方法实验结果 DeepFusion: Lidar-Camera Deep Fusion for Multi-Modal 3D Object Detection摘要本文方法实验结果 ESPNet: Efficient Spatial Pyramid of Dilated Convo…

【不限于联想Y9000P电脑关盖再打开时黑屏的解决办法】

不限于联想Y9000P电脑关盖再打开时黑屏的解决办法 问题的前言问题的出现问题拟解决 问题的前言 事情发生在昨天&#xff0c;更新了Win11系统后&#xff1a; 最惹人注目的三处地方就是&#xff1a; 1.可以查看时间的秒数了&#xff1b; 2.右键展示的内容变窄了&#xff1b; 3.按…

JimuReport积木报表 v1.6.0版本发布—免费的可视化报表

项目介绍 一款免费的数据可视化报表&#xff0c;含报表和大屏设计&#xff0c;像搭建积木一样在线设计报表&#xff01;功能涵盖&#xff0c;数据报表、打印设计、图表报表、大屏设计等&#xff01; Web 版报表设计器&#xff0c;类似于excel操作风格&#xff0c;通过拖拽完成报…

腾讯会议:云上协奏,远程韶华

腾讯会议的原理及历史 摘要 本论文介绍了腾讯会议的原理和历史。腾讯会议是一款基于云计算和通信技术的在线会议平台,由腾讯公司推出。通过分析腾讯会议的工作原理和演进历史,我们可以深入了解该平台是如何实现高效、便捷、安全的远程协作和沟通的。 1. 引言 近年来,随着…

PostgreSql 备份恢复

一、概述 数据库备份一般可分为物理备份和逻辑备份&#xff0c;其中物理备份又可分为物理冷备和物理热备&#xff0c;下面就各种备份方式进行详细说明&#xff08;一般情况下&#xff0c;生产环境采取的定时物理热备逻辑备份的方式&#xff0c;均是以下述方式为基础进一步研发编…

Qt开发技术:Q3D图表开发笔记:Q3DSurface三维曲面图介绍、Demo以及代码详解

前言 qt提供了q3d进行三维开发&#xff0c;虽然这个框架没有得到大量运用也不是那么成功&#xff0c;性能上也有很大的欠缺&#xff0c;但是普通的点到为止的应用展示还是可以的。   其中就包括华丽绚烂的三维图表&#xff0c;数据量不大的时候是可以使用的。   前面介绍了…