OpenEdv-开源电子网

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

关于STM32如何产生锯齿波,利用DAC

[复制链接]

2

主题

8

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2013-5-22
在线时间
0 小时
发表于 2013-5-22 22:43:14 | 显示全部楼层 |阅读模式
 正在做简单的波形发生器,三角波利用DAC中的波形产生搞定了,不知要咋样才能弄出锯齿波来
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-5-23 00:23:09 | 显示全部楼层
这个简单吧...
0慢慢增到3.3V,然后突然降到0,再慢慢升到3.3V,就是锯齿波了....
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

8

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2013-5-22
在线时间
0 小时
 楼主| 发表于 2013-5-23 18:39:12 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
那怎么实现这个突然的下降而又慢慢上升呢?
回复 支持 反对

使用道具 举报

31

主题

116

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
266
金钱
266
注册时间
2012-9-3
在线时间
4 小时
发表于 2013-5-23 23:24:44 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
用单片机产生可以?不行吧?
打造完美
回复 支持 反对

使用道具 举报

6

主题

153

帖子

0

精华

初级会员

Rank: 2

积分
197
金钱
197
注册时间
2013-4-4
在线时间
0 小时
发表于 2013-5-23 23:31:19 | 显示全部楼层
回复【4楼】Berlin:
---------------------------------
一次加一点 然后检测阈值,到阈值清零 已经很清楚了
实现用DAC就行了
剩下的是你自己实现的事情了
~~~~ 欢迎讨论,拒绝谩骂 ~~~~
回复 支持 反对

使用道具 举报

2

主题

8

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2013-5-22
在线时间
0 小时
 楼主| 发表于 2013-5-23 23:58:43 | 显示全部楼层
回复【5楼】兰斯洛:
---------------------------------
回复【5楼】兰斯洛:
---------------------------------
不是,关键老师不给用这种方法,我用DAC的配置已经能弄出三角波了,但锯齿又卡住了,有没有用DAC能做的,我用的是STM32F103VET6
回复 支持 反对

使用道具 举报

2

主题

1447

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2258
金钱
2258
注册时间
2010-12-16
在线时间
206 小时
发表于 2013-5-24 00:26:32 | 显示全部楼层
回复【6楼】aids293:
---------------------------------
4L就是DAC的实现方式.

如果用非DAC的方式,可以先微分,得到方波,再对积分器进行边沿复位.
技术讨论请发帖 , 需要我回复请点左下的 < 回复 > 让系统通知我 . 本人不通过其他方式返回任何参数.
回复 支持 反对

使用道具 举报

6

主题

153

帖子

0

精华

初级会员

Rank: 2

积分
197
金钱
197
注册时间
2013-4-4
在线时间
0 小时
发表于 2013-5-24 08:57:13 | 显示全部楼层
回复【6楼】aids293:
---------------------------------
DAC我了解不是太多 可是我觉得既然三角波能出来 锯齿波不就是半个三角波吗?
~~~~ 欢迎讨论,拒绝谩骂 ~~~~
回复 支持 反对

使用道具 举报

15

主题

180

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
348
金钱
348
注册时间
2013-4-23
在线时间
25 小时
发表于 2013-5-24 10:11:53 | 显示全部楼层
既然三角波能实现,那锯齿波怎么不能实现呢。把三角波实现的方法稍微改一下就可以了吧
回复 支持 反对

使用道具 举报

1

主题

2

帖子

0

精华

新手入门

积分
26
金钱
26
注册时间
2013-5-23
在线时间
0 小时
发表于 2013-5-27 20:51:06 | 显示全部楼层
用定时器触发DAC,锯齿波表用数组表示,DMA传输
回复 支持 反对

使用道具 举报

2

主题

8

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2013-5-22
在线时间
0 小时
 楼主| 发表于 2013-5-28 22:34:22 | 显示全部楼层
回复【10楼】许金秧:
---------------------------------
这是我改的,用万用表测电压变化感觉上很像,麻烦请同学帮忙看看这行不?
#include "stm32f10x.h"

/** @addtogroup STM32F10x_StdPeriph_Examples
  * @{
  */

/** @addtogroup DAC_DualModeDMA_SineWave
  * @{
  */ 

/* rivate typedef -----------------------------------------------------------*/
/* rivate define ------------------------------------------------------------*/
#define DAC_DHR12RD_Address      0x40007420

/* Init Structure definition */
DAC_InitTypeDef            DAC_InitStructure;
DMA_InitTypeDef            DMA_InitStructure;
TIM_TimeBaseInitTypeDef    TIM_TimeBaseStructure;
uint32_t Idx = 0;  
  
/* rivate macro -------------------------------------------------------------*/
/* rivate variables ---------------------------------------------------------*/
const uint16_t Sine12bit[32] = {0,256,512,768,1024,1280,1536,1792,2048,2304,2560,2816,3072,3328,3584,3840,0,256,512,768,1024,1280,1536,1792,2048,2304,2560,2816,3072,3328,3584,3840}; 

uint32_t DualSine12bit[32];

/* rivate function prototypes -----------------------------------------------*/
void RCC_Configuration(void);
void GPIO_Configuration(void);
void Delay(__IO uint32_t nCount);
void DAC_StructInit(DAC_InitTypeDef* DAC_InitStruct);

/* rivate functions ---------------------------------------------------------*/

/**
  * @brief   Main program.
  * @param  None
  * @retval None
  */
int main(void)
{
  /*!< At this stage the microcontroller clock setting is already configured, 
       this is done through SystemInit() function which is called from startup
       file (startup_stm32f10x_xx.s) before to branch to application main.
       To reconfigure the default setting of SystemInit() function, refer to
       system_stm32f10x.c file
     */     
  /* System Clocks Configuration */
  RCC_Configuration();   

  /* Once the DAC channel is enabled, the corresponding GPIO pin is automatically 
     connected to the DAC converter. In order to avoid parasitic consumption, 
     the GPIO pin should be configured in analog */
  GPIO_Configuration();
  /* TIM2 Configuration */
  /* Time base configuration */
  TIM_TimeBaseStructInit(&TIM_TimeBaseStructure); 
  TIM_TimeBaseStructure.TIM_Period = 9999;          
  TIM_TimeBaseStructure.TIM_Prescaler =719;       
  TIM_TimeBaseStructure.TIM_ClockDivision =TIM_CKD_DIV1  ;    
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  
  TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

  /* TIM2 TRGO selection */
  TIM_SelectOutputTrigger(TIM2, TIM_TRGOSource_Update);
  DAC_StructInit(&DAC_InitStructure);

  /* DAC channel1 Configuration */
  DAC_InitStructure.DAC_Trigger = DAC_Trigger_T2_TRGO;
  DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None;
  DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable;
  DAC_Init(DAC_Channel_1, &DAC_InitStructure);

  /* DAC channel2 Configuration */
  DAC_Init(DAC_Channel_2, &DAC_InitStructure);

     for (Idx = 0; Idx < 32; Idx++)
  {
    DualSine12bit[Idx] = (Sine12bit[Idx] << 16) + (Sine12bit[Idx]);
  }


  /* Fill Sine32bit table */

#if !defined STM32F10X_LD_VL && !defined STM32F10X_MD_VL
  /* DMA2 channel4 configuration */
  DMA_DeInit(DMA2_Channel4);
#else
  /* DMA1 channel4 configuration */
  DMA_DeInit(DMA1_Channel4);
#endif
  DMA_InitStructure.DMA_PeripheralBaseAddr = DAC_DHR12RD_Address;
  DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&DualSine12bit;
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
  DMA_InitStructure.DMA_BufferSize = 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_InitStructure.DMA_M2M = DMA_M2M_Disable;

#if !defined STM32F10X_LD_VL && !defined STM32F10X_MD_VL
  DMA_Init(DMA2_Channel4, &DMA_InitStructure);
  /* Enable DMA2 Channel4 */
  DMA_Cmd(DMA2_Channel4, ENABLE);
#else
  DMA_Init(DMA1_Channel4, &DMA_InitStructure);
  /* Enable DMA1 Channel4 */
  DMA_Cmd(DMA1_Channel4, ENABLE);
#endif

  /* Enable DAC Channel1: Once the DAC channel1 is enabled, A.04 is 
     automatically connected to the DAC converter. */
  DAC_Cmd(DAC_Channel_1, ENABLE);
  /* Enable DAC Channel2: Once the DAC channel2 is enabled, A.05 is 
     automatically connected to the DAC converter. */
  DAC_Cmd(DAC_Channel_2, ENABLE);

  /* Enable DMA for DAC Channel2 */
  DAC_DMACmd(DAC_Channel_2, ENABLE);

  /* TIM2 enable counter */
  TIM_Cmd(TIM2, ENABLE);
 
  while (1)
  {
  }
}


/**
  * @brief  Configures the different system clocks.
  * @param  None
  * @retval None
  */
void RCC_Configuration(void)
{   
  /* Enable peripheral clocks ------------------------------------------------*/
#if !defined STM32F10X_LD_VL && !defined STM32F10X_MD_VL
  /* DMA2 clock enable */
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE);
#else
  /* DMA1 clock enable */
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
#endif
  /* GPIOA eriph clock enable */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  /* DAC eriph clock enable */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);
  /* TIM2 Periph clock enable */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
}


/**
  * @brief  Configures the different GPIO ports.
  * @param  None
  * @retval None
  */
void GPIO_Configuration(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;

  /* Once the DAC channel is enabled, the corresponding GPIO pin is automatically 
     connected to the DAC converter. In order to avoid parasitic consumption, 
     the GPIO pin should be configured in analog */
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_4 | GPIO_Pin_5;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
}

/**
  * @brief  Inserts a delay time.
  * @param  nCount: specifies the delay time length.
  * @retval None
  */
void Delay(__IO uint32_t nCount)
{
  for(; nCount != 0; nCount--);
}

#ifdef  USE_FULL_ASSERT

/**
  * @brief  Reports the name of the source file and the source line number
  *         where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t* file, uint32_t line)

  /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */

  /* Infinite loop */
  while (1)
  {
  }
}

#endif
回复 支持 反对

使用道具 举报

75

主题

458

帖子

4

精华

金牌会员

Rank: 6Rank: 6

积分
1635
金钱
1635
注册时间
2012-8-28
在线时间
71 小时
发表于 2013-5-29 08:27:23 | 显示全部楼层
回复【楼主位】aids293:
---------------------------------
void saw(void){ /* 锯齿波发生函数 */
uchar i;
for (i=0;i<255;i++) {
DAC0832=i;
}
}

void square(void) { /* 方波发生函数 */
DAC0832=0x00;
delay(0x10);
DAC0832=0xff;
delay(0x10);
}
QQ750273008有好的资料记得发给我哦。。。
回复 支持 反对

使用道具 举报

2

主题

8

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2013-5-22
在线时间
0 小时
 楼主| 发表于 2013-5-29 22:23:58 | 显示全部楼层
回复【12楼】750273008:
---------------------------------
回复【12楼】750273008:
---------------------------------
不知通过我上边那个数组的配置是否能产生锯齿的波形
回复 支持 反对

使用道具 举报

75

主题

458

帖子

4

精华

金牌会员

Rank: 6Rank: 6

积分
1635
金钱
1635
注册时间
2012-8-28
在线时间
71 小时
发表于 2013-5-30 09:46:36 | 显示全部楼层
回复【13楼】aids293:
---------------------------------
简单的东西搞那么复杂干嘛?数值给DA输出电压,数组也可以啊,步骤1{延时,数组1,延时,数组2,延时,数组3,延时,数组4}写的越多,三角波越接近理想值。你只要写一个波形,让它循环就可以。也可以步骤2{延时,数值自增,延时,数值自增。。。。。(循环),延时,超过值自减,延时,数值自减,(循环)。。。。。。到0时结束}然后让这步骤2循环
QQ750273008有好的资料记得发给我哦。。。
回复 支持 反对

使用道具 举报

75

主题

458

帖子

4

精华

金牌会员

Rank: 6Rank: 6

积分
1635
金钱
1635
注册时间
2012-8-28
在线时间
71 小时
发表于 2013-5-30 09:49:40 | 显示全部楼层
1楼正解
回复 支持 反对

使用道具 举报

10

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2013-6-20
在线时间
0 小时
发表于 2013-7-10 10:24:46 | 显示全部楼层
回复【楼主位】aids293:
---------------------------------
能帮我解决一下出不来三角波的问题吗?
回复 支持 反对

使用道具 举报

2

主题

8

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2013-5-22
在线时间
0 小时
 楼主| 发表于 2013-7-27 23:05:18 | 显示全部楼层
回复【16楼】fqxwyf:
---------------------------------
你是拿什么片子做的?
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-16 16:55

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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