本帖最后由 Zhao_kar 于 2025-3-19 15:23 编辑
【STM32 H533RE】测评五_DAC的基本原理和测试
备注:本节主要做dac的简单测试,具体操作为使用单片机自带的DAC生成一个信号,然后让adc重新采集,采集之后用串口打印,验证整个过程,实现之后可以看到串口打印的值即为设定的dac的值。
一、dac的原理
dac其实就是跟adc的ad反过来的,也就是把数字信号转换成模拟信号的设备,在h5的mcu里面,dac允许mcu直接输出可调的模拟电压信号,不需要外接dac模块,这个跟adc也是一样的,然后如果学过数电的,应该知道比较常见的就是权电阻网络和R2R的dac网络,还有倒t等等,本质上都是利用运放来设计的,详细就不说了,本篇就不像上一篇那么详细的说adc的原理了,两者其实是类似的思考方式,我们这边以两种方式来测试,一个是直接dac产生一个电压值,adc去测,第二种用cubemx自带的三角波波形,然后打印出来看看。
二、cubemx的配置
补充:在这一部分,配置dac时要设置一下通道,别用默认的pa4引脚,如果查阅过官方文档,就能明白我说的是什么意思了。
然后你去看板子原理图,应该是没有吧pa4拉出来,所以改换成pa5即可。
操作如下
时钟树同理上一篇
然后adc跟上一篇的操作是一样的,详见如下
操作完之后开一下串口,这边就老样子开的串口1
接下来就是dac的代码编写部分。
二、代码部分
-
- HAL_DAC_SetValue(&hdac1, DAC_CHANNEL_1, DAC_ALIGN_12B_R, 2048);
-
-
- HAL_ADCEx_Calibration_Start(&hadc1,ADC_SINGLE_ENDED);
-
这一部分是老样子,一个是adc的一个是adc的,此时我们dac会输出1.65v的电压,然后循环部分还是让adc采集电压,跟上一篇一样,如下
- HAL_DAC_Start(&hdac1,DAC_CHANNEL_1);
- HAL_ADC_Start(&hadc1);
- HAL_ADC_PollForConversion(&hadc1, 50);
-
-
- if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc1), HAL_ADC_STATE_REG_EOC))
- {
- ADC_Value = HAL_ADC_GetValue(&hadc1);
- printf("ADC1: %d \r\n",ADC_Value);
- printf("V: %.4f \r\n",ADC_Value*3.3f/4096);
- }
- HAL_Delay(2000);
- }
编译,烧录,然后在串口调试助手,就可以看到1,65v附近的电压了。
接下来测试完这个,我们再看三角波操作,先在cubemx里操作。
三、cubemx更改
我们要在dac这部分进行更改
然后这里面设置合适的值,我设的4095,然后打开定时器
生成代码之后只需要加一个定时器部分,然后其他部分没有什么太大变化,只需要把adc采集到的值打印出来即可
- HAL_TIM_Base_Start(&htim2);
打印出来后见vofa的图
硬件连接实物如下