单片机_day8_时钟系统+定时器+PWM

embedded/2024/11/25 19:14:23/

目录

1.2 时钟源

1.3  STM32U5时钟源

1.4  时钟树

1.5  STM32CubeMX时钟树配置

2. Systick定时器

2.1 概念

2.2   工作原理

2.3 滴答定时器分析

3. TIM定时器

3.1 基本概念

3.2  STM32U5定时器

3.3 ​​​​​​​定时器框图

3.3.1 ​​​​​​​预分频器

3.3.2 ​​​​​​​自动重装寄存器

3.3.3 ​​​​​​​计数器

​​​​​​​3.4  TIM定时器定时算法训练

4. 定时器实验

4.1 cubeMX配置

​​​​​​​4.2 编程

5.  PWM

5.1 定义

​​​​​​​5.2  参数 

​​​​​​​5.3 PWM生成原理

PWM模式

5.4 风扇调速实验


1. 时钟系统

1.1 时钟基本概念

void delay(int T)
{int a,b;for(a=0;a<T;a++)for(b=0;b<100;b++);
}

1s = 1000ms =1000000us

假如时钟频率是4M,所以运行一条指令的时间是1/4us,那么100条延时时间就是25us

1) 时钟是嵌入式系统的脉搏,在电子系统中,时钟信号可以被理解为一个周期性的信号,它确定了系统的节奏和时间基准。处理器内核在时钟驱动下完成指令执行,状态变换等动作,外设部件在时钟的驱动下完成各种工作,例如:串口数据的发送、AD转换、定时器计数等。

因此时钟对于计算机系统是至关重要的,通常时钟系统出现问题也是致命的,比如振荡器不起振、振荡不稳、停振等。时钟信号推动单片机内各个部分执行相应的指令,时钟就像人的心跳一样。

2)时钟系统的组成:振荡器(信号源)、唤醒定时器、倍频器、分频器

振荡器:产生信号的源头

唤醒定时器:使能、关闭功能

倍频器:放大频率

分频器:分频

振荡器(信号源):振荡器是时钟系统的基础,它提供一个稳定的振荡信号作为时钟源。振荡器可以是晶体振荡器、RC振荡器等,它们产生的信号频率决定了时钟系统的基本节拍。

唤醒定时器(Wake-up Timer):唤醒定时器是一种特殊的定时器,用于在设备处于低功耗模式时定期唤醒设备。它通常基于时钟信号计数,并在设定的时间间隔后触发唤醒信号。

倍频器(Clock Multiplier):倍频器用于将时钟信号的频率进行倍增,以产生更高频率的时钟信号。倍频器通常通过锁相环(PLL)来实现,可以根据需要调整输出时钟频率。

分频器(Clock Divider):分频器用于将时钟信号的频率进行分频,以产生较低频率的时钟信号。分频器通常通过调整分频比来控制输出时钟频率。

分频器:外设需要不同的频率,为了降低功耗,可以进行分频以提供不同频率时钟信号。

为什么要设计 倍频器和分频器?

答:1)为了降低成本(CPU需要更高的时钟频率)

2)减少功耗(外设需要不同的时钟频率)

1.2 时钟源

常见振荡器的有哪些?

振荡器主要分为晶体、RC、LC

  1. 晶体振荡器(Crystal Oscillator):晶体振荡器使用石英晶体作为振荡元件。石英晶体具有压电效应,当施加电场时,会以固定频率产生机械振动。晶体振荡器利用石英晶体的这种特性,通过电子电路驱动晶体振荡,产生稳定的振荡信号。晶体振荡器的频率稳定性非常高。

无源:

没有信号源,靠外部给 蜂鸣器

有源:

有信号源,外部不需要给 蜂鸣器

优点:晶体振荡器信号稳定、质量好,连接方式简单。

缺点:价格高,需要较长的启动时间(起振时间)

晶体振荡器分类:

无源晶振是有2个引脚的无极性元件,需要借助于时钟电路才能产生振荡信号,自身无法振荡起来。(谐振器)

有源晶振有4只引脚,是一个完整的振荡器,其中除了石英晶体外,还有晶体管和阻容元件,因此体积较大。有源晶振不需要CPU的内部振荡器,信号稳定,质量较好,而且连接方式比较简单。(振荡器)

2. RC振荡器(Resistor-Capacitor Oscillator):RC振荡器使用电阻和电容器构成一个简单的振荡回路。当电容器充放电达到某个阈值时,会产生周期性的振荡信号。RC振荡器通常成本低、结构简单,但其频率稳定性较差,受到温度、供电电压等环境因素影响较大。

(在芯片内部)

优点:实现的成本比较低,仅由电阻电容构成。

缺点:精度存在问题,振荡频率会存在误差。

RC振荡器

晶体振荡器

构成

电阻电容

石英晶体

优点

成本低

稳定、精度高

缺点

震荡频率会有误差、受温湿度影响

价格高、需接起振电容

1.3  STM32U5时钟源

参考手册(481页)

I2S是专门给一个引脚提供的,这里不做解释。

HSI(High Speed Internal)

HSI : 高速内部时钟,由RC振荡器产生16Mhz的时钟频率。

HSE(High Speed External)

HSE :高速外部时钟,由外部石英晶体/陶瓷谐振器产生4-50Mhz的时钟信号,咱们外接12Mhz晶振。

LSI(Low Speed Internal)

LSI :低速内部时钟,由低速RC振荡电路产生32Khz的时钟频率。

LSE(Low Speed External)

LSE:低速外部时钟,由低速晶振产生32.768Khz的时钟频率。

1MHZ=10^3KHZ=10^6HZ

1.4  时钟树

参考手册(483页)

1.5  STM32CubeMX时钟树配置

打开STM32外部时钟的方法

2. Systick定时器

2.1 概念

    SysTick又称滴答定时器。是一个定时设备,位于Cortex-M33内核中,和NVIC配合使用(可以产生异常信号),产生SysTick异常可以对输入的时钟进行计数,系统定时器一般用于操作系统,用于产生时基,维持操作系统的心跳。(1ms)

频率 单位是HZ KHZ MHZ,符号:f 一秒钟震荡的次数

周期 单位是S ms us 符号:T 震荡一次所需的时间

1KHZ 代表1s震荡1000次,震荡一次的时间 1/1000s=1ms

2.2   工作原理

    滴答定时器是一个24位递减定时器,也就是最多能计数2^24(0xFFFFFF) 16,777,216。

SysTick设定初值并使能后,每来一个时钟信号,计数值就减1。

计数减到0时,触发异常,SysTick计数器自动重装,初值并继续减一,循环不断。

寄存器

输入是1MHZ的话,定时1ms该怎么定?

算出1MHZ的周期,即计一个数所需要的时间,算出为1us,那计时1ms,需要计数1000次,那么就需要我们给重载数值寄存器写1000-1

开始计时时,重载数值寄存器会给定时计数器赋值,将1000-1赋值给计数器,从此每来一个时钟周期计数器-1,当减到0的时候,计数1000个,触发中断,重载数值寄存器重新将1000-1再赋值给计数器,以此往复实现每隔1ms触发一次异常(中断)

所以,所谓的定时器,就是对时钟信号进行计数,当达到相应的计数值的时候,就会触发中断并重新开始计数。

定时器就是计数器

输入时钟频率为4MHZ,计1ms该计多少个数,如何配置寄存器?

输入频率4MHZ ---> 1us计数4 1ms-->4000个数

重载数值寄存器 :4000-1

输入时钟频率为32KHZ,计200ms该计多少个数,如何配置寄存器?

32KHZ--->1ms震荡32次 --->200ms--->32*200=6400

重载数值寄存器 :6400-1

2.3 滴答定时器分析

输入频率:4MHZ

可知重载寄存器的初始默认值为4000-1

得出结论:系统滴答定时器默认每隔1ms触发一次异常(中断)

既然是中断,那肯定会进自己的处理函数

 

 

得出结论,系统默认每隔1ms让1个叫uwTick的变量自加1

3. TIM定时器

SysTick(嘀嗒定时器)是在内核里(ARM公司设计) 、定时器(ST、芯片厂商)

3.1 基本概念

    定时器类似于我们生活中的闹钟,可以设定一个时间来提醒我们。定时器可以作为基本的定时器/计数器,

     用于生成周期性的定时中断或作为计数器来计数外部事件的脉冲数。例如1秒钟进入定时器中断干一件事,定时器可以配置为产生脉冲宽度调制(PWM)信号,用于控制电机速度、LED亮度调节,风扇风速调节,等应用。

​​​​​​​3.2  STM32U5定时器

    定时器是存在于STM32U5单片机中的一个外设,总共有11个定时器,分别是2个高级定时器(TIM1,TIM8)7个通用定时器(TIM2,TIM3,TIM4,TIM5,TIM15,TIM16,TIM17)和2个基本定时器(TIM6,TIM7)

定时器的基本结构是通用的,很多模块电路都能用到,所以STM32定时上扩展了非常多的功能,根据复杂度和应用场景分为了高级定时器、通用定时器、基本定时器三种类型。

计数器的分辨率:重装载计数器最大可以写多少

计数器类型:向上、向下计数,向上再向下计数

预分频因子:预分频因子是用于配置定时器和计数器模块的一个参数,用于控制时钟信号的分频比。通过设置不同的预分频因子,可以改变定时器和计数器的计数频率,从而实现不同的定时和计数功能。16位的寄存器,可以设置的值范围为0到65535。设置为0时表示不进行分频,设置为1时表示将输入时钟分频为2,以此类推。

3.3 ​​​​​​​定时器框图

定时器基本三大件

PSC:预分频器

CNT:计数器

ARR:自动重装载寄存器

3.3.1 ​​​​​​​预分频器

3.3.2 ​​​​​​​自动重装寄存器

3.3.3 ​​​​​​​计数器

​​​​​​​3.4  TIM定时器定时算法训

32MHZ 计时10ms 需要配置那些寄存器,如何配置?

PSC:31 32分频 计数器计数频率1MHZ

ARR: 10000-1

16MHZ初始频率,计时700ms如何配置?

PSC:16000-1 16000分频 计数器输入频率:1KHZ

ARR:700-1

4. 定时器实验

4.1 cubeMX配置

1.选定时器

  1. 根据所选定时器查手册看看在那个总线上

  1. 根据总线查相关定时器的输入频率

4.配置时间

5.打开中断

  1. 打开风扇引脚

​​​​​​​4.2 编程

重写中断处理函数

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)

主函数启动定时器

5.  PWM

5.1 定义

    PWM,全称为脉冲宽度调制(Pulse Width Modulation),是一种调节信号的方法。简单来说,PWM 就是通过改变信号的高电平和低电平的时间比例来控制输出的平均电压或功率

想象一下,我们有一个周期性的信号,其中高电平表示“开”状态,低电平表示“关”状态。PWM 就是在一个固定的时间周期内,通过改变高电平和低电平的持续时间来控制信号的特性。例如,如果我们将高电平持续时间设为较长,低电平持续时间设为较短,那么平均电压或功率就会比较高。相反,如果高电平持续时间设为较短,低电平持续时间设为较长,平均电压或功率就会比较低。

通过不断地调整高电平和低电平的持续时间比例,我们可以得到不同的输出效果。这种方法常用于控制电机的速度、调光灯的亮度、音频设备的音量等。

​​​​​​​5.2  参数 

周期

高低电平变化所需要的时间,单位:ms

T=1/f T是周期,f是频率。

频率

在1秒钟内,信号从高电平到低电平再回到高电平的次数,也就是说一秒钟PWM有多少个周期,单位Hz。

例如:如果频率为50Hz ,也就是说一个周期是20ms,那么一秒钟就有50次PWM周期。

1000 ms / 50 = 20 ms

占空比

在一个脉冲周期内,高电平的时间占整个周期时间的比例,单位是% (0%-100%)。

​​​​​​​5.3 PWM生成原理

PSC预分频器

ARR 自动重装载寄存器

CNT 计数器

CCR 捕获比较寄存器

PWM模式

​​​​​​​

5.4 风扇调速实验

做一个按键控制风扇速度的程序

HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1); //开启PWM输出TIM3->CCR1=; //开启PWM输出


http://www.ppmy.cn/embedded/139359.html

相关文章

php 使用mqtt

在 Webman 框架中使用 MQTT 进行消息的发布和订阅&#xff0c;你可以借助 PHP 的 MQTT 客户端库&#xff0c;比如 phpMQTT。以下是一个简单的示例&#xff0c;展示了如何在 Webman 中使用 MQTT 发布和订阅消息。 安装 phpMQTT 首先&#xff0c;你需要通过 Composer 安装 phpMQ…

统计机器学习——线性回归与分类

chapter2 线性回归与分类 例2.1 import pandas as pd data = pd.read_csv("../data/第2章数据/diabetes.csv",index_col=0)Index = data.columns xtitle = [index for index in Index if x. in index] x2title = [index for index in Index if x2. in index] xdata…

【实操之 图像处理与百度api-python版本】

1 cgg带你建个工程 如图 不然你的pip baidu-aip 用不了 先对图片进行一点处理 $ 灰度处理 $ 滤波处理 参考 import cv2 import os def preprocess_images(input_folder, output_folder):# 确保输出文件夹存在if not os.path.exists(output_folder):os.makedirs(output_fol…

数据结构(双向链表——c语言实现)

双向链表相比于单向链表的优势&#xff1a; 1. 双向遍历的灵活性 双向链表&#xff1a;由于每个节点都包含指向前一个节点和下一个节点的指针&#xff0c;因此可以从头节点遍历到尾节点&#xff0c;也可以从尾节点遍历到头节点。这种双向遍历的灵活性使得在某些算法和操作中&a…

EDA实验设计-led灯管动态显示;VHDL;Quartus编程

EDA实验设计-led灯管动态显示&#xff1b;VHDL&#xff1b;Quartus编程 引脚配置实现代码RTL引脚展示现象记录效果展示 引脚配置 #------------------GLOBAL--------------------# set_global_assignment -name RESERVE_ALL_UNUSED_PINS "AS INPUT TRI-STATED" set_…

libjpeg库——图像压缩与解压的核心技术

引言 在数字图像处理领域&#xff0c;图像压缩与解压技术扮演着至关重要的角色。随着数字图像的广泛应用&#xff0c;高效地存储和传输图像数据成为了一项关键技术需求。libjpeg库&#xff0c;作为一个开源的图像压缩解压缩库&#xff0c;凭借其丰富的功能和灵活的接口&#x…

数据库基础(MySQL)

1. 数据库基础 1.1 什么是数据库 存储数据用文件就可以了&#xff0c;为什么还要弄个数据库? 文件保存数据有以下几个缺点&#xff1a; 文件的安全性问题文件不利于数据查询和管理文件不利于存储海量数据文件在程序中控制不方便 数据库存储介质&#xff1a; 磁盘内存 为…

2024年11月19日Github流行趋势

项目名称&#xff1a;build-your-own-x 项目维护者&#xff1a;danistefanovic, rohitpaulk, sarupbanskota 等项目介绍&#xff1a;通过从零开始重新创建你最喜欢的技术来掌握编程。项目star数&#xff1a;312,081项目fork数&#xff1a;29,004 项目名称&#xff1a;freqtrad…