找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 698|回复: 2
打印 上一主题 下一主题
收起左侧

求教N32G45X单片机DAC+TIM+DAM生成正弦波频率不准

[复制链接]
跳转到指定楼层
楼主
ID:1066092 发表于 2023-3-11 13:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
参考网上ST的例子,在注释掉TIM_TrgoInit里的TIM2或者TIM4,只使用DAC1在PA4上能得到正确的56.25K或者只使用DAC2在PA5上也能得到正确的102.27K正弦波出来,但是只要将同时使用TIM2和TIM4让DAC1和DAC2同时输出正弦波,那么PA4还是正确的56.25K波,而PA5就只有80K多点跳动范围大,而且也不是正确的102.27K,求问帮忙指点指点下面是哪里不正确搞成这样的错误结果?
另外还有个问题是输出电压峰峰值不是3.3V,官方例子出来的电压是约1.6V,输出频率不一样电压峰峰值也会不一样,我这频率大概是2.7V,这又是为什么?按说打点是0~4095那么输出电压基本应该就是基准上的0~3.3V这样,实际上怎么差那么远还随频率的变化电压还不同,奇了怪了。

单片机源程序如下:
  1. #include "n32g45x.h"

  2. /** @addtogroup DAC_DualModeDMA_SineWave
  3. * @{
  4. */

  5. //#define DAC_DHR12RD_Address 0x40007420
  6. #define DAC_DR12CH1_Address 0x40007408
  7. #define DAC_DR12CH2_Address 0x40007414

  8. /* Init Structure definition */
  9. DAC_InitType DAC_InitStructure;
  10. uint32_t Idx = 0;

  11. const uint16_t Sine12bit[32] = {2047, 2447, 2831, 3185, 3498, 3750, 3939, 4056, 4095, 4056, 3939,
  12.                                 3750, 3495, 3185, 2831, 2447, 2047, 1647, 1263, 909,  599,  344,
  13.                                 155,  38,   0,    38,   155,  344,  599,  909,  1263, 1647};

  14. uint32_t DualSine12bit[32];

  15. void RCC_Configuration(void);
  16. void GPIO_Configuration(void);
  17. void TIM_TrgoInit(void);
  18. void DAC_SineWaveInit(void);
  19. void DMA_Config(void);

  20. /**
  21. * @brief   Main program.
  22. */
  23. int main(void)
  24. {

  25.     GPIO_Configuration();
  26.     TIM_TrgoInit();
  27.     DAC_SineWaveInit();

  28.     /* Fill Sine32bit table */
  29. //    for (Idx = 0; Idx < 32; Idx++)
  30. //    {
  31. //        DualSine12bit[Idx] = (Sine12bit[Idx] << 16) + (Sine12bit[Idx]);
  32. //    }
  33.     /* DMA Config */
  34.     DMA_Config();

  35.                 TIM_Enable(TIM2, ENABLE);
  36.                 TIM_Enable(TIM4, ENABLE);
  37.     while (1)
  38.     {
  39.     }
  40. }

  41. /**
  42. * @brief  Configures the different system clocks.
  43. */
  44. void RCC_Configuration(void)
  45. {
  46.     /* DAC Periph clock enable */
  47.     RCC_EnableAPB1PeriphClk(RCC_APB1_PERIPH_DAC, ENABLE);
  48. }

  49. /**
  50. * @brief  Configures the different GPIO ports.
  51. */
  52. void GPIO_Configuration(void)
  53. {
  54.     GPIO_InitType GPIO_InitStructure;

  55.     /* GPIOA Periph clock enable */
  56.     RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOA, ENABLE);
  57.     GPIO_InitStructure.Pin       = GPIO_PIN_4 | GPIO_PIN_5;
  58.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  59.     GPIO_InitPeripheral(GPIOA, &GPIO_InitStructure);
  60. }
  61. /**
  62. * @brief  TIM4 Init.
  63. */
  64. void TIM_TrgoInit(void)
  65. {
  66.     TIM_TimeBaseInitType TIM_TimeBaseStructure;

  67.     /* TIM4 Periph clock enable */
  68.     RCC_EnableAPB1PeriphClk(RCC_APB1_PERIPH_TIM2  , ENABLE); // RCC_APB2_PERIPH_TIM8
  69.                 RCC_EnableAPB1PeriphClk(RCC_APB1_PERIPH_TIM4  , ENABLE);
  70.     TIM_InitTimBaseStruct(&TIM_TimeBaseStructure);
  71.                 TIM_TimeBaseStructure.Period           =39;
  72.     TIM_TimeBaseStructure.Prescaler = 0x0;
  73.     TIM_TimeBaseStructure.ClkDiv    = 0x0;
  74.     TIM_TimeBaseStructure.CntMode   = TIM_CNT_MODE_UP;
  75.                 TIM_InitTimeBase(TIM2, &TIM_TimeBaseStructure);        
  76.         
  77.                 TIM_TimeBaseStructure.Period                =21;
  78.     TIM_TimeBaseStructure.Prescaler = 0x0;
  79.     TIM_TimeBaseStructure.ClkDiv    = 0x0;
  80.     TIM_TimeBaseStructure.CntMode   = TIM_CNT_MODE_UP;
  81.                 TIM_InitTimeBase(TIM4, &TIM_TimeBaseStructure);

  82.                 TIM_SelectOutputTrig(TIM2, TIM_TRGO_SRC_UPDATE);        
  83.                 TIM_SelectOutputTrig(TIM4, TIM_TRGO_SRC_UPDATE);
  84. }
  85. /**
  86. * @brief  DAC SineWave Config.
  87. */
  88. void DAC_SineWaveInit(void)
  89. {
  90.     /* DAC Periph clock enable */
  91.     RCC_EnableAPB1PeriphClk(RCC_APB1_PERIPH_DAC, ENABLE);

  92.                 DAC_InitStructure.Trigger                        = DAC_TRG_T2_TRGO;
  93.     DAC_InitStructure.WaveGen      = DAC_WAVEGEN_NONE;
  94.     DAC_InitStructure.BufferOutput = DAC_BUFFOUTPUT_DISABLE;
  95.                 DAC_Init(DAC_CHANNEL_1, &DAC_InitStructure);
  96.         
  97.                 DAC_InitStructure.Trigger                        = DAC_TRG_T4_TRGO;
  98.     DAC_InitStructure.WaveGen      = DAC_WAVEGEN_NONE;
  99.     DAC_InitStructure.BufferOutput = DAC_BUFFOUTPUT_DISABLE;
  100.                 DAC_Init(DAC_CHANNEL_2, &DAC_InitStructure);

  101.                 DAC_Enable(DAC_CHANNEL_1, ENABLE);
  102.                 DAC_Enable(DAC_CHANNEL_2, ENABLE);

  103.                 DAC_DmaEnable(DAC_CHANNEL_1, ENABLE);
  104.                 DAC_DmaEnable(DAC_CHANNEL_2, ENABLE);
  105.         
  106. }
  107. /**
  108. * @brief  DMA Config.
  109. */
  110. void DMA_Config(void)
  111. {
  112.     DMA_InitType DMA_InitStructure;

  113.     /* DMA2 clock enable */
  114.     RCC_EnableAHBPeriphClk(RCC_AHB_PERIPH_DMA2, ENABLE);

  115. //                DMA_DeInit(DMA2_CH3);
  116.                 DMA_InitStructure.PeriphAddr                = DAC_DR12CH1_Address;
  117.                 DMA_InitStructure.MemAddr                                = (uint32_t)&Sine12bit;
  118.     DMA_InitStructure.Direction      = DMA_DIR_PERIPH_DST;
  119.     DMA_InitStructure.BufSize        = 32;
  120.     DMA_InitStructure.PeriphInc      = DMA_PERIPH_INC_DISABLE;
  121.     DMA_InitStructure.DMA_MemoryInc  = DMA_MEM_INC_ENABLE;
  122.     DMA_InitStructure.PeriphDataSize = DMA_PERIPH_DATA_SIZE_HALFWORD;
  123.     DMA_InitStructure.MemDataSize    = DMA_MemoryDataSize_HalfWord ;
  124.     DMA_InitStructure.CircularMode   = DMA_MODE_CIRCULAR;
  125.     DMA_InitStructure.Priority       = DMA_PRIORITY_HIGH;
  126.     DMA_InitStructure.Mem2Mem        = DMA_M2M_DISABLE;
  127.                 DMA_Init(DMA2_CH3, &DMA_InitStructure);
  128.                 DMA_EnableChannel(DMA2_CH3, ENABLE);

  129. //                DMA_DeInit(DMA2_CH4);
  130.                 DMA_InitStructure.PeriphAddr                =DAC_DR12CH2_Address;
  131.                 DMA_InitStructure.MemAddr                                = (uint32_t)&Sine12bit;
  132.     DMA_InitStructure.Direction      = DMA_DIR_PERIPH_DST;
  133.     DMA_InitStructure.BufSize        = 32;
  134.     DMA_InitStructure.PeriphInc      = DMA_PERIPH_INC_DISABLE;
  135.     DMA_InitStructure.DMA_MemoryInc  = DMA_MEM_INC_ENABLE;
  136.     DMA_InitStructure.PeriphDataSize = DMA_PERIPH_DATA_SIZE_HALFWORD;
  137.     DMA_InitStructure.MemDataSize    = DMA_MemoryDataSize_HalfWord ;
  138.     DMA_InitStructure.CircularMode   = DMA_MODE_CIRCULAR;
  139.     DMA_InitStructure.Priority       = DMA_PRIORITY_HIGH;
  140.     DMA_InitStructure.Mem2Mem        = DMA_M2M_DISABLE;
  141.                 DMA_Init(DMA2_CH4, &DMA_InitStructure);

  142.                 DMA_EnableChannel(DMA2_CH4, ENABLE);
  143.                
  144. }
复制代码

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1066092 发表于 2023-3-13 22:46 | 只看该作者
自己来顶下,卡这里几天了不知道问题在哪里,参考论坛“STM32F103单片机输出两路不同频率的正弦波源程序”对比了下似乎我上面的配置应该是能生成正确频率的正弦波,但是用两个定时器有一个生成的频率就是和实际计算的不同,坛里的兄弟能帮忙看看我这个配置是哪里有问题还是这个芯片配置有特殊地方?先多谢了!
回复

使用道具 举报

板凳
ID:301191 发表于 2023-3-14 00:11 | 只看该作者
顶一下
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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