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

STM8 控制电脑风扇转速 4PIN PWM

[复制链接]
abv123 发布时间:2018-1-6 21:20
一个很简单的例子读取电位器电压,然后调整占空比
% X  O% \7 I) P+ G) K- n& U
; b9 ~5 d5 @, q AIS_AIR_V3_11_3.png 0 o$ T- W$ c, [; Z- O# Z& h
AIS_AIR_V3_11_2.png 2 Q& q* j* v. ]( A% g5 d. z* h3 X
AIS_AIR_V3_11_1.png   f# e- E+ o! G. I" u

1 L, o& S6 c6 T8 ~程序代码:5 s6 _, @' s- U0 N3 R. o! d
  1. #include "stm8s.h"
    # B% A8 }. `% |  ^2 p3 H
  2. #include "stm8s_gpio.h"5 c) E! g4 F2 |) x: J. L
  3. 5 J( `. Q3 g! f. ^, w5 E
  4. #define PWM_F  640
    2 M( Z5 v6 O1 j, ?
  5. 3 t8 |2 A& |# b4 {
  6. uint8_t HexTable[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};7 z+ g" I4 g( E1 c* v5 a0 m+ x
  7. uint16_t CCR1_Val = 100;
    : J0 x+ e# v/ U" S  o6 D" h  a5 T
  8. 1 b  P- F$ r5 k
  9. void DelayApi(uint16_t uwDelayCnt);) a# W9 L, W- C5 K' f5 p, q! h4 I& ?% d' V
  10. void TIM2_Config(void);  g6 J% p) q9 I3 ]
  11. $ j/ I6 w7 X( C: C7 V+ R/ ^
  12. void Init_UART1(void)
    - e  S4 X% Q+ l3 m
  13. {8 ~" R6 ?4 t5 F* ?1 D2 s
  14.         UART1_DeInit();
    + K6 U! T! v6 t& E' X% z/ @
  15.         UART1_Init((u32)9600, UART1_WORDLENGTH_8D, UART1_STOPBITS_1, UART1_PARITY_NO, UART1_SYNCMODE_CLOCK_DISABLE, UART1_MODE_TX_ENABLE);
    ( z" {; w0 H: e% D
  16. //        UART1_Cmd(ENABLE);4 T% y# B  ~. p" a. ?7 d
  17. }
    - j8 s1 g! q, O4 \7 |4 C" b. a
  18. void Send(uint8_t dat)& k5 C# q. e, c: V6 v! m% O
  19. {/ \* k. P, u' B" I. j
  20.     while(( UART1_GetFlagStatus(UART1_FLAG_TXE)==RESET));7 I+ G& O" G) C
  21.        
    $ W+ N, T9 o1 y& p
  22.     UART1_SendData8(dat);
    ) \$ u3 k9 d9 O) M
  23.        
    ) P8 b- h& Q- l
  24. }
    , I- G  o( f: ]; F' s1 h3 \
  25. void Init_ADC(void)
    7 U; ^8 D4 }( g6 V/ `3 c
  26. {- @! r9 h4 b, J. G8 r
  27.         //GPIO_Init(GPIOD, GPIO_PIN_2, GPIO_MODE_IN_FL_NO_IT);
    4 l4 Z: }- J6 {' l7 T1 b  t
  28.         ADC1_DeInit();# L; i% N1 \7 S) L
  29.         ADC1_Init(ADC1_CONVERSIONMODE_SINGLE, ADC1_CHANNEL_3, ADC1_PRESSEL_FCPU_D2, ADC1_EXTTRIG_TIM, DISABLE, ADC1_ALIGN_RIGHT, ADC1_SCHMITTTRIG_CHANNEL3, ENABLE);' \. V% L0 d8 q0 Z
  30.         ADC1_Cmd(ENABLE);& b) T% g% M4 W& ]. w! r
  31. }/ @! O, U4 J& R" h; P' T+ q
  32. void UART1_sendhex(unsigned char dat)
    " ~0 j" R: A. q5 W- P/ K
  33. {
    * J: o8 b& H( e7 n* }4 [9 r
  34.     Send('0');8 u. w) M0 r3 G
  35.                 , g4 O# }7 e. z3 V
  36.     Send('x');; ]/ G3 z6 I' D( _8 E3 M. I
  37.                
    & G2 P* s8 Z$ _  o, x; a5 q* l
  38.     Send(HexTable[dat>>4]);
    7 k2 R6 B3 p! H
  39.                 5 \  ?# |+ ^8 o
  40.     Send(HexTable[dat&0x0f]);
    4 \9 |& c& ^# s/ w
  41.                 1 W3 ]9 S; M1 x& D: A  Y# y
  42.     Send(' ');
    / u5 d2 k9 N0 T$ O; R$ X$ m
  43. }
    / a( z! S6 X. y6 i! m6 S1 O8 J
  44. void UART1_sendstr(unsigned char *dat)$ z* W& [& W; _' j, |, p
  45. {
    6 a+ Y$ H/ _; O7 w! @% w7 \
  46.     while(*dat!='\0')% }6 e' U. D; T/ {
  47.                 , e' i+ K1 b* A" \
  48.     {
    4 h- @( l- I. Z; ]4 ^! d
  49.                                 7 }  o! z1 K$ v3 j- [% c4 y! a" y
  50.       Send(*dat);  k# y& y* n/ W! `3 Y8 G6 F
  51.                                
    6 H# e$ }# E5 C4 D  _
  52.       dat++;
    " p3 C" h( P  i' Y1 v
  53.       //delay2us();
    ) D, Q! @$ Y  ]  `( i, E
  54.                
      ?& ]1 x/ p7 _! H* j
  55.     }: w+ ]. g& w3 |0 L7 o: V
  56. }
    " |/ v& f( Q# E$ W, u2 C
  57. void main(void)3 [* w( h7 p0 m
  58. {
    & X: x" {' y6 W/ o
  59.     //FlagStatus flag_status;% T! r7 a8 x) S8 L9 Z# V" |& P% i5 y
  60.     u16 u16_adc1_value;9 q3 T5 h: D! C# e  X. b7 O
  61.     //Init_UART1();+ u: Q3 w$ {/ a
  62.     Init_ADC();
    6 F8 h$ A' x* W
  63.    
    3 o+ T. i6 U. k
  64.     CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);//16/1=16MHZ& N# I. i( Q+ f& ^
  65.     GPIO_DeInit(GPIOD);* v& f8 j- B6 X/ }2 j; s5 ]
  66.     GPIO_Init(GPIOD,GPIO_PIN_2,GPIO_MODE_IN_PU_NO_IT);, _" r7 D. L- a
  67.     //GPIO_DeInit(GPIOD);
    " j4 F* H# p5 H# c( p& z
  68.     GPIO_Init(GPIOD,GPIO_PIN_4,GPIO_MODE_OUT_PP_HIGH_SLOW);1 P6 L. ?) `& I! G) D
  69.    
    4 O4 k; |- W! ?) C" F
  70.     TIM2_Config();
    # P4 ?1 `3 v- R$ E) E2 J
  71.     TIM2_SetCompare1(CCR1_Val);1 s+ t6 `& I% O1 Z
  72. /* Infinite loop */5 M) r$ C+ Z8 A( p3 l) p* S; |! N4 y
  73.     while (1)
    : O) V2 m( b( s$ Y! L4 z  G9 m
  74.     {
    " @# V3 k9 |' G; M# g( a
  75.                 //Send(0xf0);  N4 T% v0 S' n; D
  76.          ADC1_StartConversion();
      i% G" R5 K/ @6 H4 t. [! X: {
  77.          //flag_status = ADC1_GetFlagStatus(ADC1_FLAG_EOC);9 m5 a6 ^+ K1 a9 k* J1 N
  78.         // while(flag_status == RESET); // SET or RESET. {4 U( X& ~- ?4 R: K
  79.          while(RESET == ADC1_GetFlagStatus(ADC1_FLAG_EOC)); 3 s7 M; V$ Z2 A
  80.              u16_adc1_value = ADC1_GetConversionValue();
    $ K1 \( \1 Z& }; m5 Y" i
  81.          //CCR1_Val=u16_adc1_value*2/3-66;
    . U7 w5 ^! S$ o# A9 @
  82.          //CCR1_Val=101+u16_adc1_value*10/19;
    + J. g7 B: K/ R5 X! a7 t
  83.          /*if(u16_adc1_value<180)3 V9 }8 f6 p0 H* ~8 z" k
  84.          {; Z) x3 p# v$ b- n& a
  85.             CCR1_Val=70+u16_adc1_value*2;( [8 L5 }3 v" }; y$ k
  86.          }else
    3 C; u6 T: ?  Y* W
  87.          {3 B8 m  ^" {" }8 G
  88.           CCR1_Val=460+(u16_adc1_value-180)*10/47;
    : g) ^5 y% S/ D" U4 {% k$ Y
  89.          }
    8 o( F3 N- u0 m3 r1 [
  90.          */
    / M3 b/ {; t9 ~& |# W* V
  91.           if(u16_adc1_value<180)+ r, I' k! J  q: |: X! |$ o: q$ c+ I& [
  92.           {
    6 c) S5 Q! `9 B0 T8 t
  93.             if(u16_adc1_value<100){u16_adc1_value=100;}
    8 W* o6 q% _% }1 n% R8 B" g! u
  94.             CCR1_Val=u16_adc1_value+((u16_adc1_value-100)*36/10);/ ], p4 R/ @* w: k. @5 L
  95.           }else! c( q5 _: }& }" k7 \
  96.           {
    - Y; K5 x* b8 a) Q
  97.             CCR1_Val=460+(u16_adc1_value-180)*10/47;
    % c4 p4 }& I$ R8 F. S/ I; _
  98.           }8 q6 x3 ?4 E; _; j8 w  P
  99.            2 O" ^7 @) W! P- `$ ]; J2 x- P1 r
  100.          if(CCR1_Val>30000)# a5 d& @# G( }5 S( x) _
  101.            CCR1_Val=0;* ~' _1 F+ u2 Z- p
  102.          if(CCR1_Val>PWM_F && CCR1_Val<2000)) k( A3 \6 |/ o6 l$ j' M
  103.            CCR1_Val=PWM_F-2;
    - p1 g* t1 J0 x( T
  104.           TIM2_SetCompare1(CCR1_Val);
    / }+ D1 p- G" b# p
  105.          //UART1_sendhex((u16_adc1_value>>8));
    9 H: o4 t1 \; `+ _6 \
  106.          //UART1_sendhex((u16_adc1_value&0xff));
    + x$ u/ ?. x& v! @- ^9 Z
  107.          //UART1_sendstr("\r\n");, N: O0 c# w' r: f
  108.          
    & w( P  q" s* P3 q. r
  109.          //GPIO_WriteReverse(GPIOB,GPIO_PIN_5);
    5 X. V. y* A; r/ j% a% t
  110.          - y8 a; z- e' X
  111.   }; ~( k- j/ g3 H, r1 f. J
  112.   * s$ _# V1 f* i$ d
  113. }
    1 m- v6 v4 H# O0 B' }& ~# E

  114. ) r8 t; L+ m/ z4 }  i
  115. void TIM2_Config(void)
    0 J0 t( O+ A+ w7 E9 n
  116. {, o& l3 `  A( o: {4 L
  117. ! `3 Y$ t: I( g+ ~
  118.   TIM2_TimeBaseInit(TIM2_PRESCALER_1, PWM_F);1 h8 G( u& G) v0 K
  119. / J) d/ Y. {2 \! y  H' B
  120.   TIM2_OC1Init(TIM2_OCMODE_PWM1, TIM2_OUTPUTSTATE_ENABLE,CCR1_Val, TIM2_OCPOLARITY_HIGH);0 ~! ^5 H' p4 Q# f0 j
  121.   TIM2_OC1PreloadConfig(ENABLE);. ^8 P: t$ t- f; I

  122. : ^2 p; i+ B! l0 T) ?' x
  123. //  TIM2_OC2Init(TIM2_OCMODE_PWM1, TIM2_OUTPUTSTATE_ENABLE,CCR2_Val, TIM2_OCPOLARITY_HIGH);5 ?: L) b9 d  E! f) r! n+ _/ j
  124. //  TIM2_OC2PreloadConfig(ENABLE);/ u4 p; y  P- B
  125.           / D/ f9 {, x# ?$ K+ N
  126. //  TIM2_OC3Init(TIM2_OCMODE_PWM1, TIM2_OUTPUTSTATE_ENABLE,CCR3_Val, TIM2_OCPOLARITY_HIGH);
    8 x; S9 g9 ^9 x- s6 h: n- m" @
  127. //  TIM2_OC3PreloadConfig(ENABLE);$ N4 u- E! v& x) U! _, X
  128.   TIM2_ARRPreloadConfig(ENABLE);
    - y' T) A% f3 c: h' M

  129. 5 N; M2 F5 X; P+ b! c1 i( ^6 i1 |. D
  130.   TIM2_Cmd(ENABLE);. C. H" g0 z9 v& Q# O8 f3 d1 n
  131. }( z! D% a$ |% G0 H0 [6 o0 c
  132. - w2 v. y9 }, i: I% r
  133. void DelayApi(uint16_t uwDelayCnt)0 J& e* z. [: @9 d
  134. {
    : f* w  E) u- w" M; e
  135.   while(uwDelayCnt--);# x/ q* D- b/ a- R: q0 z
  136. }
    0 Y# v2 t2 G( T* V3 z* y0 {- |

  137. " J7 Q" \! x4 J* `1 u3 I' ^
  138. #ifdef USE_FULL_ASSERT
    . H: D3 c3 w1 c0 `2 s( R) ^
  139. * V" o  R# |1 q0 P) F7 F, W
  140. /**
    ; y. a: z' X/ V2 ?& R
  141.   * @brief  Reports the name of the source file and the source line number
    8 S% i9 N; j- ~1 _- p
  142.   *   where the assert_param error has occurred.
      ]: `( c9 b8 Q, U
  143.   * @param file: pointer to the source file name2 g/ R/ ^7 ?) E* O
  144.   * @param line: assert_param error line source number& y* R" c. H! C
  145.   * @retval : None* }: |! [( y! [8 o- C
  146.   */; m8 ?. S0 ?$ k2 `4 c
  147. void assert_failed(u8* file, u32 line)( G  ~: g- o8 z
  148. {
    ; q: p1 `0 _$ A4 Q2 e# ?
  149.   /* User can add his own implementation to report the file name and line number,
    & g/ r& |( [# |
  150.      ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */8 H; a, L5 l$ j& O! r2 ~

  151. " J  J8 f# n9 F, Z) ], J: i
  152.   /* Infinite loop */
    9 L  H, z3 l+ N
  153.   while (1)
    4 F9 @$ W# l* U' ~* G  P0 ]! G
  154.   {, @$ q. q+ |$ |' v
  155.   }  f! J% g: L# r/ \5 r) w0 q
  156. }
    / v" S$ Z5 A) O; f9 R: H
  157. #endif
复制代码
$ ^) f7 ^' l- S4 I6 H
2 X3 y) D) T5 U% R
程序文件打包下载(IAR 包含原理图大图)
. W3 f# N, S5 D5 r: C- V$ ]链接:https://pan.baidu.com/s/1i5aShzn 密码:t8rc! Q# d, w! z. E3 k% c+ `- H6 {

评分

参与人数 1 ST金币 +2 收起 理由
爅爩灙欟旝巘 + 2 很给力!

查看全部评分

收藏 1 评论5 发布时间:2018-1-6 21:20

举报

5个回答
robter 回答时间:2018-4-4 20:46:55
很好的资料,感谢感谢
hclin-146115 回答时间:2018-4-9 03:16:29
链接已过期
1315150719@qq.c 回答时间:2018-6-9 10:35:43
感谢分享
xanadu2009 回答时间:2018-10-17 21:04:05
! [* ~0 z8 e0 I1 ^# k
感谢分享
robter 回答时间:2018-10-25 08:03:11
很好的应用实例,学习了
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版