STM32F103DAC功能实现

x33g5p2x  于2021-10-09 转载在 其他  
字(2.1k)|赞(0)|评价(0)|浏览(572)

所谓的DAC功能也就是将数字信号转换为模拟信号,一般情况下使用比较多的就是ADC功能,也就是将模拟信号转换为数字信号,多用于读取传感器的值。但是有时候需要控制某些传感器,需要用模拟信号控制,这就需要将数字信号转换为模拟信号了。

数字/模拟转换模块(DAC)是12位数字输入,电压输出的数字/模拟转换器。
或12位模式,也可以与DMA控制器配合使用。DAC工作在12位模式时,数据可以设置成左对齐
或右对齐。DAC模块有2个输出通道,每个通道都有单独的转换器。在双DAC模式下,2个通道
可以独立地进行转换,也可以同时进行转换并同步地更新2个通道的输出。DAC可以通过引脚输
入参考电压V REF+ 以获得更精确的转换结果。

DAC 主要特征

  • 2个DAC转换器:每个转换器对应1个输出通道
  • 8位或者12位单调输出
  • 12位模式下数据左对齐或者右对齐
  • 同步更新功能
  • 噪声波形生成
  • 三角波形生成
  • 双DAC通道同时或者分别转换
  • 每个通道都有DMA功能
  • 外部触发转换
  • 输入参考电压V REF+

下面就通过代码来实现模拟信号输出。

#include "dac.h"

void DAC1_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    DAC_InitTypeDef DAC_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC , ENABLE);

    //PA4设置为为模拟输入,使能DAC通道后,PA4会与DAC模拟输出相连,设置为输入为了避免了干扰
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;								//设置为模拟输入
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    DAC_InitStructure.DAC_Trigger = DAC_Trigger_None; 							//不使用触发功能 TEN1=0
    DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None; 			//不使用波形发生
    DAC_InitStructure.DAC_LFSRUnmask_TriangleAmplitude = DAC_LFSRUnmask_Bit0; 	//屏蔽、幅值设置
    DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable;				//DAC1输出缓存关闭
    DAC_Init(DAC_Channel_1, &DAC_InitStructure); 								//初始化DAC通道1

    DAC_Cmd(DAC_Channel_1, ENABLE); 											//使能DAC1
    DAC_SetChannel1Data(DAC_Align_12b_R, 0); 									//12位右对齐数据格式设置DAC值
	
}
//设置通道1输出电压
//vol:0--3300,代表0-3.3V
void DAC1_Set_Vol(u16 vol)
{
    float temp = vol;
    temp /= 1000;
    temp = temp * 4096 / 3.3;

    DAC_SetChannel1Data(DAC_Align_12b_R, temp);
}

在初始化的时候,要注意一个问题,STM32F103单片机的DAC输出通道有两个。

PA4和PA5,但是在初始化引脚的时候,要将PA4和PA5初始化为模拟输入功能。这个在官方文档上也有说明。

内部自动就会将PA4和PA5与模拟输出引脚连接起来。所以在初始化的时候,虽然用的是输出功能,但是还是要将引脚设置为输入。

初始化引脚之后,接下来初始化DAC功能,在这里不使用触发功能,也不使用波形发生功能。直接通过软件来控制

接下里通过一个函数将要输出的电压值换算为寄存器的设置值。DAC的转换为12位,所以最大值就是2^12,也就是4096,而stm32单片机的供电电压值3.3V,所以将要设置的电压值除以3.3,然后乘以4096就是DAC寄存器需要设置的值。

如果要输出模拟电压值时,只需要在主函数中调用DAC1_Set_Vol()函数,并将要设置的电压值传递给这个函数就行了。

int main(void)
{
    u16 adcx;
    float temp;
    u8 t = 0;
    u16 dacval = 0;
    u8 key;

    delay_init();
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    uart_init(115200);
    LED_Init();
    DAC1_Init();    
    while(1)
    {
        LED0 = !LED0;
        DAC1_Set_Vol(1000);
        delay_ms(100);
    }
}

在主函数中设置DAC输出的电压值为1000,也就是1V。这时通过万用表就可以在stm32单片机的PA4引脚量到1V的电压值了。

相关文章