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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 8139|回復(fù): 8
打印 上一主題 下一主題
收起左側(cè)

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

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:426549 發(fā)表于 2018-11-14 17:47 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
STM32F103輸出正弦波源程序,大家可以參考下

單片機(jī)源程序如下:
  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);        //系統(tǒng)時(shí)鐘設(shè)置
  10.         uart_init(72,9600);                 //串口初始化為9600
  11.         delay_init(72);                            //延時(shí)初始化
  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)***測(cè)試不好用*****/
  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. }
復(fù)制代碼
  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];                //已用函數(shù)代替
  24. #endif
  25. /******************鋸齒波形表***********************/
  26. #ifdef  SawTooth_WaveOutput_Enable
  27.      u16 SawToothWave_Value[256];  //已用函數(shù)代替
  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時(shí)鐘
  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時(shí)鐘                 
  54.         RCC->APB1ENR|=1<<29;   //使能DAC時(shí)鐘                 
  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;        //使用觸發(fā)功能 TEN1=1
  63.                
  64.                 DAC->CR|=0<<3;        //3、4、5=100時(shí)為TIM2 TRGO事件觸發(fā)
  65.                 DAC->CR|=0<<4;        //
  66.                 DAC->CR|=1<<5;        //
  67.                
  68.                 DAC->CR|=0<<6;        //不使用波形發(fā)生
  69.                 DAC->CR|=0<<8;        //屏蔽、幅值設(shè)置
  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;        //使用觸發(fā)功能 TEN2=1
  78.                
  79.                 DAC->CR|=0<<19;        //3、4、5=100時(shí)為TIM2 TRGO事件觸發(fā)
  80.                 DAC->CR|=0<<20;        //
  81.                 DAC->CR|=0<<21;        //
  82.                
  83.                 DAC->CR|=0<<22;        //不使用波形發(fā)生
  84.                 DAC->CR|=0<<24;        //屏蔽、幅值設(shè)置
  85.                 DAC->CR|=1<<28;        //DAC1 DMA使能
  86.                
  87.                
  88.                 DAC->DHR12R1=0;//使能通道1
  89.                 DAC->DHR12R2=0;//使能通道2
  90.         }
  91. }
  92. /*********定時(shí)器配置************/
  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時(shí)鐘使能
  97.         if( NewState2!=DISABLE)RCC->APB1ENR|=1<<4;        //TIM6時(shí)鐘使能  
  98.        
  99.         TIM2->PSC=0x0;                        //預(yù)分頻器不分頻
  100.         TIM2->CR1|=0<<4;//向上計(jì)數(shù)模式
  101.         TIM6->PSC=0x0;
  102.         TIM6->CR1|=0<<4;//向上計(jì)數(shù)模式
  103.   if( NewState1!=DISABLE)
  104.         {
  105.                         TIM2->ARR=Wave1_Fre;
  106.                         TIM6->CR1|=0x01;    //使能定時(shí)器6
  107.                         TIM2->CR2 &= (u16)~((u16)0x0070);//設(shè)置TIM2輸出觸發(fā)為更新模式
  108.                         TIM2->CR2 |=0x0020;//設(shè)置TIM2輸出觸發(fā)為更新模式
  109.                        
  110.         }
  111.         if( NewState2!=DISABLE)
  112.         {
  113.                         TIM6->ARR = Wave2_Fre;     //設(shè)置輸出頻率
  114.                         TIM2->CR1|=0x01;    //使能定時(shí)器2
  115.                         TIM6->CR2 &= (u16)~((u16)0x0070);//設(shè)置TIM2輸出觸發(fā)為更新模式
  116.                         TIM6->CR2 |=0x0020;//設(shè)置TIM2輸出觸發(fā)為更新模式
  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時(shí)鐘
  123.         delay_ms(5);                                //等待DMA時(shí)鐘穩(wěn)定
  124.        
  125.         if( NewState1!=DISABLE)
  126.         {
  127.                         DMA2_Channel3->CPAR=DAC_DHR12R1;                  //DMA1 外設(shè)地址
  128.                         DMA2_Channel3->CMAR=(u32)Wave1_Mem;         //DMA1,存儲(chǔ)器地址
  129.                         DMA2_Channel3->CNDTR=256;            //DMA2,傳輸數(shù)據(jù)量
  130.                         DMA2_Channel3->CCR=0X00000000;        //復(fù)位
  131.                         DMA2_Channel3->CCR|=1<<4;                  //從存儲(chǔ)器讀
  132.                         DMA2_Channel3->CCR|=0<<6;                 //外設(shè)地址非增量模式
  133.                         DMA2_Channel3->CCR|=1<<7;                  //存儲(chǔ)器增量模式
  134.                         DMA2_Channel3->CCR|=1<<8;                  //外設(shè)數(shù)據(jù)寬度為16位
  135.                         DMA2_Channel3->CCR|=1<<10;                 //存儲(chǔ)器數(shù)據(jù)寬度16位
  136.                         DMA2_Channel3->CCR|=1<<12;                 //最高優(yōu)先級(jí)
  137.                         DMA2_Channel3->CCR|=1<<13;                 //最高優(yōu)先級(jí)
  138.                         DMA2_Channel3->CCR|=0<<14;                 //非存儲(chǔ)器到存儲(chǔ)器模式       
  139.                         DMA2_Channel3->CCR|=1<<5;                  //循環(huán)發(fā)送模式
  140.                         DMA2_Channel3->CCR|=1<<0;          //開啟DMA傳輸
  141.         }
  142.         if( NewState2!=DISABLE)
  143.         {
  144.                         DMA2_Channel4->CPAR=DAC_DHR12R2;                  //DMA1 外設(shè)地址
  145.                         DMA2_Channel4->CMAR=(u32)Wave2_Mem;         //DMA1,存儲(chǔ)器地址
  146.                         DMA2_Channel4->CNDTR=256;            //DMA2,傳輸數(shù)據(jù)量
  147.                         DMA2_Channel4->CCR=0X00000000;        //復(fù)位
  148.                         DMA2_Channel4->CCR|=1<<4;                  //從存儲(chǔ)器讀
  149.                         DMA2_Channel4->CCR|=0<<6;                 //外設(shè)地址非增量模式
  150.                         DMA2_Channel4->CCR|=1<<7;                  //存儲(chǔ)器增量模式
  151.                         DMA2_Channel4->CCR|=1<<8;                  //外設(shè)數(shù)據(jù)寬度為16位
  152.                         DMA2_Channel4->CCR|=1<<10;                 //存儲(chǔ)器數(shù)據(jù)寬度16位
  153.                         DMA2_Channel4->CCR|=1<<12;                 //最高優(yōu)先級(jí)
  154.                         DMA2_Channel4->CCR|=1<<13;                 //最高優(yōu)先級(jí)
  155.                         DMA2_Channel4->CCR|=0<<14;                 //非存儲(chǔ)器到存儲(chǔ)器模式       
  156.                         DMA2_Channel4->CCR|=1<<5;                  //循環(huán)發(fā)送模式
  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狀態(tài)(忽略)
  171. //u8 Wave2 波形2
  172. //u16 Wave2_Fre 波形2頻率(Hz)
  173. //u8 NewState2 波形2狀態(tài)(忽略)
  174. //調(diào)用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);                          //初始化定時(shí)器
  194.         SineWave_DAC_Config(NewState1 ,NewState2);                          //初始化DAC
  195.         SineWave_DMA_Config( add1 ,NewState1 ,add2 ,NewState2);                          //初始化DMA
  196.   if( NewState1!=DISABLE)                TIM2->CR1|=0x01;    //使能定時(shí)器2;                         //使能TIM2,開始產(chǎn)生波形  
  197.   if( NewState2!=DISABLE)   TIM6->CR1|=0x01;    //使能定時(shí)器2;                         //使能TIM6,開始產(chǎn)生波形  
  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. }

復(fù)制代碼


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


評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

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

使用道具 舉報(bào)

沙發(fā)
ID:71535 發(fā)表于 2018-11-14 21:08 | 只看該作者
學(xué)習(xí)一下,謝謝分享。
回復(fù)

使用道具 舉報(bào)

板凳
ID:596634 發(fā)表于 2019-8-7 10:38 | 只看該作者
學(xué)習(xí),感謝分享。
回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

6#
ID:593678 發(fā)表于 2019-10-14 11:53 | 只看該作者
學(xué)習(xí)一下,嘻嘻
回復(fù)

使用道具 舉報(bào)

7#
ID:537910 發(fā)表于 2019-11-14 11:47 | 只看該作者
優(yōu)秀,優(yōu)秀,優(yōu)秀
回復(fù)

使用道具 舉報(bào)

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

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 日韩一区二区三区视频 | 欧美一区二区在线播放 | 91av免费版 | 日韩亚洲一区二区 | 国产亚洲精品久久久久动 | 欧美一区二区三区,视频 | 国产精品久久久久久久久久三级 | 91免费在线播放 | 亚洲午夜精品一区二区三区 | 久久亚洲一区二区三 | 日本中文字幕在线观看 | 成人 在线| 日日夜夜天天综合 | 欧美激情免费在线 | 岛国一区| a看片 | 久久久久国产精品一区二区 | 亚洲欧美一区二区三区1000 | 91在线精品秘密一区二区 | 一区精品视频在线观看 | 成人免费视频观看视频 | 日本在线黄色 | 性色av香蕉一区二区 | 成人三级av | 日韩视频精品在线 | 欧美精品二区 | 国产在线看片 | 成人av免费| 日本黄色大片免费 | 99热精品久久 | www.嫩草 | 久久久久国产一区二区三区四区 | 成人在线免费视频 | 免费特级黄毛片 | 久久久精彩视频 | 91免费在线 | 一级黄色大片 | 国际精品鲁一鲁一区二区小说 | 精品国产乱码久久久久久闺蜜 | 国产一区二区欧美 | 视频一区二区三区中文字幕 |