STM32单片机(八). ADC、DAC和DMA数据传输 |
您所在的位置:网站首页 › 传输数据是什么意思 › STM32单片机(八). ADC、DAC和DMA数据传输 |
对于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通道的模块框图如下所示: 使用库函数对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); #endifdac.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 |