一、简要介绍一下DAC
DAC也有分辨率,转换时间,精度等
分辨率常见为8或12位的
转换时间F1,F4,F7都是3us左右,而H7系列是1.7us
1.DAC框图
2.数据格式(对齐方式)
3.触发源
4.可以发送DMA请求
注意:只能由外部事件触发DMA请求
5.模数转换
6.输出缓存(一般关闭)
二、HAL库函数
三、实验思路及实践
用DAC在引脚输出一个电压值,然后再用ADC来读取这个电压值
#include "dac.h"DAC_HandleTypeDef hdac1;
void DAC_Init(void)
{DAC_ChannelConfTypeDef sConfig;hdac1.Instance = DAC1;HAL_DAC_Init(&hdac1);sConfig.DAC_Trigger = DAC_TRIGGER_NONE;//自动触发sConfig.DAC_OutputBuffer = DAC_OUTPUTBUFFER_DISABLE;//关闭输出缓存HAL_DAC_ConfigChannel(&hdac1,&sConfig,DAC_CHANNEL_1);HAL_DAC_Start(&hdac1,DAC_CHANNEL_1);
}void HAL_DAC_MspInit(DAC_HandleTypeDef *hdac)
{if(hdac->Instance == DAC1){RCC_PeriphCLKInitTypeDef ADC_PeriphClkInit={0};__HAL_RCC_GPIOA_CLK_ENABLE();//PA4__HAL_RCC_DAC_CLK_ENABLE();//GPIO_InitTypeDef GPIO_Init;GPIO_Init.Pin = GPIO_PIN_4;GPIO_Init.Mode = GPIO_MODE_ANALOG;HAL_GPIO_Init(GPIOC,&GPIO_Init);}
}//用0-3300代表0-3.3v
//设置通道输出电压
void DAC_SET_VALUE(uint16_t val)
{double temp = val;temp /= 1000;temp = temp/3.3*4096;//转换成数字量,供ADC读取,然后我们在转换为模拟量if(temp>=4096)temp=4095;HAL_DAC_SetValue(&hdac1,DAC_CHANNEL_1,DAC_ALIGN_12B_R,temp);
}
ADC_HandleTypeDef hadc1;void ADC_Single_Init(void)
{ADC_ChannelConfTypeDef ADC_sConfig;hadc1.Instance = ADC1;hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;hadc1.Init.ContinuousConvMode = DISABLE;//我们使用不连续模式,则每想转换一次ADC,就要调用HAL_ADC_Start(&hadc1);函数hadc1.Init.NbrOfConversion = 1;hadc1.Init.DiscontinuousConvMode = DISABLE;//不用(不连续采用模式,只适用于扫描模式)间断模式hadc1.Init.NbrOfDiscConversion = 0;hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;//软件触发HAL_ADC_Init(&hadc1);HAL_ADCEx_Calibration_Start(&hadc1);//开启校准ADC_sConfig.Channel = ADC_CHANNEL_11;ADC_sConfig.Rank = ADC_REGULAR_RANK_1;ADC_sConfig.SamplingTime = ADC_SAMPLETIME_239CYCLES_5;HAL_ADC_ConfigChannel(&hadc1, &ADC_sConfig);}uint32_t ADC_Single_CONVERT_START()
{HAL_ADC_Start(&hadc1);HAL_ADC_PollForConversion(&hadc1,1);//计算的到转换时间为21us,所以这里给1ms绰绰有余return HAL_ADC_GetValue(&hadc1);
}
#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/delay/delay.h"
#include "usart.h"
#include "adc.h"
#include "stdio.h"uint32_t time;
int main(void)
{uint16_t adc_tem;float adc_value;HAL_Init(); /* 初始化HAL库 */sys_stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */delay_init(72); /* 延时初始化 */USART_Init(115200);DAC_Init();DAC_SET_VALUE(3000);ADC_Single_Init();while(1){ adc_temp=ADC_Single_CONVERT_START();adc_value=adc_temp*3.3/4096;printf("PC1\nadc_temp->%d\nadc_value->%.5f v\n\n\n\n",adc_temp,adc_value);HAL_Delay(1000);}
}