找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6973|回复: 13
打印 上一主题 下一主题
收起左侧

基于stm32的spwm输出程序 支持三相,有详细注释

  [复制链接]
跳转到指定楼层
楼主
ID:171738 发表于 2018-10-16 17:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这是基于stm32的SPWM输出程序,支持三相,有详细注释。

单片机源程序如下:
  1. #include "led.h"
  2. #include "delay.h"
  3. #include "sys.h"
  4. #include "usart.h"
  5. #include "SPWM.h"
  6. #include "stdio.h"
  7. char displayhc[20];



  8. int k=0;
  9. void my_delay_ms(int i)
  10. {
  11. for(;i>0;i--)
  12.         {
  13.                 for(k=0;k<8000;k++)
  14.                         {
  15.                                 __nop();
  16.                         }
  17.         }
  18. }


  19. void Key_GPIO_Config(void)
  20. {
  21.         GPIO_InitTypeDef GPIO_InitStructure;
  22.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);                                                       
  23.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10;
  24.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  25.         GPIO_Init(GPIOC, &GPIO_InitStructure);
  26. }  


  27. uint8_t Key_Scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin)
  28. {                       
  29.         if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == 1 )  
  30.         {         
  31. //                while(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == 0);   
  32.                 return         1;         
  33.         }
  34.         else
  35.                 return 0;
  36. }




  37. #include "oled.h"
  38. extern float pin_lv;
  39. uint8_t key1=1,key2=1,key3=1,key4=1;
  40. int key1_flag=0,key2_flag=0,key3_flag=0,key4_flag=2;
  41. void check_key(void)
  42. {
  43.                 //                key1=Key_Scan(GPIOC,GPIO_Pin_10);

  44.                                         key4=Key_Scan(GPIOC,GPIO_Pin_7);
  45.                                         if(key4==0){my_delay_ms(30);key4=Key_Scan(GPIOC,GPIO_Pin_7);if(key4==0)key4_flag--;if(key4_flag<0)key4_flag=5;}
  46.                                         while(key4==0)key4=Key_Scan(GPIOC,GPIO_Pin_7);
  47.                                        
  48.                                        
  49.                                        
  50.                
  51.                                         if(Key_Scan(GPIOC,GPIO_Pin_8)==0){my_delay_ms(30);if(Key_Scan(GPIOC,GPIO_Pin_8)==0)
  52.                                                                                                                                                                                                                                                                                                   {
  53.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 if(key4_flag==0)pin_lv=pin_lv+1.0;
  54.                                                                                                                                                                                                                                                                                                        
  55.                                                                                                                                                                                                                                                                                                        
  56.                                                                                                                                                                                                                                                                                                                   if(key4_flag==0)pin_lv=pin_lv-11.0;
  57.                                                                                                                                                                                                                                                                                                                         if(key4_flag==1)pin_lv=pin_lv-0.1;                                                                                                                                                                                                                                                                                                       
  58.                                                                                                                                                                                                                                                                                                                   if(key4_flag==2)pin_lv=pin_lv-1.0;
  59.                                                                                                                                                                                                                                                                                                                         if(pin_lv<=20.0)pin_lv=20.0;
  60.                                                                                                                                                                                                                                                                                                                 TIM4->PSC=1.0/pin_lv/22.2259*10000000.0;
  61.                                                                                                                                                                                                                                                                                                                
  62.                                                                                                                                                                                                                                                                                                                         sprintf(displayhc,"%3.1f",pin_lv);
  63.                                                                                                                                                                                                                                                                                                                         OLED_ShowString(64,6,displayhc);
  64.                                                                                                                                                                                                                                                                                                         }
  65.                                                                                  }
  66.                                         while(Key_Scan(GPIOC,GPIO_Pin_8)==0);
  67.                                                                                  
  68.                                                                                  
  69.                                                                                  

  70.                                                                                                                                                        
  71.                                                                                                                                                                        
  72.                                                                                                                                                                        
  73.                                                                                  
  74.                        
  75.                                         if(Key_Scan(GPIOC,GPIO_Pin_9)==0){my_delay_ms(30);if(Key_Scan(GPIOC,GPIO_Pin_9)==0)
  76.                                                                                                                                                                                                                                                                                                         {
  77.                                                                                                                                                                                                                                                                                                                         if(key4_flag==2)pin_lv=pin_lv+1.0;
  78.                                                                                                                                                                                                                                                                                                                         if(key4_flag==1)pin_lv=pin_lv+0.1;
  79.                                                                                                                                                                                                                                                                                                                   if(key4_flag==0)pin_lv=pin_lv+10.0;
  80.                                                                                                                                                                                                                                                                                                                         if(pin_lv>=100.0)pin_lv=100.0;
  81.                                                                                                                                                                                                                                                                                                                 TIM4->PSC=1.0/pin_lv/22.2259*10000000.0;
  82.                                                                                                                                                                                                                                                                                                                
  83.                                                                                                                                                                                                                                                                                                                         sprintf(displayhc,"%3.1f",pin_lv);
  84.                                                                                                                                                                                                                                                                                                                         OLED_ShowString(64,6,displayhc);
  85.                                                                                                                                                                                                                                                                                                         }
  86.                                                                                         }
  87.                                         while(Key_Scan(GPIOC,GPIO_Pin_9)==0);
  88. }




  89. #include "stm32f10x_adc.h"

  90. void  Adc_Init(void)
  91. {        
  92.         ADC_InitTypeDef ADC_InitStructure;
  93.         GPIO_InitTypeDef GPIO_InitStructure;

  94.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1        , ENABLE );          //使能ADC1通道时钟


  95.         RCC_ADCCLKConfig(RCC_PCLK2_Div6);   //设置ADC分频因子6 72M/6=12,ADC最大时间不能超过14M

  96.         //PA1 作为模拟通道输入引脚                        
  97.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
  98.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;                //模拟输入引脚
  99.         GPIO_Init(GPIOA, &GPIO_InitStructure);       

  100.         ADC_DeInit(ADC1);  //复位ADC1,将外设 ADC1 的全部寄存器重设为缺省值

  101.         ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;        //ADC工作模式:ADC1和ADC2工作在独立模式
  102.         ADC_InitStructure.ADC_ScanConvMode = DISABLE;        //模数转换工作在单通道模式
  103.         ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;        //模数转换工作在单次转换模式
  104.         ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;        //转换由软件而不是外部触发启动
  105.         ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;        //ADC数据右对齐
  106.         ADC_InitStructure.ADC_NbrOfChannel = 1;        //顺序进行规则转换的ADC通道的数目
  107.         ADC_Init(ADC1, &ADC_InitStructure);        //根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器   

  108.   
  109.         ADC_Cmd(ADC1, ENABLE);        //使能指定的ADC1
  110.        
  111.         ADC_ResetCalibration(ADC1);        //使能复位校准  
  112.          
  113.         while(ADC_GetResetCalibrationStatus(ADC1));        //等待复位校准结束
  114.        
  115.         ADC_StartCalibration(ADC1);         //开启AD校准

  116.         while(ADC_GetCalibrationStatus(ADC1));         //等待校准结束

  117. //        ADC_SoftwareStartConvCmd(ADC1, ENABLE);                //使能指定的ADC1的软件转换启动功能

  118. }               



  119. u16 Get_Adc(u8 ch)   
  120. {
  121.           //设置指定ADC的规则组通道,一个序列,采样时间
  122.         ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_1Cycles5 );        //ADC1,ADC通道,采样时间为1.5周期                                      
  123.   
  124.         ADC_SoftwareStartConvCmd(ADC1, ENABLE);                //使能指定的ADC1的软件转换启动功能       
  125.          
  126.         while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束

  127.         return ADC_GetConversionValue(ADC1);        //返回最近一次ADC1规则组的转换结果
  128. }



  129. double pid_lim(double x,double max,double min)
  130. {
  131.         if(x>max)return max;
  132.         if(x<min)return min;
  133.                                                 return x  ;
  134. }



  135. int test1=0;       
  136. int m=0;
  137. long int zhong=0;
  138. int zhi=0;

  139. #include "SPWM.H"
  140. #define guan_xi  20.0
  141. float set_vcc=706;
  142. float p=0.001,i=0,d=0.002;
  143. float err=0,last_err=0,err_sum=0;
  144. float pid_out=0;
  145. u16   acd_veul=0;
  146. int   d_fen_pin=0;

  147. void wei_ya_pid()
  148. {
  149.        
  150.                                                 for(i=0;i<100000;i++)
  151.                                         {
  152.                                                 acd_veul=Get_Adc(ADC_Channel_2);
  153.                                                 zhong+=acd_veul;
  154.                                                
  155.                                         }
  156.                                         zhi=zhong/100000;
  157.                                         zhong=0;
  158. //        err=702-zhi;
  159. //        pid_out=err*p;
  160. //        err_sum+=err;
  161. //        err_sum=pid_lim(err_sum,100.0,-100.0);
  162. //        pid_out+=err_sum*i;
  163. //        pid_out+=(err-last_err)*d;
  164. //       
  165. //        d_fen_pin++;
  166. //        if(d_fen_pin%10000)last_err=err;
  167. //       
  168. //        tiao_fu_sin_1_A(0.9+pid_out);
  169. //        tiao_fu_sin_1_C(0.9+pid_out);
  170.         if((zhi-set_vcc)>2)pid_out=pid_out-0.006;//  
  171.         if((zhi-set_vcc)<-2)pid_out=pid_out+0.006;//706
  172.         tiao_fu_sin_1_A(0.8+pid_out);  //0.9
  173.         tiao_fu_sin_1_C(0.8+pid_out);

  174.        
  175. }




  176. float wei_ding_dian_ya=0;

  177. int mo_shi=0;
  178. float xian_shi_pin_ln=50.1;
  179. float wei_1A=0.878,wei_2A=1.11;

  180. int main(void)
  181. {
  182.        TIM_Int_Init();
  183.        TIM_PWM_Init();
  184.        TIM_Cmd(TIM3, ENABLE);       /* TIM3 */         
  185.        TIM_Cmd(TIM4, ENABLE);       /* TIM4 */   
  186.        Key_GPIO_Config();
  187.                          Adc_Init();
  188.                 delay_init();                     //延时函数初始化         
  189.                          OLED_Init();                        //初始化OLED  
  190.              OLED_Clear();
  191.        
  192.         mo_shi=2018;

  193.         OLED_ShowString(0,0,"2018");
  194.         Lcd12864_Write16CnCHAR(32,0,"年电子竞赛");
  195. //        Lcd12864_Write16CnCHAR(0,2,"测试模式");
  196.         Lcd12864_Write16CnCHAR(0,6,"频率");
  197. //        Lcd12864_Write16CnCHAR(0,6,"输出电流");
  198.        
  199. //        sprintf(displayhc,"%d",mo_shi);
  200. //        OLED_ShowString(64,2,displayhc);
  201.        
  202.        
  203.        
  204.         sprintf(displayhc,"%3.1f",pin_lv);
  205.         OLED_ShowString(64,6,displayhc);
  206.        
  207.         //OLED_ShowString(64,4,xian_shi_pin_ln);
  208. //        OLED_ShowString(64,6,3);
  209.        
  210.        while (1)
  211.                           {
  212.                                         check_key();
  213.                                        
  214.                                 if(key4_flag==5)        {                                 tiao_fu_sin_1_A(wei_1A);  tiao_fu_sin_1_C(wei_1A);                                           if(Key_Scan(GPIOC,GPIO_Pin_9)==0){my_delay_ms(30);if(Key_Scan(GPIOC,GPIO_Pin_9)==0)
  215.                                                                                                                                                                                                                                                                                                         {
  216.                                                                                                                                                                                                                                                                                                                 wei_1A=wei_1A+0.0025;
  217.                                                                                                                                                                                                                                                                                                         }
  218.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 }
  219.                                                                                                                                 while(Key_Scan(GPIOC,GPIO_Pin_9)==0);       
  220.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                
  221.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                
  222.                                                                                                                         if(Key_Scan(GPIOC,GPIO_Pin_8)==0){my_delay_ms(30);if(Key_Scan(GPIOC,GPIO_Pin_8)==0)
  223.                                                                                                                                                                                                                                                                                                   {
  224.                                                                                                                                                                                                                                   wei_1A=wei_1A-0.0025;
  225.                                                                                                                                                                                                                                                                                                         }
  226.                                                                                  }
  227.                                         while(Key_Scan(GPIOC,GPIO_Pin_8)==0);                                                                                                                                                                                                                                                                                                                                                               
  228.                                                                                                                                
  229.                                                                                                         }
  230.                                
  231.                                        
  232.                                        
  233.                                        
  234.                                 else if(key4_flag==4){                 tiao_fu_sin_1_A(wei_2A );  tiao_fu_sin_1_C(wei_2A);                          if(Key_Scan(GPIOC,GPIO_Pin_9)==0){my_delay_ms(30);if(Key_Scan(GPIOC,GPIO_Pin_9)==0)
  235.                                                                                                                                                                                                                                                                                                         {
  236.                                                                                                                                                                                                                                                                                                                 wei_2A=wei_2A+0.0025;
  237.                                                                                                                                                                                                                                                                                                         }
  238.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 }
  239.                                                                                                                                 while(Key_Scan(GPIOC,GPIO_Pin_9)==0);       
  240.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                
  241.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                
  242.                                                                                                                         if(Key_Scan(GPIOC,GPIO_Pin_8)==0){my_delay_ms(30);if(Key_Scan(GPIOC,GPIO_Pin_8)==0)
  243.                                                                                                                                                                                                                                                                                                   {
  244.                                                                                                                                                                                                                                   wei_2A=wei_2A-0.0025;
  245.                                                                                                                                                                                                                                                                                                         }
  246.                                                                                  }
  247.                                         while(Key_Scan(GPIOC,GPIO_Pin_8)==0);               
  248.                                                     }
  249.                                
  250.                                
  251.                                

  252.                                 else
  253.                                 {
  254.                         //                key4_flag=3;
  255.                 //                        set_vcc=708;
  256.           wei_ya_pid();               
  257.                                 }                       


  258.          if(key4_flag==3){                               
  259.                                                                                                                                 if(Key_Scan(GPIOC,GPIO_Pin_9)==0){my_delay_ms(10);if(Key_Scan(GPIOC,GPIO_Pin_9)==0)
  260.                                                                                                                                                                                                                                                                                                         {
  261.                                                                                                                                                                                                                                                                                                 //                set_vcc=set_vcc+5;
  262.                                                                                                                                                                                                                                                                                                         }
  263.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 }
  264.                                                                                                                                 while(Key_Scan(GPIOC,GPIO_Pin_9)==0);       
  265.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                
  266.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                
  267.                                                                                                                         if(Key_Scan(GPIOC,GPIO_Pin_8)==0){my_delay_ms(10);if(Key_Scan(GPIOC,GPIO_Pin_8)==0)
  268.                                                                                                                                                                                                                                                                                                   {
  269.                                                                                                                                                                                                                                           set_vcc=set_vcc-156;
  270.                                                                                                                                                                                                                                                                                                                 if(set_vcc==550){
  271.                                                                                                                                                                                                                                                                                                                         Lcd12864_Write16CnCHAR(0,3,"调压到");
  272.                                                                                                                                                                                                                                                                                                                         sprintf(displayhc,"%3.1f",20.0);
  273.                                                                                                                                                                                                                                                                                                                         OLED_ShowString(64,3,displayhc);
  274.                                                                                                                                                                                                                                                                                                                                 }
  275.                                                                                                                                                                                                                                                                                                                 if(set_vcc==394){
  276.                                                                                                                                                                                                                                                                                                                         sprintf(displayhc,"%3.1f",14.6);
  277.                                                                                                                                                                                                                                                                                                                         OLED_ShowString(64,3,displayhc);                       
  278.                                                                                                                                                                                                                                                                                                                
  279.                                                                                                                                                                                                                                                                                                                                 }
  280.                                                                                                                                                                                                                                                                                                         }
  281.                                                                                  }
  282.                                          while(Key_Scan(GPIOC,GPIO_Pin_8)==0){}
  283.                                                                                     
  284.                                                     }                               
  285.                           }
  286. }
  287.           
复制代码

所有资料51hei提供下载:
spwm例程.rar (315.11 KB, 下载次数: 234)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏4 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:323453 发表于 2019-5-14 06:42 | 只看该作者
好人呀!谢谢!好资料,51黑有你更精彩!!!
回复

使用道具 举报

板凳
ID:511461 发表于 2019-5-19 10:57 | 只看该作者
我有点不太懂,SPWM波用示波器看是方波还是正弦波?还有那个SPWM生成软件中的调度比怎么来的?以及幅值、 中值该为多少
回复

使用道具 举报

地板
ID:511461 发表于 2019-5-20 19:49 | 只看该作者
好人呀,谢谢
回复

使用道具 举报

5#
ID:377492 发表于 2019-7-14 16:47 来自手机 | 只看该作者
aaaaaa。 发表于 2019-5-19 10:57
我有点不太懂,SPWM波用示波器看是方波还是正弦波?还有那个SPWM生成软件中的调度比怎么来的?以及幅值、  ...

经过滤波器就是正弦波了,不过你得焊个
回复

使用道具 举报

6#
ID:536838 发表于 2019-7-17 09:28 | 只看该作者
不错不错
回复

使用道具 举报

7#
ID:293438 发表于 2019-7-19 22:09 | 只看该作者
为什么我下载了不是文件,,而是一个打不开的文档
回复

使用道具 举报

8#
ID:339823 发表于 2019-7-20 12:53 | 只看该作者
我有点不太懂,SPWM波用示波器看是方波还是正弦波?还有那个SPWM生成软件中的调度比怎么来的?以及幅值、 中值该为多少
回复

使用道具 举报

9#
ID:573025 发表于 2019-7-20 16:15 | 只看该作者
很实用的资料,学习一下!谢谢楼主分享!
回复

使用道具 举报

10#
ID:398643 发表于 2019-7-23 16:19 | 只看该作者
有没有电路图
回复

使用道具 举报

11#
ID:587615 发表于 2019-7-23 21:08 | 只看该作者
好资料,51黑有你更精彩!!!
回复

使用道具 举报

12#
ID:245473 发表于 2019-8-28 14:04 | 只看该作者

好资料,51黑有你更精彩!!!
回复

使用道具 举报

13#
ID:604829 发表于 2019-8-28 16:59 | 只看该作者
感谢,51黑有你更精彩!!!
回复

使用道具 举报

14#
ID:99570 发表于 2019-9-20 14:52 | 只看该作者
好东西当然要支持,谢谢分享呀!
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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