前言
在做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 rn",AD_Value);
sprintf(str,"DAC Voltag : %f rn",(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输出的电压);
串口输出
上一篇:STM32基础13--直接存储器访问(DMA)
下一篇:STM32基础11--模数转换(ADC)
推荐阅读最新更新时间:2024-11-12 10:56
设计资源 培训 开发板 精华推荐
- NCP1654PFCGEVB:功率因数控制器评估板
- STEVAL-ISC004V1、STUSB4710A 评估板(带有板载 DC-DC)
- IP5358_VOOC快充
- TWR-K40D100M: Kinetis K40 100 MHz低功耗MCU塔式系统模块
- Spx3819 500Ma、低噪声LDO稳压器的典型应用电路
- STC15开发板
- EVAL-ADM1293EBZ,用于评估 ADM1293 数字功率监视器的评估板
- AD8041-EVAL,具有用于超声成像的 AD8041±5V 模拟放大功能的评估板
- RT8015B 3A、2MHz、同步降压转换器的典型应用
- LT3460ES5 5V 至 12V 升压转换器的典型应用电路