STM32F4----DCA数字量转换成模拟量
基本原理
上一节讲诉了ADC的具体原理与程序搭建https://blog.csdn.net/qq_35970934/article/details/143999874?spm=1001.2014.3001.5501。这节讲DAC的原理和程序,在实际应用中,我们经常需要调节电压的输出大小,这种调节通常是通过改变输入控制量的大小来实现的,这就需要使用到DAC(数字—模拟转换器)功能,它允许将数字信号转换为模拟电压输出。例如,假设有一个可以调节亮度的LED灯,可通过滑动条(滑动条的位置可以被表示为一个0—100的数字)输入一个值来调节LED灯的亮度,这个输入值就是一个数字信号,而输出的模拟信号即LED灯的电压。
STM32F4内置的DAC简介。
1)DAC转换器:STM32F4拥有两个DAC转换器,每个转换器对应一个输出通道。这使得微控制器能够同时输出两路模拟信号,适用于需要多个模拟输出的应用场景。
2)输出分辨率:该模块支持8位或12位的单调输出。在12位模式下,数据可以左对齐或右对齐,提供更灵活的数据格式配置。
3)同步更新与波形生成:具备同步更新功能,可以同时更新两个DAC通道的输出。此外,还有噪声波形和三角波形生成的功能,这对于需要特定波形输出的应用非常有用。
4)DMA功能:每个DAC通道都有直接内存访问(DMA)功能。这意味着可以在不占用CPU资源的情况下,实现数据的高效传输。
5)外部触发转换:支持外部触发转换,允许外部事件控制DAC输出的时机,适合需要精确控制模拟输出时机的应用。
6)引脚配置:DAC输出通常使用GPIO的复用功能,对于STM32F4DAC来说,输出引脚一般为PA4和PA5。在使用DAC功能时,这些引脚会自动连接到模拟转换器输出。
7)电源供应:DAC模块有专门的模拟供电VDDA和VSSA,以及参考电压Vref+。正确配置供电对于确保DAC输出精度和稳定性非常关键。
总的来说,DAC功能是一个非常实用的工具,它可以将数字信号转换为模拟信号,从而实现对电压输出的精确调节。
接下来介绍具体编程步骤
步骤一:结构体介绍
//ADC初始化结构体
typedef struct
{
uint32_t DAC_Trigger; // 定义一个32位无符号整数变量,用于存储DAC触发器的配置
uint32_t DAC_WaveGeneration; // 定义一个32位无符号整数变量,用于存储DAC波形生成的配置
uint32_t DAC_LFSRUnmask_TriangleAmplitude; // 定义一个32位无符号整数变量,用于存储DAC线性反馈移位寄存器(LFSR)的三角波幅度配置
uint32_t DAC_OutputBuffer; // 定义一个32位无符号整数变量,用于存储DAC输出缓冲区的配置
}ADC_InitTypeDef;
步骤二:DCA程序配置
//DCA初始化配置
//程序包领取需加qq
// 3182068342
void DAC_ControlIO_Init(void)
{
}
//设置DAC输出值value0-3300
//程序包领取需加qq
// 3182068342
float DAC_SetValue(float value)
{
}
步骤三:主程序
//程序包领取需加qq
// 3182068342
int main(void)
{
float Adc_value;
float value;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断分组
LED_Init(); //初始化LED
usart1_Init(); //初始化USART1外设
KEY_Init(); //初始化按键输入功能
ADC_ControlIO_Init(); //初始化ADC控制IO
DAC_ControlIO_Init(); //初始化DAC控制IO
while(1)
{
scanf("%f",&value); //来自上位机数据
DAC_SetChannel1Data(DAC_Align_12b_R,DAC_SetValue(value)); //将value值转化为电压值后发送至DAC通道1输出
Adc_value = Average_ADC(10); //读取ADC平均值
printf("%.3f\r\n",Adc_value);
delay_ms(10);
}
}