OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3934|回复: 3

STM32的DAC输出正弦波问题,求大佬指导

[复制链接]

2

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2019-4-8
在线时间
16 小时
发表于 2020-8-24 11:59:57 | 显示全部楼层 |阅读模式
10金钱
我用STM32的DAC输出一个如下图所示的正弦波,为何在最高点时会突然跌落,代码如下,请求大佬指导,谢谢啦
正弦输出函数
#include "bsp_dac.h"

#define POINT_NUM 256

const uint16_t Sine12bit[POINT_NUM] = {
        2148,2198,2248,2298,2347,2395,2443,2490,2536,2580,2624,2667,2708,2747,2785,2822,2856,2880,2920,2949,2976,3001,3023,3044,3062,
        3078,3091,3102,3111,3111,3111,3111,3111,3111,3111,3102,3091,3078,3062,3044,3023,3001,2976,2949,2920,2889,2856,2822,2785,2747,
        2708,2667,2624,2580,2536,2490,2443,2395,2347,2298,2248,2198,2148,2098,2048,1997,1947,1898,1849,1800,1753,1706,1660,1615,1571,
        1529,1488,1448,1410,1374,1339,1306,1275,1246,1219,1195,1172,1152,1134,1118,1104,1093,1085,1079,1075,1074,1075,1079,1085,1093,
        1104,1118,1134,1152,1172,1195,1219,1246,1275,1306,1339,1374,1410,1448,1488,1529,1571,1615,1660,1706,1753,1800,1849,1898,1947,
        1997,2048,2098,
        2148,2249,2349,2448,2546,2643,2738,2832,2924,3013,3101,3186,3268,3347,3423,3496,3565,3631,3693,3751,3805,3854,3899,3940,3976,
        4008,4035,4057,4074,4074,4074,4074,4074,4074,4074,4057,4035,4008,3976,3940,3899,3854,3805,3751,3693,3631,3565,3496,3423,3347,
        3268,3186,3101,3013,2924,2832,2738,2643,2546,2448,2349,2249,2148,2048,1948,1847,1747,1648,1550,1453,1358,1264,1172,1083,995,
        910,828,749,673,600,531,465,403,345,291,242,197,156,120,88,61,39,22,10,2,0,2,10,22,39,61,88,120,156,197,242,291,345,403,465,
        531,600,673,749,828,910,995,1083,1172,1264,1358,1453,1550,1648,1747,1847,1948,2048
};
uint32_t DualSine12bit[POINT_NUM];


/**
  * @brief  ê1ÄüDACμÄê±Öó£¬3õê¼»ˉGPIO
  * @param  ÎT
  * @retval ÎT
  */
static void DAC_Config(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
        DAC_InitTypeDef  DAC_InitStructure;

  /* ê1ÄüGPIOAê±Öó */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);      
      
        /* ê1ÄüDACê±Öó */      
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);
      
  /* DACμÄGPIOÅäÖã¬Ä£Äaêäèë */
  GPIO_InitStructure.GPIO_Pin =    GPIO_Pin_4|GPIO_Pin_5;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
      


  /* ÅäÖÃDAC í¨μà1 */
  DAC_InitStructure.DAC_Trigger = DAC_Trigger_T2_TRGO;                                                //ê1óÃTIM2×÷Îa′¥·¢Ô′
  DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None;        //2»ê1óÃ2¨Dη¢éúÆ÷
  DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable;        //2»ê1óÃDACêä3ö»o3å
  DAC_Init(DAC_Channel_1, &DAC_InitStructure);

  /* ÅäÖÃDAC í¨μà2 */
  DAC_Init(DAC_Channel_2, &DAC_InitStructure);

  /* ê1Äüí¨μà1 óéPA4êä3ö */
  DAC_Cmd(DAC_Channel_1, ENABLE);
  /* ê1Äüí¨μà2 óéPA5êä3ö */
  DAC_Cmd(DAC_Channel_2, ENABLE);

  /* ê1ÄüDACμÄDMAÇëÇó */
  DAC_DMACmd(DAC_Channel_2, ENABLE);
}


/**
  * @brief  ÅäÖÃTIM
  * @param  ÎT
  * @retval ÎT
  */
static void DAC_TIM_Config(void)
{
      
        TIM_TimeBaseInitTypeDef    TIM_TimeBaseStructure;
      
        /* ê1ÄüTIM2ê±Öó£¬TIM2CLK Îa72M */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
      
  /* TIM2»ù±¾¶¨ê±Æ÷ÅäÖà */
// TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
  TIM_TimeBaseStructure.TIM_Period = (280-1);                                                                               //¶¨ê±ÖüÆú 20  
  TIM_TimeBaseStructure.TIM_Prescaler = 0x0;                                                               //Ô¤·ÖÆμ£¬2»·ÖÆμ 72M / (0+1) = 72M
  TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;                                                    //ê±Öó·ÖÆμÏμêy
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;          //ÏòéϼÆêyÄ£ê½
  TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

  /* ÅäÖÃTIM2′¥·¢Ô′ */
  TIM_SelectOutputTrigger(TIM2, TIM_TRGOSource_Update);

        /* ê1ÄüTIM2 */
  TIM_Cmd(TIM2, ENABLE);

}

/**
  * @brief  ÅäÖÃDMA
  * @param  ÎT
  * @retval ÎT
  */
static void DAC_DMA_Config(void)
{      
        DMA_InitTypeDef  DMA_InitStructure;

        /* ê1ÄüDMA2ê±Öó */
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE);
      
        /* ÅäÖÃDMA2 */
  DMA_InitStructure.DMA_PeripheralBaseAddr = DAC_DHR12RD_ADDRESS;                                        //íaéèêy¾YμØÖ·
  DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&DualSine12bit ;                                //Äú′æêy¾YμØÖ· DualSine12bit
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;                                                                                        //êy¾Y′«êä·½ÏòÄú′æÖáíaéè
  DMA_InitStructure.DMA_BufferSize = POINT_NUM;                                                                                                                //»o′æ′óD¡ÎaPOINT_NUM×Ö½ú      
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;                                //íaéèêy¾YμØÖ·1춨      
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;                                                                        //Äú′æêy¾YμØÖ·×ÔÔö
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;        //íaéèêy¾YòÔ×ÖÎaμ¥λ
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;                                        //Äú′æêy¾YòÔ×ÖÎaμ¥λ      
  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;                                                                                                        //Ñ-»·Ä£ê½
  DMA_InitStructure.DMA_Priority = DMA_Priority_High;                                                                                        //¸ßDMAí¨μàóÅÏè¼¶
  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;                                                                                                                //·ÇÄú′æÖáÄú′æÄ£ê½      

  DMA_Init(DMA2_Channel4, &DMA_InitStructure);
      
  /* ê1ÄüDMA2-14í¨μà */
  DMA_Cmd(DMA2_Channel4, ENABLE);
}


/**
  * @brief  DAC3õê¼»ˉoˉêy
  * @param  ÎT
  * @retval ÎT
  */
void DAC_Mode_Init(void)
{
        uint32_t Idx = 0;  

        DAC_Config();
        DAC_TIM_Config();      
      
        /* ìî3äÕyÏò2¨DÎêy¾Y£¬Ë«í¨μàóò¶ÔÆë*/
  for (Idx = 0; Idx < POINT_NUM; Idx++)
  {
    DualSine12bit[Idx] = (Sine12bit[Idx]<<16) +Sine12bit[Idx];
  }
      
        DAC_DMA_Config();
}



DAC输出波形如图所示

13fde984f72ae3004c1ca4235e083f6.jpg
微信图片编辑_20200824115923.jpg
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2020-8-25 01:38:46 | 显示全部楼层
参考下论坛其他网友的例程
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

0

主题

6

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2020-2-26
在线时间
5 小时
发表于 2020-9-1 18:31:08 | 显示全部楼层
哥,你的程序改好没有
回复

使用道具 举报

0

主题

6

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2020-2-26
在线时间
5 小时
发表于 2020-9-1 18:31:35 | 显示全部楼层
哥,你的程序改好没有,我现在也在写这个没有头绪,求指导
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-17 08:29

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表