欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3421|回復: 0
打印 上一主題 下一主題
收起左側

利用STM32的DMA產生正弦信號源程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:661411 發表于 2019-12-11 11:58 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
利用STM32+DMA+TIM產生正弦信號

單片機源程序如下:
  1. #include "sign.h"
  2. u16 SineWave_Value[256];

  3. /********正弦波輸出表***********/
  4. //cycle        :波形表的位數        (0~256) 8位
  5. //Um                :輸出電壓的峰值(0~1.5)
  6. /*******************************/
  7. void SineWave_Data( u16 cycle ,u16 *D,float Um)
  8. {
  9.     u16 i;
  10.     for( i=0;i<cycle;i++)
  11.     {
  12.         D[i]=(u16)((Um*sin(( 1.0*i/(cycle-1))*2*PI)+Um)*4095/3.3);//+Um向上平移至0~2Um; 2^12=4096; 2^8=256; 單片機電壓3.3V
  13.     }
  14. }


  15. /****************初始化引腳******************/
  16. //----------------PA4輸出
  17. void SineWave_GPIO_Config(void)
  18. {
  19.     GPIO_InitTypeDef GPIO_InitStructure;
  20.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  //開時鐘
  21.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;          //模擬輸出模式
  22.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;      //輸出速率
  23.     GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_4 ;            //選擇引腳 PA4
  24.     GPIO_SetBits(GPIOA,GPIO_Pin_4)  ;                      //拉高輸出
  25.     GPIO_Init(GPIOA, &GPIO_InitStructure);                 //初始化
  26. }

  27. /******************DAC初始化ˉ*************************/
  28. void SineWave_DAC_Config( void)
  29. {
  30.     DAC_InitTypeDef            DAC_InitStructure;
  31.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);//開DAC時鐘
  32.      
  33.   /**************DAC結構初始化*******************/
  34.         //使能DAC通道1和通道1的DMA
  35.     DAC_StructInit(&DAC_InitStructure);   
  36.     DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None;//不產生波形
  37.     DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable; //不使能輸出緩存
  38.     DAC_InitStructure.DAC_Trigger = DAC_Trigger_T2_TRGO;           //DAC觸發為定時器2觸發
  39.     DAC_Init(DAC_Channel_1, &DAC_InitStructure);                   //初始化
  40.     DAC_Cmd(DAC_Channel_1, ENABLE);                                //使能DAC的通道1
  41.     DAC_DMACmd(DAC_Channel_1, ENABLE);                             //使能DAC通道1的DMA  
  42. }

  43. /*********定時器初始化************/
  44. //定時器2初始化
  45. void SineWave_TIM_Config(u32 Wave1_Fre)
  46. {
  47.     TIM_TimeBaseInitTypeDef    TIM_TimeBaseStructure;
  48.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);           //開TIM2時鐘
  49.     TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
  50.     TIM_TimeBaseStructure.TIM_Prescaler = 0x0;                     //不預分頻
  51.     TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;                 //不分頻<br>  
  52.           TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;    //向上計數
  53.     TIM_TimeBaseStructure.TIM_Period = Wave1_Fre;                  //設置輸出頻率
  54.     TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
  55.     TIM_SelectOutputTrigger(TIM2, TIM_TRGOSource_Update);          //設置TIME輸出觸發為更新模式
  56. }

  57. /****************DMA配置******************/
  58. //DMA2配置
  59. void SineWave_DMA_Config(void)
  60. {                  
  61.     DMA_InitTypeDef            DMA_InitStructure;
  62.     RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE);              //開啟DMA2時鐘
  63.      
  64.     DMA_StructInit( &DMA_InitStructure);                            //DMA結構體初始化
  65.     DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;              //從寄存器讀數據
  66.     DMA_InitStructure.DMA_BufferSize = 256;                         //寄存器大小
  67.     DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外設地址不遞增
  68.     DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;         //內存地址遞增
  69.     DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//寬度為半字
  70.     DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;//寬度為半字
  71.     DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;            //優先級非常高
  72.     DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;                       //關閉內存到內存模式
  73.     DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;                    //循環發送模式
  74.        
  75.                 DMA_InitStructure.DMA_PeripheralBaseAddr = DAC_DHR12R1;            //外設地址為DAC通道1的地址
  76.                 DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)SineWave_Value;   //波形數據表內存地址
  77.                 DMA_Init(DMA2_Channel3, &DMA_InitStructure);                       //初始化
  78.                 DMA_Cmd(DMA2_Channel3, ENABLE);                                    //使能DMA2的通道3      
  79.                
  80. }

  81. /**********正弦波初始化**********************/
  82. //Wave1_Fre:        頻率值(0~60 000)Hz
  83. //Um                         :        電壓峰值(0.0~1.5)V
  84. /*******************************************/

  85. void SineWave_Init(u16 Wave1_Fre,float Um)
  86. {
  87.         u32 f1;
  88.         f1=(u32)(72000000/sizeof(SineWave_Value)*2/Wave1_Fre);//計算頻率  72MHz
  89.         SineWave_Data(256,SineWave_Value,Um);     //生成輸出正弦波的波形表
  90.         SineWave_GPIO_Config();                   //初始化io
  91.         SineWave_TIM_Config(f1);                  //初始化定時器
  92.         SineWave_DAC_Config();                    //配置DAC
  93.         SineWave_DMA_Config();                    //配置DMA
  94.         TIM_Cmd(TIM2, ENABLE);                    //開啟定時器
  95. }
復制代碼

所有資料51hei提供下載:
利用DMA產生正弦信號.7z (185.76 KB, 下載次數: 35)



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏5 分享淘帖 頂1 踩
回復

使用道具 舉報

無效樓層,該帖已經被刪除
您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表