|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
向STM8L的向DHR寄存器写入数据,此数据被送入到DOR寄存器,最终被送到DA转换器,DAC会输出对应的电压.我们使用用万用表测量此电压,与理论计算值对比,来学习STM8L的DAC.
4 u, X. G( R% i' _4 E5 V6 _
9 j, u8 `$ R2 t( I" m 下图为STM8L152C6的DAC内部结构图.
- S: v8 P( D, h
# \. u2 v& w( B; ] 本例程使用的芯片型号为STM8L152C6,是中等容量,48脚的mcu,它只有一个输出通道,输出通道是PF0.如下图数据手册中的介绍+ d+ f2 x: C& \1 ?
0 n- n/ U; W* l# K# H9 p
6 x( t1 m* Z7 v + a3 ^$ N. O6 ?. E( H, R+ _
STM8L的DAC为12位DAC,写入DHR寄存器中的数据最大为2^12=4096.下图是数据手册中给出的DAC输出电压计算公式 ACout=Vref*(DAC_DOR/4096)& U( D7 _7 h& I7 d1 Y( f' G/ V
! s/ p# b& F. M
①DACout是DAC输出的电压
8 w9 c4 ~0 N+ A ②Vref是参考电压,由于参考电压引脚和MCU供电引脚连接在一起,所以Vref的电压和单片机系统的供电电压相等.实测为2.98V,这个值以实测为准.
) \% K. ~- E& O, i# X% I6 x. s+ D 根据这个公式,如果向DAC_DHR写入数据为2048,那么DAC输出电压应该为2048/4096*2.98=1.490V
# M+ a n( v# e8 b3 Z7 z* F/ @
/ F0 [8 Q L) J0 O$ @1 G1 `
' Y- n: b5 P0 ^) l9 | DAC连续输出不同的电压,可以达到输出正弦波,三角波等各种波形,由于没有示波器,没法看到输出波形,所以本例程,只是简单的使用DAC最基本的输出电压的功能,使用万用表测量输出的电压与计算值对比.+ k, F$ `+ `9 ^5 s, O% s# }
- /*硬件连接*/
- // 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);
- }
- }
2 @1 q6 j: ^6 s) y2 I. K2 Q( b5 Y o* X- I5 b& G% O! G' R4 F
6 |% q6 ~5 G( {% h: ]
9 k; O$ j# Q r
|
|