【MSP432电机驱动学习—上篇】TB6612带稳压电机驱动模块、MG310电机、霍尔编码器

news2024/12/29 8:45:22

所用控制板型号:MSP432P401r 

今日终于得以继续我的电赛小车速通之路:

苏轼云   “  素面常嫌粉涴 , 洗妆不褪朱红。 ”

这告诫我们不能只注重在表面粉饰虚伪的自己,要像梅花一样,不断磨砺自己的内在~

后半句是 “   高晴已逐晓云空 ,不与梨花同梦  ” 

 这是希望我们有着深入的研究精神,不与做大学课设一样只浅浅研究了解就满足了~

本文最终使用MSP432P401r开发板尝试实践驱动TB6612与MG310电机做一些转动动作,正转、反转与停止,调速等功能。编码器测速放在之后的下篇文章,每篇都会附上实验测试视频与整体参考工程!

主要学习的有以下三个模块:TB6612带稳压电机驱动模块MG310电机的编程使用,霍尔编码器的基础知识,文章前部分会先介绍各个模块基础,后续实践并且会贴出驱动代码,不同学习进度的学习者可通过查阅以下目录进行适当地跳跃式阅读:

目录

(一)、TB6612带稳压驱动模块介绍:

 一、TB6612 FNG芯片:

 二、TB6612带稳压电机驱动模块实物图片:

三、TB6612模块控制信号输入引脚、电机A\B接口、编码器输出口:

(二)、十三线霍尔编码器基础知识:

一、 霍尔编码器的实物图:

二、霍尔编码器原理简介:

(三)、MG310电机参数:

(四)、线路连接:

 模块连接详细电路图——————手绘草图:

 TB6612与MSP432引脚连接详情:

实物连接图:

(五)、程序设计:

 实验程序设计功能解读:

程序设计主要分为以下几部分:(此处建议快速浏览)

1.引脚位带定义与初始化函数的编写

2.PWM频率与占空比的计算

3.按键控制函数的编写:

整体程序代码:

TB6612.c:

 TB6612.h:

(六)、演示视频:

(七)、整体测试工程下载链接:


(一)、TB6612带稳压驱动模块介绍:

因为单片机~~ IO 的带负载能力较弱,而直流电机是大电流感性负载,所以需要功率放大器件TB6612FNG来辅助驱动大电流直流电机。 

 一、TB6612 FNG芯片:

而我们TB6612带稳压模块中,用于驱动电机的芯片是TB6612 FNG,它的实物图如下:

 这个最简模块芯片可以用来驱动俩个电机,它的引脚按照输入输出可以分为:

1.AINl/AIN2、BIN1/BIN2、PWMA/PWMB为控制信号输入端;

2. AO1/A02、B01/B02为2路电机控制输出端;

TB6612带稳压驱动模块就是带有这块芯片为主的一个模块,这里我们先不展开讲这个小芯片的每个输入输出引脚的作用,因为接下来在模块中会详细介绍!

 二、TB6612带稳压电机驱动模块实物图片:

以上图就是TB6612带稳压驱动模块了,一块这样的TB6612驱动板子能够带动至多俩个MG310电机,并且还能稳压输出5V供电,如果你的小车设备有四个轮子,那就需要俩块这样的板子了。

(1) TB6612 是东芝半导体公司生产的的一款直流电机驱动器件,它具有大电 流的 MOSFET-H 桥结构,双通道电路输出,可同时驱动两个电机。如果我们需 要驱动两个电机,只需要一块 TB6612 芯片即可。
(2) 相比 L298N 的热耗性和外围二极管续流电路,它无需外加散热片,外围电路简单,只需要外接电源滤波电容就可以直接驱动电机,利于减小系统尺寸。
(3) 对于 PWM 信号输入频率范围,高达 100kHz 的频率更是足以满足我们大部 分的需求了。
(4) TB6612 的主要参数:
最大输入电压:VM = 15V
最大输出电流:Iout=1.2A(平均)或=3.2A(峰值)
具有正反转、短路刹车、停机功能模式
内置过热保护和低压检测电路

三、TB6612模块控制信号输入引脚、电机A\B接口、编码器输出口:

这里因为相机拍出的图像不太清晰,我自己整了一个简笔画,凑合看看,我们首先看到它的电机A\B接口与控制信号输入引脚:

 左侧绿框就是控制信号输入引脚,是要接在单片机GPIO上的:

PWMA 与PWMB 接到单片机的 PWM 引脚,一般 10Khz 的 PWM 即可,并通过改变占空比来调节电机的速度。

STBY置高模块才能正常工作

 AIN1 AIN2 BIN1 BIN2 分别控制电机 A 与 电机B 正转和反转

其中 AIN1 AIN2 与 BIN1 BIN2 真值表如下:

AIN1 AIN2与BIN1 BIN2真值表
停止正转反转
AIN1010
AIN2001
BIN1010
BIN2001

接下来介绍右边的电机编码器相关引脚:

E1A E1B E2A E2B分别连接的是电机A和B上对应的编码器的A B相输出线

A01  A02 B01 B02 分别连接的是电机A和电机B

5V和GND就是分别给编码器供电用的

最后是编码器输出引脚:

E1A E1B   E2A E2B就是编码器采集到了轴旋转的方向与位置的输出脚,接在单片机上进行采集

ADC脚用于电压检测,可以不进行连接。

(二)、霍尔编码器基础知识:

 常见的编码器有两种,分别为霍尔编码器和GMR编码器。这里我只介绍霍尔编码器,关于GMR编码器,我们只需要知道它利用巨磁阻效应进行测速,一般是500线的,所以精度十分高

一、 霍尔编码器的实物图:

从以上示例图我们就可直到霍尔编码器是如何安装的了,它分为霍尔圆盘霍尔编码器磁环俩部分,磁环就是图中的黑色小圆环,它需要直接插合在电机尾部外露的轴上,并且会跟随着轴一起转动。

二、霍尔编码器原理简介:

霍尔编码器圆盘上分布有磁极,当圆盘随电机主轴转动时,会输出两路相位差90°的方波,用这两路方波可测出电机的转速和转向。

霍尔编码器一般是13线的,就是转一圈每项会输出13个脉冲,这个精度基本能够满足大部分使用场景的要求。

E1A和E1B是13线霍尔编码器的两个输出信号,用于输出轴旋转方向和位置信息。

E1A是正交方波信号,当轴逆时针旋转时,E1A会先于E1B产生信号变化,用于判断旋转方向。

E1B是正交方波信号,当轴顺时针旋转时,E1B会先于E1A产生信号变化,用于判断旋转方向。

两个信号数量相同,相位差90度,可以通过对信号的计数和相位差计算来确定轴的位置。

(三)、MG310电机参数:

由图可知,此电机带有的霍尔编码器是260线霍尔编码器。

(四)、线路连接:

 模块连接详细电路图——————手绘草图:

 TB6612与MSP432引脚连接详情:

AIN1___P2^4        PWMA___P7^6        BIN1___P2^6 

AIN2___P2^5        PWMB___P7^7        BIN2___P2^7 

PS:用到的是定时器TA1的通道0与通道1

实物连接图:

(五)、程序设计:

注意:

本次实验使用定时器A1输出PWM,对输出的PWM有占空比调整方面的需求,所以不能使用通道0,因为通道0的寄存器CCR0的值是计时基准,不可被修改,因此我选用通道1和2。

 实验程序设计功能解读:

1.通过矩阵按键控制电机A和B:

与电机A有关的控制:

S1控制正转 S2控制反转 S3控制加速(加占空比) S4控制减速(减占空比)S9控制停止

与电机B有关的控制:

S5控制正转 S6控制反转 S7控制加速(加占空比) S8控制减速(减占空比)S10控制停止

 2.通过串口打印当前 PWM_DIVA 与 PWM_DIVB 的值,帮助计算占空比:

 PWM_DIVA 与 PWM_DIVB 用于调整发送给电机A与B的占空比

当前A电机接收信号  占空比=PWM_DIVA/CCRO*100%

注:CCRO在后文会有计算得出,它等于99。

程序设计主要分为以下几部分:(此处建议快速浏览)

1.引脚位带定义与初始化函数的编写

// 位带操作
//定义引脚名称
#define AIN1   BITBAND_PERI(P2OUT,4)
#define AIN2   BITBAND_PERI(P2OUT,5)
#define BIN1   BITBAND_PERI(P2OUT,6)
#define BIN2   BITBAND_PERI(P2OUT,7)

#define PWMA   BITBAND_PERI(P8OUT,0)
#define PWMB   BITBAND_PERI(P7OUT,7)
//初始化控制TB6612 的引脚,定时器,中断	
void inint_TB6612(void)
{
		//初始化AIN BIN
	 MAP_GPIO_setAsOutputPin(GPIO_PORT_P2, GPIO_PIN4);
	 MAP_GPIO_setAsOutputPin(GPIO_PORT_P2, GPIO_PIN5);
	 MAP_GPIO_setAsOutputPin(GPIO_PORT_P2, GPIO_PIN6);
	 MAP_GPIO_setAsOutputPin(GPIO_PORT_P2, GPIO_PIN7);


//初始化定时器TA1 通道2	
		//1.配置GPIO复用
	GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P7,GPIO_PIN6,GPIO_PRIMARY_MODULE_FUNCTION);
	
	//2.配置结构体
	  Timer_A_PWMConfig TimA1_PWMConfig1;																//定义一个名为 TimA1_PWMConfig的结构体
	  TimA1_PWMConfig1.clockSource=TIMER_A_CLOCKSOURCE_SMCLK;						//时钟源
    TimA1_PWMConfig1.clockSourceDivider=CLKDIV;														//时钟分频 范围1~64
    TimA1_PWMConfig1.timerPeriod=CCR0;																//自动重载值
    TimA1_PWMConfig1.compareRegister=TIMER_A_CAPTURECOMPARE_REGISTER_2;//通道2(与引脚相关联)
    TimA1_PWMConfig1.compareOutputMode=TIMER_A_OUTPUTMODE_TOGGLE_SET;	//输出模式
    TimA1_PWMConfig1.dutyCycle=3;																		//此处可调占空比


//初始化定时器TA1 通道1
	//1.配置GPIO复用 
	GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P7,GPIO_PIN7,GPIO_PRIMARY_MODULE_FUNCTION);
	
	//2.配置结构体
	  Timer_A_PWMConfig TimA1_PWMConfig2;																//定义一个名为 TimA1_PWMConfig的结构体
	  TimA1_PWMConfig2.clockSource=TIMER_A_CLOCKSOURCE_SMCLK;						//时钟源
    TimA1_PWMConfig2.clockSourceDivider=CLKDIV;														//时钟分频 范围1~64
    TimA1_PWMConfig2.timerPeriod=CCR0;																//自动重载值
    TimA1_PWMConfig2.compareRegister=TIMER_A_CAPTURECOMPARE_REGISTER_1;//通道1(与引脚相关联)
    TimA1_PWMConfig2.compareOutputMode=TIMER_A_OUTPUTMODE_TOGGLE_SET;	//输出模式
    TimA1_PWMConfig2.dutyCycle=3;																		//此处可调占空比	
	
	//初始化定时器:
	Timer_A_generatePWM(TIMER_A1_BASE,&TimA1_PWMConfig2);
	Timer_A_generatePWM(TIMER_A1_BASE,&TimA1_PWMConfig1);
		
	AIN1=0;AIN2=0;BIN1=0;BIN2=0;	//初始化不转
}

2.PWM频率与占空比的计算

 我们首先要知道需要10kHz的PWM来驱动电机,其次根据公式计算CCR0值:

- PWM频率  =  时钟源频率  /  (时钟源除数值“时钟分频”  *  (CCR0值“自动重载值” + 1))   

 因而列出算式:10000=48000000/(48*(CCR0+1)) 

 计算得出CCR0=99;

此外定义好CCRO、CLKDIV用于结构体初始化定时器TA1

#define CCR1_MIN 3 与 #define CCR1_MAX 99 这俩句定义了占空比3%~100%

 #define DIV_PWM 3 定义了PWM_DIVA 与 PWM_DIVB 每次加减的分度为3,因为在四个函数都有PWM_DIVA 与 PWM_DIVB 的加减,加减几是最佳,起初不能确定,所以定义了它,到时修改十分方便!

//定义定时器中断需要的初始化变量
//定义调整占空比的变量
#define CLKDIV 48
#define CCR0 99
#define CCR1_MIN 3
#define CCR1_MAX 99

#define DIV_PWM 3

3.按键控制函数的编写:

uint8_t key_value;		

key_value = KEY4x4_Scan(0);
		switch(key_value)
		{
		case 1:set_A(1);break; //A电机正转
		case 2:set_A(2);break; //A电机反转
		case 3:speedup_A();printf("PWM_DIVA=%d\r\n",PWM_DIVA);break; //A电机加速
		case 4:speeddown_A();printf("PWM_DIVA=%d\r\n",PWM_DIVA);break; //A电机减速			
				
		case 5:set_B(1);break; //B电机正转
		case 6:set_B(2);break; //B电机反转
		case 7:speedup_B();printf("PWM_DIVB=%d\r\n",PWM_DIVB);break; //B电机加速
		case 8:speeddown_B();printf("PWM_DIVB=%d\r\n",PWM_DIVB);break;//B电机减速			
				
		case 9:set_A(0);break; //关闭A电机
		case 10:set_B(0);break; //关闭B电机			
				
			}

整体程序代码:

TB6612.c:

#include "TB6612.h"

uint16_t PWM_DIVA;
uint16_t PWM_DIVB;

//初始化控制TB6612 的引脚,定时器,中断	
void inint_TB6612(void)
{
		//初始化AIN BIN
	 MAP_GPIO_setAsOutputPin(GPIO_PORT_P2, GPIO_PIN4);
	 MAP_GPIO_setAsOutputPin(GPIO_PORT_P2, GPIO_PIN5);
	 MAP_GPIO_setAsOutputPin(GPIO_PORT_P2, GPIO_PIN6);
	 MAP_GPIO_setAsOutputPin(GPIO_PORT_P2, GPIO_PIN7);


//初始化定时器TA1 通道2	
		//1.配置GPIO复用
	GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P7,GPIO_PIN6,GPIO_PRIMARY_MODULE_FUNCTION);
	
	//2.配置结构体
	  Timer_A_PWMConfig TimA1_PWMConfig1;																//定义一个名为 TimA1_PWMConfig的结构体
	  TimA1_PWMConfig1.clockSource=TIMER_A_CLOCKSOURCE_SMCLK;						//时钟源
    TimA1_PWMConfig1.clockSourceDivider=CLKDIV;														//时钟分频 范围1~64
    TimA1_PWMConfig1.timerPeriod=CCR0;																//自动重载值
    TimA1_PWMConfig1.compareRegister=TIMER_A_CAPTURECOMPARE_REGISTER_2;//通道2(与引脚相关联)
    TimA1_PWMConfig1.compareOutputMode=TIMER_A_OUTPUTMODE_TOGGLE_SET;	//输出模式
    TimA1_PWMConfig1.dutyCycle=3;																		//此处可调占空比


//初始化定时器TA1 通道1
	//1.配置GPIO复用 
	GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P7,GPIO_PIN7,GPIO_PRIMARY_MODULE_FUNCTION);
	
	//2.配置结构体
	  Timer_A_PWMConfig TimA1_PWMConfig2;																//定义一个名为 TimA1_PWMConfig的结构体
	  TimA1_PWMConfig2.clockSource=TIMER_A_CLOCKSOURCE_SMCLK;						//时钟源
    TimA1_PWMConfig2.clockSourceDivider=CLKDIV;														//时钟分频 范围1~64
    TimA1_PWMConfig2.timerPeriod=CCR0;																//自动重载值
    TimA1_PWMConfig2.compareRegister=TIMER_A_CAPTURECOMPARE_REGISTER_1;//通道1(与引脚相关联)
    TimA1_PWMConfig2.compareOutputMode=TIMER_A_OUTPUTMODE_TOGGLE_SET;	//输出模式
    TimA1_PWMConfig2.dutyCycle=3;																		//此处可调占空比	
	
	//初始化定时器:
	Timer_A_generatePWM(TIMER_A1_BASE,&TimA1_PWMConfig2);
	Timer_A_generatePWM(TIMER_A1_BASE,&TimA1_PWMConfig1);
		
	AIN1=0;AIN2=0;BIN1=0;BIN2=0;	//初始化不转
}

//A电机加速
void speedup_A(void)
{
	PWM_DIVA+=DIV_PWM;
	if(PWM_DIVA>=99) {PWM_DIVA=CCR1_MAX;}
	MAP_Timer_A_setCompareValue(TIMER_A1_BASE,TIMER_A_CAPTURECOMPARE_REGISTER_2,PWM_DIVA);
}	
//B电机加速
void speedup_B(void)
{
	PWM_DIVB+=DIV_PWM;
	if(PWM_DIVB>=99) {PWM_DIVB=CCR1_MAX;}	
	MAP_Timer_A_setCompareValue(TIMER_A1_BASE,TIMER_A_CAPTURECOMPARE_REGISTER_1,PWM_DIVB);	
}	

//A电机减速
void speeddown_A(void)
{
	PWM_DIVA-=DIV_PWM;
	if(PWM_DIVA<=3) {PWM_DIVA=CCR1_MIN;}
	MAP_Timer_A_setCompareValue(TIMER_A1_BASE,TIMER_A_CAPTURECOMPARE_REGISTER_2,PWM_DIVA);	
}	
//B电机减速
void speeddown_B(void)
{
	PWM_DIVB-=DIV_PWM;
	if(PWM_DIVB<=3) {PWM_DIVB=CCR1_MIN;}
	MAP_Timer_A_setCompareValue(TIMER_A1_BASE,TIMER_A_CAPTURECOMPARE_REGISTER_1,PWM_DIVB);	
}	

//设置A电机正反转	0停转 1正 2反
void set_A(uint16_t i)
{
	switch(i)
	{
		case 0:AIN1=0;AIN2=0;break;
		case 1:AIN1=1;AIN2=0;break;
		case 2:AIN1=0;AIN2=1;break;		
	}
}

//设置B电机正反转	0停转 1正 2反
void set_B(uint16_t i)
{
	switch(i)
	{
		case 0:BIN1=0;BIN2=0;break;
		case 1:BIN1=1;BIN2=0;break;
		case 2:BIN1=0;BIN2=1;break;		
	}
}

 TB6612.h:

#ifndef _TB6612_h_ 
#define _TB6612_h_ 

#include <ti/devices/msp432p4xx/driverlib/driverlib.h>

//定义定时器中断需要的初始化变量
//定义调整占空比的变量
#define CLKDIV 48
#define CCR0 99
#define CCR1_MIN 3
#define CCR1_MAX 99

#define DIV_PWM 3

// 位带操作
//定义引脚名称
#define AIN1   BITBAND_PERI(P2OUT,4)
#define AIN2   BITBAND_PERI(P2OUT,5)
#define BIN1   BITBAND_PERI(P2OUT,6)
#define BIN2   BITBAND_PERI(P2OUT,7)

#define PWMA   BITBAND_PERI(P8OUT,0)
#define PWMB   BITBAND_PERI(P7OUT,7)

extern uint16_t PWM_DIVA;
extern uint16_t PWM_DIVB;


void inint_TB6612(void);

void speedup_A(void);
void speedup_B(void);

void speeddown_A(void);
void speeddown_B(void);

void set_A(uint16_t i);
void set_B(uint16_t i);



#endif

(六)、演示视频:

TB6612驱动MG310电机

(七)、整体测试工程下载链接:

链接无效尝试搜名称:MSP432驱动TB6612与D电机.rar

https://download.csdn.net/download/qq_64257614/87907150

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

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

相关文章

JavaSE基础语法--类和对象

在Java中&#xff0c;一切皆为对象&#xff0c;类和对象是一个抽象的概念。我们可以从面向过程来过渡到面向对象。 那么什么是面向过程呢&#xff1f; 举一个简单的例子&#xff0c;现实生活中&#xff0c;你需要买一台手机的时候会经历如下步骤&#xff1a; 这里的每一步都可…

【python程序设计】——期末大作业

【python程序设计】——期末大作业&#x1f60e; 前言&#x1f64c;一、所用技术&#xff1a;二、 系统设计三、 系统实现3.1 核心功能代码实现&#xff1a;3.2 演示结果展示 总结撒花&#x1f49e; &#x1f60e;博客昵称&#xff1a;博客小梦 &#x1f60a;最喜欢的座右铭&am…

yaffs格式的根文件系统制作

linux内核启动后&#xff0c;它接下来要做的事就是启动应用程序&#xff0c;而应用程序在哪里呢&#xff0c;类比windows&#xff0c;启动时要读取c盘&#xff0c;所以linux的文件系统就类似于c盘&#xff0c;并且我们使用的ls、cp等一些类命令&#xff08;本质是应用程序&…

JavaScript 手写代码 第二期

文章目录 1.为什么要手写代码&#xff1f;2. 手写代码2.1 手写实现判断类型函数2.1.1 前置知识2.1.1 手写实现 2.2 手写实现aplly,call,bind方法2.2.1 基本使用2.2.2 实现思路2.2.3 手写实现 1.为什么要手写代码&#xff1f; 我们在日常开发过程中&#xff0c;往往都是取出来直…

Linux(centos7)缺失.bashrc文件登录出现bash-4.2

一、问题描述 最近遇到几次登陆linux&#xff08;centos7.5&#xff09;系统后&#xff0c;虽然在/root用户下&#xff0c;但出现了如下界面&#xff1a; 二、解决思路 使用不同的linux发行版本&#xff0c;&#xff08;比如&#xff1a;IP为*...90,以下简称90&#xff09;会…

课程19:个人中心功能与提示优化

🚀前言 本文是《.Net Core从零学习搭建权限管理系统》教程专栏的课程(点击链接,跳转到专栏主页,欢迎订阅,持续更新…) 专栏介绍:以实战为线索,基于.Net 7 + REST + Vue、前后端分离,不依赖任何第三方框架,从零一步一步讲解权限管理系统搭建。 专栏适用于人群:We…

Android中加载一张大图,如何正常显示且不发生OOM ?

问题 在Android中&#xff0c;获取一个1000*20000(宽1000px&#xff0c;高20000px)的大图&#xff0c;如何正常加载显示且不发生OOM呢? 分析 Android系统会为应用分配一定大小的堆内存 而如果遇到高分辨率图片时&#xff0c;如果它的配置为ARGB(每个像素占4Byte) 那么它要消…

深度学习(23)——YOLO系列(2)

深度学习&#xff08;23&#xff09;——YOLO系列&#xff08;2&#xff09; 文章目录 深度学习&#xff08;23&#xff09;——YOLO系列&#xff08;2&#xff09;1. model2. dataset3. utils4. test/detect5. detect全过程 今天先写YOLO v3的代码&#xff0c;后面再出v5&…

【PCB专题】案例:PCB板厂说焊盘宽度太小容易沉金不良,但加宽又可能导致阻焊桥在阻焊为黑色油墨下无法做出?

此案例是最近在Layout一块PCB板卡,使用了一个以前我没有接触过的器件,此器件的封装是QFN128。 总的问题是:PCB板厂说如果按原稿制作的话,焊盘宽度太小沉金容易不良,但电话里和我说如果加宽又可能导致阻焊桥在黑色油墨情况下无法做出? 板厂给的EQ如下所示,表示TOP面设计…

【Unity之IMGUI】—编译模式下控件可视化及其封装

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;Uni…

【从零开始开发一个线上网课系统-01】账号登录及退出登录功能开发

文章目录 1 视图层开发2 form表单验证3 配置urls.py4 模板层开发 实际上在系统开发的博客中应该先描述数据库设计&#xff0c;但由于设计的表比较多&#xff0c;其理解简单&#xff0c;但撰写和描述较为麻烦&#xff0c;所以我以可视化方式来呈现这些数据表以及其中的关系&…

RISCV Reader笔记_1 RISCV的意义

RISCV Reader RISCV的诞生 出众之处 RISCV架构被设计的目的就是成为一个通用的指令集架构 ISA。不仅支持从微控制器到高性能计算机的各种处理器&#xff0c;兼容各种编程语言&#xff0c;还适应FPGA ASIC等所有实现技术&#xff0c;稳定…… 计算机体系结构为了在指令集更新…

Iceberg从入门到精通系列之一:Iceberg核心概念理解

Iceberg从入门到精通系列之一&#xff1a;Iceberg核心概念理解 一、Iceberg核心概念二、Iceberg表结构三、数据文件四、表快照Snapshot五、清单列表Manifest list六、表快照、数据文件和清单列表之间的关系七、Catalog八、Hive Catalog九、Hadoop Catalog十、Hive Catalog和Had…

Alamouti,MRC以及beam三种方式的误码率对比MATLAB仿真程序

Alamouti,MRC以及beam三种方式的误码率对比MATLAB仿真程序 完整程序: clc; clear; close all; warning off; addpath(genpath(pwd)); %%%%%%%%%%%%%%%%%%%%%%%%% Initialization %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% N = 10^6; r_n = rand(1,N)>0.5; BPSK = 2*r_n-1; E_n_d…

chatgpt赋能python:Python生成GUI的步骤和工具

Python生成GUI的步骤和工具 Python是一种广泛使用的编程语言&#xff0c;其语法简洁、易学、可读性强等特点深受程序员喜爱。 Python的GUI编程让我们可以为用户提供友好的界面&#xff0c;帮助用户更好地理解和使用程序。Python生成GUI的过程并不复杂&#xff0c;本文将为您介…

代码随想录算法训练营第42天 | 01背包问题理论基础 + 416.分割等和子集

今日任务 目录 01背包问题 二维数组 01背包问题 一维/滚动数组 416.分割等和子集 - Medium 01背包问题 二维数组 理论基础&#xff1a;代码随想录 01 背包 有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品…

课程18:角色权限功能实现

🚀前言 本文是《.Net Core从零学习搭建权限管理系统》教程专栏的课程(点击链接,跳转到专栏主页,欢迎订阅,持续更新…) 专栏介绍:以实战为线索,基于.Net 7 + REST + Vue、前后端分离,不依赖任何第三方框架,从零一步一步讲解权限管理系统搭建。 专栏适用于人群:We…

chatgpt赋能python:Python生成C++代码-提高生产力的利器

Python 生成 C 代码 - 提高生产力的利器 Python 作为一种高级编程语言&#xff0c;在数据分析、机器学习等领域都有着广泛的应用。但是&#xff0c;Python 被认为速度慢&#xff0c;无法处理一些高性能的任务。此时&#xff0c;C这种低级语言就被用来替代 Python&#xff0c;以…

实战:构建工具-共享库配置实践-2023.6.22(测试成功)

实战&#xff1a;构建工具-共享库配置实践-2023.6.22(测试成功) 目录 推荐文章 https://www.yuque.com/xyy-onlyone/aevhhf?# 《玩转Typora》 实验环境 gitlab/gitlab-ce:15.0.3-ce.0 jenkins/jenkins:2.346.3-2-lts-jdk11实验软件 链接&#xff1a;https://pan.baidu.com/…

Flutter Dart操作符

常见的操作符大家都知道就不多介绍了&#xff0c;主要来看看Java所没有的。 类型判定操作符 as、 is、 和 is! 操作符是在运行时判定对象 类型的操作符 操作符解释as类型转换is如果对象是指定的类型返回 Trueis!如果对象是指定的类型返回 False as 操作符把对象转换为特定的类…