【STM32嵌入式系统设计与开发】 您所在的位置:网站首页 单片机dac输出正弦波原理 【STM32嵌入式系统设计与开发】

【STM32嵌入式系统设计与开发】

2024-07-18 04:21| 来源: 网络整理| 查看: 265

这里写目录标题 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、工程测试

在这里插入图片描述



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

      专题文章
        CopyRight 2018-2019 实验室设备网 版权所有