OpenEdv-开源电子网

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

DA 产生正弦波 不能产生 求助大神们啊

[复制链接]

2

主题

6

帖子

0

精华

新手入门

积分
17
金钱
17
注册时间
2016-11-26
在线时间
1 小时
发表于 2016-11-26 17:01:49 | 显示全部楼层 |阅读模式
1金钱
#include "stm32f4xx.h"
#include "usart.h"
#include "delay.h"
#include "key.h"
#include "led.h"
#include "dac.h"
#include "lcd.h"
#include "dma.h"
#include "timer.h"
#include "math.h"
#define PI  3.14159

u16 Sine12bit[256];

void sin_Generation(void)
{
        u16 n;
        for(n=0;n<256;n++)
        {
                Sine12bit[n] = (sin(2*PI*n/256)+1)*2047;       
        }       
}


int main(void)
{

        u8 i=0;         
        u16 dacval=0;
        u8 key;       
        u8 flag;
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//éè&#214;&#195;&#207;μí3&#214;D&#182;&#207;ó&#197;&#207;è&#188;&#182;·&#214;×é2
        delay_init(168);      //3&#245;ê&#188;&#187;ˉ&#209;óê±oˉêy
        uart_init(115200);                //3&#245;ê&#188;&#187;ˉ′&#174;&#191;ú2¨ì&#216;&#194;ê&#206;a115200
       
        LED_Init();                                        //3&#245;ê&#188;&#187;ˉLED
        LCD_Init();                                        //LCD3&#245;ê&#188;&#187;ˉ
  KEY_Init();                                 //°′&#188;ü3&#245;ê&#188;&#187;ˉ
        Dac1_Init();                                 //DACí¨μà13&#245;ê&#188;&#187;ˉ       
  TIM2_Int_Init(5000-1,8400-1);        //&#182;¨ê±&#198;÷ê±&#214;ó84M£&#172;·&#214;&#198;μ&#207;μêy8400£&#172;&#203;ùò&#212;84M/8400=10Khzμ&#196;&#188;&#198;êy&#198;μ&#194;ê£&#172;&#188;&#198;êy5000′&#206;&#206;a500m

        sin_Generation();
        //MYDMA_Config(DMA1_Stream5,DMA_Channel_7,(u32)&DAC->DHR12R1,(u32)Sine12bit,256);//DMA1,STEAM7,CH5,íaéè&#206;aDAC1,′&#230;′¢&#198;÷&#206;aSendBuff,3¤&#182;è&#206;a:SEND_BUF_SIZE.
  //MYDMA_Enable(DMA1_Stream5,256);
  DAC_SetChannel1Data(DAC_Align_12b_R,dacval);//3&#245;ê&#188;&#214;μ&#206;a0       
        while(1)
        {
                /*dacval=3000;
                key=KEY_Scan(0);                          
                if(key==WKUP_PRES)
                {                 
                        flag='1';
                }
                if(key==KEY1_PRES)
                {
                        flag='2';
                }
                if(flag=='1')
                {
                        for(i=0;i<100;i++)
                {

                        DAC_SetChannel1Data(DAC_Align_12b_R, Sine12bit[i]);
                       
                }
                }
                if(flag=='2')
                {
                        DAC_SetChannel1Data(DAC_Align_12b_R, dacval);
                        delay_ms(500);
                        DAC_SetChannel1Data(DAC_Align_12b_R,0);
                        delay_ms(500);
                }*/
                  MYDMA_Config(DMA1_Stream5,DMA_Channel_7,(u32)&DAC->DHR12R1,(u32)Sine12bit,256);//DMA1,STEAM7,CH5,íaéè&#206;aDAC1,′&#230;′¢&#198;÷&#206;aSendBuff,3¤&#182;è&#206;a:SEND_BUF_SIZE.
      MYDMA_Enable(DMA1_Stream5,256);
        }
}



#include "dma.h"                                                                                                                                                     
#include "delay.h"                 


//DMAxμ&#196;&#184;÷í¨μà&#197;&#228;&#214;&#195;
//&#213;aà&#239;μ&#196;′&#171;ê&#228;D&#206;ê&#189;ê&#199;1ì&#182;¨μ&#196;,&#213;aμ&#227;òa&#184;ù&#190;Y2&#187;í&#172;μ&#196;&#199;é&#191;&#246;à′DT&#184;&#196;
//′ó′&#230;′¢&#198;÷->íaéè&#196;£ê&#189;/8&#206;&#187;êy&#190;Y&#191;í&#182;è/′&#230;′¢&#198;÷&#212;&#246;á&#191;&#196;£ê&#189;
//DMA_StreamxMAêy&#190;Yá÷,DMA1_Stream0~7/DMA2_Stream0~7
//chxMAí¨μà&#209;&#161;&#212;&#241;,@ref DMA_channel DMA_Channel_0~DMA_Channel_7
//par:íaéèμ&#216;&#214;·
//mar:′&#230;′¢&#198;÷μ&#216;&#214;·
//ndtr:êy&#190;Y′&#171;ê&#228;á&#191;  
void MYDMA_Config(DMA_Stream_TypeDef *DMA_Streamx,u32 chx,u32 par,u32 mar,u16 ndtr)
{

        DMA_InitTypeDef  DMA_InitStructure;
       
        if((u32)DMA_Streamx>(u32)DMA2)//μ&#195;μ&#189;μ±&#199;°streamê&#199;ê&#244;óúDMA2&#187;1ê&#199;DMA1
        {
          RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2,ENABLE);//DMA2ê±&#214;óê1&#196;ü
               
        }else
        {
          RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1,ENABLE);//DMA1ê±&#214;óê1&#196;ü
        }
  DMA_DeInit(DMA_Streamx);
       
        while (DMA_GetCmdStatus(DMA_Streamx) != DISABLE){}//μè′yDMA&#191;é&#197;&#228;&#214;&#195;
       
  /* &#197;&#228;&#214;&#195; DMA Stream */
  DMA_InitStructure.DMA_Channel = chx;  //í¨μà&#209;&#161;&#212;&#241;
  DMA_InitStructure.DMA_PeripheralBaseAddr = par;//DMAíaéèμ&#216;&#214;·
  DMA_InitStructure.DMA_Memory0BaseAddr = mar;//DMA ′&#230;′¢&#198;÷0μ&#216;&#214;·
  DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;//′&#230;′¢&#198;÷μ&#189;íaéè&#196;£ê&#189;
  DMA_InitStructure.DMA_BufferSize = ndtr;//êy&#190;Y′&#171;ê&#228;á&#191;
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//íaéè·&#199;&#212;&#246;á&#191;&#196;£ê&#189;
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//′&#230;′¢&#198;÷&#212;&#246;á&#191;&#196;£ê&#189;
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//íaéèêy&#190;Y3¤&#182;è:16&#206;&#187;
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;//′&#230;′¢&#198;÷êy&#190;Y3¤&#182;è:16&#206;&#187;
  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular ;// ê1ó&#195;&#209;-&#187;·&#196;£ê&#189;
  DMA_InitStructure.DMA_Priority = DMA_Priority_High;//&#214;Dμèó&#197;&#207;è&#188;&#182;
  DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;         
  DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
  DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;//′&#230;′¢&#198;÷í&#187;·¢μ¥′&#206;′&#171;ê&#228;
  DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;//íaéèí&#187;·¢μ¥′&#206;′&#171;ê&#228;
  DMA_Init(DMA_Streamx, &DMA_InitStructure);//3&#245;ê&#188;&#187;ˉDMA Stream
       

}
//&#191;a&#198;&#244;ò&#187;′&#206;DMA′&#171;ê&#228;
//DMA_StreamxMAêy&#190;Yá÷,DMA1_Stream0~7/DMA2_Stream0~7
//ndtr:êy&#190;Y′&#171;ê&#228;á&#191;  
void MYDMA_Enable(DMA_Stream_TypeDef *DMA_Streamx,u16 ndtr)
{

        DMA_Cmd(DMA_Streamx, DISABLE);                      //1&#216;±&#213;DMA′&#171;ê&#228;
       
        while (DMA_GetCmdStatus(DMA_Streamx) != DISABLE){}        //è·±£DMA&#191;éò&#212;±&#187;éè&#214;&#195;  
               
        DMA_SetCurrDataCounter(DMA_Streamx,ndtr);          //êy&#190;Y′&#171;ê&#228;á&#191;  

        DMA_Cmd(DMA_Streamx, ENABLE);                      //&#191;a&#198;&#244;DMA′&#171;ê&#228;
}          


#include "dac.h"


//DACí¨μà1ê&#228;3&#246;3&#245;ê&#188;&#187;ˉ
void Dac1_Init(void)
{  
  GPIO_InitTypeDef  GPIO_InitStructure;
        DAC_InitTypeDef DAC_InitType;
       
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//ê1&#196;üGPIOAê±&#214;ó
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);//ê1&#196;üDACê±&#214;ó
          
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;//&#196;£&#196;aê&#228;è&#235;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;//&#207;&#194;à-
  GPIO_Init(GPIOA, &GPIO_InitStructure);//3&#245;ê&#188;&#187;ˉ

        DAC_InitType.DAC_Trigger=DAC_Trigger_T2_TRGO ;        //&#182;¨ê±&#198;÷2′¥·¢
        DAC_InitType.DAC_WaveGeneration=DAC_WaveGeneration_None;//2&#187;ê1ó&#195;2¨D&#206;·¢éú
        DAC_InitType.DAC_LFSRUnmask_TriangleAmplitude=DAC_LFSRUnmask_Bit0;//&#198;á±&#206;&#161;¢·ù&#214;μéè&#214;&#195;
        DAC_InitType.DAC_OutputBuffer=DAC_OutputBuffer_Disable ;        //DAC1ê&#228;3&#246;&#187;o′&#230;1&#216;±&#213; BOFF1=1
  DAC_Init(DAC_Channel_1,&DAC_InitType);         //3&#245;ê&#188;&#187;ˉDACí¨μà1

        DAC_Cmd(DAC_Channel_1, ENABLE);  //ê1&#196;üDACí¨μà1
  DAC_DMACmd(DAC_Channel_1, ENABLE);
  DAC_SetChannel1Data(DAC_Align_12b_R, 0);  //12&#206;&#187;óò&#182;&#212;&#198;&#235;êy&#190;Y&#184;&#241;ê&#189;éè&#214;&#195;DAC&#214;μ

}
//éè&#214;&#195;í¨μà1ê&#228;3&#246;μ&#231;&#209;1
//vol:0~3300,′ú±í0~3.3V
void Dac1_Set_Vol(u16 vol)
{
        double temp=vol;
        temp/=1000;
        temp=temp*4096/3.3;
        DAC_SetChannel1Data(DAC_Align_12b_R,temp);//12&#206;&#187;óò&#182;&#212;&#198;&#235;êy&#190;Y&#184;&#241;ê&#189;éè&#214;&#195;DAC&#214;μ

}
#include "timer.h"
#include "led.h"          


//í¨ó&#195;&#182;¨ê±&#198;÷2&#214;D&#182;&#207;3&#245;ê&#188;&#187;ˉ
//arr£o×&#212;&#182;ˉ&#214;&#216;×°&#214;μ&#161;£
//psc£oê±&#214;ó&#212;¤·&#214;&#198;μêy
//&#182;¨ê±&#198;÷ò&#231;3&#246;ê±&#188;&#228;&#188;&#198;&#203;&#227;·&#189;·¨:Tout=((arr+1)*(psc+1))/Ft us.
//Ft=&#182;¨ê±&#198;÷1¤×÷&#198;μ&#194;ê,μ¥&#206;&#187;:Mhz
//&#213;aà&#239;ê1ó&#195;μ&#196;ê&#199;&#182;¨ê±&#198;÷2!
void TIM2_Int_Init(u16 arr,u16 psc)
{
        TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
       
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);  ///ê1&#196;üTIM2ê±&#214;ó
       
  TIM_TimeBaseInitStructure.TIM_Period = arr;         //×&#212;&#182;ˉ&#214;&#216;×°&#212;&#216;&#214;μ
        TIM_TimeBaseInitStructure.TIM_Prescaler=psc;  //&#182;¨ê±&#198;÷·&#214;&#198;μ
        TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //&#207;òé&#207;&#188;&#198;êy&#196;£ê&#189;
        TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
       
        TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);//3&#245;ê&#188;&#187;ˉTIM2
       
        TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE); //&#212;êDí&#182;¨ê±&#198;÷2&#184;üD&#194;&#214;D&#182;&#207;
        TIM_Cmd(TIM2,ENABLE); //ê1&#196;ü&#182;¨ê±&#198;÷2
        TIM_SelectOutputTrigger(TIM2,TIM_TRGOSource_Update);
       
        NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn; //&#182;¨ê±&#198;÷2&#214;D&#182;&#207;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x01; //&#199;à&#213;&#188;ó&#197;&#207;è&#188;&#182;1
        NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x03; //×óó&#197;&#207;è&#188;&#182;3
        NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
        NVIC_Init(&NVIC_InitStructure);

}

//&#182;¨ê±&#198;÷3&#214;D&#182;&#207;·t&#206;&#241;oˉêy
void TIM2_IRQHandler(void)
{
        if(TIM_GetITStatus(TIM2,TIM_IT_Update)==SET) //ò&#231;3&#246;&#214;D&#182;&#207;
        {
                LED1=!LED1;//DS1·-×a
        }
        TIM_ClearITPendingBit(TIM2,TIM_IT_Update);  //&#199;&#229;3y&#214;D&#182;&#207;±ê&#214;&#190;&#206;&#187;
}
  求助 谢谢啦 哪里有问题呢



最佳答案

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

学会论坛搜索,早就有网友分享了 懒得帮你去搜了,自己解决。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2016-11-26 17:01:50 | 显示全部楼层
学会论坛搜索,早就有网友分享了
懒得帮你去搜了,自己解决。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

2

主题

6

帖子

0

精华

新手入门

积分
17
金钱
17
注册时间
2016-11-26
在线时间
1 小时
 楼主| 发表于 2016-11-26 20:37:10 | 显示全部楼层
示波器检查没有波形 只是一条直线
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2016-11-27 11:07:55 | 显示全部楼层

探索者参考例程:http://www.openedv.com/forum.php ... highlight=DMA%2BDAC
战舰参考例程:http://www.openedv.com/forum.php ... highlight=DMA%2BDAC

早就有网友分享了,要学会搜索啊。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

2

主题

6

帖子

0

精华

新手入门

积分
17
金钱
17
注册时间
2016-11-26
在线时间
1 小时
 楼主| 发表于 2016-12-3 16:28:25 | 显示全部楼层
正点原子 发表于 2016-11-27 11:07
探索者参考例程:http://www.openedv.com/forum.php ... highlight=DMA%2BDAC
战舰参考例程:http://www ...

谢谢原子哥啦
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-11 03:16

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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