STMCU小助手
发布时间:2022-3-24 22:15
|
前言:$ D" `+ H; M# z0 U. G8 t) ` 本系列教程将 对应外设原理,HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 所用工具: 1、芯片: STM32F407ZET6/ STM32F103ZET6 2、STM32CubeMx软件6 p3 o6 I' g" L/ }& z 3、IDE: MDK-Keil软件1 m( B W9 R0 t! c1 x! I: p9 a) F3 M, x P; S, v8 |& L9 i- j' m 4、STM32F1xx/STM32F4xxHAL库1 A }* S: F8 E+ Q$ B; Q- } - J) R, R8 `& Z% r6 i8 t& N 知识概括:8 Q/ y4 x9 ^2 ~9 x t0 G) L! E 3 d" o; T* m. `' b( y 通过本篇博客您将学到: DAC工作原理 3 Q2 `; U! l& V. u) C STM32CubeMX创建DAC例程 HAL库定时器DAC函数库 DAC Digital-to-Analog Converter的缩写。数模转换器。又称D/A转换器,简称DAC,是指将离散的数字信号转换为连续变量的模拟信号的器件。( [0 v& e3 M4 }0 I 8 }4 H8 W- X4 t, O 典型的数字模拟转换器将表示一定比例电压值的数字信号转换为模拟信号。 5 ~& w _) X5 T& ` STM32F1中有两个DAC,可以同时使用STM32的DAC模块是12位数字输入,电压输出型的DAC。 5 J4 b. ^( b. [' }, R0 O* T DAC 有两个用途:输出波形和输出固定电压7 [* x. e4 c5 u( m % l) l4 z. F4 w DAC工作原理 DAC工作框图8 _% ]" i2 y8 b! g; W1 l# G 6 `: c v# M+ F. t
这里我们把它分为三部分讲解: "触发方式 " “控制逻辑” "数模转换器" 4 ^- ^, G$ y8 J8 p6 h 触发方式9 d$ z/ H* a" f, J 第一部分,触发方式,是指DAC转换可以由某外部事件触发(定时器计数器、外部中断线)。配置控制位TSELx[2:0]可以选择8个触发事件之一触发DAC转换,任意一种触发源都可以触发DAC转换。 : p- ?- f- s+ D3 o- z 具体的外部触发可看下图: 7 U w+ ^' f. g
六个是定时器触发:TIM2,TIM4,TIM5,TIM6,TIM7和TIM8。剩下两个分别是:EXTI线路9(PC9)和软件触发6 O: g' c3 f& k8 m6 } 4 F! C, ~' g* ]7 g: m. Q 每次DAC接口侦测到来自选中的定时器TRGO输出,或者外部中断线9的上升沿,近存放在寄 存器DAC_DHRx中的数据会被传送到寄存器DAC_DORx中。在3个APB1时钟周期后,寄存器 DAC_DORx更新为新值。 & Q% o0 A$ m1 ?/ _0 p3 i3 I, T( T0 {% m4 t 如果选择软件触发,一旦SWTRIG位置’1’,转换即开始。在数据从DAC_DHRx寄存器传送到 DAC_DORx寄存器后,SWTRIG位由硬件自动清’0’1 N2 t, g1 z: ^ ( M4 v; P8 O: ^2 t" T5 O, c8 Z 2控制逻辑 此部分决定了DAC的波形控制,输出方式,DMA传输,等等, 我们来具体讲解下,' [/ ?# I) L, R- o5 Q5 e3 ] 从框图可以看出,DAC受DORx寄存器直接控制的,但是数据并不是直接传入DORx的,需要先传入DHRx 之后在间接地传给DORx寄存器 不能直接往DORx寄存器写入数据/ ]: N# |' U$ Z 如果没有选择硬件触发(TENx=0),在一个APB1周期后传入DORx,3 b# ^0 \9 M; O( r5 k( H' U 如果选择硬件触发(TENx=1),则在3个APB1周期后传入DORx 一旦数据从DAC_DHRx寄存器装入DAC_DORx寄存器,在经过时间Tsetting(大约3us) 之后,输出即有效,这段时间的长短依电源电压和模拟输出负载的不同会有所变化 # t* y7 c1 y. V c8 n; e/ {
0 x% t) w7 @% [7 b, }9 t! L 上图的DMAENx TENx MAMOx[3:0],WAVENx[1:0]位 都是由DAC_CR寄存器控制的 DMAENx 控制DAC通道1/2 的DMA使能 MAMP2[3:0]:DAC通道2屏蔽/幅值选择器 位 27:24 由软件设置这些位, 用来在噪声生成模式下选择屏蔽位,在三角波生成模式下选择波形的幅值。 WAVE2[1:0]:DAC通道2噪声/三角波生成使能6 j4 g& v, k9 W9 z4 Q2 B * g8 k- V0 m5 D/ K1 d 位23:22 决定是否产生波形,和产生什么波形。 00:关闭波形发生器;1 ?5 D7 ?* r1 ~1 Z9 @1 p+ d8 l 10:使能噪声波形发生器; 1x:使能三角波发生器。' F9 R& t* c6 W* _, g' L+ J3 u& z( E , N, w( Y! @' E! y9 r# W TENx:DAC通道x触发使能,用来使能/关闭DAC通道x的触发。- T. v0 s# u' J7 y/ n 0:关闭DAC通道x触发,写入DAC_DHRx寄存器的数据在1个APB1时钟周期后传入 DAC_DORx寄存器;8 Z; D! _, |' a% o2 ?9 k7 o; I 1:使能DAC通道x触发,写入DAC_DHRx寄存器的数据在3个APB1时钟周期后传入 DAC_DORx寄存器。& C$ h k2 O* d( G0 E0 \ 注意:如果选择软件触发,写入寄存器DAC_DHRx的数据只需要1个APB1时钟周期就可以传入 寄存器DAC_DORx。. ^- b& X7 I" x 1 h" @2 P; t% h. H 3数模转换器5 o* R: r S5 P. Q- A& }" _# p 1 o u- J0 K# _4 a- Y
5 W6 [5 t3 k1 \1 R9 \& s VDDA和VSSA为DAC模块模拟部分的供电。. l7 l1 T$ [. ~6 \9 R& P& ?% M Vref+则是DAC模块的参考电压。 DAC_OUTx就是DAC的输出通道了(对应PA4或者PA5引脚) 从左边的参考电压Vref+ ---->数模转换器 ---->模拟信号输出引脚
注意:DAC的引脚应该设置成模拟输入(AIN)模式 i7 T8 G4 k$ h ; t( |' }1 g5 V1 L( ]5 w DAC输出电压: % e6 P! {5 Z$ t- V @. I0 A 数字输入经过DAC被线性地转换为模拟电压输出 . W7 d2 v0 ?0 d7 d; J- M7 t 其范围为 0~VREF+ i) M" W3 V# a7 C8 d) M DAC输出 = VREF x (DOR/4095) / x3 I& J5 l+ ^- c+ A9 z% `2 f5 g 特殊功能:4 z/ F% f1 X6 ^2 c/ T; @ 噪声波形生成,三角波形生成,外部触发转换,双DAC同时或者分别转换;每个通道都有DMA功能; ( u) K4 D5 z3 u B 参考电压:2.4V~ 3.3V, _, K& o2 @& R7 A" V H DAC的主要特征 2个DAC转换器: 每个转换器对应1个输出通道;# a' T3 A; `* V! O0 y0 I3 ` 8位或者12位单调输出;. E9 U9 J8 ?+ |2 r: N$ P1 k" d% ^4 w 12位模式下数据左对齐或者右对齐; s$ {! W, W+ q- Y0 { 同步更新功能;6 Q% e* @! e* b" o 噪声波形生成;0 L7 p( Y( g0 o" E0 j ^$ `2 ~! g 三角波形生成; 双DAC通道同时或者分别转换;/ u8 |( B" L4 n8 i( L; Q! f 外部触发转换; 输入参考电压VREF+。9 w0 r5 E C9 F7 c4 A. F% P: i2 Y( \ , o. \: ?* Q* {5 Q DAC原理总括 数字/模拟转换模块(DAC)是12位数字输入,电压输出的数字/模拟转换器。DAC可以配置为8位或12位模式,也可以与DMA控制器配合使用。DAC工作在12位模式时,数据可以设置成左对齐或右对齐。DAC模块有2个输出通道,每个通道都有单独的转换器。在双DAC模式下,2个通道可以独立地进行转换,也可以同时进行转换并同步地更新2个通道的输出。DAC可以通过引脚输入参考电压VREF+ 以获得更精确的转换结果。7 c- R9 |2 Q3 w5 `$ Y7 ~9 e+ {9 N! y # M+ Y, o1 Q! a, u; J: ~4 H" j CubeMx工程创建1 V X- s' U$ {9 s# L; R 1设置RCC时钟 设置高速外部时钟HSE 选择外部时钟源; M! |) J8 W j5 ` S4 r4 P$ R' a, H0 D! h
. ]% h9 [1 |2 B9 Q) h1 m5 Z 2时钟源设置 ; H8 V/ S1 C5 D! V. Q0 b
9 U, z( K2 B( D% u' c0 A! |* r 1选择外部时钟HSE 12MHz 2PLL锁相环倍频72倍- B! C" A/ P! o4 y' y& p) w, V 3系统时钟来源选择为PLL8 q* U9 u, j. a5 Q' p, i( ] 4设置APB1分频器为 /2 3DAC设置- o$ g; ^4 T* W2 T* y, R 1 }' Y3 ~& d- K9 ^8 x
0 a6 \0 S3 Z9 F" M 这个其实没啥好讲的! t* X0 S/ w+ @! i8 W 1.OUT1 和 OUT2对应两个输出通道 2.External Trigger 外部中断EXTI9 触发- q. r4 A N' O7 S0 M5 f, A 2 W' ^: L& Y# ], i2 B _ 就是使用外部中断来触发ADC+ G& s+ Y6 w4 O$ X5 h ' t7 C2 d1 G, ~0 v$ O- K 3.Tigger 选择DAC的触发方式 上方都有讲解 Output Buffer 使能DAC输出缓存 DAC集成了2个输出缓存,可以用来减少输出阻抗,无需外部运放即可直接驱动外部负载。每个 DAC通道输出缓存可以通过设置DAC_CR寄存器的BOFFx位来使能或者关闭 . r6 H* a1 t' }& b* Y2 l 这个使能即可 4项目文件设置
$ m, t, F" S* C: [% v% c 1 设置项目名称7 ^( W. ~& g( W# u6 Y 2 设置存储路径 3 选择所用IDE2 y( v3 @6 I( P" G; B ; N( W7 h; a" @0 p% u8 R
5创建工程文件 然后点击GENERATE CODE 创建工程 配置下载工具9 V% V' J0 u/ U6 t& \* A4 s5 g 新建的工程所有配置都是默认的 我们需要自行选择下载模式,勾选上下载后复位运行 : b l1 d) G$ W& ?0 j0 ?3 x
* X+ e5 E' `7 A: ? ~ 例程详解:% I7 P! j! w! L$ F* ?# [+ d DAC库函数:
DAC输出电压:) z: C1 m# I7 W 在main()主函数中设置DAC输出的数据为12位右对齐,DAC输出为2048,并使能DAC1输出通道 % v: m1 @5 x1 \/ A3 \
DAC输出 = VREF x (DOR/4095) ! G' p* V" n C9 `3 @ 则实际输出的电压为 2048/4096x3.3V=1.65V,) X' e" E' O+ q$ K6 ~ 万用表测量引脚电压即可 3 a. i" H& F$ X* w% C& O
HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, 2048); 功能:设置DAC的输出值 参数一: DAC结构体名 参数二: 设置DAC通道 参数三: 设置DAC对齐方式, {7 u7 {! a( m4 b8 [$ H* g' ? 参数四: 设置输出电压值 12位最大位4095 . C, e6 R" H0 b) H& H) g HAL_DAC_Start(&hdac,DAC_CHANNEL_1); 功能:开启DAC输出 参数一: DAC结构体名 参数二: DAC通道. F& }. K0 Z- t7 j DAC输出波形% L% L5 X0 x& @2 H DAC输出三角波5 n3 N1 _, R+ ^0 ]5 B) y1 p# z9 S; U 打开STM32cubeMX的DAC工程文件重新配置,- Q7 ]! k( ^0 b/ d/ O) I. X m T2 t
使能DAC输出通道2。 $ g9 Z1 c* r2 I& \( p# P8 c. O DAC外部触发(Trigger) :定时器2触发,* [0 O' i9 o# _; u* W 波形生成模式(Wave generation mode) :三角波发生器(Triangle wave generation).# Y) T* N9 W6 a, K* M# J F) e0 T! R/ W9 Z 可以选择三角波形,和噪声波形(noise wave generation) " E6 r3 B/ w6 X# X. L 最大三角波幅(Maximum Triangle Amplitude) :4095, 设三角波幅值为3.3V,即4095 1 N4 I) }+ c. ]. l! s$ { DAC12位数据存储,最大为40951 L2 K; t9 k& s, T: V" j# g , ?# J, ?" D: B2 v" A+ ^ 0-4095 对应 0V~3.3V3 ~' E( |: k+ M0 u 打开Timers,使能定时器2 4 v0 f3 e1 D8 ]0 ^5 q' I
配置如下,具体配置原理在前面 6 r+ D) i& z- X 有过讲解,这里就不再阐述了,按照图示配好即可9 W6 z( X5 r- [0 O - c& _& H/ O5 O/ g' P$ ` 这里讲下三角波的频率( c6 Z% I. y, U {* Q + j# x Y- H* ~/ D9 ~
! C" _1 P ?1 G/ P0 b- M$ _ 简单的说,首先设置一个DAC最大幅值, 之后设置定时器溢出时间,在每次定时器发生溢出等事件之后,定时器会发送触发信号TRGO到DAC,这是内部的三角波计数器就会累加1 然后于DAC_DHRx寄存器的值相加,写到DAC_DORx计数器中,如果该值小于设定的最大幅值,就会正常输出,当大于最大幅值时就会递减,减到0之后又开始累加,周而复始,就形成了三角波$ g# d8 x3 w" p# Z5 g) V 8 n& J& k E4 `+ j9 J' O7 J
三角波频率: 设三角波幅值为3.3V,即4095,所以一个周期计数器计数4096*2=8192次,则三角波频率为“定时器频率/8192”7 P8 N8 o9 a* Y 代码实现:( i5 _# a3 [; }* t" a ) H# K' i0 p$ U0 L 在main函数中添加以下两行代码,即可输出三角波
分别为开启定时器TIM2 和开启DAC
8 b5 ?! w% o! N4 J4 t# ` r: l 1 C( Y8 i# x. G, N; c1 B 4 f ^ f n- a0 H- F! u, @2 i |
想找个ST芯片
[GPIO] 使用新型抽象开始C++嵌入式编程,从GPIO开始
技术手册stm32f1xx中的一个小问题
【经验分享】STM32 HAL库移植FreeModbus详细步骤
【逢7发帖赢大礼】STM32开发之IC门禁卡UID读取方法!
实战经验 | Keil工程使用NEAI库的异常问题
经验分享 | FDCAN数据段波特率增加后发送失败的问题分析
STM32几种流行开发环境的优缺点
好用软件推荐-TouchGFX Designer
OpenSTLinux 6.1发布:M33-TD加持+安全升级,STM32MPU开发效率翻倍!
微信公众号
手机版