《STM32单片机开发应用教程(HAL库版)—基于国信长天嵌入式竞赛实训平台(CT117E-M4)》第四章4.7 DAC电压输出实验

写在前面——
《STM32单片机开发应用教程(HAL库版)—基于国信长天嵌入式竞赛实训平台(CT117E-M4)》第四章4.7 DAC电压输出实验,讲述DAC的STM32CubeMX配置和程序设计
官方例程下载:https://pan.baidu.com/s/1QC5BnDgY1m1me6-ihQ_OUQ?pwd=nqb1
提取码:nqb1

4.7 DAC电压输出实验

4.7.1. 实验任务

  1. 参看官方例程(HAL_12_DAC),实现电压信号输出。
  2. 拓展功能:无。

4.7.2. 硬件连接

在这里插入图片描述
  由上图可以看出,开发板上在扩展接口处引出了DAC的引脚。查阅芯片的数据手册,可知,2路DAC输出引脚: PA4 --> DAC1_OUT1; PA5 --> DAC1_OUT2

4.7.3. 初始化配置(STM32CubeMX)

这里只配置了DAC1(PA4 引脚)。RCC、SYS、时钟树等配置,请参考前述章节。
在这里插入图片描述

4.7.4. 应用程序设计(KEIL5)

生成代码后,KEIL5打开工程,main.c自动调用DAC的初始化函数:
在这里插入图片描述
  在库包stm32G4xx_hal_dac.c中给定了DAC库函数HAL_DAC_SetValue(),该函数将指定的数值从DAC引脚(PA4/5)输出其电压值(v)。
  先编写电压输出函数Dac1_Set_Vol(float vol),在main.c用户代码区域填入:

/* USER CODE BEGIN 0 */
void Dac1_Set_Vol(float vol)
{
	uint16_t temp;
	
	temp = (4096*vol/3.3f);
	
	HAL_DAC_SetValue(&hdac1, DAC_CHANNEL_1,DAC_ALIGN_12B_R,temp);
}
/* USER CODE END 0 */

在main函数中编辑程序,调用电压输出函数Dac1_Set_Vol(float vol),如(官方例程HAL_12_DAC):

/* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_DAC1_Init();
  /* USER CODE BEGIN 2 */
	LCD_Init();
	
	LCD_Clear(Blue);
	LCD_SetBackColor(Blue);
	LCD_SetTextColor(White);
	
	LCD_DisplayStringLine(Line0, (uint8_t *)"                    ");
	LCD_DisplayStringLine(Line1, (uint8_t *)"                    ");
	LCD_DisplayStringLine(Line2, (uint8_t *)"      DAC Test      ");
	LCD_DisplayStringLine(Line3, (uint8_t *)"                    ");
	LCD_DisplayStringLine(Line4, (uint8_t *)"                    ");
	
	LCD_SetBackColor(White);
	LCD_SetTextColor(Blue);

	LCD_DisplayStringLine(Line5, (uint8_t *)"                    ");
	LCD_DisplayStringLine(Line6, (uint8_t *)"       DA1 CH1      ");
	LCD_DisplayStringLine(Line7, (uint8_t *)"                    ");
	LCD_DisplayStringLine(Line8, (uint8_t *)"     PA4: 2.55V     ");
	LCD_DisplayStringLine(Line9, (uint8_t *)"                    ");
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
	Dac1_Set_Vol(2.55);
/* USER CODE END 2 */

该程序将实现LCD中显示输出电压值:2.55v
可用万用表测试PA4的输出电压值,如下图所示:
在这里插入图片描述
注意,该图中测试电压值为2.32,是因为其程序中输出函数指定了数值2.3:Dac1_Set_Vol(2.3);
DAC功能很多。但是比赛赛题里很少出现,这里不过多赘述,大家掌握其基本使用方法即可。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
STM32F407单片机16bit_DAC_AD5689模拟量(-10V~10V)电压输出实验KEIL工程源码: int main(void) { uint16_t data=0xFFFF/2; double temp,opa; /* 复位所有外设,初始化Flash接口和系统滴答定时器 */ HAL_Init(); /* 配置系统时钟 */ SystemClock_Config(); /* 初始化串口并配置串口中断优先级 */ MX_DEBUG_USART_Init(); KEY_GPIO_Init(); printf("硬石DAC(AD5689)模块模拟量电压输出测试\n"); AD5689_Init(); AD5689_WriteUpdate_DACREG(DAC_A,data); AD5689_WriteUpdate_DACREG(DAC_B,0xFFFF-data); printf("data:%d\n",data); opa=OPA_RES_R2/OPA_RES_R1; while(1) { if(KEY1_StateRead()==KEY_DOWN) { if(data>(0xFFFF-1000)) data=(0xFFFF-1000); data +=1000; AD5689_WriteUpdate_DACREG(DAC_A,data); AD5689_WriteUpdate_DACREG(DAC_B,0xFFFF-data); temp=(double)(data*2-0xFFFF)*2500*opa/0xFFFF; //temp为目标电源值,这里先放大1000倍(方便计算而已),等后面显示再还原 //data是数字量DA值,当data取值为:0~0xFFFF对应AD5689输出为0~5V //本例程是输出-10V~10V,这个功能主要是靠运放现,特殊的电路使得: //AD5689输出0V时对应运放输出-10V,AD5689输出2.5V对应运放输出0V,AD5689输出5V对应运放输出10V //(上面虽说是10V,际上应该是 2.5V*opa(运放放大倍数),这里opa=40.2K/10K=4.02) //所以使得程序:data值为0时运放输出-10V, data为0xFFFF/2时输出运放输出0V,data为0xFFFF时输出运放输出10V //temp=(data-0xFFFF/2)/(0xFFFF/2)*2.5*1000*opa printf("data:%d->%0.3fV\n",data,temp/1000); } if(KEY2_StateRead()==KEY_DOWN) { if(data<1000) data=1000; data -=1000;

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

我是春老师

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

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

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

打赏作者

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

抵扣说明:

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

余额充值