当前位置: 首页 > article >正文

【微处理器系统原理与应用设计第十二讲】通用定时器设计二之PWM波实现呼吸灯的功能

一、基础知识

1、寄存器的配置

(1)GPIOX_AFRL:GPIO复用功能低位寄存器

GPIOX_AFRH:GPIO复用功能高位寄存器

(2)配置PA5 GPIOA->MODER(端口模式寄存器),10为复用功能,是指除了普通输入/出,还有其他功能TIM等

(3)GPIO->OTYPER:0为推挽,1为开漏输出,推挽输出在示波器上看主要为方波形,而开漏在示波器显示为锯齿波。但要注意使PUPDR设置为上拉电阻状态。

(4)GPIOX_OSPEED(端口输出速度寄存器):低速 2MHz,中速 10~25MHz 高速 20~50MHz,具体的大小与对应连接的电压和电容相关。

(5)设置AFRL寄存器,AF0~15指GPIOX的16种模式(一般AF0~7可改,4~6仅限GPIOA,8~15保留),AFR[0]指GPIOX_AFRL寄存器,管理0~7个管脚;AFR[1]指GPIOX_AFRH寄存器,管理8~15个管脚。

(6)TIM_CCER:捕获使能寄存器,使能输入捕获必须设置CC1E = 1

(7)TIM_CCR1:捕获/比较寄存器1,用来存储捕获发生时TIMX_CNT值,通过了一次上升沿捕获与下降沿捕获差值可算出高电平脉冲宽度。

2、占空比的计算

占空比(Duty Cycle)是脉冲信号中高电平持续时间与整个周期时间的比率。它通常用于描述脉冲宽度调制(PWM)信号,其中信号在一定频率下在高电平和低电平之间切换。

设置寄存器ARR的值确定周期,设置CCRx值设置占空比,CNT小于CCR时输出为高,CNT大于CCR输出为低,占空比 = CCR/ARR = 高电平时间/周期

3、实现逻辑原理

(1)PWM波利用微处理器的数字输出来控制模拟电路

(2)STM32没有专门的PWM引脚,所以采用IO口的复用模式

(3)TIM1是STM32高级定时器,它的每个通道都有对应的互补通道来互补输出PWM

(4)STM32的定时器除了TIM6和TIM7,其他定时器都可用来产生PWM输出。

(5)面积等效原理:只要正弦波与t坐标轴围起来阴影面积相同,不管哪种电压波形效果大概相同

 

二、功能需求

开发呼吸灯功能,即LED灯一亮一灭,亮灭交替,周而复始。亮灭时长约为1s。

三、设计思路

将PA5配置为TIM2的CH1输出。采用定时器TIM2产生PWM波形,周期为2s且占空比为50%,即1s时长的低电平、1s时长的高电平。

四、软件流程图

五、程序设计 

1、PWM输出端口初始化

采用PwmOutInit函数实现PA5复用为TIM2的CH1输出。代码如下:

void PwmOutInit(void)
{
	RCC->AHB1ENR|=1<<0; //使能GPIOA
	GPIOA->MODER=(GPIOA->MODER&~(0x3<<10))|(0x2<<10); //设置PA5为AF复用、推挽输出、无上拉、无下拉、中速
	GPIOA->OTYPER&=~(1<<5); 
	GPIOA->PUPDR&=~(0x3<<10);
	GPIOA->OSPEEDR=(GPIOA->OSPEEDR&~(0x3<<10))|(1<<10);
	GPIOA->AFR[0]=(GPIOA->AFR[0]&~(0xF<<20))|(1<<20); //设置AFRL寄存器,将PA5复用为TIM2的CH1输出
}

2、定时器初始化函数

采用TimerInit函数实现定时器2的参数配置。

时钟源TIMCLK的频率为16MHz,设计预分频系数N=2000,计数器分频系数M=16000,那么共320万个分频,定时时长为M*N/TIMCLK = 2s。因此预分频寄存器PSC的值为N-1 = 1999,自动重载寄存器ARR的值为M-1 = 15999.比较寄存器为计数器自动重载值的一半,即8000.具体代码如下:

void TimerInit(void)
{
	RCC->APB1ENR |=1<<0; //使能TIM2
	TIM2->CR1 =1<<7; //配置为自重载预载使能、边沿对齐、向上计数工作模式
	TIM2->PSC =1999; //16MHz/2000 = 8KHz
	TIM2->ARR =15999; //8KHz/16000=0.5Hz,PWM周期为2s
	TIM2-CCMR1 = (TIM2->CCMR1&~(0x00FF))|0x68; //配置CH1为PWM1输出模式
	TIM2->CCER |=1; //使能比较通道1作为输出
	TIM2->CCR1 8000; //占空比50%
	TIM->CR1 |=1; //开启TIM2
}

 

 


http://www.kler.cn/a/302100.html

相关文章:

  • Python小游戏24——小恐龙躲避游戏
  • 【知识科普】微内核架构与宏内核架构
  • FingerprintSimilarity和BulkTanimotoSimilarity的区别
  • ESP解释
  • 算法训练(leetcode)二刷第二十六天 | *452. 用最少数量的箭引爆气球、435. 无重叠区间、*763. 划分字母区间
  • layui.all.js:2 Uncaught Error: Syntax error, unrecognized expression
  • GitLab邮箱发送邮件:如何实现自动化发信?
  • unity3d c# 切换数字人效果
  • 【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】
  • 初学51单片机之IO口上下拉电阻相关
  • 渠道分析促增长,App如何靠渠道来源追踪构建评估体系
  • 大模型微调:RHLF与DPO浅析
  • Python面试宝典第48题:找丑数
  • element-plus组件问题汇总
  • javaWeb三剑客:html,css
  • “精装朋友圈”的年轻人,开始在40度高温买羽绒服
  • 青少年人工智能编程水平测试YCL备考秘籍
  • 针对Docker容器的可视化管理工具—DockerUI
  • 排序算法总结
  • AE软件下载,辅助你完成梦想作品
  • Redis 主从复制的原理详解
  • 获取1688 API 接口
  • PFC和LLC的本质和为什么要用PFC和LLC电路原因
  • 【Linux】Linux 共享内存:高效的进程间通信
  • 磁盘空间不足扩容lvm
  • proteus+51单片机+实验(LCD1620、定时器)