【STM32嵌入式系统设计与开发】- 18DAC输出应用

这里写目录标题

  • STM32资料包: 百度网盘下载链接:链接:https://pan.baidu.com/s/1mWx9Asaipk-2z9HY17wYXQ?pwd=8888 提取码:8888
  • 一、任务描述
  • 二、任务实施
  • 1、工程文件夹创建
  • 2、函数编辑
  • (1)主函数编辑
  • (2)ADC初始化函数(T_Adc_Init())
  • (3)设置通道1输出电压函数(Dac1_Set_Vol())
  • 3、头文件添加
  • 4、头文件编辑
  • 4、知识链接
  • (1)内部温度工作原理
  • (2)编写步骤
  • 5、工程测试

  • STM32资料包:
    百度网盘下载链接:链接:https://pan.baidu.com/s/1mWx9Asaipk-2z9HY17wYXQ?pwd=8888
    提取码:8888

    一、任务描述

    二、任务实施

    观察电路图:
    PA4(stm32核心板) ————————> D1
    使用STM32控制DAC输出实现呼吸灯效果需要配置DAC通道和定时器。调整DAC输出值,在定时器中断或循环中实现LED亮度的渐变,模拟呼吸灯效果。调整步进和定时器频率可控制呼吸灯速度和平滑度。最终将更新的DAC值应用到通道,控制LED亮度

    1、工程文件夹创建

    步骤1:复制工程模板“1_Template”重命名为“14_ADC”。

    步骤2:修改项目工程名,先删除projects文件夹内除了Template.uvprojx文件外的所有内容并修改为“DAC.uvprojx”。并删除output/obj和output/lst中的所有文件。

    步骤3:运行“PassiveBeep.uvprojx”打开目标选项“Options for Target”中的“Output”输出文件,并修改可执行文件名称为“DAC”点击“OK”保存设置。最后点击“Rebuild”编译该工程生成Usart文件。

    步骤4:复制2_LEDTest中的"1_LED"的“led”文件复制到hardware中

    步骤5:在system文件夹中新建一个dac文件夹并在该文件夹下新建dac.c和dac.h两个文件

    步骤6:工程组文件中添加“dac”文件夹内的所有文件

    步骤7:工程组文件中添加“led”文件夹内的所有文件

    步骤6:目标选项添加添加头文件路径。

    2、函数编辑

    (1)主函数编辑

    实现一个控制DAC输出的功能,根据条件逐步调整 dacval 的值,以模拟呼吸灯效果或类似的动态模拟信号输出
    请添加图片描述
    步骤2:循环函数编写

    	while(1)
    	{	 	
        delay_ms(100);                // 延时100毫秒
    		
        if ((dacval == 4000) && (!j)) // 如果dacval等于4000且j为假(0)
            j = 1;
        else if (j)                   // 否则如果j为真(1)
        {
            if (dacval == 200)        // 如果dacval等于200
                j = 0;                // 将j置为假(0)
            else 
                dacval -= 200;        // 否则减少dacval的值200
        }
        else                          // 否则(dacval不等于4000且j为假)
            dacval += 200;            // 增加dacval的值200
    		
        DAC_SetChannel1Data(DAC_Align_12b_R, dacval); // (12位右对齐格式)
    	}	
    

    (2)ADC初始化函数(T_Adc_Init())

    步骤1:初始化DAC

    /*********************************************************************
     @Function  : 初始化DAC
     @Parameter : N/A
     @Return    : N/A
    **********************************************************************/
    void Dac1_Init(void)
    {  
        GPIO_InitTypeDef GPIO_InitStructure;
        DAC_InitTypeDef DAC_InitType;
    	
        /* 使能GPIOA和DAC时钟 */
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);
    	
        /* 配置GPIO引脚 */
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;	      // 设置引脚4(PA4)为要配置的引脚
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;     // 设置为模拟输入模式
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 设置引脚速度为50MHz
        GPIO_Init(GPIOA, &GPIO_InitStructure);            // 初始化GPIOA的引脚配置为AIN模式
        GPIO_SetBits(GPIOA, GPIO_Pin_4);                  // 设置GPIOA的引脚4为高电平
    	
        /* 配置DAC */
        DAC_InitType.DAC_Trigger = DAC_Trigger_None;                         // 不使用触发功能 (TEN1 = 0)
        DAC_InitType.DAC_WaveGeneration = DAC_WaveGeneration_None;           // 不使用波形发生
        DAC_InitType.DAC_LFSRUnmask_TriangleAmplitude = DAC_LFSRUnmask_Bit0; // 屏蔽、幅值设置
        DAC_InitType.DAC_OutputBuffer = DAC_OutputBuffer_Disable;            // 关闭DAC1输出缓存 (BOFF1 = 1)
        DAC_Init(DAC_Channel_1, &DAC_InitType);
    	
        /* 使能DAC通道 */
        DAC_Cmd(DAC_Channel_1, ENABLE);
    		
        /* 设置DAC通道1的数据值为0(12位右对齐格式)*/
        DAC_SetChannel1Data(DAC_Align_12b_R, 0);
    }
    
    

    (3)设置通道1输出电压函数(Dac1_Set_Vol())

    /*********************************************************************
     @Function  : 设置通道1输出电压
     @Parameter : vol : 输出电压值
     @Return    : N/A
     @Read : vol范围:0~3300,代表0~3.3V
    **********************************************************************/
    void Dac1_Set_Vol(uint16_t vol)
    {
    	float temp=vol;
    	temp/=1000;
    	temp=temp*4096/3.3;
    	DAC_SetChannel1Data(DAC_Align_12b_R,temp);//12位右对齐数据格式设置DAC值
    }
    

    3、头文件添加

    步骤1:dac所需头文件添加

    #include ".\dac\dac.h"
    #include "stm32f10x_gpio.h"
    #include "stm32f10x_rcc.h"
    #include "stm32f10x_dac.h"
    

    4、头文件编辑

    //bord.h
    #ifndef __BORD_H_
    #define __BORD_H_
    #include "system_config.h"
    #include "stm32f10x_dac.h"
    
    //头文件包含
    /*************SYSTEM*****************/
    /*#include ".\sys\sys.h"*/
    #include ".\delay\delay.h"
    #include ".\usart\usart.h"
    #include ".\timer\timer.h"
    #include ".\dac\dac.h"
    
    /***********Hardweare***************/
    #include "led.h"
    
     
    
    /***********Funlibrary***************/
    
    
    
    
    
    #endif
    
    


    步骤2:主函数添加函数的声明

    #include "main.c"
    
    /*********************************************************************
     @Function  : 程序入口
     @Parameter : N/A
     @Return    : N/A
    **********************************************************************/
    int main(void)
    { 
    	uint8_t j=0;
    	uint16_t dacval=200;
    	delay_init(); //启动滴答定时器
      usart1_init(9600); //USART1初始化
    	SystemTinerInit(1000-1,3600-1); //系统时间初始化 定时100ms
    	ExpLEDInit();
      Dac1_Init();//DAC初始化
    	delay_ms(500);
    	DAC_SetChannel1Data(DAC_Align_12b_R,0);//初始值为0	
    	
    
    	printf("初始化成功!\r\n");
    	
    	while(1)
    	{	 	
        delay_ms(100);                // 延时100毫秒
    		
        if ((dacval == 4000) && (!j)) // 如果dacval等于4000且j为假(0)
            j = 1;
        else if (j)                   // 否则如果j为真(1)
        {
            if (dacval == 200)        // 如果dacval等于200
                j = 0;                // 将j置为假(0)
            else 
                dacval -= 200;        // 否则减少dacval的值200
        }
        else                          // 否则(dacval不等于4000且j为假)
            dacval += 200;            // 增加dacval的值200
    		
        DAC_SetChannel1Data(DAC_Align_12b_R, dacval); // (12位右对齐格式)
    	}	
    }
    
    
    

    步骤2:添加STM32Temper的头文件

    //STM32Temper.h
    #ifndef __STM32TEMPER_H
    #define __STM32TEMPER_H
    #include "stdint.h"
    
    short Get_Temperature(void)	;
    
    #endif
    

    4、知识链接

    (1)内部温度工作原理

    STM32内部温度传感器在芯片内部与ADCx_IN16输入通道相连接,此通道把传感器输出的电压转换成数字值,继而换算成温度值。因此,我们只需设置一下内部ADC,并激活其内部通道就可以了。

    (2)编写步骤

    1、配置ADC
    2、获取某个通道值
    3、内部温度传感器的值计算

    5、工程测试

    作者:iot鑫鹏

    物联沃分享整理
    物联沃-IOTWORD物联网 » 【STM32嵌入式系统设计与开发】- 18DAC输出应用

    发表回复