首页 > 其他分享 >定时器PWM输出实验

定时器PWM输出实验

时间:2023-12-21 18:00:14浏览次数:36  
标签:输出 使能 定时器 TIM14 TIM GPIO PWM

定时器PWM输出实验

由于是用TIM定时器输出,必涉及到IO口的复用。

原理:以上计数方式为例:计数器从零计数到arr(重装载值),此过程中,我们定义一个crr_x,则被分为两种情况:计时器值大于crr_x,计数器值小于crr_x。我们使第二种情况输出低电平,第一种情况输出高电平,就可以得到输出电平。我们调整arr和crr_x的值,就可以调整输出电平的周期和占空比。定时器PWM输出有两种模式:向上计数时:第一个模式为计数器值小于crr_x输出有效电平,第二种模式为计时器值大于crr_x时输出有效电平。我们可以规定高电平或低电平为有效电平来控制输出电平。

高级定时器有七个通道,通用定时器有四个通道,每个通道都能独立输出一路PWM信号。

本实验是用TIM14的通道一来实现DS1的逐渐变亮和暗(不断调整输出的PWM信号的占空比达到)

实验流程:

1,使能时钟

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14,ENABLE); //TIM14时钟使能
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);

2,初始化IO口为复用功能输出

3.GPIO口复用映射到TIM14

  GPIO_PinAFConfig();

4,初始化定时器

TIM_TimeBaseInit();

对于通用寄存器初始化:

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式1(PWM模式一上文已介绍,上计数是小于比较值的为有效电平)
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性:TIM输出比较极性低(低电平为有效电平)

5初始化输出比较参数

TIM_OC1Init();(因为用的是通道一,如果其他通道为TIM_OCx_Init();)

6 使能输出预装载和自动重装载的预装载寄存器允许位

TIM_OCxPreloadConfig();//

 TIM_ARRPreloadConfig();//

7,使能定时器

TIM_Cmd()

8,不断改变比较值,来达到不同占空比的效果

TIM_SetCompare1();

 

 

完整代码:

void TIM14_PWM_Init(u32 arr,u32 psc)
{
//此部分需手动修改IO口设置

GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14,ENABLE); //TIM14时钟使能
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE); //使能PORTF时钟

GPIO_PinAFConfig(GPIOF,GPIO_PinSource9,GPIO_AF_TIM14); //GPIOF9复用为定时器14

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //GPIOF9
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //复用功能
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //速度100MHz
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
GPIO_Init(GPIOF,&GPIO_InitStructure); //初始化PF9

TIM_TimeBaseStructure.TIM_Prescaler=psc; //定时器分频
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
TIM_TimeBaseStructure.TIM_Period=arr; //自动重装载值
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;

TIM_TimeBaseInit(TIM14,&TIM_TimeBaseStructure);//初始化定时器14

//初始化TIM14 Channel1 PWM模式
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式2
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性:TIM输出比较极性低
TIM_OC1Init(TIM14, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM1 4OC1

TIM_OC1PreloadConfig(TIM14, TIM_OCPreload_Enable); //使能TIM14在CCR1上的预装载寄存器

TIM_ARRPreloadConfig(TIM14,ENABLE);//ARPE使能

TIM_Cmd(TIM14, ENABLE); //使能TIM14
}

 

 

主函数中:我们想不断改变占空比:

if(dir)led0pwmval++;//dir==1 led0pwmval递增
else led0pwmval--; //dir==0 led0pwmval递减
if(led0pwmval>300)dir=0;//led0pwmval到达300后,方向为递减
if(led0pwmval==0)dir=1; //led0pwmval递减到0后,方向改为递增
TIM_SetCompare1(TIM14,led0pwmval); //修改比较值,修改占空比

 

标签:输出,使能,定时器,TIM14,TIM,GPIO,PWM
From: https://www.cnblogs.com/panshoudeng/p/17919765.html

相关文章

  • 【go】Go (Golang) 语言-Golang 定时器Timer和Ticker、time.AfterFunc、time.NewTicke
    Golang定时器Timer和TickerGolang定时器包括:一次性定时器(Timer)和周期性定时器(Ticker)。编程中经常会通过timer和ticker、AfterFunc定时器NewTicker是设定每隔多长时间触发的,是连续触发,而计时器NewTimer是等待多长时间触发的,只触发一次,两者是不同的。等待时间函数AfterFunc是......
  • 通用定时器及定时器中断实验
    定时器:顾名思义是用来定时的一个外设。stm32有八个定时器,分三类计数器计数模式又分为三种:向上,向下,向上/下计数。向上:计数器从零计数到自动加载值,然后重新从零开始并产生一个计数器溢出事件。向下:计数器从自动加载值计数到零,然后重新从自动加载值开始并产生一个计数器溢出事件......
  • 使用redbaron删除删除一个.py文件的所有注释,输出到一个新.py文件,文件名加上_nocmts后
    BUG:目前输出的文件中可能会出现缩进错误,待修改。fromredbaronimportRedBarondefremove_comments_with_redbaron(source_py_file,keep_blank_lines):withopen(source_py_file,'r',encoding='utf-8')asfile:red=RedBaron(file.read())co......
  • 写一个MATLAB脚本删除一个.m文件的所有注释和空行,输出到一个新.m文件,文件名加上_modif
    请注意,这个脚本仅处理了最简单的情况,真正的Matlab代码可能包含更复杂的结构,如多行字符串、嵌套的字符串、转义字符等,处理这些情况可能需要更复杂的逻辑。%Specifytheinput.mfilenameinputFileName='originalScript.m';outputFileName=[inputFileName(1:end-2)'_modi......
  • 内核定时器
    1.节拍器  100hz10ms间隔,jiffies其实就是jiffies_64的低32位  记录系统节拍树,因为是32位所以记录最大值为4294967296(个节拍,也就是这么多个10ms) 4294967296/100/60/60/24= 49.7天 就会归零,也叫绕回  可以用相关的API函数处理,实现定时一秒的节拍数是HZ特点:......
  • 关于DC电源模块有哪些常见的输入和输出参数?
    关于DC电源模块有哪些常见的输入和输出参数?BOSHIDADC电源模块是一种用于将交流电转换为直流电的设备,广泛应用于电子设备、通信设备、工业控制、仪器仪表等各个领域。在选择和使用DC电源模块时,了解其常见的输入和输出参数是很重要的。输入参数是指DC电源模块的工作电压范围和电流......
  • 关于DC电源模块有哪些常见的输入和输出参数?
    关于DC电源模块有哪些常见的输入和输出参数?BOSHIDADC电源模块是一种用于将交流电转换为直流电的设备,广泛应用于电子设备、通信设备、工业控制、仪器仪表等各个领域。在选择和使用DC电源模块时,了解其常见的输入和输出参数是很重要的。 输入参数是指DC电源模块的工作电压范围......
  • 【C语言】puts()字符串输出函数 | 自动换行
    ......
  • LED洗墙灯光源驱动芯片AP5199S降压恒流pwm调光IC
    说明AP5199S是一款外围电路简单的多功能平均电流型 LED 恒流驱动器,适用于宽电压范围的非隔离式大功率恒流 LED 驱动领域。芯片PWM端口支持超小占空比的PWM调光,可响应最小 60ns 脉宽。芯片采用我司专利算法,为客户提供最佳解决方案,最大限度地发挥灯具优势,以实现景观舞台......
  • LED洗墙灯光源驱动芯片AP5199S降压恒流pwm调光IC
    说明AP5199S是一款外围电路简单的多功能平均电流型 LED 恒流驱动器,适用于宽电压范围的非隔离式大功率恒流 LED 驱动领域。芯片PWM端口支持超小占空比的PWM调光,可响应最小 60ns 脉宽。芯片采用我司专利算法,为客户提供最佳解决方案,最大限度地发挥灯具优势,以实现景观舞台灯......