标题:
STM8L的DAC详解 含例程
[打印本页]
作者:
51hei小林
时间:
2016-10-10 00:17
标题:
STM8L的DAC详解 含例程
向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最基本的输出电压的功能,使用万用表测量输出的电压与计算值对比.
/*硬件连接*/
// 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);
}
}
复制代码
作者:
ralphshu
时间:
2017-5-23 20:48
我想请教下,我现在用的是c8DAC有两路但我选择其中一路DAC2 但又对应portb4,portb5 两个口我该怎么设置呢
作者:
jxchen
时间:
2019-1-20 21:12
感恩~~~~~~~~~~~~~~~~~
作者:
lixianshen
时间:
2019-3-11 19:15
大师你好,我用你的程序在stm8 discovery 芯片是stm8l152c6t6上运行,用万用表和示波器看了,电压与你测量的不同,分别是0.145、0.253、0.466、0.896、1.327、1.755和你的值对应,另外,我有stm8l152看4t6
作者:
lixianshen
时间:
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伏吗?
作者:
lixianshen
时间:
2019-3-11 19:44
刚才换了个电源,用华为手机5伏4.5A充电器接上测量dac输出电压跟上次测的差不多,1.744伏变为1.752伏,别的都差不多,第三位稍有提高,不知道原因,请大师帮忙看看。
作者:
lixianshen
时间:
2019-3-11 21:11
我用例子程序点灯实验输出到pf0脚,用示波器和万用表测量有2.98伏直流输出,说明芯片输出没有问题。
作者:
lixianshen
时间:
2019-3-11 22:08
找到问题了,是dac_cr1_boff=1,dac channel output buffer disable,把它改为使能就好了。前面等号后的0改成1就好了。
作者:
王琳淋
时间:
2019-12-12 10:49
DAC_CR1_BOFF=1;//DAC Channel output buffer disabled
请问为啥不适用BOFF位呢?
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1