久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

STM32F103ZET6任意頻率正弦波+三角波工程源碼

  [復制鏈接]
跳轉到指定樓層
樓主
ID:426549 發表于 2018-11-14 17:47 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
STM32F103輸出正弦波源程序,大家可以參考下

單片機源程序如下:
  1. #include "sys.h"
  2. #include "usart.h"               
  3. #include "delay.h"                  
  4. #include "key.h"         
  5. #include "led.h"
  6. #include "STM32_WaveOutput.h"

  7. int main(void)
  8. {                                                 
  9.         Stm32_Clock_Init(9);        //系統時鐘設置
  10.         uart_init(72,9600);                 //串口初始化為9600
  11.         delay_init(72);                            //延時初始化
  12.         LED_Init();
  13.         KEY_Init();                 //初始化與按鍵連接的硬件接口
  14.         SineWave_Init( SawToothWave ,10 ,ENABLE ,SinWave ,10 ,ENABLE);//PA4輸出為        10Hz的三角波;PA5輸出為10Hz的正弦波
  15.         printf("The Program is running!!!\n");
  16.         while(1)
  17.         {/********KEY3為增加頻率,KEY1為減少頻率;(變化量為100)***測試不好用*****/
  18. //                 static u16 f=1000;
  19. //                 if( KEY_Scan(0)==4)
  20. //                         {
  21. //                                 f +=100;
  22. //                                 if(f>15000)        f=15000;
  23. //                                 Set_WaveFre( Wave_Channel_1 ,f);
  24. //                         }
  25. //                 else if( KEY_Scan(0)==2)
  26. //                         {
  27. //                                 f -=100;
  28. //                                 if(f<=20)        f=5;
  29. //                                 Set_WaveFre( Wave_Channel_1 ,f);
  30. //                         }
  31.         LED0=!LED0;
  32.         delay_ms(500);
  33.         }
  34. }
復制代碼
  1. #include "STM32_WaveOutput.h"       
  2. #include "delay.h"       
  3. /********生成正弦波形輸出表***********/
  4. void SineWave_Data( u16 cycle ,u16 *D)
  5. {
  6.         u16 i;
  7.         for( i=0;i<cycle;i++)
  8.         {
  9.                 D[i]=(u16)((Um*sin(( 1.0*i/(cycle-1))*2*PI)+Um)*4095/3.3);
  10.         }
  11. }
  12. /********生成鋸齒波形輸出表***********/
  13. void SawTooth_Data( u16 cycle ,u16 *D)
  14. {
  15.         u16 i;
  16.         for( i=0;i<cycle;i++)
  17.         {
  18.                 D[i]= (u16)(1.0*i/255*4095);
  19.         }
  20. }

  21. /******************正弦波形表***********************/
  22. #ifdef  Sine_WaveOutput_Enable        
  23.      u16 SineWave_Value[256];                //已用函數代替
  24. #endif
  25. /******************鋸齒波形表***********************/
  26. #ifdef  SawTooth_WaveOutput_Enable
  27.      u16 SawToothWave_Value[256];  //已用函數代替
  28. #endif       
  29.        
  30. /******DAC寄存器地址聲明*******/       
  31. #define DAC_DHR12R1    (u32)&(DAC->DHR12R1)   //DAC通道1輸出寄存器地址
  32. #define DAC_DHR12R2    (u32)&(DAC->DHR12R2)   //DAC通道2輸出寄存器地址

  33. /****************引腳初始化******************/
  34. void SineWave_GPIO_Config(u8 NewState1 ,u8 NewState2)
  35. {
  36.         RCC->APB2ENR|=1<<2;     //使能PORTA時鐘
  37.         if( NewState1!=DISABLE)
  38.         {
  39.                 GPIOA->CRL&=0xFFF0FFFF;
  40.                 GPIOA->CRL&=0x00030000;
  41.                 GPIOA->ODR|=(1<<4);
  42.         }
  43.         if( NewState2!=DISABLE)
  44.         {
  45.                 GPIOA->CRL&=0xFF0FFFFF;
  46.                 GPIOA->CRL&=0x00300000;
  47.                 GPIOA->ODR|=(1<<5);
  48.         }
  49. }

  50. /******************DAC初始化*************************/
  51. void SineWave_DAC_Config(u8 NewState1 ,u8 NewState2)
  52. {
  53.         RCC->APB2ENR|=1<<2;    //使能PORTA時鐘                 
  54.         RCC->APB1ENR|=1<<29;   //使能DAC時鐘                 
  55.                     
  56.         GPIOA->CRL&=0XFFF0FFFF;
  57.         GPIOA->CRL|=0X00000000;//PA4 模擬輸入   

  58.         if( NewState1!=DISABLE)
  59.         {
  60.                 DAC->CR|=1<<0;        //使能DAC通道1
  61.                 DAC->CR|=1<<1;        //DAC1輸出緩存不使能 BOFF1=1
  62.                 DAC->CR|=1<<2;        //使用觸發功能 TEN1=1
  63.                
  64.                 DAC->CR|=0<<3;        //3、4、5=100時為TIM2 TRGO事件觸發
  65.                 DAC->CR|=0<<4;        //
  66.                 DAC->CR|=1<<5;        //
  67.                
  68.                 DAC->CR|=0<<6;        //不使用波形發生
  69.                 DAC->CR|=0<<8;        //屏蔽、幅值設置
  70.                 DAC->CR|=1<<12;        //DAC1 DMA使能
  71.         }
  72.        
  73.         if( NewState2!=DISABLE)
  74.         {
  75.                 DAC->CR|=1<<16;        //使能DAC通道2
  76.                 DAC->CR|=1<<17;        //DAC2輸出緩存不使能 BOFF1=1
  77.                 DAC->CR|=1<<18;        //使用觸發功能 TEN2=1
  78.                
  79.                 DAC->CR|=0<<19;        //3、4、5=100時為TIM2 TRGO事件觸發
  80.                 DAC->CR|=0<<20;        //
  81.                 DAC->CR|=0<<21;        //
  82.                
  83.                 DAC->CR|=0<<22;        //不使用波形發生
  84.                 DAC->CR|=0<<24;        //屏蔽、幅值設置
  85.                 DAC->CR|=1<<28;        //DAC1 DMA使能
  86.                
  87.                
  88.                 DAC->DHR12R1=0;//使能通道1
  89.                 DAC->DHR12R2=0;//使能通道2
  90.         }
  91. }
  92. /*********定時器配置************/
  93. void SineWave_TIM_Config( u32 Wave1_Fre ,u8 NewState1 ,u32 Wave2_Fre ,u8 NewState2)
  94. {
  95.        
  96.         if( NewState1!=DISABLE)RCC->APB1ENR|=1<<0;        //TIM2時鐘使能
  97.         if( NewState2!=DISABLE)RCC->APB1ENR|=1<<4;        //TIM6時鐘使能  
  98.        
  99.         TIM2->PSC=0x0;                        //預分頻器不分頻
  100.         TIM2->CR1|=0<<4;//向上計數模式
  101.         TIM6->PSC=0x0;
  102.         TIM6->CR1|=0<<4;//向上計數模式
  103.   if( NewState1!=DISABLE)
  104.         {
  105.                         TIM2->ARR=Wave1_Fre;
  106.                         TIM6->CR1|=0x01;    //使能定時器6
  107.                         TIM2->CR2 &= (u16)~((u16)0x0070);//設置TIM2輸出觸發為更新模式
  108.                         TIM2->CR2 |=0x0020;//設置TIM2輸出觸發為更新模式
  109.                        
  110.         }
  111.         if( NewState2!=DISABLE)
  112.         {
  113.                         TIM6->ARR = Wave2_Fre;     //設置輸出頻率
  114.                         TIM2->CR1|=0x01;    //使能定時器2
  115.                         TIM6->CR2 &= (u16)~((u16)0x0070);//設置TIM2輸出觸發為更新模式
  116.                         TIM6->CR2 |=0x0020;//設置TIM2輸出觸發為更新模式
  117.         }
  118. }
  119. /*********DMA配置***********/
  120. void SineWave_DMA_Config( u16 *Wave1_Mem ,u8 NewState1 ,u16 *Wave2_Mem ,u8 NewState2)
  121. {                                       
  122.         RCC->AHBENR|=1<<1;                        //開啟DMA2時鐘
  123.         delay_ms(5);                                //等待DMA時鐘穩定
  124.        
  125.         if( NewState1!=DISABLE)
  126.         {
  127.                         DMA2_Channel3->CPAR=DAC_DHR12R1;                  //DMA1 外設地址
  128.                         DMA2_Channel3->CMAR=(u32)Wave1_Mem;         //DMA1,存儲器地址
  129.                         DMA2_Channel3->CNDTR=256;            //DMA2,傳輸數據量
  130.                         DMA2_Channel3->CCR=0X00000000;        //復位
  131.                         DMA2_Channel3->CCR|=1<<4;                  //從存儲器讀
  132.                         DMA2_Channel3->CCR|=0<<6;                 //外設地址非增量模式
  133.                         DMA2_Channel3->CCR|=1<<7;                  //存儲器增量模式
  134.                         DMA2_Channel3->CCR|=1<<8;                  //外設數據寬度為16位
  135.                         DMA2_Channel3->CCR|=1<<10;                 //存儲器數據寬度16位
  136.                         DMA2_Channel3->CCR|=1<<12;                 //最高優先級
  137.                         DMA2_Channel3->CCR|=1<<13;                 //最高優先級
  138.                         DMA2_Channel3->CCR|=0<<14;                 //非存儲器到存儲器模式       
  139.                         DMA2_Channel3->CCR|=1<<5;                  //循環發送模式
  140.                         DMA2_Channel3->CCR|=1<<0;          //開啟DMA傳輸
  141.         }
  142.         if( NewState2!=DISABLE)
  143.         {
  144.                         DMA2_Channel4->CPAR=DAC_DHR12R2;                  //DMA1 外設地址
  145.                         DMA2_Channel4->CMAR=(u32)Wave2_Mem;         //DMA1,存儲器地址
  146.                         DMA2_Channel4->CNDTR=256;            //DMA2,傳輸數據量
  147.                         DMA2_Channel4->CCR=0X00000000;        //復位
  148.                         DMA2_Channel4->CCR|=1<<4;                  //從存儲器讀
  149.                         DMA2_Channel4->CCR|=0<<6;                 //外設地址非增量模式
  150.                         DMA2_Channel4->CCR|=1<<7;                  //存儲器增量模式
  151.                         DMA2_Channel4->CCR|=1<<8;                  //外設數據寬度為16位
  152.                         DMA2_Channel4->CCR|=1<<10;                 //存儲器數據寬度16位
  153.                         DMA2_Channel4->CCR|=1<<12;                 //最高優先級
  154.                         DMA2_Channel4->CCR|=1<<13;                 //最高優先級
  155.                         DMA2_Channel4->CCR|=0<<14;                 //非存儲器到存儲器模式       
  156.                         DMA2_Channel4->CCR|=1<<5;                  //循環發送模式
  157.                         DMA2_Channel4->CCR|=1<<0;          //開啟DMA傳輸
  158.         }      
  159. }
  160. void MyTIM_SetAutoreload(TIM_TypeDef* TIMx, u16 Autoreload)
  161. {
  162.   /* Check the parameters */
  163.   assert_param(IS_TIM_ALL_PERIPH(TIMx));
  164.   /* Set the Autoreload Register value */
  165.   TIMx->ARR = Autoreload;
  166. }
  167. /***********正弦波初始化***************/
  168. //u8 Wave1 波形1
  169. //u16 Wave1_Fre 波形1頻率(Hz)
  170. //u8 NewState1 波形1狀態(忽略)
  171. //u8 Wave2 波形2
  172. //u16 Wave2_Fre 波形2頻率(Hz)
  173. //u8 NewState2 波形2狀態(忽略)
  174. //調用exp:  SineWave_Init( SawToothWave ,10 ,ENABLE ,SinWave ,10 ,ENABLE);//三角波,10Hz,正弦波,10Hz
  175. void SineWave_Init(u8 Wave1,u16 Wave1_Fre,u8 NewState1,u8 Wave2,u16 Wave2_Fre,u8 NewState2)
  176. {
  177.   u16 *add1,*add2;
  178.         u16 f1=(u16)(72000000/sizeof(SineWave_Value)*2/Wave1_Fre);
  179.         u16 f2=(u16)(72000000/sizeof(SineWave_Value)*2/Wave2_Fre);
  180.   SineWave_Data( N ,SineWave_Value);                //生成波形表1
  181.         SawTooth_Data( N ,SawToothWave_Value);//生成波形表2
  182.         if( NewState1!=DISABLE)
  183.         {
  184.                         if( Wave1==0x00)   add1=SineWave_Value;
  185.             else                                                         add1=SawToothWave_Value;
  186.         }
  187.   if( NewState2!=DISABLE)
  188.         {
  189.                   if( Wave2==0x00)   add2=SineWave_Value;
  190.             else                                                         add2=SawToothWave_Value;
  191.         }
  192.         SineWave_GPIO_Config( ENABLE ,ENABLE);                          //初始化引腳
  193.         SineWave_TIM_Config( f1 , NewState1 ,f2 ,NewState2);                          //初始化定時器
  194.         SineWave_DAC_Config(NewState1 ,NewState2);                          //初始化DAC
  195.         SineWave_DMA_Config( add1 ,NewState1 ,add2 ,NewState2);                          //初始化DMA
  196.   if( NewState1!=DISABLE)                TIM2->CR1|=0x01;    //使能定時器2;                         //使能TIM2,開始產生波形  
  197.   if( NewState2!=DISABLE)   TIM6->CR1|=0x01;    //使能定時器2;                         //使能TIM6,開始產生波形  
  198. }

  199. void Set_WaveFre( u8 Wave_Channel ,u16 fre)
  200. {
  201.         TIM_TypeDef* TIMX;
  202.         u16 reload;
  203.        
  204.         if( Wave_Channel==0x00)                TIMX = TIM2;
  205.         else if(Wave_Channel==0x01)                TIMX = TIM6;
  206.                
  207.         reload=(u16)(72000000/512/fre);
  208.         MyTIM_SetAutoreload( TIMX ,reload);
  209. }

復制代碼


所有資料51hei提供下載:
stm32F103正弦波.rar (349.17 KB, 下載次數: 172)


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:71535 發表于 2018-11-14 21:08 | 只看該作者
學習一下,謝謝分享。
回復

使用道具 舉報

板凳
ID:596634 發表于 2019-8-7 10:38 | 只看該作者
學習,感謝分享。
回復

使用道具 舉報

地板
ID:583543 發表于 2019-8-8 09:41 | 只看該作者
您好,沒有看懂您分享的附件,能麻煩您告知一下嗎?謝謝
回復

使用道具 舉報

5#
ID:593678 發表于 2019-10-14 11:53 | 只看該作者
感謝樓主的幫助
回復

使用道具 舉報

6#
ID:593678 發表于 2019-10-14 11:53 | 只看該作者
學習一下,嘻嘻
回復

使用道具 舉報

7#
ID:537910 發表于 2019-11-14 11:47 | 只看該作者
優秀,優秀,優秀
回復

使用道具 舉報

8#
ID:537910 發表于 2019-11-14 11:50 | 只看該作者

您好,沒有看懂您分享的附件,能麻煩您告知一下嗎?謝謝
回復

使用道具 舉報

9#
ID:620639 發表于 2019-12-25 12:48 | 只看該作者
謝謝樓主值得一看
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产视频第一页 | 日本视频在线播放 | 美日韩视频 | 精品国产一区二区国模嫣然 | 久久精品国产99国产精品 | 亚洲国产网 | 久久久综合 | 99免费在线视频 | 国产一二区视频 | 中文字幕精品一区二区三区精品 | 日韩欧美视频在线 | 婷婷不卡 | 一区二区三区视频在线免费观看 | 精品视频一区二区三区四区 | 中文字幕一区二区视频 | 国产欧美精品区一区二区三区 | 国产精品久久网 | 国产精品一区二区在线免费观看 | 日韩av在线免费 | 日日摸日日碰夜夜爽2015电影 | 成人一区二区三区 | 国产成人精品一区二区在线 | 久久久一区二区三区 | 成人毛片网站 | 免费视频久久 | 国久久| 激情视频一区 | 国产一区二区 | 一区二区视频 | 久久久久久国产精品免费免费男同 | 精品国产乱码久久久久久老虎 | 欧美激情在线一区二区三区 | 欧美精品欧美精品系列 | av黄色免费在线观看 | h视频在线播放 | 北条麻妃国产九九九精品小说 | 午夜精品久久久久久久久久久久久 | 黄色片在线观看网址 | 亚洲精品66 | 日日夜夜精品免费视频 | 黄色综合 |