本次实验使用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”输出时有个底数
六、总结
本次实验比较简单,所有复杂的都建立在这些简单、基础的实验之上,继续努力。
|