|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
向STM8L的向DHR寄存器写入数据,此数据被送入到DOR寄存器,最终被送到DA转换器,DAC会输出对应的电压.我们使用用万用表测量此电压,与理论计算值对比,来学习STM8L的DAC.( G# s7 s' Z1 ] r( a
0 @: `& \; k3 I7 [9 C. t) O+ d9 } ` 下图为STM8L152C6的DAC内部结构图.
; R( J$ V) ?& g" m+ w
7 `3 V1 |0 R8 [ 本例程使用的芯片型号为STM8L152C6,是中等容量,48脚的mcu,它只有一个输出通道,输出通道是PF0.如下图数据手册中的介绍8 u1 c8 P* X% Q& X1 Y
% z% E5 H6 M9 J6 `9 N : E' y6 d0 K2 C
) C* x+ P/ K) \; t( u6 X STM8L的DAC为12位DAC,写入DHR寄存器中的数据最大为2^12=4096.下图是数据手册中给出的DAC输出电压计算公式 ACout=Vref*(DAC_DOR/4096)
* Q, D6 m$ o& k0 I3 H: T % `& @5 A9 @9 n) v
①DACout是DAC输出的电压
! U, y- @ e" O- s ②Vref是参考电压,由于参考电压引脚和MCU供电引脚连接在一起,所以Vref的电压和单片机系统的供电电压相等.实测为2.98V,这个值以实测为准.+ G) d" p) T- ~" G
根据这个公式,如果向DAC_DHR写入数据为2048,那么DAC输出电压应该为2048/4096*2.98=1.490V3 t, s7 d3 r% k' j% n
$ S; ^9 j$ p* J2 d, ?3 N
6 b' A1 T5 c- r DAC连续输出不同的电压,可以达到输出正弦波,三角波等各种波形,由于没有示波器,没法看到输出波形,所以本例程,只是简单的使用DAC最基本的输出电压的功能,使用万用表测量输出的电压与计算值对比.' U% O) Z+ m5 n& w! d, n
- /*硬件连接*/
- // 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 _6 R% Y# U$ O% Q, z" f( m
0 Q& z5 }1 b* w3 j# d3 r2 j |
|