求大神指点!!STM32F407用DAC输出正弦波的问题

2019-07-20 05:34发布

各位大神,小弟新人一枚。最近在用DAC调正弦波的时候,在示波器上看到的波形是这样的: 示波器波形 示波器波形 但是我看网上例程上的波形是这样的(黄 {MOD}波形): 标准波形 标准波形   找了很久不知道是啥原因,请大神们多多指教,小弟感激不尽
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
19条回答
王木土哈哈哈
2019-07-20 10:39
本帖最后由 王木土哈哈哈 于 2016-3-6 15:42 编辑

#include "dac.h"
#include "sys.h"

#define DAC_DHR12R1  0x40007420 //DAC通道1输出寄存器地址

const uint16_t Sine12bit[32]={
2448,2832,3186,3496,3751,3940,4057,4096,4057,3940,
3751,3496,3186,2832,2448,2048,1648,1264,910,600,
345,156,39,0,39,156,345,600,910,1264,1648,2048
};

uint32_t DualSine12bit[32];

static void DAC_Config(void)//使能DAC时钟,初始化GPIO
{
        GPIO_InitTypeDef GPIO_InitStruct;
        DAC_InitTypeDef   DAC_InitStruct;
       
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC,ENABLE);
       
        GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AN;//模拟输入
        GPIO_InitStruct.GPIO_Pin=GPIO_Pin_4;
        GPIO_InitStruct.GPIO_PuPd=GPIO_PuPd_DOWN;
        GPIO_Init(GPIOA,&GPIO_InitStruct);//初始化GPIO
       
        DAC_InitStruct.DAC_OutputBuffer=DAC_OutputBuffer_Disable;//不使用DAC输出缓存
        DAC_InitStruct.DAC_Trigger=DAC_Trigger_T2_TRGO;//使用定时器2作为触发源
        DAC_InitStruct.DAC_WaveGeneration=DAC_WaveGeneration_None;//不使用波形发生器
        DAC_Init(DAC_Channel_1,&DAC_InitStruct);//初始化DAC1
       
        DAC_Cmd(DAC_Channel_1,ENABLE);//使能DAC通道1
       
        DAC_DMACmd(DAC_Channel_1,ENABLE);//使能DAC的DMA请求
}

static void DAC_TIM_Config(void)//配置定时器
{
        TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
       
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
       
        TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;
        TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;//向上计数
        TIM_TimeBaseInitStruct.TIM_Period=19;//自动重装载值19,定时周期20
        TIM_TimeBaseInitStruct.TIM_Prescaler=0x0;//预分频,不分频84M/(0+1)=84M
        TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStruct);//定时器初始化配置
       
        TIM_SelectOutputTrigger(TIM2,TIM_TRGOSource_Update);//配置TIM2触发源
       
        TIM_Cmd(TIM2,ENABLE);//使能TIM2时钟

}

static void DAC_DMA_Config(void)//配置DMA
{
        DMA_InitTypeDef DMA_InitStruct;
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2,ENABLE);
       
        DMA_InitStruct.DMA_BufferSize=32;//缓存大小为32字节
        DMA_InitStruct.DMA_Channel=DMA_Channel_4;//DMA通道4
        DMA_InitStruct.DMA_DIR=DMA_DIR_MemoryToPeripheral;//方向为存储器到外设
        DMA_InitStruct.DMA_FIFOMode=DMA_FIFOMode_Disable;//关闭双缓冲模式
        DMA_InitStruct.DMA_Memory0BaseAddr=(uint32_t)&DualSine12bit;//存储器数据地址DualSine12bit
        DMA_InitStruct.DMA_MemoryDataSize=DMA_MemoryDataSize_Word;//存储器数据以字为单位
        DMA_InitStruct.DMA_MemoryInc=DMA_MemoryInc_Enable;//存储器地址自增
        DMA_InitStruct.DMA_Mode=DMA_Mode_Circular;//DMA循环模式
        DMA_InitStruct.DMA_PeripheralBaseAddr=DAC_DHR12R1;//外设地址基地址为DAC通道1数据寄存器地址
        DMA_InitStruct.DMA_PeripheralDataSize=DMA_PeripheralDataSize_Word;//外设数据以字为单位
        DMA_InitStruct.DMA_PeripheralInc=DMA_PeripheralInc_Disable;//外设地址不自增
        DMA_InitStruct.DMA_Priority=DMA_Priority_High;//高DMA通道优先级
        DMA_Init(DMA2_Stream7,&DMA_InitStruct);//初始化DMA
       
        DMA_Cmd(DMA2_Stream7,ENABLE);//使能DMA数据流7

}
void MYDAC_Init(void)
{
        DAC_Config();
        DAC_TIM_Config();
        DAC_DMA_Config();

}

一周热门 更多>