STM32单片机(八). ADC、DAC和DMA数据传输

您所在的位置:网站首页 传输数据是什么意思 STM32单片机(八). ADC、DAC和DMA数据传输

STM32单片机(八). ADC、DAC和DMA数据传输

2024-07-13 05:11| 来源: 网络整理| 查看: 265

对于STM32的ADC模数转换器的介绍以及配置在文章《STM32单片机(六). 传感器的使用》中已经详细介绍,在本章节中主要介绍DAC数模转换器以及DMA的使用。

1、DAC转换 1.1 数模转换器的介绍

DAC(Digital to analog converter),数字模拟转换器,可以将数字信号转换为模拟信号。DAC可以输出电压模拟信号,用来去驱动其它器件。STM32F1中的DAC模块是由12位电压输出数模转换器,可以配置为8位或12位模式,也可以与DMA控制器配合使用。在12位模式下,数据可使用左对齐或右对齐方式;8位模式下,数据只有右对齐方式。DAC含有两个输出通道,每个通道各对应一个转换器。在双通道模式下,每个通道可进行单独的转换;当两个通道组合在一起同步执行更新操作时,也可同时进行转换。DAC可通过输入参考电压引脚VREF+来提高转换后的数据精度,对于DAC通道的模块框图如下所示: 在这里插入图片描述

1.2 DAC的配置步骤

使用库函数对DAC进行配置需要使用到库文件stm32f10x_dac.h和stm32f10x_dac.c,详细的步骤如下:

1、 使能端口及DAC时钟,设置引脚为模拟输入模式; 在STM32F103中DAC两个通道对应的是PA4和PA5引脚,因此需要使能GPIOA以及DAC时钟,DAC是挂载在APB1总线上的设备,GPIOA是挂载在APB2总线上的设备。调用函数:RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能GPIOA时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);//使DA时钟

2、 初始化DAC,设置DAC工作模式; 调用函数:void DAC_Init(uint32_t DAC_Channel, DAC_InitTypeDef* DAC_InitStruct); 第一个参数选取DAC通道(DAC_Channelx),第二个参数结构体DAC_InitTypeDef的成员变量如下:

typedef struct { uint32_t DAC_Trigger; //DAC触发选择 uint32_t DAC_WaveGeneration; //DAC波形发生 uint32_t DAC_LFSRUnmask_TriangleAmplitude; //屏蔽/幅值选择器 uint32_t DAC_OutputBuffer; //DAC输出缓存 }DAC_InitTypeDef;

3、 使能DAC输出通道; 调用函数:void DAC_Cmd(uint32_t DAC_Channel, FunctionalState NewState); 4、 设置DAC输出值; 在使用12位数据右对齐的工作模式下,通过设置DHR12R1就可已在DAC输出引脚得到不同的电压值,调用函数:DAC_SetChannel1Data(DAC_Align_12b_R, 0); 读取DAC对应通道最后一次转换值调用函数:uint16_t DAC_GetDataOutputValue(uint32_t DAC_Channel);

1.3 应用示例

STM32使用按键控制DAC输出电压的大小,并将该数据通过串口输出,详细的代码模块如下: dac.h

#ifndef _dac_H #define _dac_H #include "system.h" void DAC1_Init(void); #endif

dac.c

#include "dac.h" void DAC1_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; DAC_InitTypeDef DAC_InitStruct; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC,ENABLE); GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN; GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOA,&GPIO_InitStructure); DAC_InitStruct.DAC_Trigger=DAC_Trigger_None; //不使用触发 DAC_InitStruct.DAC_WaveGeneration=DAC_WaveGeneration_None; //不使用波形输出 DAC_InitStruct.DAC_LFSRUnmask_TriangleAmplitude=DAC_LFSRUnmask_Bit0; DAC_InitStruct.DAC_OutputBuffer=DAC_OutputBuffer_Disable; //关闭输出缓存 DAC_Init(DAC_Channel_1,&DAC_InitStruct); DAC_Cmd(DAC_Channel_1, ENABLE); DAC_SetChannel1Data(DAC_Align_12b_R,0); //初始电压值设置为0 }

main.c

#include "system.h" #include "led.h" #include "SysTick.h" #include "usart.h" #include "key.h" #include "dac.h" int main() { u8 i=0; u8 key; u16 dacVal; u16 dac_value; float U; SysTick_Init(72); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); LED_Init(); USART1_Init(9600); DAC1_Init(); KEY_Init(); while(1) { key=KEY_Scan(0); if(key==KEY_UP) { dacVal+=400; if(dacVal>=4095) { dacVal=4095; } DAC_SetChannel1Data(DAC_Align_12b_R,dacVal); //更新电压 } else if(key==KEY_DOWN) { dacVal-=400; if(dacVal


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3