找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 13469|回复: 8
打印 上一主题 下一主题
收起左侧

STM8L的DAC详解 含例程

[复制链接]
跳转到指定楼层
楼主
ID:140343 发表于 2016-10-10 00:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
向STM8L的向DHR寄存器写入数据,此数据被送入到DOR寄存器,最终被送到DA转换器,DAC会输出对应的电压.我们使用用万用表测量此电压,与理论计算值对比,来学习STM8L的DAC.

下图为STM8L152C6的DAC内部结构图.

本例程使用的芯片型号为STM8L152C6,是中等容量,48脚的MCU,它只有一个输出通道,输出通道是PF0.如下图数据手册中的介绍



STM8L的DAC为12位DAC,写入DHR寄存器中的数据最大为2^12=4096.下图是数据手册中给出的DAC输出电压计算公式:DACout=Vref*(DAC_DOR/4096)

①DACout是DAC输出的电压
②Vref是参考电压,由于参考电压引脚和MCU供电引脚连接在一起,所以Vref的电压和单片机系统的供电电压相等.实测为2.98V,这个值以实测为准.
根据这个公式,如果向DAC_DHR写入数据为2048,那么DAC输出电压应该为2048/4096*2.98=1.490V


DAC连续输出不同的电压,可以达到输出正弦波,三角波等各种波形,由于没有示波器,没法看到输出波形,所以本例程,只是简单的使用DAC最基本的输出电压的功能,使用万用表测量输出的电压与计算值对比.

  1. /*硬件连接*/

  2. // PF0---->

  3. /****************************************************************************************

  4. *开发环境:IAR for stm8 v6.5.3

  5. *硬件平台:STM8L-DISCOVERY

  6. *功能说明:向DHR寄存器写入数据,DAC会输出对应的电压,用万用表测量此电压,与理论计算值

  7. *         对比.

  8. *作    者:茗风

  9. ****************************************************************************************/

  10. #include"iostm8l152c6.h"

  11. #include"stdint.h"

  12. #define    WRITE_TO_DHR(a)   DAC_RDHRH=(a&0x0F00)>>8;DAC_RDHRL=(0x00FF&a)   

  13. //带参数宏,实现向DHR寄存器,写入一个12位的数据   

  14. /******************************************************************************************************

  15. *  名    称:void delay_10ms(uint8_t x_ms)

  16. *  功    能:延时10ms

  17. *  入口参数:无

  18. *  出口参数:无

  19. *  说    明:

  20. *  范    例:无

  21. ******************************************************************************************************/

  22. void delay_130ms(uint8_t x)

  23. {

  24.   uint8_t i,j;

  25.   for(;x>0;x--)

  26.   {

  27.       for(i=0;i<255;i++)//2*255个指令周期

  28.         for(j=0;j<255;j++);//2*255个指令周期

  29.       // 共 x_ms*2*255+2*x_ms个指令周期

  30.       // 即 255*2*255+2*255=130610us=130ms

  31.       // 综上 i,j双层for循环,延时时间为130ms

  32.   }

  33.   // 16M/8/2=1M 一个指令周期为1us

  34. }

  35. /******************************************************************************************************

  36. *  名    称:void DAC12_Config(void)

  37. *  功    能:配置DAC,禁用DMA,不使用TIM4触发,也不用软件触发,写入DHR的数据被立即送入DOR寄存器,

  38. *            立即输出对应电压

  39. *  入口参数:无

  40. *  出口参数:无

  41. *  说    明:STM8L152C6属于中等容量MCU,只有一路DAC输出,输出引脚为PF0

  42. *  范    例:无

  43. ******************************************************************************************************/

  44. void DAC12_Config(void)

  45. {

  46.   //------配置DAC输出引脚PF0------

  47.   PF_CR1_C10  =0;//浮空输入

  48.   PF_CR2_C20  =0;//无中断功能

  49.   PF_DDR_DDR0 =0;//PF0输入

  50.   

  51.   //------打开DAC时钟------

  52.   CLK_PCKENR1_PCKEN17=1;//打开DAC时钟

  53.   

  54.   //------选择DAC触发方式------

  55.   DAC_CR1_TSEL=0x0;//选择TIM4触发,由于TEN=0,所以此位设置无效

  56. /*  These bits are only used if TEN=1.

  57.     000: TIM4_TRGO (Timer 0 counter channel output) selected

  58.     111: SWTRIG (Software trigger) selected*/


  59.   //------不使用DAC的BUFFER------       

  60.   DAC_CR1_BOFF=1;//DAC Channel output buffer disabled

  61.   

  62.   //------配置写入DHR寄存器中的数据是否需要触发才能送到DOR中------

  63.   DAC_CR1_TEN=0;//此位为零时,写入DHR寄存器中的数据被立即送到DOR中,输出对应电压,无需触发

  64.   

  65.   DAC_CR2_DMAEN=0;//关闭DMA功能

  66.   DAC_CR2_DMAUDRIE=0;//关闭DMA中断功能

  67.   

  68.   //DACout=Vref*(DAC_DORH/L/4096)

  69.   DAC_CR1_EN=1;//使能DAC

  70. }

  71. void main( void )

  72. {

  73.   DAC12_Config();

  74.   while(1)

  75.   {

  76.      //-------------------实测值--------------理论值----------

  77.      WRITE_TO_DHR(4095);//2.98V        4095/4096*2.98=2.979V

  78.      delay_130ms(15);//由于使用万用表侧脸电压,所以这里延时一段时间

  79.      WRITE_TO_DHR(3072);//2.23V        3072/4096*2.98=2.235V

  80.      delay_130ms(15);

  81.      WRITE_TO_DHR(2048);//1.49V        2048/4096*2.98=1.490V

  82.      delay_130ms(15);

  83.      WRITE_TO_DHR(1024);//0.74V        1024/4096*2.98=0.745V

  84.      delay_130ms(15);

  85.      WRITE_TO_DHR(512); //0.37V        512/4096*2.98=0.372V

  86.      delay_130ms(15);

  87.      WRITE_TO_DHR(256); //0.19V         256/4096*2.98=0.186V

  88.      delay_130ms(15);

  89.   }

  90. }
复制代码




分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:204042 发表于 2017-5-23 20:48 | 只看该作者
我想请教下,我现在用的是c8DAC有两路但我选择其中一路DAC2 但又对应portb4,portb5 两个口我该怎么设置呢
回复

使用道具 举报

板凳
ID:18591 发表于 2019-1-20 21:12 | 只看该作者
感恩~~~~~~~~~~~~~~~~~
回复

使用道具 举报

地板
ID:466148 发表于 2019-3-11 19:15 来自手机 | 只看该作者
大师你好,我用你的程序在stm8 discovery 芯片是stm8l152c6t6上运行,用万用表和示波器看了,电压与你测量的不同,分别是0.145、0.253、0.466、0.896、1.327、1.755和你的值对应,另外,我有stm8l152看4t6
回复

使用道具 举报

5#
ID:466148 发表于 2019-3-11 19:30 来自手机 | 只看该作者
大师你好,我用你的程序在stm8 discovery 芯片是stm8l152c6t6上运行,dac输出到f0脚,用万用表和示波器看了,电压与你测量的不同,分别是0.145、0.253、0.466、0.896、1.327、1.755和你的值对应,另外,我有stm8l152k4t6的一个例子程序运行后,dac输出的数据也是和它说的不一样,测的的电压分别是0.324、0.610、0.897、1.177、1.475、1.744,对应它的设计输出为0.5、1.0、1.5、2.、2.0、2.5、3.0伏,我每次都测量了3.3伏,基本是在2.98左右,+5.0伏在4.65左右,现在搞不清是那里问题,是不是stm8l152c6t6 dac输出也有参考电压,并且它的参考电压就是1.75伏吗?
回复

使用道具 举报

6#
ID:466148 发表于 2019-3-11 19:44 来自手机 | 只看该作者
刚才换了个电源,用华为手机5伏4.5A充电器接上测量dac输出电压跟上次测的差不多,1.744伏变为1.752伏,别的都差不多,第三位稍有提高,不知道原因,请大师帮忙看看。
回复

使用道具 举报

7#
ID:466148 发表于 2019-3-11 21:11 来自手机 | 只看该作者
我用例子程序点灯实验输出到pf0脚,用示波器和万用表测量有2.98伏直流输出,说明芯片输出没有问题。
回复

使用道具 举报

8#
ID:466148 发表于 2019-3-11 22:08 来自手机 | 只看该作者
找到问题了,是dac_cr1_boff=1,dac channel output buffer disable,把它改为使能就好了。前面等号后的0改成1就好了。
回复

使用道具 举报

9#
ID:308135 发表于 2019-12-12 10:49 | 只看该作者
DAC_CR1_BOFF=1;//DAC Channel output buffer disabled
请问为啥不适用BOFF位呢?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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