找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6750|回复: 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, 下载次数: 168)


评分

参与人数 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 单片机教程网

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