STM32(PWM、ADC)

news2024/11/23 21:42:58
1、PWM

定义

PWM,全称为脉冲宽度调制(Pulse Width Modulation),它通过改变信号的高电平和低电平的持续时间比例来控制输出信号的平均功率或电压。

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

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

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

总结起来,PWM 通过改变信号的高电平和低电平的时间比例来控制输出的平均电压或功率,是一种常用的调节信号的方法。

参数

周期

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

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

频率

在单位时间内,高低电平切换的次数,单位时间内PWM有多少个周期Hz

50Hz,一个周期是20ms,一秒有50个PWM周期

占空比

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

工作原理 

自动装载寄存器 (TIMx_ARR)

捕获/比较寄存器(TIMx_CCRx)

计数器寄存器 (TIMx_CNT)

输入捕获:

输入捕获可以用来捕获外部事件,比如引脚的电平变化(上升沿,下降沿),并记录下变化的时间,通常可以用来测量外部信号的频率或者电平持续的时间

输出比较:

此项功能是用来控制一个输出波形,当计数器与捕获/比较寄存器的内容相同时,输出比较功能做出相应动作,比如电平的翻转。通常用于生成PWM波形

向上计数:

输出过程:

当0-t1这段时间,计数器寄存器的CNT的值是小于CCR,输出高电平。

当t1-t2这段时间,计数器寄存器的CNT的值是大于CCR且小于ARR的,输出低电平。

当CNT的值达到ARR里的值时,产生溢出事件,自动清零再次从0开始向上计数。

应用:

led灯亮度调节、蜂鸣器控制、电机转速控制

练习:通过PWM信号调节LED灯亮度

选用引脚,设置为

选用外部晶振

配置外部晶振及频率

打开定时器并设为pwm

设置预分频和脉冲占空比

PWM初始化

HAL库函数

HAL_StatusTypeDef HAL_TIM_PWM_Start  (TIM_HandleTypeDef * htim, uint32_t Channel) 

功能:启动PWM信号生成

参数: htim:TIM句柄

Channel:  TIM要启用的通道,该参数可以是以下值之一

XXXXXXXXX

返回值:状态

代码编写

练习:实现呼吸灯效果

		for(num=1000;num>0;num-=2)
		{
			TIM3->CCR3=num;
			HAL_Delay(1);
		}
		for(num=0;num<1000;num+=2)
		{
			TIM3->CCR3=num;
			HAL_Delay(1);
		}

2、蜂鸣器

    简介

       蜂鸣器是采用直流电压供电的一个电子讯响器。

    分类

  有源蜂鸣器

          内部带有震荡源(时钟源),一通电就可以震荡发出响声,驱动较容易。

   因为是内部集成好的震荡电路,所以频率是固定的。

  无源蜂鸣器

          内部没有震荡源,直流电无法驱动,所以用一个方波信号来进行驱动,

   价格便宜,且频率可控。需要通过编程控制声调和响度,驱动稍麻烦。

蜂鸣器发声实验

蜂鸣器模块电路图

方法一:让单片机通过D1口交替输出高低电平

方法二:利用定时器输出PWM信号控制蜂鸣器

注意:这里是互补输出,所以启动函数不一样

HAL_StatusTypeDef HAL_TIMEx_PWMN_Start  (TIM_HandleTypeDef * htim, uint32_t Channel) 

功能:开始在互补输出端产生PWM信号

参数: htim:TIM句柄

Channel: TIM_CHANNEL_1:已选择TIM通道1

    TIM_CHANNEL_2:已选择TIM通道2

    TIM_CHANNEL_3:已选择TIM通道3

    TIM_CHANNEL_4:已选择TIM通道4

返回值:状态

     思考:声调和响度分别由什么决定?

ARR-> 周期->1/频率

周期越大,频率越小,声调越低

周期越小,频率越大,声调越高

CCR->脉冲 ->占空比

占空比越高,通电时间越长,响度越响

占空比越小,通电时间越短,响度越小

3、ADC(模拟信号转数字信号)

A:模拟信号Analog

模拟信号是指用连续变化的物理量所表达的信息,如温度、湿度、压力、长度、电流、电压等等,我们通常又把模拟信号称为连续信号,它在一定的时间范围内可以有无限多个不同的取值。模拟信号传输过程中,先把信息信号转换成几乎“一模一样”的波动电信号(因此叫“模拟”)(传感器可以将非电学量转换成电学量)

D:数字(Digital)

0、1(二进制)

数字信号,是指自变量是离散的、因变量也是离散的信号,这种信号的自变量用整数表示,因变量用有限数字中的一个数字来表示。在计算机中,数字信号的大小常用有限位的二进制数表示。

C:转换器(Converter

转换器(converter)是指将一种信号转换成另一种信号的装置。信号是信息存在的形式或载体。在自动化仪表设备和自动控制系统中,常将一种信号转换成另一种与标准量或参考量比较后的信号,以便将两类仪表联接起来,因此,转换器常常是两个仪表(或装置)间的中间环节。

最直观的体现,模拟信号是连续变化的曲线,而数字量是不连续的一个个离散的点。

    1. 概念

ADC,全称模数转换器(Analog-to-Digital Converter),模拟数字转换器即A/D转换器,ADC的作用就是将连续变化的模拟信号转换为离散的数字信号。通常的模数转换器是将一个输入电压信号转换为一个输出的数字信号。由于数字信号本身不具有实际意义,仅仅表示一个相对大小。故任何一个模数转换器都需要一个参考模拟量作为转换的标准,比较常见的参考标准为最大的可转换信号大小。而输出的数字量则表示输入信号相对于参考信号的大小

极其的巧妙设计!模拟转数字信号!5分钟让你看明白!ADC的工作原理,_哔哩哔哩_bilibili

    1.  ADC简介

12位ADC是一个逐次逼近型模数转换器。

它有多达19个多路通道,允许它测量来自16个外部源和3个内部源(温度传感、内部参考电压、外部电池)的信号。

各种通道的A/D转换可以在单个、连续、扫描或间断的模式下进行。

ADC的结果被存储在一个向左对齐或向右对齐的16位数据寄存器中。

    1.  ADC特性

量程:能测量电压的范围0~3.6V(单片机供电范围1.8 到3.6)

分辨率:ADC的分辨率通常以输出二进制数的位数表示,位数越多,分辨率越高,一般来说分辨率越高,转化时间越长。

可配置的转换精度:6位,8位,10位,12位。

转化时间:模拟输入电压在允许的最大变化范围内,从转换开始到获得稳定的数字量输出所需要的时间称为转换时间

4. ADC的时钟

SYSCLK  系统时钟

HSI 高速内部时钟(高速内部RC)

PLLP 锁相环倍频器(高速内部/高速外部)

    1. 工作模式   

单个、连续、扫描或间断的模式

1、单次转换模式:ADC只执行一次转换;(CHx:通道 )

  1. 连续转换模式:转换结束之后马上开始新的转换(没有停止)
  2. 扫描模式:ADC扫描选中的所有通道,在每个组的每个通道上执行单次转换。在每个转换结束时,这一组的下一个通道被自动转换。如果设置了CONT位(开启了连续转换模式),转换不会在选择组的最后一个通道上停止,而是再次从选择组的第一个通道继续转换。
  3. 间断模式:触发一次,转换一个通道,触发,转换。在所选转换通道循环,由触发信号启动新一轮的转换,直到转换完成为止。

EOC:通道转换结束信号

EOS:序列转换结束信号

ADC单通道:

       单次转换:只进行一次ADC转换:配置为“单次转换模式”,扫描模式关闭。ADC通道转换一次后,就停止转换。等待再次使能后才会重新转换

       连续转换:进行连续ADC转换:配置为“连续转换模式”,扫描模式关闭。ADC通道转换一次后,接着进行下一次转换,不断连续。(没有STOP)

ADC多通道:

单次转换: 只进行一次ADC转换:配置为“单次转换模式”,扫描模式使能。ADC的多个通道,按照配置的顺序依次转换一次后,就停止转换。等待再次使能后才会重新转换。

连续转换:进行连续ADC转换:配置为“连续转换模式”,扫描模式使能。ADC的多个通道,按照配置的顺序依次转换一次后,接着进行下一次转换,不断连续。

简单来说,ADC的作用就是将连续变化的模拟信号转换为离散的数字信号。我们生活中的声音、光线、温度等许多信号都是模拟信号,而计算机处理的是数字信号,所以需要使用ADC将模拟信号转换为计算机可以理解的数字形式。

实际上,ADC内部有一个采样和量化的过程。首先,它会以一定的时间间隔对模拟信号进行采样,即在一段时间内获取模拟信号的数值。然后,采样到的模拟信号经过量化处理,即将连续的模拟信号映射为离散的数字数值,通常使用二进制表示。

ADC的输出就是经过采样和量化后得到的数字信号,这些数字可以被计算机或其他数字设备处理和分析。通过ADC,我们可以将各种模拟信号转换为数字形式,以便进行存储、处理和控制。

    1. 单通道单次转换实验

实验:采集光照值、火焰、烟雾,并将数值打印到串口

  1. 分析原理图

光照模块

火焰模块

MX配置

串口配置

模数转换接口配置

ADC设置

编程实现

        1.启动ADC  (HAL精简87页)

HAL_StatusTypeDef HAL_ADC_Start (ADC_HandleTypeDef *  hadc)

   功能:启动ADC开始转换

  参数:ADC_HandleTypeDef *  hadc  句柄

 返回值:   状态

        2.等待转换结束 (HAL精简88页)

          HAL_StatusTypeDef HAL_ADC_PollForConversion  (ADC_HandleTypeDef * hadc, uint32_t Timeout)

 功能:等待转换完成

          参数: ADC_HandleTypeDef * hadc   句柄   

                       uint32_t Timeout    超时时间

           返回值:转换状态

        3.获取转换结果    (HAL精简89页)

uint32_t HAL_ADC_GetValue (ADC_HandleTypeDef * hadc)

       功能:获取转换结果

       参数:ADC_HandleTypeDef * hadc 句柄

       返回值:转换结果

      4.停止ADC     (HAL精简89页)

HAL_StatusTypeDef HAL_ADC_Stop (ADC_HandleTypeDef *  hadc)

 功能:停止ADC 

          参数:ADC_HandleTypeDef *  hadc  句柄

          返回值: 状态

light接收至少用16位接收

HAL_ADC_Start(&hadc1);									//启动ADC转换
HAL_ADC_PollForConversion(&hadc1,1000);	//等待转换
light = HAL_ADC_GetValue(&hadc1);				//获取采集的ADC值
HAL_ADC_Stop(&hadc1);										//ADC停止ADC
printf("lighet = %d\n",light);
HAL_Delay(1000);

int fputc(int ch,FILE* p //printf重写
{
	while(!(USART1->ISR & (1<<7)));
	USART1->TDR =	ch;
	return ch;
}

3.6多通道扫描模式单次转换实验

采集光照值和按键值通过串口打印

MX配置

在上一个工程的基础上增加按键的ADC

将PA1设置为ADC的输入通道

选择序列-扫描模式

代码编写

现在有两个通道需要转换且获取结果,当第一个通道转换完成时,会产生一个EOC信号,当整个序列转换完成时,会产生一个EOS信号

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

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

相关文章

STM32(DMA、DHT11)

1、DMA&#xff08;数据的搬运工&#xff09; DMA&#xff0c;全称为&#xff1a;Direct Memory Access&#xff0c;即直接存储器访问。DMA 传输方式无需 CPU 直接控制传输&#xff0c;也没有中断处理方式那样保留现场和恢复现场的过程&#xff0c;通过硬件为 RAM 与 I/O 设备开…

基于Python+OpenCV的车道线和车辆检测系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 本文将介绍如何使用Python编程语言结合OpenCV库进行车道线和车辆检测。这种技术常用于计算机视觉领域&#xff0c;特…

优秀编程习惯一: Git提交如何写注释

feat feat - A new feature : 一个新功能 fix fix - A bug fix : bug修复 docs docs - Documentation only changes : 仅更改文档 style style - Changes that do not affect the meaning of the code (white-space, formatting, missing semi-colons, etc) : 不影响代…

arduino - L7805CV三端稳压器

一、 介绍&#xff08;摘抄&#xff09; L7805CV是三端稳压器&#xff0c;78是正电压稳压&#xff0c;和它对应的79就是负电压&#xff0c;稳压05是传输电压的数值&#xff0c;所以它的意思就是正5伏的三端稳压器&#xff0c;通常可以直接代换&#xff0c;就是说它的输出电压在…

Pycharm的字体缩放设置

法1 法2 放大操作 increase 缩小操作 decrease 保存操作&#xff0c;点击OK结束

Spring Cloud + Vue前后端分离-第3章 SpringBoot项目技术整合

Spring Cloud Vue前后端分离-第3章 SpringBoot项目技术整合 3-1 集成持久层框架Mybatis ORM:对象关系映射&#xff0c;Hibernate是全自动ORM&#xff0c;Mybatis是半自动ORM&#xff0c;Mybatis可以操作的花样更多&#xff0c;是首选的持久层框架 System模块集成Mybatis框架…

如何利用Axure制作移动端产品原型

Axure是一款专业的快速原型设计工具&#xff0c;作为专业的原型设计工具&#xff0c;Axure 能够快速、高效地创建原型&#xff0c;同时支持多人协作设计和版本控制管理。它已经得到了许多大公司的采用&#xff0c;如IBM、微软、思科、eBay等&#xff0c;这些公司都利用Axure 进…

TA-Lib学习研究笔记(九)——Pattern Recognition (2)

TA-Lib学习研究笔记&#xff08;九&#xff09;——Pattern Recognition &#xff08;2&#xff09; 形态识别的函数的应用&#xff0c;通过使用A股实际的数据&#xff0c;验证形态识别函数&#xff0c;用K线显示出现标志的形态走势&#xff0c;由于入口参数基本上是open, hig…

并发集合框架

目录 前言 正文 1.集合框架结构 2. ConcurrentHashMap &#xff08;1&#xff09;验证 HashMap 不是线程安全的 &#xff08;2&#xff09;验证 Hashtable 是线程安全的 &#xff08;3&#xff09;验证 Hashtable 不支持并发 remove 操作 &#xff08;4&#xff09…

graphics.h安装后依旧报错

问题解决一&#xff1a; 我在网上找了很多&#xff0c;都说找到graphics.h这个文件&#xff0c;放到include这个目录下&#xff0c;我照做了&#xff0c;然后 当我进行编译时&#xff0c;自动跳到graphics.h这个文件并出现一堆报错 问题解决二&#xff1a; 看一下这两个文件是…

摄像头选型号指南

镜头选型工具 - HiTools - 海康威视 Hikvisionhttps://www.hikvision.com/cn/support/tools/hitools/cl8a9de13648c56d7f/ 1. 海康威视摄像头选型号指南 海康威视摄像头选型号指南-CSDN博客文章浏览阅读3.7k次。跟客服对话比跟AI对话好不了多少&#xff0c;能噎死人&#xff0…

题目:区间更新(蓝桥OJ 3291)

题目描述&#xff1a; 解题思路&#xff1a; 差分模板题。 题解&#xff1a; #include<bits/stdc.h> using namespace std;const int N 1e5 10; int a[N], diff[N] ;//数组的大小不可能开到大于1e9int res(int n, int m) {for(int i 1; i < n; i)cin >&g…

对比两阶段提交,三阶段协议有哪些改进?

本文我们来讨论两阶段提交和三阶段提交协议的过程以及应用。 在分布式系统中&#xff0c;各个节点之间在物理上相互独立&#xff0c;通过网络进行沟通和协调。在关系型数据库中&#xff0c;由于存在事务机制&#xff0c;可以保证每个独立节点上的数据操作满足 ACID。但是&…

AI模型部署 | onnxruntime部署YOLOv8分割模型详细教程

本文首发于公众号【DeepDriving】&#xff0c;欢迎关注。 0. 引言 我之前写的文章《基于YOLOv8分割模型实现垃圾识别》介绍了如何使用YOLOv8分割模型来实现垃圾识别&#xff0c;主要是介绍如何用自定义的数据集来训练YOLOv8分割模型。那么训练好的模型该如何部署呢&#xff1f…

小航助学题库白名单竞赛考级蓝桥杯等考scratch(10级)(含题库教师学生账号)

需要在线模拟训练的题库账号请点击 小航助学编程在线模拟试卷系统&#xff08;含题库答题软件账号&#xff09; 需要在线模拟训练的题库账号请点击 小航助学编程在线模拟试卷系统&#xff08;含题库答题软件账号&#xff09;

chineseocr项目不使用web推理-docker容器化

整个流程介绍 拉取 ufoym/deepo 镜像 -- 因为包含了主流深度学习框架&#xff0c;镜像4G出头。拉取 chineseocr 项目代码。修改代码&#xff0c;不使用web&#xff0c;增加命令行传入图片路径的功能打包成docker镜像。 开始 拉取 ufoym/deepo 镜像 &#xff1a;cpu版本为例 do…

封装ThreadLocal

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 为什么要封装ThreadLoc…

geemap学习笔记020:如何搜索Earth Engine Python脚本

前言 本节内容比较简单&#xff0c;但是对于自主学习比较重要&#xff0c;JavaScript提供了很多的示例代码&#xff0c;为了便于学习&#xff0c;geemap将其转为了Python代码。 Earth Engine Python脚本 import ee import geemapee.Initialize()geemap.ee_search() #搜索Ear…

Vue3网站用户引导功能【Intro.js】

一、介绍 Intro.js 是一个用于创建网站用户引导、功能介绍和教程的 JavaScript 库。它允许开发者通过步骤和提示突出显示网站上的特定元素&#xff0c;以帮助用户更好地了解和使用网站的功能。以下是 Intro.js 的一些关键特点和用法介绍&#xff1a; 更多Intro.js 功能网址&a…

图扑数字孪生压缩空气储能管控平台

压缩空气储能在解决可再生能源不稳定性和提供可靠能源供应方面具有重要的优势。压缩空气储能&#xff0c;是指在电网负荷低谷期将电能用于压缩空气&#xff0c;在电网负荷高峰期释放压缩空气推动汽轮机发电的储能方式。通过提高能量转换效率、增加储能密度、快速启动和调节能力…