STM32(PWM、ADC)

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.mfbz.cn/a/221232.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【SQL 基础教程】w3school-SQL-基础知识-总结笔记

SQL-基础-笔记 一、简介 1&#xff1a;什么是 SQL&#xff1f; SQL 是用于访问和处理数据库的标准的计算机语言。 SQL 指结构化查询语言 SQL 使我们有能力访问数据库 SQL 是一种 ANSI 的标准计算机语言 2&#xff1a;SQL 能做什么&#xff1f; SQL 可在数据库中插入新的记录、删…

css实现姓名两端对齐

1.1 效果 1.2 主要代码 text-align-last: justify; 1.3 html完整代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0&quo…

数据结构之插入排序

目录 前言 插入排序 直接插入排序 插入排序的时间复杂度 希尔排序 前言 在日常生活中&#xff0c;我们不经意间会遇到很多排序的场景&#xff0c;比如在某宝&#xff0c;某东上买东西&#xff0c;我们可以自己自定义价格是由高到低还是由低到高&#xff0c;再比如在王者某…

机器连接和工业边缘计算

软件应用和IT创新是制造业投资的主要驱动力。解决方案架构应围绕特定标准进行整合&#xff0c;并采用架构蓝图和最佳实践来满足最终用户的需求。此外&#xff0c;边缘计算&#xff08;Edge Computing&#xff09;也将在制造业中加速部署。 边缘计算是制造业的下一个变革驱动力。…

设计模式篇之创建型模式

目录 前言一、简单工厂模式二、工厂方法模式总结 前言 最近开始整理Java设计模式&#xff0c;本篇主要分享设计模式中的创建型模式&#xff0c;并给出demo代码&#xff0c;适合初中级开发学习。分享书籍《大话设计模式》&#xff0c;分享GitHub学习设计模式仓库。 一、简单工厂…

Zookeeper(服务注册中心)安装以及启动服务

概述 ZooKeeper是一个分布式的开源协调服务&#xff0c;用于管理和协调大规模分布式系统中的各种任务。它提供了一个简单的分层命名空间&#xff0c;以及对数据的强一致性&#xff08;ACID特性&#xff09;和高可用性的支持。 ZooKeeper提供了一个类似文件系统的层次结构&…

智能优化算法应用:基于混沌博弈算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于混沌博弈算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于混沌博弈算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.混沌博弈算法4.实验参数设定5.算法结果6.参考…

从零开始的Spring Cloud Gateway指南:构建强大微服务架构

目录 一、 什么是Gateway&#xff1f;1. 网关的由来2. 网关的作用3. 网关的技术实现 二、如何搭建一个简易网关服务1. 引入依赖2. 配置yml文件 三、进阶话题&#xff1a;过滤器和路由配置1. gateway的执行原理2. 路由断言工厂: Predicate Factory3. 网关过滤器&#xff1a;Gate…

UE Windows平台下Linux的交叉编译项目打包

UE Windows平台下Linux的交叉编译项目打包 交叉编译&#xff08;Cross-compilation&#xff09; 使得在以Windows为中心的工作流程中工作的游戏开发者能够以Linux为目标对项目进行打包。目前&#xff0c;只有Windows支持交叉编译。 交叉编译支持的平台 Windows | Linux-x86_…

java8 常用code

文章目录 前言一、lambda1. 排序1.1 按照对象属性排序&#xff1a;1.2 字符串List排序&#xff1a;1.3 数据库排序jpa 2. 聚合2.1 基本聚合&#xff08;返回对象list&#xff09;2.2 多字段组合聚合&#xff08;直接返回对象list数量&#xff09; 二、基础语法2.1 List2.1.1 数…

附录B 存储次层次结构回顾

1. 引言 缓存是指地址离开处理器后遇到的最高级或第一级存储器层次结构。 如果处理器在缓存中找到了所请求的数据项&#xff0c;就说发生了缓存命中。如果处理器没有在缓存中找到所请求的数据项&#xff0c;就说发生了缓存缺失。此时&#xff0c;包含所请求的字的固定大小的数…

五年制专转本经验分享

五年制专转本经验分享 提早设定学习目标&#xff0c;会让你努力更有方向&#xff01;同学们在大一、大二时不要以为专转本离你还很远&#xff0c;时际上根据我们十多年的培训经验来说&#xff0c;专转本备考越早准备越有利于通过&#xff01;大家知道英语科目的话&#xff0c;在…

LeetCode437.路径总和III

看完题目我就拿直接用递归写了如下代码&#xff1a; class Solution {private int ans;public int pathSum(TreeNode root, int targetSum) {ans 0;dfs(root, targetSum, 0);return ans;}public void dfs(TreeNode root, int targetSum, int sum){if(root null)return;sum r…

Python中判定列表是否包含某个元素的方法

更多Python学习内容&#xff1a;ipengtao.com 大家好&#xff0c;我是彭涛&#xff0c;今天为大家分享 Python中判定列表是否包含某个元素的方法&#xff0c;全文4000字&#xff0c;阅读大约10分钟。 在Python编程中&#xff0c;判定一个列表是否包含特定元素是一项常见任务。本…

界面控件DevExpress WPF导航组件,助力升级应用程序用户体验!(上)

DevExpress WPF的Side Navigation&#xff08;侧边导航&#xff09;、TreeView、导航面板组件能帮助开发者在WPF项目中添加Windows样式的资源管理器栏或Outlook NavBar&#xff08;导航栏&#xff09;&#xff0c;DevExpress WPF NavBar和Accordion控件包含了许多开发人员友好的…

Apache或Nginx在Linux上配置虚拟主机

在Linux上使用Apache或Nginx配置虚拟主机可以让您在同一台服务器上托管多个网站。这样不仅可以充分利用服务器资源&#xff0c;还能降低每个网站的运营成本。以下是使用Apache和Nginx配置虚拟主机的步骤。 使用Apache配置虚拟主机 安装Apache服务器软件。在终端中使用以下命令…

『亚马逊云科技产品测评』活动征文|基于亚马逊EC2云服务器配置Nginx静态网页

授权声明&#xff1a;本篇文章授权活动官方亚马逊云科技文章转发、改写权&#xff0c;包括不限于在 Developer Centre, 知乎&#xff0c;自媒体平台&#xff0c;第三方开发者媒体等亚马逊云科技官方渠道 亚马逊EC2云服务器&#xff08;Elastic Compute Cloud&#xff09;是亚马…

JSON 语法详解:轻松掌握数据结构(下)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

金融科技走向 Web3 的趋势不可逆转——新加坡金融科技节会后总结(上)

11 月 15 日至 17 日&#xff0c;2023 年度新加坡金融科技节&#xff08;Singapore FinTech Festival&#xff0c;以下简称 SFF&#xff09;在樟宜机场附近的新加坡会展中心&#xff08;Singapore Expo&#xff09;举办。我本人受新加坡金管局的邀请&#xff0c;第一次亲身参与…

百度APP iOS端包体积50M优化实践(七)编译器优化

一. 前言 百度APP iOS端包体积优化系列文章的前六篇重点介绍了包体积优化整体方案、图片优化、资源优化、代码优化、无用类优化、HEIC图片优化实践和无用方法清理&#xff0c;图片优化是从无用图片、Asset Catalog和HEIC格式三个角度做深度优化&#xff1b;资源优化包括大资源…
最新文章