[应用相关]

STM8L的DAC详解含例程

[复制链接]
304|8
手机看帖
扫描二维码
随时随地手机跟帖
onlycook|  楼主 | 2022-8-3 10:36 | 显示全部楼层 |阅读模式
向STM8L的向DHR寄存器写入数据,此数据被送入到DOR寄存器,最终被送到DA转换器,DAC会输出对应的电压.我们使用用万用表测量此电压,与理论计算值对比,来学习STM8L的DAC.1 r* b4 w, R: _9 h, M6 e

下图为STM8L152C6的DAC内部结构图.
4807562e9df175426f.png

使用特权

评论回复
onlycook|  楼主 | 2022-8-3 10:39 | 显示全部楼层
本例程使用的芯片型号为STM8L152C6,是中等容量,48脚的mcu,它只有一个输出通道,输出通道是PF0.如下图数据手册中的介绍
9893862e9df5fdc879.png
STM8L的DAC为12位DAC,写入DHR寄存器中的数据最大为2^12=4096.下图是数据手册中给出的DAC输出电压计算公式ACout=Vref*(DAC_DOR/4096)  Q9 D2 e- s9 N; X' }

①DACout是DAC输出的电压
②Vref是参考电压,由于参考电压引脚和MCU供电引脚连接在一起,所以Vref的电压和单片机系统的供电电压相等.实测为2.98V,这个值以实测为准.
根据这个公式,如果向DAC_DHR写入数据为2048,那么DAC输出电压应该为2048/4096*2.98=1.490V
4265262e9df8ce085d.png
DAC连续输出不同的电压,可以达到输出正弦波,三角波等各种波形,由于没有示波器,没法看到输出波形,所以本例程,只是简单的使用DAC最基本的输出电压的功能,使用万用表测量输出的电压与计算值对比.
7990662e9dfc6e14dc.png

使用特权

评论回复
onlycook|  楼主 | 2022-8-3 10:40 | 显示全部楼层
  • /*硬件连接*/
  • // 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);
  •   }
  •   }

使用特权

评论回复
yiyigirl2014| | 2022-8-4 17:02 | 显示全部楼层
谢谢分享

使用特权

评论回复
Uriah| | 2022-10-1 13:22 | 显示全部楼层

如果已经找到正确的值,继续测试一个值根本没有意义。

使用特权

评论回复
Bblythe| | 2022-10-1 16:21 | 显示全部楼层

通常用发光二极管LED代替小灯

使用特权

评论回复
公羊子丹| | 2023-1-20 07:24 | 显示全部楼层

优良的文本处理工具,工作时它会扫描文件中的每一行,查找与命令行中所给定内容相匹配的模式

使用特权

评论回复
公羊子丹| | 2023-1-20 08:17 | 显示全部楼层

输出了5个频率为10KHz的PWM脉冲

使用特权

评论回复
Wordsworth| | 2023-1-20 09:20 | 显示全部楼层

显然直接调用的话,那么调用线程会被阻塞暂停

使用特权

评论回复
Uriah| | 2023-1-20 10:23 | 显示全部楼层

创建、重命名、查看、删除项目分支,通过 Git 做项目开发时,一般都是在开发分支中进行,开发完成后合并分支到主干。

使用特权

评论回复
万图| | 2023-1-20 12:19 | 显示全部楼层

Keil编写程序是默认的时钟为72Mhz

使用特权

评论回复
Uriah| | 2023-1-20 13:22 | 显示全部楼层

我们从以前就有了 DefineGender 方法,要求提供的输入值必须始终为 0 或 1。

使用特权

评论回复
帛灿灿| | 2023-1-20 15:18 | 显示全部楼层

A在使用自己声明的mysum之前,初始化(注册)一下该函数

使用特权

评论回复
Bblythe| | 2023-1-20 16:21 | 显示全部楼层

需要加上一定的工作电压

使用特权

评论回复
童雨竹| | 2023-1-20 18:17 | 显示全部楼层

多增加过孔将此工作地线与工作地平面相连

使用特权

评论回复
Wordsworth| | 2023-1-20 19:20 | 显示全部楼层

TIM4、UART1初始化代码只是些各种相关基本配置,不跟别的外设有关联

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

389

主题

1463

帖子

3

粉丝