本次实验使用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”:
“DAC”支持多种触发方式,本次实验使用了软件触发工作方式。可配置为8位、12位工作模式,数据格式可选择为左对齐或右对齐。实验中DAC被配置成12位右对齐工作模式。根据DAC输出电压计算工式:
计划在DAC输出三个电压值(1v、2v、3v),经测量开发板上的VREF=3.199V,经计算对应写入“DAC_HDR12RD”寄存器的数据分别为:0x0500、0x0A00、0x0F00。
三、硬件连接
万用表连接PA4端口。
四、程序实现
代码在“BSP”基础上修改,并利用板载用户按键中断控制“DAC”(PA4)输出电压。
为方便写入“DAC_HDR12RD”寄存器的预设电压值建个数组:
- uint16_t DAC_DATA[]={0x0000,0x0500,0x0A00,0x0F00};
DAC配置:
- static void DAC_Config(void)
- {
- DAC_InitType DAC_InitStructure;
-
- /* DAC channel1 Configuration */
- DAC_StructInit(&DAC_InitStructure);
- DAC_InitStructure.DAC_Trigger = DAC_Trigger_Software;
- DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None;
- DAC_InitStructure.DAC_LFSRUnmask_TriangleAmplitude = DAC_LFSRUnmsk_Bits11_0;
- DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Enable;
- DAC_Init(DAC_Channel_1, &DAC_InitStructure);
- /* Enable DAC Channel1: Once the DAC channel1 is enabled, PA.04 is
- automatically connected to the DAC converter. */
- DAC_Ctrl(DAC_Channel_1, ENABLE);
- }
按键中断处理:
- void EXTI0_IRQHandler(void)
- {
- static uint8_t BUTTON_CONT=0;
- Delay_ms(5);
- EXTI_ClearIntPendingBit(BUTTON_EXTI_LINE[gButtonType]);
- if ((GPIO_ReadInputData(BUTTON_GPIO_PORT[gButtonType]) & BUTTON_GPIO_PIN[gButtonType]) == \
- BUTTON_GPIO_PIN[gButtonType])
- {
- BUTTON_CONT++;
- if(BUTTON_CONT>3)
- BUTTON_CONT=0;
- switch(BUTTON_CONT)
- {
- case 1: {
- AT32_LEDn_ON(LED2);AT32_LEDn_OFF(LED3);AT32_LEDn_OFF(LED4);
- DAC_SetChannel1Data(DAC_Align_12b_Right, DAC_DATA[1]);
- DAC_SoftwareTriggerCtrl(DAC_Channel_1, ENABLE);
- break;
- }
- case 2: {
- AT32_LEDn_OFF(LED2);AT32_LEDn_ON(LED3);AT32_LEDn_OFF(LED4);
- DAC_SetChannel1Data(DAC_Align_12b_Right, DAC_DATA[2]);
- DAC_SoftwareTriggerCtrl(DAC_Channel_1, ENABLE);
- break;
- }
- case 3: {
- AT32_LEDn_OFF(LED2);AT32_LEDn_OFF(LED3);AT32_LEDn_ON(LED4);
- DAC_SetChannel1Data(DAC_Align_12b_Right, DAC_DATA[3]);
- DAC_SoftwareTriggerCtrl(DAC_Channel_1, ENABLE);
- break;
- }
- default:{
- AT32_LEDn_OFF(LED2);AT32_LEDn_OFF(LED3);AT32_LEDn_OFF(LED4);
- DAC_SetChannel1Data(DAC_Align_12b_Right, DAC_DATA[0]);
- DAC_SoftwareTriggerCtrl(DAC_Channel_1, ENABLE);
- break;
- }
- }
- }
- }
五、实验结果
设定为“0”输出时有个底数
六、总结
本次实验比较简单,所有复杂的都建立在这些简单、基础的实验之上,继续努力。
|