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

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信号

相关文章:

  • JS箭头函数
  • maven-profile
  • 在AWS Lambda上部署EC2编译的FFmpeg工具——自定义层的方案
  • 最新水果软件FL Studio21.2.0永久激活注册码
  • ubuntu 20.04 server 安装 zabbix
  • Redis集群:Sentinel哨兵模式(图文详解)
  • 02 硬件知识入门(电容)
  • 3分钟在CentOS 7上离线安装Docker
  • Flink之复杂事件处理CEP
  • VSC改造MD编辑器及图床方案分享
  • [UGUI]实现从一个道具栏拖拽一个UI道具到另一个道具栏
  • vue 全局封装文件下载及导入
  • Hadoop学习笔记(HDP)-Part.13 安装Ranger
  • 【开源】基于Vue+SpringBoot的数据可视化的智慧河南大屏
  • less 笔记
  • [LeetCode] Wiggle Sort
  • [微信小程序] 使用ES6特性Class后出现编译异常
  • [译] React v16.8: 含有Hooks的版本
  • CentOS从零开始部署Nodejs项目
  • CSS3 聊天气泡框以及 inherit、currentColor 关键字
  • ECS应用管理最佳实践
  • JavaWeb(学习笔记二)
  • JS题目及答案整理
  • node学习系列之简单文件上传
  • oschina
  • Spark学习笔记之相关记录
  • 对象管理器(defineProperty)学习笔记
  • 复杂数据处理
  • 排序算法学习笔记
  • 微信支付JSAPI,实测!终极方案
  • 学习HTTP相关知识笔记
  • 在Unity中实现一个简单的消息管理器
  • 责任链模式的两种实现
  • 从如何停掉 Promise 链说起
  • 你学不懂C语言,是因为不懂编写C程序的7个步骤 ...
  • (Redis使用系列) Springboot 使用redis实现接口幂等性拦截 十一
  • (vue)页面文件上传获取:action地址
  • (二)fiber的基本认识
  • (六)Hibernate的二级缓存
  • (七)MySQL是如何将LRU链表的使用性能优化到极致的?
  • (学习日记)2024.03.25:UCOSIII第二十二节:系统启动流程详解
  • (一)VirtualBox安装增强功能
  • (一一四)第九章编程练习
  • (转)Linux下编译安装log4cxx
  • (转)大型网站的系统架构
  • .chm格式文件如何阅读
  • .Net 4.0并行库实用性演练
  • .NET 8.0 发布到 IIS
  • .net php 通信,flash与asp/php/asp.net通信的方法
  • .net Signalr 使用笔记
  • .netcore 6.0/7.0项目迁移至.netcore 8.0 注意事项
  • .net访问oracle数据库性能问题
  • .NET连接MongoDB数据库实例教程
  • .Net下使用 Geb.Video.FFMPEG 操作视频文件
  • .Net转前端开发-启航篇,如何定制博客园主题