向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);
- }
- }
|