你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

pwm主程序

[复制链接]
midfieldmaestro 发布时间:2019-5-27 15:15
  1. #include "sys.h"
  2. #include "delay.h"
  3. #include "led.h"
  4. #include "pwm.h"
  5. #include "key.h"
  6. #include "myiic.h"
  7. #include "oled.h"
  8. #include "tim.h"
  9. #include "adc.h"

  10. extern u8  TIM5CH1_CAPTURE_STA;                //输入捕获状态                                                   
  11. extern u32        TIM5CH1_CAPTURE_VAL;        //输入捕获值


  12. int main(void)
  13. {
  14.          u16 led0pwmval=500,led0pwmval1=500,led=0;  
  15.    u16 Autoreload=500-1;
  16.    float temp;       
  17.          u8 dir=1;
  18.          u8 key;          //保存键值
  19.    u8 i=0;
  20.         u16 adcx;
  21.         float adcpower;

  22.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2


  23.         delay_init(168);  //初始化延时函数
  24.         LED_Init();                                //初始化LED端口
  25.         KEY_Init();       //初始化与按键连接的硬件接口
  26.         IIC_Init();       //IIC初始化
  27.   OLED_Init();     //初始化OLED
  28.         Adc_Init();        //初始化ADC

  29.     TIM14_PWM_Init(500-1,42-1);        //84M/84=1Mhz的计数频率,重装载值500,所以PWM频率为 1M/500=2Khz.     
  30.                 TIM13_PWM_Init(500-1,42-1);
  31.                 TIM11_PWM_Init(500-1,84-1);
  32.                 TIM10_PWM_Init(500-1,84-1);

  33.    while(1)
  34.         {
  35.                  delay_ms(10);         
  36.      key=KEY_Scan(0);                //得到键值
  37.             OLED_GN();
  38.                         if(key)
  39.                  {       

  40.                         do{ key=KEY_Scan(0);               
  41.             switch(key)
  42.                                     {               
  43.                    case KEY0_PRES:  i=1;break;
  44.                    case KEY2_PRES:  i=2;break;
  45.                                            case WKUP_PRES:  dir=!dir;break;
  46.                                            case KEY1_PRES:       
  47.                                              {        if(dir)
  48.                                                {
  49.                                                              led0pwmval=led0pwmval-20;
  50.                                                        if(led0pwmval<Autoreload)TIM_SetCompare1(TIM11,led0pwmval); //占空比增加
  51.                                                       }
  52.                                                                                          else if(!dir)
  53.                                                        {
  54.                                                                                                          led0pwmval=led0pwmval+20;
  55.                            if(led0pwmval>0)TIM_SetCompare1(TIM11,led0pwmval); //占空比减小                                               
  56.                                                            }
  57.                                          break;
  58.                                               }
  59.                                      }
  60.                                         }while(i==0);
  61.                                                         
  62.                               do{key=KEY_Scan(0);       
  63.                                                                          switch(key)
  64.                                     {               
  65.                      case KEY0_PRES:  i=0; break;
  66.                                                                                  case KEY2_PRES:  i=2;break;
  67.                                              case WKUP_PRES:dir=!dir;break;
  68.                                              case KEY1_PRES:       
  69.                                              {if(dir)
  70.                                                { led=led+20;
  71.                                                              led0pwmval1=led0pwmval1-20;
  72.                                                        if(led0pwmval1<Autoreload)TIM_SetCompare1(TIM14,led0pwmval1);        //修改比较值,修改占空比
  73. /////////////////////////////////////////////////////////////////////////////////////////////
  74.                 adcx=Get_Adc_Average(ADC_Channel_5,20);//获取通道5的转换值,20次取平均
  75.                  adcpower=(float)adcx*(3.3/4096)*10;
  76.                         OLED_FloatNum(53,0, adcpower);
  77.                 if(led<Autoreload)temp=(float)led*100/Autoreload;  //占空比
  78.                 OLED_FloatNum(60,19, temp);                                                                                                       
  79.                 temp=(float)1000/Autoreload;  //频率计算
  80.                 OLED_FloatNum(45,21, temp);
  81.                                                                                                                 }
  82.                                                        else if(!dir)
  83.                                                        {led=led-20;
  84.                                                                 led0pwmval1=led0pwmval1+20;
  85.                                  if(led0pwmval1>0)TIM_SetCompare1(TIM14,led0pwmval1);        //修改比较值,修改占空比       
  86. /////////////////////////////////////////////////////////////////////////////////////////////                                                                                                                                 
  87.     adcx=Get_Adc_Average(ADC_Channel_5,20);//获取通道5的转换值,20次取平均
  88.                 adcpower=(float)adcx*(3.3/4096)*10;
  89.                  OLED_FloatNum(53,0, adcpower);
  90.                 temp=(float)led*100/Autoreload;  //占空比
  91.                 if(led>0)OLED_FloatNum(60,19, temp);                                                                                                       
  92.                 temp=(float)1000/Autoreload;  //频率计算
  93.                 OLED_FloatNum(45,21, temp);
  94.                                                                                                         }
  95.                                            break;
  96.                                               }
  97.                                        
  98.                                      }
  99.              } while(i==1);                                                         
  100. //////////////////////////////////////////////////////////////////////////////////////////                                               
  101.                                                  do{       key=KEY_Scan(0);       
  102.                                                                          switch(key)
  103.                                     {               
  104.                     case KEY0_PRES:  i=0;break;
  105.                                                                                 case KEY2_PRES:  i=1;break;
  106.                                                                                 case WKUP_PRES:        dir=!dir;break;
  107.                                             case KEY1_PRES:       
  108.                                              if(dir)
  109.                                                                                  {Autoreload=Autoreload+100;
  110.                                                        if(Autoreload<=1000)TIM_SetAutoreload(TIM14,  Autoreload);        //修改重装载值,改变频率
  111. /////////////////////////////////////////////////////////////////////////                                                                         
  112.     adcx=Get_Adc_Average(ADC_Channel_5,20);//获取通道5的转换值,20次取平均
  113.                 adcpower=(float)adcx*(3.3/4096)*10;
  114.                  OLED_FloatNum(53,0, adcpower);
  115.                 temp=(float)led*100/Autoreload;  //占空比
  116.                 OLED_FloatNum(60,19, temp);                                                                                                       
  117.                 temp=(float)1000/Autoreload;  //频率计算
  118.                 OLED_FloatNum(45,21, temp);     
  119.                                                                                  }
  120.                                                                                  else if(!dir)
  121.                                                        {Autoreload=Autoreload-100;
  122.                           if(Autoreload>0)TIM_SetAutoreload(TIM14,  Autoreload);        //修改重装载值,修改频率       
  123. ////////////////////////////////////////////////////////////////////////////////////                                                                                 
  124.     adcx=Get_Adc_Average(ADC_Channel_5,20);//获取通道5的转换值,20次取平均
  125.                 adcpower=(float)adcx*(3.3/4096)*10;
  126.                  OLED_FloatNum(53,0, adcpower);
  127.                 temp=(float)led*100/Autoreload;  //占空比
  128.                 OLED_FloatNum(60,19, temp);                                                                                                       
  129.                 temp=(float)1000/Autoreload;  //频率计算
  130.                 OLED_FloatNum(45,21, temp);
  131. ////////////////////////////////////////////////////////////////////////                                                                                                         
  132.                                                            }
  133.                                            break;
  134.                                               }
  135.                                      
  136.                                        
  137.                                                 } while(i==2);                                                          
  138. }else delay_ms(10);
  139. }
  140. }       
复制代码


收藏 评论0 发布时间:2019-5-27 15:15

举报

0个回答

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版