【正点原子STM32连载】 第三十一章 内部温度传感器实验摘自【正点原子】STM32F103 战舰开发指南V1.2

1)实验平台:正点原子stm32f103战舰开发板V4
2)平台购买地址:https://detail.tmall.com/item.htm?id=609294757420
3)全套实验源码+手册+视频下载地址: http://www.openedv.com/thread-340252-1-1.html#

第三十四章 PWM DAC实验

前面的章节,我们介绍了STM32F1自带DAC模块的使用,虽然STM32F103ZET6具有内部DAC,但是也仅仅只有两条DAC通道,而STM32还有其它的很多型号是没有DAC的。通常情况下,采用专用的D/A芯片来实现,但是这样就会带来成本的增加。不过STM32所有的芯片都有PWM输出,并且PWM输出通道很多,资源丰富。因此,我们可以使用PWM + 简单的RC滤波来实现DAC的输出从而节省成本。
本章我们将向大家介绍如何使用STM32F1的PWM来设计一个DAC。我们将使用按键(或USMART)控制STM32F1的PWM输出,从而控制PWMDAC的输出电压,通过ADC1的通道1采集PWM DAC的输出电压,并在LCD模块上面显示ADC获取到的电压值以及PWM DAC的设定输出电压值等信息本章分为如下几个小节:
34.1 PWM DAC技术的实现原理
34.2 硬件设计
34.3 程序设计
34.4 下载验证

34.1 PWM DAC技术的实现原理

DAC工作过程是将源电压按照8位、12位、16位等分辨率进行分割,其输出的电压是最小精度LSB(即1/28、1/212、1/216等)的整数倍,这就是DAC输出的电压。
我们来分析一下PWM波形的特性。PWM信号可以被分解为一个直流分量和一个占空比固定,但是平均幅度为零的方波,如图34.1.1.1所示。
【正点原子STM32连载】 第三十一章 内部温度传感器实验摘自【正点原子】STM32F103 战舰开发指南V1.2_第1张图片

图34.1.1.1 PWM波形的等效分解
如果使PWM信号的占空比随时间改变,那么其直流分量随之改变,信号滤除交流分量后,将会输出幅度变化的模拟信号。因此通过改变PWM 信号的占空比,可以产生不同的模拟信号。这种技术称之为PWM DAC。
PWM是周期固定,占空比可调的数字信号。在实际电路中,典型的PWM波形,如图34.1.1.2所示。
【正点原子STM32连载】 第三十一章 内部温度传感器实验摘自【正点原子】STM32F103 战舰开发指南V1.2_第2张图片

图34.1.1.2 实际电路典型PWM波形图
下面根据高数与信号与系统课程的知识我们作一个简单的推导,感兴趣的同学可以查阅对应的知识,如果不感兴趣,直接跳过推导过程,看最后的结论即可。
我们可以把PWM波形用分段函数①表示出来。占空比可以用②的表达式来表示。
在这里插入图片描述

PWM是一个周期信号,我们令周期为NT,由傅里叶变换的知识可知任意周期信号都可按频域展开,我们把分段表达式按频域展开。得到如③的表达式,④⑤⑥为展开系数:
【正点原子STM32连载】 第三十一章 内部温度传感器实验摘自【正点原子】STM32F103 战舰开发指南V1.2_第3张图片

我们知道PWM的幅度为VH-VL,占空比为p,代入公式③~⑥求对应的积分,可以求出f(t)的展开系数分别如下:
【正点原子STM32连载】 第三十一章 内部温度传感器实验摘自【正点原子】STM32F103 战舰开发指南V1.2_第4张图片

公式⑩正好验证了图34.1.1.1的PWM等效原理。由此我们可知PWM的输出波形为一个与占空比有关的直流等效信号,同时伴有多个不同频率的信号的叠加。如果能把这些频率信号尽可能过滤掉,那么我们通过调整PWM的占空比即可方便实现我们需要的DAC结果,即VDAC=(VH-VL)*p。
分辨率也是DAC一个重要的参数,它可以表示DAC输出的最小精度。存在两个主要误差源影响PWM方式DAC分辨率。首先,PWM信号的占空比只能表示有限的分辨率。这是因为STM32的PWM的占空比是输出比较寄存器CCRx与TIMx_CNT进行比较的结果,而CCRx在STM32F1系列中最多能设置为16位。那么很显然地,用PWM实现的DAC分辨率就与TIMx_CNT有关,即定时器的时钟频率越高则CCRx可以设置的值越多,分辨率相应地越高。但由于定时器最高时钟是72M,这也会导致分辨率越高,DAC的速度越慢。
第二个误差源是PWM信号中不期望的谐波分量产生的峰峰值。前面PWM的频域展开公式⑩说明PWM信号需要通过滤波器才能输出一个纹波较小的直流信号,但实际上对于简单设计的滤波器对交流信号的过滤能力是有限的,所以输出信号还会带有一定的交流成份。
根据公式⑧,将k=1代入我们可以算出PWM的一次谐波幅度:

当sin(πp-π)=1时滤波器需要达到衰减峰值,可知PWM占空比为50%时,一次谐波的幅度最大。为了减少这个基波的影响,我们希望滤波器在这个最大幅度下也能把基波的交流影响衰减到1/2LSB以下,即后外围滤波器至少需要满足以下条件才能避免DAC输出干扰过大:

根据公式可知=,当DAC为12位精度时,代入Y=12可知我们设计的滤波器需要衰减74dB以上,当为8位精度时,衰减需要达到50dB。
我们知道一阶RC电路截止频率计算公式为:

把电容等效成一个电阻,对于一阶分压时电压的等效衰减的表达式可以是:

根据以上公式就能很好地设计一个满足我们需要的滤波器参数了。为了实现低成本的RC电路,我们使用两个一阶RC电路串联起来作为滤波器。
STM32F103的定时器最快的计数频率是72Mhz,8位分辨率的时候,PWM频率为72M/256=281.25Khz。我们需要把交流信号至少衰减50dB左右。
34.2 硬件设计

  1. 例程功能
    我们将设计一个8位的DAC,使用按键(或USMART)控制STM32F1的PWM输出(占空比),从而控制PWM DAC的输出电压。为了得知PWM的输出电压,通过ADC1的通道1采集PWM DAC的输出电压,并在LCD模块上面显示ADC获取到的电压值以及PWM DAC的设定输出电压值等信息。
  2. 硬件资源
    1)LED灯
    LED0 – PB5
    2)独立按键
    KEY0 – PE4
    KEY_UP – PA0
    3)PWM输出通道
    TIM1的通道1,对应IO是PA8
  3. 原理图
    根据前面分析的原理,在硬件设计上就比较简单了。PWM可以由STM32定时器输出,我们只需要在外围增加一个滤波电路即可。我们使用的是RC滤波电路,其电路设计如下图所示:
    【正点原子STM32连载】 第三十一章 内部温度传感器实验摘自【正点原子】STM32F103 战舰开发指南V1.2_第5张图片

图25.2.1 PWM DAC连接原理设计
根据我们的设计,输出8位DAC时,经过一阶滤波后DAC输出的交流信号大概的衰减可以达到117dB,可见我们设计是符合要求的。
这里有个特别需要注意的地方:因为PWM_DAC和OV_VSYNC共用了PA8引脚,所以在做本实验的时候,不能插摄像头模块或OLED模块,否则可能会影响PWM转换结果。
如下图所示,本实验需要用短路帽将PDC和ADC排针连接起来。
【正点原子STM32连载】 第三十一章 内部温度传感器实验摘自【正点原子】STM32F103 战舰开发指南V1.2_第6张图片

图25.2.2 PCB对应PWM DAC的位置
34.3 程序设计
34.3.1 程序流程图
【正点原子STM32连载】 第三十一章 内部温度传感器实验摘自【正点原子】STM32F103 战舰开发指南V1.2_第7张图片

图34.3.1.1 PWM DAC实验程序流程图

你可能感兴趣的:(stm32,单片机,嵌入式硬件)