6、基于STM32呼吸灯(PWM)

2023-11-19

之前定时器中有提到输入和输出比较部分
https://blog.csdn.net/qq_45764141/article/details/125286260
参考有江科大自化协的视频和正电原子的视频

这个文章主要讲输出部分

一、OC(Output Compare)输出比较

在这里插入图片描述

输出比较可以通过比较CNT与CCR寄存器值的关系,来对输出电平进行置1、置0或翻转的操作,用于输出一定频率和占空比的PWM波形。

每个高级定时器和通用定时器都拥有4个输出比较通道(即上图中的TIMx_CH1 ~ 4) 高级定时器的前3个通道额外拥有死区生成和互补输出的功能

在这里插入图片描述

CRR是这里,就是捕获/比较寄存器。有四个输出比较通道,可以同时输出四路PWM波形,这四个通道有名自的CCR寄存器。但它们共用一个CNT计数器。最右边的部分可用于驱动三相无刷电机。

二、PWM波形

1、简介

PWM (Pulse Width Modulation)脉冲宽度调制
在具有惯性的系统中,可以通过对一系列脉冲的宽度进行调制,来等效地获得所需要的模拟参量,常应用于电机控速等领域。

也就是说,使用这个PWM波形,是用来等效地实现一个模拟信号的输出。
比如我们以一个很快的频率给电机进行通电、断电,那么电机的速度就能维持在一个速度中。
LED在熄灭时,由于余晖和人眼视觉暂留现象,LED不会应马熄灭。而是有定的惯性,过一小段时间才会熄灭。电机也是。当电机断电时。电机的转动不会立马停止。这就是惯性的系统

在这里插入图片描述
这种高低电平跳变的数字信号可等效于中间的这个紫色的虚线所表示的模拟量
(我的理解是,在一个周期中,高电平的时间占的比例比较多,那么就是显示为高电平,当高电平占的比例比较少,就显示为低电平。宏观上体现为
当上面电平时间长一点,下面电平时间短一点的时候,模拟量偏向于上面
当下面电平时间长一点,上面电平时间短一点的时候,模拟量偏向于下面)

定义
在这里插入图片描述一个高低电平是一个周期,周期的倒数就是频率
PWM的频率越快,等效模拟信号就越平稳。不过时间的开销就越大。(我的理解就是,变得越快越不容易发现,但是TS会增大)
般来说PWM的频率都在几KHz到几十KHz

占空比是高电平占周期的比例
占空比为100%,那就是高电平不变。占空比为0%,那就是低电平不变。
占空比决定了PWM等效出来的模拟电压的大小,占空比越大,那等效的模拟电压就钺趋近高电平。占空比越小,那等效的模拟电压就越战趋近于低电平。
比如5v,50%的占空比就是2.5v,20%的占空比就是1v。

分辨率是指占空比变化步距,一般要求不高的话,1%的分辨率够用了

2、分析捕获/比较通道的输出部分

在这里插入图片描述
在这个图的左边输入的数据就是CNT和CRR1,他们进行比较,当满足CNT>CRR1CNT=CRR1时,进入输出模式控制器。
输出模式控制器改变它输出OC1ref(reference参考信号)的高低电平。
接着这个ref信号往后转递。
首先他可以转递到上部分的主模式控制器中。可以把这个ref映射到主模式的TRGO输出上去。
主要是进行下面这一路。
这一个模块是一个极性选择电路。如果给CC1P写0,信号往上走,电平信号不反转。来啥样走啥样。如果给CC1P写1,信号进入下面一路,通过非门取反,电平信号反转。
这就是进行极性选择,就是选择要不要反转高低电平。
然后进入使能电路,决定要不要输出。
然后进入OC1引脚,就是TIMx_CH1通道的引脚,通过对引脚定义的查询可以知道具体是对应哪个GPIO口。

然后来细看一下输出比较模式控制器,这个是这个电路中非常重要的部分。
在这里插入图片描述
在这个模块里面可以选择多种模式来更加灵活地控制ref的输出,通过下面的寄存器进行配置。
在这里插入图片描述
第一个模式是冻结模式,即CNT=CCR时维持原状态。假如你正在输出PWM波形,想暂停,可以设置成这个模式。切换为冻结模式后,输出暂停。并且高低电平维持暂停时的状态保持不变。

接下来的2,3,4模式,配时置有效电平,配时置无效电平,匹配时电平翻转。这个有效电平和无效电平。一般是高级定时器里面的一个说法,可以暂且理解为,置有效电平就是置高电平。置无效电平就是置低电平。第四个模式匹配时电平翻转可以方便得输出一个频率可调且占空比始终为50%的波形。

第五、六个模式强制为无效电平和强制为有效电平。这两个模式和冻结模式相似。如果你想暂停波形输出,并且在暂停期间保持低电平或者高电平,就可以设置成这两个强制输出模式。

最后的两个模式也是最有用的模式,他们可以用于输出频率和占空比都可调的PWM波形。PWM模式1和PWM模式2只有ref置有效电平和无效电平换了一下。PWM模式2实际上就是PWM1模式输出的取反。

3、PWM模式1下入如何输出频率和占空比均可调节的波形

输出的基本结构
在这里插入图片描述
首先是定时器里讲过的配置好时基单元,这里不需要中断所以没有中断。
然后来到捕获/比较器,这里的CCR是我们自己设定的,CNT不断自增运行并进行比较。当CNT<CCR时,ref置有效电平。CNT>=CCR时,ref置无效电平。(就是高、低电平)
在这里插入图片描述
这个蓝色的线就是不断自增的CNT,黄色的线就是重载值
这条红色的线就是CCR,是可以设定的。当我们设定CCR为30时
当蓝线低于黄线,就是CNT<CCR时,ref置高电平。
当蓝线高于黄线,就是CNT>=CCR时,ref置低电平。
就得到了下图绿色线的输出。
并且CCR时可以改变的,也就是说,占空比是可以改变的。所以也就是说这个波形是可以一直改变的。

所以这样得出的ref值再通过极性选择,输出使能,最终通向GPIO口。

4、计算公式

首先重载值为ARR
在这里插入图片描述

PWM频率 = 计数器溢出频率
CK_PSC(预分频器的值), PSC(分频赋的值),ARR(重装载寄存器的值)
PWM频率 = CK_PSC / (PSC+1)/(ARR+1)

PWM占空比 = CCR / (ARR + 1)

分辨率 = 1 / (ARR + 1)

三、 代码

1、部分函数介绍

还是在上一节定时器的地方,stm32f10x_tim.h

OC1,OC2,OC3,OC4每个函数配置一个单元,第一个参数选择定时器,第二个参数设置结构体内的数据。

void TIM_OC1Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
void TIM_OC2Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
void TIM_OC3Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
void TIM_OC4Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);

给上述输出比较结构体赋默认值

void TIM_OCStructInit(TIM_OCInitTypeDef* TIM_OCInitStruct);

用来配置强制输出模式

void TIM_ForcedOC1Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction);
void TIM_ForcedOC2Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction);
void TIM_ForcedOC3Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction);
void TIM_ForcedOC4Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction);

配置CCR寄存器预装功能。
这个预装功能。就是影子寄存器,
就是你写入的值不会立即生效。而是在更新事件才会生效

void TIM_OC1PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);
void TIM_OC2PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);
void TIM_OC3PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);
void TIM_OC4PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);

配置快速使能

void TIM_OC1FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast);
void TIM_OC2FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast);
void TIM_OC3FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast);
void TIM_OC4FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast);

在这里插入图片描述

void TIM_ClearOC1Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear);
void TIM_ClearOC2Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear);
void TIM_ClearOC3Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear);
void TIM_ClearOC4Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear);

在这里插入图片描述
单独修改输出极性

void TIM_OC1PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);
void TIM_OC1NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity);
void TIM_OC2PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);
void TIM_OC2NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity);
void TIM_OC3PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);
void TIM_OC3NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity);
void TIM_OC4PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);

单独修改输出使能参数

void TIM_CCxCmd(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_CCx);
void TIM_CCxNCmd(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_CCxN);

选择输出比较模式

void TIM_SelectOCxM(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_OCMode);

单独更改CCR寄存器值得函数,可以在运行时更改占空比。

void TIM_SetCompare1(TIM_TypeDef* TIMx, uint16_t Compare1);
void TIM_SetCompare2(TIM_TypeDef* TIMx, uint16_t Compare2);
void TIM_SetCompare3(TIM_TypeDef* TIMx, uint16_t Compare3);
void TIM_SetCompare4(TIM_TypeDef* TIMx, uint16_t Compare4);

2、呼吸灯

在这里插入图片描述
这个PA8输出有TIM1_CH1,并且外设连接LED0灯。且TIM1是高级定时器。

更改一下TIMx的名字改为通用定时器,这个就是通用定时器可以使用的初始化模板。

void PWM_Init()
{	
	TIM_TimeBaseInitTypeDef TIM1_TimeBaseInitStructure;
	TIM_OCInitTypeDef  TIM1_OCInitStructure;
	
	//时钟使能
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);
	
	//初始化定时器参数
	TIM1_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;   //时钟划分
	TIM1_TimeBaseInitStructure.TIM_CounterMode =TIM_CounterMode_Up;   //计数器模式向上计数
	TIM1_TimeBaseInitStructure.TIM_Period = 100 -1; //自动重载
	TIM1_TimeBaseInitStructure.TIM_Prescaler = 720 -1;
	TIM1_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
	TIM_TimeBaseInit(TIM1,&TIM1_TimeBaseInitStructure);

	//TIM1_OCStructInit(&TIM1_OCInitStructure);
	TIM1_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式1
	TIM1_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
	TIM1_OCInitStructure.TIM_Pulse = 0; //设置待装入捕获比较寄存器的脉冲值
	TIM1_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
	TIM_OC1Init(TIM1, &TIM1_OCInitStructure);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx
	
	TIM_Cmd(TIM1,ENABLE);	
}

此时PA8口会输出PWM波形。找个灯接入PA8就可以实现。

这里我们还要配置 PA8 为复用输出(当然还要时能 GPIOA的时钟),这是因为 TIM1_CH1 通道将使用 PA8 的复用功能作为输出。
PA8要设置为复用推挽输出,同样要在PWM_Init()函数中定义。
并且TIM1是高级定时器,还要使用

TIM_CtrlPWMOutputs(TIM1,ENABLE);	//MOE 主输出使能	

所以总的代码为

#include "stm32f10x.h"  
#include "PWM.h"

void PWM_Init()
{	
	TIM_TimeBaseInitTypeDef TIM1_TimeBaseInitStructure;
	TIM_OCInitTypeDef  TIM1_OCInitStructure;
	GPIO_InitTypeDef GPIO_InitStructure;
	//时钟使能
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	//初始化定时器参数
	TIM1_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;   //时钟划分
	TIM1_TimeBaseInitStructure.TIM_CounterMode =TIM_CounterMode_Up;   //计数器模式向上计数
	TIM1_TimeBaseInitStructure.TIM_Period = 100 -1; //自动重载
	TIM1_TimeBaseInitStructure.TIM_Prescaler = 720 -1;
	TIM1_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
	TIM_TimeBaseInit(TIM1,&TIM1_TimeBaseInitStructure);

	//TIM1_OCStructInit(&TIM1_OCInitStructure);
	TIM1_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式1
	TIM1_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
	TIM1_OCInitStructure.TIM_Pulse = 0; //设置待装入捕获比较寄存器的脉冲值
	TIM1_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
	TIM_OC1Init(TIM1, &TIM1_OCInitStructure);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx
	
	//设置该引脚为复用输出功能,输出TIM1 CH1的PWM脉冲波形
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //TIM_CH1
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	TIM_CtrlPWMOutputs(TIM1,ENABLE);	//MOE 主输出使能	

	//TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);  //CH1预装载使能	 
	
	//TIM_ARRPreloadConfig(TIM1, ENABLE); //使能TIMx在ARR上的预装载寄存器
	
	TIM_Cmd(TIM1,ENABLE);
	
}

void PWM_SetCompare1(uint16_t compare)
{
	TIM_SetCompare1(TIM1,compare);
}
#include "stm32f10x.h"
#include "LED.h"
#include "delay.h"
#include "PWM.h"

uint8_t i;
 int main(void)
 {	
	delay_init();	    	 //延时函数初始化	  
	LED_Init();
	PWM_Init(); 

  while(1)
	{
		
		for(i = 0;i < 100;i++)
		{
			PWM_SetCompare1(i);
			delay_ms(10);
			
		}
		for(i = 0;i < 100;i++)
		{
			PWM_SetCompare1(100 - i);
			delay_ms(10);
		}
	}
 }



void LED_Init(void)
{	
	
	GPIO_InitTypeDef  GPIO_InitStructure;
	
	 // 配置时钟,使能IO口时钟,使能PA,PD端口时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOD, ENABLE);	 
	
	 //初始化IO参数
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;				 
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 	//推挽输出	
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;	//IO口速度为50MHz
	GPIO_Init(GPIOA, &GPIO_InitStructure);	
	
	 //初始化IO参数
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;				 
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 	//推挽输出	
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;	//IO口速度为50MHz
	GPIO_Init(GPIOD, &GPIO_InitStructure);	
	
  
	GPIO_SetBits(GPIOA,GPIO_Pin_8);
	GPIO_SetBits(GPIOD,GPIO_Pin_2);
	
}

但是我发现PWM_Init()中不使能GPIOA也可以,我怀疑是因为LED_Init()中有使能GPIOA。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

6、基于STM32呼吸灯(PWM) 的相关文章

  • 除了提供必要的保证之外,硬件内存屏障是否还能使原子操作的可见性更快?

    TL DR 在生产者 消费者队列中 放置不必要的 从 C 内存模型的角度来看 内存栅栏或不必要的强内存顺序是否有意义 以牺牲可能更差的吞吐量为代价获得更好的延迟 C 内存模型在硬件上执行 通过为更强的内存顺序设置某种内存栅栏 而不是在较弱的
  • ARM 未定义指令错误

    我在运行嵌入式系统 无协处理器 无 MMU Atmel 9263 时收到未定义指令错误 嵌入式系统的内存范围为 0x20000000 0x23FFFFFF 目前为止我遇到过两个案例 SP 0x0030B840 LR 2000AE78 LR指
  • STM32内部时钟

    我对 STM32F7 设备 意法半导体的 Cortex M7 微控制器 上的时钟系统感到困惑 参考手册没有充分阐明这些时钟之间的差异 SYSCLK HCLK FCLK 参考手册中阅读章节 gt RCC 为 Cortex 系统定时器 SysT
  • 对 -finstrument-functions 的未定义引用

    我正在尝试跟踪内核函数并且我正在使用 finstrument functions这样做 但我收到未定义的参考错误 如下所示 arch arm kernel elf c 9 undefined reference to cyg profile
  • 通用 ELF 中的重定位(EM:40)

    我尝试从 Ubuntu 交叉编译到Friendly arm 但出现了奇怪的错误 root kevin VirtualBox home kevin Desktop makef make ARCH arm CROSS COMPILE arm n
  • arm gcc工具链为arm-elf或arm-none-eabi,有什么区别?

    当您构建 gcc 工具链时 可以将其构建为arm elf 或arm none eabi 但是有什么区别呢 我今天使用 eabi 但这只是因为其他人似乎都这样做 但由于这是一个非常糟糕的论点 因此理解其中的差异真的很高兴 注意 此工具链将为基
  • 手臂 g++ 中缺少一些东西

    我安装了 CodeSourcery g 工具链并尝试编译一个简单的 hello world 程序 include
  • ARM 9处理器的opencv交叉编译

    我需要为 ARM 9 处理器交叉编译 opencv 我有处理器的工具链 但不知道如何交叉编译 请告诉我为arm板交叉编译的过程 谢谢大家 看这个参考 http www airs com ian configure configure 5 h
  • 如何在 ARM 架构上从 RAM 运行代码

    我正在对 ARM Cortex R4 进行编程 并且有一些二进制文件 我想从 TCRAM 执行它们 只是为了看看性能的提升是否足够好 我知道我必须编写一个函数来将二进制文件复制到 RAM 这可以通过链接器脚本来完成 并且知道二进制文件的大小
  • 嵌入式 C++ (ARM9) 单元测试

    我来自 Java 和 JUnit 的世界 我演示了 Hudson 以及我使用 JUnit 取得的所有成果 我想在嵌入式设备上对 C 代码执行相同的操作 但找不到从哪里开始 该项目使用 iccarm exe IAR 编译器 进行编译 现在使用
  • 将结构体偏移属性赋予汇编器

    如何将 C 结构体的偏移量发送到汇编代码 例如 在我的 C 代码中 typedef struct unsigned int a unsigned int b CMyStruct 我向 ASM 函数发送一个 CMyStruct 结构的指针 假
  • HAL_Delay() 陷入无限循环

    我被 HAL Delay 函数困住了 当我调用此函数 HAL Delay 时 控制陷入无限循环 在寻找问题的过程中 我发现了这个 http www openstm32 org forumthread2145 threadId2146 htt
  • ARM Linux 如何模拟 PTE 的脏位、访问位和文件位?

    As per pgtable 2 level h https git kernel org cgit linux kernel git torvalds linux git tree arch arm include asm pgtable
  • 用于 RHEL 的 gdb-multiarch

    我正在尝试寻找方法来运行gdb 多架构RHEL 中的命令 我已经安装了用于 ARM 处理的 QEMU 模拟器 我想安装GDB进行调试 我能够安装GDB 多体系结构在 Ubuntu 中运行命令成功 sudo apt get GDB multi
  • ARM架构中不同处理器模式下如何使用内核堆栈?

    据我了解 每个进程都有一个用户堆栈和内核堆栈 除此之外 ARM 架构中的每种模式都有一个堆栈 所以我想知道不同的堆栈和堆栈指针在 ARM 模式下如何工作 另外 何时会使用与进程关联的内核堆栈 何时会使用与进程关联的内核堆栈 当您进行系统调用
  • Linux malloc() 在 ARM 和 x86 上的行为是否不同?

    这个网站上有很多关于内存分配的问题 但是我 找不到专门解决我的问题的人 这 问题 https stackoverflow com questions 19148296 linux memory overcommit details似乎最接近
  • 当端点和 PMA 地址均更改时,CubeMX 生成的 USB HID 设备发送错误数据

    我正在调试我正在创建的复合设备的问题 并在新生成的仅 CubeMX 代码中重新创建了该问题 以使其更容易解决 我添加了少量代码main 让我发送 USB HID 鼠标点击 并在按下蓝色按钮时使 LED 闪烁 uint8 t click re
  • 为 ARM 交叉编译 zlib

    我尝试为arm poky linux gnueabi交叉编译zlib 但启动 make 时出现错误 zlib 1 2 11 AR HOST ar CC HOST gcc RANLIB HOST ranlib configure prefix
  • 有没有办法在 Xcode 4 中为 ARM 而不是 Thumb 进行编译?

    如果有很多浮点运算正在进行 Apple 建议针对 ARM 进行编译 而不是针对拇指进行编译 我的整个应用程序几乎是一个大型浮点运算 iOS 应用程序开发工作流程指南中是这样说的 iOS 设备支持两种指令集 ARM 和 Thumb Xcode
  • STM32 传输结束时,循环 DMA 外设到存储器的行为如何?

    我想问一下 在以下情况下 STM32 中的 DMA SPI rx 会如何表现 我有一个指定的 例如 96 字节数组 名为 A 用于存储从 SPI 接收到的数据 我打开循环 SPI DMA 它对每个字节进行操作 配置为 96 字节 是否有可能

随机推荐

  • Java安全之SSL/TLS

    在前面所讲到的一些安全技术手段如 消息摘要 加解密算法 数字签名和数据证书等 一般都不会由开发者直接地去使用 而是经过了一定的封装 甚至形成了某些安全协议 再暴露出一定的接口来供开发者使用 因为直接使用这些安全手段 对开发者的学习成本太高
  • 初学树莓派——(六)树莓派安装OpenCV及USB摄像头配置

    目录 1 安装OpenCV 1 1前言 1 2换源及源内容更新 1 3安装依赖 1 4下载whl包 1 5安装OpenCV 1 6检查安装 2 USB摄像头配置 同时检查OpenCV安装情况 2 1前言 2 2Python调用cv2库来检查
  • sem_init函数用法

    sem init函数 sem init函数是Posix信号量操作中的函数 sem init 初始化一个定位在 sem 的匿名信号量 value 参数指定信号量的初始值 pshared 参数指明信号量是由进程内线程共享 还是由进程之间共享 如
  • 最优化算法概述以及常见分类

    1 最优化问题概述 通俗的来说 最优化问题就是在一定的条件约束下 使得效果最好 最优化问题是一种数学问题 是研究在给定的约束之下如何求得某些因素的量 来使得某一指标达到最优的学科 工程设计中最优化问题的一般说法是 选择一组参数 在满足一系列
  • 数据结构笔记(六)——散列(Hash Table)之散列函数(1)

    散列表 hash table 的实现叫做散列 hashing 这是以常数平均时间O 1 进行插入 删除和查找的技术 散列表没有顺序 需要元素间排序信息的操作 如findMin findMax不会得到有效支持 就是这东西不是这么用的 你可以实
  • RocketMq顺序发送消息

    错乱消息出现的原因 1 在RocketMq为啥消息不是按照顺序来的呢 首先您需要了解 队列是一个先进先出的一个数据的结构 生产者 您可以将topic理解为里面有一个一个的队列 你将一个消息发送到topic的时候 当前的消息不一定是往当前的这
  • win 10 搭建FTP服务,并使用的FTP进行传输文件(很详细)

    1 安装IIS工具 打开控制面板 点击 程序 点击 启用或关闭Windows功能 找到 internet information services 全部都选上 如下图 点击 确定 会出现以下页面 点击 关闭 即可 2 设置开机启动FTP服务
  • 高光谱图像中的Hughes(休斯)现象

    注解 在高光谱图像的分析中 随着参与运算波段数目的增加 分类精度 先增后降 的现象 场景 高光谱影像 由于维数的大幅度增加 在深度学习中 可以理解成模型提取的特征维数的增加 导致用于参数训练的所需样本数也急剧增加 如果样本数过少 那么估计出
  • Fiddler 详尽教程与抓取移动端数据包

    转载自 http blog csdn net qq 21445563 article details 51017605 阅读目录 1 Fiddler 抓包简介 1 字段说明 2 Statistics 请求的性能数据分析 3 Inspecto
  • C++面试题目集合(持续跟新)

    与我前面写的C语言进阶知识点遥相呼应 这才是C 面试 网上的面试题有些太简单了 C 面试题目最多集中在对象的内存模型 记住了 如果用c c 内存都不清楚 还写个屁的程序 1 C 的虚函数是怎样实现的 C 的虚函数使用了一个虚函数表来存放了每
  • 我的世界服务器物品不掉落指令是什么,我的世界死亡物品怎么不掉落 我的世界物品不掉落指令...

    我的世界死亡不了多指令是gamerulekeepInventorytrue 玩家们要注意我的世界死亡不掉落指令默认是关闭状态的哦 死亡不掉落指令在 我的世界 游戏里面就是当玩家们死亡以后仍然保留其物品栏中的所有物品 包括附魔死亡消失魔咒的物
  • 安装WSL + zsh & Pure (ZSH prompt) 美化【Windows11】

    文章目录 前言 WSL 安装 ZSH 安装ZSH Pure ZSH prompt 安装插件 下载插件 编辑配置文件 插件作用 啊 PS 如果在启动过程中提示 请启用虚拟机平台 windows 功能并确保在 bios 中启用虚拟化 前言 之前
  • 数据分析36计(28):Python 使用 Flask+Docker, 100行代码内实现机器学习实时预测​...

    本文的想法是快速轻松地构建 Docker 容器 Python 以使用 Flask 实现机器学习模型执行在线预测 API 我们将使用 Docker 和 Flask RESTful 实现线性判别分析和多层感知器神经网络模型的实时预测 项目包括的
  • Android中的自绘View的那些事儿(八)之 Paint的高级用法

    我们在 Android中的自绘View的那些事儿 一 中简单介绍过Paint和Canvas的一些常用方法和实例使用 其中 一句话提到Paint中有方法 setStrokeCap setStrokeJoin 和 setPathEffect 今
  • nodejs如何利用libuv实现事件循环和异步

    本文是根据之前在公司内部做的分享整理而成 是早期对nodejs的一个认识 源码版本10 x nodejs是什么 libuv的工作原理 nodejs的工作原理 nodejs如何使用libuv实现事件循环和异步 1 nodejs是什么 Node
  • pyinstaller打包最小体积安装python程序 命令行传参执行

    文章目录 创建虚拟环境 进入虚拟环境安装库 pycharm配置虚拟环境 pycharm 打开terminal进入虚拟环境 运行参数传入 sys argv 是获取运行python文件的时候命令行参数 且以list形式存储参数 打包后的文件运行
  • js记录密码出错次数并锁定账号30分钟

    下面要说的是网站中一个常见的功能 在客人使用抵用券或者其他来支付的时候需要验证密码 如果密码输入错误5次就锁定 不在让客人使用抵用券了 在这里是使用的cookie来实现的 不太严谨 思路很简单 在输入密码错误的时候 使用cookie保存2个
  • 基于vue项目的上拉刷新,下拉加载的效果

    使用插件 better scroll 安装使用教程http ustbhuangyi github io better scroll doc installation html npm 还是看官网比较好 子组件
  • 28_content 阶段的 index 模块

    文章目录 content 阶段的 index 模块 显示目录内容 content 阶段的 autoindex 模块 autoindex 模块的指令 index autoindex 示例配置 content 阶段的 index 模块 ngx
  • 6、基于STM32呼吸灯(PWM)

    之前定时器中有提到输入和输出比较部分 https blog csdn net qq 45764141 article details 125286260 参考有江科大自化协的视频和正电原子的视频 这个文章主要讲输出部分 文章目录 一 OC