STM32F407 DAC转换

DAC转换

DAC介绍

典型的数字模拟转换器将表示一定比例电压值的数字信号转换为模拟信号。
STM32F4 的 DAC 模块(数字/模拟转换模块)是 12 位数字输入,电压输出型的 DAC。DAC可以配置为 8 位或 12 位模式,也可以与 DMA 控制器配合使用。DAC 工作在 12 位模式时,数据可以设置成左对齐或右对齐。DAC 模块有 2 个输出通道,每个通道都有单独的转换器。在双DAC 模式下,2 个通道可以独立地进行转换,也可以同时进行转换并同步地更新 2 个通道的输出。DAC 可以通过引脚输入参考电压 Vref+(通 ADC 共用)以获得更精确的转换结果。
STM32F4 的 DAC 模块主要特点有:
① 2 个 DAC 转换器:每个转换器对应 1 个输出通道
② 8 位或者 12 位单调输出
③ 12 位模式下数据左对齐或者右对齐
④ 同步更新功能
⑤ 噪声波形生成
⑥ 三角波形生成
⑦ 双 DAC 通道同时或者分别转换
⑧ 每个通道都有 DMA 功能

DAC代码实现

本实验用到的硬件资源有
1) 一根杜邦线
2) KEY_UP 和 KEY0 按键
3) 串口
4) DAC
5) ADC
实现过程: 通过DAC其中一个通道所在的IO口输出模拟电压,用两个按键控制输出模拟电压的大小。一个按键按下时,模拟电压增大,另一个按键按下时,模拟电压减小。同时用杜邦线将其中一个通道所在的IO口与ADC的通道5所在的IO口相连。同时使用串口一输出ADC的电压值和DAC的电压值。
实现步骤: 首先在STM32CubeMx当中初始化两个按键所对应的IO口,然后初始化ADC和DAC的对应通道。最后再初始化串口。
常用函数:

HAL_DAC_Start(DAC_HandleTypeDef* hdac, uint32_t Channel); //开启DAC输出。
HAL_DAC_Stop(DAC_HandleTypeDef* hdac, uint32_t Channel); //关闭DAC输出
HAL_DAC_Start_DMA(DAC_HandleTypeDef* hdac, uint32_t Channel, uint32_t* pData, uint32_t Length, uint32_t Alignment); //需要函数中不断开启,开启DAC的DMA输出
HAL_DAC_Stop_DMA(DAC_HandleTypeDef* hdac, uint32_t Channel); //关闭DAC的DMA输出
HAL_DAC_SetValue(DAC_HandleTypeDef* hdac, uint32_t Channel, uint32_t Alignment, uint32_t Data); //设置DAC输出值
HAL_DAC_GetValue(DAC_HandleTypeDef* hdac, uint32_t Channel); //获取DAC输出值

所用到的变量词介绍:

hdac:hdac
Channel:DAC_CHANNEL_1、DAC_CHANNEL_2
pData:输出值
Alignment:对齐方式,DAC_ALIGN_12B_R、DAC_ALIGN_12B_L、DAC_ALIGN_8B_R。
Length:数据长度

代码如下:

float Voltage;  //电压值
float adcx;    //电压的值
float dacval=0;  //设置模拟电压的值

  /* USER CODE BEGIN 2 */
		HAL_DAC_Start(&hdac,DAC_CHANNEL_1);
		HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, adcx);
  /* USER CODE END 2 */

/* USER CODE BEGIN WHILE */
  while (1)
  {
		if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_4)==SET)
		{
			if(dacval>200)
				dacval-=200;
			HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, dacval);
		}
		else if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==SET)
		{
			if(dacval<4000)
				dacval+=200;
			HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, dacval);
		}
		adcx=HAL_DAC_GetValue(&hdac,DAC_CHANNEL_1);
		printf("adcx = %.2f\r\n",(float)adcx*(3.3/4096));  //打印输出电压值
		HAL_ADC_Start(&hadc1);  //开启ADC转换
	  HAL_ADC_PollForConversion(&hadc1,50);  //等待ADC转换结束
	  if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc1), HAL_ADC_STATE_REG_EOC)) //获取转换状态
		{
			Voltage = ((float)HAL_ADC_GetValue(&hadc1)/4095.0)*3.3;  //获取并计算电压
			printf("Voltage = %.2f\r\n",Voltage);  //打印输出电压值
		}
    HAL_ADC_Stop(&hadc1);  //关闭ADC转换
    HAL_Delay(500);
    /* USER CODE END WHILE */

实现的效果
在这里插入图片描述

  • 9
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值