STM32F429 DAC实验一:cubemx实现DAC(非DMA方式)

背景知识:

STM32F429有两个DAC通道,DAC_CHANNEL_1、DAC_CHANNEL_2。

ADC是将模拟量转为数字量,而DAC是数字量转为模拟量,也就是说这是输出模拟量的通道。

我们的实验目的:控制DAC输出多少电压,然后用ADC1的通道5读取DAC输出的模拟量,检查DAC输出的是否准确。

cubemx配置:我们用DAC的通道1,12位模式,右对齐,非DMA方式。由于DAC的通道一与ADC1的通道4复用,所以先去掉ADC1的通道4。

我们先用原子的配置(不用output缓存,不使用任何触发)

关于output buff真如原子所说,如果开启那么虽然输出能力强一些,但是的确没法输出到0,实测输出设置为0时,实际为0.05V。

关于触发,如果不选择触发方式那么就是当你向DAC设置数值的时候就完成了DAC转换。而如果选择软件触发的话,就得在设置完数值后HAL_DAC_Start,才会输出,这就是二者区别。所以不选择触发反而更方便些。

生成代码,cubemx已经帮我们初始化完毕,与ADC一样,得我们手动开启一下DAC。而且因为我们没用DMA,需要手动设置DAC的数值。

1.我们将DAC的通道1短接到ADC1的通道5,然后在代码中实现显示DAC通道1当前输出的模拟量,以及ADC通道5检测到的实时模拟量。为了直观,我们换算成电压值显示。

2.当按键KEY1被按下时,将DAC输出提高0.1V,然后观察是否与ADC1一致。

//main.c
int main(void)
{
    MX_ADC1_Init();        //ADC1的初始化
    MX_DAC_Init();         //DAC的初始化
    HAL_ADC_Start_DMA(&hadc1, (uint32_t*)&_u16ADC_Value, 100);    //开启ADC1的DMA采集
    HAL_DAC_Start(&hdac, DAC_CHANNEL_1);                          //开启DAC的输出
    DAC_OutputValue(_u16DAC_Value);                               //输出一次初始状态
    while (1)
    {
        //处理ADC数据
	for(i=0,_u32Value2=0,_u32Value3=0;i < 100;)
	{
		_u32Value2 += _u16ADC_Value[i++];
		_u32Value3 += _u16ADC_Value[i++];
	}
	_u32Value2 /= 50;
	_u32Value3 /= 50;
	sprintf((char*)InLtdcBuff1, "ADC1_CH5: %1.2f V\r\n", _u32Value2*3.3f/4096);	
	sprintf((char*)InLtdcBuff2, "DAC: %1.2f V\r\n", _u16DAC_Value*3.3f/4096);
	
	LTDC_Refresh(InLtdcBuff1, InLtdcBuff2);			//屏幕的刷新
	
	_u8KeyStatus = KEY_Scan(0);
	if(_u8KeyStatus[KEY1])
	{
		_u16DAC_Value += 4096/33;			//每次增加一次0.1V的模拟量
		DAC_OutputValue(_u16DAC_Value);
	}
	//喂狗
	HAL_IWDG_Refresh(&hiwdg);
	delay_ms(100);
  }

}
//dac.c
void DAC_OutputValue(uint16_t u16Value)
{
        //输出DAC,默认通道1,12位精度向右对齐,输出模拟量
	HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, (uint32_t)u16Value);
}

效果如图所示:


基准电压的探索:

DAC的参考电压Vref+用的是3.3V,我把Vref+接上了4V电压,并且修改代码中的转换电压处(由3.3改为4.0),在3.4V前还凑合保持±0.05V,大于3.5V的时候用万用表(因为ADC的范围为0~3.3V,所以记得把与ADC的短接去掉)测得会比设定DAC的值小个0.2V了。

我把Vref+接上了2V电压,挺准±0.01V

对不起各位,我撒比了,这个基准电压是有规定范围的,并不能超过3.3V的。这就说的通了。


DMA方式的探索:

cubemx的DAC配置中在添加DMA方式时总是提醒我ERRO “no available DMA requests for this peripheral”

有一个帖子能给一些帮助

http://www.stmcu.org.cn/module/forum/thread-620964-1-1.html

我能理解,但是在cubemx中始终添加不了,因此我想起一句人生哲理---“世上无难事,只要肯放弃”。

微笑脸

发布了26 篇原创文章 · 获赞 0 · 访问量 2987

猜你喜欢

转载自blog.csdn.net/nianzhu2937/article/details/103783516