STM32 —— 多路DAC(输出电压和正弦波)
2017-04-10 10:07
260 查看
//========================================DAC========================================= #define DA_OUT1_CHANNEL DAC_Channel_1 #define DA_OUT1_GRP GPIOA #define DA_OUT1_INDEX GPIO_Pin_4 #define DA_OUT1_HIGH() GPIO_SetBits(DA_OUT1_GRP, DA_OUT1_INDEX) #define DA_OUT1_CONFIG() GPIOConfig(DA_OUT1_GRP, DA_OUT1_INDEX, GPIO_Mode_AIN) #define DA_OUT2_CHANNEL DAC_Channel_2 #define DA_OUT2_GRP GPIOA #define DA_OUT2_INDEX GPIO_Pin_5 #define DA_OUT2_HIGH() GPIO_SetBits(DA_OUT2_GRP, DA_OUT2_INDEX) #define DA_OUT2_CONFIG() GPIOConfig(DA_OUT2_GRP, DA_OUT2_INDEX, GPIO_Mode_AIN)
#ifndef _DAC_H_ #define _DAC_H_ void DAC1Init(void); void DAC1OutVoltage(float data); void DAC2Init(void); #endif /* _DAC_H_ */
#include "dac.h" //#include "target.h" #include "type.h" #define DAC_DHR12RD_ADDRESS 0x40007420 static const uint16_t sin[32] = { 2047, 2447, 2831, 3185, 3498, 3750, 3939, 4056, 4095, 4056, 3939, 3750, 3495, 3185, 2831, 2447, 2047, 1647, 1263, 909, 599, 344, 155, 38, 0, 38, 155, 344, 599, 909, 1263, 1647 }; static uint32_t dual_sin[32]; static uint8_t index = 0; // PA4 static void dac1_clk_init(void) { RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE); } static void dac1_gpio_init(void) { DA_OUT1_CONFIG(); DA_OUT1_HIGH(); } static void dac1_mode_init(void) { DAC_InitTypeDef DAC_InitStructure; DAC_InitStructure.DAC_Trigger = DAC_Trigger_Software; DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None; DAC_InitStructure.DAC_LFSRUnmask_TriangleAmplitude = DAC_LFSRUnmask_Bits11_0; DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Enable; DAC_Init(DA_OUT1_CHANNEL, &DAC_InitStructure); DAC_Cmd(DA_OUT1_CHANNEL, ENABLE); } void DAC1Init(void) { dac1_clk_init(); dac1_gpio_init(); dac1_mode_init(); } // DAC1OutVoltage(1.5);// 1.5V out void DAC1OutVoltage(float data) { uint16_t value; value = (uint16_t)((data / 3.3) * 4096); DAC_SetChannel1Data(DAC_Align_12b_R, value); DAC_SoftwareTriggerCmd(DA_OUT1_CHANNEL, ENABLE); } static void dac2_clk_init(void) { RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8, ENABLE); } static void dac2_gpio_init(void) { DA_OUT2_CONFIG(); DA_OUT2_HIGH(); } static void dac2_timer_init(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_TimeBaseStructInit(&TIM_TimeBaseStructure); TIM_TimeBaseStructure.TIM_Period = 0x19; TIM_TimeBaseStructure.TIM_Prescaler = 0x0; TIM_TimeBaseStructure.TIM_ClockDivision = 0x0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructure); /* TIM8 TRGO selection */ TIM_SelectOutputTrigger(TIM8, TIM_TRGOSource_Update); } static void dac2_mode_init(void) { DAC_InitTypeDef DAC_InitStructure; /* DAC channel2 Configuration */ DAC_InitStructure.DAC_Trigger = DAC_Trigger_T8_TRGO; DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None; DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable; DAC_Init(DA_OUT2_CHANNEL, &DAC_InitStructure); for(index = 0; index < 32; ++index) { dual_sin[index] = (sin[index] << 16) + sin[index]; } } static void dac2_dma_init(void) { DMA_InitTypeDef DMA_InitStructure; /* DMA2 channel4 configuration */ DMA_DeInit(DMA2_Channel4); DMA_InitStructure.DMA_PeripheralBaseAddr = DAC_DHR12RD_ADDRESS; DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&dual_sin; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; DMA_InitStructure.DMA_BufferSize = 32; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word; DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; DMA_InitStructure.DMA_Priority = DMA_Priority_High; DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; DMA_Init(DMA2_Channel4, &DMA_InitStructure); } static void dac2_enable(void) { DMA_Cmd(DMA2_Channel4, ENABLE); DAC_Cmd(DA_OUT2_CHANNEL, ENABLE); DAC_DMACmd(DA_OUT2_CHANNEL, ENABLE); TIM_Cmd(TIM8, ENABLE); } void DAC2Init(void) { dac2_clk_init(); dac2_gpio_init(); dac2_timer_init(); dac2_mode_init(); dac2_dma_init(); dac2_enable(); }
相关文章推荐
- STM32 —— 多路DAC(输出电压和正弦波)
- STM32_DAC输出电压
- STM32 使用DMA+DAC+TIMER输出正弦波
- stm32 DAC+DMA 输出100K正弦波杠杠的!!!
- STM32 双DAC DMA TIM6输出正弦波例子
- STM32之DAC固定电压输出配置
- STM32F0xx_DAC输出电压配置详细过程
- STM32配置DAC输出固定电压和方波
- STM32F0xx_DAC输出电压配置详细过程
- 【iCore4 双核心板_ARM】例程三十六:DAC实验——输出直流电压
- STM32实现DAC输出的相关设置
- 利用c语言编程在stm32上输出信号控制电压放大与滤波系统和显示功能
- 消除多路复用DAC的输出错误
- (STM32)使用DAC输出WAVE音频波形
- DMA+DAC+TIMER输出正弦波 自己验证
- STM32_DAC输出三角波形
- 【iCore1S 双核心板_ARM】例程九:DAC实验——输出直流电压
- STM32 DAC输出,引脚设置成模拟输入
- stm32 DAC输出音频
- 使用PWM得到精密的输出电压