OpenEdv-开源电子网

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

求助:STM32F103使用DAC输出正弦波波形异常

[复制链接]

0

主题

3

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2016-6-12
在线时间
1 小时
发表于 2024-10-9 15:14:13 | 显示全部楼层 |阅读模式
5金钱
本帖最后由 lf9335 于 2024-10-9 15:17 编辑

使用STM32F103VET的DAC输出通道1输出正弦波,采样TIM2触发DAC,使用DMA将数值从内存数组传送到DAC的寄存器。BUF中存有一个周期的正弦波数值(32个数据点)。
遇到以下问题:
(1)产生的波形如下图所示,在波峰处有5个点的电压掉下去了,无论在开发板上还是在自己做的电路上都如此,可以确认不是开发板上PA4上的上拉电阻的原因,因
为自己做的板子上无上拉电阻。
(2)在自己做的板子上一旦使用了DAC的BUF,输出电压就一直为零了,只能不使用BUF。
哪位遇到过类似的问题,如何解决的?望赐教。
20131107002731.png
代码如下:
/* 波形数据 ---------------------------------------------------------*/
const uint16_t Sine12bit[32] = {
  2048, 2460, 2856, 3218, 3532, 3786, 3969, 4072,
4093, 4031, 3887, 3668, 3382, 3042, 2661, 2255,
1841, 1435, 1054,  714,  428,  209,   65,    3,
   24,  127,  310,  564,  878, 1240, 1636, 2048
};

uint32_t DAC_Buf[32];

void DAC_Config(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  DAC_InitTypeDef DAC_InitStructure;
  //Enable GPIOA Clock Clock;
  RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE);
  //Enable DAC Clock;
  RCC_APB1PeriphClockCmd( RCC_APB1Periph_DAC, ENABLE);
  //Init GPIO for DAC_OUT1
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4;
  //GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  GPIO_Init(GPIOA,&GPIO_InitStructure);

  /* 配置DAC 通道1 */
  DAC_InitStructure.DAC_Trigger = DAC_Trigger_T2_TRGO;            //使用TIM2作为触发源
  DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None; //不使用波形发生器
  DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable;  //使用DAC输出缓冲
  DAC_Init(DAC_Channel_1, &DAC_InitStructure);

  /* 使能通道1 由PA4输出 */
  DAC_Cmd(DAC_Channel_1, ENABLE);

   /* 使能DAC的DMA请求 */
  DAC_DMACmd(DAC_Channel_1, ENABLE);
}

/**
  * @brief  配置TIM2
  * @param  
  * @retval
  */
static void DAC_TIM_Config(void)
{

  TIM_TimeBaseInitTypeDef    TIM_TimeBaseStructure;

  /* 使能TIM2时钟,TIM2CLK 为72M */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

  /* TIM2基本定时器配置 */
// TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
  TIM_TimeBaseStructure.TIM_Period = 5;                         //定时周期 5*0.1ms=0.5ms  
  TIM_TimeBaseStructure.TIM_Prescaler = 7199;                     //预分频, 72M / 7200 = 10k
  TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;                //时钟分频系数
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;   //向上计数模式
  TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

  /* 配置TIM2触发源 */
  TIM_SelectOutputTrigger(TIM2, TIM_TRGOSource_Update);

  /* 使能TIM2 */
  TIM_Cmd(TIM2, ENABLE);

}

/**
  * @brief  配置DMA
  * @param  
  * @retval
  */
static void DAC_DMA_Config(void)
{
  DMA_InitTypeDef  DMA_InitStructure;

  /* 使能DMA2时钟 */
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE);

  /* 配置DMA2 */
  DMA_InitStructure.DMA_PeripheralBaseAddr = DAC_Address;         //外设数据地址
  DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&DAC_Buf ;       //内存数据地址 DAC_Buf
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;                      //数据传输方向内存至外设
  DMA_InitStructure.DMA_BufferSize = 32;                                  //缓存大小为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通道优先级
  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;                            //非内存至内存模式  

  DMA_Init(DMA2_Channel3, &DMA_InitStructure);

  /* 使能DMA2-14通道 */
  DMA_Cmd(DMA2_Channel3, ENABLE);
}

/**
  * @brief  DAC初始化函数
  * @param  
  * @retval
  */
void DAC_Mode_Init(void)
{
  uint32_t Idx = 0;  

  DAC_Config();
  DAC_TIM_Config();
  DAC_DMA_Config();
  /* 填充正弦波形数据,双通道右对齐*/
  for (Idx = 0; Idx < 32; Idx++)
  {
    DAC_Buf[Idx] =  Sine12bit[Idx];
  }

}



正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

10

主题

3280

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8182
金钱
8182
注册时间
2020-5-11
在线时间
3694 小时
发表于 2024-10-9 18:44:10 | 显示全部楼层
本帖最后由 LcwSwust 于 2024-10-9 18:45 编辑

感觉是数据有偏移导致溢出,
确定是“DAC_Buf[Idx] =  Sine12bit[Idx];”
而不是“DAC_Buf[Idx] =  Sine12bit[Idx]+500;”?
不用DMA而直接用循环输出,是否正常?
专治疑难杂症
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2016-6-12
在线时间
1 小时
 楼主| 发表于 2024-10-9 20:08:33 | 显示全部楼层
LcwSwust 发表于 2024-10-9 18:44
感觉是数据有偏移导致溢出,
确定是“DAC_Buf =  Sine12bit;”
而不是“DAC_Buf =  Sine12bit+500;”?

代码确实是DAC_Buf=Sine12bit,如果是有偏移,那应该所有的数据都偏移,这个只有部分数据出来的电压不正确。我试试不用DMA直接用定时器中断幅值吧。
回复

使用道具 举报

9

主题

245

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1221
金钱
1221
注册时间
2014-11-25
在线时间
173 小时
发表于 2024-10-11 10:18:30 | 显示全部楼层
回复

使用道具 举报

10

主题

3280

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8182
金钱
8182
注册时间
2020-5-11
在线时间
3694 小时
发表于 2024-10-16 09:40:51 | 显示全部楼层
有进展没?
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-22 06:25

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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