STM32基础12--数模转换(DAC)

目录

前言

DAC框图

功能需求

硬件电路

 STM32CubeMx配置DAC

功能代码实现 

串口输出


前言


        在做51单片机项目时,如果需要对外围电路的压输出,往往会在51单片机上面外挂一个DAC转换芯片(例如DAC0808)。但在STM32F407中,不再需要这么干了,因为在STM32的内部就已经集成了DAC电路。

        STM32中,DAC 模块是 12 位电压输出数模转换器。DAC 可以按 8 位或 12 位模式进行配置,并且可与 DMA 控制器配合使用。在 12 位模式下,数据可以采用左对齐或右对齐。DAC 有两个输出 通道,每个通道各有一个转换器。在 DAC 双通道模式下,每个通道可以单独进行转换;当 两个通道组合在一起同步执行更新操作时,也可以同时进行转换。可通过一个输入参考电压
引脚 VREF+ (与 ADC 共享)来提高分辨率。

DAC框图

        DAC 输出是受 DORx 寄存器直接控制的,但是我们不能直接往DORx 寄存器写入数据,而是通过 DHRx 间接的传给 DORx 寄存器,实现对 DAC 输出的控制。 

         经过线性转换后,数字输入会转换为 0 到 VREF+ 之间的输出电压。
各 DAC 通道引脚的模拟输出电压通过以下公式确定:

                                DACoutput  =  (VREF /4095)*DOR 

功能需求

        1)DAC的参考电压采用 Vref  = 3.3V,通过设定DHR寄存器的值,改变DOR的值,从而改变DACOutput电压的输出;

        2)使用ADC1对DAC产生的电压进行测量;

        3)ADC测量的结果通过串口打印输出到PC端。

硬件电路

        在硬件电路中,PA4作为DAC的输出,而PA5作为ADC的输入。

        

 

 

 STM32CubeMx配置DAC

 

功能代码实现 

 STM32CubeMx生成初始化代码

 

ADC与DAC功能代码

 

       HAL_DAC_SetValue(&hdac,DAC1_CHANNEL_1,DAC_ALIGN_12B_R,2048);
      
       HAL_ADC_Start(&hadc1);  
       HAL_ADC_PollForConversion(&hadc1, 200);

       
       if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc1), HAL_ADC_STATE_REG_EOC))

      {

          /*##-3- Get the converted value of regular channel  ######################*/

         AD_Value = HAL_ADC_GetValue(&hadc1);
         printf("AD_Value = %d \r\n",AD_Value);
         sprintf(str,"DAC Voltag : %f \r\n",(float)((AD_Value*3.3)/4096));
         HAL_UART_Transmit(&huart1,(uint8_t *)str,strlen((const char *)str),100);

      }
    
      HAL_Delay(1000);

         注:

        1)在HAL_DAC_SetValue的第3个参数是填写格式(这个格式需要与ADC的格式一直,否则会对电压解释错误);

        2)在HAL_DAC_SetValue的第4个参数是填写DHR的数值(该数值决定DAC输出的电压);

 

串口输出

 

 

 

 

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
以下是在STM32上进行DAC数模转换实验的示例代码: ```c #include "stm32f10x.h" void GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; GPIO_Init(GPIOA, &GPIO_InitStructure); } void DAC_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; DAC_InitTypeDef DAC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; GPIO_Init(GPIOA, &GPIO_InitStructure); DAC_InitStructure.DAC_Trigger = DAC_Trigger_None; DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None; DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Enable; DAC_Init(DAC_Channel_1, &DAC_InitStructure); DAC_Cmd(DAC_Channel_1, ENABLE); } int main(void) { RCC_Configuration(); GPIO_Configuration(); DAC_Configuration(); while (1) { uint16_t data = ADC_GetConversionValue(ADC1); DAC_SetChannel1Data(DAC_Align_12b_R, data); } } ``` 在这个例子中,我们使用了一个ADC输入和一个DAC输出进行数模转换的实验。我们将ADC输入连接到引脚PA4,而DAC输出连接到引脚PA5。 在主函数中,我们首先对GPIO和DAC进行了配置。随后,我们使用一个循环来不断地从ADC中读取数据,并将其传递给DAC进行输出。这样可以让我们在DAC输出的设备上观察到变化的电压。 需要注意的是,这个例子中我们并没有使用DAC的触发器功能,而是通过直接设置DAC数据寄存器的方式进行输出。如果需要使用触发器功能,请参考官方文档进行配置。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

颖川初尘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值