物联网——TIM定时器、PWM驱动呼吸灯、舵机和直流电机

定时器概念(常用于输出PWM波形,驱动电机)

在这里插入图片描述

时间=脉冲数时钟周期; 这里的脉冲数=6553665536,支持定时器级联,从而延长定时

定时器类型

在这里插入图片描述

基本定时器原理图(UI:更新中断, U:更新事件,仅支持向上计时模式)

在这里插入图片描述

(stm32主模式)可以通过映射U(事件)至到触发器(TRGO)来控制DAC的输出,这样就不用CPU花费大量的中断时间输出DAC

通用定时器原理图(支持向上/下计时模式,中央对齐计时模式)

中央对齐计时模式(计数器的值和重装值相等时产生一次中断,计数器值再减为零再产生一次中断)

在这里插入图片描述

高级定时器

在这里插入图片描述

DTG(Dead Time Generate): 死区生成电路,用于防止直通

BKIN:刹车输入

定时中断基本结构

在这里插入图片描述

预分频器时序

在这里插入图片描述

计数器时序图

在这里插入图片描述
在这里插入图片描述
影子寄存器的作用:让值的更改与更新事件保持同步,防止在运行途中更改造成错误
在这里插入图片描述

MyClock.c

#include "stm32f10x.h"
extern uint16_t Num;
//定时器初始化
void Timer_Init(void){// Enables or disables the Low Speed APB (APB1) peripheral clock.(外部时钟)RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//(内部时钟)TIM_InternalClockConfig(TIM2);//基本定时器配置TIM_TimeBaseInitTypeDef BaseTI;BaseTI.TIM_ClockDivision = TIM_CKD_DIV1;BaseTI.TIM_CounterMode =   TIM_CounterMode_Up; //向上计数法BaseTI.TIM_Prescaler = 7200-1;   //PSC,计数器(PSC大,ARR小,则定时器频率低,OV=C_PSC/PSC+1/ARR+1)BaseTI.TIM_Period = 1000-1;   //ARR,重定位值 ,(PSC小,ARR大,则定时器频率高) BaseTI.TIM_RepetitionCounter = 0;    //Specifies the repetition counter value. Each time the RCR downcounterreaches zero, an update event is generated and counting restarts from the RCR valueTIM_TimeBaseInit(TIM2,&BaseTI);   //由于时钟在初始化的时候,触发了一次更新事件使预分频器的值有效,所以要清除掉更新事件,避免后续计时器数值从一开始TIM_ClearFlag(TIM2,TIM_FLAG_Update);  //中断配置,由更新事件触发中断TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//中断控制器NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitTypeDef NI;NI.NVIC_IRQChannel = TIM2_IRQn;NI.NVIC_IRQChannelCmd = ENABLE;NI.NVIC_IRQChannelPreemptionPriority = 2;NI.NVIC_IRQChannelSubPriority = 1;  NVIC_Init(&NI);//启动定时器TIM_Cmd(TIM2,ENABLE);
}
//对射式定时器初始化
void MappintTimer_Init(void){// Enables or disables the Low Speed APB (APB1) peripheral clock.(外部时钟)RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);   //红外射线引脚GPIO_InitTypeDef GI;GI.GPIO_Mode = GPIO_Mode_IPU;GI.GPIO_Pin = GPIO_Pin_0;GI.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GI);//(外部时钟)TIM_ETRClockMode2Config(TIM2,TIM_ExtTRGPSC_OFF,TIM_ExtTRGPolarity_NonInverted,0x00); //时钟模式,外部触发计数器,外部触发极性(这里是不反转,低电平有效),滤波器(采样n个点都相同,才输出滤波器)//基本定时器配置TIM_TimeBaseInitTypeDef BaseTI;BaseTI.TIM_ClockDivision = TIM_CKD_DIV1;BaseTI.TIM_CounterMode =   TIM_CounterMode_Up; //向上计数法BaseTI.TIM_Prescaler = 1-1;   //PSC,计数器(PSC大,ARR小,则定时器频率低,OV=C_PSC/PSC+1/ARR+1),这里从0~9BaseTI.TIM_Period = 10-1;   //ARR,重定位值 ,(PSC小,ARR大,则定时器频率高),这里不需要分频 BaseTI.TIM_RepetitionCounter = 0;    //Specifies the repetition counter value. Each time the RCR downcounterreaches zero, an update event is generated and counting restarts from the RCR valueTIM_TimeBaseInit(TIM2,&BaseTI);   //由于时钟在初始化的时候,触发了一次更新事件使预分频器的值有效,所以要清除掉更新事件,避免后续计时器数值从一开始TIM_ClearFlag(TIM2,TIM_FLAG_Update);  //中断配置,由更新事件触发中断TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//中断控制器NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitTypeDef NI;NI.NVIC_IRQChannel = TIM2_IRQn;NI.NVIC_IRQChannelCmd = ENABLE;NI.NVIC_IRQChannelPreemptionPriority = 2;NI.NVIC_IRQChannelSubPriority = 1;  NVIC_Init(&NI);//启动定时器TIM_Cmd(TIM2,ENABLE);
}
//时钟中断控制,这个函数可以定义在主函数外面,这样就不用使用extern修饰变量
void TIM2_IRQHandler(void){if(TIM_GetITStatus(TIM2,TIM_IT_Update) == SET){Num++;TIM_ClearITPendingBit(TIM2,TIM_IT_Update);} 
}

PWM波形

PWM(Pulse Width Modulation)波形,即脉冲宽度调制波形,是一种通过调整一系列等幅脉冲的宽度来对输出进行编码和控制的技术。在PWM信号中,每个脉冲的幅度保持恒定,但是脉冲的持续时间(宽度)变化,从而改变脉冲的占空比,即高电平时间与整个脉冲周期的比例。这种调制方式使得PWM信号能够等效地模拟出不同强度的模拟信号,常用于控制电机转速、LED亮度调节、电源转换等领域。
PWM波形的关键特性包括:
-脉冲序列:PWM波由一系列矩形波(方波)组成。
-固定周期:每个PWM周期的时间长度是固定的。
-可变宽度:每个脉冲的高电平时间(即“开启时间”)可以改变,低电平时间相应调整以保持周期不变,这样就改变了占空比。
-占空比:占空比是指一个周期内高电平时间与整个周期时间的比例,通常以百分比表示,用于控制输出的有效功率或模拟信号的强度。
-等效模拟信号:通过调整占空比,PWM可以近似模拟连续的模拟信号,如正弦波,用于驱动如电机或LED等设备,实现平滑的控制效果。
在逆变电路和电源管理应用中,常用的PWM调制方法之一是SPWM(Sinusoidal PWM),它通过使脉冲宽度按照正弦波的形状变化,使得输出的PWM波形在一定意义上等效于期望的正弦波形,从而控制输出电压或电流的大小和频率。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

PWM基本结构

在这里插入图片描述

PWM频率

CK_PSC

在PWM(Pulse Width Modulation,脉冲宽度调制)控制中,CK_PSC通常指的是时钟预分频系数(Prescaler value for Clock)。这是微控制器(如STM32系列)中的定时器模块中的一个配置参数,用于调整定时器的时钟频率。
具体来说,CK_PSC是定时器输入时钟(CK_INT,来自系统时钟或者外部时钟源)在进入定时器计数器之前经过的一个分频器。通过设置不同的CK_PSC值,可以减慢定时器的计数速度,使得计数器能以较低的频率进行计数,这对于生成各种不同频率的PWM信号非常关键。预分频的计算公式通常是 Timer Clock Frequency = (Input Clock Frequency) / (PSC + 1)。
例如,如果你有一个基于STM32的系统,其系统时钟频率为72MHz,而你需要一个较慢的PWM频率输出,你可以通过设置合适的CK_PSC值来实现这一点。增加PSC值会降低到达计数器的时钟频率,从而允许更精细地控制PWM信号的频率和占空比。
在编程时,通常会通过设置定时器的相关寄存器(如STM32中的TIMx_PSC寄存器)来配置CK_PSC的值,以满足特定应用的需求。

CCR 和 ARR

自动重装载寄存器(ARR)用于确定波形的频率(即周期)、捕获比较寄存器(CCRx)(用于确定占空比的)
PWM的工作过程如下:首先ARR寄存器里面的值确定了一个PWM周期(注意这个周期是在PWM系统初始化的时候写入ARR寄存器的,写入以后一般就不再改动了)。然后CCR寄存器里面的值是PWM工作过程中确定的,它可以为一个定值,也可以是一个变化的值。
在这里插入图片描述

PWM分辨率

PWM分辨率是指在PWM一个周期内能够实现的占空比调整的最小单位,它是衡量PWM信号精细程度的一个重要指标。PWM通过调整脉冲信号高电平时间的长短来模拟输出不同的平均电压值,而这个调整的细腻程度就是由分辨率决定的。
具体来说,PWM分辨率可以用比特数表示,常见的有8位、10位、12位等。一个8位的PWM控制器可以提供2^8=256个不同的占空比等级,这意味着在一个PWM周期内,高电平时间可以有256种不同的设置。相应地,10位分辨率则可以提供1024个不同的占空比等级,12位则有4096个等级,依此类推。分辨率越高,能够实现的控制精度就越高,输出的模拟信号就越接近真实连续的模拟信号。
PWM分辨率的计算也可以关联到具体的时钟频率上,比如一个PWM的时钟频率确定时,提高分辨率会导致每个脉冲宽度的可调步进减小,从而使得控制更为精确。反之,分辨率较低意味着调整的步长较大,占空比的变化相对粗糙。

呼吸灯电路图

在这里插入图片描述

注意事项

在这里插入图片描述

占空比为10%的PWM波形(示波器显示)

在这里插入图片描述

呼吸灯核心代码

//主函数
#include "stm32f10x.h"                  // Device header
#include "MyDelay.h"   //自定义延时函数
#include "Delay.h"     //官方延迟函数
#include "Button.h"   //按键Led驱动
#include "stdio.h"
#include "PWM.h"
#include "OLED.h"int main(void){//环境配置OLED_Init();PWM_Init();while(1){for(int i=1;i<=100;i+=2){OLED_ShowNum(1,1,666,3);PWM_SetCompare1(i);Delay_ms(20);}for(int i=100;i>=1;i-=2){OLED_ShowNum(1,1,666,3);PWM_SetCompare1(i);Delay_ms(20);}       }return 0;
}//PWM.h
#ifndef PWM_H
#define PWM_H
//初始化PWM
void PWM_Init(void);
//用于动态改变CCR,调节LED灯的亮度,PWM使用的PA0端口
void PWM_SetCompare1(uint16_t Compare); 
#endif//PWM.c
#include "stm32f10x.h"                  // Device header
//初始化PWM
void PWM_Init(void){RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);   //时钟中断RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);  //为呼吸灯指定引脚PA0GPIO_InitTypeDef GI;GI.GPIO_Mode = GPIO_Mode_AF_PP;   //定时器(外设)控制引脚,要用复用推挽输出GI.GPIO_Pin = GPIO_Pin_0;GI.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GI);TIM_InternalClockConfig(TIM2);     //内部时钟TIM_TimeBaseInitTypeDef TI;     //时钟中断配置TI.TIM_ClockDivision = TIM_CKD_DIV2 ;TI.TIM_CounterMode = TIM_CounterMode_Up;TI.TIM_Period = 100-1;    // ARRTI.TIM_Prescaler = 720-1;      // PSC ,CK_PSC=72MHZTI.TIM_RepetitionCounter = 0;TIM_TimeBaseInit(TIM2,&TI);TIM_Cmd(TIM2,ENABLE);  //时钟中断使能//时钟中断的输出比较模块定义: PWM波形,频率1KHZ,占空比50%,分辨率为 1%,TIM_OCInitTypeDef OCI;TIM_OCStructInit(&OCI); //先初始化输出比较模块,后续修改某个属性OCI.TIM_OCMode = TIM_OCMode_PWM1;OCI.TIM_OCPolarity = TIM_OCPolarity_High;   //极性,高电平有效电平OCI.TIM_OutputState = ENABLE;OCI.TIM_Pulse = 0;    //CCR捕获寄存器,可以通过改变CCR的值,调制PWM波形的占空比,从而改变LED灯的亮度    TIM_OC1Init(TIM2,&OCI);  //pwm波形初始化 
}//用于动态改变CCR,调节LED灯的亮度,PWM使用的PA0端口
void PWM_SetCompare1(uint16_t Compare){TIM_SetCompare1(TIM2,Compare); //该函数用于设置CRR的值}//重映射端口PA15
#include "stm32f10x.h"                  // Device header//初始化PWM
void PWM_Init(void){RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);   //时钟中断RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);  //为呼吸灯指定引脚PA0//法二:为了提高引脚使用率,重映射端口,打开AFIO,重映射引脚,解除调试端口RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2,ENABLE);GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE); //禁用JTAG调试,这里用的是ST-LinkGPIO_InitTypeDef GI;GI.GPIO_Mode = GPIO_Mode_AF_PP;   //定时器(外设)控制引脚,要用复用推挽输出GI.GPIO_Pin = GPIO_Pin_15;GI.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GI);TIM_InternalClockConfig(TIM2);     //内部时钟TIM_TimeBaseInitTypeDef TI;     //时钟中断配置TI.TIM_ClockDivision = TIM_CKD_DIV2 ;TI.TIM_CounterMode = TIM_CounterMode_Up;TI.TIM_Period = 100-1;    // ARRTI.TIM_Prescaler = 720-1;      // PSC ,CK_PSC=72MHZTI.TIM_RepetitionCounter = 0;TIM_TimeBaseInit(TIM2,&TI);TIM_Cmd(TIM2,ENABLE);  //时钟中断使能//时钟中断的输出比较模块定义: PWM波形,频率1KHZ,占空比50%,分辨率为 1%,TIM_OCInitTypeDef OCI;TIM_OCStructInit(&OCI); //先初始化输出比较模块,后续修改某个属性OCI.TIM_OCMode = TIM_OCMode_PWM1;OCI.TIM_OCPolarity = TIM_OCPolarity_High;   //极性,高电平有效电平OCI.TIM_OutputState = ENABLE;OCI.TIM_Pulse = 0;    //CCR捕获寄存器,可以通过改变CCR的值,调制PWM波形的占空比,从而改变LED灯的亮度    TIM_OC1Init(TIM2,&OCI);  //pwm波形初始化 
}//用于动态改变CCR,调节LED灯的亮度,PWM使用的PA0端口
void PWM_SetCompare1(uint16_t Compare){TIM_SetCompare1(TIM2,Compare); //该函数用于设置CRR的值}

舵机

在这里插入图片描述
在这里插入图片描述

按键控制舵机旋转

#include "stm32f10x.h"                  // Device header
#include "MyDelay.h"   //自定义延时函数
#include "Delay.h"     //官方延迟函数
#include "Button.h"   //按键Led驱动
#include "stdio.h"
#include "PWM.h"
#include "OLED.h"
#include "Servos.h"
float Angle;
int KeyNum;
int main(void){//环境配置OLED_Init();Servos_PWM_Init();Button_Init();//显示角度OLED_ShowString(1,1,"Angle:");while(1){KeyNum = Key_GetNum();if(KeyNum == 1){Angle += 25;if(Angle>=180) Angle = 180;OLED_ShowNum(1,7,Angle,5);Servos_SetAngle(Angle);} if(Angle>=180){Angle = 0; OLED_ShowNum(1,7,Angle,5);Servos_SetAngle(0);}    }return 0;
}#ifndef Servos_h
#define Servos_h
//舵机PWM波形初始化
void Servos_PWM_Init(void);
//动态改变PWM通道2的波形
void PWM_SetCompare2(uint16_t Compare);
//设置舵机旋转角度
void Servos_SetAngle(float Angle);
#endif#include "stm32f10x.h"
//舵机PWM波形初始化
void Servos_PWM_Init(void){RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);   //时钟中断RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);  //为呼吸灯指定引脚PA0GPIO_InitTypeDef GI;GI.GPIO_Mode = GPIO_Mode_AF_PP;   //定时器(外设)控制引脚,要用复用推挽输出GI.GPIO_Pin = GPIO_Pin_1;GI.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GI);TIM_InternalClockConfig(TIM2);     //内部时钟TIM_TimeBaseInitTypeDef TI;     //时钟中断配置TI.TIM_ClockDivision = TIM_CKD_DIV2;TI.TIM_CounterMode = TIM_CounterMode_Up;TI.TIM_Period = 20000;    // ARRTI.TIM_Prescaler = 72;      // PSC ,CK_PSC=72MHZTI.TIM_RepetitionCounter = 0;TIM_TimeBaseInit(TIM2,&TI);TIM_Cmd(TIM2,ENABLE);  //时钟中断使能//时钟中断的输出比较模块定义: PWM波形,舵机要求时钟20ms,频率50HZ,占空比动态变化,分辨率动态变化,TIM_OCInitTypeDef OCI;TIM_OCStructInit(&OCI); //先初始化输出比较模块,后续修改某个属性OCI.TIM_OCMode = TIM_OCMode_PWM1;OCI.TIM_OCPolarity = TIM_OCPolarity_High;   //极性,高电平有效电平OCI.TIM_OutputState = ENABLE;OCI.TIM_Pulse = 0;    //调制PWM波形的占空比,从而控制舵机,舵机CCR取值范围:500 ~ 2500    TIM_OC1Init(TIM2,&OCI);  //pwm通道1初始化 TIM_OC2Init(TIM2,&OCI);  //pwm通道2}//动态改变PWM通道2的CCR
void PWM_SetCompare2(uint16_t Compare){TIM_SetCompare2(TIM2,Compare);
}//设置舵机旋转角度
void Servos_SetAngle(float Angle){float sum = 500 + (Angle/180*2000);   //CCR:500~2500 与 角度:0~180 计算得出PWM_SetCompare2(sum);
}

直流电机

   在这里插入图片描述
在这里插入图片描述

//电机驱动代码
#include "stm32f10x.h"                  // Device header
#include "MyDelay.h"   //自定义延时函数
#include "Delay.h"     //官方延迟函数
#include "Button.h"   //按键Led驱动
#include "stdio.h"
#include "OLED.h"
#include "Servos.h"
#include "DCmotors.h"int Speed,KeyNum;
int main(void){//环境配置OLED_Init();DCmotors_Init();Button_Init();Motor_SetSpeed(-50);OLED_ShowString(1,1,"Circle Speed:");while(1){KeyNum = Key_GetNum();				//获取按键键码if (KeyNum == 1)					//按键1按下{Speed += 20;					//速度变量自增20if (Speed > 100)				//速度变量超过100后{Speed = -100;				//速度变量变为-100//此操作会让电机旋转方向突然改变,可能会因供电不足而导致单片机复位//若出现了此现象,则应避免使用这样的操作}}Motor_SetSpeed(Speed);				//设置直流电机的速度为速度变量OLED_ShowSignedNum(2, 1, Speed, 3);	//OLED显示速度变量}return 0;
}#ifndef DCmotors_h
#define DCmotors_h
//直流电机驱动
void DCmotors_Init(void);
//设置电机旋转速度以及旋转方向(电流方向决定旋转方向)
void Motor_SetSpeed(int8_t Speed);
#endif#include "stm32f10x.h"
#include "OLED.h"
#include "PWM.h"
//直流电机驱动
void DCmotors_Init(void){RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);  GPIO_InitTypeDef GI;GI.GPIO_Mode = GPIO_Mode_Out_PP;   //要用推挽输出(不由片上外设控制,无需复用推挽输出)GI.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;GI.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GI);PWM_Init();  //PWM波形初始化
}
//设置电机旋转速度以及旋转方向(电流方向决定旋转方向)
void Motor_SetSpeed(int8_t Speed){if (Speed >= 0)							//如果设置正转的速度值{GPIO_SetBits(GPIOA, GPIO_Pin_4);	//PA4置高电平GPIO_ResetBits(GPIOA, GPIO_Pin_5);	//PA5置低电平,设置方向为正转PWM_SetCompare3(Speed);				//PWM设置为速度值}else									//否则,即设置反转的速度值{GPIO_ResetBits(GPIOA, GPIO_Pin_4);	//PA4置低电平GPIO_SetBits(GPIOA, GPIO_Pin_5);	//PA5置高电平,设置方向为反转PWM_SetCompare3(-Speed);			//PWM设置为负的速度值,因为此时速度值为负数,而PWM只能给正数}
}//封装好的PWM模块
#ifndef PWM_H
#define PWM_H
//初始化PWM
void PWM_Init(void);
//用于动态改变CCR,调节LED灯的亮度,PWM使用的PA0端口
void PWM_SetCompare3(uint16_t Compare); 
#endif#include "stm32f10x.h"                  // Device header
//初始化PWM
void PWM_Init(void){RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);   //时钟中断RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);  //为呼吸灯指定引脚PA0//法二:为了提高引脚使用率,重映射端口,打开AFIO,重映射引脚,解除调试端口
//  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
//  GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2,ENABLE);
//  GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE); //禁用JTAG调试,这里用的是ST-LinkGPIO_InitTypeDef GI;GI.GPIO_Mode = GPIO_Mode_AF_PP;   //(外设)控制引脚,PA2要用复用推挽输出GI.GPIO_Pin = GPIO_Pin_2;GI.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GI);TIM_InternalClockConfig(TIM2);     //内部时钟TIM_TimeBaseInitTypeDef TI;     //时钟中断配置TI.TIM_ClockDivision = TIM_CKD_DIV2 ;TI.TIM_CounterMode = TIM_CounterMode_Up;TI.TIM_Period = 100-1;    // ARRTI.TIM_Prescaler = 36-1;      // PSC ,CK_PSC=72MHZTI.TIM_RepetitionCounter = 0;TIM_TimeBaseInit(TIM2,&TI);TIM_Cmd(TIM2,ENABLE);  //时钟中断使能//时钟中断的输出比较模块定义: PWM波形,频率1KHZ,占空比50%,分辨率为 1%,TIM_OCInitTypeDef OCI;TIM_OCStructInit(&OCI); //先初始化输出比较模块,后续修改某个属性OCI.TIM_OCMode = TIM_OCMode_PWM1;OCI.TIM_OCPolarity = TIM_OCPolarity_High;   //极性,高电平有效电平OCI.TIM_OutputState = ENABLE;OCI.TIM_Pulse = 0;    //CCR捕获寄存器,可以通过改变CCR的值,调制PWM波形的占空比,从而改变LED灯的亮度    TIM_OC3Init(TIM2,&OCI);  //pwm波形初始化 }//用于动态改变CCR,调节LED灯的亮度,PWM使用的PA0端口
void PWM_SetCompare3(uint16_t Compare){TIM_SetCompare3(TIM2,Compare); //该函数用于设置CRR的值}

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

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

相关文章

入门flask:Python后端开发的首选框架

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言&#xff1a;从零开始学习弗拉斯克 二、弗拉斯克的微框架哲学 三、弗拉斯克的核心…

知识维权维权不是低价治理的唯一方法

控价对于品牌来说确实是一个重要的环节&#xff0c;它旨在维护品牌形象和市场秩序&#xff0c;防止渠道出现低价、窜货等不正当竞争行为。整个控价过程确实需要包括前期的数据监测、治理动作以及后期的数据分析&#xff0c;以确保控价的全面性和有效性。 在治理低价链接方面&a…

kali自带--DNS路由--信息搜集

目录 DNS信息搜集 whois fierce dnsenum 路由信息搜集 DNS信息搜集 whois whois 域名 --域名注册的时候填的基本信息. fierce 域名的多级域名? 搜索引擎-谷歌搜索 whois 枚举/递归查询 dnsenum dnsenum 域名 -f 文件名 路由信息搜集 icmp经常ping不通--所以kali出了个tcp的…

【稳定检索/投稿优惠】2024年语言、文化与艺术发展国际会议(LCAD 2024)

2024 International Conference on Language, Culture, and Art Development 2024年语言、文化与艺术发展国际会议 【会议信息】 会议简称&#xff1a;LCAD 2024大会时间&#xff1a;2024-08-10截稿时间&#xff1a;2024-07-27(以官网为准&#xff09;大会地点&#xff1a;中国…

Rainbond 携手 TOPIAM 打造企业级云原生身份管控新体验

TOPIAM 企业数字身份管控平台&#xff0c; 是一个开源的IDaas/IAM平台、用于管理账号、权限、身份认证、应用访问&#xff0c;帮助整合部署在本地或云端的内部办公系统、业务系统及三方 SaaS 系统的所有身份&#xff0c;实现一个账号打通所有应用的服务。 传统企业 IT 采用烟囱…

源码编译安装LNMP

1、LNMP 包含&#xff1a;linux、Nginx、Mysql、php LNMP的工作原理 由客户端发送页面请求给Nginx&#xff0c;Nginx会根据location匹配用户访问请求的URL路径判断是静态还是动态&#xff0c;静态的一般是以 .html .htm .css .shtml结尾&#xff0c;动态的一般是以 .php .jsp…

水位监测站的工作原理

TH-SW2在雨季&#xff0c;河道和湖泊的水文信息监测对于防洪减灾、水资源管理和环境保护等方面具有至关重要的意义。水文监测站作为实现这一目标的基础设施&#xff0c;发挥着关键作用。水文监测站是观测及搜集河流、湖泊、水库等水体的水文、气象资料的基层水文机构。在雨季&a…

harbor -- docker私有仓库安装配置

1 安装docker-compose $ curl -L "https://get.daocloud.io/docker/compose/releases/download/v1.25.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose $ chmod x /usr/local/bin/docker-compose 2 安装配置harbor $ wget https://g…

Java基础语法——字符串(String/StringBuilder/Stringjoiner)

String Java的String类是不可变的&#xff0c;意味着一旦创建&#xff0c;其值就不能被改变。String类提供了丰富的API来操作字符串。 以下是一些常用的方法&#xff1a; 构造方法&#xff1a; 有以下几种常见的&#xff1a; public class stringlearn {public static void…

AI 赋能前端 -- 文本内容概要生成

幸福不在于你获得了什么,而在于你比他人多获得了什么 是比较出来的 大家好,我是柒八九。一个专注于前端开发技术/Rust及AI应用知识分享的Coder 此篇文章所涉及到的技术有 OpenAILangChainRust/WebAssemblyWeb Workerreact+ts+vite配置环境变量(env)因为,行文字数所限,有些概…

渗透课程第二阶段--Part1--信息收集

目录 一. 为什么要做信息收集&#xff1f; 渗透测试的流程 信息收集包括的内容 学习框架&#xff1a; 二. 分类 1. 域名相关信息 域名&#xff08;Domain Name&#xff09;是什么 域名的分类 域名联系人信息 子域名信息 域名DNS信息 2. IP相关信息 ping/nslookup …

香橙派OrangePi AIpro上手笔记——之USB摄像头目标检测方案测试(一)

整期笔记索引 香橙派OrangePi AIpro上手笔记——之USB摄像头目标检测方案测试&#xff08;一&#xff09; 香橙派OrangePi AIpro上手笔记——之USB摄像头目标检测方案测试&#xff08;二&#xff09; 香橙派OrangePi AIpro上手笔记——之USB摄像头目标检测方案测试&#xff0…

使用element的提示框并修改css

使用el-tooltip来做提示框&#xff1a; <el-tooltip popper-class"popper" content"敬请期待" placement"right"><div><i class"iconfont icon-lianjie-01"></i><span>输入链接</span></div&…

和鲸“101数智领航计划”——在武大解码 GeoAI,地理空间智能(GeoAI)学术研讨会及编程工作坊圆满落幕

AI 正革新地理空间数据分析的范式&#xff0c;既为科学研究及行业落地应用带来了机遇&#xff0c;同样也带来了挑战。 5 月 25 日&#xff0c;和鲸科技联合武汉大学遥感信息工程学院、中国地质大学&#xff08;武汉&#xff09;地理与信息工程学院&#xff0c;于武汉大学成功举…

关于TeamSpeak3-网易音乐机器人的基础使用方法(胎教级教程)

本文转自博主的个人博客&#xff1a;https://blog.zhumengmeng.work,欢迎大家前往查看。 原文链接&#xff1a;点我访问 序言&#xff1a;在自己的ts服务器上安装了网易音乐机器人&#xff0c;写这篇文章旨在教群友/网友如何使用机器人!&#x1f60b;&#x1f44d; 一、TS3Audi…

揭秘Python:下划线的特殊用法,你绝对想不到!

在Python编程中&#xff0c;下划线&#xff08;underscore&#xff09;是一个常见而又强大的工具。它不仅仅是一个普通的字符&#xff0c;而是具有特殊含义和用法的符号。今天&#xff0c;我们就来揭开Python下划线的神秘面纱&#xff0c;探索它的各种妙用。 下划线的基本用法…

01--nginx基础

前言&#xff1a; 本文用来整理一下nginx的用法&#xff0c;应该是本人中间件专栏的第一篇文章&#xff0c;这里开始概念和实操将会同样重要&#xff0c;面试时基本概念的理解非常重要&#xff0c;深有体会&#xff0c;不会再让概念成为压死骆驼的稻草。 1、nginx简介 Nginx…

3、css3 手写nav导航条(互相学习)

效果例图&#xff1a; 1、首先呈现的是html代码&#xff1a; <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><…

ARM32开发——库与包

&#x1f3ac; 秋野酱&#xff1a;《个人主页》 &#x1f525; 个人专栏:《Java专栏》《Python专栏》 ⛺️心若有所向往,何惧道阻且长 文章目录 嵌入式软件通用架构库SPL库HAL库MSP 嵌入式软件通用架构 库 标准外设库&#xff08;Standard Peripheral Library&#xff09;和H…

Python魔法之旅-魔法方法(03)

目录 一、概述 1、定义 2、作用 二、主要应用场景 1、构造和析构 2、操作符重载 3、字符串和表示 4、容器管理 5、可调用对象 6、上下文管理 7、属性访问和描述符 8、迭代器和生成器 9、数值类型 10、复制和序列化 11、自定义元类行为 12、自定义类行为 13、类…