OpenEdv-开源电子网

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

关于TIM控制DAC产生正弦波(DMA)

[复制链接]

6

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
173
金钱
173
注册时间
2020-6-7
在线时间
67 小时
发表于 2020-9-9 10:52:10 | 显示全部楼层 |阅读模式
5金钱
想实现频率可调的正弦波,就想着用TIM去控制,计时溢出就出发DMA,给DAC数据,然而始终有问题,不能采集到正弦波 希望大家看看哪里错误了
程序如下:
TiM 配置:
void MX_TIM6_Init(void)
{
  TIM_MasterConfigTypeDef sMasterConfig = {0};

  htim6.Instance = TIM6;
  htim6.Init.Prescaler = 319;
  htim6.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim6.Init.Period = 9;
  htim6.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
  if (HAL_TIM_Base_Init(&htim6) != HAL_OK)
  {
    Error_Handler();
  }
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim6, &sMasterConfig) != HAL_OK)
  {
    Error_Handler();
  }

}

DAC的配置:
  sConfig.DAC_SampleAndHold = DAC_SAMPLEANDHOLD_DISABLE;
  sConfig.DAC_Trigger = DAC_TRIGGER_T6_TRGO;
  sConfig.DAC_OutputBuffer = DAC_OUTPUTBUFFER_DISABLE;
  sConfig.DAC_ConnectOnChipPeripheral = DAC_CHIPCONNECT_DISABLE;
  sConfig.DAC_UserTrimming = DAC_TRIMMING_FACTORY;

    GPIO_InitStruct.Pin = GPIO_PIN_5;
    GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    /* DAC1 DMA Init */
    /* DAC_CH1 Init */
    hdma_dac_ch1.Instance = DMA1_Channel3;
    hdma_dac_ch1.Init.Request = DMA_REQUEST_6;
    hdma_dac_ch1.Init.Direction = DMA_MEMORY_TO_PERIPH;
    hdma_dac_ch1.Init.PeriphInc = DMA_PINC_DISABLE;
    hdma_dac_ch1.Init.MemInc = DMA_MINC_ENABLE;
    hdma_dac_ch1.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
    hdma_dac_ch1.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
    hdma_dac_ch1.Init.Mode = DMA_CIRCULAR;
    hdma_dac_ch1.Init.Priority = DMA_PRIORITY_LOW;

   主程序:
  初始化
生成正弦波数据,然后读
  void get_sineval(float Amp)             //生成正弦波函数
{   
          float x;
          if(Amp>Vref/2)
                {
                 Amp=Vref/2;
                }
    for(int i=0;i<N;i++)
    {
                          x=(Amp*sin(2*PI*i/N));
                    x=Vref/2+x;
            sine_val[i]=x*MAXDAC/Vref;
    }

}
  get_sineval(1);  // 读
  HAL_TIM_Base_Start(&htim6);
  HAL_DAC_Start_DMA(&hdac1,DAC_CHANNEL_2,(uint32_t *)Sine12bit,100,DAC_ALIGN_12B_R);

最佳答案

查看完整内容[请看2#楼]

成功解决了 欢迎大家讨论
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
173
金钱
173
注册时间
2020-6-7
在线时间
67 小时
 楼主| 发表于 2020-9-9 10:52:11 | 显示全部楼层
成功解决了 欢迎大家讨论
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2020-9-23
在线时间
6 小时
发表于 2020-10-10 15:23:31 | 显示全部楼层
li547330575 发表于 2020-9-9 10:52
成功解决了 欢迎大家讨论

请问程序可以分享下吗
回复

使用道具 举报

5

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2020-5-16
在线时间
31 小时
发表于 2021-6-28 11:10:36 | 显示全部楼层
请问楼主是解决什么问题呀
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-27 14:17

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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