[活动专区] 【AT-START-F407测评】七、DAC

[复制链接]
973|2
 楼主| lisingch 发表于 2021-2-3 11:23 | 显示全部楼层 |阅读模式
      本次实验使用AT32F407VGT7的DAC输出通道1(PA4)输出三个预设电压值(1v、2v、3v)并利用万用表进行显示。预设电压值通过开发板上的用户按键进行设置,并同时利用三个颜色的LED灯(LED2、LED3、LED4)进行指示。

一、实验资源
1、AT-START-F407开发板;
2、keil v5.31.0.0;
3、BSP等相关资源;
4、UT61E;

二、相关知识学习
      AT32F407VGT7的DAC(数字->模拟转换)模块是12位数字输入,电压输出的“DAC”:
2021-02-02_225420.png
2021-02-02_225442.png
2021-02-02_225529.png
2021-02-02_230008.png
2021-02-02_230033.png
2021-02-02_230153.png
2021-02-02_230415.png

      “DAC”支持多种触发方式,本次实验使用了软件触发工作方式。可配置为8位、12位工作模式,数据格式可选择为左对齐或右对齐。实验中DAC被配置成12位右对齐工作模式。根据DAC输出电压计算工式:
2021-02-03_105818.png
计划在DAC输出三个电压值(1v、2v、3v),经测量开发板上的VREF=3.199V,经计算对应写入“DAC_HDR12RD”寄存器的数据分别为:0x0500、0x0A00、0x0F00。

三、硬件连接
      万用表连接PA4端口。

四、程序实现
      代码在“BSP”基础上修改,并利用板载用户按键中断控制“DAC”(PA4)输出电压。
为方便写入“DAC_HDR12RD”寄存器的预设电压值建个数组:
  1. uint16_t DAC_DATA[]={0x0000,0x0500,0x0A00,0x0F00};

DAC配置:
  1. static void DAC_Config(void)
  2. {
  3.         DAC_InitType DAC_InitStructure;
  4.        
  5.         /* DAC channel1 Configuration */
  6.   DAC_StructInit(&DAC_InitStructure);
  7.   DAC_InitStructure.DAC_Trigger = DAC_Trigger_Software;
  8.   DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None;
  9.   DAC_InitStructure.DAC_LFSRUnmask_TriangleAmplitude = DAC_LFSRUnmsk_Bits11_0;
  10.   DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Enable;
  11.   DAC_Init(DAC_Channel_1, &DAC_InitStructure);

  12.   /* Enable DAC Channel1: Once the DAC channel1 is enabled, PA.04 is
  13.      automatically connected to the DAC converter. */
  14.   DAC_Ctrl(DAC_Channel_1, ENABLE);
  15. }

按键中断处理:
  1. void EXTI0_IRQHandler(void)
  2. {
  3.         static uint8_t BUTTON_CONT=0;
  4.   Delay_ms(5);
  5.   EXTI_ClearIntPendingBit(BUTTON_EXTI_LINE[gButtonType]);
  6.   if ((GPIO_ReadInputData(BUTTON_GPIO_PORT[gButtonType]) & BUTTON_GPIO_PIN[gButtonType]) == \
  7.       BUTTON_GPIO_PIN[gButtonType])
  8.   {
  9.                 BUTTON_CONT++;
  10.                 if(BUTTON_CONT>3)
  11.                         BUTTON_CONT=0;
  12.                 switch(BUTTON_CONT)
  13.                 {
  14.                         case 1:        {
  15.                                                                 AT32_LEDn_ON(LED2);AT32_LEDn_OFF(LED3);AT32_LEDn_OFF(LED4);
  16.                                                                 DAC_SetChannel1Data(DAC_Align_12b_Right, DAC_DATA[1]);
  17.                                                                 DAC_SoftwareTriggerCtrl(DAC_Channel_1, ENABLE);
  18.                                                                 break;
  19.                                                         }
  20.                         case 2:        {
  21.                                                                 AT32_LEDn_OFF(LED2);AT32_LEDn_ON(LED3);AT32_LEDn_OFF(LED4);
  22.                                                                 DAC_SetChannel1Data(DAC_Align_12b_Right, DAC_DATA[2]);
  23.                                                                 DAC_SoftwareTriggerCtrl(DAC_Channel_1, ENABLE);
  24.                                                                 break;
  25.                                                         }
  26.                         case 3:        {
  27.                                                                 AT32_LEDn_OFF(LED2);AT32_LEDn_OFF(LED3);AT32_LEDn_ON(LED4);
  28.                                                                 DAC_SetChannel1Data(DAC_Align_12b_Right, DAC_DATA[3]);
  29.                                                                 DAC_SoftwareTriggerCtrl(DAC_Channel_1, ENABLE);
  30.                                                                 break;
  31.                                                         }
  32.                         default:{
  33.                                                                 AT32_LEDn_OFF(LED2);AT32_LEDn_OFF(LED3);AT32_LEDn_OFF(LED4);
  34.                                                                 DAC_SetChannel1Data(DAC_Align_12b_Right, DAC_DATA[0]);
  35.                                                                 DAC_SoftwareTriggerCtrl(DAC_Channel_1, ENABLE);
  36.                                                                 break;
  37.                                                         }
  38.                 }
  39.   }
  40. }

五、实验结果
设定为“0”输出时有个底数
微信图片_20210203101228.jpg
微信图片_20210203101213.jpg
微信图片_20210203101218.jpg
微信图片_20210203101207.jpg

六、总结
      本次实验比较简单,所有复杂的都建立在这些简单、基础的实验之上,继续努力。



pattywu 发表于 2021-2-3 12:20 | 显示全部楼层
从图上看,DAC输出值,还是很准的啊。
 楼主| lisingch 发表于 2021-2-3 12:35 | 显示全部楼层
pattywu 发表于 2021-2-3 12:20
从图上看,DAC输出值,还是很准的啊。

精度不错。加个外置基准做个数控电源
您需要登录后才可以回帖 登录 | 注册

本版积分规则

99

主题

15007

帖子

19

粉丝
快速回复 在线客服 返回列表 返回顶部