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

pwm主程序

[复制链接]
midfieldmaestro 发布时间:2019-5-27 15:15
  1. #include "sys.h"
    0 y2 H% ]4 s# E: t4 w: v
  2. #include "delay.h"2 a) N" z% r' @
  3. #include "led.h"
    1 B. h, q8 C& [6 {
  4. #include "pwm.h"9 d: ?7 D% q" {4 A4 J5 o1 Q4 U
  5. #include "key.h"0 L0 e5 w  Q6 T% y! t- C) n
  6. #include "myiic.h"0 |; F* J: u- T- t8 v$ U
  7. #include "oled.h"
    + |9 p1 Y- z- g# t& y; l
  8. #include "tim.h"& N+ k+ K7 h* ^8 g8 p
  9. #include "adc.h"
    9 G4 K3 E& j# T8 Q8 y9 g2 M

  10. 4 R/ m& Y/ H& [
  11. extern u8  TIM5CH1_CAPTURE_STA;                //输入捕获状态                                                    & N' X6 N: f5 J- u! N; `+ _4 ~6 ]
  12. extern u32        TIM5CH1_CAPTURE_VAL;        //输入捕获值
    : P1 J0 g9 M8 y0 O# K* r1 M5 _

  13. ; W* N$ o, p; I/ k# e- E4 R

  14. $ o1 }% R& Z: Y4 {
  15. int main(void); k6 M& m8 E- H0 L6 X7 q
  16. {
    : E( c8 l. v  |( D3 b
  17.          u16 led0pwmval=500,led0pwmval1=500,led=0;  $ Y2 s4 [# M  e# o1 y5 w1 c- l" H( I
  18.    u16 Autoreload=500-1;
    $ t9 b; W: x/ ^1 A) W2 x4 i- y; Z
  19.    float temp;        ! W9 ~6 {7 E% f$ J
  20.          u8 dir=1;
    # O& \) [; l7 ?9 M2 ^0 e0 N0 c" T
  21.          u8 key;          //保存键值% J" ^! ]" {' ?: n' ^
  22.    u8 i=0;" i* i: v% K/ R
  23.         u16 adcx;  z3 q, N5 a  t& \
  24.         float adcpower;
    , C0 J3 ~* ?. x* o% @  j
  25. 3 q& n# @8 J8 J7 B" T2 H( p+ }
  26.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
    3 \, Y1 L3 M" @
  27. % U5 f' d' q3 @/ i

  28. # M$ r- w) f! r7 u: \9 h# g
  29.         delay_init(168);  //初始化延时函数* y4 A6 i9 S3 P! q( h! t( x, f. r
  30.         LED_Init();                                //初始化LED端口 8 W; x  ]6 ^! S' [8 N3 C. N, t8 O% L
  31.         KEY_Init();       //初始化与按键连接的硬件接口
    * w9 H  z4 n# ~: w/ E# I* P' x- l
  32.         IIC_Init();       //IIC初始化
    / w- |$ W5 Q3 T1 X" u8 q; E0 P+ l
  33.   OLED_Init();     //初始化OLED( T" ?4 o! Z0 c8 b8 ]1 S
  34.         Adc_Init();        //初始化ADC
    ) A7 u% K9 K' o" u, R

  35. & u, @, c6 i0 Q: C8 k
  36.     TIM14_PWM_Init(500-1,42-1);        //84M/84=1Mhz的计数频率,重装载值500,所以PWM频率为 1M/500=2Khz.     + N& x5 f. F, q
  37.                 TIM13_PWM_Init(500-1,42-1);
    ) s$ {  S& a* Y3 ?& X
  38.                 TIM11_PWM_Init(500-1,84-1);2 Y- j1 z! k. D- B; k* Q7 r6 n
  39.                 TIM10_PWM_Init(500-1,84-1); # _# X: O4 b2 Y. l8 V

  40. ( q! B1 ~- p7 ^
  41.    while(1)
    9 P, e. Y  X2 p* w1 m) H
  42.         {
    # B- a2 }" c6 s
  43.                  delay_ms(10);         7 h, Y* l; H5 o0 M( M. Y) K: Y; `
  44.      key=KEY_Scan(0);                //得到键值
    $ W8 _1 Q7 `# _  G* X5 G
  45.             OLED_GN();
    2 N& |1 e, b# m" \' F9 A
  46.                         if(key)
    / q* L& R" k% B, @4 J+ Z6 W$ C
  47.                  {        6 S& W* I/ \4 q/ [+ a9 V# o1 [

  48. 5 S6 w+ i0 w) k1 C& q& K
  49.                         do{ key=KEY_Scan(0);                / z$ l/ Z* B' Y/ {: e, N
  50.             switch(key)2 A, G; X+ e1 H9 N. N6 w
  51.                                     {               
    # T! t6 p( ^. l) t3 k
  52.                    case KEY0_PRES:  i=1;break;
    ( u# t: M/ V7 N. C$ `' O1 c8 }
  53.                    case KEY2_PRES:  i=2;break;% Z5 C; r7 Z3 |; S" t7 ?
  54.                                            case WKUP_PRES:  dir=!dir;break;+ K- M) E  _3 q  i& x
  55.                                            case KEY1_PRES:        " K( ]; h) @8 s% Y1 z; G& `
  56.                                              {        if(dir)
    2 _5 @: W. `0 b: c  _
  57.                                                {
    - l4 a4 F/ K% Y, `5 Z1 g
  58.                                                              led0pwmval=led0pwmval-20;
    : H6 q2 F* N$ B9 }
  59.                                                        if(led0pwmval<Autoreload)TIM_SetCompare1(TIM11,led0pwmval); //占空比增加
      _5 t7 X9 r# }" F' Z* s: G; y
  60.                                                       }. O& I+ u% O8 e$ R# a$ H! c% E
  61.                                                                                          else if(!dir)
    ' I- S4 }" y1 i
  62.                                                        {7 G! l6 K% M2 {4 M  b
  63.                                                                                                          led0pwmval=led0pwmval+20;
    # V6 e) ~* t7 f. A3 |2 _
  64.                            if(led0pwmval>0)TIM_SetCompare1(TIM11,led0pwmval); //占空比减小                                               
    # R7 O, V5 ]! F0 i, e
  65.                                                            }
    6 {- O5 U; w' L1 ]  q6 k
  66.                                          break;
    3 W- Z. K( w/ x+ E& }$ t
  67.                                               }) @& `% N9 h! ^* d( s2 v0 k/ j- }
  68.                                      }2 P& _9 G! H1 e2 z: d
  69.                                         }while(i==0);
    / L. @* X. y8 R2 Z: k
  70.                                                         
    ) }' g  j1 _1 ~7 J; W8 V/ o
  71.                               do{key=KEY_Scan(0);        + H# ~" A# z1 e9 E) k2 Z: \
  72.                                                                          switch(key)
    ! r( D+ n* d' j5 a
  73.                                     {               
      d) |8 p& o: N( _
  74.                      case KEY0_PRES:  i=0; break;
    - K  g: M% k; m" W. M) b
  75.                                                                                  case KEY2_PRES:  i=2;break;
    4 u7 S5 f  w: R  P6 e. F+ a
  76.                                              case WKUP_PRES:dir=!dir;break;
    ) A0 V6 ?; Y" X( _
  77.                                              case KEY1_PRES:       
    ( G  P- o9 t/ D9 A& b, C0 ~
  78.                                              {if(dir)
    0 G3 D7 @! ^" f" k- Q! m
  79.                                                { led=led+20;
    3 ?, q) p- e0 E2 `! `2 W
  80.                                                              led0pwmval1=led0pwmval1-20;; C* d% n, p3 a8 T) ~) f4 ]
  81.                                                        if(led0pwmval1<Autoreload)TIM_SetCompare1(TIM14,led0pwmval1);        //修改比较值,修改占空比
    8 ~( U5 @: O9 D' P& S
  82. /////////////////////////////////////////////////////////////////////////////////////////////- Q6 T4 B9 X% c; u6 F' i
  83.                 adcx=Get_Adc_Average(ADC_Channel_5,20);//获取通道5的转换值,20次取平均
    3 p7 h1 @+ L; K/ L$ y; ?
  84.                  adcpower=(float)adcx*(3.3/4096)*10;1 {; R3 ~, g  D, e
  85.                         OLED_FloatNum(53,0, adcpower);
    4 y5 C+ w2 g. q1 Y3 w
  86.                 if(led<Autoreload)temp=(float)led*100/Autoreload;  //占空比
    9 f2 T! e' g* L# a# k7 T" Z' [4 E/ e
  87.                 OLED_FloatNum(60,19, temp);                                                                                                        , w" u! e+ c; f4 j
  88.                 temp=(float)1000/Autoreload;  //频率计算0 k5 `: ]+ e8 V! R
  89.                 OLED_FloatNum(45,21, temp);
    - U- d% N( f, @5 {$ ?
  90.                                                                                                                 }% c% a! b( Y* @, s
  91.                                                        else if(!dir)
    2 @( \7 }8 g1 ]# v% Q: z3 K0 ^! m
  92.                                                        {led=led-20;
    ' i: D* g, n* V& k9 d
  93.                                                                 led0pwmval1=led0pwmval1+20;) t% d* W+ p% k4 B( {
  94.                                  if(led0pwmval1>0)TIM_SetCompare1(TIM14,led0pwmval1);        //修改比较值,修改占空比       
    ! L. V1 C) R/ h% ?$ Z5 n
  95. /////////////////////////////////////////////////////////////////////////////////////////////                                                                                                                                 6 J# F0 v( d& i: ^) E* j) g
  96.     adcx=Get_Adc_Average(ADC_Channel_5,20);//获取通道5的转换值,20次取平均
    # T; @  k* G# k. W6 X+ P5 a; i* ]
  97.                 adcpower=(float)adcx*(3.3/4096)*10;/ O* L* s) r* Q" {
  98.                  OLED_FloatNum(53,0, adcpower);
    0 t' W  H! ~7 f9 z8 _
  99.                 temp=(float)led*100/Autoreload;  //占空比  l) m9 v6 z* K8 x! ], q6 i  [
  100.                 if(led>0)OLED_FloatNum(60,19, temp);                                                                                                       
      g* b. c4 J) \  g$ p+ r
  101.                 temp=(float)1000/Autoreload;  //频率计算& Q# i' e! w4 D1 R! J0 d
  102.                 OLED_FloatNum(45,21, temp);
    ( f# i7 H- Y7 D: N. w, y  D. U
  103.                                                                                                         }
    # b& \! f1 M- s; C4 u
  104.                                            break;
    , S: L# I& Y7 V9 U
  105.                                               }$ H' g6 {5 }* t0 @, Z  w
  106.                                        
    " T* P8 h1 [' V# l
  107.                                      }
    1 q6 Q3 p& W8 w1 e6 ?6 ]( o
  108.              } while(i==1);                                                         
    0 _2 x0 M, @/ ]* c* O& n, k% A4 `
  109. //////////////////////////////////////////////////////////////////////////////////////////                                                  f# G. t* ]6 `- t$ Y
  110.                                                  do{       key=KEY_Scan(0);       
    % U5 y$ H5 a% ?; Z: e; C& P
  111.                                                                          switch(key)
    " ?# |' X  ]' m* h! K( p
  112.                                     {               
    2 I' C, r6 X% k: j
  113.                     case KEY0_PRES:  i=0;break;
    * P4 [  {! r  [3 P9 d3 O/ r8 @( @' R
  114.                                                                                 case KEY2_PRES:  i=1;break;( B4 C* p* H. G2 M( o5 ^
  115.                                                                                 case WKUP_PRES:        dir=!dir;break;/ {& M. Q: }) }4 ^% @8 M
  116.                                             case KEY1_PRES:       
    " J9 a0 ?. g% A6 ?
  117.                                              if(dir)7 q6 B* `+ G( Z- h( L
  118.                                                                                  {Autoreload=Autoreload+100;
    0 F' \  E) L) ]; _) C5 a  k9 \
  119.                                                        if(Autoreload<=1000)TIM_SetAutoreload(TIM14,  Autoreload);        //修改重装载值,改变频率; m8 S2 p1 i1 F" R7 A" X5 t
  120. /////////////////////////////////////////////////////////////////////////                                                                         
    ' m; R2 K2 u: k1 [: d3 ~
  121.     adcx=Get_Adc_Average(ADC_Channel_5,20);//获取通道5的转换值,20次取平均
    1 v: n3 J$ j5 y/ R
  122.                 adcpower=(float)adcx*(3.3/4096)*10;7 p( ~- [4 m0 y- H" n9 C
  123.                  OLED_FloatNum(53,0, adcpower);4 s- z2 X- e* o- M) p
  124.                 temp=(float)led*100/Autoreload;  //占空比
    ) Q8 `+ r7 Q6 I8 z7 y# |
  125.                 OLED_FloatNum(60,19, temp);                                                                                                        $ u( C3 c% U6 }# e
  126.                 temp=(float)1000/Autoreload;  //频率计算! p5 W  \1 |9 ]7 Z6 [. S) r
  127.                 OLED_FloatNum(45,21, temp);     - V2 X1 G8 _/ I" P( I
  128.                                                                                  }: h1 A( z- s$ f3 ?1 D2 \% T1 }/ \
  129.                                                                                  else if(!dir)
    . R9 N; y$ W3 u
  130.                                                        {Autoreload=Autoreload-100;
    4 A. q9 J' K4 o+ f; {- X! N% B
  131.                           if(Autoreload>0)TIM_SetAutoreload(TIM14,  Autoreload);        //修改重装载值,修改频率       
    4 _# H6 W) y$ b0 y. b) o8 `+ R2 \
  132. ////////////////////////////////////////////////////////////////////////////////////                                                                                 
    3 H6 B8 \0 V: {; b) g2 P
  133.     adcx=Get_Adc_Average(ADC_Channel_5,20);//获取通道5的转换值,20次取平均# ?: q  H$ \  r7 d
  134.                 adcpower=(float)adcx*(3.3/4096)*10;
    $ M' ?) J; [' D3 t2 M, h9 f0 [% j
  135.                  OLED_FloatNum(53,0, adcpower);
    9 ]& U" p  ]* M4 V" }% }
  136.                 temp=(float)led*100/Autoreload;  //占空比1 |* G6 I" ?0 U) E$ L" I. B! B
  137.                 OLED_FloatNum(60,19, temp);                                                                                                       
    / _' Y0 U( Z3 W- A+ }; f/ u
  138.                 temp=(float)1000/Autoreload;  //频率计算% a3 z  Q9 T0 f+ n& E( b! X
  139.                 OLED_FloatNum(45,21, temp);
      {( t. x& t' f7 o
  140. ////////////////////////////////////////////////////////////////////////                                                                                                         + h! ?+ B9 A" b  w, @
  141.                                                            }2 o8 {% n# s' @' W
  142.                                            break;# B+ A. Y  l( X; ]; h1 |; ~3 F
  143.                                               }+ Q* _0 V: ^* s& v
  144.                                      % k" f  v! \! ^2 H
  145.                                         * h4 E% _6 p2 n: |7 s
  146.                                                 } while(i==2);                                                          
    & L% N4 w' {) w1 x6 _$ ^
  147. }else delay_ms(10); $ a4 P- d3 i& }+ _& s1 u- `
  148. }' J) b- `0 a3 ^! K! r4 t9 J
  149. }       
复制代码
1 H( m4 c  O9 z4 E6 S+ D5 l; {

1 ~' D1 J; P1 u/ Q1 |1 f1 y
赞 收藏 评论0 发布时间:2019-5-27 15:15

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版