脉冲宽度调制pdm_STM32第七章-脉冲宽度调制

8be56a0f5dc3c048a222fc7eda4a9d59.png

先说在开头啊,我们学习定时器总感觉它是很难的,这里我就不说他的编程难度,而是对于它的理解难度。学习定时器你就必须了解他的来龙去脉。

比如说你现在要使用一个定时器,那么先要决定你要用哪一个定时器,是高级定时器还是通用定时器呢?假如你要用高级定时器(TIM1 、TIM8),那他和通用定时器有啥区别呢?在程序中我们如何来体现他们的区别呢?第二个你要关心的就是你使用的定时器是多少位的,一般有16位和32位区分。比如TIM1就是16位,那么他的最大计数个数就是2^16=65536-1, 也就是说你的TIM_TimeBaseStructure.TIM_Period = X ;其中X最大值为65535,你不能高于它。但是如果你使用TIM2就是32位,那么他的最大计数个数就是2^32=4294967296-1,也就是说你的TIM_TimeBaseStructure.TIM_Period = X ;其中X最大值为4294967295,你不能高于它。 第三就是你要清楚你使用的这个定时器的时钟来源是哪里,一般来说我们高级定时器(TIM1、TIM8)的时钟来源是来自AHB2,你可以这样记:高级定时器的时钟频率肯定高于通用定时器的时钟频率对吧,又因为2>1,所以高级定时器的时钟来源是来自AHB2对吧,那么通用定时器的时钟源就来自AHB1了对吧。

在这里还要注意的是STM32中除非APB1的时钟分频数设置为1,否则通用定时器TIMx的时钟是 APB1时钟的2倍,当 APB1 的时钟不分频的时候,通用定时器 TIMx 的时钟就等于APB1 的时钟。这也就解释了下面我使用TIM3是通用定时器,挂载在 APB1上,而 APB1是36MHz,通用定时器TIMx的时钟是 APB1时钟的2倍,所以TIM3的定时器是72MHZ 计算。只有把这些该清楚了才能续的下去,当然远不止这一下。

上一章我们说到了定时器,这一章称热打铁热说一说脉冲宽度调制-PWM。 脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。简单一点,就是对脉冲宽度进行控制。

0c4237413551a8bd99753169c83c9078.png

看到这个图,我先想聪明的你马上会想到,这个玩意一定有两个寄存器ARR和CRRx,而这两个值一定是需要自己设置的,图上都标出来了,对吧。 我们假定定时器工作在向上计数 PWM模式,且当 CNT<CCRx 时,输出 0,当 CNT>=CCRx 时输出 1。那么就可以得到如上的 PWM示意图:

  • 当 CNT 值小于 CCRx 的时候,IO 输出低电平(0),
  • 当 CNT 值大于等于 CCRx 的时候,IO 输出高电平(1),
  • 当 CNT 达到 ARR 值的时候,重新归零,然后重新向上计数,依次循环。 改变 CCRx 的值,就可以改变 PWM 输出的占空比,改变 ARR 的值,就可以改变 PWM 输出的频率,这就是 PWM 输出的原理。所以说对于PWM我们只要在程序中修改这两个值就可以了,其他的都一样。

STM32F429 的定时器除了 TIM6 和 7。其他的定时器都可以用来产生 PWM 输出。 直接开搞,来看一下定时器的分类,这是F4的定时器分配图

b0a802311b04e4e595a21b192c67604b.png

这里还要知道一个概念就是通道

通道是什么,我们换个说法,通道=路=引脚,这样是不是好理解一点,也就是说TIM2有4路定时器。TIM5也有4路,TIM3也有4路,TIM4也有4路。为什么要这么多路呢? 比如我们要产生8路周期,占空比都不同的PWM信号输出,那我们可以选TIM2的 CH1/CH2/CH3/CH4 还有TIM3 的CH1,CH2,CH3,CH4 这8路进行输出,需要这么多路,就是为了可以输出/输入 更多的信号。比如你用小舵机做一个小机器人就需要很多的定时器对应很多的通道也就是对应很多引脚。输出的信号分别是哪些管脚呢。很明显对F4来说就是 TIM2的 CH1/CH2/CH3/CH4 对应 PA5 /PA1/PA2/PA3 这4个管脚。 TIM5的 CH1/CH2/CH3/CH4 对应 PH10/PH11/PH12/PIO 这4个管脚。

要使 STM32F429 的通用定时器 TIMx 产生 PWM 输出,除了上一章介绍的寄存器外,我们还会用到4个寄存器,来控制 PWM 的。这三个寄存器分别是: 捕获/比较模式寄存器(TIMx_CCMR1/2) 捕获/比较使能寄存器(TIMx_CCER) 捕获/比较寄存器(TIMx_CCR1~4) 刹车和死区寄存器(TIMx_BDTR)这个寄存器一般在高级定时器中使用,就是TIM1和TIM8。如果你没用到这两个定时器就不要管这个寄存器了。脉冲宽度调制模式可以生成一个信号,该信号频率由 TIMx_ARR 寄存器值决定,其占空比则由 TIMx_CCRx 寄存器值决定。

寄存器讲解

捕获/比较模式寄存器(TIMx_CCMR1/2)

该寄存器一般有 2 个:TIMx _CCMR1和 TIMx _CCMR2。TIMx_CCMR1 控制 CH1 和CH2,而 TIMx_CCMR2 控制 CH3 和 CH4

ce3212797e205ea06b88aa6ac8a86b0c.png

这个寄存器我们关心的是 位14 13 12位 9 8,其他的默认就可以了。 模式设置位 OC4M,此部分由 3位组成。总共可以配置成 7 种模式,我们使用的是 PWM 模式,所以这 3 位必须设置为 110/111。这两种 PWM 模式的区别就是输出电平的极性相反。另外 CC4S 用于设置通道的方向(输入/输出)默认设置为00,就是设置通道作为输出使用。

捕获/比较使能寄存器(TIM3_CCER)

使能寄存器见名知意,当然是使能TIM3定时器的啊。使CC4E置位为1就可以了。

b449cca0de3df094e46dbdbd70ba8c5b.png

捕获/比较寄存器(TIMx_CCR1~4)

该寄存器总共有 4 个,对应 4 个通道 CH1~4。我们使用的是通道3。在输出模式下,该寄存器的值与 CNT 的值比较,根据比较结果产生相应动作。利用这点,我们通过修改这个寄存器的值,就可以控制 PWM 的输出脉宽了。

b9eafc8d223f82a3cb6b2bfdb9121e18.png

程序代码配置

我们文本的例子是定时器3的通道3,对应PB0管脚。

1.开启TIM3时钟,配置 PB0

要使用 TIM3,我们必须先开启 TIM3的时钟,这点相信大家看了这么多代码,应该明白了。这里我们还要配置 PB0 为复用输出(当然还要时能 GPIOB的时钟),这是因为 TIM3_CH3通道将使用 PB0的复用功能作为输出,我们配置 PB0为复用输出,才可以实现 TIM3_CH3的 PWM 经过 PB0输出。

GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);    //使能TIM外设时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE);  //使能GPIO外设时钟                                                                   
//设置该引脚为复用输出功能,输出TIM3 CH3的PWM脉冲波形
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;         //TIM3_CH3
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);

2.设置 TIM3的ARR和PSC

在开启了 TIM3的时钟之后,我们要设置 ARR 和 PSC 两个寄存器的值来控制输出 PWM 的周期。这在库函数是通过 TIM_TimeBaseInit 函数实现的,在上一节定时器中断章节已经有讲解过,这里就不详细讲解,调用的格式为:

TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
TIM_TimeBaseStructure.TIM_Period = 100;     
TIM_TimeBaseStructure.TIM_Prescaler =360-1;  
TIM_TimeBaseStructure.TIM_ClockDivision = 0;  //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位

对于上面的参数解释一下: ①频率:我们使用的APB1时钟源是72MHz的,在此我们不做分频,通过配置相关的参数来设置输入频率,计算方法:输入频率=APB1时钟/(预分频系数+1)=72 000 000Hz/360=200 000Hz =200KHZ。 ②TIM_TImeBaseStructure.TIM_Period参数决定了输出PWM波形的频率,输出PWM波形的频率=定时器的输入频率/TIM_TImeBaseStructure.TIM_Period,这里我们设置设置的周期为200 000Hz/100=2000Hz,即0.5ms一个周期。 如果你想修改你的输出PWM波形的频率按我上面自己配置即可。

3.设置TIM3_CH3的PWM模式及通道方向, 使能 TIM3的CH3输出

接下来,我们要设置 TIM3_CH3为 PWM 模式,我们要通过配置 TIM3_CCMR2的相关位来控制 TIM3_CH3 的模式。在库函数中,PWM 通道设置是通过函数 TIM_OC1Init()~TIM_OC4Init()来设置的,不同的通道的设置函数不一样,这里我们使用的是通道 3,所以使用的函数是 TIM_OC3Init()。这里的结构体我就不多少了,自己看一下就可以明白,对于普通定时器我们只需要设置下面这四个参数就可以了。

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_Pulse = 500;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
TIM_OC3Init(TIM3, &TIM_OCInitStructure);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx

③配置占空比:占空比=配置占空比的值/ TIM_TImeBaseStructure.TIM_Period,这里的占空比为50/100=50% 。50%的占空比那么波形也一定是一半高一半低对吧,一会我们仿真看一看。

4使能TIM3

所有的都配置完了,最后能一下TIM3。

TIM_Cmd(TIM3, ENABLE);//使能TIM3

5.使能基本定时器3的预装载值。

使能TIM3在CCR3上的预装载寄存器

TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);  使能TIM3在CCR3上的预装载寄存器,即TIM3_CCR3的预装载值在更新事件到来时才能被传送至当前寄存器中。
TIM_ARRPreloadConfig(TIM3, ENABLE); //使能TIM3在ARR上的预装载寄存器 (影子寄存器)

这里我们来讲一下影子寄存器: 1.有影子寄存器的有3个:分频寄存器PSC,自动重装载寄存器 ARR,自动捕获CCRx(x是对应的通道),注意,PSC,ARR,CCRx不是影子寄存器,而是它们对应的“预装载寄存器”; 2、影子寄存器才是真正起作用的寄存器,但是ST没有提供这个寄存器出来,只是提供出与之相对应的预装载寄存器,分别为“PSC,ARR,CCRx” 3、我们用户能接触到,能修改或读取的都是预装载寄存器,ST只是把它们开放出来(影子寄存器并没有开放给用户),其实就是ARR寄存器,如:TIM3->ARR 4、从预装载寄存器ARR传送到影子寄存器,有两种方式,一种是立刻更新,一种是等触发事件之后更新;这两种方式主要取决于寄存器TIMx->CR1中的“APRE”位;

  • APRE=0,当ARR值被修改时,同时马上更新影子寄存器的值;
  • APRE=1,当ARR值被修改时,必须在下一次事件发生后才能更新影子寄存器的值; 5、怎么样马上立刻更改影子寄存器的值,而不是下一个事件;方法如下:
  • 将ARPE=0,TIM_ARRPreloadConfig(TIM3, DISABLE );
  • 在ARPE=1,TIM_ARRPreloadConfig(TIM3, ENABLE);

9eab52e61949f00f75d84bd599fa257e.png

TIM_ARRPreloadConfig设置为DISABLE 和ENABLE的问题,他的作用只是允许或禁止在定时器工作时向ARR的缓冲器中写入新值,以便在更新事件发生时载入覆盖以前的值。在开始初始化的时候你已经把" TIM_TimeBaseStructure.TIM_Period=100; //ARR的值 ",后来也一直是这个值,原因是你没有编写中断服务函数或者你在中断服务函数中根本就没有给ARR缓冲器重新写入新值,所以设置为DISABLE 和ENABLE都没有影响,但是最保险的方法就是是能一下。

汇总一下代码:

void TIM3_PWM_Init()
{  GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;TIM_OCInitTypeDef  TIM_OCInitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //使能TIM时钟   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE);//使能GPIO外设时钟                                                                       //设置该引脚为复用输出功能,输出TIM3 CH3的PWM脉冲波形GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;         //TIM3_CH3GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure); TIM_TimeBaseStructure.TIM_Period = 100; //输出PWM波形的频率=定时器的输入频率/TIM_TImeBaseStructure.TIM_Period,200 000Hz/100=2000Hz,即0.5ms一个周期 TIM_TimeBaseStructure.TIM_Prescaler =360-1;//不分频 输入频率=APB1时钟/(预分频系数+1)=72 000 000Hz/360=200 000Hz =200K TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_timTIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能TIM_OCInitStructure.TIM_Pulse = 50; //占空比=配置占空比的值/TIM_TImeBaseStructure.TIM_Period,500/1000=50% TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高TIM_OC3Init(TIM3, &TIM_OCInitStructure);  TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);  //CH3预装载使能 TIM_ARRPreloadConfig(TIM3, ENABLE); //使能TIM3在ARR上的预装载寄存器 (影子寄存器)  TIM_Cmd(TIM3, ENABLE);  //使能TIM3   
}

6.主函数的编写

主函数就很简单,一个while函数就可以解决。

 int main(void){ SystemInit ();  TIM3_PWM_Init();while(1){} 
}

根据而上一章讲到的方法keil中调试一下,可以清楚地看到周期是0.5ms,跟我们上面设置的一样。占空比也是50%,就是1/2。

654acc516eb10b79962761bb7c29494e.png

当然我们这里设置的PWM波是死的,也就是说是固定的50%。那么这实际项目中我们一般是要求可变的PWM,最典型的就是控制电机的转速。举一个例子,下面是电机的驱动芯片就是TB6612的管脚分配图。

TB6612引脚分配:
VM         PWMA--------->TIM3_CH3(PBO)
VCC        AIN2--------->GPIOB_12
GND        AIN1--------->GPIOB_13
AO1        STBY--------->GPIOB_14
AO2        BIN1--------->GPIOB_15
BO2        BIN2--------->GPIOA_12
BO1        PWMB--------->TIM3_CH4(PB1)

在这里我们用GPIOB_12和GPIOB_13的电平高低来控制电机的前进后退,具体的电平高低要看真值表。用TIM3_CH3(PB0)来控制电机的转速。设置不同的值,电机的转速就是有快有慢。那么用哪一个函数来控制呢?

void TIM_SetCompare1(TIM_TypeDef* TIMx, uint16_t Compare1);

理所当然,对于其他通道,分别有一个函数名字,函数格式为 TIM_SetComparex(x=1,2,3,4)。现在我们就可以控制 TIM3 的 CH3 输出 PWM 波了。也就是一个轮子的转速快慢了。这里我用一个小小的if语句来使定时器3的通道3的值发生变化。

 int main(void){ u16 i=0;  SystemInit ();  TIM3_PWM_Init();while(1){i++;TIM_SetCompare3(TIM3,i);   //定时器3的通道3  if(i==100) i=0;} 
}

下面看一下效果:

34fc33efcf5ac7d7f16574ea7ddbb790.png

可以明显的看到PWM波在不断地变化,那就对应电机转速的变化或者小灯的明暗程度。

至此我们就明白是STM32是如何输出PWM的。这里我们来总结一下: 我们输出PWM用到了定时器3,用TIM_Period 和TIM_Prescaler来确定输出PWM的频率和周期.用TIM_Pulse来确定占空比。 如果你单纯的使用定时器3做定时功能那么TIM_Period 和TIM_Prescaler来确定需要定时的时间,也就是多长时间进入一次中断服务函数执行相应的指令。只是在不同的地方叫法不同,本质还是一样的。 聪明的你会了吗?

ccb6ec53d05d1f092f95268ac85d07b0.png

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

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

相关文章

苹果13系统锁屏延迟_iPhone11 锁屏出现延迟,iOS13 新 Bug?

点击 哎咆科技 关注我们这两天很多人在后台反应&#xff0c;用 iPhone11 锁屏的时候出现了延迟的情况。虽然延迟并不是很长&#xff0c;但还是会有“卡顿”的感觉。咆哥&#xff1a;我最近也感觉到了。于是很多同学认为&#xff0c;是不是 iOS13 系统的问题&#xff1f;你们多虑…

ctf 改变图片高度_每天一分钟,python一点通(opencv的图片处理方法)

有网友私信小编说&#xff0c;小编的文章很好&#xff0c;讲解的也很详细&#xff0c;但是有些知识点很深奥&#xff0c;对初学者不是很友好&#xff0c;回想小编的文章虽然几乎每条代码都有介绍&#xff0c;但是很多函数没有太详细&#xff0c;小编后期会重启《每天一分钟&…

计算机休眠能降低硬件损耗,Win7居然会出现“失眠”——Win7无法休眠问题解析...

许多用户在安装了win7以后&#xff0c;都出现了无法使用休眠功能的问题&#xff0c;当用户暂时不使用电脑或离开电脑时&#xff0c;系统不能进入休眠状态&#xff0c;使得节电与减少硬件损耗都不能正常进行&#xff0c;显示器也会长时工作&#xff0c;这加速了电脑的整体老化。…

4键电子手表说明书_数字S1系统7寸门口主机操作说明书

1.产品概述随着社会发展的日新月异&#xff0c;人们的生活开始步入网络时代&#xff0c;数字化浪潮席卷了各行各业&#xff0c;传统的楼宇对讲产品也逐渐朝着数字化、网络化、信息化和智能家居的方向发展&#xff0c;它不再只扮演一个访客身份确认系统的角色&#xff0c;而是成…

重构html布局,HTML重构:战术篇

上文书我们说到《HTML重构&#xff1a;战略篇》&#xff0c;书接前言下面是战术篇&#xff0c;我们通过路线图来先有一个大体印象&#xff1a;1、HTML规范化(Well-Formedness)&#xff1a;语法正确2、HTML Validity &#xff1a;语义正确3、不仅仅是语义正确&#xff1a;HTML元…

enas 参数共享_CVPR2020 | CARS: 华为提出基于进化算法和权值共享的神经网络结构搜索,CIFAR10上仅需单卡半天...

点击上方“CVer”&#xff0c;选择加"星标"或“置顶”重磅干货&#xff0c;第一时间送达本文转载自&#xff1a;晓飞的算法工程笔记为了优化进化算法在神经网络结构搜索时候选网络训练过长的问题&#xff0c;参考ENAS和NSGA-III&#xff0c;论文提出连续进化结构搜索…

gradle引入子module配置_原创 | 看完此文,你对Gradle的理解又升级了

前言这一篇来介绍一些Gradle进阶的内容&#xff0c;当然进阶内容非常多&#xff0c;这篇文章就总结一些相对重要的、常用的一些知识点&#xff0c;比如Gradle的签名配置和依赖管理。1.Android签名文件配置在一般公司中&#xff0c;当团队比较小的时候&#xff0c;App的签名信息…

怎樣制作线段动画_OPPO又开发布会!这两个PPT动画太炫了,荣获网友清一色好评...

前两天&#xff0c;OPPO在线上发布了find X2系列&#xff0c;观看发布会直播的时候&#xff0c;真的有被发布会的开场惊艳到&#xff0c;视觉体验太震撼了。这是我随便录的一个动画&#xff0c;满满的视觉冲击力&#xff1a;在看完发布会之后&#xff0c;我对整场发布会印象最深…

文件服务器的文件设置只读,服务器设置文件为只读

服务器设置文件为只读 内容精选换一换有&#xff0c;该NTP服务器仅限于在华为云控制台上购买的弹性云服务器安装使用。如需在购买的弹性云服务器上安装NTP服务器&#xff0c;您可以选择使用华为云控制台自己提供的NTP服务器&#xff0c;也可以选择其他NTP服务器。安装NTP服务器…

手机修改ntp服务器地址,修改手机ntp服务器ip地址

修改手机ntp服务器ip地址 内容精选换一换本文介绍使用云手机服务时需要了解的基本概念。云手机是一台包含原生安卓操作系统&#xff0c;具有虚拟手机功能的云服务器&#xff0c;简单来说&#xff0c;云手机云服务器Android OS。您可以远程实时控制云手机&#xff0c;实现安卓AP…

window10维护不了华为服务器,win10怎么打开云服务器异常

win10怎么打开云服务器异常 内容精选换一换本节介绍如何查看云服务器的mac地址。云服务器的mac地址不支持修改。登录Linux云服务器。执行以下命令&#xff0c;查看云服务器的mac地址。ifconfig查看MAC地址ifconfig登录Linux云服务器。执行以下命令&#xff0c;查看云服务器的ma…

命令行cd到_前端(只)需要掌握这些命令行(就还行了)

练习windows 用户在任意目录使用 shift 右键 打开 cmd 或者 powershell&#xff1b;或通过其他方式打开命令行cd ~/Desktop 回车恭喜你在命令行里进入了桌面输入命令 mkdir demo1cd demo1 进入目录cd .. 回退到桌面rm -rf demo1 删除目录&#xff0c;其中 -r 表示递归地删除路…

工况密度和标况密度怎么换算_什么是载流量?导线的载流量与电流密度怎么计算?图文详解!...

(1)导线规格在国标《GB/T3956-2008 电缆的导体》中&#xff0c;我们能看到国家对电缆导线的截面积进行标准化。按照国标规定&#xff0c;标称的电缆导线规格如下(单位mm2)&#xff1a;0.5、0.75、1、1.5、2.5、4、6、10、16、25、35、50、70、95、120、150、185、240、300、400…

卸载cuda_NVIDIA驱动和CUDA安装

切换到集成显卡&#xff08;X.Org X server&#xff09;2. 卸载旧驱动sudo apt-get --purge remove nvidia* sudo apt autoremove # To remove CUDA Toolkit: $ sudo apt-get --purge remove "*cublas*" "cuda*" # To remove NVIDIA Drivers: $ sudo apt-g…

html加粗字体打印失效_论文格式要求及字体大小

点击上方“蓝字”带你去看小星星论文既是探讨问题进行学术研究的一种手段&#xff0c;又是描述学术研究成果进行学术交流的一种工具。下面小编为大家整理了论文格式要求及字体大小&#xff0c;欢迎阅读。1 02封面题目&#xff1a;小二号黑体加粗居中。各项内容&#xff1a;四号…

deepfakes怎么用_[mcj]deepfakesApp使用说明(1)

在众多AI换脸软件中Fakeapp是传播最广&#xff0c;操作最简单的一款&#xff0c;当然他同样也是源于Deepfakes。 这款软件在设计上的确是花了一些心事&#xff0c;只需稍加点拨&#xff0c;哪怕是再小白的人也能学会。下面我就做一个入门教程吧。跟着这个教程来&#xff0c;你肯…

alert 标题_[SwiftUI 知识碎片] Button、Image 和 Alert

译自 Buttons and images更多内容&#xff0c;欢迎关注公众号&#xff1a;Swift花园喜欢文章&#xff1f;不如来个 ➕三连&#xff1f;关注专栏&#xff0c;关注我 Button 和 Image在 SwiftUI 中&#xff0c;按钮可以由两种方式创建&#xff0c;取决于它们的外观。最简单的方式…

mysql数据存储到指定位置_Mysql数据库表分区存储到指定磁盘路径

. 前提&#xff1a;mysql5.6.6以上的版本以上的版本才支持单表指定目录&#xff0c;且目录权限是MySQL:mysql。 在mysql中数据文件存放于在my.cnf中datadir指定的路径&#xff0c;使用的表引擎不同产生的文件格式、表文件个数也会有所差异。 mysql的表引擎有多种&#xff0c;…

roslyn分析字符串代码_.NET 5 源代码生成器——MediatR——CQRS

在这篇文章中&#xff0c;我们将探索如何使用.NET 5中的新source generator特性&#xff0c;使用MediatR库和CQRS模式自动为系统生成API。中介者模式中介模式是在应用程序中解耦模块的一种方式。在基于web的应用程序中&#xff0c;它通常用于将前端与业务逻辑的解耦。在.NET平台…

mysql2008怎么重装_SQL Server2005、2008如何彻底删除卸载并重新安装?

很多小伙伴在删除SQL Server后重新安装总是遇到诸多问题导致安装失败&#xff0c;这是因为你没有将SQL Server彻底删除卸载完毕。本文就如何彻底卸载进行详细介绍&#xff0c;本文以SQL Server2008为例&#xff0c;2005的方法相似。方法/步骤1.按照传统方法将SQL Server 2005、…