数模转换编程实战:ADC/DAC
硬件设计
本实验用到的硬件资源有:
1) 野火STM32霸天虎开发板
2)硬件连接方式:PA4-DAC_OUT1连接PA2-ADC1_CH2
CubeMX配置
时钟源配置
ADC
勾选IN2
参数设置
DAC
勾选OUT1即可
数模转换实验配置步骤
adc.c
uint32_t adc_get_result(void)
{
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1, 10);
return (uint16_t)HAL_ADC_GetValue(&hadc1);
}
dac.c
void MX_DAC_Init(void)
{
/* MX CODE BEGIN DAC_Init 1 */
//。。。。。。。。。。。。。。
/* MX CODE END DAC_Init 1 */
/* USER CODE BEGIN DAC_Init 2 */
HAL_DAC_Start(&hdac, DAC_CHANNEL_1);
/* USER CODE END DAC_Init 2 */
}
void dac_set_voltage(uint16_t vol)
{
double temp = vol;
temp /= 1000;
temp = temp * 4096 / 3.3;
if (temp >= 4096)temp = 4095; /* 如果值大于等于4096, 则取4095 */
HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, temp); /* 12位右对齐数据格式设置DAC值 */
}
main.c
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_TIM13_Init();
MX_TIM14_Init();
MX_USART1_UART_Init();
MX_DAC_Init();
MX_ADC1_Init();
LCD_Init();
LCD_Fill(0, 0, LCD_W, LCD_H, BLACK);
dac_set_voltage(3300);
while (1)
{
adcx = adc_get_result();
temp = (float)adcx * 3.3 / 4096;
LCD_ShowIntNum(24, 16, adcx, 4, WHITE, BLACK, 12);
adcx = temp;
temp -= adcx;
temp *= 1000;
LCD_ShowIntNum(24, 32, adcx, 1, WHITE, BLACK, 12);
LCD_ShowChar(32, 32, '.', WHITE, BLACK, 12, 0);
LCD_ShowIntNum(40, 32, temp, 3, WHITE, BLACK, 12);
}
}
实验结果
DAC部分:
用万用表测量PA4与GND之间的电压为3.27V
ADC部分:
LCD屏幕上显示的电压范围在3.200~3.299V之间跳动