找回密码
 注册
关于网站域名变更的通知
查看: 262|回复: 2
打印 上一主题 下一主题

STM8L的DAC详解含例程

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2022-7-27 09:45 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
向STM8L的向DHR寄存器写入数据,此数据被送入到DOR寄存器,最终被送到DA转换器,DAC会输出对应的电压.我们使用用万用表测量此电压,与理论计算值对比,来学习STM8L的DAC.7 X3 G2 A2 }' H) B# U
+ C/ J. s4 u# w6 c; z. ~6 G
下图为STM8L152C6的DAC内部结构图.
4 R, t6 t! j* l( y& E  }
8 O( s% c6 W. T* _9 Q; E 本例程使用的芯片型号为STM8L152C6,是中等容量,48脚的mcu,它只有一个输出通道,输出通道是PF0.如下图数据手册中的介绍
; X6 ]% o0 Z6 p- ^7 a: Z6 T6 s
/ _& W& y/ V0 y( {5 q. K: w  W , |7 l  s" m) H: G

/ b8 A9 A* I' u9 I9 z2 V STM8L的DAC为12位DAC,写入DHR寄存器中的数据最大为2^12=4096.下图是数据手册中给出的DAC输出电压计算公式ACout=Vref*(DAC_DOR/4096)
+ K; P+ b# n" D& h8 [/ b0 M, i' t
0 {0 k! ?9 `0 t5 P2 \ ①DACout是DAC输出的电压5 O' G6 r! N; j6 m- _
②Vref是参考电压,由于参考电压引脚和MCU供电引脚连接在一起,所以Vref的电压和单片机系统的供电电压相等.实测为2.98V,这个值以实测为准.7 R& M8 L- j8 l6 w6 F: T7 o3 O
根据这个公式,如果向DAC_DHR写入数据为2048,那么DAC输出电压应该为2048/4096*2.98=1.490V: b" @! r1 I! g/ ]* l& S8 I

  h7 d3 E: S* S
& G; G  v1 {  H" B3 Z DAC连续输出不同的电压,可以达到输出正弦波,三角波等各种波形,由于没有示波器,没法看到输出波形,所以本例程,只是简单的使用DAC最基本的输出电压的功能,使用万用表测量输出的电压与计算值对比.
  R& P7 \$ n: c2 D7 B2 t3 q8 w
  • /*硬件连接*/
  • // PF0---->
  • /****************************************************************************************
  • *开发环境:IAR for stm8 v6.5.3
  • *硬件平台:STM8L-DISCOVERY
  • *功能说明:向DHR寄存器写入数据,DAC会输出对应的电压,用万用表测量此电压,与理论计算值
  • *         对比.
  • *作    者:茗风
  • ****************************************************************************************/
  • #include"iostm8l152c6.h"
  • #include"stdint.h"
  • #define    WRITE_TO_DHR(a)   DAC_RDHRH=(a&0x0F00)>>8;DAC_RDHRL=(0x00FF&a)
  • //带参数宏,实现向DHR寄存器,写入一个12位的数据
  • /******************************************************************************************************
  • *  名    称:void delay_10ms(uint8_t x_ms)
  • *  功    能:延时10ms
  • *  入口参数:无
  • *  出口参数:无
  • *  说    明:
  • *  范    例:无
  • ******************************************************************************************************/
  • void delay_130ms(uint8_t x)
  • {
  •   uint8_t i,j;
  •   for(;x>0;x--)
  •   {
  •       for(i=0;i<255;i++)//2*255个指令周期
  •         for(j=0;j<255;j++);//2*255个指令周期
  •       // 共 x_ms*2*255+2*x_ms个指令周期
  •       // 即 255*2*255+2*255=130610us=130ms
  •       // 综上 i,j双层for循环,延时时间为130ms
  •   }
  •   // 16M/8/2=1M 一个指令周期为1us
  • }
  • /******************************************************************************************************
  • *  名    称:void DAC12_Config(void)
  • *  功    能:配置DAC,禁用DMA,不使用tiM4触发,也不用软件触发,写入DHR的数据被立即送入DOR寄存器,
  • *            立即输出对应电压
  • *  入口参数:无
  • *  出口参数:无
  • *  说    明:STM8L152C6属于中等容量MCU,只有一路DAC输出,输出引脚为PF0
  • *  范    例:无
  • ******************************************************************************************************/
  • void DAC12_Config(void)
  • {
  •   //------配置DAC输出引脚PF0------
  •   PF_CR1_C10  =0;//浮空输入
  •   PF_CR2_C20  =0;//无中断功能
  •   PF_DDR_DDR0 =0;//PF0输入
  •   //------打开DAC时钟------
  •   CLK_PCKENR1_PCKEN17=1;//打开DAC时钟
  •   //------选择DAC触发方式------
  •   DAC_CR1_TSEL=0x0;//选择TIM4触发,由于TEN=0,所以此位设置无效
  • /*  These bits are only used IF TEN=1.
  •     000: TIM4_TRGO (Timer 0 counter channel output) selected
  •     111: SWTRIG (Software trigger) selected*/
  •   //------不使用DAC的BUFFER------
  •   DAC_CR1_BOFF=1;//DAC Channel output buffer disabLED
  •   //------配置写入DHR寄存器中的数据是否需要触发才能送到DOR中------
  •   DAC_CR1_TEN=0;//此位为零时,写入DHR寄存器中的数据被立即送到DOR中,输出对应电压,无需触发
  •   DAC_CR2_DMAEN=0;//关闭DMA功能
  •   DAC_CR2_DMAUDRIE=0;//关闭DMA中断功能
  •   //DACout=Vref*(DAC_DORH/L/4096)
  •   DAC_CR1_EN=1;//使能DAC
  • }
  • void main( void )
  • {
  •   DAC12_Config();
  •   while(1)
  •   {
  •      //-------------------实测值--------------理论值----------
  •      WRITE_TO_DHR(4095);//2.98V        4095/4096*2.98=2.979V
  •      delay_130ms(15);//由于使用万用表侧脸电压,所以这里延时一段时间
  •      WRITE_TO_DHR(3072);//2.23V        3072/4096*2.98=2.235V
  •      delay_130ms(15);
  •      WRITE_TO_DHR(2048);//1.49V        2048/4096*2.98=1.490V
  •      delay_130ms(15);
  •      WRITE_TO_DHR(1024);//0.74V        1024/4096*2.98=0.745V
  •      delay_130ms(15);
  •      WRITE_TO_DHR(512); //0.37V        512/4096*2.98=0.372V
  •      delay_130ms(15);
  •      WRITE_TO_DHR(256); //0.19V         256/4096*2.98=0.186V
  •      delay_130ms(15);
  •   }
  • }
    1 g1 z2 E3 f! {  Q. j% T

* k4 j1 l( w2 Q8 w! E5 [
/ O. a& }/ c8 a! H' G/ Y6 b! z* V6 d  e3 F) W6 N& ]4 @6 D4 g/ Y

该用户从未签到

2#
发表于 2022-7-27 10:34 | 只看该作者
温故而知新,帮别人解决问题,自己也能提升

该用户从未签到

3#
发表于 2022-7-27 14:20 | 只看该作者
希望技术上的交流更多一些,O(∩_∩)O哈哈~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-6-16 20:08 , Processed in 0.093750 second(s), 26 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表