STM32 F1系列 DAC的示例详解 前言/ |; e/ O/ y5 v! T 基于学习的目的,详细讲解关于Cube库中的DAC的功能。本次介绍DAC。 & W8 w( T' R) u. m 一、示例详解) Z" Q8 u9 n5 C/ B8 ` 基于硬件平台:STM32F10C-EVAL,MCU的型号是STM32F107VCT6。1 S; Y! x% o2 ] 软件则是其Cube库,路径:STM32Cube\Repository\STM32Cube_FW_F1_V1.3.0\Projects\STM3210C_EVAL\Examples\DAC\DAC_SignalsGeneration。' _/ Q% X: V9 v5 d- T8 _ 1、主程序% J, |8 p& m& `- I 软件配置,运行程序可以发现,系统时钟设置为72MHz,定时器使用到的是TIM6; 根据时钟树的图谱及其程序, 该示例选择的是内部时钟源作为定时器的时钟源;TIM6的时钟源来自APB1的分频。6 P6 r' V' ~8 ]0 m! A9 u+ V AHB 时钟 (HCLK)在RCC_CFGR寄存器中的分频系数HPRE的值为0,即SYSCLK not divided,即/1,所以HCLK就是72MHz;. g& r' q- \# O0 v% D APB1的prescaler的系数是PPRE1:0x4,HCLK divided 2,即/2,APB1CLK为36MHz;由于APB1的prescaler系数部分频,即/4,所以倍频器起作用,即为上图中的TIMxCLK = 72Mhz。- z. p7 e" t& L2 a 2、 定时器Tim6 设置的是向上计数,周期是0x7FF(2047),从0开始计数到2047,所以该定时器的更新周期:(2047+1)/72 = 28us, 所以传输的6个数值:, \ u. ]1 w% z% v! w/ d/ d: N 对于8位的DAC,程序中设定的是右对齐, 所以,对应的DOR分别为/ N8 ?' {5 r! ~0 ]. y! P( l1 I 0x000(0), 0x330(816), 0x660(1632), 0x990(2448), 0xCC0(3264), 0xFF0(4080) ;5 V7 _2 X$ l/ k( g8 Z8 i 而Vref = 3.3V, 所以:! K0 |. r w8 N- C6 T/ O Vdac 分别等于:也是约在0V; 0.66V; 1.32V; 1.98V; 2.64V; 3.3V之间; 3、阶梯波形 ( O% g# Y2 s( G8 M 对于阶梯波形比较简单:( l% r `& R4 ^1 g 就是上述的6个数值每个28us触发DMA传输一次到DOR的寄存器; 所以测得的实际波形(6个梯阶,电压分别0V; 0.66V; 1.32V; 1.98V; 2.64V; 3.3V; 周期28*6 = 168us);7 i1 Q3 R5 n, o 验证的波形如下:% q- i4 _/ U6 N4 V$ B T8 F/ q 对于阶梯波形的产生,WAVE设置的是0x00;即:wave generation disable; 4、三角波 * g+ ^, k# Z0 _1 N' B 产生三角波的主要代码如上,其实也就是下面的这一段代码: 其实也就是设置下面的寄存器的比特位;- |3 ~" \0 N# D# o' U3 v0 G7 _, c 最大的振幅是3.3V,即对应的是4095,- A4 ^! Z5 m7 s 软件里面设置的2047,所以振幅是大约1.65V6 `2 @ I6 K4 |! U 该三角波的产生是由单片机的硬件产生的,软件控制的是:振幅和周期; 振幅通过上述寄存器中的MAMP1来控制; I* ]4 ~6 K1 B" m& ?4 X( e7 R2 p4 {% y 周期则是定时器Tim6的触发事件? 但是这里的周期并不是128us啊? 改变幅值也会改变三角波的周期的, 那么这幅值和周期以及定时器之间三者的关系如何呢? 答案: & ]0 Y/ ]! D- x2 ^3 ]' [# d 符合推论。 设置的波形控制模式:WAVE1 = 0x02,即产生三角波;$ j; a" q. W" T 对于三角波的产生器,还有一段函数代码的作用是什么意思呢?1 b0 \; }4 Y5 I1 z# m 即其中的代码: 是什么作用呢?: \9 r$ d$ x& E( ?' C& l4 f 产生的波形: 在加了函数之后: 从波形上来看,当参数数值不为0时,波形更像三角波, 那这个参数影响的是什么呢?( f: r I$ r9 m" P& y 参数的tmp的值,位于0x200004A4处,初始值为0,运行到:* P: U* Z- }' W# \; S 后tmp的值为0x40007400,该值是解释得通的:DAC外设的基地址(0x40007400) 执行完语句之后:由于传递的参数是#define DAC_ALIGN_12B_R ((uint32_t)0x00000000) 0 |( e: Y3 E5 B7 ? 得到的结果是(注意上图中虽然断点停在了DAC_DHR12R2_ALIGNMENT处,但是程序是DAC_CHANNEL_1,所以最终执行的还是下面的语句) 所以最终产生的效果就是:; i6 L: E- X: `& ^; y2 E 地址为0x40007408的寄存器赋值,即下面寄存器赋值:' F0 z- b" y! L, c1 i( O4 d 但是这寄存器的作用是什么呢?holding data?* g9 F& q4 O: }( c: ~% ]+ d Holding data寄存器,可以简单的理解为:* X. E: }3 ]0 p; T% x 设置影响DAC的直流分量(直流分量还是根据下面的公式计算出来的): 当传递的参数设置为0是,DACoutput即三角波的最低电平为0: 当传递的参数设置为2047,DACoutput即三角波的最低电平为1.65V 如果传递的参数设置为1024,DACoutput即三角波的最低电平为0.82V; 如果传递的参数设置为3000,DACoutput即三角波的最低电平为2.42V; 5、噪声产生器* X! K( m( x- T. X; M8 J5 H 主要函数的代码如下:. U1 R/ @4 u0 i$ o. D1 H 由于一般的认为噪声是随机性的,所以可以认为只是修改幅值,对于其周期不可控4 @6 }3 h1 ~9 G4 u( V) W7 [ 文档下载地址:7 M( d/ t9 r4 b; O8 j: [# J https://www.stmcu.org.cn/document/detail/index/id-217139% p4 N) K# h% W9 p 实战经验汇总:% B! Q; x6 p! J https://www.stmcu.org.cn/module/forum/thread-576401-1-1.html0 ?/ h( Z% ` ` |
学习学习 |
,谢谢,学习一下! |
学习学习 |
楼主很棒呀 |
谢谢,学习一下! |
谢谢发帖,辛苦!辛苦! |