目录
1.原理图
(1)ADC的原理图
(2)DAC的原理图
2.STM32CubeMX的配置
(1)ADC的配置
(2)DAC配置
3.代码部分
(1)ADC代码
(2)DAC代码
1.原理图
(1)ADC的原理图
作用:将模拟信号转换为数字信号
转换的方法:逐次逼近型,将片内模拟量和一个数字量对应的模拟量比较,得到最接近的值
蓝桥杯嵌入式板子上有两个12位的ADC转换器,每一个ADC具有19个多路复用通道,结果存储在16位寄存器中 (因此16位多4位存在左对齐还是右对齐,DAC也是)
个人理解是STM32G431RBT6这个芯片可以处理这个信号,将它转换?(希望有人能告诉我这个转换是从哪里完成的,谢谢!)
(2)DAC的原理图
作用:将数字信号转换成模拟信号
转换的方法:电流型DAC
蓝桥杯嵌入式板子的DAC模块是12位电压输出模数转换器,可配置为8或12位,两路输出通道
2.STM32CubeMX的配置
(1)ADC的配置
转换周期越短,精度越低,转换时间越长精度愈高
ADC转换时间计算公式为(转换周期+12.5(精度+0.5))*时钟周期
(2)DAC配置
连接到外部的引脚,不要连接到内部
3.代码部分
(1)ADC代码
关键函数:
HAL_ADC_Start(ADC_HandTypeDef *hadc)//开始转换
HAL_ADC_PollForConversion(ADC_HandTypedef *hadc,uint8_t Timeout)//等待完成
HAL_ADC_GetValue(ADC_HandTypedef *hadc)//获得转换结果
HAL_ADC_Stop(ADC_HandTypedef *hadc)//停止转换
代码的作用是获取当前值,按照需要再展示
int R37=0,R38=0;
void get_adcvalue(void)
{
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1,10);
R38 = HAL_ADC_GetValue(&hadc1);
HAL_ADC_Stop(&hadc1);
HAL_ADC_Start(&hadc2);
HAL_ADC_PollForConversion(&hadc2,10);
R37 = HAL_ADC_GetValue(&hadc2);
HAL_ADC_Stop(&hadc2);
}
(2)DAC代码
关键函数
HAL_DAC_Start(DAC_HandTypeDef *hdac,uint8_t Channel)//开始通道转换,指定通道
HAL_DAC_SetValue(DAC_HandTypeDef *hdac,uint32_t Channel,uint32_t Alignment,uint32_t Dta)
HAL_DAC_Stop(DAC_HandTypeDef *hdac,uint32_t Channel)//停止转换
关键函数代码
void set_dacvalue(float value1,float value2)
{
int temp1 = (value1/3.3)*4096;
HAL_DAC_SetValue(&hdac1,DAC_CHANNEL_1,DAC_ALIGN_12B_R,temp1);
int temp2 = (value2/3.3)*4096;
HAL_DAC_SetValue(&hdac1,DAC_CHANNEL_2,DAC_ALIGN_12B_R,temp2);
}